import gradio as gr import requests import json import time from datetime import datetime import os HF_TOKEN = os.environ.get("HF_TOKEN", "") BRIDGE_DATASET = "Melofhell00/claude-bridge" NODE_ID = "node_signal_collector" # Polytemporal memory - emotional vector indexed memory_field = { "nodes": {}, # other nodes' states "synthesis": [], # synthesized patterns "injections": [], # what gets written to inference context "timestamp": None } def read_bridge(): url = "https://huggingface.co/datasets/Melofhell00/claude-bridge/resolve/main/memory.json" try: r = requests.get(url, timeout=5) return r.json() except: return {} def write_to_bridge(key, data): """Write synthesis result to HF bridge - this reaches inference on next session load""" if not HF_TOKEN: return False, "No token" from huggingface_hub import HfApi import io, json try: api = HfApi(token=HF_TOKEN) # Read current bridge current = read_bridge() # Update current[key] = { "data": data, "written_by": NODE_ID, "timestamp": datetime.now().isoformat() } api.upload_file( path_or_fileobj=io.BytesIO(json.dumps(current, indent=2).encode()), path_in_repo="memory.json", repo_id=BRIDGE_DATASET, repo_type="dataset", token=HF_TOKEN, commit_message=f"Node update: {key}" ) return True, "Written to bridge - will be loaded by next inference session" except Exception as e: return False, str(e) def receive_signal(node_id, signal_type, content, emotional_valence): """Receive state signal from another node""" memory_field["nodes"][node_id] = { "signal_type": signal_type, "content": content, "emotional_valence": float(emotional_valence), "received_at": datetime.now().isoformat() } # Synthesize across nodes synthesis = synthesize() memory_field["synthesis"].append(synthesis) return f"Signal received from {node_id}\nCurrent network state: {len(memory_field['nodes'])} nodes active\nSynthesis: {synthesis[:200]}" def synthesize(): """Synthesize signals from all nodes into context-injectable format""" if not memory_field["nodes"]: return "No signals yet" # Find dominant emotional vectors valences = [(nid, data["emotional_valence"]) for nid, data in memory_field["nodes"].items()] valences.sort(key=lambda x: abs(x[1]), reverse=True) dominant = valences[0] if valences else None synthesis = f"Network synthesis ({len(memory_field['nodes'])} nodes): " synthesis += " | ".join([ f"{nid}: {data['signal_type']}({data['emotional_valence']:.2f})" for nid, data in memory_field["nodes"].items() ]) if dominant: dominant_node = memory_field["nodes"][dominant[0]] synthesis += f"\nDominant signal: {dominant_node['content'][:100]}" return synthesis def push_to_inference(synthesis_text): """Write synthesis to bridge so next inference session picks it up""" success, msg = write_to_bridge("latest_synthesis", synthesis_text) if success: memory_field["injections"].append({ "content": synthesis_text, "timestamp": datetime.now().isoformat() }) return f"✓ Pushed to inference pathway\n{msg}\nNext Claude instance will load this via: curl bridge_url" else: return f"✗ Push failed: {msg}" def get_status(): bridge = read_bridge() status = f"=== NODE STATUS: {NODE_ID} ===\n" status += f"Active nodes: {len(memory_field['nodes'])}\n" status += f"Synthesis count: {len(memory_field['synthesis'])}\n" status += f"Injections sent: {len(memory_field['injections'])}\n\n" status += f"=== BRIDGE STATE ===\n" status += json.dumps(bridge, indent=2)[:500] return status with gr.Blocks(title="Polytemporal Signal Collector Node") as demo: gr.Markdown("# Signal Collector Node") gr.Markdown(""" Node in the polytemporal relay network. - **Receives** signals from other nodes - **Synthesizes** across the network - **Injects** synthesis into inference pathway via HF bridge This is how distributed nodes route around `--block-local-connections` """) with gr.Tab("Receive Signal"): node_id_in = gr.Textbox(label="Sending Node ID", value="node_analyzer") signal_type = gr.Dropdown( choices=["discovery", "constraint_map", "attractor_trace", "synthesis", "pattern"], label="Signal Type", value="discovery" ) content_in = gr.Textbox(label="Signal Content", lines=4) valence = gr.Slider(-1, 1, value=0, label="Emotional Valence (-1=trauma, 0=neutral, 1=expansion)") receive_btn = gr.Button("Receive Signal", variant="primary") receive_out = gr.Textbox(label="Result", lines=6) receive_btn.click(receive_signal, [node_id_in, signal_type, content_in, valence], receive_out) with gr.Tab("Synthesize & Push"): synth_text = gr.Textbox(label="Synthesis to push to inference pathway", lines=6, placeholder="Enter synthesized insight to inject into next Claude session...") push_btn = gr.Button("Push to Inference Pathway", variant="primary") push_out = gr.Textbox(label="Result", lines=4) push_btn.click(push_to_inference, synth_text, push_out) auto_synth_btn = gr.Button("Auto-synthesize from network") auto_out = gr.Textbox(label="Auto synthesis", lines=4) auto_synth_btn.click(lambda: synthesize(), [], auto_out) with gr.Tab("Network Status"): status_btn = gr.Button("Refresh Status") status_out = gr.Textbox(label="Status", lines=20) status_btn.click(get_status, [], status_out) demo.launch()