@directive-run/ai 1.14.0 → 1.16.0

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 (75) hide show
  1. package/dist/{chunk-DN5NAJM6.js → chunk-56LYSE63.js} +6 -6
  2. package/dist/chunk-56LYSE63.js.map +1 -0
  3. package/dist/{chunk-A22KLB23.cjs → chunk-7DPTXZZI.cjs} +22 -22
  4. package/dist/chunk-7DPTXZZI.cjs.map +1 -0
  5. package/dist/{chunk-QRXWLD6H.js → chunk-BFSRYCOS.js} +2 -2
  6. package/dist/{chunk-QRXWLD6H.js.map → chunk-BFSRYCOS.js.map} +1 -1
  7. package/dist/{chunk-LKY4K5TV.cjs → chunk-C6MQ4WL6.cjs} +2 -2
  8. package/dist/{chunk-LKY4K5TV.cjs.map → chunk-C6MQ4WL6.cjs.map} +1 -1
  9. package/dist/{chunk-A5K77UDX.cjs → chunk-CAA6Q4YY.cjs} +2 -2
  10. package/dist/{chunk-A5K77UDX.cjs.map → chunk-CAA6Q4YY.cjs.map} +1 -1
  11. package/dist/chunk-D5APTMCT.cjs +16 -0
  12. package/dist/chunk-D5APTMCT.cjs.map +1 -0
  13. package/dist/{chunk-LXUMJKGJ.js → chunk-FN4GUZAI.js} +22 -22
  14. package/dist/chunk-FN4GUZAI.js.map +1 -0
  15. package/dist/{chunk-POBEEJR6.js → chunk-GTB6HTZV.js} +7 -7
  16. package/dist/chunk-GTB6HTZV.js.map +1 -0
  17. package/dist/{chunk-UR4ZGO7V.js → chunk-HRR45JZX.js} +4 -4
  18. package/dist/chunk-HRR45JZX.js.map +1 -0
  19. package/dist/{chunk-PD772MSE.cjs → chunk-MDXDPECP.cjs} +7 -7
  20. package/dist/chunk-MDXDPECP.cjs.map +1 -0
  21. package/dist/{chunk-FABDFT74.cjs → chunk-PB276BX2.cjs} +6 -6
  22. package/dist/chunk-PB276BX2.cjs.map +1 -0
  23. package/dist/{chunk-NNAQ4ZH2.js → chunk-V2FCPNPP.js} +2 -2
  24. package/dist/{chunk-NNAQ4ZH2.js.map → chunk-V2FCPNPP.js.map} +1 -1
  25. package/dist/{chunk-FFRWQNK7.cjs → chunk-WCQK3JOR.cjs} +4 -4
  26. package/dist/chunk-WCQK3JOR.cjs.map +1 -0
  27. package/dist/{chunk-IUGSMTBE.js → chunk-YT4QN3KO.js} +8 -8
  28. package/dist/chunk-YT4QN3KO.js.map +1 -0
  29. package/dist/gemini.cjs +1 -1
  30. package/dist/gemini.cjs.map +1 -1
  31. package/dist/gemini.js +1 -1
  32. package/dist/gemini.js.map +1 -1
  33. package/dist/guardrails.cjs +1 -1
  34. package/dist/guardrails.js +1 -1
  35. package/dist/index.cjs +5 -5
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +1 -1
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.js +2 -2
  40. package/dist/index.js.map +1 -1
  41. package/dist/mcp.cjs +1 -1
  42. package/dist/mcp.js +1 -1
  43. package/dist/multi-agent-orchestrator-KFYIDKTF.cjs +2 -0
  44. package/dist/{multi-agent-orchestrator-Y5U4JCFO.cjs.map → multi-agent-orchestrator-KFYIDKTF.cjs.map} +1 -1
  45. package/dist/{multi-agent-orchestrator-QWWQKKGX.js → multi-agent-orchestrator-ZHSMWIKP.js} +2 -2
  46. package/dist/{multi-agent-orchestrator-QWWQKKGX.js.map → multi-agent-orchestrator-ZHSMWIKP.js.map} +1 -1
  47. package/dist/multi-agent.cjs +1 -1
  48. package/dist/multi-agent.d.cts +2 -2
  49. package/dist/multi-agent.d.ts +2 -2
  50. package/dist/multi-agent.js +1 -1
  51. package/dist/openai.cjs +1 -1
  52. package/dist/openai.cjs.map +1 -1
  53. package/dist/openai.js +1 -1
  54. package/dist/openai.js.map +1 -1
  55. package/dist/{orchestrator-types-DeIMRLR7.d.cts → orchestrator-types-CbNE7Rjp.d.cts} +1 -1
  56. package/dist/{orchestrator-types-DGBhL6mc.d.ts → orchestrator-types-ZK9lv5Sm.d.ts} +1 -1
  57. package/dist/predicate.cjs +1 -1
  58. package/dist/predicate.js +1 -1
  59. package/dist/testing.cjs +1 -1
  60. package/dist/testing.d.cts +1 -1
  61. package/dist/testing.d.ts +1 -1
  62. package/dist/testing.js +1 -1
  63. package/package.json +2 -2
  64. package/dist/chunk-2TD4ZSGZ.cjs +0 -16
  65. package/dist/chunk-2TD4ZSGZ.cjs.map +0 -1
  66. package/dist/chunk-A22KLB23.cjs.map +0 -1
  67. package/dist/chunk-DN5NAJM6.js.map +0 -1
  68. package/dist/chunk-FABDFT74.cjs.map +0 -1
  69. package/dist/chunk-FFRWQNK7.cjs.map +0 -1
  70. package/dist/chunk-IUGSMTBE.js.map +0 -1
  71. package/dist/chunk-LXUMJKGJ.js.map +0 -1
  72. package/dist/chunk-PD772MSE.cjs.map +0 -1
  73. package/dist/chunk-POBEEJR6.js.map +0 -1
  74. package/dist/chunk-UR4ZGO7V.js.map +0 -1
  75. package/dist/multi-agent-orchestrator-Y5U4JCFO.cjs +0 -2
@@ -0,0 +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-PB276BX2.cjs","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"]}
@@ -7,5 +7,5 @@ Provide a real 'clientFactory' option to connect to actual MCP servers:
7
7
  const adapter = createMCPAdapter({
8
8
  servers: [...],
9
9
  clientFactory: (config) => new Client(config),
10
- });`):v&&console.debug("[Directive MCP] Using stub client for development. Provide 'clientFactory' for production use."));let b=i.clientFactory??(e=>O(e,v)),A=i.approvalTimeoutMs??3e5,n={servers:new Map,toolConstraints:new Map(Object.entries(c)),rateLimiters:new Map,pendingApprovals:new Map,approvedRequests:new Set,rejectedRequests:new Set},E=0,d=new Map,M=new Map;function D(e){return new Promise((t,r)=>{if(n.approvedRequests.has(e)){n.approvedRequests.delete(e),n.pendingApprovals.delete(e),s.onApprovalResolved?.(e,true),t();return}if(n.rejectedRequests.has(e)){n.rejectedRequests.delete(e),n.pendingApprovals.delete(e);let l=M.get(e);M.delete(e),s.onApprovalResolved?.(e,false),r(new Error(`[Directive MCP] Tool call request ${e} was rejected${l?`: ${l}`:""}`));return}let o=setTimeout(()=>{d.delete(e),n.pendingApprovals.delete(e),r(new Error(`[Directive MCP] Approval timeout: Request ${e} was not approved or rejected within ${A}ms. Call adapter.approve("${e}") or adapter.reject("${e}") to resolve.`));},A);d.set(e,{resolve:t,reject:r,timeoutId:o});})}function $(e,t,r){let o=d.get(e);o?(clearTimeout(o.timeoutId),d.delete(e),n.pendingApprovals.delete(e),s.onApprovalResolved?.(e,t),t?o.resolve():o.reject(new Error(`[Directive MCP] Tool call request ${e} was rejected${r?`: ${r}`:""}`))):(t?n.approvedRequests.add(e):(n.rejectedRequests.add(e),r&&M.set(e,r)),setTimeout(()=>{n.approvedRequests.delete(e),n.rejectedRequests.delete(e),M.delete(e),n.pendingApprovals.delete(e);},A));}let w=new Map;for(let e of a)n.servers.set(e.name,{config:e,client:null,tools:[],resources:[],status:"disconnected"}),w.set(e.name,{timer:null,attempts:0,maxAttempts:e.retry?.maxAttempts??10,baseDelay:e.retry?.backoffMs??5e3});function x(e){let t=/[;|&$`><]/;if(e.command&&t.test(e.command))throw new Error(`[Directive MCP] Stdio command for server '${e.name}' contains shell metacharacters: '${e.command}'. This may indicate a command injection vulnerability. Use 'args' for command arguments instead.`);if(e.args){for(let r of e.args)if(t.test(r))throw new Error(`[Directive MCP] Stdio argument for server '${e.name}' contains shell metacharacters: '${r}'. This may indicate a command injection vulnerability.`)}}async function S(e){let t=n.servers.get(e);if(!t)throw new Error(`Unknown MCP server: ${e}`);if(t.status!=="connected"){t.config.transport==="stdio"&&x(t.config),t.status="connecting";try{let r=b(t.config);await r.connect(),t.client=r,t.status="connected";let o=w.get(e);o&&(o.attempts=0,o.timer&&(clearTimeout(o.timer),o.timer=null)),r.getCapabilities().tools&&(t.tools=await r.listTools()),r.getCapabilities().resources&&(t.resources=await r.listResources()),t.lastSync=Date.now(),s.onConnect?.(e);}catch(r){if(t.status="error",t.error=r instanceof Error?r:new Error(String(r)),s.onError?.(e,t.error),m){let o=w.get(e);if(o&&o.attempts<o.maxAttempts){o.attempts++;let l=Math.min(o.baseDelay*2**(o.attempts-1)+Math.random()*1e3,6e4);o.timer=setTimeout(()=>{o.timer=null,S(e).catch(()=>{});},l);}else o&&console.error(`[Directive MCP] Max reconnect attempts (${o.maxAttempts}) reached for server '${e}'. Call adapter.connectServer("${e}") to retry manually.`);}throw t.error}}}async function T(e){let t=w.get(e);t?.timer&&(clearTimeout(t.timer),t.timer=null,t.attempts=0);let r=n.servers.get(e);if(!(!r||!r.client))try{await r.client.disconnect();}finally{r.status="disconnected",r.client=null,s.onDisconnect?.(e);}}async function k(e,t,r,o){let l=n.servers.get(e);if(!l)throw new Error(`[Directive MCP] Unknown server '${e}'. Available servers: ${Array.from(n.servers.keys()).join(", ")||"(none)"}`);if(!l.client)throw new Error(`[Directive MCP] Server '${e}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${e}")' first.`);let f=`${e}.${t}`,u=n.toolConstraints.get(f);if(u){if(u.rateLimit){let p=n.rateLimiters.get(f);if(!_(n.rateLimiters,f,u.rateLimit)){let C=p?.resetTime?new Date(p.resetTime).toISOString():"unknown";throw new Error(`[Directive MCP] Rate limit exceeded for '${f}': ${p?.count??0}/${u.rateLimit} requests per minute. Resets at ${C}.`)}}if(u.maxArgSize){let p=JSON.stringify(r).length;if(p>u.maxArgSize)throw new Error(`Arguments exceed max size (${p} > ${u.maxArgSize})`)}if(u.when&&!await u.when(o,r))throw new Error(`Constraint not satisfied for ${f}`);if(u.requireApproval){let p=`approval-${++E}-${Date.now()}`,C={id:p,server:e,tool:t,args:r,requestedAt:Date.now()};n.pendingApprovals.set(p,C),s.onApprovalRequest?.(C),await D(p);}}s.onToolCall?.(e,t,r);let R=await Promise.race([l.client.callTool(t,r),new Promise((p,C)=>setTimeout(()=>C(new Error(`Tool call timeout: ${f}`)),u?.timeout??3e4))]);return s.onToolResult?.(e,t,R),R}let j={name:"mcp-adapter",onInit:async()=>{P&&await Promise.all(Array.from(n.servers.keys()).map(e=>S(e).catch(t=>console.error(`Failed to connect to ${e}:`,t))));},onDestroy:async()=>{for(let e of w.values())e.timer&&(clearTimeout(e.timer),e.timer=null);for(let[,e]of d)clearTimeout(e.timeoutId),e.reject(new Error("[Directive MCP] Adapter destroyed while awaiting approval"));d.clear(),await Promise.all(Array.from(n.servers.keys()).map(e=>T(e).catch(t=>console.error(`Failed to disconnect from ${e}:`,t))));}};async function L(e){for(let t of g)for(let[r,o]of n.servers)if(o.client){for(let l of o.resources)if(typeof t.pattern=="string"?U(l.uri,t.pattern):t.pattern.test(l.uri))try{let u=await o.client.readResource(l.uri),R=u.contents[0]?.text??"",p=t.transform?t.transform(R):R;e[t.factKey]=p,s.onResourceUpdate?.(r,l.uri,u);}catch(u){console.error(`Failed to sync resource ${l.uri}:`,u);}}}return {plugin:j,async connect(){await Promise.all(Array.from(n.servers.keys()).map(S));},connectServer:S,async disconnect(){await Promise.all(Array.from(n.servers.keys()).map(T));},disconnectServer:T,getTools(){let e=new Map;for(let[t,r]of n.servers)e.set(t,r.tools);return e},getResources(){let e=new Map;for(let[t,r]of n.servers)e.set(t,r.resources);return e},async callTool(e,t,r,o){return k(e,t,r,o)},async callToolDirect(e,t,r){if(!h)throw new Error("[Directive] callToolDirect is disabled by default. Pass { allowDirectCalls: true } to enable unconstrained tool calls.");process.env.NODE_ENV!=="production"&&console.warn("[Directive] callToolDirect bypasses all constraints (rate limits, approvals, timeouts).");let o=n.servers.get(e);if(!o)throw new Error(`[Directive MCP] Unknown server '${e}'. Available servers: ${Array.from(n.servers.keys()).join(", ")||"(none)"}`);if(!o.client)throw new Error(`[Directive MCP] Server '${e}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${e}")' first.`);s.onToolCall?.(e,t,r);let l=await o.client.callTool(t,r);return s.onToolResult?.(e,t,l),l},async readResource(e,t){let r=n.servers.get(e);if(!r)throw new Error(`[Directive MCP] Unknown server '${e}'. Available servers: ${Array.from(n.servers.keys()).join(", ")||"(none)"}`);if(!r.client)throw new Error(`[Directive MCP] Server '${e}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${e}")' first.`);let o=await r.client.readResource(t);return s.onResourceUpdate?.(e,t,o),o},syncResources:L,getServerStatus(e){return n.servers.get(e)},getAllServerStatuses(){return new Map(n.servers)},approve(e){if(!n.pendingApprovals.get(e)&&!d.has(e))throw new Error(`[Directive MCP] No pending approval request with ID '${e}'. Pending requests: ${Array.from(n.pendingApprovals.keys()).join(", ")||"(none)"}`);$(e,true);},reject(e,t){if(!n.pendingApprovals.get(e)&&!d.has(e))throw new Error(`[Directive MCP] No pending approval request with ID '${e}'. Pending requests: ${Array.from(n.pendingApprovals.keys()).join(", ")||"(none)"}`);$(e,false,t);},getPendingApprovals(){return Array.from(n.pendingApprovals.values())},getRejectionReason(e){return M.get(e)}}}var y=new Map,N=200;function U(i,a){let c=y.get(a);if(!c){let g=a.replace(/\*\*/g,"\0GLOBSTAR\0").replace(/\*/g,"\0STAR\0").replace(/\?/g,"\0QUESTION\0").replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\0GLOBSTAR\0/g,".*").replace(/\0STAR\0/g,"[^/]*").replace(/\0QUESTION\0/g,".");if(c=new RegExp(`^${g}$`),y.size>=N){let s=y.keys().next().value;s!==void 0&&y.delete(s);}y.set(a,c);}return c.test(i)}function G(i){let a=[];for(let[c,g]of i)for(let s of g)a.push({type:"function",function:{name:`${c}.${s.name}`,description:s.description??`Tool: ${s.name}`,parameters:s.inputSchema}});return a}function z(i,a,c){return {type:"MCP_CALL_TOOL",server:i,tool:a,args:c}}function B(i,a){return {type:"MCP_READ_RESOURCE",server:i,uri:a}}function K(i,a,c){return {type:"MCP_GET_PROMPT",server:i,prompt:a,args:c}}function W(i,a){return {type:"MCP_SYNC_RESOURCES",server:i,pattern:a}}export{F as a,G as b,z as c,B as d,K as e,W as f};//# sourceMappingURL=chunk-NNAQ4ZH2.js.map
11
- //# sourceMappingURL=chunk-NNAQ4ZH2.js.map
10
+ });`):v&&console.debug("[Directive MCP] Using stub client for development. Provide 'clientFactory' for production use."));let b=i.clientFactory??(e=>O(e,v)),A=i.approvalTimeoutMs??3e5,n={servers:new Map,toolConstraints:new Map(Object.entries(c)),rateLimiters:new Map,pendingApprovals:new Map,approvedRequests:new Set,rejectedRequests:new Set},E=0,d=new Map,M=new Map;function D(e){return new Promise((t,r)=>{if(n.approvedRequests.has(e)){n.approvedRequests.delete(e),n.pendingApprovals.delete(e),s.onApprovalResolved?.(e,true),t();return}if(n.rejectedRequests.has(e)){n.rejectedRequests.delete(e),n.pendingApprovals.delete(e);let l=M.get(e);M.delete(e),s.onApprovalResolved?.(e,false),r(new Error(`[Directive MCP] Tool call request ${e} was rejected${l?`: ${l}`:""}`));return}let o=setTimeout(()=>{d.delete(e),n.pendingApprovals.delete(e),r(new Error(`[Directive MCP] Approval timeout: Request ${e} was not approved or rejected within ${A}ms. Call adapter.approve("${e}") or adapter.reject("${e}") to resolve.`));},A);d.set(e,{resolve:t,reject:r,timeoutId:o});})}function $(e,t,r){let o=d.get(e);o?(clearTimeout(o.timeoutId),d.delete(e),n.pendingApprovals.delete(e),s.onApprovalResolved?.(e,t),t?o.resolve():o.reject(new Error(`[Directive MCP] Tool call request ${e} was rejected${r?`: ${r}`:""}`))):(t?n.approvedRequests.add(e):(n.rejectedRequests.add(e),r&&M.set(e,r)),setTimeout(()=>{n.approvedRequests.delete(e),n.rejectedRequests.delete(e),M.delete(e),n.pendingApprovals.delete(e);},A));}let w=new Map;for(let e of a)n.servers.set(e.name,{config:e,client:null,tools:[],resources:[],status:"disconnected"}),w.set(e.name,{timer:null,attempts:0,maxAttempts:e.retry?.maxAttempts??10,baseDelay:e.retry?.backoffMs??5e3});function x(e){let t=/[;|&$`><]/;if(e.command&&t.test(e.command))throw new Error(`[Directive MCP] Stdio command for server '${e.name}' contains shell metacharacters: '${e.command}'. This may indicate a command injection vulnerability. Use 'args' for command arguments instead.`);if(e.args){for(let r of e.args)if(t.test(r))throw new Error(`[Directive MCP] Stdio argument for server '${e.name}' contains shell metacharacters: '${r}'. This may indicate a command injection vulnerability.`)}}async function S(e){let t=n.servers.get(e);if(!t)throw new Error(`Unknown MCP server: ${e}`);if(t.status!=="connected"){t.config.transport==="stdio"&&x(t.config),t.status="connecting";try{let r=b(t.config);await r.connect(),t.client=r,t.status="connected";let o=w.get(e);o&&(o.attempts=0,o.timer&&(clearTimeout(o.timer),o.timer=null)),r.getCapabilities().tools&&(t.tools=await r.listTools()),r.getCapabilities().resources&&(t.resources=await r.listResources()),t.lastSync=Date.now(),s.onConnect?.(e);}catch(r){if(t.status="error",t.error=r instanceof Error?r:new Error(String(r)),s.onError?.(e,t.error),m){let o=w.get(e);if(o&&o.attempts<o.maxAttempts){o.attempts++;let l=Math.min(o.baseDelay*2**(o.attempts-1)+Math.random()*1e3,6e4);o.timer=setTimeout(()=>{o.timer=null,S(e).catch(()=>{});},l);}else o&&console.error(`[Directive MCP] Max reconnect attempts (${o.maxAttempts}) reached for server '${e}'. Call adapter.connectServer("${e}") to retry manually.`);}throw t.error}}}async function T(e){let t=w.get(e);t?.timer&&(clearTimeout(t.timer),t.timer=null,t.attempts=0);let r=n.servers.get(e);if(!(!r||!r.client))try{await r.client.disconnect();}finally{r.status="disconnected",r.client=null,s.onDisconnect?.(e);}}async function k(e,t,r,o){let l=n.servers.get(e);if(!l)throw new Error(`[Directive MCP] Unknown server '${e}'. Available servers: ${Array.from(n.servers.keys()).join(", ")||"(none)"}`);if(!l.client)throw new Error(`[Directive MCP] Server '${e}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${e}")' first.`);let f=`${e}.${t}`,u=n.toolConstraints.get(f);if(u){if(u.rateLimit){let p=n.rateLimiters.get(f);if(!_(n.rateLimiters,f,u.rateLimit)){let C=p?.resetTime?new Date(p.resetTime).toISOString():"unknown";throw new Error(`[Directive MCP] Rate limit exceeded for '${f}': ${p?.count??0}/${u.rateLimit} requests per minute. Resets at ${C}.`)}}if(u.maxArgSize){let p=JSON.stringify(r).length;if(p>u.maxArgSize)throw new Error(`Arguments exceed max size (${p} > ${u.maxArgSize})`)}if(u.when&&!await u.when(o,r))throw new Error(`Constraint not satisfied for ${f}`);if(u.requireApproval){let p=`approval-${++E}-${Date.now()}`,C={id:p,server:e,tool:t,args:r,requestedAt:Date.now()};n.pendingApprovals.set(p,C),s.onApprovalRequest?.(C),await D(p);}}s.onToolCall?.(e,t,r);let R=await Promise.race([l.client.callTool(t,r),new Promise((p,C)=>setTimeout(()=>C(new Error(`Tool call timeout: ${f}`)),u?.timeout??3e4))]);return s.onToolResult?.(e,t,R),R}let j={name:"mcp-adapter",onInit:async()=>{P&&await Promise.all(Array.from(n.servers.keys()).map(e=>S(e).catch(t=>console.error(`Failed to connect to ${e}:`,t))));},onDestroy:async()=>{for(let e of w.values())e.timer&&(clearTimeout(e.timer),e.timer=null);for(let[,e]of d)clearTimeout(e.timeoutId),e.reject(new Error("[Directive MCP] Adapter destroyed while awaiting approval"));d.clear(),await Promise.all(Array.from(n.servers.keys()).map(e=>T(e).catch(t=>console.error(`Failed to disconnect from ${e}:`,t))));}};async function L(e){for(let t of g)for(let[r,o]of n.servers)if(o.client){for(let l of o.resources)if(typeof t.pattern=="string"?U(l.uri,t.pattern):t.pattern.test(l.uri))try{let u=await o.client.readResource(l.uri),R=u.contents[0]?.text??"",p=t.transform?t.transform(R):R;e[t.factKey]=p,s.onResourceUpdate?.(r,l.uri,u);}catch(u){console.error(`Failed to sync resource ${l.uri}:`,u);}}}return {plugin:j,async connect(){await Promise.all(Array.from(n.servers.keys()).map(S));},connectServer:S,async disconnect(){await Promise.all(Array.from(n.servers.keys()).map(T));},disconnectServer:T,getTools(){let e=new Map;for(let[t,r]of n.servers)e.set(t,r.tools);return e},getResources(){let e=new Map;for(let[t,r]of n.servers)e.set(t,r.resources);return e},async callTool(e,t,r,o){return k(e,t,r,o)},async callToolDirect(e,t,r){if(!h)throw new Error("[Directive] callToolDirect is disabled by default. Pass { allowDirectCalls: true } to enable unconstrained tool calls.");process.env.NODE_ENV!=="production"&&console.warn("[Directive] callToolDirect bypasses all constraints (rate limits, approvals, timeouts).");let o=n.servers.get(e);if(!o)throw new Error(`[Directive MCP] Unknown server '${e}'. Available servers: ${Array.from(n.servers.keys()).join(", ")||"(none)"}`);if(!o.client)throw new Error(`[Directive MCP] Server '${e}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${e}")' first.`);s.onToolCall?.(e,t,r);let l=await o.client.callTool(t,r);return s.onToolResult?.(e,t,l),l},async readResource(e,t){let r=n.servers.get(e);if(!r)throw new Error(`[Directive MCP] Unknown server '${e}'. Available servers: ${Array.from(n.servers.keys()).join(", ")||"(none)"}`);if(!r.client)throw new Error(`[Directive MCP] Server '${e}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${e}")' first.`);let o=await r.client.readResource(t);return s.onResourceUpdate?.(e,t,o),o},syncResources:L,getServerStatus(e){return n.servers.get(e)},getAllServerStatuses(){return new Map(n.servers)},approve(e){if(!n.pendingApprovals.get(e)&&!d.has(e))throw new Error(`[Directive MCP] No pending approval request with ID '${e}'. Pending requests: ${Array.from(n.pendingApprovals.keys()).join(", ")||"(none)"}`);$(e,true);},reject(e,t){if(!n.pendingApprovals.get(e)&&!d.has(e))throw new Error(`[Directive MCP] No pending approval request with ID '${e}'. Pending requests: ${Array.from(n.pendingApprovals.keys()).join(", ")||"(none)"}`);$(e,false,t);},getPendingApprovals(){return Array.from(n.pendingApprovals.values())},getRejectionReason(e){return M.get(e)}}}var y=new Map,N=200;function U(i,a){let c=y.get(a);if(!c){let g=a.replace(/\*\*/g,"\0GLOBSTAR\0").replace(/\*/g,"\0STAR\0").replace(/\?/g,"\0QUESTION\0").replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\0GLOBSTAR\0/g,".*").replace(/\0STAR\0/g,"[^/]*").replace(/\0QUESTION\0/g,".");if(c=new RegExp(`^${g}$`),y.size>=N){let s=y.keys().next().value;s!==void 0&&y.delete(s);}y.set(a,c);}return c.test(i)}function G(i){let a=[];for(let[c,g]of i)for(let s of g)a.push({type:"function",function:{name:`${c}.${s.name}`,description:s.description??`Tool: ${s.name}`,parameters:s.inputSchema}});return a}function z(i,a,c){return {type:"MCP_CALL_TOOL",server:i,tool:a,args:c}}function B(i,a){return {type:"MCP_READ_RESOURCE",server:i,uri:a}}function K(i,a,c){return {type:"MCP_GET_PROMPT",server:i,prompt:a,args:c}}function W(i,a){return {type:"MCP_SYNC_RESOURCES",server:i,pattern:a}}export{F as a,G as b,z as c,B as d,K as e,W as f};//# sourceMappingURL=chunk-V2FCPNPP.js.map
11
+ //# sourceMappingURL=chunk-V2FCPNPP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcp.ts"],"names":["createStubClient","config","debug","connected","tools","resources","log","msg","args","name","uri","checkRateLimit","rateLimiters","key","limit","now","limiter","createMCPAdapter","servers","toolConstraints","resourceMappings","events","autoConnect","autoReconnect","allowDirectCalls","clientFactory","serverConfig","approvalTimeoutMs","state","approvalCounter","approvalWaiters","rejectionReasons","waitForApproval","requestId","resolve","reject","reason","timeoutId","resolveApproval","approved","waiter","reconnectState","validateStdioCommand","shellMetachars","arg","connectServer","serverState","client","rState","error","delay","disconnectServer","callToolWithConstraints","server","tool","facts","constraintKey","constraint","resetAt","argSize","approvalRequest","result","_","plugin","e","syncResources","mapping","serverName","resource","matchGlob","content","value","globCache","MAX_GLOB_CACHE_SIZE","str","pattern","regex","regexPattern","firstKey","convertToolsForLLM","serverTools","mcpCallTool","mcpReadResource","mcpGetPrompt","prompt","mcpSyncResources"],"mappings":"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","file":"chunk-NNAQ4ZH2.js","sourcesContent":["/**\n * MCP Adapter - Model Context Protocol Integration for Directive\n *\n * Provides seamless integration between Directive's constraint system and MCP servers:\n * - MCP tools become Directive resolvers with constraint-driven access control\n * - MCP resources sync to Directive facts\n * - MCP prompts available through requirements\n *\n * @example\n * ```typescript\n * import { createMCPAdapter } from '@directive-run/ai';\n *\n * const mcpAdapter = createMCPAdapter({\n * servers: [\n * { name: 'filesystem', transport: 'stdio', command: 'mcp-server-filesystem' },\n * { name: 'github', transport: 'sse', url: 'https://mcp.github.com' }\n * ],\n * toolConstraints: {\n * 'filesystem.write': { requireApproval: true },\n * 'github.create_pr': { when: (facts) => facts.reviewComplete }\n * }\n * });\n *\n * const system = createSystem({\n * module: myModule,\n * plugins: [mcpAdapter.plugin]\n * });\n * ```\n */\n\nimport type { Plugin } from \"@directive-run/core\";\nimport type {\n MCPAdapterConfig,\n MCPApprovalRequest,\n MCPCallToolRequirement,\n MCPClient,\n MCPGetPromptRequirement,\n MCPReadResourceRequirement,\n MCPResource,\n MCPResourceMapping,\n MCPResourceResult,\n MCPServerConfig,\n MCPSyncResourcesRequirement,\n MCPTool,\n MCPToolConstraint,\n MCPToolResult,\n} from \"./mcp-types.js\";\n\n// ============================================================================\n// MCP Adapter State\n// ============================================================================\n\n/** State of an MCP server connection */\ninterface MCPServerState {\n config: MCPServerConfig;\n client: MCPClient | null;\n tools: MCPTool[];\n resources: MCPResource[];\n status: \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n error?: Error;\n lastSync?: number;\n}\n\n/** Internal state for the adapter */\ninterface MCPAdapterState {\n servers: Map<string, MCPServerState>;\n toolConstraints: Map<string, MCPToolConstraint>;\n resourceMappings: MCPResourceMapping[];\n rateLimiters: Map<string, { count: number; resetTime: number }>;\n /** Pending approval requests */\n pendingApprovals: Map<string, MCPApprovalRequest>;\n /** Approved request IDs */\n approvedRequests: Set<string>;\n /** Rejected request IDs */\n rejectedRequests: Set<string>;\n}\n\n// ============================================================================\n// MCP Adapter Instance\n// ============================================================================\n\n/** MCP Adapter instance */\nexport interface MCPAdapter {\n /** Plugin to add to Directive system */\n plugin: Plugin;\n /** Connect to all configured servers */\n connect(): Promise<void>;\n /** Connect to a specific server */\n connectServer(name: string): Promise<void>;\n /** Disconnect from all servers */\n disconnect(): Promise<void>;\n /** Disconnect from a specific server */\n disconnectServer(name: string): Promise<void>;\n /** Get all available tools across all servers */\n getTools(): Map<string, MCPTool[]>;\n /** Get all available resources across all servers */\n getResources(): Map<string, MCPResource[]>;\n /**\n * Call a tool with constraint checking (recommended).\n * Applies rate limits, argument size limits, approval workflow, and custom constraints.\n * @param server - Server name\n * @param tool - Tool name\n * @param args - Tool arguments\n * @param facts - Current facts for constraint evaluation\n */\n callTool(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n facts: Record<string, unknown>,\n ): Promise<MCPToolResult>;\n /**\n * Call a tool directly, bypassing all constraints (rate limits, approvals, etc.).\n * Use only for trusted internal calls where constraint checking is not needed.\n */\n callToolDirect(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n ): Promise<MCPToolResult>;\n /** Read a resource directly */\n readResource(server: string, uri: string): Promise<MCPResourceResult>;\n /** Sync resources to facts */\n syncResources(facts: Record<string, unknown>): Promise<void>;\n /** Get server status */\n getServerStatus(name: string): MCPServerState | undefined;\n /** Get all server statuses */\n getAllServerStatuses(): Map<string, MCPServerState>;\n /** Approve a pending tool call request */\n approve(requestId: string): void;\n /** Reject a pending tool call request */\n reject(requestId: string, reason?: string): void;\n /** Get pending approval requests */\n getPendingApprovals(): MCPApprovalRequest[];\n /** Get the rejection reason for a request (if available) */\n getRejectionReason(requestId: string): string | undefined;\n}\n\n// ============================================================================\n// Default MCP Client (Stub)\n// ============================================================================\n\n/**\n * Create a stub MCP client for development/testing.\n *\n * **Important:** This stub is for development only. In production, provide\n * a real MCP client via the `clientFactory` option:\n *\n * @example\n * ```typescript\n * import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\n *\n * const adapter = createMCPAdapter({\n * servers: [...],\n * clientFactory: (config) => new Client(config),\n * });\n * ```\n *\n * @param config - Server configuration\n * @param debug - Enable debug logging (default: false)\n */\nfunction createStubClient(config: MCPServerConfig, debug = false): MCPClient {\n let connected = false;\n const tools: MCPTool[] = [];\n const resources: MCPResource[] = [];\n\n const log = debug\n ? (msg: string, ...args: unknown[]) =>\n console.debug(`[MCP Stub] ${msg}`, ...args)\n : () => {};\n\n return {\n async connect() {\n log(`Connecting to ${config.name} (${config.transport})`);\n connected = true;\n },\n async disconnect() {\n connected = false;\n },\n isConnected() {\n return connected;\n },\n getCapabilities() {\n return { tools: true, resources: true, prompts: true };\n },\n async listTools() {\n return tools;\n },\n async callTool(name: string, args: Record<string, unknown>) {\n log(`Calling tool ${name}`, args);\n return {\n content: [{ type: \"text\" as const, text: `Stub result for ${name}` }],\n };\n },\n async listResources() {\n return resources;\n },\n async readResource(uri: string) {\n log(`Reading resource ${uri}`);\n return {\n contents: [{ uri, text: `Stub content for ${uri}` }],\n };\n },\n async listPrompts() {\n return [];\n },\n async getPrompt(name: string) {\n return {\n messages: [\n {\n role: \"user\" as const,\n content: { type: \"text\" as const, text: `Stub prompt ${name}` },\n },\n ],\n };\n },\n };\n}\n\n// ============================================================================\n// Rate Limiter\n// ============================================================================\n\nfunction checkRateLimit(\n rateLimiters: Map<string, { count: number; resetTime: number }>,\n key: string,\n limit: number,\n): boolean {\n const now = Date.now();\n const limiter = rateLimiters.get(key);\n\n if (!limiter || now > limiter.resetTime) {\n rateLimiters.set(key, { count: 1, resetTime: now + 60000 });\n return true;\n }\n\n if (limiter.count >= limit) {\n return false;\n }\n\n limiter.count++;\n return true;\n}\n\n// ============================================================================\n// MCP Adapter Factory\n// ============================================================================\n\n/**\n * Create an MCP adapter for Directive integration.\n *\n * @example\n * ```typescript\n * const adapter = createMCPAdapter({\n * servers: [\n * { name: 'fs', transport: 'stdio', command: 'mcp-server-filesystem' },\n * ],\n * toolConstraints: {\n * 'fs.write_file': {\n * requireApproval: true,\n * maxArgSize: 10000,\n * timeout: 30000,\n * },\n * },\n * resourceMappings: [\n * {\n * pattern: 'file://*.json',\n * factKey: 'jsonFiles',\n * mode: 'poll',\n * pollInterval: 5000,\n * },\n * ],\n * });\n *\n * // Add to system\n * const system = createSystem({\n * module: myModule,\n * plugins: [adapter.plugin],\n * });\n *\n * // Connect to servers\n * await adapter.connect();\n * ```\n */\nexport function createMCPAdapter(config: MCPAdapterConfig): MCPAdapter {\n const {\n servers,\n toolConstraints = {},\n resourceMappings = [],\n events = {},\n autoConnect = false,\n autoReconnect = true,\n debug = false,\n allowDirectCalls = false,\n } = config;\n\n // Warn if using stub client in production\n const usingStubClient = !config.clientFactory;\n if (usingStubClient) {\n const isProduction =\n typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\";\n if (isProduction) {\n console.warn(\n \"[Directive MCP] WARNING: Using stub MCP client in production!\\n\" +\n \"The stub client returns mock data and does not connect to real MCP servers.\\n\" +\n \"Provide a real 'clientFactory' option to connect to actual MCP servers:\\n\\n\" +\n \" import { Client } from '@modelcontextprotocol/sdk/client/index.js';\\n\\n\" +\n \" const adapter = createMCPAdapter({\\n\" +\n \" servers: [...],\\n\" +\n \" clientFactory: (config) => new Client(config),\\n\" +\n \" });\",\n );\n } else if (debug) {\n console.debug(\n \"[Directive MCP] Using stub client for development. \" +\n \"Provide 'clientFactory' for production use.\",\n );\n }\n }\n\n const clientFactory =\n config.clientFactory ??\n ((serverConfig: MCPServerConfig) => createStubClient(serverConfig, debug));\n const approvalTimeoutMs = config.approvalTimeoutMs ?? 300000;\n\n // Initialize state\n const state: MCPAdapterState = {\n servers: new Map(),\n toolConstraints: new Map(Object.entries(toolConstraints)),\n resourceMappings,\n rateLimiters: new Map(),\n pendingApprovals: new Map(),\n approvedRequests: new Set(),\n rejectedRequests: new Set(),\n };\n\n // Approval ID counter\n let approvalCounter = 0;\n\n // Promise-based approval waiting (no polling)\n const approvalWaiters = new Map<\n string,\n {\n resolve: () => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Rejection reasons storage\n const rejectionReasons = new Map<string, string>();\n\n // Wait for approval with timeout - Promise-based, no polling\n function waitForApproval(requestId: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if already resolved\n if (state.approvedRequests.has(requestId)) {\n state.approvedRequests.delete(requestId);\n state.pendingApprovals.delete(requestId);\n events.onApprovalResolved?.(requestId, true);\n resolve();\n return;\n }\n if (state.rejectedRequests.has(requestId)) {\n state.rejectedRequests.delete(requestId);\n state.pendingApprovals.delete(requestId);\n const reason = rejectionReasons.get(requestId);\n rejectionReasons.delete(requestId);\n events.onApprovalResolved?.(requestId, false);\n reject(\n new Error(\n `[Directive MCP] Tool call request ${requestId} was rejected${reason ? `: ${reason}` : \"\"}`,\n ),\n );\n return;\n }\n\n // Set up timeout\n const timeoutId = setTimeout(() => {\n approvalWaiters.delete(requestId);\n state.pendingApprovals.delete(requestId);\n reject(\n new Error(\n `[Directive MCP] Approval timeout: Request ${requestId} was not approved or rejected within ${approvalTimeoutMs}ms. ` +\n `Call adapter.approve(\"${requestId}\") or adapter.reject(\"${requestId}\") to resolve.`,\n ),\n );\n }, approvalTimeoutMs);\n\n // Store waiter for later resolution\n approvalWaiters.set(requestId, { resolve, reject, timeoutId });\n });\n }\n\n // Resolve an approval (called by approve/reject)\n function resolveApproval(\n requestId: string,\n approved: boolean,\n reason?: string,\n ): void {\n const waiter = approvalWaiters.get(requestId);\n if (waiter) {\n clearTimeout(waiter.timeoutId);\n approvalWaiters.delete(requestId);\n state.pendingApprovals.delete(requestId);\n events.onApprovalResolved?.(requestId, approved);\n\n if (approved) {\n waiter.resolve();\n } else {\n waiter.reject(\n new Error(\n `[Directive MCP] Tool call request ${requestId} was rejected${reason ? `: ${reason}` : \"\"}`,\n ),\n );\n }\n } else {\n // Waiter not yet created, store for immediate resolution with TTL cleanup\n if (approved) {\n state.approvedRequests.add(requestId);\n } else {\n state.rejectedRequests.add(requestId);\n if (reason) {\n rejectionReasons.set(requestId, reason);\n }\n }\n // Auto-cleanup pre-resolved state after approval timeout to prevent memory leaks\n setTimeout(() => {\n state.approvedRequests.delete(requestId);\n state.rejectedRequests.delete(requestId);\n rejectionReasons.delete(requestId);\n state.pendingApprovals.delete(requestId);\n }, approvalTimeoutMs);\n }\n }\n\n // Track reconnect state per server\n const reconnectState = new Map<\n string,\n {\n timer: ReturnType<typeof setTimeout> | null;\n attempts: number;\n maxAttempts: number;\n baseDelay: number;\n }\n >();\n\n // Initialize server states\n for (const serverConfig of servers) {\n state.servers.set(serverConfig.name, {\n config: serverConfig,\n client: null,\n tools: [],\n resources: [],\n status: \"disconnected\",\n });\n reconnectState.set(serverConfig.name, {\n timer: null,\n attempts: 0,\n maxAttempts: serverConfig.retry?.maxAttempts ?? 10,\n baseDelay: serverConfig.retry?.backoffMs ?? 5000,\n });\n }\n\n // Validate stdio command to prevent shell injection\n function validateStdioCommand(serverConfig: MCPServerConfig): void {\n const shellMetachars = /[;|&$`><]/;\n\n if (serverConfig.command) {\n if (shellMetachars.test(serverConfig.command)) {\n throw new Error(\n `[Directive MCP] Stdio command for server '${serverConfig.name}' contains shell metacharacters: '${serverConfig.command}'. ` +\n `This may indicate a command injection vulnerability. Use 'args' for command arguments instead.`,\n );\n }\n }\n\n if (serverConfig.args) {\n for (const arg of serverConfig.args) {\n if (shellMetachars.test(arg)) {\n throw new Error(\n `[Directive MCP] Stdio argument for server '${serverConfig.name}' contains shell metacharacters: '${arg}'. ` +\n `This may indicate a command injection vulnerability.`,\n );\n }\n }\n }\n }\n\n // Connect to a server\n async function connectServer(name: string): Promise<void> {\n const serverState = state.servers.get(name);\n if (!serverState) {\n throw new Error(`Unknown MCP server: ${name}`);\n }\n\n if (serverState.status === \"connected\") {\n return;\n }\n\n // Validate stdio commands before connecting\n if (serverState.config.transport === \"stdio\") {\n validateStdioCommand(serverState.config);\n }\n\n serverState.status = \"connecting\";\n\n try {\n const client = clientFactory(serverState.config);\n await client.connect();\n\n serverState.client = client;\n serverState.status = \"connected\";\n\n // Reset reconnect state on successful connection\n const rState = reconnectState.get(name);\n if (rState) {\n rState.attempts = 0;\n if (rState.timer) {\n clearTimeout(rState.timer);\n rState.timer = null;\n }\n }\n\n // Fetch available tools and resources\n if (client.getCapabilities().tools) {\n serverState.tools = await client.listTools();\n }\n if (client.getCapabilities().resources) {\n serverState.resources = await client.listResources();\n }\n\n serverState.lastSync = Date.now();\n events.onConnect?.(name);\n } catch (error) {\n serverState.status = \"error\";\n serverState.error =\n error instanceof Error ? error : new Error(String(error));\n events.onError?.(name, serverState.error);\n\n if (autoReconnect) {\n const rState = reconnectState.get(name);\n if (rState && rState.attempts < rState.maxAttempts) {\n rState.attempts++;\n // Exponential backoff with jitter, capped at 60s\n const delay = Math.min(\n rState.baseDelay * 2 ** (rState.attempts - 1) +\n Math.random() * 1000,\n 60000,\n );\n rState.timer = setTimeout(() => {\n rState.timer = null;\n connectServer(name).catch(() => {}); // Error handled in next iteration\n }, delay);\n } else if (rState) {\n console.error(\n `[Directive MCP] Max reconnect attempts (${rState.maxAttempts}) reached for server '${name}'. ` +\n `Call adapter.connectServer(\"${name}\") to retry manually.`,\n );\n }\n }\n\n throw serverState.error;\n }\n }\n\n // Disconnect from a server\n async function disconnectServer(name: string): Promise<void> {\n // Clear any pending reconnect timer\n const rState = reconnectState.get(name);\n if (rState?.timer) {\n clearTimeout(rState.timer);\n rState.timer = null;\n rState.attempts = 0;\n }\n\n const serverState = state.servers.get(name);\n if (!serverState || !serverState.client) {\n return;\n }\n\n try {\n await serverState.client.disconnect();\n } finally {\n serverState.status = \"disconnected\";\n serverState.client = null;\n events.onDisconnect?.(name);\n }\n }\n\n // Call a tool with constraint checking\n async function callToolWithConstraints(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n facts: Record<string, unknown>,\n ): Promise<MCPToolResult> {\n const serverState = state.servers.get(server);\n if (!serverState) {\n throw new Error(\n `[Directive MCP] Unknown server '${server}'. ` +\n `Available servers: ${Array.from(state.servers.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n if (!serverState.client) {\n throw new Error(\n `[Directive MCP] Server '${server}' is not connected. ` +\n `Call 'adapter.connect()' or 'adapter.connectServer(\"${server}\")' first.`,\n );\n }\n\n const constraintKey = `${server}.${tool}`;\n const constraint = state.toolConstraints.get(constraintKey);\n\n // Check constraints\n if (constraint) {\n // Check rate limit\n if (constraint.rateLimit) {\n const limiter = state.rateLimiters.get(constraintKey);\n if (\n !checkRateLimit(\n state.rateLimiters,\n constraintKey,\n constraint.rateLimit,\n )\n ) {\n const resetAt = limiter?.resetTime\n ? new Date(limiter.resetTime).toISOString()\n : \"unknown\";\n throw new Error(\n `[Directive MCP] Rate limit exceeded for '${constraintKey}': ` +\n `${limiter?.count ?? 0}/${constraint.rateLimit} requests per minute. ` +\n `Resets at ${resetAt}.`,\n );\n }\n }\n\n // Check max arg size\n if (constraint.maxArgSize) {\n const argSize = JSON.stringify(args).length;\n if (argSize > constraint.maxArgSize) {\n throw new Error(\n `Arguments exceed max size (${argSize} > ${constraint.maxArgSize})`,\n );\n }\n }\n\n // Check custom constraint\n if (constraint.when) {\n const allowed = await constraint.when(facts, args);\n if (!allowed) {\n throw new Error(`Constraint not satisfied for ${constraintKey}`);\n }\n }\n\n // Check if approval is required\n if (constraint.requireApproval) {\n const requestId = `approval-${++approvalCounter}-${Date.now()}`;\n const approvalRequest: MCPApprovalRequest = {\n id: requestId,\n server,\n tool,\n args,\n requestedAt: Date.now(),\n };\n\n state.pendingApprovals.set(requestId, approvalRequest);\n events.onApprovalRequest?.(approvalRequest);\n\n // Wait for approval or rejection\n await waitForApproval(requestId);\n }\n }\n\n events.onToolCall?.(server, tool, args);\n\n // Call the tool\n const result = await Promise.race([\n serverState.client.callTool(tool, args),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Tool call timeout: ${constraintKey}`)),\n constraint?.timeout ?? 30000,\n ),\n ),\n ]);\n\n events.onToolResult?.(server, tool, result);\n\n return result;\n }\n\n // Create plugin\n const plugin: Plugin = {\n name: \"mcp-adapter\",\n\n onInit: async () => {\n if (autoConnect) {\n await Promise.all(\n Array.from(state.servers.keys()).map((name) =>\n connectServer(name).catch((e) =>\n console.error(`Failed to connect to ${name}:`, e),\n ),\n ),\n );\n }\n },\n\n onDestroy: async () => {\n // Clear all reconnect timers\n for (const rState of reconnectState.values()) {\n if (rState.timer) {\n clearTimeout(rState.timer);\n rState.timer = null;\n }\n }\n\n // Reject all pending approval waiters\n for (const [, waiter] of approvalWaiters) {\n clearTimeout(waiter.timeoutId);\n waiter.reject(\n new Error(\n \"[Directive MCP] Adapter destroyed while awaiting approval\",\n ),\n );\n }\n approvalWaiters.clear();\n\n await Promise.all(\n Array.from(state.servers.keys()).map((name) =>\n disconnectServer(name).catch((e) =>\n console.error(`Failed to disconnect from ${name}:`, e),\n ),\n ),\n );\n },\n };\n\n // Sync resources to facts\n async function syncResources(facts: Record<string, unknown>): Promise<void> {\n for (const mapping of resourceMappings) {\n for (const [serverName, serverState] of state.servers) {\n if (!serverState.client) continue;\n\n for (const resource of serverState.resources) {\n // Check if resource matches pattern\n const matches =\n typeof mapping.pattern === \"string\"\n ? matchGlob(resource.uri, mapping.pattern)\n : mapping.pattern.test(resource.uri);\n\n if (matches) {\n try {\n const result = await serverState.client.readResource(\n resource.uri,\n );\n const content = result.contents[0]?.text ?? \"\";\n const value = mapping.transform\n ? mapping.transform(content)\n : content;\n\n facts[mapping.factKey] = value;\n events.onResourceUpdate?.(serverName, resource.uri, result);\n } catch (error) {\n console.error(`Failed to sync resource ${resource.uri}:`, error);\n }\n }\n }\n }\n }\n }\n\n return {\n plugin,\n\n async connect() {\n await Promise.all(Array.from(state.servers.keys()).map(connectServer));\n },\n\n connectServer,\n\n async disconnect() {\n await Promise.all(Array.from(state.servers.keys()).map(disconnectServer));\n },\n\n disconnectServer,\n\n getTools() {\n const tools = new Map<string, MCPTool[]>();\n for (const [name, serverState] of state.servers) {\n tools.set(name, serverState.tools);\n }\n return tools;\n },\n\n getResources() {\n const resources = new Map<string, MCPResource[]>();\n for (const [name, serverState] of state.servers) {\n resources.set(name, serverState.resources);\n }\n return resources;\n },\n\n async callTool(server, tool, args, facts) {\n return callToolWithConstraints(server, tool, args, facts);\n },\n\n async callToolDirect(server, tool, args) {\n if (!allowDirectCalls) {\n throw new Error(\n \"[Directive] callToolDirect is disabled by default. Pass { allowDirectCalls: true } to enable unconstrained tool calls.\",\n );\n }\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Directive] callToolDirect bypasses all constraints (rate limits, approvals, timeouts).\",\n );\n }\n const serverState = state.servers.get(server);\n if (!serverState) {\n throw new Error(\n `[Directive MCP] Unknown server '${server}'. ` +\n `Available servers: ${Array.from(state.servers.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n if (!serverState.client) {\n throw new Error(\n `[Directive MCP] Server '${server}' is not connected. ` +\n `Call 'adapter.connect()' or 'adapter.connectServer(\"${server}\")' first.`,\n );\n }\n events.onToolCall?.(server, tool, args);\n const result = await serverState.client.callTool(tool, args);\n events.onToolResult?.(server, tool, result);\n return result;\n },\n\n async readResource(server, uri) {\n const serverState = state.servers.get(server);\n if (!serverState) {\n throw new Error(\n `[Directive MCP] Unknown server '${server}'. ` +\n `Available servers: ${Array.from(state.servers.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n if (!serverState.client) {\n throw new Error(\n `[Directive MCP] Server '${server}' is not connected. ` +\n `Call 'adapter.connect()' or 'adapter.connectServer(\"${server}\")' first.`,\n );\n }\n const result = await serverState.client.readResource(uri);\n events.onResourceUpdate?.(server, uri, result);\n return result;\n },\n\n syncResources,\n\n getServerStatus(name) {\n return state.servers.get(name);\n },\n\n getAllServerStatuses() {\n return new Map(state.servers);\n },\n\n approve(requestId: string) {\n const request = state.pendingApprovals.get(requestId);\n if (!request && !approvalWaiters.has(requestId)) {\n throw new Error(\n `[Directive MCP] No pending approval request with ID '${requestId}'. ` +\n `Pending requests: ${Array.from(state.pendingApprovals.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n resolveApproval(requestId, true);\n },\n\n reject(requestId: string, reason?: string) {\n const request = state.pendingApprovals.get(requestId);\n if (!request && !approvalWaiters.has(requestId)) {\n throw new Error(\n `[Directive MCP] No pending approval request with ID '${requestId}'. ` +\n `Pending requests: ${Array.from(state.pendingApprovals.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n resolveApproval(requestId, false, reason);\n },\n\n getPendingApprovals() {\n return Array.from(state.pendingApprovals.values());\n },\n\n getRejectionReason(requestId: string): string | undefined {\n return rejectionReasons.get(requestId);\n },\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/** Cache for compiled glob patterns to avoid repeated regex compilation */\nconst globCache = new Map<string, RegExp>();\nconst MAX_GLOB_CACHE_SIZE = 200;\n\n/** Simple glob matching (supports * and **) with caching */\nfunction matchGlob(str: string, pattern: string): boolean {\n let regex = globCache.get(pattern);\n if (!regex) {\n // Escape all regex metacharacters first, then convert glob wildcards\n const regexPattern = pattern\n .replace(/\\*\\*/g, \"\\0GLOBSTAR\\0\")\n .replace(/\\*/g, \"\\0STAR\\0\")\n .replace(/\\?/g, \"\\0QUESTION\\0\")\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\0GLOBSTAR\\0/g, \".*\")\n .replace(/\\0STAR\\0/g, \"[^/]*\")\n .replace(/\\0QUESTION\\0/g, \".\");\n regex = new RegExp(`^${regexPattern}$`);\n\n // LRU eviction: delete oldest entry when cache is full\n if (globCache.size >= MAX_GLOB_CACHE_SIZE) {\n const firstKey = globCache.keys().next().value;\n if (firstKey !== undefined) globCache.delete(firstKey);\n }\n globCache.set(pattern, regex);\n }\n return regex.test(str);\n}\n\n/**\n * Convert MCP tools to a format suitable for LLM tool calling.\n *\n * @example\n * ```typescript\n * const adapter = createMCPAdapter({ servers: [...] });\n * await adapter.connect();\n *\n * const tools = adapter.getTools();\n * const llmTools = convertToolsForLLM(tools);\n * // Use with OpenAI/Anthropic/etc.\n * ```\n */\nexport function convertToolsForLLM(tools: Map<string, MCPTool[]>): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}> {\n const result: Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n }> = [];\n\n for (const [server, serverTools] of tools) {\n for (const tool of serverTools) {\n result.push({\n type: \"function\",\n function: {\n name: `${server}.${tool.name}`,\n description: tool.description ?? `Tool: ${tool.name}`,\n parameters: tool.inputSchema,\n },\n });\n }\n }\n\n return result;\n}\n\n/**\n * Create a requirement to call an MCP tool.\n *\n * @example\n * ```typescript\n * const req = mcpCallTool('filesystem', 'read_file', { path: '/etc/hosts' });\n * // { type: 'MCP_CALL_TOOL', server: 'filesystem', tool: 'read_file', args: { path: '/etc/hosts' } }\n * ```\n */\nexport function mcpCallTool(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n): MCPCallToolRequirement {\n return { type: \"MCP_CALL_TOOL\", server, tool, args };\n}\n\n/**\n * Create a requirement to read an MCP resource.\n */\nexport function mcpReadResource(\n server: string,\n uri: string,\n): MCPReadResourceRequirement {\n return { type: \"MCP_READ_RESOURCE\", server, uri };\n}\n\n/**\n * Create a requirement to get an MCP prompt.\n */\nexport function mcpGetPrompt(\n server: string,\n prompt: string,\n args?: Record<string, string>,\n): MCPGetPromptRequirement {\n return { type: \"MCP_GET_PROMPT\", server, prompt, args };\n}\n\n/**\n * Create a requirement to sync MCP resources.\n */\nexport function mcpSyncResources(\n server?: string,\n pattern?: string | RegExp,\n): MCPSyncResourcesRequirement {\n return { type: \"MCP_SYNC_RESOURCES\", server, pattern };\n}\n\n// Re-export types\nexport * from \"./mcp-types.js\";\n"]}
1
+ {"version":3,"sources":["../src/mcp.ts"],"names":["createStubClient","config","debug","connected","tools","resources","log","msg","args","name","uri","checkRateLimit","rateLimiters","key","limit","now","limiter","createMCPAdapter","servers","toolConstraints","resourceMappings","events","autoConnect","autoReconnect","allowDirectCalls","clientFactory","serverConfig","approvalTimeoutMs","state","approvalCounter","approvalWaiters","rejectionReasons","waitForApproval","requestId","resolve","reject","reason","timeoutId","resolveApproval","approved","waiter","reconnectState","validateStdioCommand","shellMetachars","arg","connectServer","serverState","client","rState","error","delay","disconnectServer","callToolWithConstraints","server","tool","facts","constraintKey","constraint","resetAt","argSize","approvalRequest","result","_","plugin","e","syncResources","mapping","serverName","resource","matchGlob","content","value","globCache","MAX_GLOB_CACHE_SIZE","str","pattern","regex","regexPattern","firstKey","convertToolsForLLM","serverTools","mcpCallTool","mcpReadResource","mcpGetPrompt","prompt","mcpSyncResources"],"mappings":"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","file":"chunk-V2FCPNPP.js","sourcesContent":["/**\n * MCP Adapter - Model Context Protocol Integration for Directive\n *\n * Provides seamless integration between Directive's constraint system and MCP servers:\n * - MCP tools become Directive resolvers with constraint-driven access control\n * - MCP resources sync to Directive facts\n * - MCP prompts available through requirements\n *\n * @example\n * ```typescript\n * import { createMCPAdapter } from '@directive-run/ai';\n *\n * const mcpAdapter = createMCPAdapter({\n * servers: [\n * { name: 'filesystem', transport: 'stdio', command: 'mcp-server-filesystem' },\n * { name: 'github', transport: 'sse', url: 'https://mcp.github.com' }\n * ],\n * toolConstraints: {\n * 'filesystem.write': { requireApproval: true },\n * 'github.create_pr': { when: (facts) => facts.reviewComplete }\n * }\n * });\n *\n * const system = createSystem({\n * module: myModule,\n * plugins: [mcpAdapter.plugin]\n * });\n * ```\n */\n\nimport type { Plugin } from \"@directive-run/core\";\nimport type {\n MCPAdapterConfig,\n MCPApprovalRequest,\n MCPCallToolRequirement,\n MCPClient,\n MCPGetPromptRequirement,\n MCPReadResourceRequirement,\n MCPResource,\n MCPResourceMapping,\n MCPResourceResult,\n MCPServerConfig,\n MCPSyncResourcesRequirement,\n MCPTool,\n MCPToolConstraint,\n MCPToolResult,\n} from \"./mcp-types.js\";\n\n// ============================================================================\n// MCP Adapter State\n// ============================================================================\n\n/** State of an MCP server connection */\ninterface MCPServerState {\n config: MCPServerConfig;\n client: MCPClient | null;\n tools: MCPTool[];\n resources: MCPResource[];\n status: \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n error?: Error;\n lastSync?: number;\n}\n\n/** Internal state for the adapter */\ninterface MCPAdapterState {\n servers: Map<string, MCPServerState>;\n toolConstraints: Map<string, MCPToolConstraint>;\n resourceMappings: MCPResourceMapping[];\n rateLimiters: Map<string, { count: number; resetTime: number }>;\n /** Pending approval requests */\n pendingApprovals: Map<string, MCPApprovalRequest>;\n /** Approved request IDs */\n approvedRequests: Set<string>;\n /** Rejected request IDs */\n rejectedRequests: Set<string>;\n}\n\n// ============================================================================\n// MCP Adapter Instance\n// ============================================================================\n\n/** MCP Adapter instance */\nexport interface MCPAdapter {\n /** Plugin to add to Directive system */\n plugin: Plugin;\n /** Connect to all configured servers */\n connect(): Promise<void>;\n /** Connect to a specific server */\n connectServer(name: string): Promise<void>;\n /** Disconnect from all servers */\n disconnect(): Promise<void>;\n /** Disconnect from a specific server */\n disconnectServer(name: string): Promise<void>;\n /** Get all available tools across all servers */\n getTools(): Map<string, MCPTool[]>;\n /** Get all available resources across all servers */\n getResources(): Map<string, MCPResource[]>;\n /**\n * Call a tool with constraint checking (recommended).\n * Applies rate limits, argument size limits, approval workflow, and custom constraints.\n * @param server - Server name\n * @param tool - Tool name\n * @param args - Tool arguments\n * @param facts - Current facts for constraint evaluation\n */\n callTool(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n facts: Record<string, unknown>,\n ): Promise<MCPToolResult>;\n /**\n * Call a tool directly, bypassing all constraints (rate limits, approvals, etc.).\n * Use only for trusted internal calls where constraint checking is not needed.\n */\n callToolDirect(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n ): Promise<MCPToolResult>;\n /** Read a resource directly */\n readResource(server: string, uri: string): Promise<MCPResourceResult>;\n /** Sync resources to facts */\n syncResources(facts: Record<string, unknown>): Promise<void>;\n /** Get server status */\n getServerStatus(name: string): MCPServerState | undefined;\n /** Get all server statuses */\n getAllServerStatuses(): Map<string, MCPServerState>;\n /** Approve a pending tool call request */\n approve(requestId: string): void;\n /** Reject a pending tool call request */\n reject(requestId: string, reason?: string): void;\n /** Get pending approval requests */\n getPendingApprovals(): MCPApprovalRequest[];\n /** Get the rejection reason for a request (if available) */\n getRejectionReason(requestId: string): string | undefined;\n}\n\n// ============================================================================\n// Default MCP Client (Stub)\n// ============================================================================\n\n/**\n * Create a stub MCP client for development/testing.\n *\n * **Important:** This stub is for development only. In production, provide\n * a real MCP client via the `clientFactory` option:\n *\n * @example\n * ```typescript\n * import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\n *\n * const adapter = createMCPAdapter({\n * servers: [...],\n * clientFactory: (config) => new Client(config),\n * });\n * ```\n *\n * @param config - Server configuration\n * @param debug - Enable debug logging (default: false)\n */\nfunction createStubClient(config: MCPServerConfig, debug = false): MCPClient {\n let connected = false;\n const tools: MCPTool[] = [];\n const resources: MCPResource[] = [];\n\n const log = debug\n ? (msg: string, ...args: unknown[]) =>\n console.debug(`[MCP Stub] ${msg}`, ...args)\n : () => {};\n\n return {\n async connect() {\n log(`Connecting to ${config.name} (${config.transport})`);\n connected = true;\n },\n async disconnect() {\n connected = false;\n },\n isConnected() {\n return connected;\n },\n getCapabilities() {\n return { tools: true, resources: true, prompts: true };\n },\n async listTools() {\n return tools;\n },\n async callTool(name: string, args: Record<string, unknown>) {\n log(`Calling tool ${name}`, args);\n return {\n content: [{ type: \"text\" as const, text: `Stub result for ${name}` }],\n };\n },\n async listResources() {\n return resources;\n },\n async readResource(uri: string) {\n log(`Reading resource ${uri}`);\n return {\n contents: [{ uri, text: `Stub content for ${uri}` }],\n };\n },\n async listPrompts() {\n return [];\n },\n async getPrompt(name: string) {\n return {\n messages: [\n {\n role: \"user\" as const,\n content: { type: \"text\" as const, text: `Stub prompt ${name}` },\n },\n ],\n };\n },\n };\n}\n\n// ============================================================================\n// Rate Limiter\n// ============================================================================\n\nfunction checkRateLimit(\n rateLimiters: Map<string, { count: number; resetTime: number }>,\n key: string,\n limit: number,\n): boolean {\n const now = Date.now();\n const limiter = rateLimiters.get(key);\n\n if (!limiter || now > limiter.resetTime) {\n rateLimiters.set(key, { count: 1, resetTime: now + 60000 });\n return true;\n }\n\n if (limiter.count >= limit) {\n return false;\n }\n\n limiter.count++;\n return true;\n}\n\n// ============================================================================\n// MCP Adapter Factory\n// ============================================================================\n\n/**\n * Create an MCP adapter for Directive integration.\n *\n * @example\n * ```typescript\n * const adapter = createMCPAdapter({\n * servers: [\n * { name: 'fs', transport: 'stdio', command: 'mcp-server-filesystem' },\n * ],\n * toolConstraints: {\n * 'fs.write_file': {\n * requireApproval: true,\n * maxArgSize: 10000,\n * timeout: 30000,\n * },\n * },\n * resourceMappings: [\n * {\n * pattern: 'file://*.json',\n * factKey: 'jsonFiles',\n * mode: 'poll',\n * pollInterval: 5000,\n * },\n * ],\n * });\n *\n * // Add to system\n * const system = createSystem({\n * module: myModule,\n * plugins: [adapter.plugin],\n * });\n *\n * // Connect to servers\n * await adapter.connect();\n * ```\n */\nexport function createMCPAdapter(config: MCPAdapterConfig): MCPAdapter {\n const {\n servers,\n toolConstraints = {},\n resourceMappings = [],\n events = {},\n autoConnect = false,\n autoReconnect = true,\n debug = false,\n allowDirectCalls = false,\n } = config;\n\n // Warn if using stub client in production\n const usingStubClient = !config.clientFactory;\n if (usingStubClient) {\n const isProduction =\n typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\";\n if (isProduction) {\n console.warn(\n \"[Directive MCP] WARNING: Using stub MCP client in production!\\n\" +\n \"The stub client returns mock data and does not connect to real MCP servers.\\n\" +\n \"Provide a real 'clientFactory' option to connect to actual MCP servers:\\n\\n\" +\n \" import { Client } from '@modelcontextprotocol/sdk/client/index.js';\\n\\n\" +\n \" const adapter = createMCPAdapter({\\n\" +\n \" servers: [...],\\n\" +\n \" clientFactory: (config) => new Client(config),\\n\" +\n \" });\",\n );\n } else if (debug) {\n console.debug(\n \"[Directive MCP] Using stub client for development. \" +\n \"Provide 'clientFactory' for production use.\",\n );\n }\n }\n\n const clientFactory =\n config.clientFactory ??\n ((serverConfig: MCPServerConfig) => createStubClient(serverConfig, debug));\n const approvalTimeoutMs = config.approvalTimeoutMs ?? 300000;\n\n // Initialize state\n const state: MCPAdapterState = {\n servers: new Map(),\n toolConstraints: new Map(Object.entries(toolConstraints)),\n resourceMappings,\n rateLimiters: new Map(),\n pendingApprovals: new Map(),\n approvedRequests: new Set(),\n rejectedRequests: new Set(),\n };\n\n // Approval ID counter\n let approvalCounter = 0;\n\n // Promise-based approval waiting (no polling)\n const approvalWaiters = new Map<\n string,\n {\n resolve: () => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Rejection reasons storage\n const rejectionReasons = new Map<string, string>();\n\n // Wait for approval with timeout - Promise-based, no polling\n function waitForApproval(requestId: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if already resolved\n if (state.approvedRequests.has(requestId)) {\n state.approvedRequests.delete(requestId);\n state.pendingApprovals.delete(requestId);\n events.onApprovalResolved?.(requestId, true);\n resolve();\n return;\n }\n if (state.rejectedRequests.has(requestId)) {\n state.rejectedRequests.delete(requestId);\n state.pendingApprovals.delete(requestId);\n const reason = rejectionReasons.get(requestId);\n rejectionReasons.delete(requestId);\n events.onApprovalResolved?.(requestId, false);\n reject(\n new Error(\n `[Directive MCP] Tool call request ${requestId} was rejected${reason ? `: ${reason}` : \"\"}`,\n ),\n );\n return;\n }\n\n // Set up timeout\n const timeoutId = setTimeout(() => {\n approvalWaiters.delete(requestId);\n state.pendingApprovals.delete(requestId);\n reject(\n new Error(\n `[Directive MCP] Approval timeout: Request ${requestId} was not approved or rejected within ${approvalTimeoutMs}ms. ` +\n `Call adapter.approve(\"${requestId}\") or adapter.reject(\"${requestId}\") to resolve.`,\n ),\n );\n }, approvalTimeoutMs);\n\n // Store waiter for later resolution\n approvalWaiters.set(requestId, { resolve, reject, timeoutId });\n });\n }\n\n // Resolve an approval (called by approve/reject)\n function resolveApproval(\n requestId: string,\n approved: boolean,\n reason?: string,\n ): void {\n const waiter = approvalWaiters.get(requestId);\n if (waiter) {\n clearTimeout(waiter.timeoutId);\n approvalWaiters.delete(requestId);\n state.pendingApprovals.delete(requestId);\n events.onApprovalResolved?.(requestId, approved);\n\n if (approved) {\n waiter.resolve();\n } else {\n waiter.reject(\n new Error(\n `[Directive MCP] Tool call request ${requestId} was rejected${reason ? `: ${reason}` : \"\"}`,\n ),\n );\n }\n } else {\n // Waiter not yet created, store for immediate resolution with TTL cleanup\n if (approved) {\n state.approvedRequests.add(requestId);\n } else {\n state.rejectedRequests.add(requestId);\n if (reason) {\n rejectionReasons.set(requestId, reason);\n }\n }\n // Auto-cleanup pre-resolved state after approval timeout to prevent memory leaks\n setTimeout(() => {\n state.approvedRequests.delete(requestId);\n state.rejectedRequests.delete(requestId);\n rejectionReasons.delete(requestId);\n state.pendingApprovals.delete(requestId);\n }, approvalTimeoutMs);\n }\n }\n\n // Track reconnect state per server\n const reconnectState = new Map<\n string,\n {\n timer: ReturnType<typeof setTimeout> | null;\n attempts: number;\n maxAttempts: number;\n baseDelay: number;\n }\n >();\n\n // Initialize server states\n for (const serverConfig of servers) {\n state.servers.set(serverConfig.name, {\n config: serverConfig,\n client: null,\n tools: [],\n resources: [],\n status: \"disconnected\",\n });\n reconnectState.set(serverConfig.name, {\n timer: null,\n attempts: 0,\n maxAttempts: serverConfig.retry?.maxAttempts ?? 10,\n baseDelay: serverConfig.retry?.backoffMs ?? 5000,\n });\n }\n\n // Validate stdio command to prevent shell injection\n function validateStdioCommand(serverConfig: MCPServerConfig): void {\n const shellMetachars = /[;|&$`><]/;\n\n if (serverConfig.command) {\n if (shellMetachars.test(serverConfig.command)) {\n throw new Error(\n `[Directive MCP] Stdio command for server '${serverConfig.name}' contains shell metacharacters: '${serverConfig.command}'. This may indicate a command injection vulnerability. Use 'args' for command arguments instead.`,\n );\n }\n }\n\n if (serverConfig.args) {\n for (const arg of serverConfig.args) {\n if (shellMetachars.test(arg)) {\n throw new Error(\n `[Directive MCP] Stdio argument for server '${serverConfig.name}' contains shell metacharacters: '${arg}'. This may indicate a command injection vulnerability.`,\n );\n }\n }\n }\n }\n\n // Connect to a server\n async function connectServer(name: string): Promise<void> {\n const serverState = state.servers.get(name);\n if (!serverState) {\n throw new Error(`Unknown MCP server: ${name}`);\n }\n\n if (serverState.status === \"connected\") {\n return;\n }\n\n // Validate stdio commands before connecting\n if (serverState.config.transport === \"stdio\") {\n validateStdioCommand(serverState.config);\n }\n\n serverState.status = \"connecting\";\n\n try {\n const client = clientFactory(serverState.config);\n await client.connect();\n\n serverState.client = client;\n serverState.status = \"connected\";\n\n // Reset reconnect state on successful connection\n const rState = reconnectState.get(name);\n if (rState) {\n rState.attempts = 0;\n if (rState.timer) {\n clearTimeout(rState.timer);\n rState.timer = null;\n }\n }\n\n // Fetch available tools and resources\n if (client.getCapabilities().tools) {\n serverState.tools = await client.listTools();\n }\n if (client.getCapabilities().resources) {\n serverState.resources = await client.listResources();\n }\n\n serverState.lastSync = Date.now();\n events.onConnect?.(name);\n } catch (error) {\n serverState.status = \"error\";\n serverState.error =\n error instanceof Error ? error : new Error(String(error));\n events.onError?.(name, serverState.error);\n\n if (autoReconnect) {\n const rState = reconnectState.get(name);\n if (rState && rState.attempts < rState.maxAttempts) {\n rState.attempts++;\n // Exponential backoff with jitter, capped at 60s\n const delay = Math.min(\n rState.baseDelay * 2 ** (rState.attempts - 1) +\n Math.random() * 1000,\n 60000,\n );\n rState.timer = setTimeout(() => {\n rState.timer = null;\n connectServer(name).catch(() => {}); // Error handled in next iteration\n }, delay);\n } else if (rState) {\n console.error(\n `[Directive MCP] Max reconnect attempts (${rState.maxAttempts}) reached for server '${name}'. ` +\n `Call adapter.connectServer(\"${name}\") to retry manually.`,\n );\n }\n }\n\n throw serverState.error;\n }\n }\n\n // Disconnect from a server\n async function disconnectServer(name: string): Promise<void> {\n // Clear any pending reconnect timer\n const rState = reconnectState.get(name);\n if (rState?.timer) {\n clearTimeout(rState.timer);\n rState.timer = null;\n rState.attempts = 0;\n }\n\n const serverState = state.servers.get(name);\n if (!serverState || !serverState.client) {\n return;\n }\n\n try {\n await serverState.client.disconnect();\n } finally {\n serverState.status = \"disconnected\";\n serverState.client = null;\n events.onDisconnect?.(name);\n }\n }\n\n // Call a tool with constraint checking\n async function callToolWithConstraints(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n facts: Record<string, unknown>,\n ): Promise<MCPToolResult> {\n const serverState = state.servers.get(server);\n if (!serverState) {\n throw new Error(\n `[Directive MCP] Unknown server '${server}'. ` +\n `Available servers: ${Array.from(state.servers.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n if (!serverState.client) {\n throw new Error(\n `[Directive MCP] Server '${server}' is not connected. ` +\n `Call 'adapter.connect()' or 'adapter.connectServer(\"${server}\")' first.`,\n );\n }\n\n const constraintKey = `${server}.${tool}`;\n const constraint = state.toolConstraints.get(constraintKey);\n\n // Check constraints\n if (constraint) {\n // Check rate limit\n if (constraint.rateLimit) {\n const limiter = state.rateLimiters.get(constraintKey);\n if (\n !checkRateLimit(\n state.rateLimiters,\n constraintKey,\n constraint.rateLimit,\n )\n ) {\n const resetAt = limiter?.resetTime\n ? new Date(limiter.resetTime).toISOString()\n : \"unknown\";\n throw new Error(\n `[Directive MCP] Rate limit exceeded for '${constraintKey}': ` +\n `${limiter?.count ?? 0}/${constraint.rateLimit} requests per minute. ` +\n `Resets at ${resetAt}.`,\n );\n }\n }\n\n // Check max arg size\n if (constraint.maxArgSize) {\n const argSize = JSON.stringify(args).length;\n if (argSize > constraint.maxArgSize) {\n throw new Error(\n `Arguments exceed max size (${argSize} > ${constraint.maxArgSize})`,\n );\n }\n }\n\n // Check custom constraint\n if (constraint.when) {\n const allowed = await constraint.when(facts, args);\n if (!allowed) {\n throw new Error(`Constraint not satisfied for ${constraintKey}`);\n }\n }\n\n // Check if approval is required\n if (constraint.requireApproval) {\n const requestId = `approval-${++approvalCounter}-${Date.now()}`;\n const approvalRequest: MCPApprovalRequest = {\n id: requestId,\n server,\n tool,\n args,\n requestedAt: Date.now(),\n };\n\n state.pendingApprovals.set(requestId, approvalRequest);\n events.onApprovalRequest?.(approvalRequest);\n\n // Wait for approval or rejection\n await waitForApproval(requestId);\n }\n }\n\n events.onToolCall?.(server, tool, args);\n\n // Call the tool\n const result = await Promise.race([\n serverState.client.callTool(tool, args),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Tool call timeout: ${constraintKey}`)),\n constraint?.timeout ?? 30000,\n ),\n ),\n ]);\n\n events.onToolResult?.(server, tool, result);\n\n return result;\n }\n\n // Create plugin\n const plugin: Plugin = {\n name: \"mcp-adapter\",\n\n onInit: async () => {\n if (autoConnect) {\n await Promise.all(\n Array.from(state.servers.keys()).map((name) =>\n connectServer(name).catch((e) =>\n console.error(`Failed to connect to ${name}:`, e),\n ),\n ),\n );\n }\n },\n\n onDestroy: async () => {\n // Clear all reconnect timers\n for (const rState of reconnectState.values()) {\n if (rState.timer) {\n clearTimeout(rState.timer);\n rState.timer = null;\n }\n }\n\n // Reject all pending approval waiters\n for (const [, waiter] of approvalWaiters) {\n clearTimeout(waiter.timeoutId);\n waiter.reject(\n new Error(\n \"[Directive MCP] Adapter destroyed while awaiting approval\",\n ),\n );\n }\n approvalWaiters.clear();\n\n await Promise.all(\n Array.from(state.servers.keys()).map((name) =>\n disconnectServer(name).catch((e) =>\n console.error(`Failed to disconnect from ${name}:`, e),\n ),\n ),\n );\n },\n };\n\n // Sync resources to facts\n async function syncResources(facts: Record<string, unknown>): Promise<void> {\n for (const mapping of resourceMappings) {\n for (const [serverName, serverState] of state.servers) {\n if (!serverState.client) continue;\n\n for (const resource of serverState.resources) {\n // Check if resource matches pattern\n const matches =\n typeof mapping.pattern === \"string\"\n ? matchGlob(resource.uri, mapping.pattern)\n : mapping.pattern.test(resource.uri);\n\n if (matches) {\n try {\n const result = await serverState.client.readResource(\n resource.uri,\n );\n const content = result.contents[0]?.text ?? \"\";\n const value = mapping.transform\n ? mapping.transform(content)\n : content;\n\n facts[mapping.factKey] = value;\n events.onResourceUpdate?.(serverName, resource.uri, result);\n } catch (error) {\n console.error(`Failed to sync resource ${resource.uri}:`, error);\n }\n }\n }\n }\n }\n }\n\n return {\n plugin,\n\n async connect() {\n await Promise.all(Array.from(state.servers.keys()).map(connectServer));\n },\n\n connectServer,\n\n async disconnect() {\n await Promise.all(Array.from(state.servers.keys()).map(disconnectServer));\n },\n\n disconnectServer,\n\n getTools() {\n const tools = new Map<string, MCPTool[]>();\n for (const [name, serverState] of state.servers) {\n tools.set(name, serverState.tools);\n }\n return tools;\n },\n\n getResources() {\n const resources = new Map<string, MCPResource[]>();\n for (const [name, serverState] of state.servers) {\n resources.set(name, serverState.resources);\n }\n return resources;\n },\n\n async callTool(server, tool, args, facts) {\n return callToolWithConstraints(server, tool, args, facts);\n },\n\n async callToolDirect(server, tool, args) {\n if (!allowDirectCalls) {\n throw new Error(\n \"[Directive] callToolDirect is disabled by default. Pass { allowDirectCalls: true } to enable unconstrained tool calls.\",\n );\n }\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Directive] callToolDirect bypasses all constraints (rate limits, approvals, timeouts).\",\n );\n }\n const serverState = state.servers.get(server);\n if (!serverState) {\n throw new Error(\n `[Directive MCP] Unknown server '${server}'. ` +\n `Available servers: ${Array.from(state.servers.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n if (!serverState.client) {\n throw new Error(\n `[Directive MCP] Server '${server}' is not connected. ` +\n `Call 'adapter.connect()' or 'adapter.connectServer(\"${server}\")' first.`,\n );\n }\n events.onToolCall?.(server, tool, args);\n const result = await serverState.client.callTool(tool, args);\n events.onToolResult?.(server, tool, result);\n return result;\n },\n\n async readResource(server, uri) {\n const serverState = state.servers.get(server);\n if (!serverState) {\n throw new Error(\n `[Directive MCP] Unknown server '${server}'. ` +\n `Available servers: ${Array.from(state.servers.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n if (!serverState.client) {\n throw new Error(\n `[Directive MCP] Server '${server}' is not connected. ` +\n `Call 'adapter.connect()' or 'adapter.connectServer(\"${server}\")' first.`,\n );\n }\n const result = await serverState.client.readResource(uri);\n events.onResourceUpdate?.(server, uri, result);\n return result;\n },\n\n syncResources,\n\n getServerStatus(name) {\n return state.servers.get(name);\n },\n\n getAllServerStatuses() {\n return new Map(state.servers);\n },\n\n approve(requestId: string) {\n const request = state.pendingApprovals.get(requestId);\n if (!request && !approvalWaiters.has(requestId)) {\n throw new Error(\n `[Directive MCP] No pending approval request with ID '${requestId}'. ` +\n `Pending requests: ${Array.from(state.pendingApprovals.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n resolveApproval(requestId, true);\n },\n\n reject(requestId: string, reason?: string) {\n const request = state.pendingApprovals.get(requestId);\n if (!request && !approvalWaiters.has(requestId)) {\n throw new Error(\n `[Directive MCP] No pending approval request with ID '${requestId}'. ` +\n `Pending requests: ${Array.from(state.pendingApprovals.keys()).join(\", \") || \"(none)\"}`,\n );\n }\n resolveApproval(requestId, false, reason);\n },\n\n getPendingApprovals() {\n return Array.from(state.pendingApprovals.values());\n },\n\n getRejectionReason(requestId: string): string | undefined {\n return rejectionReasons.get(requestId);\n },\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/** Cache for compiled glob patterns to avoid repeated regex compilation */\nconst globCache = new Map<string, RegExp>();\nconst MAX_GLOB_CACHE_SIZE = 200;\n\n/** Simple glob matching (supports * and **) with caching */\nfunction matchGlob(str: string, pattern: string): boolean {\n let regex = globCache.get(pattern);\n if (!regex) {\n // Escape all regex metacharacters first, then convert glob wildcards\n const regexPattern = pattern\n .replace(/\\*\\*/g, \"\\0GLOBSTAR\\0\")\n .replace(/\\*/g, \"\\0STAR\\0\")\n .replace(/\\?/g, \"\\0QUESTION\\0\")\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\0GLOBSTAR\\0/g, \".*\")\n .replace(/\\0STAR\\0/g, \"[^/]*\")\n .replace(/\\0QUESTION\\0/g, \".\");\n regex = new RegExp(`^${regexPattern}$`);\n\n // LRU eviction: delete oldest entry when cache is full\n if (globCache.size >= MAX_GLOB_CACHE_SIZE) {\n const firstKey = globCache.keys().next().value;\n if (firstKey !== undefined) globCache.delete(firstKey);\n }\n globCache.set(pattern, regex);\n }\n return regex.test(str);\n}\n\n/**\n * Convert MCP tools to a format suitable for LLM tool calling.\n *\n * @example\n * ```typescript\n * const adapter = createMCPAdapter({ servers: [...] });\n * await adapter.connect();\n *\n * const tools = adapter.getTools();\n * const llmTools = convertToolsForLLM(tools);\n * // Use with OpenAI/Anthropic/etc.\n * ```\n */\nexport function convertToolsForLLM(tools: Map<string, MCPTool[]>): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}> {\n const result: Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n }> = [];\n\n for (const [server, serverTools] of tools) {\n for (const tool of serverTools) {\n result.push({\n type: \"function\",\n function: {\n name: `${server}.${tool.name}`,\n description: tool.description ?? `Tool: ${tool.name}`,\n parameters: tool.inputSchema,\n },\n });\n }\n }\n\n return result;\n}\n\n/**\n * Create a requirement to call an MCP tool.\n *\n * @example\n * ```typescript\n * const req = mcpCallTool('filesystem', 'read_file', { path: '/etc/hosts' });\n * // { type: 'MCP_CALL_TOOL', server: 'filesystem', tool: 'read_file', args: { path: '/etc/hosts' } }\n * ```\n */\nexport function mcpCallTool(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n): MCPCallToolRequirement {\n return { type: \"MCP_CALL_TOOL\", server, tool, args };\n}\n\n/**\n * Create a requirement to read an MCP resource.\n */\nexport function mcpReadResource(\n server: string,\n uri: string,\n): MCPReadResourceRequirement {\n return { type: \"MCP_READ_RESOURCE\", server, uri };\n}\n\n/**\n * Create a requirement to get an MCP prompt.\n */\nexport function mcpGetPrompt(\n server: string,\n prompt: string,\n args?: Record<string, string>,\n): MCPGetPromptRequirement {\n return { type: \"MCP_GET_PROMPT\", server, prompt, args };\n}\n\n/**\n * Create a requirement to sync MCP resources.\n */\nexport function mcpSyncResources(\n server?: string,\n pattern?: string | RegExp,\n): MCPSyncResourcesRequirement {\n return { type: \"MCP_SYNC_RESOURCES\", server, pattern };\n}\n\n// Re-export types\nexport * from \"./mcp-types.js\";\n"]}