network-ai 5.10.2 → 5.11.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.
- package/INTEGRATION_GUIDE.md +2 -2
- package/README.md +5 -3
- package/SKILL.md +3 -3
- package/dist/esm/adapters/a2a-adapter.js +235 -0
- package/dist/esm/adapters/a2a-adapter.js.map +1 -0
- package/dist/esm/adapters/adapter-registry.js +613 -0
- package/dist/esm/adapters/adapter-registry.js.map +1 -0
- package/dist/esm/adapters/agno-adapter.js +140 -0
- package/dist/esm/adapters/agno-adapter.js.map +1 -0
- package/dist/esm/adapters/anthropic-computer-use-adapter.js +180 -0
- package/dist/esm/adapters/anthropic-computer-use-adapter.js.map +1 -0
- package/dist/esm/adapters/aps-adapter.js +289 -0
- package/dist/esm/adapters/aps-adapter.js.map +1 -0
- package/dist/esm/adapters/autogen-adapter.js +141 -0
- package/dist/esm/adapters/autogen-adapter.js.map +1 -0
- package/dist/esm/adapters/base-adapter.js +104 -0
- package/dist/esm/adapters/base-adapter.js.map +1 -0
- package/dist/esm/adapters/browser-agent-adapter.js +219 -0
- package/dist/esm/adapters/browser-agent-adapter.js.map +1 -0
- package/dist/esm/adapters/codex-adapter.js +318 -0
- package/dist/esm/adapters/codex-adapter.js.map +1 -0
- package/dist/esm/adapters/copilot-adapter.js +132 -0
- package/dist/esm/adapters/copilot-adapter.js.map +1 -0
- package/dist/esm/adapters/crewai-adapter.js +148 -0
- package/dist/esm/adapters/crewai-adapter.js.map +1 -0
- package/dist/esm/adapters/custom-adapter.js +142 -0
- package/dist/esm/adapters/custom-adapter.js.map +1 -0
- package/dist/esm/adapters/custom-streaming-adapter.js +181 -0
- package/dist/esm/adapters/custom-streaming-adapter.js.map +1 -0
- package/dist/esm/adapters/dspy-adapter.js +127 -0
- package/dist/esm/adapters/dspy-adapter.js.map +1 -0
- package/dist/esm/adapters/haystack-adapter.js +149 -0
- package/dist/esm/adapters/haystack-adapter.js.map +1 -0
- package/dist/esm/adapters/hermes-adapter.js +217 -0
- package/dist/esm/adapters/hermes-adapter.js.map +1 -0
- package/dist/esm/adapters/index.js +109 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/langchain-adapter.js +134 -0
- package/dist/esm/adapters/langchain-adapter.js.map +1 -0
- package/dist/esm/adapters/langchain-streaming-adapter.js +161 -0
- package/dist/esm/adapters/langchain-streaming-adapter.js.map +1 -0
- package/dist/esm/adapters/langgraph-adapter.js +119 -0
- package/dist/esm/adapters/langgraph-adapter.js.map +1 -0
- package/dist/esm/adapters/llamaindex-adapter.js +135 -0
- package/dist/esm/adapters/llamaindex-adapter.js.map +1 -0
- package/dist/esm/adapters/mcp-adapter.js +200 -0
- package/dist/esm/adapters/mcp-adapter.js.map +1 -0
- package/dist/esm/adapters/minimax-adapter.js +233 -0
- package/dist/esm/adapters/minimax-adapter.js.map +1 -0
- package/dist/esm/adapters/nemoclaw-adapter.js +465 -0
- package/dist/esm/adapters/nemoclaw-adapter.js.map +1 -0
- package/dist/esm/adapters/openai-agents-adapter.js +118 -0
- package/dist/esm/adapters/openai-agents-adapter.js.map +1 -0
- package/dist/esm/adapters/openai-assistants-adapter.js +130 -0
- package/dist/esm/adapters/openai-assistants-adapter.js.map +1 -0
- package/dist/esm/adapters/openclaw-adapter.js +107 -0
- package/dist/esm/adapters/openclaw-adapter.js.map +1 -0
- package/dist/esm/adapters/orchestrator-adapter.js +218 -0
- package/dist/esm/adapters/orchestrator-adapter.js.map +1 -0
- package/dist/esm/adapters/pydantic-ai-adapter.js +163 -0
- package/dist/esm/adapters/pydantic-ai-adapter.js.map +1 -0
- package/dist/esm/adapters/rlm-adapter.js +167 -0
- package/dist/esm/adapters/rlm-adapter.js.map +1 -0
- package/dist/esm/adapters/semantic-kernel-adapter.js +123 -0
- package/dist/esm/adapters/semantic-kernel-adapter.js.map +1 -0
- package/dist/esm/adapters/streaming-base-adapter.js +74 -0
- package/dist/esm/adapters/streaming-base-adapter.js.map +1 -0
- package/dist/esm/adapters/vertex-ai-adapter.js +166 -0
- package/dist/esm/adapters/vertex-ai-adapter.js.map +1 -0
- package/dist/esm/demo-control-plane.js +147 -0
- package/dist/esm/demo-control-plane.js.map +1 -0
- package/dist/esm/demo-worktree-dashboard.js +131 -0
- package/dist/esm/demo-worktree-dashboard.js.map +1 -0
- package/dist/esm/examples/01-hello-swarm.js +165 -0
- package/dist/esm/examples/01-hello-swarm.js.map +1 -0
- package/dist/esm/examples/02-fsm-pipeline.js +189 -0
- package/dist/esm/examples/02-fsm-pipeline.js.map +1 -0
- package/dist/esm/examples/03-parallel-agents.js +192 -0
- package/dist/esm/examples/03-parallel-agents.js.map +1 -0
- package/dist/esm/examples/05-code-review-swarm.js +1177 -0
- package/dist/esm/examples/05-code-review-swarm.js.map +1 -0
- package/dist/esm/examples/06-ai-pipeline-demo.js +263 -0
- package/dist/esm/examples/06-ai-pipeline-demo.js.map +1 -0
- package/dist/esm/examples/07-full-showcase.js +946 -0
- package/dist/esm/examples/07-full-showcase.js.map +1 -0
- package/dist/esm/examples/08-control-plane-stress-demo.js +186 -0
- package/dist/esm/examples/08-control-plane-stress-demo.js.map +1 -0
- package/dist/esm/examples/09-real-langchain.js +231 -0
- package/dist/esm/examples/09-real-langchain.js.map +1 -0
- package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js +270 -0
- package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
- package/dist/esm/examples/demo-runner.js +119 -0
- package/dist/esm/examples/demo-runner.js.map +1 -0
- package/dist/esm/index.js +1352 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/adapter-hooks.js +216 -0
- package/dist/esm/lib/adapter-hooks.js.map +1 -0
- package/dist/esm/lib/adapter-test-harness.js +118 -0
- package/dist/esm/lib/adapter-test-harness.js.map +1 -0
- package/dist/esm/lib/agent-conversation.js +155 -0
- package/dist/esm/lib/agent-conversation.js.map +1 -0
- package/dist/esm/lib/agent-debate.js +146 -0
- package/dist/esm/lib/agent-debate.js.map +1 -0
- package/dist/esm/lib/agent-memory.js +336 -0
- package/dist/esm/lib/agent-memory.js.map +1 -0
- package/dist/esm/lib/agent-runtime.js +818 -0
- package/dist/esm/lib/agent-runtime.js.map +1 -0
- package/dist/esm/lib/agent-vcr.js +218 -0
- package/dist/esm/lib/agent-vcr.js.map +1 -0
- package/dist/esm/lib/anomaly-detector.js +178 -0
- package/dist/esm/lib/anomaly-detector.js.map +1 -0
- package/dist/esm/lib/approval-inbox.js +385 -0
- package/dist/esm/lib/approval-inbox.js.map +1 -0
- package/dist/esm/lib/auth-guardian.js +692 -0
- package/dist/esm/lib/auth-guardian.js.map +1 -0
- package/dist/esm/lib/auth-validator.js +32 -0
- package/dist/esm/lib/auth-validator.js.map +1 -0
- package/dist/esm/lib/blackboard-backend-crdt.js +251 -0
- package/dist/esm/lib/blackboard-backend-crdt.js.map +1 -0
- package/dist/esm/lib/blackboard-backend-redis.js +244 -0
- package/dist/esm/lib/blackboard-backend-redis.js.map +1 -0
- package/dist/esm/lib/blackboard-backend.js +141 -0
- package/dist/esm/lib/blackboard-backend.js.map +1 -0
- package/dist/esm/lib/blackboard-validator.js +985 -0
- package/dist/esm/lib/blackboard-validator.js.map +1 -0
- package/dist/esm/lib/circuit-breaker.js +164 -0
- package/dist/esm/lib/circuit-breaker.js.map +1 -0
- package/dist/esm/lib/claim-verifier.js +173 -0
- package/dist/esm/lib/claim-verifier.js.map +1 -0
- package/dist/esm/lib/comparison-runner.js +138 -0
- package/dist/esm/lib/comparison-runner.js.map +1 -0
- package/dist/esm/lib/compliance-monitor.js +261 -0
- package/dist/esm/lib/compliance-monitor.js.map +1 -0
- package/dist/esm/lib/confidence-filter.js +210 -0
- package/dist/esm/lib/confidence-filter.js.map +1 -0
- package/dist/esm/lib/config-watcher.js +215 -0
- package/dist/esm/lib/config-watcher.js.map +1 -0
- package/dist/esm/lib/consistency.js +274 -0
- package/dist/esm/lib/consistency.js.map +1 -0
- package/dist/esm/lib/console-ui.js +276 -0
- package/dist/esm/lib/console-ui.js.map +1 -0
- package/dist/esm/lib/context-throttler.js +171 -0
- package/dist/esm/lib/context-throttler.js.map +1 -0
- package/dist/esm/lib/control-plane.js +527 -0
- package/dist/esm/lib/control-plane.js.map +1 -0
- package/dist/esm/lib/cost-governor.js +128 -0
- package/dist/esm/lib/cost-governor.js.map +1 -0
- package/dist/esm/lib/cost-heatmap.js +161 -0
- package/dist/esm/lib/cost-heatmap.js.map +1 -0
- package/dist/esm/lib/coverage-gate.js +213 -0
- package/dist/esm/lib/coverage-gate.js.map +1 -0
- package/dist/esm/lib/coverage-reporter.js +177 -0
- package/dist/esm/lib/coverage-reporter.js.map +1 -0
- package/dist/esm/lib/crdt.js +141 -0
- package/dist/esm/lib/crdt.js.map +1 -0
- package/dist/esm/lib/dashboard-server.js +403 -0
- package/dist/esm/lib/dashboard-server.js.map +1 -0
- package/dist/esm/lib/dry-run.js +130 -0
- package/dist/esm/lib/dry-run.js.map +1 -0
- package/dist/esm/lib/env-manager.js +518 -0
- package/dist/esm/lib/env-manager.js.map +1 -0
- package/dist/esm/lib/errors.js +201 -0
- package/dist/esm/lib/errors.js.map +1 -0
- package/dist/esm/lib/event-bus.js +229 -0
- package/dist/esm/lib/event-bus.js.map +1 -0
- package/dist/esm/lib/explainability.js +102 -0
- package/dist/esm/lib/explainability.js.map +1 -0
- package/dist/esm/lib/fan-out.js +237 -0
- package/dist/esm/lib/fan-out.js.map +1 -0
- package/dist/esm/lib/federated-budget.js +322 -0
- package/dist/esm/lib/federated-budget.js.map +1 -0
- package/dist/esm/lib/fsm-journey.js +478 -0
- package/dist/esm/lib/fsm-journey.js.map +1 -0
- package/dist/esm/lib/goal-decomposer.js +698 -0
- package/dist/esm/lib/goal-decomposer.js.map +1 -0
- package/dist/esm/lib/goal-dsl.js +391 -0
- package/dist/esm/lib/goal-dsl.js.map +1 -0
- package/dist/esm/lib/job-queue.js +310 -0
- package/dist/esm/lib/job-queue.js.map +1 -0
- package/dist/esm/lib/landscape-agent.js +134 -0
- package/dist/esm/lib/landscape-agent.js.map +1 -0
- package/dist/esm/lib/learning-loop.js +181 -0
- package/dist/esm/lib/learning-loop.js.map +1 -0
- package/dist/esm/lib/lifecycle-hooks.js +148 -0
- package/dist/esm/lib/lifecycle-hooks.js.map +1 -0
- package/dist/esm/lib/locked-blackboard.js +1295 -0
- package/dist/esm/lib/locked-blackboard.js.map +1 -0
- package/dist/esm/lib/logger.js +150 -0
- package/dist/esm/lib/logger.js.map +1 -0
- package/dist/esm/lib/mcp-blackboard-tools.js +298 -0
- package/dist/esm/lib/mcp-blackboard-tools.js.map +1 -0
- package/dist/esm/lib/mcp-bridge.js +357 -0
- package/dist/esm/lib/mcp-bridge.js.map +1 -0
- package/dist/esm/lib/mcp-tool-consumer.js +287 -0
- package/dist/esm/lib/mcp-tool-consumer.js.map +1 -0
- package/dist/esm/lib/mcp-tools-control.js +392 -0
- package/dist/esm/lib/mcp-tools-control.js.map +1 -0
- package/dist/esm/lib/mcp-tools-extended.js +371 -0
- package/dist/esm/lib/mcp-tools-extended.js.map +1 -0
- package/dist/esm/lib/mcp-transport-http.js +528 -0
- package/dist/esm/lib/mcp-transport-http.js.map +1 -0
- package/dist/esm/lib/mcp-transport-sse.js +503 -0
- package/dist/esm/lib/mcp-transport-sse.js.map +1 -0
- package/dist/esm/lib/metrics.js +284 -0
- package/dist/esm/lib/metrics.js.map +1 -0
- package/dist/esm/lib/orchestrator-types.js +66 -0
- package/dist/esm/lib/orchestrator-types.js.map +1 -0
- package/dist/esm/lib/otel-bridge.js +167 -0
- package/dist/esm/lib/otel-bridge.js.map +1 -0
- package/dist/esm/lib/partition-planner.js +246 -0
- package/dist/esm/lib/partition-planner.js.map +1 -0
- package/dist/esm/lib/phase-pipeline.js +367 -0
- package/dist/esm/lib/phase-pipeline.js.map +1 -0
- package/dist/esm/lib/playground.js +224 -0
- package/dist/esm/lib/playground.js.map +1 -0
- package/dist/esm/lib/qa-orchestrator.js +296 -0
- package/dist/esm/lib/qa-orchestrator.js.map +1 -0
- package/dist/esm/lib/quadtree.js +259 -0
- package/dist/esm/lib/quadtree.js.map +1 -0
- package/dist/esm/lib/route-classifier.js +217 -0
- package/dist/esm/lib/route-classifier.js.map +1 -0
- package/dist/esm/lib/semantic-search.js +235 -0
- package/dist/esm/lib/semantic-search.js.map +1 -0
- package/dist/esm/lib/shared-blackboard.js +249 -0
- package/dist/esm/lib/shared-blackboard.js.map +1 -0
- package/dist/esm/lib/skill-composer.js +190 -0
- package/dist/esm/lib/skill-composer.js.map +1 -0
- package/dist/esm/lib/speculative-executor.js +107 -0
- package/dist/esm/lib/speculative-executor.js.map +1 -0
- package/dist/esm/lib/strategy-agent.js +626 -0
- package/dist/esm/lib/strategy-agent.js.map +1 -0
- package/dist/esm/lib/swarm-transport.js +307 -0
- package/dist/esm/lib/swarm-transport.js.map +1 -0
- package/dist/esm/lib/swarm-utils.js +510 -0
- package/dist/esm/lib/swarm-utils.js.map +1 -0
- package/dist/esm/lib/task-decomposer.js +272 -0
- package/dist/esm/lib/task-decomposer.js.map +1 -0
- package/dist/esm/lib/telemetry-provider.js +207 -0
- package/dist/esm/lib/telemetry-provider.js.map +1 -0
- package/dist/esm/lib/timeline-scrubber.js +173 -0
- package/dist/esm/lib/timeline-scrubber.js.map +1 -0
- package/dist/esm/lib/topology.js +591 -0
- package/dist/esm/lib/topology.js.map +1 -0
- package/dist/esm/lib/transport-agent.js +366 -0
- package/dist/esm/lib/transport-agent.js.map +1 -0
- package/dist/esm/lib/work-tree-dashboard.js +583 -0
- package/dist/esm/lib/work-tree-dashboard.js.map +1 -0
- package/dist/esm/lib/work-tree-ui.js +333 -0
- package/dist/esm/lib/work-tree-ui.js.map +1 -0
- package/dist/esm/lib/work-tree.js +480 -0
- package/dist/esm/lib/work-tree.js.map +1 -0
- package/dist/esm/run.js +144 -0
- package/dist/esm/run.js.map +1 -0
- package/dist/esm/security.js +1122 -0
- package/dist/esm/security.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/mcp-transport-http.d.ts +203 -0
- package/dist/lib/mcp-transport-http.d.ts.map +1 -0
- package/dist/lib/mcp-transport-http.js +528 -0
- package/dist/lib/mcp-transport-http.js.map +1 -0
- package/dist/lib/phase-pipeline.d.ts +31 -0
- package/dist/lib/phase-pipeline.d.ts.map +1 -1
- package/dist/lib/phase-pipeline.js +93 -1
- package/dist/lib/phase-pipeline.js.map +1 -1
- package/dist/lib/semantic-search.d.ts +42 -6
- package/dist/lib/semantic-search.d.ts.map +1 -1
- package/dist/lib/semantic-search.js +87 -6
- package/dist/lib/semantic-search.js.map +1 -1
- 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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"}
|