network-ai 5.10.2 → 5.12.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 (273) hide show
  1. package/INTEGRATION_GUIDE.md +2 -2
  2. package/QUICKSTART.md +10 -0
  3. package/README.md +32 -3
  4. package/SKILL.md +3 -3
  5. package/dist/esm/adapters/a2a-adapter.js +235 -0
  6. package/dist/esm/adapters/a2a-adapter.js.map +1 -0
  7. package/dist/esm/adapters/adapter-registry.js +613 -0
  8. package/dist/esm/adapters/adapter-registry.js.map +1 -0
  9. package/dist/esm/adapters/agno-adapter.js +140 -0
  10. package/dist/esm/adapters/agno-adapter.js.map +1 -0
  11. package/dist/esm/adapters/anthropic-computer-use-adapter.js +180 -0
  12. package/dist/esm/adapters/anthropic-computer-use-adapter.js.map +1 -0
  13. package/dist/esm/adapters/aps-adapter.js +289 -0
  14. package/dist/esm/adapters/aps-adapter.js.map +1 -0
  15. package/dist/esm/adapters/autogen-adapter.js +141 -0
  16. package/dist/esm/adapters/autogen-adapter.js.map +1 -0
  17. package/dist/esm/adapters/base-adapter.js +104 -0
  18. package/dist/esm/adapters/base-adapter.js.map +1 -0
  19. package/dist/esm/adapters/browser-agent-adapter.js +219 -0
  20. package/dist/esm/adapters/browser-agent-adapter.js.map +1 -0
  21. package/dist/esm/adapters/codex-adapter.js +318 -0
  22. package/dist/esm/adapters/codex-adapter.js.map +1 -0
  23. package/dist/esm/adapters/copilot-adapter.js +132 -0
  24. package/dist/esm/adapters/copilot-adapter.js.map +1 -0
  25. package/dist/esm/adapters/crewai-adapter.js +148 -0
  26. package/dist/esm/adapters/crewai-adapter.js.map +1 -0
  27. package/dist/esm/adapters/custom-adapter.js +142 -0
  28. package/dist/esm/adapters/custom-adapter.js.map +1 -0
  29. package/dist/esm/adapters/custom-streaming-adapter.js +181 -0
  30. package/dist/esm/adapters/custom-streaming-adapter.js.map +1 -0
  31. package/dist/esm/adapters/dspy-adapter.js +127 -0
  32. package/dist/esm/adapters/dspy-adapter.js.map +1 -0
  33. package/dist/esm/adapters/haystack-adapter.js +149 -0
  34. package/dist/esm/adapters/haystack-adapter.js.map +1 -0
  35. package/dist/esm/adapters/hermes-adapter.js +217 -0
  36. package/dist/esm/adapters/hermes-adapter.js.map +1 -0
  37. package/dist/esm/adapters/index.js +109 -0
  38. package/dist/esm/adapters/index.js.map +1 -0
  39. package/dist/esm/adapters/langchain-adapter.js +134 -0
  40. package/dist/esm/adapters/langchain-adapter.js.map +1 -0
  41. package/dist/esm/adapters/langchain-streaming-adapter.js +161 -0
  42. package/dist/esm/adapters/langchain-streaming-adapter.js.map +1 -0
  43. package/dist/esm/adapters/langgraph-adapter.js +119 -0
  44. package/dist/esm/adapters/langgraph-adapter.js.map +1 -0
  45. package/dist/esm/adapters/llamaindex-adapter.js +135 -0
  46. package/dist/esm/adapters/llamaindex-adapter.js.map +1 -0
  47. package/dist/esm/adapters/mcp-adapter.js +200 -0
  48. package/dist/esm/adapters/mcp-adapter.js.map +1 -0
  49. package/dist/esm/adapters/minimax-adapter.js +233 -0
  50. package/dist/esm/adapters/minimax-adapter.js.map +1 -0
  51. package/dist/esm/adapters/nemoclaw-adapter.js +465 -0
  52. package/dist/esm/adapters/nemoclaw-adapter.js.map +1 -0
  53. package/dist/esm/adapters/openai-agents-adapter.js +118 -0
  54. package/dist/esm/adapters/openai-agents-adapter.js.map +1 -0
  55. package/dist/esm/adapters/openai-assistants-adapter.js +130 -0
  56. package/dist/esm/adapters/openai-assistants-adapter.js.map +1 -0
  57. package/dist/esm/adapters/openclaw-adapter.js +107 -0
  58. package/dist/esm/adapters/openclaw-adapter.js.map +1 -0
  59. package/dist/esm/adapters/orchestrator-adapter.js +218 -0
  60. package/dist/esm/adapters/orchestrator-adapter.js.map +1 -0
  61. package/dist/esm/adapters/pydantic-ai-adapter.js +163 -0
  62. package/dist/esm/adapters/pydantic-ai-adapter.js.map +1 -0
  63. package/dist/esm/adapters/rlm-adapter.js +167 -0
  64. package/dist/esm/adapters/rlm-adapter.js.map +1 -0
  65. package/dist/esm/adapters/semantic-kernel-adapter.js +123 -0
  66. package/dist/esm/adapters/semantic-kernel-adapter.js.map +1 -0
  67. package/dist/esm/adapters/streaming-base-adapter.js +74 -0
  68. package/dist/esm/adapters/streaming-base-adapter.js.map +1 -0
  69. package/dist/esm/adapters/vertex-ai-adapter.js +166 -0
  70. package/dist/esm/adapters/vertex-ai-adapter.js.map +1 -0
  71. package/dist/esm/demo-control-plane.js +147 -0
  72. package/dist/esm/demo-control-plane.js.map +1 -0
  73. package/dist/esm/demo-worktree-dashboard.js +131 -0
  74. package/dist/esm/demo-worktree-dashboard.js.map +1 -0
  75. package/dist/esm/examples/01-hello-swarm.js +165 -0
  76. package/dist/esm/examples/01-hello-swarm.js.map +1 -0
  77. package/dist/esm/examples/02-fsm-pipeline.js +189 -0
  78. package/dist/esm/examples/02-fsm-pipeline.js.map +1 -0
  79. package/dist/esm/examples/03-parallel-agents.js +192 -0
  80. package/dist/esm/examples/03-parallel-agents.js.map +1 -0
  81. package/dist/esm/examples/05-code-review-swarm.js +1177 -0
  82. package/dist/esm/examples/05-code-review-swarm.js.map +1 -0
  83. package/dist/esm/examples/06-ai-pipeline-demo.js +263 -0
  84. package/dist/esm/examples/06-ai-pipeline-demo.js.map +1 -0
  85. package/dist/esm/examples/07-full-showcase.js +946 -0
  86. package/dist/esm/examples/07-full-showcase.js.map +1 -0
  87. package/dist/esm/examples/08-control-plane-stress-demo.js +186 -0
  88. package/dist/esm/examples/08-control-plane-stress-demo.js.map +1 -0
  89. package/dist/esm/examples/09-real-langchain.js +231 -0
  90. package/dist/esm/examples/09-real-langchain.js.map +1 -0
  91. package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js +270 -0
  92. package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
  93. package/dist/esm/examples/demo-runner.js +119 -0
  94. package/dist/esm/examples/demo-runner.js.map +1 -0
  95. package/dist/esm/index.js +1352 -0
  96. package/dist/esm/index.js.map +1 -0
  97. package/dist/esm/lib/adapter-hooks.js +216 -0
  98. package/dist/esm/lib/adapter-hooks.js.map +1 -0
  99. package/dist/esm/lib/adapter-test-harness.js +118 -0
  100. package/dist/esm/lib/adapter-test-harness.js.map +1 -0
  101. package/dist/esm/lib/agent-conversation.js +155 -0
  102. package/dist/esm/lib/agent-conversation.js.map +1 -0
  103. package/dist/esm/lib/agent-debate.js +146 -0
  104. package/dist/esm/lib/agent-debate.js.map +1 -0
  105. package/dist/esm/lib/agent-memory.js +336 -0
  106. package/dist/esm/lib/agent-memory.js.map +1 -0
  107. package/dist/esm/lib/agent-runtime.js +818 -0
  108. package/dist/esm/lib/agent-runtime.js.map +1 -0
  109. package/dist/esm/lib/agent-vcr.js +218 -0
  110. package/dist/esm/lib/agent-vcr.js.map +1 -0
  111. package/dist/esm/lib/anomaly-detector.js +178 -0
  112. package/dist/esm/lib/anomaly-detector.js.map +1 -0
  113. package/dist/esm/lib/approval-inbox.js +385 -0
  114. package/dist/esm/lib/approval-inbox.js.map +1 -0
  115. package/dist/esm/lib/auth-guardian.js +692 -0
  116. package/dist/esm/lib/auth-guardian.js.map +1 -0
  117. package/dist/esm/lib/auth-validator.js +32 -0
  118. package/dist/esm/lib/auth-validator.js.map +1 -0
  119. package/dist/esm/lib/blackboard-backend-crdt.js +251 -0
  120. package/dist/esm/lib/blackboard-backend-crdt.js.map +1 -0
  121. package/dist/esm/lib/blackboard-backend-redis.js +244 -0
  122. package/dist/esm/lib/blackboard-backend-redis.js.map +1 -0
  123. package/dist/esm/lib/blackboard-backend.js +141 -0
  124. package/dist/esm/lib/blackboard-backend.js.map +1 -0
  125. package/dist/esm/lib/blackboard-validator.js +985 -0
  126. package/dist/esm/lib/blackboard-validator.js.map +1 -0
  127. package/dist/esm/lib/circuit-breaker.js +164 -0
  128. package/dist/esm/lib/circuit-breaker.js.map +1 -0
  129. package/dist/esm/lib/claim-verifier.js +173 -0
  130. package/dist/esm/lib/claim-verifier.js.map +1 -0
  131. package/dist/esm/lib/comparison-runner.js +138 -0
  132. package/dist/esm/lib/comparison-runner.js.map +1 -0
  133. package/dist/esm/lib/compliance-monitor.js +261 -0
  134. package/dist/esm/lib/compliance-monitor.js.map +1 -0
  135. package/dist/esm/lib/confidence-filter.js +210 -0
  136. package/dist/esm/lib/confidence-filter.js.map +1 -0
  137. package/dist/esm/lib/config-watcher.js +215 -0
  138. package/dist/esm/lib/config-watcher.js.map +1 -0
  139. package/dist/esm/lib/consistency.js +274 -0
  140. package/dist/esm/lib/consistency.js.map +1 -0
  141. package/dist/esm/lib/console-ui.js +276 -0
  142. package/dist/esm/lib/console-ui.js.map +1 -0
  143. package/dist/esm/lib/context-throttler.js +171 -0
  144. package/dist/esm/lib/context-throttler.js.map +1 -0
  145. package/dist/esm/lib/control-plane.js +527 -0
  146. package/dist/esm/lib/control-plane.js.map +1 -0
  147. package/dist/esm/lib/cost-governor.js +128 -0
  148. package/dist/esm/lib/cost-governor.js.map +1 -0
  149. package/dist/esm/lib/cost-heatmap.js +161 -0
  150. package/dist/esm/lib/cost-heatmap.js.map +1 -0
  151. package/dist/esm/lib/coverage-gate.js +213 -0
  152. package/dist/esm/lib/coverage-gate.js.map +1 -0
  153. package/dist/esm/lib/coverage-reporter.js +177 -0
  154. package/dist/esm/lib/coverage-reporter.js.map +1 -0
  155. package/dist/esm/lib/crdt.js +141 -0
  156. package/dist/esm/lib/crdt.js.map +1 -0
  157. package/dist/esm/lib/dashboard-server.js +403 -0
  158. package/dist/esm/lib/dashboard-server.js.map +1 -0
  159. package/dist/esm/lib/dry-run.js +130 -0
  160. package/dist/esm/lib/dry-run.js.map +1 -0
  161. package/dist/esm/lib/env-manager.js +518 -0
  162. package/dist/esm/lib/env-manager.js.map +1 -0
  163. package/dist/esm/lib/errors.js +201 -0
  164. package/dist/esm/lib/errors.js.map +1 -0
  165. package/dist/esm/lib/event-bus.js +229 -0
  166. package/dist/esm/lib/event-bus.js.map +1 -0
  167. package/dist/esm/lib/explainability.js +102 -0
  168. package/dist/esm/lib/explainability.js.map +1 -0
  169. package/dist/esm/lib/fan-out.js +237 -0
  170. package/dist/esm/lib/fan-out.js.map +1 -0
  171. package/dist/esm/lib/federated-budget.js +322 -0
  172. package/dist/esm/lib/federated-budget.js.map +1 -0
  173. package/dist/esm/lib/fsm-journey.js +478 -0
  174. package/dist/esm/lib/fsm-journey.js.map +1 -0
  175. package/dist/esm/lib/goal-decomposer.js +698 -0
  176. package/dist/esm/lib/goal-decomposer.js.map +1 -0
  177. package/dist/esm/lib/goal-dsl.js +391 -0
  178. package/dist/esm/lib/goal-dsl.js.map +1 -0
  179. package/dist/esm/lib/job-queue.js +310 -0
  180. package/dist/esm/lib/job-queue.js.map +1 -0
  181. package/dist/esm/lib/landscape-agent.js +134 -0
  182. package/dist/esm/lib/landscape-agent.js.map +1 -0
  183. package/dist/esm/lib/learning-loop.js +181 -0
  184. package/dist/esm/lib/learning-loop.js.map +1 -0
  185. package/dist/esm/lib/lifecycle-hooks.js +148 -0
  186. package/dist/esm/lib/lifecycle-hooks.js.map +1 -0
  187. package/dist/esm/lib/locked-blackboard.js +1295 -0
  188. package/dist/esm/lib/locked-blackboard.js.map +1 -0
  189. package/dist/esm/lib/logger.js +150 -0
  190. package/dist/esm/lib/logger.js.map +1 -0
  191. package/dist/esm/lib/mcp-blackboard-tools.js +298 -0
  192. package/dist/esm/lib/mcp-blackboard-tools.js.map +1 -0
  193. package/dist/esm/lib/mcp-bridge.js +357 -0
  194. package/dist/esm/lib/mcp-bridge.js.map +1 -0
  195. package/dist/esm/lib/mcp-tool-consumer.js +287 -0
  196. package/dist/esm/lib/mcp-tool-consumer.js.map +1 -0
  197. package/dist/esm/lib/mcp-tools-control.js +392 -0
  198. package/dist/esm/lib/mcp-tools-control.js.map +1 -0
  199. package/dist/esm/lib/mcp-tools-extended.js +371 -0
  200. package/dist/esm/lib/mcp-tools-extended.js.map +1 -0
  201. package/dist/esm/lib/mcp-transport-http.js +528 -0
  202. package/dist/esm/lib/mcp-transport-http.js.map +1 -0
  203. package/dist/esm/lib/mcp-transport-sse.js +503 -0
  204. package/dist/esm/lib/mcp-transport-sse.js.map +1 -0
  205. package/dist/esm/lib/metrics.js +284 -0
  206. package/dist/esm/lib/metrics.js.map +1 -0
  207. package/dist/esm/lib/orchestrator-types.js +66 -0
  208. package/dist/esm/lib/orchestrator-types.js.map +1 -0
  209. package/dist/esm/lib/otel-bridge.js +167 -0
  210. package/dist/esm/lib/otel-bridge.js.map +1 -0
  211. package/dist/esm/lib/partition-planner.js +246 -0
  212. package/dist/esm/lib/partition-planner.js.map +1 -0
  213. package/dist/esm/lib/phase-pipeline.js +367 -0
  214. package/dist/esm/lib/phase-pipeline.js.map +1 -0
  215. package/dist/esm/lib/playground.js +224 -0
  216. package/dist/esm/lib/playground.js.map +1 -0
  217. package/dist/esm/lib/qa-orchestrator.js +296 -0
  218. package/dist/esm/lib/qa-orchestrator.js.map +1 -0
  219. package/dist/esm/lib/quadtree.js +259 -0
  220. package/dist/esm/lib/quadtree.js.map +1 -0
  221. package/dist/esm/lib/route-classifier.js +217 -0
  222. package/dist/esm/lib/route-classifier.js.map +1 -0
  223. package/dist/esm/lib/semantic-search.js +235 -0
  224. package/dist/esm/lib/semantic-search.js.map +1 -0
  225. package/dist/esm/lib/shared-blackboard.js +249 -0
  226. package/dist/esm/lib/shared-blackboard.js.map +1 -0
  227. package/dist/esm/lib/skill-composer.js +190 -0
  228. package/dist/esm/lib/skill-composer.js.map +1 -0
  229. package/dist/esm/lib/speculative-executor.js +107 -0
  230. package/dist/esm/lib/speculative-executor.js.map +1 -0
  231. package/dist/esm/lib/strategy-agent.js +626 -0
  232. package/dist/esm/lib/strategy-agent.js.map +1 -0
  233. package/dist/esm/lib/swarm-transport.js +307 -0
  234. package/dist/esm/lib/swarm-transport.js.map +1 -0
  235. package/dist/esm/lib/swarm-utils.js +510 -0
  236. package/dist/esm/lib/swarm-utils.js.map +1 -0
  237. package/dist/esm/lib/task-decomposer.js +272 -0
  238. package/dist/esm/lib/task-decomposer.js.map +1 -0
  239. package/dist/esm/lib/telemetry-provider.js +207 -0
  240. package/dist/esm/lib/telemetry-provider.js.map +1 -0
  241. package/dist/esm/lib/timeline-scrubber.js +173 -0
  242. package/dist/esm/lib/timeline-scrubber.js.map +1 -0
  243. package/dist/esm/lib/topology.js +591 -0
  244. package/dist/esm/lib/topology.js.map +1 -0
  245. package/dist/esm/lib/transport-agent.js +366 -0
  246. package/dist/esm/lib/transport-agent.js.map +1 -0
  247. package/dist/esm/lib/work-tree-dashboard.js +583 -0
  248. package/dist/esm/lib/work-tree-dashboard.js.map +1 -0
  249. package/dist/esm/lib/work-tree-ui.js +333 -0
  250. package/dist/esm/lib/work-tree-ui.js.map +1 -0
  251. package/dist/esm/lib/work-tree.js +480 -0
  252. package/dist/esm/lib/work-tree.js.map +1 -0
  253. package/dist/esm/run.js +144 -0
  254. package/dist/esm/run.js.map +1 -0
  255. package/dist/esm/security.js +1122 -0
  256. package/dist/esm/security.js.map +1 -0
  257. package/dist/index.d.ts +2 -0
  258. package/dist/index.d.ts.map +1 -1
  259. package/dist/index.js +6 -1
  260. package/dist/index.js.map +1 -1
  261. package/dist/lib/mcp-transport-http.d.ts +203 -0
  262. package/dist/lib/mcp-transport-http.d.ts.map +1 -0
  263. package/dist/lib/mcp-transport-http.js +528 -0
  264. package/dist/lib/mcp-transport-http.js.map +1 -0
  265. package/dist/lib/phase-pipeline.d.ts +31 -0
  266. package/dist/lib/phase-pipeline.d.ts.map +1 -1
  267. package/dist/lib/phase-pipeline.js +93 -1
  268. package/dist/lib/phase-pipeline.js.map +1 -1
  269. package/dist/lib/semantic-search.d.ts +42 -6
  270. package/dist/lib/semantic-search.d.ts.map +1 -1
  271. package/dist/lib/semantic-search.js +87 -6
  272. package/dist/lib/semantic-search.js.map +1 -1
  273. package/package.json +24 -4
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ /**
3
+ * Partition Planner — Logical Work Partitioning for Network-AI
4
+ *
5
+ * Prevents parallel agents from performing redundant research or analysis by
6
+ * running a "meta-step" before DAG execution that generates a Scope Assignment
7
+ * Map (PartitionSchema). Each agent receives a boundary constraint injected
8
+ * into its parameters, declaring what it SHOULD focus on and what it should
9
+ * EXCLUDE.
10
+ *
11
+ * The planner also performs an overlap check — verifying that no two
12
+ * `focus_area` strings overlap semantically (or lexically, when using the
13
+ * built-in heuristic check).
14
+ *
15
+ * Zero external dependencies — the overlap checker and the planner function
16
+ * are pluggable so callers can use any LLM or rule-based strategy.
17
+ *
18
+ * @module PartitionPlanner
19
+ * @version 1.0.0
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.PartitionPlanner = void 0;
23
+ exports.createLexicalOverlapChecker = createLexicalOverlapChecker;
24
+ exports.createLLMPartitionPlanner = createLLMPartitionPlanner;
25
+ exports.parsePartitionJSON = parsePartitionJSON;
26
+ // ============================================================================
27
+ // BUILT-IN OVERLAP CHECKER (lexical heuristic — zero model cost)
28
+ // ============================================================================
29
+ /**
30
+ * Lexical overlap checker: considers two focus areas to overlap when they
31
+ * share significant word stems (ignoring common stop words).
32
+ *
33
+ * This is the built-in default. For true semantic overlap detection, inject
34
+ * an LLM-based `OverlapCheckFunction` via `PartitionPlannerOptions.overlapChecker`.
35
+ */
36
+ function createLexicalOverlapChecker() {
37
+ const STOP_WORDS = new Set([
38
+ 'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
39
+ 'of', 'with', 'by', 'from', 'is', 'are', 'was', 'were', 'be', 'been',
40
+ 'as', 'its', 'it', 'this', 'that', 'all', 'any', 'each', 'every',
41
+ ]);
42
+ function tokenize(text) {
43
+ return new Set(text
44
+ .toLowerCase()
45
+ .replace(/[^a-z0-9\s]/g, ' ')
46
+ .split(/\s+/)
47
+ .filter((w) => w.length > 2 && !STOP_WORDS.has(w)));
48
+ }
49
+ return async (schema) => {
50
+ const overlaps = [];
51
+ for (let i = 0; i < schema.length; i++) {
52
+ for (let j = i + 1; j < schema.length; j++) {
53
+ const tokensA = tokenize(schema[i].focus_area);
54
+ const tokensB = tokenize(schema[j].focus_area);
55
+ const shared = [];
56
+ for (const token of tokensA) {
57
+ if (tokensB.has(token))
58
+ shared.push(token);
59
+ }
60
+ // Flag as overlap when ≥ 2 shared significant words or overlap ratio > 0.4
61
+ const unionSize = new Set([...tokensA, ...tokensB]).size;
62
+ const ratio = unionSize > 0 ? shared.length / unionSize : 0;
63
+ if (shared.length >= 2 || ratio > 0.4) {
64
+ overlaps.push(`Overlap between "${schema[i].agent_type}" (focus: "${schema[i].focus_area}") and "${schema[j].agent_type}" (focus: "${schema[j].focus_area}") — shared terms: ${shared.join(', ')}`);
65
+ }
66
+ }
67
+ }
68
+ return overlaps;
69
+ };
70
+ }
71
+ /**
72
+ * Build a partition planner backed by an LLM.
73
+ *
74
+ * The LLM is asked to generate a PartitionSchema JSON array given the goal
75
+ * and the available agents. Use this for rich semantic partitioning.
76
+ *
77
+ * @param executor - Network-AI executor function
78
+ * @param plannerAgentId - Agent ID for the LLM that does partitioning
79
+ */
80
+ function createLLMPartitionPlanner(executor, plannerAgentId) {
81
+ return async (goal, agents, context) => {
82
+ const agentList = agents.map((a) => `- ${a.id}: ${a.role}`).join('\n');
83
+ const prompt = [
84
+ 'You are a work-partitioning planner for a multi-agent AI system.',
85
+ 'Generate a scope assignment for each agent to prevent redundant research.',
86
+ '',
87
+ `GOAL: ${goal}`,
88
+ '',
89
+ 'AGENTS:',
90
+ agentList,
91
+ '',
92
+ context ? `CONTEXT: ${JSON.stringify(context)}` : '',
93
+ '',
94
+ 'Respond with ONLY a JSON array where each element has:',
95
+ '- "agent_type": agent ID from the list above',
96
+ '- "focus_area": a short phrase describing what ONLY this agent researches',
97
+ '- "excluded_topics": array of topic strings this agent must NOT cover',
98
+ '',
99
+ 'Ensure no two focus_area values overlap semantically.',
100
+ '',
101
+ 'Example:',
102
+ '[{"agent_type":"researcher","focus_area":"market trends and competitive landscape","excluded_topics":["financial projections","legal compliance"]},',
103
+ ' {"agent_type":"analyst","focus_area":"financial projections and ROI analysis","excluded_topics":["market research","legal compliance"]}]',
104
+ ].filter(Boolean).join('\n');
105
+ const result = await executor(plannerAgentId, { action: 'partition', params: { prompt } }, { agentId: plannerAgentId, taskId: `partition-${Date.now()}`, metadata: { type: 'partition-planning', ...(context ?? {}) } });
106
+ if (!result.success || !result.data) {
107
+ throw new Error(`Partition planner failed: ${result.error?.message ?? 'no data returned'}`);
108
+ }
109
+ return parsePartitionJSON(typeof result.data === 'string' ? result.data : JSON.stringify(result.data));
110
+ };
111
+ }
112
+ /**
113
+ * Parse a PartitionSchema from an LLM response string.
114
+ * Handles markdown fences and leading/trailing text.
115
+ */
116
+ function parsePartitionJSON(text) {
117
+ let cleaned = text.trim();
118
+ // Strip markdown fences
119
+ const fenceOpen = cleaned.indexOf('```');
120
+ if (fenceOpen !== -1) {
121
+ const afterOpen = cleaned.indexOf('\n', fenceOpen);
122
+ const fenceClose = cleaned.indexOf('```', afterOpen !== -1 ? afterOpen : fenceOpen + 3);
123
+ if (afterOpen !== -1 && fenceClose > afterOpen) {
124
+ cleaned = cleaned.substring(afterOpen + 1, fenceClose).trim();
125
+ }
126
+ }
127
+ // Find JSON array
128
+ const arrayStart = cleaned.indexOf('[');
129
+ const arrayEnd = cleaned.lastIndexOf(']');
130
+ if (arrayStart !== -1 && arrayEnd > arrayStart) {
131
+ cleaned = cleaned.substring(arrayStart, arrayEnd + 1);
132
+ }
133
+ let parsed;
134
+ try {
135
+ parsed = JSON.parse(cleaned);
136
+ }
137
+ catch (err) {
138
+ throw new Error(`Failed to parse partition schema JSON: ${err.message}`);
139
+ }
140
+ if (!Array.isArray(parsed)) {
141
+ throw new Error('Partition schema must be a JSON array');
142
+ }
143
+ // Validate each entry
144
+ const schema = [];
145
+ for (const entry of parsed) {
146
+ if (typeof entry !== 'object' || entry === null) {
147
+ throw new Error('Each partition entry must be a JSON object');
148
+ }
149
+ const e = entry;
150
+ if (!e.agent_type || typeof e.agent_type !== 'string') {
151
+ throw new Error('Each partition entry must have a string "agent_type"');
152
+ }
153
+ if (!e.focus_area || typeof e.focus_area !== 'string') {
154
+ throw new Error(`Partition entry for "${e.agent_type}" must have a string "focus_area"`);
155
+ }
156
+ if (!Array.isArray(e.excluded_topics)) {
157
+ e.excluded_topics = [];
158
+ }
159
+ schema.push({
160
+ agent_type: e.agent_type,
161
+ focus_area: e.focus_area,
162
+ excluded_topics: e.excluded_topics.map(String),
163
+ });
164
+ }
165
+ return schema;
166
+ }
167
+ // ============================================================================
168
+ // PARTITION PLANNER (OOP interface)
169
+ // ============================================================================
170
+ /**
171
+ * PartitionPlanner generates a PartitionSchema (scope assignment map) for a
172
+ * set of agents before the DAG is executed, preventing redundant research.
173
+ *
174
+ * @example
175
+ * ```typescript
176
+ * const planner = new PartitionPlanner(myLLMPartitionPlannerFn);
177
+ * const result = await planner.plan('Analyse Q3 financial results', agents);
178
+ * // result.schema[0] = { agent_type: 'researcher', focus_area: '...', excluded_topics: [...] }
179
+ * // Inject result.schema[i] as boundary constraint into each agent's params
180
+ * ```
181
+ */
182
+ class PartitionPlanner {
183
+ plannerFn;
184
+ overlapChecker;
185
+ strictOverlap;
186
+ constructor(plannerFn, options = {}) {
187
+ this.plannerFn = plannerFn;
188
+ this.overlapChecker = options.overlapChecker ?? createLexicalOverlapChecker();
189
+ this.strictOverlap = options.strictOverlap ?? false;
190
+ }
191
+ /**
192
+ * Generate a PartitionSchema for a goal and agent list.
193
+ *
194
+ * Runs the planner then validates for overlaps. If `strictOverlap` is true
195
+ * and overlaps are found, throws an error. Otherwise overlaps are reported
196
+ * in the result.
197
+ *
198
+ * @param goal - Natural language goal
199
+ * @param agents - Available team agents
200
+ * @param context - Optional context to feed to the planner
201
+ */
202
+ async plan(goal, agents, context) {
203
+ if (!goal || typeof goal !== 'string') {
204
+ throw new Error('Goal must be a non-empty string');
205
+ }
206
+ if (!agents || agents.length === 0) {
207
+ throw new Error('At least one agent is required');
208
+ }
209
+ const schema = await this.plannerFn(goal, agents, context);
210
+ const overlaps = await this.overlapChecker(schema);
211
+ const hasOverlaps = overlaps.length > 0;
212
+ if (hasOverlaps && this.strictOverlap) {
213
+ throw new Error(`Partition schema has semantic overlaps:\n${overlaps.join('\n')}`);
214
+ }
215
+ return {
216
+ schema,
217
+ overlaps,
218
+ hasOverlaps,
219
+ createdAt: Date.now(),
220
+ };
221
+ }
222
+ /**
223
+ * Inject partition boundary constraints into agent params.
224
+ *
225
+ * Given a PartitionSchema and an existing params object for an agent,
226
+ * returns a new params object with `_partitionConstraint` added.
227
+ *
228
+ * @param agentId - Agent ID to look up in the schema
229
+ * @param params - Existing task params
230
+ * @param schema - The partition schema
231
+ */
232
+ static injectConstraint(agentId, params, schema) {
233
+ const entry = schema.find((e) => e.agent_type === agentId);
234
+ if (!entry)
235
+ return params;
236
+ return {
237
+ ...params,
238
+ _partitionConstraint: {
239
+ focus_area: entry.focus_area,
240
+ excluded_topics: entry.excluded_topics,
241
+ },
242
+ };
243
+ }
244
+ }
245
+ exports.PartitionPlanner = PartitionPlanner;
246
+ //# sourceMappingURL=partition-planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partition-planner.js","sourceRoot":"","sources":["../../../lib/partition-planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,367 @@
1
+ "use strict";
2
+ /**
3
+ * Phase Pipeline — Multi-phase workflows with approval gates
4
+ *
5
+ * Defines ordered execution phases. Each phase can optionally require human
6
+ * approval before proceeding. Phases may run their assigned agents in parallel
7
+ * or sequentially. Inspired by Claude Code's multi-phase orchestration pattern.
8
+ *
9
+ * @module PhasePipeline
10
+ * @version 1.0.0
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PhasePipeline = void 0;
14
+ const fs_1 = require("fs");
15
+ const path_1 = require("path");
16
+ // ============================================================================
17
+ // PHASE PIPELINE
18
+ // ============================================================================
19
+ /**
20
+ * Orchestrates multi-phase workflows with optional approval gates.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const pipeline = new PhasePipeline(registry, baseContext, {
25
+ * phases: [
26
+ * { name: 'research', agents: ['researcher'], parallel: false },
27
+ * { name: 'review', agents: ['reviewer-a', 'reviewer-b'], parallel: true, requiresApproval: true },
28
+ * { name: 'publish', agents: ['publisher'] },
29
+ * ],
30
+ * onApproval: async (name, result) => {
31
+ * // In production: prompt the user
32
+ * return { approved: true, approvedBy: 'admin' };
33
+ * },
34
+ * });
35
+ *
36
+ * const result = await pipeline.run();
37
+ * ```
38
+ */
39
+ class PhasePipeline {
40
+ registry;
41
+ baseContext;
42
+ options;
43
+ phaseResults = [];
44
+ _status = 'idle';
45
+ /** Running count of compactions for this pipeline run. */
46
+ _compactionCount = 0;
47
+ /** Summary produced by the most recent compaction, or null. */
48
+ _lastCompactionSummary = null;
49
+ constructor(registry, baseContext, options) {
50
+ if (!options.phases.length) {
51
+ throw new Error('PhasePipeline requires at least one phase');
52
+ }
53
+ const names = new Set();
54
+ for (const p of options.phases) {
55
+ if (names.has(p.name)) {
56
+ throw new Error(`Duplicate phase name: "${p.name}"`);
57
+ }
58
+ names.add(p.name);
59
+ }
60
+ this.registry = registry;
61
+ this.baseContext = baseContext;
62
+ this.options = options;
63
+ }
64
+ /** Current pipeline status */
65
+ get status() {
66
+ return this._status;
67
+ }
68
+ /** Results from all executed phases (even if pipeline was aborted) */
69
+ get results() {
70
+ return this.phaseResults;
71
+ }
72
+ /** Phase definitions */
73
+ get phases() {
74
+ return this.options.phases;
75
+ }
76
+ /**
77
+ * Execute the entire pipeline, phase by phase.
78
+ *
79
+ * For each phase:
80
+ * 1. Run all assigned agents (parallel or sequential)
81
+ * 2. If `requiresApproval`, call the approval callback and wait
82
+ * 3. If rejected, stop the pipeline
83
+ * 4. Otherwise move to the next phase
84
+ */
85
+ async run(defaultPayload) {
86
+ const pipelineStart = Date.now();
87
+ this._status = 'running';
88
+ this.phaseResults = [];
89
+ // ── Checkpoint resume ─────────────────────────────────────────────────
90
+ const startIndex = this._loadCheckpoint();
91
+ // ── End checkpoint resume ─────────────────────────────────────────────
92
+ for (let i = startIndex; i < this.options.phases.length; i++) {
93
+ const phaseDef = this.options.phases[i];
94
+ this.options.onPhaseStart?.(phaseDef.name, i);
95
+ const phaseStart = Date.now();
96
+ const agentResults = new Map();
97
+ let phaseStatus;
98
+ // --- Execute agents -------------------------------------------------
99
+ try {
100
+ if (phaseDef.parallel) {
101
+ const executions = phaseDef.agents.map(agentId => {
102
+ const payload = this.buildPayload(agentId, phaseDef, defaultPayload);
103
+ const ctx = { ...this.baseContext, metadata: { ...this.baseContext.metadata, phase: phaseDef.name } };
104
+ return this.executeWithTimeout(agentId, payload, ctx, phaseDef.timeoutMs)
105
+ .then(result => ({ agentId, result }));
106
+ });
107
+ const results = await Promise.all(executions);
108
+ for (const { agentId, result } of results) {
109
+ agentResults.set(agentId, result);
110
+ }
111
+ }
112
+ else {
113
+ for (const agentId of phaseDef.agents) {
114
+ const payload = this.buildPayload(agentId, phaseDef, defaultPayload);
115
+ const ctx = { ...this.baseContext, metadata: { ...this.baseContext.metadata, phase: phaseDef.name } };
116
+ const result = await this.executeWithTimeout(agentId, payload, ctx, phaseDef.timeoutMs);
117
+ agentResults.set(agentId, result);
118
+ if (!result.success)
119
+ break; // stop this phase on first failure
120
+ }
121
+ }
122
+ // Check if any agent failed
123
+ const anyFailed = Array.from(agentResults.values()).some(r => !r.success);
124
+ phaseStatus = anyFailed ? 'failed' : 'completed';
125
+ }
126
+ catch (err) {
127
+ phaseStatus = 'failed';
128
+ }
129
+ const phaseResult = {
130
+ phaseName: phaseDef.name,
131
+ status: phaseStatus,
132
+ agentResults,
133
+ durationMs: Date.now() - phaseStart,
134
+ };
135
+ // --- Check failure --------------------------------------------------
136
+ if (phaseStatus === 'failed') {
137
+ phaseResult.status = 'failed';
138
+ this.phaseResults.push(phaseResult);
139
+ this.options.onPhaseComplete?.(phaseResult, i);
140
+ this._saveCheckpoint(i); // save so resume can retry from this phase
141
+ this._status = 'failed';
142
+ return {
143
+ success: false,
144
+ phases: this.phaseResults,
145
+ totalMs: Date.now() - pipelineStart,
146
+ stoppedAt: phaseDef.name,
147
+ stopReason: 'Phase failed',
148
+ };
149
+ }
150
+ // --- Approval gate --------------------------------------------------
151
+ if (phaseDef.requiresApproval) {
152
+ phaseResult.status = 'awaiting_approval';
153
+ const pipelineCtx = {
154
+ completedPhases: [...this.phaseResults],
155
+ currentPhaseIndex: i,
156
+ totalPhases: this.options.phases.length,
157
+ };
158
+ let approval;
159
+ if (this.options.autoApprove) {
160
+ approval = { approved: true, approvedBy: 'auto' };
161
+ }
162
+ else if (this.options.onApproval) {
163
+ const timeoutMs = this.options.approvalTimeoutMs ?? 300_000;
164
+ const timeoutError = new Error(`Approval timeout: phase "${phaseDef.name}" did not receive a decision within ${timeoutMs}ms`);
165
+ approval = await Promise.race([
166
+ this.options.onApproval(phaseDef.name, phaseResult, pipelineCtx),
167
+ new Promise((_, reject) => setTimeout(() => reject(timeoutError), timeoutMs)),
168
+ ]).catch((err) => ({
169
+ approved: false,
170
+ reason: err instanceof Error ? err.message : 'Approval callback failed',
171
+ }));
172
+ }
173
+ else {
174
+ // No approval handler and not auto-approved → reject by default
175
+ approval = { approved: false, reason: 'No approval callback configured' };
176
+ }
177
+ phaseResult.approval = {
178
+ approvedBy: approval.approvedBy,
179
+ reason: approval.reason,
180
+ timestamp: Date.now(),
181
+ };
182
+ if (!approval.approved) {
183
+ phaseResult.status = 'rejected';
184
+ this.phaseResults.push(phaseResult);
185
+ this.options.onPhaseComplete?.(phaseResult, i);
186
+ this._saveCheckpoint(i); // save so resume can retry from this phase
187
+ this._status = 'rejected';
188
+ return {
189
+ success: false,
190
+ phases: this.phaseResults,
191
+ totalMs: Date.now() - pipelineStart,
192
+ stoppedAt: phaseDef.name,
193
+ stopReason: approval.reason ?? 'Approval rejected',
194
+ };
195
+ }
196
+ phaseResult.status = 'approved';
197
+ }
198
+ this.phaseResults.push(phaseResult);
199
+ this.options.onPhaseComplete?.(phaseResult, i);
200
+ this._saveCheckpoint(i + 1); // advance checkpoint to next phase
201
+ // ── Trajectory compaction ─────────────────────────────────────────────
202
+ if (this.options.compaction) {
203
+ await this._maybeCompact();
204
+ }
205
+ // ── End compaction ────────────────────────────────────────────────────
206
+ }
207
+ this._status = 'completed';
208
+ return {
209
+ success: true,
210
+ phases: this.phaseResults,
211
+ totalMs: Date.now() - pipelineStart,
212
+ };
213
+ }
214
+ /** The summary produced by the last compaction, or `null` if none has occurred. */
215
+ get lastCompactionSummary() {
216
+ return this._lastCompactionSummary;
217
+ }
218
+ /** Total number of compactions performed so far in this run. */
219
+ get compactionCount() {
220
+ return this._compactionCount;
221
+ }
222
+ /**
223
+ * Reset the pipeline for re-execution.
224
+ */
225
+ reset() {
226
+ this.phaseResults = [];
227
+ this._status = 'idle';
228
+ this._compactionCount = 0;
229
+ this._lastCompactionSummary = null;
230
+ }
231
+ // --------------------------------------------------------------------------
232
+ // Checkpoint / resume
233
+ // --------------------------------------------------------------------------
234
+ /**
235
+ * Save the current pipeline state to the checkpoint file.
236
+ * Called automatically after each phase when `checkpointPath` is set.
237
+ * @internal
238
+ */
239
+ _saveCheckpoint(nextPhaseIndex) {
240
+ const path = this.options.checkpointPath;
241
+ if (!path)
242
+ return;
243
+ const resolved = (0, path_1.resolve)(path);
244
+ const dir = (0, path_1.dirname)(resolved);
245
+ try {
246
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
247
+ const checkpoint = {
248
+ version: 1,
249
+ savedAt: new Date().toISOString(),
250
+ nextPhaseIndex,
251
+ completedPhases: this.phaseResults.map(pr => ({
252
+ phaseName: pr.phaseName,
253
+ status: pr.status,
254
+ agentResults: Array.from(pr.agentResults.entries()),
255
+ durationMs: pr.durationMs,
256
+ approval: pr.approval,
257
+ })),
258
+ };
259
+ (0, fs_1.writeFileSync)(resolved, JSON.stringify(checkpoint, null, 2), 'utf-8');
260
+ }
261
+ catch {
262
+ // Non-fatal — checkpoint write failure should not abort the pipeline
263
+ }
264
+ }
265
+ /**
266
+ * Load a checkpoint from disk and restore phase results + next phase index.
267
+ * Returns the index of the next phase to run (0 if no checkpoint).
268
+ * @internal
269
+ */
270
+ _loadCheckpoint() {
271
+ const path = this.options.checkpointPath;
272
+ if (!path)
273
+ return 0;
274
+ const resolved = (0, path_1.resolve)(path);
275
+ if (!(0, fs_1.existsSync)(resolved))
276
+ return 0;
277
+ try {
278
+ const raw = (0, fs_1.readFileSync)(resolved, 'utf-8');
279
+ const cp = JSON.parse(raw);
280
+ if (cp.version !== 1)
281
+ return 0;
282
+ this.phaseResults = cp.completedPhases.map(pr => ({
283
+ phaseName: pr.phaseName,
284
+ status: pr.status,
285
+ agentResults: new Map(pr.agentResults),
286
+ durationMs: pr.durationMs,
287
+ approval: pr.approval,
288
+ }));
289
+ return cp.nextPhaseIndex;
290
+ }
291
+ catch {
292
+ return 0;
293
+ }
294
+ }
295
+ /**
296
+ * Delete the checkpoint file for this pipeline (or any given path).
297
+ * Call this after a successful pipeline run to clean up.
298
+ *
299
+ * @example
300
+ * ```typescript
301
+ * const result = await pipeline.run();
302
+ * if (result.success) PhasePipeline.clearCheckpoint('./data/my-pipeline.checkpoint.json');
303
+ * ```
304
+ */
305
+ static clearCheckpoint(checkpointPath) {
306
+ const resolved = (0, path_1.resolve)(checkpointPath);
307
+ if ((0, fs_1.existsSync)(resolved)) {
308
+ try {
309
+ const { unlinkSync } = require('fs');
310
+ unlinkSync(resolved);
311
+ }
312
+ catch { /* ignore */ }
313
+ }
314
+ }
315
+ // --------------------------------------------------------------------------
316
+ // Private helpers
317
+ // --------------------------------------------------------------------------
318
+ /** @internal */
319
+ async _maybeCompact() {
320
+ const opts = this.options.compaction;
321
+ const threshold = opts.thresholdChars ?? 50_000;
322
+ let size = 0;
323
+ for (const pr of this.phaseResults) {
324
+ try {
325
+ size += JSON.stringify({ n: pr.phaseName, r: Array.from(pr.agentResults.values()) }).length;
326
+ }
327
+ catch {
328
+ // ignore serialisation errors
329
+ }
330
+ }
331
+ if (size <= threshold)
332
+ return;
333
+ const summary = await opts.summarize(this.phaseResults);
334
+ this._compactionCount++;
335
+ this._lastCompactionSummary = summary;
336
+ // Capture full history before it is replaced so callers can archive it
337
+ const archivedPhases = [...this.phaseResults];
338
+ // Replace the full history with a single compact stub phase
339
+ const stub = {
340
+ phaseName: `__compacted_${this._compactionCount}`,
341
+ status: 'completed',
342
+ agentResults: new Map([
343
+ ['__summary', { success: true, data: summary, metadata: { compacted: true, compactionCount: this._compactionCount } }],
344
+ ]),
345
+ durationMs: 0,
346
+ };
347
+ this.phaseResults = [stub];
348
+ opts.onCompact?.(summary, this._compactionCount, archivedPhases);
349
+ }
350
+ buildPayload(agentId, phase, defaultPayload) {
351
+ if (phase.payloadFactory) {
352
+ return phase.payloadFactory(agentId, this.phaseResults);
353
+ }
354
+ return defaultPayload ?? { action: phase.name, params: {} };
355
+ }
356
+ async executeWithTimeout(agentId, payload, ctx, timeoutMs) {
357
+ if (!timeoutMs) {
358
+ return this.registry.executeAgent(agentId, payload, ctx);
359
+ }
360
+ return Promise.race([
361
+ this.registry.executeAgent(agentId, payload, ctx),
362
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Phase timeout: agent "${agentId}" exceeded ${timeoutMs}ms`)), timeoutMs)),
363
+ ]);
364
+ }
365
+ }
366
+ exports.PhasePipeline = PhasePipeline;
367
+ //# sourceMappingURL=phase-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-pipeline.js","sourceRoot":"","sources":["../../../lib/phase-pipeline.ts"],"names":[],"mappings":"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"}