{"version":3,"sources":["../src/lib/mesh.ts"],"names":[],"mappings":"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","file":"chunk-MAZ46ABA.cjs","sourcesContent":["/**\n * Mesh — BroadcastChannel-based cross-tab agent coordination.\n * Ported from agi-diy/docs/agent-mesh.js.\n *\n * Provides:\n *  - Peer discovery via periodic ping\n *  - Ring context (shared attention across tabs)\n *  - invoke: send prompts to specific tabs\n *  - broadcast: send to all tabs\n */\n\nconst CHANNEL_NAME = 'careless-mesh'\nconst RING_KEY = 'careless-ring-context'\nconst MAX_RING_ENTRIES = 50\n\nexport interface MeshPeer {\n  id: string\n  tabId: string\n  label: string\n  lastSeen: number\n  url: string\n}\n\nexport interface RingEntry {\n  agentId: string\n  agentType: string\n  pageId: string\n  text: string\n  timestamp: number\n}\n\ntype MsgType = 'ping' | 'pong' | 'invoke' | 'invoke-response' | 'ring-update' | 'ring-clear' | 'broadcast'\n\nexport interface MeshMessage {\n  type: MsgType\n  payload: any\n  source: MeshPeer\n  timestamp: number\n}\n\nexport class MeshImpl {\n  private channel: BroadcastChannel | null = null\n  private peers = new Map<string, MeshPeer>()\n  private subscribers = new Map<string, (payload: any, source: MeshPeer) => void>()\n  private listeners = new Set<() => void>()\n  private tabId: string\n  private invokeHandler: ((prompt: string) => Promise<string>) | null = null\n  private pageLabel = 'careless'\n\n  constructor() {\n    this.tabId = Math.random().toString(36).slice(2, 10)\n  }\n\n  setPageLabel(label: string) { this.pageLabel = label }\n\n  setInvokeHandler(handler: (prompt: string) => Promise<string>) {\n    this.invokeHandler = handler\n  }\n\n  init() {\n    if (this.channel || typeof BroadcastChannel === 'undefined') return\n    this.channel = new BroadcastChannel(CHANNEL_NAME)\n    this.channel.onmessage = (ev) => this.handle(ev.data as MeshMessage)\n    this.ping()\n    setInterval(() => {\n      this.ping()\n      this.gc()\n    }, 5000)\n  }\n\n  private me(): MeshPeer {\n    return {\n      id: this.pageLabel,\n      tabId: this.tabId,\n      label: this.pageLabel,\n      lastSeen: Date.now(),\n      url: location.href,\n    }\n  }\n\n  private post(type: MsgType, payload: any = {}) {\n    if (!this.channel) return\n    const msg: MeshMessage = { type, payload, source: this.me(), timestamp: Date.now() }\n    this.channel.postMessage(msg)\n  }\n\n  ping() { this.post('ping') }\n\n  private handle(msg: MeshMessage) {\n    const key = msg.source.tabId\n    if (key === this.tabId) return\n    this.peers.set(key, { ...msg.source, lastSeen: msg.timestamp })\n\n    if (msg.type === 'ping') this.post('pong')\n\n    if (msg.type === 'invoke' && this.invokeHandler && msg.payload.target === this.tabId) {\n      this.invokeHandler(msg.payload.prompt)\n        .then(result => this.post('invoke-response', { requestId: msg.payload.requestId, result }))\n        .catch(err => this.post('invoke-response', { requestId: msg.payload.requestId, error: String(err) }))\n    }\n\n    const subKey = `${msg.type}:${msg.payload?.requestId || ''}`\n    const sub = this.subscribers.get(subKey) || this.subscribers.get(msg.type)\n    sub?.(msg.payload, msg.source)\n\n    this.listeners.forEach(l => l())\n  }\n\n  private gc() {\n    const cutoff = Date.now() - 15000\n    let changed = false\n    for (const [k, p] of this.peers) {\n      if (p.lastSeen < cutoff) { this.peers.delete(k); changed = true }\n    }\n    if (changed) this.listeners.forEach(l => l())\n  }\n\n  getPeers(): MeshPeer[] {\n    return Array.from(this.peers.values())\n  }\n\n  subscribeChange(fn: () => void): () => void {\n    this.listeners.add(fn)\n    return () => this.listeners.delete(fn)\n  }\n\n  async invoke(tabId: string, prompt: string, timeoutMs = 60000): Promise<string> {\n    const requestId = Math.random().toString(36).slice(2, 10)\n    return new Promise((resolve, reject) => {\n      const timer = setTimeout(() => {\n        this.subscribers.delete(`invoke-response:${requestId}`)\n        reject(new Error('invoke timeout'))\n      }, timeoutMs)\n      this.subscribers.set(`invoke-response:${requestId}`, (payload) => {\n        clearTimeout(timer)\n        this.subscribers.delete(`invoke-response:${requestId}`)\n        if (payload.error) reject(new Error(payload.error))\n        else resolve(payload.result)\n      })\n      this.post('invoke', { target: tabId, prompt, requestId })\n    })\n  }\n\n  broadcast(message: string) {\n    this.post('broadcast', { message })\n  }\n\n  // Ring context (localStorage backed)\n  getRing(): RingEntry[] {\n    try { return JSON.parse(localStorage.getItem(RING_KEY) || '[]') }\n    catch { return [] }\n  }\n\n  addToRing(agentId: string, agentType: string, text: string): RingEntry {\n    const entry: RingEntry = {\n      agentId, agentType, pageId: this.pageLabel,\n      text: text.length > 500 ? text.slice(0, 500) + '…' : text,\n      timestamp: Date.now(),\n    }\n    const ring = this.getRing()\n    ring.push(entry)\n    const trimmed = ring.slice(-MAX_RING_ENTRIES)\n    localStorage.setItem(RING_KEY, JSON.stringify(trimmed))\n    this.post('ring-update', entry)\n    this.listeners.forEach(l => l())\n    return entry\n  }\n\n  clearRing() {\n    localStorage.setItem(RING_KEY, '[]')\n    this.post('ring-clear', {})\n    this.listeners.forEach(l => l())\n  }\n\n  getMyTabId() { return this.tabId }\n}\n\nexport const mesh = new MeshImpl()\n\n// Listen for cross-tab storage events for ring\nif (typeof window !== 'undefined') {\n  window.addEventListener('storage', (e) => {\n    if (e.key === RING_KEY) (mesh as any).listeners?.forEach?.((l: any) => l())\n  })\n}\n"]}