@directive-run/ai 1.22.0 → 1.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/anthropic.d.cts +1 -1
  2. package/dist/anthropic.d.ts +1 -1
  3. package/dist/{chunk-TH2D22JP.cjs → chunk-2FPL5W2H.cjs} +7 -7
  4. package/dist/chunk-2FPL5W2H.cjs.map +1 -0
  5. package/dist/{chunk-G7CRWJT7.js → chunk-4VP67W7L.js} +15 -15
  6. package/dist/chunk-4VP67W7L.js.map +1 -0
  7. package/dist/{chunk-IR3IHBVQ.cjs → chunk-7JTR4QBA.cjs} +2 -2
  8. package/dist/{chunk-IR3IHBVQ.cjs.map → chunk-7JTR4QBA.cjs.map} +1 -1
  9. package/dist/{chunk-5JQ2A3JK.js → chunk-BZB3RDI2.js} +2 -2
  10. package/dist/{chunk-5JQ2A3JK.js.map → chunk-BZB3RDI2.js.map} +1 -1
  11. package/dist/{chunk-RHJAMXLS.js → chunk-EW77VF5K.js} +3 -3
  12. package/dist/{chunk-RHJAMXLS.js.map → chunk-EW77VF5K.js.map} +1 -1
  13. package/dist/{chunk-7EJN6TYX.cjs → chunk-F73AKFDB.cjs} +15 -15
  14. package/dist/chunk-F73AKFDB.cjs.map +1 -0
  15. package/dist/{chunk-VSVR4RFK.js → chunk-FSSCGRAM.js} +2 -2
  16. package/dist/chunk-FSSCGRAM.js.map +1 -0
  17. package/dist/{chunk-XGHNOSXT.cjs → chunk-JMG5GZAH.cjs} +4 -4
  18. package/dist/{chunk-XGHNOSXT.cjs.map → chunk-JMG5GZAH.cjs.map} +1 -1
  19. package/dist/{chunk-GTB6HTZV.js → chunk-MRKU3UXH.js} +2 -2
  20. package/dist/chunk-MRKU3UXH.js.map +1 -0
  21. package/dist/{chunk-ZGJ2XHGI.cjs → chunk-QMSLWAMH.cjs} +2 -2
  22. package/dist/chunk-QMSLWAMH.cjs.map +1 -0
  23. package/dist/{chunk-QRDBUGPO.js → chunk-XGOTVPN6.js} +3 -3
  24. package/dist/chunk-XGOTVPN6.js.map +1 -0
  25. package/dist/{chunk-MDXDPECP.cjs → chunk-Y4A4UJPU.cjs} +2 -2
  26. package/dist/chunk-Y4A4UJPU.cjs.map +1 -0
  27. package/dist/{debug-timeline-L13P-U2I.d.ts → debug-timeline-C5Dzs2r_.d.ts} +1 -1
  28. package/dist/{debug-timeline-DpnRMnLU.d.cts → debug-timeline-Sc9cxgxV.d.cts} +1 -1
  29. package/dist/devtools.cjs +1 -1
  30. package/dist/devtools.d.cts +5 -5
  31. package/dist/devtools.d.ts +5 -5
  32. package/dist/devtools.js +1 -1
  33. package/dist/evals.d.cts +2 -2
  34. package/dist/evals.d.ts +2 -2
  35. package/dist/gemini.d.cts +1 -1
  36. package/dist/gemini.d.ts +1 -1
  37. package/dist/{guardrails-export-CxCOi3sd.d.ts → guardrails-export-BL8ozXSj.d.ts} +5 -5
  38. package/dist/{guardrails-export-D3pKHiPp.d.cts → guardrails-export-ByaYNGvG.d.cts} +5 -5
  39. package/dist/guardrails.cjs +1 -1
  40. package/dist/guardrails.d.cts +2 -2
  41. package/dist/guardrails.d.ts +2 -2
  42. package/dist/guardrails.js +1 -1
  43. package/dist/{health-monitor-C6xoXrQz.d.cts → health-monitor-C9v10_tj.d.cts} +1 -1
  44. package/dist/{health-monitor-qL9RNMH3.d.ts → health-monitor-J2eKmP--.d.ts} +1 -1
  45. package/dist/index.cjs +4 -4
  46. package/dist/index.d.cts +8 -8
  47. package/dist/index.d.ts +8 -8
  48. package/dist/index.js +1 -1
  49. package/dist/multi-agent-orchestrator-DUMT67N5.cjs +2 -0
  50. package/dist/{multi-agent-orchestrator-OX2TKD5Y.cjs.map → multi-agent-orchestrator-DUMT67N5.cjs.map} +1 -1
  51. package/dist/{multi-agent-orchestrator-RMTLPKB4.js → multi-agent-orchestrator-ZZ63F75F.js} +2 -2
  52. package/dist/{multi-agent-orchestrator-RMTLPKB4.js.map → multi-agent-orchestrator-ZZ63F75F.js.map} +1 -1
  53. package/dist/multi-agent.cjs +1 -1
  54. package/dist/multi-agent.d.cts +6 -6
  55. package/dist/multi-agent.d.ts +6 -6
  56. package/dist/multi-agent.js +1 -1
  57. package/dist/ollama.d.cts +1 -1
  58. package/dist/ollama.d.ts +1 -1
  59. package/dist/openai.d.cts +1 -1
  60. package/dist/openai.d.ts +1 -1
  61. package/dist/{orchestrator-types-DxWn77qo.d.cts → orchestrator-types-BT-NIFOe.d.cts} +3 -3
  62. package/dist/{orchestrator-types-BxOJllSa.d.ts → orchestrator-types-DMuSD8Vq.d.ts} +3 -3
  63. package/dist/predicate.cjs +1 -1
  64. package/dist/predicate.d.cts +2 -2
  65. package/dist/predicate.d.ts +2 -2
  66. package/dist/predicate.js +1 -1
  67. package/dist/testing.cjs +1 -1
  68. package/dist/testing.d.cts +4 -4
  69. package/dist/testing.d.ts +4 -4
  70. package/dist/testing.js +1 -1
  71. package/dist/{types-DJ09LjZX.d.cts → types-6NoeLyrD.d.cts} +1 -0
  72. package/dist/{types-DJ09LjZX.d.ts → types-6NoeLyrD.d.ts} +1 -0
  73. package/package.json +2 -2
  74. package/dist/chunk-7EJN6TYX.cjs.map +0 -1
  75. package/dist/chunk-G7CRWJT7.js.map +0 -1
  76. package/dist/chunk-GTB6HTZV.js.map +0 -1
  77. package/dist/chunk-MDXDPECP.cjs.map +0 -1
  78. package/dist/chunk-QRDBUGPO.js.map +0 -1
  79. package/dist/chunk-TH2D22JP.cjs.map +0 -1
  80. package/dist/chunk-VSVR4RFK.js.map +0 -1
  81. package/dist/chunk-ZGJ2XHGI.cjs.map +0 -1
  82. package/dist/multi-agent-orchestrator-OX2TKD5Y.cjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pattern-mermaid.ts","../src/communication.ts","../src/goal-utils.ts"],"names":["sanitizeId","name","sanitizeLabel","ch","SHAPE_WRAPPERS","wrapNode","id","label","type","shapes","shape","open","close","deduplicateAgents","agents","counts","a","indices","result","sanitized","idx","topoSort","nodes","inDegree","adjacency","key","node","dep","queue","deg","ordered","current","neighbors","neighbor","newDeg","insertIdx","q","isSerializedPattern","p","obj","n","buildPreamble","direction","theme","lines","ALLOWED_TYPES","renderParallel","taskIds","handlers","inputNode","mergeNode","handler","nodeType","handlerNode","renderSequential","renderSupervisor","supId","supNode","worker","wId","wNode","renderDag","sorted","rendered","nodeId","nodeLabel","deps","depId","depNode","depLabel","depType","from","to","renderRace","outputNode","renderReflect","producerId","evalId","producerType","producerNode","evalNode","renderGoal","nodeEntries","producerMap","edgeSet","sortedEntries","b","requires","producer","fromNode","edgeKey","fromId","fromType","toType","renderDebate","judgeId","judgeNode","patternToMermaid","pattern","options","serialized","patternToJSON","preamble","body","generateId","createMessageBus","config","maxHistory","defaultTtlMs","maxPendingPerAgent","persistence","onDelivery","onDeliveryError","subscriptions","messageHistory","messageIndex","pendingMessages","matchesFilter","message","filter","topic","isExpired","getRecipients","deliverMessage","recipients","deliveredTo","deliveryPromises","recipientId","recipientSubs","pending","sub","error","partial","removed","err","agentId","subId","subscription","subs","index","s","existing","msg","limit","messages","m","createAgentNetwork","bus","initialAgents","defaultTimeout","onAgentOnline","onAgentOffline","responseWaiters","info","handleResponse","correlationId","waiter","wasOffline","agent","capability","sender","action","payload","timeout","resolve","reject","timer","task","context","question","createResponder","network","request","response","createDelegator","delegationHandler","delegation","start","createPubSub","topicHandlers","update","topics","wrappedHandlers","wrappedHandler","content","safeSatisfaction","val","buildGraph","agentIds","decl","edges","order","queueIdx","orderSet","inCycle","roots","consumedBy","edge","leaves","getDependencyGraph","graph","validateGoal","errors","warnings","allProduced","planGoal","initialFactKeys","maxSteps","externalDeps","availableFacts","completedAgents","steps","stepNum","readyAgents","producedFacts","unreachableAgents","explainGoal","metric","sat","satDelta","agentList","factList","prevSatisfaction","delta","description","relaxations","r","firstSatisfaction","lastSatisfaction","status","relaxationNote","errorNote","summary"],"mappings":"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","file":"chunk-RHJAMXLS.js","sourcesContent":["import { patternToJSON } from \"./multi-agent-orchestrator.js\";\nimport type {\n ExecutionPattern,\n SerializedDagNode,\n SerializedPattern,\n} from \"./multi-agent-orchestrator.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MermaidDirection = \"LR\" | \"TD\" | \"TB\" | \"RL\" | \"BT\";\n\nexport interface MermaidNodeShapes {\n /** Shape for agent nodes. @default \"square\" */\n agent?: \"square\" | \"round\" | \"stadium\" | \"hexagon\";\n /** Shape for task nodes. @default \"hexagon\" */\n task?: \"square\" | \"round\" | \"stadium\" | \"hexagon\";\n /** Shape for virtual nodes (Input, Output, Merge). @default \"circle\" */\n virtual?: \"circle\" | \"square\" | \"round\" | \"stadium\";\n}\n\nexport interface MermaidOptions {\n /** Graph flow direction. @default \"LR\" */\n direction?: MermaidDirection;\n /** Emits %%{init}%% preamble when set. */\n theme?: \"default\" | \"dark\" | \"forest\" | \"neutral\";\n /** Node shape overrides. */\n shapes?: MermaidNodeShapes;\n /** Set of task IDs — used to render task nodes with distinct shapes. */\n taskIds?: ReadonlySet<string>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Replace non-alphanumeric chars with `_` for Mermaid-safe node IDs. */\nfunction sanitizeId(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, \"_\");\n}\n\n/** Escape characters that have special meaning in Mermaid labels. */\nfunction sanitizeLabel(name: string): string {\n return name\n .replace(/[\\r\\n]+/g, \" \")\n .replace(/[[\\](){}|<>\"]/g, (ch) => `#${ch.charCodeAt(0)};`);\n}\n\nconst SHAPE_WRAPPERS: Record<string, [string, string]> = {\n square: [\"[\", \"]\"],\n round: [\"(\", \")\"],\n stadium: [\"([\", \"])\"],\n hexagon: [\"{{\", \"}}\"],\n circle: [\"((\", \"))\"],\n};\n\n/** Produce `id[label]` or `id((label))` etc. based on shape config. */\nfunction wrapNode(\n id: string,\n label: string,\n type: \"agent\" | \"virtual\" | \"task\",\n shapes?: MermaidNodeShapes,\n): string {\n let shape: string;\n if (type === \"task\") {\n shape = shapes?.task ?? \"hexagon\";\n } else if (type === \"agent\") {\n shape = shapes?.agent ?? \"square\";\n } else {\n shape = shapes?.virtual ?? \"circle\";\n }\n const [open, close] = SHAPE_WRAPPERS[shape]!;\n\n return `${id}${open}${sanitizeLabel(label)}${close}`;\n}\n\n/**\n * When the same agent appears multiple times (parallel/race), append `_1`, `_2`\n * suffixes to IDs and adjust labels to `agent #1`, etc.\n */\nfunction deduplicateAgents(\n agents: string[],\n): Array<{ id: string; label: string }> {\n const counts = new Map<string, number>();\n for (const a of agents) {\n counts.set(a, (counts.get(a) ?? 0) + 1);\n }\n\n const indices = new Map<string, number>();\n const result: Array<{ id: string; label: string }> = [];\n\n for (const a of agents) {\n const sanitized = sanitizeId(a);\n if (counts.get(a)! > 1) {\n const idx = (indices.get(a) ?? 0) + 1;\n indices.set(a, idx);\n result.push({ id: `${sanitized}_${idx}`, label: `${a} #${idx}` });\n } else {\n result.push({ id: sanitized, label: a });\n }\n }\n\n return result;\n}\n\n/**\n * Kahn's algorithm with alphabetical tie-breaking for deterministic DAG ordering.\n * Returns node keys in topological order.\n */\nfunction topoSort(nodes: Record<string, SerializedDagNode>): string[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const key of Object.keys(nodes)) {\n if (!inDegree.has(key)) {\n inDegree.set(key, 0);\n }\n if (!adjacency.has(key)) {\n adjacency.set(key, []);\n }\n }\n\n for (const [key, node] of Object.entries(nodes)) {\n for (const dep of node.deps ?? []) {\n adjacency.get(dep)!.push(key);\n inDegree.set(key, (inDegree.get(key) ?? 0) + 1);\n }\n }\n\n // Seed queue with zero-indegree nodes, sorted alphabetically\n const queue: string[] = [];\n for (const [key, deg] of inDegree) {\n if (deg === 0) {\n queue.push(key);\n }\n }\n queue.sort();\n\n const ordered: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n ordered.push(current);\n\n const neighbors = adjacency.get(current) ?? [];\n // Sort to maintain determinism\n neighbors.sort();\n\n for (const neighbor of neighbors) {\n const newDeg = inDegree.get(neighbor)! - 1;\n inDegree.set(neighbor, newDeg);\n if (newDeg === 0) {\n // Insert in sorted position\n const insertIdx = queue.findIndex((q) => q > neighbor);\n if (insertIdx === -1) {\n queue.push(neighbor);\n } else {\n queue.splice(insertIdx, 0, neighbor);\n }\n }\n }\n }\n\n return ordered;\n}\n\n/** Check if input is already serialized (no function fields). */\nfunction isSerializedPattern(\n p: ExecutionPattern<unknown> | SerializedPattern,\n): p is SerializedPattern {\n // SerializedPattern never has function-valued fields.\n // Check a few known function fields to distinguish.\n const obj = p as Record<string, unknown>;\n if (obj.type === \"parallel\" && typeof obj.merge === \"function\") {\n return false;\n }\n if (obj.type === \"sequential\" && typeof obj.transform === \"function\") {\n return false;\n }\n if (obj.type === \"supervisor\" && typeof obj.extract === \"function\") {\n return false;\n }\n if (obj.type === \"dag\" && typeof obj.merge === \"function\") {\n return false;\n }\n if (obj.type === \"reflect\" && typeof obj.parseEvaluation === \"function\") {\n return false;\n }\n if (obj.type === \"race\" && typeof obj.extract === \"function\") {\n return false;\n }\n if (obj.type === \"debate\" && typeof obj.extract === \"function\") {\n return false;\n }\n if (\n obj.type === \"goal\" &&\n (typeof obj.when === \"function\" ||\n typeof obj.satisfaction === \"function\" ||\n typeof obj.extract === \"function\")\n ) {\n return false;\n }\n\n // Also check: if a dag node has `when` or `transform` functions, not serialized\n if (obj.type === \"dag\" && obj.nodes) {\n for (const node of Object.values(obj.nodes as Record<string, unknown>)) {\n const n = node as Record<string, unknown>;\n if (typeof n.when === \"function\" || typeof n.transform === \"function\") {\n return false;\n }\n }\n }\n\n // Also check: if a goal node has `buildInput` or `extractOutput` functions, not serialized\n if (obj.type === \"goal\" && obj.nodes) {\n for (const node of Object.values(obj.nodes as Record<string, unknown>)) {\n const n = node as Record<string, unknown>;\n if (\n typeof n.buildInput === \"function\" ||\n typeof n.extractOutput === \"function\"\n ) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/** Build the preamble: optional %%{init}%% + graph directive. */\nfunction buildPreamble(direction: MermaidDirection, theme?: string): string {\n const lines: string[] = [];\n if (theme) {\n lines.push(`%%{init: {'theme': '${theme}'}}%%`);\n }\n lines.push(`graph ${direction}`);\n\n return lines.join(\"\\n\");\n}\n\nconst ALLOWED_TYPES = new Set([\n \"parallel\",\n \"sequential\",\n \"supervisor\",\n \"dag\",\n \"reflect\",\n \"race\",\n \"debate\",\n \"goal\",\n]);\n\n// ---------------------------------------------------------------------------\n// Renderers\n// ---------------------------------------------------------------------------\n\nfunction renderParallel(\n p: Extract<SerializedPattern, { type: \"parallel\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const handlers = deduplicateAgents(p.handlers);\n const inputNode = wrapNode(\"__input\", \"Input\", \"virtual\", shapes);\n const mergeNode = wrapNode(\"__merge\", \"Merge\", \"virtual\", shapes);\n const lines: string[] = [];\n\n for (const handler of handlers) {\n const nodeType = taskIds?.has(handler.label)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const handlerNode = wrapNode(handler.id, handler.label, nodeType, shapes);\n lines.push(` ${inputNode} --> ${handlerNode}`);\n lines.push(` ${handlerNode} --> ${mergeNode}`);\n }\n\n return lines;\n}\n\nfunction renderSequential(\n p: Extract<SerializedPattern, { type: \"sequential\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n if (p.handlers.length === 0) {\n return [];\n }\n\n const handlers = p.handlers.map((a) => ({\n id: sanitizeId(a),\n label: a,\n }));\n\n const nodes = handlers.map((a) =>\n wrapNode(a.id, a.label, taskIds?.has(a.label) ? \"task\" : \"agent\", shapes),\n );\n\n return [` ${nodes.join(\" --> \")}`];\n}\n\nfunction renderSupervisor(\n p: Extract<SerializedPattern, { type: \"supervisor\" }>,\n shapes?: MermaidNodeShapes,\n): string[] {\n const supId = sanitizeId(p.supervisor);\n const supNode = wrapNode(supId, p.supervisor, \"agent\", shapes);\n const lines: string[] = [];\n\n for (const worker of p.workers) {\n const wId = sanitizeId(worker);\n const wNode = wrapNode(wId, worker, \"agent\", shapes);\n lines.push(` ${supNode} -->|delegate| ${wNode}`);\n lines.push(` ${wNode} -->|result| ${supNode}`);\n }\n\n return lines;\n}\n\nfunction renderDag(\n p: Extract<SerializedPattern, { type: \"dag\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const sorted = topoSort(p.nodes);\n const lines: string[] = [];\n const rendered = new Set<string>();\n\n for (const key of sorted) {\n const node = p.nodes[key]!;\n const nodeId = sanitizeId(key);\n const nodeLabel = node.handler;\n const nodeType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n\n if (!node.deps || node.deps.length === 0) {\n if (!rendered.has(nodeId)) {\n lines.push(` ${wrapNode(nodeId, nodeLabel, nodeType, shapes)}`);\n rendered.add(nodeId);\n }\n }\n\n const deps = [...(node.deps ?? [])].sort();\n for (const dep of deps) {\n const depId = sanitizeId(dep);\n const depNode = p.nodes[dep]!;\n const depLabel = depNode.handler;\n const depType = taskIds?.has(depNode.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const from = wrapNode(depId, depLabel, depType, shapes);\n const to = wrapNode(nodeId, nodeLabel, nodeType, shapes);\n lines.push(` ${from} --> ${to}`);\n rendered.add(depId);\n rendered.add(nodeId);\n }\n }\n\n return lines;\n}\n\nfunction renderRace(\n p: Extract<SerializedPattern, { type: \"race\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const handlers = deduplicateAgents(p.handlers);\n const inputNode = wrapNode(\"__input\", \"Input\", \"virtual\", shapes);\n const outputNode = wrapNode(\"__output\", \"Output\", \"virtual\", shapes);\n const lines: string[] = [];\n\n for (const handler of handlers) {\n const nodeType = taskIds?.has(handler.label)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const handlerNode = wrapNode(handler.id, handler.label, nodeType, shapes);\n lines.push(` ${inputNode} --> ${handlerNode}`);\n lines.push(` ${handlerNode} -.-> ${outputNode}`);\n }\n\n return lines;\n}\n\nfunction renderReflect(\n p: Extract<SerializedPattern, { type: \"reflect\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const producerId = sanitizeId(p.handler);\n const evalId = sanitizeId(p.evaluator);\n const producerType = taskIds?.has(p.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const producerNode = wrapNode(producerId, p.handler, producerType, shapes);\n const evalNode = wrapNode(evalId, p.evaluator, \"agent\", shapes);\n const outputNode = wrapNode(\"__output\", \"Output\", \"virtual\", shapes);\n\n return [\n ` ${producerNode} --> ${evalNode}`,\n ` ${evalNode} -->|feedback| ${producerNode}`,\n ` ${evalNode} -->|pass| ${outputNode}`,\n ];\n}\n\nfunction renderGoal(\n p: Extract<SerializedPattern, { type: \"goal\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const nodeEntries = Object.entries(p.nodes);\n const lines: string[] = [];\n\n // Build a map: factKey → nodeId that produces it\n const producerMap = new Map<string, string>();\n for (const [nodeId, node] of nodeEntries) {\n for (const key of node.produces) {\n producerMap.set(key, nodeId);\n }\n }\n\n // Build edges from produces/requires declarations\n const rendered = new Set<string>();\n const edgeSet = new Set<string>();\n\n // Sort node entries for determinism\n const sortedEntries = [...nodeEntries].sort(([a], [b]) => a.localeCompare(b));\n\n for (const [nodeId, node] of sortedEntries) {\n const id = sanitizeId(nodeId);\n const requires = [...(node.requires ?? [])].sort();\n\n if (requires.length === 0) {\n if (!rendered.has(id)) {\n const nodeType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n lines.push(` ${wrapNode(id, node.handler, nodeType, shapes)}`);\n rendered.add(id);\n }\n }\n\n for (const key of requires) {\n const producer = producerMap.get(key);\n if (producer && producer !== nodeId) {\n const fromNode = p.nodes[producer];\n if (!fromNode) {\n continue;\n }\n const edgeKey = `${producer}->${nodeId}`;\n if (!edgeSet.has(edgeKey)) {\n const fromId = sanitizeId(producer);\n const fromType = taskIds?.has(fromNode.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const toType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const from = wrapNode(fromId, fromNode.handler, fromType, shapes);\n const to = wrapNode(id, node.handler, toType, shapes);\n lines.push(` ${from} -->|${sanitizeLabel(key)}| ${to}`);\n rendered.add(fromId);\n rendered.add(id);\n edgeSet.add(edgeKey);\n }\n }\n }\n }\n\n // Render any isolated nodes (no incoming or outgoing edges)\n for (const [nodeId, node] of sortedEntries) {\n const id = sanitizeId(nodeId);\n if (!rendered.has(id)) {\n const nodeType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n lines.push(` ${wrapNode(id, node.handler, nodeType, shapes)}`);\n rendered.add(id);\n }\n }\n\n return lines;\n}\n\nfunction renderDebate(\n p: Extract<SerializedPattern, { type: \"debate\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const handlers = deduplicateAgents(p.handlers);\n const judgeId = sanitizeId(p.evaluator);\n const judgeNode = wrapNode(judgeId, p.evaluator, \"agent\", shapes);\n const outputNode = wrapNode(\"__output\", \"Output\", \"virtual\", shapes);\n const lines: string[] = [];\n\n for (const handler of handlers) {\n const nodeType = taskIds?.has(handler.label)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const handlerNode = wrapNode(handler.id, handler.label, nodeType, shapes);\n lines.push(` ${handlerNode} --> ${judgeNode}`);\n lines.push(` ${judgeNode} -->|next round| ${handlerNode}`);\n }\n\n lines.push(` ${judgeNode} --> ${outputNode}`);\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an execution pattern to a Mermaid diagram string.\n *\n * Accepts both runtime `ExecutionPattern` (with function callbacks) and\n * pre-serialized `SerializedPattern`. Normalizes internally via `patternToJSON()`\n * when it detects function-valued fields.\n *\n * @example\n * ```typescript\n * const p = dag({ fetch: { handler: \"fetcher\" }, report: { handler: \"reporter\", deps: [\"fetch\"] } });\n * console.log(patternToMermaid(p, { direction: \"TD\" }));\n * // graph TD\n * // fetch[fetcher]\n * // fetch[fetcher] --> report[reporter]\n * ```\n *\n * @throws If pattern type is not one of the 8 known types.\n */\nexport function patternToMermaid(\n pattern: ExecutionPattern<unknown> | SerializedPattern,\n options?: MermaidOptions,\n): string {\n const direction = options?.direction ?? \"LR\";\n const shapes = options?.shapes;\n const taskIds = options?.taskIds;\n\n // Normalize to SerializedPattern\n const serialized: SerializedPattern = isSerializedPattern(pattern)\n ? pattern\n : patternToJSON(pattern as ExecutionPattern<unknown>);\n\n if (!ALLOWED_TYPES.has(serialized.type)) {\n throw new Error(\n `[Directive] patternToMermaid: unknown pattern type \"${serialized.type}\"`,\n );\n }\n\n const preamble = buildPreamble(direction, options?.theme);\n let body: string[] = [];\n\n switch (serialized.type) {\n case \"parallel\":\n body = renderParallel(serialized, shapes, taskIds);\n break;\n case \"sequential\":\n body = renderSequential(serialized, shapes, taskIds);\n break;\n case \"supervisor\":\n body = renderSupervisor(serialized, shapes);\n break;\n case \"dag\":\n body = renderDag(serialized, shapes, taskIds);\n break;\n case \"race\":\n body = renderRace(serialized, shapes, taskIds);\n break;\n case \"reflect\":\n body = renderReflect(serialized, shapes, taskIds);\n break;\n case \"debate\":\n body = renderDebate(serialized, shapes, taskIds);\n break;\n case \"goal\":\n body = renderGoal(serialized, shapes, taskIds);\n break;\n }\n\n return `${preamble}\\n${body.join(\"\\n\")}\\n`;\n}\n","/**\n * Agent-to-Agent Communication Protocol\n *\n * Provides structured communication channels between agents for coordination,\n * delegation, and knowledge sharing without central orchestration.\n *\n * @example\n * ```typescript\n * import { createAgentNetwork, createMessageBus } from '@directive-run/ai';\n *\n * const messageBus = createMessageBus();\n *\n * const network = createAgentNetwork({\n * bus: messageBus,\n * agents: {\n * researcher: { capabilities: ['search', 'analyze'] },\n * writer: { capabilities: ['draft', 'edit'] },\n * reviewer: { capabilities: ['review', 'approve'] },\n * },\n * });\n *\n * // Agents can send messages to each other\n * await network.send('researcher', 'writer', {\n * type: 'DELEGATION',\n * task: 'Draft an article based on this research',\n * context: { findings: [...] },\n * });\n * ```\n */\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Base message structure */\nexport interface AgentMessage {\n id: string;\n type: AgentMessageType;\n from: string;\n to: string | string[] | \"*\"; // Single agent, multiple agents, or broadcast\n timestamp: number;\n correlationId?: string; // For request-response patterns\n replyTo?: string; // Message ID this is replying to\n priority?: \"low\" | \"normal\" | \"high\" | \"urgent\";\n ttlMs?: number; // Time-to-live\n metadata?: Record<string, unknown>;\n}\n\n/** Message types for agent communication */\nexport type AgentMessageType =\n | \"REQUEST\" // Request another agent to do something\n | \"RESPONSE\" // Response to a request\n | \"DELEGATION\" // Delegate a task to another agent\n | \"DELEGATION_RESULT\" // Result of a delegated task\n | \"QUERY\" // Ask for information\n | \"INFORM\" // Share information without expecting response\n | \"SUBSCRIBE\" // Subscribe to updates\n | \"UNSUBSCRIBE\" // Unsubscribe from updates\n | \"UPDATE\" // Push update to subscribers\n | \"ACK\" // Acknowledgment\n | \"NACK\" // Negative acknowledgment (rejection)\n | \"PING\" // Health check\n | \"PONG\" // Health check response\n | \"CUSTOM\"; // Custom message type\n\n/** Request message */\nexport interface RequestMessage extends AgentMessage {\n type: \"REQUEST\";\n action: string;\n payload: Record<string, unknown>;\n timeout?: number;\n}\n\n/** Response message */\nexport interface ResponseMessage extends AgentMessage {\n type: \"RESPONSE\";\n success: boolean;\n result?: unknown;\n error?: string;\n}\n\n/** Delegation message */\nexport interface DelegationMessage extends AgentMessage {\n type: \"DELEGATION\";\n task: string;\n context: Record<string, unknown>;\n constraints?: {\n deadline?: number;\n maxCost?: number;\n requiredCapabilities?: string[];\n };\n}\n\n/** Delegation result message */\nexport interface DelegationResultMessage extends AgentMessage {\n type: \"DELEGATION_RESULT\";\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: {\n durationMs: number;\n tokensUsed?: number;\n cost?: number;\n };\n}\n\n/** Query message */\nexport interface QueryMessage extends AgentMessage {\n type: \"QUERY\";\n question: string;\n context?: Record<string, unknown>;\n}\n\n/** Inform message */\nexport interface InformMessage extends AgentMessage {\n type: \"INFORM\";\n topic: string;\n content: unknown;\n}\n\n/** Subscribe message */\nexport interface SubscribeMessage extends AgentMessage {\n type: \"SUBSCRIBE\";\n topics: string[];\n}\n\n/** Update message */\nexport interface UpdateMessage extends AgentMessage {\n type: \"UPDATE\";\n topic: string;\n content: unknown;\n}\n\n/** Union of all message types */\nexport type TypedAgentMessage =\n | RequestMessage\n | ResponseMessage\n | DelegationMessage\n | DelegationResultMessage\n | QueryMessage\n | InformMessage\n | SubscribeMessage\n | UpdateMessage\n | (AgentMessage & {\n type: \"UNSUBSCRIBE\" | \"ACK\" | \"NACK\" | \"PING\" | \"PONG\" | \"CUSTOM\";\n });\n\n// ============================================================================\n// Message Bus Types\n// ============================================================================\n\n/** Message handler function */\nexport type MessageHandler = (\n message: TypedAgentMessage,\n) => void | Promise<void>;\n\n/** Subscription to messages */\nexport interface Subscription {\n id: string;\n agentId: string;\n handler: MessageHandler;\n filter?: MessageFilter;\n unsubscribe: () => void;\n}\n\n/** Message filter criteria */\nexport interface MessageFilter {\n types?: AgentMessageType[];\n from?: string | string[];\n topics?: string[];\n priority?: (\"low\" | \"normal\" | \"high\" | \"urgent\")[];\n custom?: (message: TypedAgentMessage) => boolean;\n}\n\n/** Message bus configuration */\nexport interface MessageBusConfig {\n /** Maximum messages to retain in history */\n maxHistory?: number;\n /** Default TTL for messages */\n defaultTtlMs?: number;\n /** Maximum pending messages per offline agent (prevents unbounded queue growth) */\n maxPendingPerAgent?: number;\n /** Enable message persistence */\n persistence?: MessagePersistence;\n /** Callback when message is delivered */\n onDelivery?: (message: TypedAgentMessage, recipients: string[]) => void;\n /** Callback when message delivery fails */\n onDeliveryError?: (message: TypedAgentMessage, error: Error) => void;\n}\n\n/** Message persistence interface */\nexport interface MessagePersistence {\n save(message: TypedAgentMessage): Promise<void>;\n load(agentId: string, since?: number): Promise<TypedAgentMessage[]>;\n delete(messageId: string): Promise<void>;\n clear(agentId?: string): Promise<void>;\n}\n\n/** Message bus instance */\nexport interface MessageBus {\n /** Publish a message */\n publish(message: Omit<TypedAgentMessage, \"id\" | \"timestamp\">): string;\n /** Subscribe to messages */\n subscribe(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription;\n /** Get message history */\n getHistory(filter?: MessageFilter, limit?: number): TypedAgentMessage[];\n /** Get a specific message by ID */\n getMessage(id: string): TypedAgentMessage | undefined;\n /** Get pending messages for an agent */\n getPending(agentId: string): TypedAgentMessage[];\n /** Clear all messages and data */\n clear(): void;\n /** Destroy the message bus, clearing all data and subscriptions */\n destroy(): void;\n}\n\n// ============================================================================\n// Message Bus Factory\n// ============================================================================\n\nfunction generateId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`\n );\n}\n\n/**\n * Create a message bus for agent communication.\n *\n * @example\n * ```typescript\n * const bus = createMessageBus({ maxHistory: 1000 });\n *\n * // Subscribe to messages\n * bus.subscribe('writer', (msg) => {\n * console.log(`Writer received: ${msg.type}`);\n * });\n *\n * // Publish a message\n * bus.publish({\n * type: 'DELEGATION',\n * from: 'researcher',\n * to: 'writer',\n * task: 'Write summary',\n * context: { data: '...' },\n * });\n * ```\n */\n/**\n * Note: `publish()` is fire-and-forget -- it returns the message ID synchronously\n * before delivery completes. Use `onDelivery` / `onDeliveryError` callbacks in\n * config to track delivery status if needed.\n */\nexport function createMessageBus(config: MessageBusConfig = {}): MessageBus {\n const {\n maxHistory = 1000,\n defaultTtlMs = 3600000, // 1 hour\n maxPendingPerAgent = 100,\n persistence,\n onDelivery,\n onDeliveryError,\n } = config;\n\n const subscriptions = new Map<string, Subscription[]>();\n const messageHistory: TypedAgentMessage[] = [];\n const messageIndex = new Map<string, TypedAgentMessage>(); // O(1) lookup by ID\n const pendingMessages = new Map<string, TypedAgentMessage[]>();\n\n function matchesFilter(\n message: TypedAgentMessage,\n filter: MessageFilter,\n ): boolean {\n if (filter.types && !filter.types.includes(message.type)) {\n return false;\n }\n if (filter.from) {\n const fromList = Array.isArray(filter.from) ? filter.from : [filter.from];\n if (!fromList.includes(message.from)) {\n return false;\n }\n }\n if (filter.topics) {\n const topic = (message as InformMessage | UpdateMessage).topic;\n if (topic && !filter.topics.includes(topic)) {\n return false;\n }\n }\n if (\n filter.priority &&\n message.priority &&\n !filter.priority.includes(message.priority)\n ) {\n return false;\n }\n if (filter.custom && !filter.custom(message)) {\n return false;\n }\n return true;\n }\n\n function isExpired(message: TypedAgentMessage): boolean {\n if (!message.ttlMs) return false;\n return Date.now() - message.timestamp > message.ttlMs;\n }\n\n function getRecipients(message: TypedAgentMessage): string[] {\n if (message.to === \"*\") {\n return Array.from(subscriptions.keys());\n }\n if (Array.isArray(message.to)) {\n return message.to;\n }\n return [message.to];\n }\n\n async function deliverMessage(message: TypedAgentMessage): Promise<void> {\n // Skip expired messages\n if (isExpired(message)) return;\n\n const recipients = getRecipients(message);\n const deliveredTo: string[] = [];\n\n // Build delivery promises for all recipients in parallel\n const deliveryPromises: Promise<void>[] = [];\n\n for (const recipientId of recipients) {\n const recipientSubs = subscriptions.get(recipientId) ?? [];\n\n if (recipientSubs.length === 0) {\n // Queue message for offline agent (bounded)\n const pending = pendingMessages.get(recipientId) ?? [];\n pending.push(message);\n // Drop oldest if over limit\n while (pending.length > maxPendingPerAgent) {\n pending.shift();\n }\n pendingMessages.set(recipientId, pending);\n continue;\n }\n\n for (const sub of recipientSubs) {\n if (!sub.filter || matchesFilter(message, sub.filter)) {\n deliveryPromises.push(\n Promise.resolve(sub.handler(message)).then(\n () => {\n deliveredTo.push(recipientId);\n },\n (error) => {\n onDeliveryError?.(\n message,\n error instanceof Error ? error : new Error(String(error)),\n );\n },\n ),\n );\n }\n }\n }\n\n // Wait for all deliveries to settle in parallel\n if (deliveryPromises.length > 0) {\n await Promise.allSettled(deliveryPromises);\n }\n\n if (deliveredTo.length > 0) {\n onDelivery?.(message, deliveredTo);\n }\n\n // Persist if configured\n if (persistence) {\n await persistence.save(message);\n }\n }\n\n return {\n publish(partial: Omit<TypedAgentMessage, \"id\" | \"timestamp\">): string {\n const message: TypedAgentMessage = {\n ...partial,\n id: generateId(),\n timestamp: Date.now(),\n priority: partial.priority ?? \"normal\",\n ttlMs: partial.ttlMs ?? defaultTtlMs,\n } as TypedAgentMessage;\n\n // Add to history and index\n messageHistory.push(message);\n messageIndex.set(message.id, message);\n\n // Trim old messages (remove from both history and index)\n while (messageHistory.length > maxHistory) {\n const removed = messageHistory.shift();\n if (removed) {\n messageIndex.delete(removed.id);\n }\n }\n\n // Deliver asynchronously\n deliverMessage(message).catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n if (onDeliveryError) {\n onDeliveryError(message, err);\n } else {\n console.error(\"[Directive MessageBus] Delivery error:\", err);\n }\n });\n\n return message.id;\n },\n\n subscribe(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription {\n const subId = generateId();\n\n const subscription: Subscription = {\n id: subId,\n agentId,\n handler,\n filter,\n unsubscribe: () => {\n const subs = subscriptions.get(agentId) ?? [];\n const index = subs.findIndex((s) => s.id === subId);\n if (index >= 0) {\n subs.splice(index, 1);\n }\n },\n };\n\n const existing = subscriptions.get(agentId) ?? [];\n existing.push(subscription);\n subscriptions.set(agentId, existing);\n\n // Deliver pending messages\n const pending = pendingMessages.get(agentId) ?? [];\n pendingMessages.delete(agentId);\n for (const msg of pending) {\n if (!filter || matchesFilter(msg, filter)) {\n const result = handler(msg);\n if (result instanceof Promise) {\n result.catch((error) => {\n const err =\n error instanceof Error ? error : new Error(String(error));\n if (onDeliveryError) {\n onDeliveryError(msg, err);\n } else {\n console.error(\n \"[Directive MessageBus] Pending delivery error:\",\n err,\n );\n }\n });\n }\n }\n }\n\n return subscription;\n },\n\n getHistory(filter?: MessageFilter, limit = 100): TypedAgentMessage[] {\n let messages = messageHistory.filter((m) => !isExpired(m));\n\n if (filter) {\n messages = messages.filter((m) => matchesFilter(m, filter));\n }\n\n return messages.slice(-limit);\n },\n\n getMessage(id: string): TypedAgentMessage | undefined {\n const msg = messageIndex.get(id);\n if (msg && isExpired(msg)) return undefined;\n return msg;\n },\n\n getPending(agentId: string): TypedAgentMessage[] {\n const pending = pendingMessages.get(agentId) ?? [];\n return pending.filter((m) => !isExpired(m));\n },\n\n clear(): void {\n messageHistory.length = 0;\n messageIndex.clear();\n pendingMessages.clear();\n },\n\n destroy(): void {\n messageHistory.length = 0;\n messageIndex.clear();\n pendingMessages.clear();\n subscriptions.clear();\n },\n };\n}\n\n// ============================================================================\n// Agent Network Types\n// ============================================================================\n\n/** Agent registration info */\nexport interface AgentInfo {\n id: string;\n capabilities: string[];\n status: \"online\" | \"offline\" | \"busy\";\n lastSeen: number;\n metadata?: Record<string, unknown>;\n}\n\n/** Agent network configuration */\nexport interface AgentNetworkConfig {\n /** Message bus to use */\n bus: MessageBus;\n /** Registered agents */\n agents?: Record<string, Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">>;\n /** Timeout for request-response patterns */\n defaultTimeout?: number;\n /** Callback when agent comes online */\n onAgentOnline?: (agentId: string) => void;\n /** Callback when agent goes offline */\n onAgentOffline?: (agentId: string) => void;\n}\n\n/** Agent network instance */\nexport interface AgentNetwork {\n /** Register an agent */\n register(\n id: string,\n info: Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">,\n ): void;\n /** Unregister an agent */\n unregister(id: string): void;\n /** Get agent info */\n getAgent(id: string): AgentInfo | undefined;\n /** Get all agents */\n getAgents(): AgentInfo[];\n /** Find agents by capability */\n findByCapability(capability: string): AgentInfo[];\n /** Send a message */\n send(\n from: string,\n to: string | string[],\n message: Partial<TypedAgentMessage>,\n ): string;\n /** Send a request and wait for response */\n request(\n from: string,\n to: string,\n action: string,\n payload: Record<string, unknown>,\n timeout?: number,\n ): Promise<ResponseMessage>;\n /** Delegate a task */\n delegate(\n from: string,\n to: string,\n task: string,\n context: Record<string, unknown>,\n ): Promise<DelegationResultMessage>;\n /** Query an agent */\n query(\n from: string,\n to: string,\n question: string,\n context?: Record<string, unknown>,\n ): Promise<ResponseMessage>;\n /** Broadcast to all agents */\n broadcast(from: string, message: Partial<TypedAgentMessage>): string;\n /** Subscribe an agent to messages */\n listen(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription;\n /** Get the message bus */\n getBus(): MessageBus;\n /** Destroy the network, clearing pending waiters and timers */\n destroy(): void;\n}\n\n// ============================================================================\n// Agent Network Factory\n// ============================================================================\n\n/**\n * Create an agent network for coordinated communication.\n *\n * @example\n * ```typescript\n * const network = createAgentNetwork({\n * bus: createMessageBus(),\n * agents: {\n * researcher: { capabilities: ['search', 'summarize'] },\n * writer: { capabilities: ['draft', 'edit'] },\n * reviewer: { capabilities: ['review', 'approve'] },\n * },\n * });\n *\n * // Delegate a task\n * const result = await network.delegate(\n * 'researcher',\n * 'writer',\n * 'Write an article about AI safety',\n * { research: findingsData }\n * );\n *\n * // Query for information\n * const answer = await network.query(\n * 'writer',\n * 'reviewer',\n * 'Is this paragraph technically accurate?',\n * { text: '...' }\n * );\n * ```\n */\nexport function createAgentNetwork(config: AgentNetworkConfig): AgentNetwork {\n const {\n bus,\n agents: initialAgents = {},\n defaultTimeout = 30000,\n onAgentOnline,\n onAgentOffline,\n } = config;\n\n const agents = new Map<string, AgentInfo>();\n const responseWaiters = new Map<\n string,\n {\n resolve: (msg: ResponseMessage | DelegationResultMessage) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Initialize agents\n for (const [id, info] of Object.entries(initialAgents)) {\n agents.set(id, {\n ...info,\n id,\n status: \"offline\",\n lastSeen: Date.now(),\n });\n }\n\n // Handle response messages\n function handleResponse(message: TypedAgentMessage): void {\n if (message.type !== \"RESPONSE\" && message.type !== \"DELEGATION_RESULT\") {\n return;\n }\n\n const correlationId = message.correlationId ?? message.replyTo;\n if (!correlationId) return;\n\n const waiter = responseWaiters.get(correlationId);\n if (waiter) {\n clearTimeout(waiter.timer);\n responseWaiters.delete(correlationId);\n waiter.resolve(message as ResponseMessage | DelegationResultMessage);\n }\n }\n\n return {\n register(\n id: string,\n info: Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">,\n ): void {\n const wasOffline =\n !agents.has(id) || agents.get(id)?.status === \"offline\";\n\n agents.set(id, {\n ...info,\n id,\n status: \"online\",\n lastSeen: Date.now(),\n });\n\n if (wasOffline) {\n onAgentOnline?.(id);\n }\n },\n\n unregister(id: string): void {\n const agent = agents.get(id);\n if (agent) {\n agent.status = \"offline\";\n onAgentOffline?.(id);\n }\n },\n\n getAgent(id: string): AgentInfo | undefined {\n return agents.get(id);\n },\n\n getAgents(): AgentInfo[] {\n return Array.from(agents.values());\n },\n\n findByCapability(capability: string): AgentInfo[] {\n return Array.from(agents.values()).filter(\n (agent) =>\n agent.capabilities.includes(capability) && agent.status === \"online\",\n );\n },\n\n send(\n from: string,\n to: string | string[],\n message: Partial<TypedAgentMessage>,\n ): string {\n // Update sender's lastSeen\n const sender = agents.get(from);\n if (sender) {\n sender.lastSeen = Date.now();\n sender.status = \"online\";\n }\n\n return bus.publish({\n ...message,\n from,\n to,\n type: message.type ?? \"CUSTOM\",\n } as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n },\n\n async request(\n from: string,\n to: string,\n action: string,\n payload: Record<string, unknown>,\n timeout = defaultTimeout,\n ): Promise<ResponseMessage> {\n return new Promise((resolve, reject) => {\n // Generate a correlation ID upfront so subscription can listen before publish\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition with fast responders\n const sub = bus.subscribe(\n from,\n (msg) => {\n if (\n msg.correlationId === correlationId ||\n msg.replyTo === correlationId\n ) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n },\n { types: [\"RESPONSE\"] },\n );\n\n const timer = setTimeout(() => {\n sub.unsubscribe(); // Clean up subscription on timeout\n responseWaiters.delete(correlationId);\n reject(\n new Error(\n `[Directive Communication] Request timeout after ${timeout}ms`,\n ),\n );\n }, timeout);\n\n responseWaiters.set(correlationId, {\n resolve: resolve as (\n msg: ResponseMessage | DelegationResultMessage,\n ) => void,\n reject,\n timer,\n });\n\n bus.publish({\n type: \"REQUEST\",\n from,\n to,\n action,\n payload,\n timeout,\n correlationId,\n } as Omit<RequestMessage, \"id\" | \"timestamp\"> & {\n correlationId: string;\n });\n });\n },\n\n async delegate(\n from: string,\n to: string,\n task: string,\n context: Record<string, unknown>,\n ): Promise<DelegationResultMessage> {\n return new Promise((resolve, reject) => {\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition\n const sub = bus.subscribe(\n from,\n (msg) => {\n if (\n msg.correlationId === correlationId ||\n msg.replyTo === correlationId\n ) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n },\n { types: [\"DELEGATION_RESULT\"] },\n );\n\n const timer = setTimeout(() => {\n sub.unsubscribe();\n responseWaiters.delete(correlationId);\n reject(\n new Error(\n `[Directive Communication] Delegation timeout after ${defaultTimeout}ms`,\n ),\n );\n }, defaultTimeout);\n\n responseWaiters.set(correlationId, {\n resolve: resolve as (\n msg: ResponseMessage | DelegationResultMessage,\n ) => void,\n reject,\n timer,\n });\n\n bus.publish({\n type: \"DELEGATION\",\n from,\n to,\n task,\n context,\n correlationId,\n } as Omit<DelegationMessage, \"id\" | \"timestamp\"> & {\n correlationId: string;\n });\n });\n },\n\n async query(\n from: string,\n to: string,\n question: string,\n context?: Record<string, unknown>,\n ): Promise<ResponseMessage> {\n return new Promise((resolve, reject) => {\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition\n const sub = bus.subscribe(\n from,\n (msg) => {\n if (\n msg.correlationId === correlationId ||\n msg.replyTo === correlationId\n ) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n },\n { types: [\"RESPONSE\"] },\n );\n\n const timer = setTimeout(() => {\n sub.unsubscribe();\n responseWaiters.delete(correlationId);\n reject(\n new Error(\n `[Directive Communication] Query timeout after ${defaultTimeout}ms`,\n ),\n );\n }, defaultTimeout);\n\n responseWaiters.set(correlationId, {\n resolve: resolve as (\n msg: ResponseMessage | DelegationResultMessage,\n ) => void,\n reject,\n timer,\n });\n\n bus.publish({\n type: \"QUERY\",\n from,\n to,\n question,\n context,\n correlationId,\n } as Omit<QueryMessage, \"id\" | \"timestamp\"> & {\n correlationId: string;\n });\n });\n },\n\n broadcast(from: string, message: Partial<TypedAgentMessage>): string {\n return bus.publish({\n ...message,\n from,\n to: \"*\",\n type: message.type ?? \"INFORM\",\n } as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n },\n\n listen(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription {\n // Mark agent as online\n const agent = agents.get(agentId);\n if (agent) {\n agent.status = \"online\";\n agent.lastSeen = Date.now();\n onAgentOnline?.(agentId);\n }\n\n return bus.subscribe(agentId, handler, filter);\n },\n\n getBus(): MessageBus {\n return bus;\n },\n\n destroy(): void {\n // Clear all pending response waiters and their timers\n for (const [, waiter] of responseWaiters) {\n clearTimeout(waiter.timer);\n }\n responseWaiters.clear();\n agents.clear();\n },\n };\n}\n\n// ============================================================================\n// Communication Patterns\n// ============================================================================\n\n/**\n * Create a request-response helper for handling incoming requests.\n *\n * @example\n * ```typescript\n * const responder = createResponder(network, 'writer');\n *\n * responder.onRequest('draft', async (payload) => {\n * const draft = await generateDraft(payload.topic);\n * return { success: true, result: draft };\n * });\n * ```\n */\nexport function createResponder(network: AgentNetwork, agentId: string) {\n const handlers = new Map<\n string,\n (\n payload: Record<string, unknown>,\n ) => Promise<{ success: boolean; result?: unknown; error?: string }>\n >();\n\n const subscription = network.listen(\n agentId,\n async (message) => {\n if (message.type === \"REQUEST\") {\n const request = message as RequestMessage;\n const handler = handlers.get(request.action);\n\n let response: Partial<ResponseMessage>;\n if (handler) {\n try {\n const result = await handler(request.payload);\n response = {\n type: \"RESPONSE\",\n success: result.success,\n result: result.result,\n error: result.error,\n };\n } catch (error) {\n response = {\n type: \"RESPONSE\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n } else {\n response = {\n type: \"RESPONSE\",\n success: false,\n error: `Unknown action: ${request.action}`,\n };\n }\n\n network.send(agentId, message.from, {\n ...response,\n correlationId: message.correlationId ?? message.id,\n replyTo: message.correlationId ?? message.id,\n });\n }\n },\n { types: [\"REQUEST\"] },\n );\n\n return {\n onRequest(\n action: string,\n handler: (\n payload: Record<string, unknown>,\n ) => Promise<{ success: boolean; result?: unknown; error?: string }>,\n ): void {\n handlers.set(action, handler);\n },\n\n /** Remove a request handler */\n offRequest(action: string): void {\n handlers.delete(action);\n },\n\n /** Destroy this responder, unsubscribing from network */\n destroy(): void {\n subscription.unsubscribe();\n handlers.clear();\n },\n };\n}\n\n/**\n * Create a task delegator for handling incoming delegations.\n *\n * @example\n * ```typescript\n * const delegator = createDelegator(network, 'writer');\n *\n * delegator.onDelegation(async (task, context) => {\n * const result = await executeTask(task, context);\n * return {\n * success: true,\n * result,\n * metrics: { durationMs: 1500, tokensUsed: 500 },\n * };\n * });\n * ```\n */\nexport function createDelegator(network: AgentNetwork, agentId: string) {\n let delegationHandler:\n | ((\n task: string,\n context: Record<string, unknown>,\n ) => Promise<{\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: { durationMs: number; tokensUsed?: number; cost?: number };\n }>)\n | null = null;\n\n const subscription = network.listen(\n agentId,\n async (message) => {\n if (message.type === \"DELEGATION\" && delegationHandler) {\n const delegation = message as DelegationMessage;\n const start = Date.now();\n\n let result: Partial<DelegationResultMessage>;\n try {\n const response = await delegationHandler(\n delegation.task,\n delegation.context,\n );\n result = {\n type: \"DELEGATION_RESULT\",\n success: response.success,\n result: response.result,\n error: response.error,\n metrics: response.metrics ?? { durationMs: Date.now() - start },\n };\n } catch (error) {\n result = {\n type: \"DELEGATION_RESULT\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n metrics: { durationMs: Date.now() - start },\n };\n }\n\n network.send(agentId, message.from, {\n ...result,\n correlationId: message.correlationId ?? message.id,\n replyTo: message.correlationId ?? message.id,\n });\n }\n },\n { types: [\"DELEGATION\"] },\n );\n\n return {\n onDelegation(\n handler: (\n task: string,\n context: Record<string, unknown>,\n ) => Promise<{\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: { durationMs: number; tokensUsed?: number; cost?: number };\n }>,\n ): void {\n delegationHandler = handler;\n },\n\n /** Remove the delegation handler */\n offDelegation(): void {\n delegationHandler = null;\n },\n\n /** Destroy this delegator, unsubscribing from network */\n destroy(): void {\n subscription.unsubscribe();\n delegationHandler = null;\n },\n };\n}\n\n/**\n * Create a pub/sub helper for topic-based communication.\n *\n * @example\n * ```typescript\n * const pubsub = createPubSub(network, 'analyst');\n *\n * // Subscribe to topics\n * pubsub.subscribe(['market-updates', 'alerts'], (topic, content) => {\n * console.log(`Received ${topic}:`, content);\n * });\n *\n * // Publish to topics\n * pubsub.publish('market-updates', { price: 100, change: 5 });\n * ```\n */\nexport function createPubSub(network: AgentNetwork, agentId: string) {\n const topicHandlers = new Map<string, Array<(content: unknown) => void>>();\n\n const subscription = network.listen(\n agentId,\n (message) => {\n if (message.type === \"UPDATE\") {\n const update = message as UpdateMessage;\n const handlers = topicHandlers.get(update.topic) ?? [];\n for (const handler of handlers) {\n handler(update.content);\n }\n }\n },\n { types: [\"UPDATE\"] },\n );\n\n return {\n subscribe(\n topics: string[],\n handler: (topic: string, content: unknown) => void,\n ): () => void {\n // Track wrapped handlers per-subscribe call for proper cleanup\n const wrappedHandlers = new Map<string, (content: unknown) => void>();\n\n for (const topic of topics) {\n const handlers = topicHandlers.get(topic) ?? [];\n const wrappedHandler = (content: unknown) => handler(topic, content);\n wrappedHandlers.set(topic, wrappedHandler);\n handlers.push(wrappedHandler);\n topicHandlers.set(topic, handlers);\n }\n\n // Announce subscription\n network.broadcast(agentId, {\n type: \"SUBSCRIBE\",\n topics,\n } as Partial<SubscribeMessage>);\n\n return () => {\n // Only remove this subscription's handlers, not all handlers for the topic\n for (const [topic, wrappedHandler] of wrappedHandlers) {\n const handlers = topicHandlers.get(topic);\n if (handlers) {\n const idx = handlers.indexOf(wrappedHandler);\n if (idx >= 0) handlers.splice(idx, 1);\n if (handlers.length === 0) topicHandlers.delete(topic);\n }\n }\n wrappedHandlers.clear();\n network.broadcast(agentId, {\n type: \"UNSUBSCRIBE\",\n topics,\n } as Partial<AgentMessage & { type: \"UNSUBSCRIBE\"; topics: string[] }>);\n };\n },\n\n publish(topic: string, content: unknown): void {\n network.broadcast(agentId, {\n type: \"UPDATE\",\n topic,\n content,\n } as Partial<UpdateMessage>);\n },\n\n /** Destroy this pub/sub, unsubscribing from network and clearing handlers */\n destroy(): void {\n subscription.unsubscribe();\n topicHandlers.clear();\n },\n };\n}\n","/**\n * Standalone utilities for goal planning and validation.\n *\n * These functions work with the same `produces` / `requires` agent\n * declarations used by the goal pattern, without requiring an\n * orchestrator instance.\n *\n * @example\n * ```typescript\n * import { validateGoal, planGoal, getDependencyGraph } from '@directive-run/ai';\n *\n * const agents = {\n * fetcher: { produces: ['data'], requires: [] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * reporter: { produces: ['report'], requires: ['analysis'] },\n * };\n *\n * // Validate — cycle detection, missing deps, warnings\n * const validation = validateGoal(agents);\n *\n * // Plan — dry-run without executing agents\n * const plan = planGoal(agents, ['query']);\n *\n * // Graph — topological order, roots, leaves, edges\n * const graph = getDependencyGraph(agents);\n * ```\n *\n * @module\n */\n\nimport type { GoalResult, GoalStepMetrics, RelaxationRecord } from \"./types.js\";\n\n/** Clamp non-finite satisfaction values to 0 */\nfunction safeSatisfaction(val: number): number {\n if (!Number.isFinite(val)) {\n return 0;\n }\n\n return val;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Minimal agent declaration for goal utilities (subset of GoalNode) */\nexport interface GoalAgentDeclaration {\n /** Fact keys this agent writes as output */\n produces: string[];\n /** Fact keys this agent reads as input */\n requires?: string[];\n}\n\n/** Edge in the inferred dependency graph */\nexport interface GoalDependencyEdge {\n from: string;\n to: string;\n /** Fact key that creates this dependency */\n factKey: string;\n}\n\n/** Inferred dependency graph from produces/requires analysis */\nexport interface GoalDependencyGraph {\n /** Agent IDs in topological order (roots first) */\n order: string[];\n /** Edges between agents */\n edges: GoalDependencyEdge[];\n /** Root agents (no unfulfilled requires from other agents) */\n roots: string[];\n /** Leaf agents (nothing depends on their produces) */\n leaves: string[];\n /** Map of fact key to agent ID that produces it */\n producers: Map<string, string>;\n}\n\n/** Validation result */\nexport interface GoalValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/** A single step in an execution plan */\nexport interface GoalPlanStep {\n /** Step number (1-based) */\n step: number;\n /** Agent IDs that would run in this step (parallel) */\n agents: string[];\n /** Fact keys available at the start of this step */\n availableFacts: string[];\n /** Fact keys produced after this step completes */\n producedFacts: string[];\n}\n\n/** Result of a planGoal() dry-run */\nexport interface GoalExecutionPlan {\n /** Ordered steps showing which agents run when */\n steps: GoalPlanStep[];\n /** Agents that can never run (requires never satisfiable) */\n unreachableAgents: string[];\n /** Required fact keys that no agent produces (must be in initial facts) */\n externalDeps: string[];\n /** Whether the plan can potentially reach all agents */\n feasible: boolean;\n}\n\n// ============================================================================\n// Internal: Topological Sort (Kahn's Algorithm)\n// ============================================================================\n\nfunction buildGraph(\n agents: Record<string, GoalAgentDeclaration>,\n): GoalDependencyGraph {\n const agentIds = Object.keys(agents);\n\n // Build a map: factKey → agentId that produces it\n const producerMap = new Map<string, string>();\n for (const [agentId, decl] of Object.entries(agents)) {\n for (const key of decl.produces) {\n if (producerMap.has(key)) {\n throw new Error(\n `[Directive Goal] Fact key \"${key}\" is produced by both \"${producerMap.get(key)}\" and \"${agentId}\". Each fact key must have exactly one producer.`,\n );\n }\n producerMap.set(key, agentId);\n }\n }\n\n // Build edges: agent B requires fact X → agent A produces fact X → edge A→B\n const edges: GoalDependencyEdge[] = [];\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const id of agentIds) {\n inDegree.set(id, 0);\n adjacency.set(id, []);\n }\n\n for (const [agentId, decl] of Object.entries(agents)) {\n for (const key of decl.requires ?? []) {\n const producer = producerMap.get(key);\n if (producer && producer !== agentId) {\n edges.push({ from: producer, to: agentId, factKey: key });\n adjacency.get(producer)!.push(agentId);\n inDegree.set(agentId, (inDegree.get(agentId) ?? 0) + 1);\n }\n }\n }\n\n // Topological sort (Kahn's algorithm)\n const queue: string[] = [];\n for (const [id, deg] of inDegree) {\n if (deg === 0) {\n queue.push(id);\n }\n }\n\n const order: string[] = [];\n let queueIdx = 0;\n while (queueIdx < queue.length) {\n const current = queue[queueIdx++]!;\n order.push(current);\n\n for (const neighbor of adjacency.get(current) ?? []) {\n const newDeg = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDeg);\n if (newDeg === 0) {\n queue.push(neighbor);\n }\n }\n }\n\n if (order.length !== agentIds.length) {\n const orderSet = new Set(order);\n const inCycle = agentIds.filter((id) => !orderSet.has(id));\n\n throw new Error(\n `[Directive Goal] Circular dependency detected among agents: ${inCycle.join(\", \")}. Review their produces/requires declarations.`,\n );\n }\n\n // Identify roots and leaves\n const roots = order.filter((id) => {\n const decl = agents[id]!;\n const requires = decl.requires ?? [];\n\n return requires.every(\n (key) => !producerMap.has(key) || producerMap.get(key) === id,\n );\n });\n\n const consumedBy = new Set<string>();\n for (const edge of edges) {\n consumedBy.add(edge.from);\n }\n const leaves = agentIds.filter((id) => !consumedBy.has(id));\n\n return { order, edges, roots, leaves, producers: producerMap };\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Get the dependency graph for a set of agent declarations.\n *\n * Uses Kahn's algorithm (topological sort) to compute execution order\n * and detect circular dependencies.\n *\n * @throws If agents form a circular dependency or a fact key has multiple producers.\n *\n * @example\n * ```typescript\n * const graph = getDependencyGraph({\n * fetcher: { produces: ['data'], requires: [] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * });\n *\n * console.log(graph.order); // ['fetcher', 'analyzer']\n * console.log(graph.roots); // ['fetcher']\n * console.log(graph.leaves); // ['analyzer']\n * ```\n */\nexport function getDependencyGraph(\n agents: Record<string, GoalAgentDeclaration>,\n): GoalDependencyGraph {\n const graph = buildGraph(agents);\n\n return {\n order: [...graph.order],\n edges: [...graph.edges],\n roots: [...graph.roots],\n leaves: [...graph.leaves],\n producers: new Map(graph.producers),\n };\n}\n\n/**\n * Validate a set of agent declarations for goal execution.\n *\n * Checks for:\n * - Circular dependencies\n * - Duplicate producers (same fact key produced by multiple agents)\n * - Agents with no `produces` (will never contribute)\n * - Required fact keys that no agent produces (must be in initial facts)\n *\n * @example\n * ```typescript\n * const result = validateGoal({\n * fetcher: { produces: ['data'] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * });\n *\n * if (!result.valid) {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function validateGoal(\n agents: Record<string, GoalAgentDeclaration>,\n): GoalValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (Object.keys(agents).length === 0) {\n errors.push(\"No agents declared\");\n }\n\n for (const [id, decl] of Object.entries(agents)) {\n if (decl.produces.length === 0) {\n warnings.push(`Agent \"${id}\" has no produces — it will never contribute`);\n }\n }\n\n const allProduced = new Set<string>();\n for (const decl of Object.values(agents)) {\n for (const key of decl.produces) {\n allProduced.add(key);\n }\n }\n\n for (const [id, decl] of Object.entries(agents)) {\n for (const key of decl.requires ?? []) {\n if (!allProduced.has(key)) {\n warnings.push(\n `Agent \"${id}\" requires \"${key}\" which no agent produces — must be in initial facts`,\n );\n }\n }\n }\n\n try {\n buildGraph(agents);\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\n/**\n * Dry-run goal execution to preview the plan without running agents.\n *\n * Shows which agents would run in each step, which facts would be produced,\n * and whether any agents are unreachable.\n *\n * @param agents - Agent declarations with produces/requires\n * @param initialFactKeys - Fact keys available at the start (not values, just keys)\n * @param maxSteps - Maximum steps to simulate (default: 50)\n *\n * @example\n * ```typescript\n * const plan = planGoal(\n * {\n * fetcher: { produces: ['data'] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * reporter: { produces: ['report'], requires: ['analysis'] },\n * },\n * ['query'],\n * );\n *\n * console.log(plan.feasible); // true\n * console.log(plan.steps); // 3 steps: fetcher → analyzer → reporter\n * ```\n */\nexport function planGoal(\n agents: Record<string, GoalAgentDeclaration>,\n initialFactKeys: string[] = [],\n maxSteps = 50,\n): GoalExecutionPlan {\n const graph = buildGraph(agents);\n\n const allProduced = new Set<string>();\n for (const decl of Object.values(agents)) {\n for (const key of decl.produces) {\n allProduced.add(key);\n }\n }\n\n // External deps: fact keys required by agents that no agent produces\n const externalDeps: string[] = [];\n for (const decl of Object.values(agents)) {\n for (const key of decl.requires ?? []) {\n if (!allProduced.has(key)) {\n externalDeps.push(key);\n }\n }\n }\n\n const availableFacts = new Set(initialFactKeys);\n const completedAgents = new Set<string>();\n const steps: GoalPlanStep[] = [];\n\n for (let stepNum = 1; stepNum <= maxSteps; stepNum++) {\n const readyAgents = graph.order.filter((agentId) => {\n if (completedAgents.has(agentId)) {\n return false;\n }\n const decl = agents[agentId]!;\n const requires = decl.requires ?? [];\n\n return requires.every((key) => availableFacts.has(key));\n });\n\n if (readyAgents.length === 0) {\n break;\n }\n\n const producedFacts: string[] = [];\n for (const agentId of readyAgents) {\n completedAgents.add(agentId);\n for (const key of agents[agentId]!.produces) {\n if (!availableFacts.has(key)) {\n producedFacts.push(key);\n availableFacts.add(key);\n }\n }\n }\n\n steps.push({\n step: stepNum,\n agents: readyAgents,\n availableFacts: [...availableFacts],\n producedFacts,\n });\n }\n\n const unreachableAgents = Object.keys(agents).filter(\n (id) => !completedAgents.has(id),\n );\n\n return {\n steps,\n unreachableAgents,\n externalDeps: [...new Set(externalDeps)],\n feasible: unreachableAgents.length === 0,\n };\n}\n\n// ============================================================================\n// Explain Goal\n// ============================================================================\n\n/** A single line in a goal execution explanation */\nexport interface GoalExplanationStep {\n step: number;\n agents: string[];\n factsProduced: string[];\n satisfaction: number;\n satisfactionDelta: number;\n durationMs: number;\n tokensConsumed: number;\n /** Human-readable description of what happened */\n description: string;\n}\n\n/** Structured explanation of a goal execution */\nexport interface GoalExplanation {\n /** Whether the goal was achieved */\n achieved: boolean;\n /** Human-readable summary */\n summary: string;\n /** Per-step explanations */\n steps: GoalExplanationStep[];\n /** Relaxation events with descriptions */\n relaxations: Array<{\n step: number;\n label: string;\n strategy: string;\n description: string;\n }>;\n /** Total tokens consumed */\n totalTokens: number;\n /** Total duration (ms) */\n durationMs: number;\n}\n\n/**\n * Generate a human-readable explanation of a goal execution result.\n *\n * Takes a `GoalResult` and returns a structured explanation of why each\n * agent ran, how satisfaction progressed, and what relaxations were applied.\n *\n * @example\n * ```typescript\n * const result = await orchestrator.runGoal(nodes, input, when, options);\n * const explanation = explainGoal(result);\n *\n * console.log(explanation.summary);\n * // \"Goal achieved in 3 steps (1,247 tokens, 892ms). Satisfaction: 0 → 1.\"\n *\n * for (const step of explanation.steps) {\n * console.log(step.description);\n * // \"Step 1: Ran fetcher. Produced: data. Satisfaction: 0 → 0.3 (+0.3).\"\n * }\n * ```\n */\nexport function explainGoal<T = unknown>(\n result: GoalResult<T>,\n): GoalExplanation {\n const steps: GoalExplanationStep[] = result.stepMetrics.map(\n (metric: GoalStepMetrics) => {\n const sat = safeSatisfaction(metric.satisfaction);\n const satDelta = safeSatisfaction(metric.satisfactionDelta);\n const agentList = metric.nodesRun.join(\", \");\n const factList =\n metric.factsProduced.length > 0\n ? metric.factsProduced.join(\", \")\n : \"none\";\n const prevSatisfaction = +safeSatisfaction(sat - satDelta).toFixed(3);\n const delta =\n satDelta >= 0 ? `+${satDelta.toFixed(3)}` : satDelta.toFixed(3);\n\n const description =\n `Step ${metric.step}: Ran ${agentList}. ` +\n `Produced: ${factList}. ` +\n `Satisfaction: ${prevSatisfaction} → ${sat.toFixed(3)} (${delta}). ` +\n `${metric.tokensConsumed} tokens, ${metric.durationMs}ms.`;\n\n return {\n step: metric.step,\n agents: metric.nodesRun,\n factsProduced: metric.factsProduced,\n satisfaction: sat,\n satisfactionDelta: satDelta,\n durationMs: metric.durationMs,\n tokensConsumed: metric.tokensConsumed,\n description,\n };\n },\n );\n\n const relaxations = result.relaxations.map((r: RelaxationRecord) => {\n let description: string;\n switch (r.strategy) {\n case \"allow_rerun\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — re-enabled completed nodes for another run.`;\n break;\n case \"inject_facts\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — injected fact values to unblock dependencies.`;\n break;\n case \"accept_partial\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — accepted current facts as partial result.`;\n break;\n case \"alternative_nodes\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — added alternative nodes to the graph.`;\n break;\n case \"custom\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — ran custom recovery logic.`;\n break;\n default:\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" (${r.strategy}).`;\n }\n\n return {\n step: r.step,\n label: r.label,\n strategy: r.strategy,\n description,\n };\n });\n\n const firstSatisfaction =\n result.stepMetrics.length > 0\n ? safeSatisfaction(\n result.stepMetrics[0]!.satisfaction -\n result.stepMetrics[0]!.satisfactionDelta,\n ).toFixed(3)\n : \"0\";\n const lastSatisfaction =\n result.stepMetrics.length > 0\n ? safeSatisfaction(\n result.stepMetrics[result.stepMetrics.length - 1]!.satisfaction,\n ).toFixed(3)\n : \"0\";\n\n const status = result.achieved ? \"Goal achieved\" : \"Goal not achieved\";\n const relaxationNote =\n result.relaxations.length > 0\n ? ` ${result.relaxations.length} relaxation(s) applied.`\n : \"\";\n const errorNote = result.error ? ` Error: ${result.error}` : \"\";\n\n const summary = `${status} in ${result.steps} step(s) (${result.totalTokens.toLocaleString()} tokens, ${result.durationMs}ms). Satisfaction: ${firstSatisfaction} → ${lastSatisfaction}.${relaxationNote}${errorNote}`;\n\n return {\n achieved: result.achieved,\n summary,\n steps,\n relaxations,\n totalTokens: result.totalTokens,\n durationMs: result.durationMs,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/pattern-mermaid.ts","../src/communication.ts","../src/goal-utils.ts"],"names":["sanitizeId","name","sanitizeLabel","ch","SHAPE_WRAPPERS","wrapNode","id","label","type","shapes","shape","open","close","deduplicateAgents","agents","counts","a","indices","result","sanitized","idx","topoSort","nodes","inDegree","adjacency","key","node","dep","queue","deg","ordered","current","neighbors","neighbor","newDeg","insertIdx","q","isSerializedPattern","p","obj","n","buildPreamble","direction","theme","lines","ALLOWED_TYPES","renderParallel","taskIds","handlers","inputNode","mergeNode","handler","nodeType","handlerNode","renderSequential","renderSupervisor","supId","supNode","worker","wId","wNode","renderDag","sorted","rendered","nodeId","nodeLabel","deps","depId","depNode","depLabel","depType","from","to","renderRace","outputNode","renderReflect","producerId","evalId","producerType","producerNode","evalNode","renderGoal","nodeEntries","producerMap","edgeSet","sortedEntries","b","requires","producer","fromNode","edgeKey","fromId","fromType","toType","renderDebate","judgeId","judgeNode","patternToMermaid","pattern","options","serialized","patternToJSON","preamble","body","generateId","createMessageBus","config","maxHistory","defaultTtlMs","maxPendingPerAgent","persistence","onDelivery","onDeliveryError","subscriptions","messageHistory","messageIndex","pendingMessages","matchesFilter","message","filter","topic","isExpired","getRecipients","deliverMessage","recipients","deliveredTo","deliveryPromises","recipientId","recipientSubs","pending","sub","error","partial","removed","err","agentId","subId","subscription","subs","index","s","existing","msg","limit","messages","m","createAgentNetwork","bus","initialAgents","defaultTimeout","onAgentOnline","onAgentOffline","responseWaiters","info","handleResponse","correlationId","waiter","wasOffline","agent","capability","sender","action","payload","timeout","resolve","reject","timer","task","context","question","createResponder","network","request","response","createDelegator","delegationHandler","delegation","start","createPubSub","topicHandlers","update","topics","wrappedHandlers","wrappedHandler","content","safeSatisfaction","val","buildGraph","agentIds","decl","edges","order","queueIdx","orderSet","inCycle","roots","consumedBy","edge","leaves","getDependencyGraph","graph","validateGoal","errors","warnings","allProduced","planGoal","initialFactKeys","maxSteps","externalDeps","availableFacts","completedAgents","steps","stepNum","readyAgents","producedFacts","unreachableAgents","explainGoal","metric","sat","satDelta","agentList","factList","prevSatisfaction","delta","description","relaxations","r","firstSatisfaction","lastSatisfaction","status","relaxationNote","errorNote","summary"],"mappings":"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","file":"chunk-EW77VF5K.js","sourcesContent":["import { patternToJSON } from \"./multi-agent-orchestrator.js\";\nimport type {\n ExecutionPattern,\n SerializedDagNode,\n SerializedPattern,\n} from \"./multi-agent-orchestrator.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MermaidDirection = \"LR\" | \"TD\" | \"TB\" | \"RL\" | \"BT\";\n\nexport interface MermaidNodeShapes {\n /** Shape for agent nodes. @default \"square\" */\n agent?: \"square\" | \"round\" | \"stadium\" | \"hexagon\";\n /** Shape for task nodes. @default \"hexagon\" */\n task?: \"square\" | \"round\" | \"stadium\" | \"hexagon\";\n /** Shape for virtual nodes (Input, Output, Merge). @default \"circle\" */\n virtual?: \"circle\" | \"square\" | \"round\" | \"stadium\";\n}\n\nexport interface MermaidOptions {\n /** Graph flow direction. @default \"LR\" */\n direction?: MermaidDirection;\n /** Emits %%{init}%% preamble when set. */\n theme?: \"default\" | \"dark\" | \"forest\" | \"neutral\";\n /** Node shape overrides. */\n shapes?: MermaidNodeShapes;\n /** Set of task IDs — used to render task nodes with distinct shapes. */\n taskIds?: ReadonlySet<string>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Replace non-alphanumeric chars with `_` for Mermaid-safe node IDs. */\nfunction sanitizeId(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, \"_\");\n}\n\n/** Escape characters that have special meaning in Mermaid labels. */\nfunction sanitizeLabel(name: string): string {\n return name\n .replace(/[\\r\\n]+/g, \" \")\n .replace(/[[\\](){}|<>\"]/g, (ch) => `#${ch.charCodeAt(0)};`);\n}\n\nconst SHAPE_WRAPPERS: Record<string, [string, string]> = {\n square: [\"[\", \"]\"],\n round: [\"(\", \")\"],\n stadium: [\"([\", \"])\"],\n hexagon: [\"{{\", \"}}\"],\n circle: [\"((\", \"))\"],\n};\n\n/** Produce `id[label]` or `id((label))` etc. based on shape config. */\nfunction wrapNode(\n id: string,\n label: string,\n type: \"agent\" | \"virtual\" | \"task\",\n shapes?: MermaidNodeShapes,\n): string {\n let shape: string;\n if (type === \"task\") {\n shape = shapes?.task ?? \"hexagon\";\n } else if (type === \"agent\") {\n shape = shapes?.agent ?? \"square\";\n } else {\n shape = shapes?.virtual ?? \"circle\";\n }\n const [open, close] = SHAPE_WRAPPERS[shape]!;\n\n return `${id}${open}${sanitizeLabel(label)}${close}`;\n}\n\n/**\n * When the same agent appears multiple times (parallel/race), append `_1`, `_2`\n * suffixes to IDs and adjust labels to `agent #1`, etc.\n */\nfunction deduplicateAgents(\n agents: string[],\n): Array<{ id: string; label: string }> {\n const counts = new Map<string, number>();\n for (const a of agents) {\n counts.set(a, (counts.get(a) ?? 0) + 1);\n }\n\n const indices = new Map<string, number>();\n const result: Array<{ id: string; label: string }> = [];\n\n for (const a of agents) {\n const sanitized = sanitizeId(a);\n if (counts.get(a)! > 1) {\n const idx = (indices.get(a) ?? 0) + 1;\n indices.set(a, idx);\n result.push({ id: `${sanitized}_${idx}`, label: `${a} #${idx}` });\n } else {\n result.push({ id: sanitized, label: a });\n }\n }\n\n return result;\n}\n\n/**\n * Kahn's algorithm with alphabetical tie-breaking for deterministic DAG ordering.\n * Returns node keys in topological order.\n */\nfunction topoSort(nodes: Record<string, SerializedDagNode>): string[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const key of Object.keys(nodes)) {\n if (!inDegree.has(key)) {\n inDegree.set(key, 0);\n }\n if (!adjacency.has(key)) {\n adjacency.set(key, []);\n }\n }\n\n for (const [key, node] of Object.entries(nodes)) {\n for (const dep of node.deps ?? []) {\n adjacency.get(dep)!.push(key);\n inDegree.set(key, (inDegree.get(key) ?? 0) + 1);\n }\n }\n\n // Seed queue with zero-indegree nodes, sorted alphabetically\n const queue: string[] = [];\n for (const [key, deg] of inDegree) {\n if (deg === 0) {\n queue.push(key);\n }\n }\n queue.sort();\n\n const ordered: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n ordered.push(current);\n\n const neighbors = adjacency.get(current) ?? [];\n // Sort to maintain determinism\n neighbors.sort();\n\n for (const neighbor of neighbors) {\n const newDeg = inDegree.get(neighbor)! - 1;\n inDegree.set(neighbor, newDeg);\n if (newDeg === 0) {\n // Insert in sorted position\n const insertIdx = queue.findIndex((q) => q > neighbor);\n if (insertIdx === -1) {\n queue.push(neighbor);\n } else {\n queue.splice(insertIdx, 0, neighbor);\n }\n }\n }\n }\n\n return ordered;\n}\n\n/** Check if input is already serialized (no function fields). */\nfunction isSerializedPattern(\n p: ExecutionPattern<unknown> | SerializedPattern,\n): p is SerializedPattern {\n // SerializedPattern never has function-valued fields.\n // Check a few known function fields to distinguish.\n const obj = p as Record<string, unknown>;\n if (obj.type === \"parallel\" && typeof obj.merge === \"function\") {\n return false;\n }\n if (obj.type === \"sequential\" && typeof obj.transform === \"function\") {\n return false;\n }\n if (obj.type === \"supervisor\" && typeof obj.extract === \"function\") {\n return false;\n }\n if (obj.type === \"dag\" && typeof obj.merge === \"function\") {\n return false;\n }\n if (obj.type === \"reflect\" && typeof obj.parseEvaluation === \"function\") {\n return false;\n }\n if (obj.type === \"race\" && typeof obj.extract === \"function\") {\n return false;\n }\n if (obj.type === \"debate\" && typeof obj.extract === \"function\") {\n return false;\n }\n if (\n obj.type === \"goal\" &&\n (typeof obj.when === \"function\" ||\n typeof obj.satisfaction === \"function\" ||\n typeof obj.extract === \"function\")\n ) {\n return false;\n }\n\n // Also check: if a dag node has `when` or `transform` functions, not serialized\n if (obj.type === \"dag\" && obj.nodes) {\n for (const node of Object.values(obj.nodes as Record<string, unknown>)) {\n const n = node as Record<string, unknown>;\n if (typeof n.when === \"function\" || typeof n.transform === \"function\") {\n return false;\n }\n }\n }\n\n // Also check: if a goal node has `buildInput` or `extractOutput` functions, not serialized\n if (obj.type === \"goal\" && obj.nodes) {\n for (const node of Object.values(obj.nodes as Record<string, unknown>)) {\n const n = node as Record<string, unknown>;\n if (\n typeof n.buildInput === \"function\" ||\n typeof n.extractOutput === \"function\"\n ) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/** Build the preamble: optional %%{init}%% + graph directive. */\nfunction buildPreamble(direction: MermaidDirection, theme?: string): string {\n const lines: string[] = [];\n if (theme) {\n lines.push(`%%{init: {'theme': '${theme}'}}%%`);\n }\n lines.push(`graph ${direction}`);\n\n return lines.join(\"\\n\");\n}\n\nconst ALLOWED_TYPES = new Set([\n \"parallel\",\n \"sequential\",\n \"supervisor\",\n \"dag\",\n \"reflect\",\n \"race\",\n \"debate\",\n \"goal\",\n]);\n\n// ---------------------------------------------------------------------------\n// Renderers\n// ---------------------------------------------------------------------------\n\nfunction renderParallel(\n p: Extract<SerializedPattern, { type: \"parallel\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const handlers = deduplicateAgents(p.handlers);\n const inputNode = wrapNode(\"__input\", \"Input\", \"virtual\", shapes);\n const mergeNode = wrapNode(\"__merge\", \"Merge\", \"virtual\", shapes);\n const lines: string[] = [];\n\n for (const handler of handlers) {\n const nodeType = taskIds?.has(handler.label)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const handlerNode = wrapNode(handler.id, handler.label, nodeType, shapes);\n lines.push(` ${inputNode} --> ${handlerNode}`);\n lines.push(` ${handlerNode} --> ${mergeNode}`);\n }\n\n return lines;\n}\n\nfunction renderSequential(\n p: Extract<SerializedPattern, { type: \"sequential\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n if (p.handlers.length === 0) {\n return [];\n }\n\n const handlers = p.handlers.map((a) => ({\n id: sanitizeId(a),\n label: a,\n }));\n\n const nodes = handlers.map((a) =>\n wrapNode(a.id, a.label, taskIds?.has(a.label) ? \"task\" : \"agent\", shapes),\n );\n\n return [` ${nodes.join(\" --> \")}`];\n}\n\nfunction renderSupervisor(\n p: Extract<SerializedPattern, { type: \"supervisor\" }>,\n shapes?: MermaidNodeShapes,\n): string[] {\n const supId = sanitizeId(p.supervisor);\n const supNode = wrapNode(supId, p.supervisor, \"agent\", shapes);\n const lines: string[] = [];\n\n for (const worker of p.workers) {\n const wId = sanitizeId(worker);\n const wNode = wrapNode(wId, worker, \"agent\", shapes);\n lines.push(` ${supNode} -->|delegate| ${wNode}`);\n lines.push(` ${wNode} -->|result| ${supNode}`);\n }\n\n return lines;\n}\n\nfunction renderDag(\n p: Extract<SerializedPattern, { type: \"dag\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const sorted = topoSort(p.nodes);\n const lines: string[] = [];\n const rendered = new Set<string>();\n\n for (const key of sorted) {\n const node = p.nodes[key]!;\n const nodeId = sanitizeId(key);\n const nodeLabel = node.handler;\n const nodeType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n\n if (!node.deps || node.deps.length === 0) {\n if (!rendered.has(nodeId)) {\n lines.push(` ${wrapNode(nodeId, nodeLabel, nodeType, shapes)}`);\n rendered.add(nodeId);\n }\n }\n\n const deps = [...(node.deps ?? [])].sort();\n for (const dep of deps) {\n const depId = sanitizeId(dep);\n const depNode = p.nodes[dep]!;\n const depLabel = depNode.handler;\n const depType = taskIds?.has(depNode.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const from = wrapNode(depId, depLabel, depType, shapes);\n const to = wrapNode(nodeId, nodeLabel, nodeType, shapes);\n lines.push(` ${from} --> ${to}`);\n rendered.add(depId);\n rendered.add(nodeId);\n }\n }\n\n return lines;\n}\n\nfunction renderRace(\n p: Extract<SerializedPattern, { type: \"race\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const handlers = deduplicateAgents(p.handlers);\n const inputNode = wrapNode(\"__input\", \"Input\", \"virtual\", shapes);\n const outputNode = wrapNode(\"__output\", \"Output\", \"virtual\", shapes);\n const lines: string[] = [];\n\n for (const handler of handlers) {\n const nodeType = taskIds?.has(handler.label)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const handlerNode = wrapNode(handler.id, handler.label, nodeType, shapes);\n lines.push(` ${inputNode} --> ${handlerNode}`);\n lines.push(` ${handlerNode} -.-> ${outputNode}`);\n }\n\n return lines;\n}\n\nfunction renderReflect(\n p: Extract<SerializedPattern, { type: \"reflect\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const producerId = sanitizeId(p.handler);\n const evalId = sanitizeId(p.evaluator);\n const producerType = taskIds?.has(p.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const producerNode = wrapNode(producerId, p.handler, producerType, shapes);\n const evalNode = wrapNode(evalId, p.evaluator, \"agent\", shapes);\n const outputNode = wrapNode(\"__output\", \"Output\", \"virtual\", shapes);\n\n return [\n ` ${producerNode} --> ${evalNode}`,\n ` ${evalNode} -->|feedback| ${producerNode}`,\n ` ${evalNode} -->|pass| ${outputNode}`,\n ];\n}\n\nfunction renderGoal(\n p: Extract<SerializedPattern, { type: \"goal\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const nodeEntries = Object.entries(p.nodes);\n const lines: string[] = [];\n\n // Build a map: factKey → nodeId that produces it\n const producerMap = new Map<string, string>();\n for (const [nodeId, node] of nodeEntries) {\n for (const key of node.produces) {\n producerMap.set(key, nodeId);\n }\n }\n\n // Build edges from produces/requires declarations\n const rendered = new Set<string>();\n const edgeSet = new Set<string>();\n\n // Sort node entries for determinism\n const sortedEntries = [...nodeEntries].sort(([a], [b]) => a.localeCompare(b));\n\n for (const [nodeId, node] of sortedEntries) {\n const id = sanitizeId(nodeId);\n const requires = [...(node.requires ?? [])].sort();\n\n if (requires.length === 0) {\n if (!rendered.has(id)) {\n const nodeType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n lines.push(` ${wrapNode(id, node.handler, nodeType, shapes)}`);\n rendered.add(id);\n }\n }\n\n for (const key of requires) {\n const producer = producerMap.get(key);\n if (producer && producer !== nodeId) {\n const fromNode = p.nodes[producer];\n if (!fromNode) {\n continue;\n }\n const edgeKey = `${producer}->${nodeId}`;\n if (!edgeSet.has(edgeKey)) {\n const fromId = sanitizeId(producer);\n const fromType = taskIds?.has(fromNode.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const toType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const from = wrapNode(fromId, fromNode.handler, fromType, shapes);\n const to = wrapNode(id, node.handler, toType, shapes);\n lines.push(` ${from} -->|${sanitizeLabel(key)}| ${to}`);\n rendered.add(fromId);\n rendered.add(id);\n edgeSet.add(edgeKey);\n }\n }\n }\n }\n\n // Render any isolated nodes (no incoming or outgoing edges)\n for (const [nodeId, node] of sortedEntries) {\n const id = sanitizeId(nodeId);\n if (!rendered.has(id)) {\n const nodeType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n lines.push(` ${wrapNode(id, node.handler, nodeType, shapes)}`);\n rendered.add(id);\n }\n }\n\n return lines;\n}\n\nfunction renderDebate(\n p: Extract<SerializedPattern, { type: \"debate\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const handlers = deduplicateAgents(p.handlers);\n const judgeId = sanitizeId(p.evaluator);\n const judgeNode = wrapNode(judgeId, p.evaluator, \"agent\", shapes);\n const outputNode = wrapNode(\"__output\", \"Output\", \"virtual\", shapes);\n const lines: string[] = [];\n\n for (const handler of handlers) {\n const nodeType = taskIds?.has(handler.label)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const handlerNode = wrapNode(handler.id, handler.label, nodeType, shapes);\n lines.push(` ${handlerNode} --> ${judgeNode}`);\n lines.push(` ${judgeNode} -->|next round| ${handlerNode}`);\n }\n\n lines.push(` ${judgeNode} --> ${outputNode}`);\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an execution pattern to a Mermaid diagram string.\n *\n * Accepts both runtime `ExecutionPattern` (with function callbacks) and\n * pre-serialized `SerializedPattern`. Normalizes internally via `patternToJSON()`\n * when it detects function-valued fields.\n *\n * @example\n * ```typescript\n * const p = dag({ fetch: { handler: \"fetcher\" }, report: { handler: \"reporter\", deps: [\"fetch\"] } });\n * console.log(patternToMermaid(p, { direction: \"TD\" }));\n * // graph TD\n * // fetch[fetcher]\n * // fetch[fetcher] --> report[reporter]\n * ```\n *\n * @throws If pattern type is not one of the 8 known types.\n */\nexport function patternToMermaid(\n pattern: ExecutionPattern<unknown> | SerializedPattern,\n options?: MermaidOptions,\n): string {\n const direction = options?.direction ?? \"LR\";\n const shapes = options?.shapes;\n const taskIds = options?.taskIds;\n\n // Normalize to SerializedPattern\n const serialized: SerializedPattern = isSerializedPattern(pattern)\n ? pattern\n : patternToJSON(pattern as ExecutionPattern<unknown>);\n\n if (!ALLOWED_TYPES.has(serialized.type)) {\n throw new Error(\n `[Directive] patternToMermaid: unknown pattern type \"${serialized.type}\"`,\n );\n }\n\n const preamble = buildPreamble(direction, options?.theme);\n let body: string[] = [];\n\n switch (serialized.type) {\n case \"parallel\":\n body = renderParallel(serialized, shapes, taskIds);\n break;\n case \"sequential\":\n body = renderSequential(serialized, shapes, taskIds);\n break;\n case \"supervisor\":\n body = renderSupervisor(serialized, shapes);\n break;\n case \"dag\":\n body = renderDag(serialized, shapes, taskIds);\n break;\n case \"race\":\n body = renderRace(serialized, shapes, taskIds);\n break;\n case \"reflect\":\n body = renderReflect(serialized, shapes, taskIds);\n break;\n case \"debate\":\n body = renderDebate(serialized, shapes, taskIds);\n break;\n case \"goal\":\n body = renderGoal(serialized, shapes, taskIds);\n break;\n }\n\n return `${preamble}\\n${body.join(\"\\n\")}\\n`;\n}\n","/**\n * Agent-to-Agent Communication Protocol\n *\n * Provides structured communication channels between agents for coordination,\n * delegation, and knowledge sharing without central orchestration.\n *\n * @example\n * ```typescript\n * import { createAgentNetwork, createMessageBus } from '@directive-run/ai';\n *\n * const messageBus = createMessageBus();\n *\n * const network = createAgentNetwork({\n * bus: messageBus,\n * agents: {\n * researcher: { capabilities: ['search', 'analyze'] },\n * writer: { capabilities: ['draft', 'edit'] },\n * reviewer: { capabilities: ['review', 'approve'] },\n * },\n * });\n *\n * // Agents can send messages to each other\n * await network.send('researcher', 'writer', {\n * type: 'DELEGATION',\n * task: 'Draft an article based on this research',\n * context: { findings: [...] },\n * });\n * ```\n */\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Base message structure */\nexport interface AgentMessage {\n id: string;\n type: AgentMessageType;\n from: string;\n to: string | string[] | \"*\"; // Single agent, multiple agents, or broadcast\n timestamp: number;\n correlationId?: string; // For request-response patterns\n replyTo?: string; // Message ID this is replying to\n priority?: \"low\" | \"normal\" | \"high\" | \"urgent\";\n ttlMs?: number; // Time-to-live\n metadata?: Record<string, unknown>;\n}\n\n/** Message types for agent communication */\nexport type AgentMessageType =\n | \"REQUEST\" // Request another agent to do something\n | \"RESPONSE\" // Response to a request\n | \"DELEGATION\" // Delegate a task to another agent\n | \"DELEGATION_RESULT\" // Result of a delegated task\n | \"QUERY\" // Ask for information\n | \"INFORM\" // Share information without expecting response\n | \"SUBSCRIBE\" // Subscribe to updates\n | \"UNSUBSCRIBE\" // Unsubscribe from updates\n | \"UPDATE\" // Push update to subscribers\n | \"ACK\" // Acknowledgment\n | \"NACK\" // Negative acknowledgment (rejection)\n | \"PING\" // Health check\n | \"PONG\" // Health check response\n | \"CUSTOM\"; // Custom message type\n\n/** Request message */\nexport interface RequestMessage extends AgentMessage {\n type: \"REQUEST\";\n action: string;\n payload: Record<string, unknown>;\n timeout?: number;\n}\n\n/** Response message */\nexport interface ResponseMessage extends AgentMessage {\n type: \"RESPONSE\";\n success: boolean;\n result?: unknown;\n error?: string;\n}\n\n/** Delegation message */\nexport interface DelegationMessage extends AgentMessage {\n type: \"DELEGATION\";\n task: string;\n context: Record<string, unknown>;\n constraints?: {\n deadline?: number;\n maxCost?: number;\n requiredCapabilities?: string[];\n };\n}\n\n/** Delegation result message */\nexport interface DelegationResultMessage extends AgentMessage {\n type: \"DELEGATION_RESULT\";\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: {\n durationMs: number;\n tokensUsed?: number;\n cost?: number;\n };\n}\n\n/** Query message */\nexport interface QueryMessage extends AgentMessage {\n type: \"QUERY\";\n question: string;\n context?: Record<string, unknown>;\n}\n\n/** Inform message */\nexport interface InformMessage extends AgentMessage {\n type: \"INFORM\";\n topic: string;\n content: unknown;\n}\n\n/** Subscribe message */\nexport interface SubscribeMessage extends AgentMessage {\n type: \"SUBSCRIBE\";\n topics: string[];\n}\n\n/** Update message */\nexport interface UpdateMessage extends AgentMessage {\n type: \"UPDATE\";\n topic: string;\n content: unknown;\n}\n\n/** Union of all message types */\nexport type TypedAgentMessage =\n | RequestMessage\n | ResponseMessage\n | DelegationMessage\n | DelegationResultMessage\n | QueryMessage\n | InformMessage\n | SubscribeMessage\n | UpdateMessage\n | (AgentMessage & {\n type: \"UNSUBSCRIBE\" | \"ACK\" | \"NACK\" | \"PING\" | \"PONG\" | \"CUSTOM\";\n });\n\n// ============================================================================\n// Message Bus Types\n// ============================================================================\n\n/** Message handler function */\nexport type MessageHandler = (\n message: TypedAgentMessage,\n) => void | Promise<void>;\n\n/** Subscription to messages */\nexport interface Subscription {\n id: string;\n agentId: string;\n handler: MessageHandler;\n filter?: MessageFilter;\n unsubscribe: () => void;\n}\n\n/** Message filter criteria */\nexport interface MessageFilter {\n types?: AgentMessageType[];\n from?: string | string[];\n topics?: string[];\n priority?: (\"low\" | \"normal\" | \"high\" | \"urgent\")[];\n custom?: (message: TypedAgentMessage) => boolean;\n}\n\n/** Message bus configuration */\nexport interface MessageBusConfig {\n /** Maximum messages to retain in history */\n maxHistory?: number;\n /** Default TTL for messages */\n defaultTtlMs?: number;\n /** Maximum pending messages per offline agent (prevents unbounded queue growth) */\n maxPendingPerAgent?: number;\n /** Enable message persistence */\n persistence?: MessagePersistence;\n /** Callback when message is delivered */\n onDelivery?: (message: TypedAgentMessage, recipients: string[]) => void;\n /** Callback when message delivery fails */\n onDeliveryError?: (message: TypedAgentMessage, error: Error) => void;\n}\n\n/** Message persistence interface */\nexport interface MessagePersistence {\n save(message: TypedAgentMessage): Promise<void>;\n load(agentId: string, since?: number): Promise<TypedAgentMessage[]>;\n delete(messageId: string): Promise<void>;\n clear(agentId?: string): Promise<void>;\n}\n\n/** Message bus instance */\nexport interface MessageBus {\n /** Publish a message */\n publish(message: Omit<TypedAgentMessage, \"id\" | \"timestamp\">): string;\n /** Subscribe to messages */\n subscribe(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription;\n /** Get message history */\n getHistory(filter?: MessageFilter, limit?: number): TypedAgentMessage[];\n /** Get a specific message by ID */\n getMessage(id: string): TypedAgentMessage | undefined;\n /** Get pending messages for an agent */\n getPending(agentId: string): TypedAgentMessage[];\n /** Clear all messages and data */\n clear(): void;\n /** Destroy the message bus, clearing all data and subscriptions */\n destroy(): void;\n}\n\n// ============================================================================\n// Message Bus Factory\n// ============================================================================\n\nfunction generateId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`\n );\n}\n\n/**\n * Create a message bus for agent communication.\n *\n * @example\n * ```typescript\n * const bus = createMessageBus({ maxHistory: 1000 });\n *\n * // Subscribe to messages\n * bus.subscribe('writer', (msg) => {\n * console.log(`Writer received: ${msg.type}`);\n * });\n *\n * // Publish a message\n * bus.publish({\n * type: 'DELEGATION',\n * from: 'researcher',\n * to: 'writer',\n * task: 'Write summary',\n * context: { data: '...' },\n * });\n * ```\n */\n/**\n * Note: `publish()` is fire-and-forget -- it returns the message ID synchronously\n * before delivery completes. Use `onDelivery` / `onDeliveryError` callbacks in\n * config to track delivery status if needed.\n */\nexport function createMessageBus(config: MessageBusConfig = {}): MessageBus {\n const {\n maxHistory = 1000,\n defaultTtlMs = 3600000, // 1 hour\n maxPendingPerAgent = 100,\n persistence,\n onDelivery,\n onDeliveryError,\n } = config;\n\n const subscriptions = new Map<string, Subscription[]>();\n const messageHistory: TypedAgentMessage[] = [];\n const messageIndex = new Map<string, TypedAgentMessage>(); // O(1) lookup by ID\n const pendingMessages = new Map<string, TypedAgentMessage[]>();\n\n function matchesFilter(\n message: TypedAgentMessage,\n filter: MessageFilter,\n ): boolean {\n if (filter.types && !filter.types.includes(message.type)) {\n return false;\n }\n if (filter.from) {\n const fromList = Array.isArray(filter.from) ? filter.from : [filter.from];\n if (!fromList.includes(message.from)) {\n return false;\n }\n }\n if (filter.topics) {\n const topic = (message as InformMessage | UpdateMessage).topic;\n if (topic && !filter.topics.includes(topic)) {\n return false;\n }\n }\n if (\n filter.priority &&\n message.priority &&\n !filter.priority.includes(message.priority)\n ) {\n return false;\n }\n if (filter.custom && !filter.custom(message)) {\n return false;\n }\n return true;\n }\n\n function isExpired(message: TypedAgentMessage): boolean {\n if (!message.ttlMs) return false;\n return Date.now() - message.timestamp > message.ttlMs;\n }\n\n function getRecipients(message: TypedAgentMessage): string[] {\n if (message.to === \"*\") {\n return Array.from(subscriptions.keys());\n }\n if (Array.isArray(message.to)) {\n return message.to;\n }\n return [message.to];\n }\n\n async function deliverMessage(message: TypedAgentMessage): Promise<void> {\n // Skip expired messages\n if (isExpired(message)) return;\n\n const recipients = getRecipients(message);\n const deliveredTo: string[] = [];\n\n // Build delivery promises for all recipients in parallel\n const deliveryPromises: Promise<void>[] = [];\n\n for (const recipientId of recipients) {\n const recipientSubs = subscriptions.get(recipientId) ?? [];\n\n if (recipientSubs.length === 0) {\n // Queue message for offline agent (bounded)\n const pending = pendingMessages.get(recipientId) ?? [];\n pending.push(message);\n // Drop oldest if over limit\n while (pending.length > maxPendingPerAgent) {\n pending.shift();\n }\n pendingMessages.set(recipientId, pending);\n continue;\n }\n\n for (const sub of recipientSubs) {\n if (!sub.filter || matchesFilter(message, sub.filter)) {\n deliveryPromises.push(\n Promise.resolve(sub.handler(message)).then(\n () => {\n deliveredTo.push(recipientId);\n },\n (error) => {\n onDeliveryError?.(\n message,\n error instanceof Error ? error : new Error(String(error)),\n );\n },\n ),\n );\n }\n }\n }\n\n // Wait for all deliveries to settle in parallel\n if (deliveryPromises.length > 0) {\n await Promise.allSettled(deliveryPromises);\n }\n\n if (deliveredTo.length > 0) {\n onDelivery?.(message, deliveredTo);\n }\n\n // Persist if configured\n if (persistence) {\n await persistence.save(message);\n }\n }\n\n return {\n publish(partial: Omit<TypedAgentMessage, \"id\" | \"timestamp\">): string {\n const message: TypedAgentMessage = {\n ...partial,\n id: generateId(),\n timestamp: Date.now(),\n priority: partial.priority ?? \"normal\",\n ttlMs: partial.ttlMs ?? defaultTtlMs,\n } as TypedAgentMessage;\n\n // Add to history and index\n messageHistory.push(message);\n messageIndex.set(message.id, message);\n\n // Trim old messages (remove from both history and index)\n while (messageHistory.length > maxHistory) {\n const removed = messageHistory.shift();\n if (removed) {\n messageIndex.delete(removed.id);\n }\n }\n\n // Deliver asynchronously\n deliverMessage(message).catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n if (onDeliveryError) {\n onDeliveryError(message, err);\n } else {\n console.error(\"[Directive MessageBus] Delivery error:\", err);\n }\n });\n\n return message.id;\n },\n\n subscribe(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription {\n const subId = generateId();\n\n const subscription: Subscription = {\n id: subId,\n agentId,\n handler,\n filter,\n unsubscribe: () => {\n const subs = subscriptions.get(agentId) ?? [];\n const index = subs.findIndex((s) => s.id === subId);\n if (index >= 0) {\n subs.splice(index, 1);\n }\n },\n };\n\n const existing = subscriptions.get(agentId) ?? [];\n existing.push(subscription);\n subscriptions.set(agentId, existing);\n\n // Deliver pending messages\n const pending = pendingMessages.get(agentId) ?? [];\n pendingMessages.delete(agentId);\n for (const msg of pending) {\n if (!filter || matchesFilter(msg, filter)) {\n const result = handler(msg);\n if (result instanceof Promise) {\n result.catch((error) => {\n const err =\n error instanceof Error ? error : new Error(String(error));\n if (onDeliveryError) {\n onDeliveryError(msg, err);\n } else {\n console.error(\n \"[Directive MessageBus] Pending delivery error:\",\n err,\n );\n }\n });\n }\n }\n }\n\n return subscription;\n },\n\n getHistory(filter?: MessageFilter, limit = 100): TypedAgentMessage[] {\n let messages = messageHistory.filter((m) => !isExpired(m));\n\n if (filter) {\n messages = messages.filter((m) => matchesFilter(m, filter));\n }\n\n return messages.slice(-limit);\n },\n\n getMessage(id: string): TypedAgentMessage | undefined {\n const msg = messageIndex.get(id);\n if (msg && isExpired(msg)) return undefined;\n return msg;\n },\n\n getPending(agentId: string): TypedAgentMessage[] {\n const pending = pendingMessages.get(agentId) ?? [];\n return pending.filter((m) => !isExpired(m));\n },\n\n clear(): void {\n messageHistory.length = 0;\n messageIndex.clear();\n pendingMessages.clear();\n },\n\n destroy(): void {\n messageHistory.length = 0;\n messageIndex.clear();\n pendingMessages.clear();\n subscriptions.clear();\n },\n };\n}\n\n// ============================================================================\n// Agent Network Types\n// ============================================================================\n\n/** Agent registration info */\nexport interface AgentInfo {\n id: string;\n capabilities: string[];\n status: \"online\" | \"offline\" | \"busy\";\n lastSeen: number;\n metadata?: Record<string, unknown>;\n}\n\n/** Agent network configuration */\nexport interface AgentNetworkConfig {\n /** Message bus to use */\n bus: MessageBus;\n /** Registered agents */\n agents?: Record<string, Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">>;\n /** Timeout for request-response patterns */\n defaultTimeout?: number;\n /** Callback when agent comes online */\n onAgentOnline?: (agentId: string) => void;\n /** Callback when agent goes offline */\n onAgentOffline?: (agentId: string) => void;\n}\n\n/** Agent network instance */\nexport interface AgentNetwork {\n /** Register an agent */\n register(\n id: string,\n info: Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">,\n ): void;\n /** Unregister an agent */\n unregister(id: string): void;\n /** Get agent info */\n getAgent(id: string): AgentInfo | undefined;\n /** Get all agents */\n getAgents(): AgentInfo[];\n /** Find agents by capability */\n findByCapability(capability: string): AgentInfo[];\n /** Send a message */\n send(\n from: string,\n to: string | string[],\n message: Partial<TypedAgentMessage>,\n ): string;\n /** Send a request and wait for response */\n request(\n from: string,\n to: string,\n action: string,\n payload: Record<string, unknown>,\n timeout?: number,\n ): Promise<ResponseMessage>;\n /** Delegate a task */\n delegate(\n from: string,\n to: string,\n task: string,\n context: Record<string, unknown>,\n ): Promise<DelegationResultMessage>;\n /** Query an agent */\n query(\n from: string,\n to: string,\n question: string,\n context?: Record<string, unknown>,\n ): Promise<ResponseMessage>;\n /** Broadcast to all agents */\n broadcast(from: string, message: Partial<TypedAgentMessage>): string;\n /** Subscribe an agent to messages */\n listen(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription;\n /** Get the message bus */\n getBus(): MessageBus;\n /** Destroy the network, clearing pending waiters and timers */\n destroy(): void;\n}\n\n// ============================================================================\n// Agent Network Factory\n// ============================================================================\n\n/**\n * Create an agent network for coordinated communication.\n *\n * @example\n * ```typescript\n * const network = createAgentNetwork({\n * bus: createMessageBus(),\n * agents: {\n * researcher: { capabilities: ['search', 'summarize'] },\n * writer: { capabilities: ['draft', 'edit'] },\n * reviewer: { capabilities: ['review', 'approve'] },\n * },\n * });\n *\n * // Delegate a task\n * const result = await network.delegate(\n * 'researcher',\n * 'writer',\n * 'Write an article about AI safety',\n * { research: findingsData }\n * );\n *\n * // Query for information\n * const answer = await network.query(\n * 'writer',\n * 'reviewer',\n * 'Is this paragraph technically accurate?',\n * { text: '...' }\n * );\n * ```\n */\nexport function createAgentNetwork(config: AgentNetworkConfig): AgentNetwork {\n const {\n bus,\n agents: initialAgents = {},\n defaultTimeout = 30000,\n onAgentOnline,\n onAgentOffline,\n } = config;\n\n const agents = new Map<string, AgentInfo>();\n const responseWaiters = new Map<\n string,\n {\n resolve: (msg: ResponseMessage | DelegationResultMessage) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Initialize agents\n for (const [id, info] of Object.entries(initialAgents)) {\n agents.set(id, {\n ...info,\n id,\n status: \"offline\",\n lastSeen: Date.now(),\n });\n }\n\n // Handle response messages\n function handleResponse(message: TypedAgentMessage): void {\n if (message.type !== \"RESPONSE\" && message.type !== \"DELEGATION_RESULT\") {\n return;\n }\n\n const correlationId = message.correlationId ?? message.replyTo;\n if (!correlationId) return;\n\n const waiter = responseWaiters.get(correlationId);\n if (waiter) {\n clearTimeout(waiter.timer);\n responseWaiters.delete(correlationId);\n waiter.resolve(message as ResponseMessage | DelegationResultMessage);\n }\n }\n\n return {\n register(\n id: string,\n info: Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">,\n ): void {\n const wasOffline =\n !agents.has(id) || agents.get(id)?.status === \"offline\";\n\n agents.set(id, {\n ...info,\n id,\n status: \"online\",\n lastSeen: Date.now(),\n });\n\n if (wasOffline) {\n onAgentOnline?.(id);\n }\n },\n\n unregister(id: string): void {\n const agent = agents.get(id);\n if (agent) {\n agent.status = \"offline\";\n onAgentOffline?.(id);\n }\n },\n\n getAgent(id: string): AgentInfo | undefined {\n return agents.get(id);\n },\n\n getAgents(): AgentInfo[] {\n return Array.from(agents.values());\n },\n\n findByCapability(capability: string): AgentInfo[] {\n return Array.from(agents.values()).filter(\n (agent) =>\n agent.capabilities.includes(capability) && agent.status === \"online\",\n );\n },\n\n send(\n from: string,\n to: string | string[],\n message: Partial<TypedAgentMessage>,\n ): string {\n // Update sender's lastSeen\n const sender = agents.get(from);\n if (sender) {\n sender.lastSeen = Date.now();\n sender.status = \"online\";\n }\n\n return bus.publish({\n ...message,\n from,\n to,\n type: message.type ?? \"CUSTOM\",\n } as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n },\n\n async request(\n from: string,\n to: string,\n action: string,\n payload: Record<string, unknown>,\n timeout = defaultTimeout,\n ): Promise<ResponseMessage> {\n return new Promise((resolve, reject) => {\n // Generate a correlation ID upfront so subscription can listen before publish\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition with fast responders\n const sub = bus.subscribe(\n from,\n (msg) => {\n if (\n msg.correlationId === correlationId ||\n msg.replyTo === correlationId\n ) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n },\n { types: [\"RESPONSE\"] },\n );\n\n const timer = setTimeout(() => {\n sub.unsubscribe(); // Clean up subscription on timeout\n responseWaiters.delete(correlationId);\n reject(\n new Error(\n `[Directive Communication] Request timeout after ${timeout}ms`,\n ),\n );\n }, timeout);\n\n responseWaiters.set(correlationId, {\n resolve: resolve as (\n msg: ResponseMessage | DelegationResultMessage,\n ) => void,\n reject,\n timer,\n });\n\n bus.publish({\n type: \"REQUEST\",\n from,\n to,\n action,\n payload,\n timeout,\n correlationId,\n } as Omit<RequestMessage, \"id\" | \"timestamp\"> & {\n correlationId: string;\n });\n });\n },\n\n async delegate(\n from: string,\n to: string,\n task: string,\n context: Record<string, unknown>,\n ): Promise<DelegationResultMessage> {\n return new Promise((resolve, reject) => {\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition\n const sub = bus.subscribe(\n from,\n (msg) => {\n if (\n msg.correlationId === correlationId ||\n msg.replyTo === correlationId\n ) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n },\n { types: [\"DELEGATION_RESULT\"] },\n );\n\n const timer = setTimeout(() => {\n sub.unsubscribe();\n responseWaiters.delete(correlationId);\n reject(\n new Error(\n `[Directive Communication] Delegation timeout after ${defaultTimeout}ms`,\n ),\n );\n }, defaultTimeout);\n\n responseWaiters.set(correlationId, {\n resolve: resolve as (\n msg: ResponseMessage | DelegationResultMessage,\n ) => void,\n reject,\n timer,\n });\n\n bus.publish({\n type: \"DELEGATION\",\n from,\n to,\n task,\n context,\n correlationId,\n } as Omit<DelegationMessage, \"id\" | \"timestamp\"> & {\n correlationId: string;\n });\n });\n },\n\n async query(\n from: string,\n to: string,\n question: string,\n context?: Record<string, unknown>,\n ): Promise<ResponseMessage> {\n return new Promise((resolve, reject) => {\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition\n const sub = bus.subscribe(\n from,\n (msg) => {\n if (\n msg.correlationId === correlationId ||\n msg.replyTo === correlationId\n ) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n },\n { types: [\"RESPONSE\"] },\n );\n\n const timer = setTimeout(() => {\n sub.unsubscribe();\n responseWaiters.delete(correlationId);\n reject(\n new Error(\n `[Directive Communication] Query timeout after ${defaultTimeout}ms`,\n ),\n );\n }, defaultTimeout);\n\n responseWaiters.set(correlationId, {\n resolve: resolve as (\n msg: ResponseMessage | DelegationResultMessage,\n ) => void,\n reject,\n timer,\n });\n\n bus.publish({\n type: \"QUERY\",\n from,\n to,\n question,\n context,\n correlationId,\n } as Omit<QueryMessage, \"id\" | \"timestamp\"> & {\n correlationId: string;\n });\n });\n },\n\n broadcast(from: string, message: Partial<TypedAgentMessage>): string {\n return bus.publish({\n ...message,\n from,\n to: \"*\",\n type: message.type ?? \"INFORM\",\n } as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n },\n\n listen(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription {\n // Mark agent as online\n const agent = agents.get(agentId);\n if (agent) {\n agent.status = \"online\";\n agent.lastSeen = Date.now();\n onAgentOnline?.(agentId);\n }\n\n return bus.subscribe(agentId, handler, filter);\n },\n\n getBus(): MessageBus {\n return bus;\n },\n\n destroy(): void {\n // Clear all pending response waiters and their timers\n for (const [, waiter] of responseWaiters) {\n clearTimeout(waiter.timer);\n }\n responseWaiters.clear();\n agents.clear();\n },\n };\n}\n\n// ============================================================================\n// Communication Patterns\n// ============================================================================\n\n/**\n * Create a request-response helper for handling incoming requests.\n *\n * @example\n * ```typescript\n * const responder = createResponder(network, 'writer');\n *\n * responder.onRequest('draft', async (payload) => {\n * const draft = await generateDraft(payload.topic);\n * return { success: true, result: draft };\n * });\n * ```\n */\nexport function createResponder(network: AgentNetwork, agentId: string) {\n const handlers = new Map<\n string,\n (\n payload: Record<string, unknown>,\n ) => Promise<{ success: boolean; result?: unknown; error?: string }>\n >();\n\n const subscription = network.listen(\n agentId,\n async (message) => {\n if (message.type === \"REQUEST\") {\n const request = message as RequestMessage;\n const handler = handlers.get(request.action);\n\n let response: Partial<ResponseMessage>;\n if (handler) {\n try {\n const result = await handler(request.payload);\n response = {\n type: \"RESPONSE\",\n success: result.success,\n result: result.result,\n error: result.error,\n };\n } catch (error) {\n response = {\n type: \"RESPONSE\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n } else {\n response = {\n type: \"RESPONSE\",\n success: false,\n error: `Unknown action: ${request.action}`,\n };\n }\n\n network.send(agentId, message.from, {\n ...response,\n correlationId: message.correlationId ?? message.id,\n replyTo: message.correlationId ?? message.id,\n });\n }\n },\n { types: [\"REQUEST\"] },\n );\n\n return {\n onRequest(\n action: string,\n handler: (\n payload: Record<string, unknown>,\n ) => Promise<{ success: boolean; result?: unknown; error?: string }>,\n ): void {\n handlers.set(action, handler);\n },\n\n /** Remove a request handler */\n offRequest(action: string): void {\n handlers.delete(action);\n },\n\n /** Destroy this responder, unsubscribing from network */\n destroy(): void {\n subscription.unsubscribe();\n handlers.clear();\n },\n };\n}\n\n/**\n * Create a task delegator for handling incoming delegations.\n *\n * @example\n * ```typescript\n * const delegator = createDelegator(network, 'writer');\n *\n * delegator.onDelegation(async (task, context) => {\n * const result = await executeTask(task, context);\n * return {\n * success: true,\n * result,\n * metrics: { durationMs: 1500, tokensUsed: 500 },\n * };\n * });\n * ```\n */\nexport function createDelegator(network: AgentNetwork, agentId: string) {\n let delegationHandler:\n | ((\n task: string,\n context: Record<string, unknown>,\n ) => Promise<{\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: { durationMs: number; tokensUsed?: number; cost?: number };\n }>)\n | null = null;\n\n const subscription = network.listen(\n agentId,\n async (message) => {\n if (message.type === \"DELEGATION\" && delegationHandler) {\n const delegation = message as DelegationMessage;\n const start = Date.now();\n\n let result: Partial<DelegationResultMessage>;\n try {\n const response = await delegationHandler(\n delegation.task,\n delegation.context,\n );\n result = {\n type: \"DELEGATION_RESULT\",\n success: response.success,\n result: response.result,\n error: response.error,\n metrics: response.metrics ?? { durationMs: Date.now() - start },\n };\n } catch (error) {\n result = {\n type: \"DELEGATION_RESULT\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n metrics: { durationMs: Date.now() - start },\n };\n }\n\n network.send(agentId, message.from, {\n ...result,\n correlationId: message.correlationId ?? message.id,\n replyTo: message.correlationId ?? message.id,\n });\n }\n },\n { types: [\"DELEGATION\"] },\n );\n\n return {\n onDelegation(\n handler: (\n task: string,\n context: Record<string, unknown>,\n ) => Promise<{\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: { durationMs: number; tokensUsed?: number; cost?: number };\n }>,\n ): void {\n delegationHandler = handler;\n },\n\n /** Remove the delegation handler */\n offDelegation(): void {\n delegationHandler = null;\n },\n\n /** Destroy this delegator, unsubscribing from network */\n destroy(): void {\n subscription.unsubscribe();\n delegationHandler = null;\n },\n };\n}\n\n/**\n * Create a pub/sub helper for topic-based communication.\n *\n * @example\n * ```typescript\n * const pubsub = createPubSub(network, 'analyst');\n *\n * // Subscribe to topics\n * pubsub.subscribe(['market-updates', 'alerts'], (topic, content) => {\n * console.log(`Received ${topic}:`, content);\n * });\n *\n * // Publish to topics\n * pubsub.publish('market-updates', { price: 100, change: 5 });\n * ```\n */\nexport function createPubSub(network: AgentNetwork, agentId: string) {\n const topicHandlers = new Map<string, Array<(content: unknown) => void>>();\n\n const subscription = network.listen(\n agentId,\n (message) => {\n if (message.type === \"UPDATE\") {\n const update = message as UpdateMessage;\n const handlers = topicHandlers.get(update.topic) ?? [];\n for (const handler of handlers) {\n handler(update.content);\n }\n }\n },\n { types: [\"UPDATE\"] },\n );\n\n return {\n subscribe(\n topics: string[],\n handler: (topic: string, content: unknown) => void,\n ): () => void {\n // Track wrapped handlers per-subscribe call for proper cleanup\n const wrappedHandlers = new Map<string, (content: unknown) => void>();\n\n for (const topic of topics) {\n const handlers = topicHandlers.get(topic) ?? [];\n const wrappedHandler = (content: unknown) => handler(topic, content);\n wrappedHandlers.set(topic, wrappedHandler);\n handlers.push(wrappedHandler);\n topicHandlers.set(topic, handlers);\n }\n\n // Announce subscription\n network.broadcast(agentId, {\n type: \"SUBSCRIBE\",\n topics,\n } as Partial<SubscribeMessage>);\n\n return () => {\n // Only remove this subscription's handlers, not all handlers for the topic\n for (const [topic, wrappedHandler] of wrappedHandlers) {\n const handlers = topicHandlers.get(topic);\n if (handlers) {\n const idx = handlers.indexOf(wrappedHandler);\n if (idx >= 0) handlers.splice(idx, 1);\n if (handlers.length === 0) topicHandlers.delete(topic);\n }\n }\n wrappedHandlers.clear();\n network.broadcast(agentId, {\n type: \"UNSUBSCRIBE\",\n topics,\n } as Partial<AgentMessage & { type: \"UNSUBSCRIBE\"; topics: string[] }>);\n };\n },\n\n publish(topic: string, content: unknown): void {\n network.broadcast(agentId, {\n type: \"UPDATE\",\n topic,\n content,\n } as Partial<UpdateMessage>);\n },\n\n /** Destroy this pub/sub, unsubscribing from network and clearing handlers */\n destroy(): void {\n subscription.unsubscribe();\n topicHandlers.clear();\n },\n };\n}\n","/**\n * Standalone utilities for goal planning and validation.\n *\n * These functions work with the same `produces` / `requires` agent\n * declarations used by the goal pattern, without requiring an\n * orchestrator instance.\n *\n * @example\n * ```typescript\n * import { validateGoal, planGoal, getDependencyGraph } from '@directive-run/ai';\n *\n * const agents = {\n * fetcher: { produces: ['data'], requires: [] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * reporter: { produces: ['report'], requires: ['analysis'] },\n * };\n *\n * // Validate — cycle detection, missing deps, warnings\n * const validation = validateGoal(agents);\n *\n * // Plan — dry-run without executing agents\n * const plan = planGoal(agents, ['query']);\n *\n * // Graph — topological order, roots, leaves, edges\n * const graph = getDependencyGraph(agents);\n * ```\n *\n * @module\n */\n\nimport type { GoalResult, GoalStepMetrics, RelaxationRecord } from \"./types.js\";\n\n/** Clamp non-finite satisfaction values to 0 */\nfunction safeSatisfaction(val: number): number {\n if (!Number.isFinite(val)) {\n return 0;\n }\n\n return val;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Minimal agent declaration for goal utilities (subset of GoalNode) */\nexport interface GoalAgentDeclaration {\n /** Fact keys this agent writes as output */\n produces: string[];\n /** Fact keys this agent reads as input */\n requires?: string[];\n}\n\n/** Edge in the inferred dependency graph */\nexport interface GoalDependencyEdge {\n from: string;\n to: string;\n /** Fact key that creates this dependency */\n factKey: string;\n}\n\n/** Inferred dependency graph from produces/requires analysis */\nexport interface GoalDependencyGraph {\n /** Agent IDs in topological order (roots first) */\n order: string[];\n /** Edges between agents */\n edges: GoalDependencyEdge[];\n /** Root agents (no unfulfilled requires from other agents) */\n roots: string[];\n /** Leaf agents (nothing depends on their produces) */\n leaves: string[];\n /** Map of fact key to agent ID that produces it */\n producers: Map<string, string>;\n}\n\n/** Validation result */\nexport interface GoalValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/** A single step in an execution plan */\nexport interface GoalPlanStep {\n /** Step number (1-based) */\n step: number;\n /** Agent IDs that would run in this step (parallel) */\n agents: string[];\n /** Fact keys available at the start of this step */\n availableFacts: string[];\n /** Fact keys produced after this step completes */\n producedFacts: string[];\n}\n\n/** Result of a planGoal() dry-run */\nexport interface GoalExecutionPlan {\n /** Ordered steps showing which agents run when */\n steps: GoalPlanStep[];\n /** Agents that can never run (requires never satisfiable) */\n unreachableAgents: string[];\n /** Required fact keys that no agent produces (must be in initial facts) */\n externalDeps: string[];\n /** Whether the plan can potentially reach all agents */\n feasible: boolean;\n}\n\n// ============================================================================\n// Internal: Topological Sort (Kahn's Algorithm)\n// ============================================================================\n\nfunction buildGraph(\n agents: Record<string, GoalAgentDeclaration>,\n): GoalDependencyGraph {\n const agentIds = Object.keys(agents);\n\n // Build a map: factKey → agentId that produces it\n const producerMap = new Map<string, string>();\n for (const [agentId, decl] of Object.entries(agents)) {\n for (const key of decl.produces) {\n if (producerMap.has(key)) {\n throw new Error(\n `[Directive Goal] Fact key \"${key}\" is produced by both \"${producerMap.get(key)}\" and \"${agentId}\". Each fact key must have exactly one producer.`,\n );\n }\n producerMap.set(key, agentId);\n }\n }\n\n // Build edges: agent B requires fact X → agent A produces fact X → edge A→B\n const edges: GoalDependencyEdge[] = [];\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const id of agentIds) {\n inDegree.set(id, 0);\n adjacency.set(id, []);\n }\n\n for (const [agentId, decl] of Object.entries(agents)) {\n for (const key of decl.requires ?? []) {\n const producer = producerMap.get(key);\n if (producer && producer !== agentId) {\n edges.push({ from: producer, to: agentId, factKey: key });\n adjacency.get(producer)!.push(agentId);\n inDegree.set(agentId, (inDegree.get(agentId) ?? 0) + 1);\n }\n }\n }\n\n // Topological sort (Kahn's algorithm)\n const queue: string[] = [];\n for (const [id, deg] of inDegree) {\n if (deg === 0) {\n queue.push(id);\n }\n }\n\n const order: string[] = [];\n let queueIdx = 0;\n while (queueIdx < queue.length) {\n const current = queue[queueIdx++]!;\n order.push(current);\n\n for (const neighbor of adjacency.get(current) ?? []) {\n const newDeg = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDeg);\n if (newDeg === 0) {\n queue.push(neighbor);\n }\n }\n }\n\n if (order.length !== agentIds.length) {\n const orderSet = new Set(order);\n const inCycle = agentIds.filter((id) => !orderSet.has(id));\n\n throw new Error(\n `[Directive Goal] Circular dependency detected among agents: ${inCycle.join(\", \")}. Review their produces/requires declarations.`,\n );\n }\n\n // Identify roots and leaves\n const roots = order.filter((id) => {\n const decl = agents[id]!;\n const requires = decl.requires ?? [];\n\n return requires.every(\n (key) => !producerMap.has(key) || producerMap.get(key) === id,\n );\n });\n\n const consumedBy = new Set<string>();\n for (const edge of edges) {\n consumedBy.add(edge.from);\n }\n const leaves = agentIds.filter((id) => !consumedBy.has(id));\n\n return { order, edges, roots, leaves, producers: producerMap };\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Get the dependency graph for a set of agent declarations.\n *\n * Uses Kahn's algorithm (topological sort) to compute execution order\n * and detect circular dependencies.\n *\n * @throws If agents form a circular dependency or a fact key has multiple producers.\n *\n * @example\n * ```typescript\n * const graph = getDependencyGraph({\n * fetcher: { produces: ['data'], requires: [] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * });\n *\n * console.log(graph.order); // ['fetcher', 'analyzer']\n * console.log(graph.roots); // ['fetcher']\n * console.log(graph.leaves); // ['analyzer']\n * ```\n */\nexport function getDependencyGraph(\n agents: Record<string, GoalAgentDeclaration>,\n): GoalDependencyGraph {\n const graph = buildGraph(agents);\n\n return {\n order: [...graph.order],\n edges: [...graph.edges],\n roots: [...graph.roots],\n leaves: [...graph.leaves],\n producers: new Map(graph.producers),\n };\n}\n\n/**\n * Validate a set of agent declarations for goal execution.\n *\n * Checks for:\n * - Circular dependencies\n * - Duplicate producers (same fact key produced by multiple agents)\n * - Agents with no `produces` (will never contribute)\n * - Required fact keys that no agent produces (must be in initial facts)\n *\n * @example\n * ```typescript\n * const result = validateGoal({\n * fetcher: { produces: ['data'] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * });\n *\n * if (!result.valid) {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function validateGoal(\n agents: Record<string, GoalAgentDeclaration>,\n): GoalValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (Object.keys(agents).length === 0) {\n errors.push(\"No agents declared\");\n }\n\n for (const [id, decl] of Object.entries(agents)) {\n if (decl.produces.length === 0) {\n warnings.push(`Agent \"${id}\" has no produces — it will never contribute`);\n }\n }\n\n const allProduced = new Set<string>();\n for (const decl of Object.values(agents)) {\n for (const key of decl.produces) {\n allProduced.add(key);\n }\n }\n\n for (const [id, decl] of Object.entries(agents)) {\n for (const key of decl.requires ?? []) {\n if (!allProduced.has(key)) {\n warnings.push(\n `Agent \"${id}\" requires \"${key}\" which no agent produces — must be in initial facts`,\n );\n }\n }\n }\n\n try {\n buildGraph(agents);\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\n/**\n * Dry-run goal execution to preview the plan without running agents.\n *\n * Shows which agents would run in each step, which facts would be produced,\n * and whether any agents are unreachable.\n *\n * @param agents - Agent declarations with produces/requires\n * @param initialFactKeys - Fact keys available at the start (not values, just keys)\n * @param maxSteps - Maximum steps to simulate (default: 50)\n *\n * @example\n * ```typescript\n * const plan = planGoal(\n * {\n * fetcher: { produces: ['data'] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * reporter: { produces: ['report'], requires: ['analysis'] },\n * },\n * ['query'],\n * );\n *\n * console.log(plan.feasible); // true\n * console.log(plan.steps); // 3 steps: fetcher → analyzer → reporter\n * ```\n */\nexport function planGoal(\n agents: Record<string, GoalAgentDeclaration>,\n initialFactKeys: string[] = [],\n maxSteps = 50,\n): GoalExecutionPlan {\n const graph = buildGraph(agents);\n\n const allProduced = new Set<string>();\n for (const decl of Object.values(agents)) {\n for (const key of decl.produces) {\n allProduced.add(key);\n }\n }\n\n // External deps: fact keys required by agents that no agent produces\n const externalDeps: string[] = [];\n for (const decl of Object.values(agents)) {\n for (const key of decl.requires ?? []) {\n if (!allProduced.has(key)) {\n externalDeps.push(key);\n }\n }\n }\n\n const availableFacts = new Set(initialFactKeys);\n const completedAgents = new Set<string>();\n const steps: GoalPlanStep[] = [];\n\n for (let stepNum = 1; stepNum <= maxSteps; stepNum++) {\n const readyAgents = graph.order.filter((agentId) => {\n if (completedAgents.has(agentId)) {\n return false;\n }\n const decl = agents[agentId]!;\n const requires = decl.requires ?? [];\n\n return requires.every((key) => availableFacts.has(key));\n });\n\n if (readyAgents.length === 0) {\n break;\n }\n\n const producedFacts: string[] = [];\n for (const agentId of readyAgents) {\n completedAgents.add(agentId);\n for (const key of agents[agentId]!.produces) {\n if (!availableFacts.has(key)) {\n producedFacts.push(key);\n availableFacts.add(key);\n }\n }\n }\n\n steps.push({\n step: stepNum,\n agents: readyAgents,\n availableFacts: [...availableFacts],\n producedFacts,\n });\n }\n\n const unreachableAgents = Object.keys(agents).filter(\n (id) => !completedAgents.has(id),\n );\n\n return {\n steps,\n unreachableAgents,\n externalDeps: [...new Set(externalDeps)],\n feasible: unreachableAgents.length === 0,\n };\n}\n\n// ============================================================================\n// Explain Goal\n// ============================================================================\n\n/** A single line in a goal execution explanation */\nexport interface GoalExplanationStep {\n step: number;\n agents: string[];\n factsProduced: string[];\n satisfaction: number;\n satisfactionDelta: number;\n durationMs: number;\n tokensConsumed: number;\n /** Human-readable description of what happened */\n description: string;\n}\n\n/** Structured explanation of a goal execution */\nexport interface GoalExplanation {\n /** Whether the goal was achieved */\n achieved: boolean;\n /** Human-readable summary */\n summary: string;\n /** Per-step explanations */\n steps: GoalExplanationStep[];\n /** Relaxation events with descriptions */\n relaxations: Array<{\n step: number;\n label: string;\n strategy: string;\n description: string;\n }>;\n /** Total tokens consumed */\n totalTokens: number;\n /** Total duration (ms) */\n durationMs: number;\n}\n\n/**\n * Generate a human-readable explanation of a goal execution result.\n *\n * Takes a `GoalResult` and returns a structured explanation of why each\n * agent ran, how satisfaction progressed, and what relaxations were applied.\n *\n * @example\n * ```typescript\n * const result = await orchestrator.runGoal(nodes, input, when, options);\n * const explanation = explainGoal(result);\n *\n * console.log(explanation.summary);\n * // \"Goal achieved in 3 steps (1,247 tokens, 892ms). Satisfaction: 0 → 1.\"\n *\n * for (const step of explanation.steps) {\n * console.log(step.description);\n * // \"Step 1: Ran fetcher. Produced: data. Satisfaction: 0 → 0.3 (+0.3).\"\n * }\n * ```\n */\nexport function explainGoal<T = unknown>(\n result: GoalResult<T>,\n): GoalExplanation {\n const steps: GoalExplanationStep[] = result.stepMetrics.map(\n (metric: GoalStepMetrics) => {\n const sat = safeSatisfaction(metric.satisfaction);\n const satDelta = safeSatisfaction(metric.satisfactionDelta);\n const agentList = metric.nodesRun.join(\", \");\n const factList =\n metric.factsProduced.length > 0\n ? metric.factsProduced.join(\", \")\n : \"none\";\n const prevSatisfaction = +safeSatisfaction(sat - satDelta).toFixed(3);\n const delta =\n satDelta >= 0 ? `+${satDelta.toFixed(3)}` : satDelta.toFixed(3);\n\n const description =\n `Step ${metric.step}: Ran ${agentList}. ` +\n `Produced: ${factList}. ` +\n `Satisfaction: ${prevSatisfaction} → ${sat.toFixed(3)} (${delta}). ` +\n `${metric.tokensConsumed} tokens, ${metric.durationMs}ms.`;\n\n return {\n step: metric.step,\n agents: metric.nodesRun,\n factsProduced: metric.factsProduced,\n satisfaction: sat,\n satisfactionDelta: satDelta,\n durationMs: metric.durationMs,\n tokensConsumed: metric.tokensConsumed,\n description,\n };\n },\n );\n\n const relaxations = result.relaxations.map((r: RelaxationRecord) => {\n let description: string;\n switch (r.strategy) {\n case \"allow_rerun\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — re-enabled completed nodes for another run.`;\n break;\n case \"inject_facts\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — injected fact values to unblock dependencies.`;\n break;\n case \"accept_partial\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — accepted current facts as partial result.`;\n break;\n case \"alternative_nodes\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — added alternative nodes to the graph.`;\n break;\n case \"custom\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — ran custom recovery logic.`;\n break;\n default:\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" (${r.strategy}).`;\n }\n\n return {\n step: r.step,\n label: r.label,\n strategy: r.strategy,\n description,\n };\n });\n\n const firstSatisfaction =\n result.stepMetrics.length > 0\n ? safeSatisfaction(\n result.stepMetrics[0]!.satisfaction -\n result.stepMetrics[0]!.satisfactionDelta,\n ).toFixed(3)\n : \"0\";\n const lastSatisfaction =\n result.stepMetrics.length > 0\n ? safeSatisfaction(\n result.stepMetrics[result.stepMetrics.length - 1]!.satisfaction,\n ).toFixed(3)\n : \"0\";\n\n const status = result.achieved ? \"Goal achieved\" : \"Goal not achieved\";\n const relaxationNote =\n result.relaxations.length > 0\n ? ` ${result.relaxations.length} relaxation(s) applied.`\n : \"\";\n const errorNote = result.error ? ` Error: ${result.error}` : \"\";\n\n const summary = `${status} in ${result.steps} step(s) (${result.totalTokens.toLocaleString()} tokens, ${result.durationMs}ms). Satisfaction: ${firstSatisfaction} → ${lastSatisfaction}.${relaxationNote}${errorNote}`;\n\n return {\n achieved: result.achieved,\n summary,\n steps,\n relaxations,\n totalTokens: result.totalTokens,\n durationMs: result.durationMs,\n };\n}\n"]}