network-ai 4.15.3 → 5.1.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 +12 -5
- package/QUICKSTART.md +32 -5
- package/README.md +42 -17
- package/bin/dashboard.ts +146 -0
- package/bin/mcp-server.ts +3 -2
- package/dist/adapters/adapter-registry.d.ts +33 -1
- package/dist/adapters/adapter-registry.d.ts.map +1 -1
- package/dist/adapters/adapter-registry.js +49 -0
- package/dist/adapters/adapter-registry.js.map +1 -1
- package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
- package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
- package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
- package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
- package/dist/adapters/browser-agent-adapter.d.ts +121 -0
- package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
- package/dist/adapters/browser-agent-adapter.js +219 -0
- package/dist/adapters/browser-agent-adapter.js.map +1 -0
- package/dist/adapters/copilot-adapter.d.ts +59 -0
- package/dist/adapters/copilot-adapter.d.ts.map +1 -0
- package/dist/adapters/copilot-adapter.js +132 -0
- package/dist/adapters/copilot-adapter.js.map +1 -0
- package/dist/adapters/custom-adapter.d.ts +1 -1
- package/dist/adapters/custom-adapter.js +1 -1
- package/dist/adapters/index.d.ts +17 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +25 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/langchain-adapter.js +1 -1
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/langgraph-adapter.d.ts +70 -0
- package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
- package/dist/adapters/langgraph-adapter.js +119 -0
- package/dist/adapters/langgraph-adapter.js.map +1 -0
- package/dist/adapters/mcp-adapter.d.ts +1 -1
- package/dist/adapters/mcp-adapter.js +3 -3
- package/dist/adapters/mcp-adapter.js.map +1 -1
- package/dist/adapters/openai-agents-adapter.d.ts +100 -0
- package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
- package/dist/adapters/openai-agents-adapter.js +118 -0
- package/dist/adapters/openai-agents-adapter.js.map +1 -0
- package/dist/adapters/openclaw-adapter.d.ts +1 -1
- package/dist/adapters/openclaw-adapter.js +3 -3
- package/dist/adapters/openclaw-adapter.js.map +1 -1
- package/dist/adapters/orchestrator-adapter.d.ts +118 -0
- package/dist/adapters/orchestrator-adapter.d.ts.map +1 -0
- package/dist/adapters/orchestrator-adapter.js +219 -0
- package/dist/adapters/orchestrator-adapter.js.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.js +163 -0
- package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
- package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
- package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/vertex-ai-adapter.js +166 -0
- package/dist/adapters/vertex-ai-adapter.js.map +1 -0
- package/dist/bin/dashboard.d.ts +11 -0
- package/dist/bin/dashboard.d.ts.map +1 -0
- package/dist/bin/dashboard.js +135 -0
- package/dist/bin/dashboard.js.map +1 -0
- package/dist/bin/mcp-server.js +3 -2
- package/dist/bin/mcp-server.js.map +1 -1
- package/dist/demo-control-plane.d.ts +12 -0
- package/dist/demo-control-plane.d.ts.map +1 -0
- package/dist/demo-control-plane.js +147 -0
- package/dist/demo-control-plane.js.map +1 -0
- package/dist/demo-worktree-dashboard.d.ts +2 -0
- package/dist/demo-worktree-dashboard.d.ts.map +1 -0
- package/dist/demo-worktree-dashboard.js +131 -0
- package/dist/demo-worktree-dashboard.js.map +1 -0
- package/dist/examples/01-hello-swarm.d.ts +13 -0
- package/dist/examples/01-hello-swarm.d.ts.map +1 -0
- package/dist/examples/01-hello-swarm.js +165 -0
- package/dist/examples/01-hello-swarm.js.map +1 -0
- package/dist/examples/02-fsm-pipeline.d.ts +20 -0
- package/dist/examples/02-fsm-pipeline.d.ts.map +1 -0
- package/dist/examples/02-fsm-pipeline.js +189 -0
- package/dist/examples/02-fsm-pipeline.js.map +1 -0
- package/dist/examples/03-parallel-agents.d.ts +21 -0
- package/dist/examples/03-parallel-agents.d.ts.map +1 -0
- package/dist/examples/03-parallel-agents.js +192 -0
- package/dist/examples/03-parallel-agents.js.map +1 -0
- package/dist/examples/05-code-review-swarm.d.ts +21 -0
- package/dist/examples/05-code-review-swarm.d.ts.map +1 -0
- package/dist/examples/05-code-review-swarm.js +1177 -0
- package/dist/examples/05-code-review-swarm.js.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts +24 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.js +263 -0
- package/dist/examples/06-ai-pipeline-demo.js.map +1 -0
- package/dist/examples/07-full-showcase.d.ts +27 -0
- package/dist/examples/07-full-showcase.d.ts.map +1 -0
- package/dist/examples/07-full-showcase.js +946 -0
- package/dist/examples/07-full-showcase.js.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts +19 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.js +186 -0
- package/dist/examples/08-control-plane-stress-demo.js.map +1 -0
- package/dist/examples/09-real-langchain.d.ts +19 -0
- package/dist/examples/09-real-langchain.d.ts.map +1 -0
- package/dist/examples/09-real-langchain.js +231 -0
- package/dist/examples/09-real-langchain.js.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts +16 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js +270 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
- package/dist/examples/demo-runner.d.ts +2 -0
- package/dist/examples/demo-runner.d.ts.map +1 -0
- package/dist/examples/demo-runner.js +119 -0
- package/dist/examples/demo-runner.js.map +1 -0
- package/dist/index.d.ts +113 -559
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +310 -1074
- package/dist/index.js.map +1 -1
- package/dist/lib/adapter-test-harness.d.ts +88 -0
- package/dist/lib/adapter-test-harness.d.ts.map +1 -0
- package/dist/lib/adapter-test-harness.js +118 -0
- package/dist/lib/adapter-test-harness.js.map +1 -0
- package/dist/lib/agent-conversation.d.ts +115 -0
- package/dist/lib/agent-conversation.d.ts.map +1 -0
- package/dist/lib/agent-conversation.js +155 -0
- package/dist/lib/agent-conversation.js.map +1 -0
- package/dist/lib/agent-debate.d.ts +115 -0
- package/dist/lib/agent-debate.d.ts.map +1 -0
- package/dist/lib/agent-debate.js +146 -0
- package/dist/lib/agent-debate.js.map +1 -0
- package/dist/lib/agent-memory.d.ts +157 -0
- package/dist/lib/agent-memory.d.ts.map +1 -0
- package/dist/lib/agent-memory.js +336 -0
- package/dist/lib/agent-memory.js.map +1 -0
- package/dist/lib/agent-vcr.d.ts +133 -0
- package/dist/lib/agent-vcr.d.ts.map +1 -0
- package/dist/lib/agent-vcr.js +218 -0
- package/dist/lib/agent-vcr.js.map +1 -0
- package/dist/lib/anomaly-detector.d.ts +112 -0
- package/dist/lib/anomaly-detector.d.ts.map +1 -0
- package/dist/lib/anomaly-detector.js +178 -0
- package/dist/lib/anomaly-detector.js.map +1 -0
- package/dist/lib/approval-inbox.d.ts +147 -0
- package/dist/lib/approval-inbox.d.ts.map +1 -0
- package/dist/lib/approval-inbox.js +385 -0
- package/dist/lib/approval-inbox.js.map +1 -0
- package/dist/lib/auth-guardian.d.ts +170 -0
- package/dist/lib/auth-guardian.d.ts.map +1 -0
- package/dist/lib/auth-guardian.js +604 -0
- package/dist/lib/auth-guardian.js.map +1 -0
- package/dist/lib/auth-validator.d.ts +70 -0
- package/dist/lib/auth-validator.d.ts.map +1 -0
- package/dist/lib/auth-validator.js +32 -0
- package/dist/lib/auth-validator.js.map +1 -0
- package/dist/lib/blackboard-validator.d.ts +56 -0
- package/dist/lib/blackboard-validator.d.ts.map +1 -1
- package/dist/lib/blackboard-validator.js +181 -4
- package/dist/lib/blackboard-validator.js.map +1 -1
- package/dist/lib/comparison-runner.d.ts +99 -0
- package/dist/lib/comparison-runner.d.ts.map +1 -0
- package/dist/lib/comparison-runner.js +138 -0
- package/dist/lib/comparison-runner.js.map +1 -0
- package/dist/lib/config-watcher.d.ts +109 -0
- package/dist/lib/config-watcher.d.ts.map +1 -0
- package/dist/lib/config-watcher.js +215 -0
- package/dist/lib/config-watcher.js.map +1 -0
- package/dist/lib/control-plane.d.ts +128 -0
- package/dist/lib/control-plane.d.ts.map +1 -0
- package/dist/lib/control-plane.js +527 -0
- package/dist/lib/control-plane.js.map +1 -0
- package/dist/lib/cost-governor.d.ts +105 -0
- package/dist/lib/cost-governor.d.ts.map +1 -0
- package/dist/lib/cost-governor.js +128 -0
- package/dist/lib/cost-governor.js.map +1 -0
- package/dist/lib/cost-heatmap.d.ts +104 -0
- package/dist/lib/cost-heatmap.d.ts.map +1 -0
- package/dist/lib/cost-heatmap.js +161 -0
- package/dist/lib/cost-heatmap.js.map +1 -0
- package/dist/lib/coverage-reporter.d.ts +92 -0
- package/dist/lib/coverage-reporter.d.ts.map +1 -0
- package/dist/lib/coverage-reporter.js +177 -0
- package/dist/lib/coverage-reporter.js.map +1 -0
- package/dist/lib/dashboard-server.d.ts +71 -0
- package/dist/lib/dashboard-server.d.ts.map +1 -0
- package/dist/lib/dashboard-server.js +403 -0
- package/dist/lib/dashboard-server.js.map +1 -0
- package/dist/lib/dry-run.d.ts +73 -0
- package/dist/lib/dry-run.d.ts.map +1 -0
- package/dist/lib/dry-run.js +130 -0
- package/dist/lib/dry-run.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +38 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/event-bus.d.ts +167 -0
- package/dist/lib/event-bus.d.ts.map +1 -0
- package/dist/lib/event-bus.js +229 -0
- package/dist/lib/event-bus.js.map +1 -0
- package/dist/lib/explainability.d.ts +85 -0
- package/dist/lib/explainability.d.ts.map +1 -0
- package/dist/lib/explainability.js +102 -0
- package/dist/lib/explainability.js.map +1 -0
- package/dist/lib/goal-dsl.d.ts +157 -0
- package/dist/lib/goal-dsl.d.ts.map +1 -0
- package/dist/lib/goal-dsl.js +391 -0
- package/dist/lib/goal-dsl.js.map +1 -0
- package/dist/lib/job-queue.d.ts +183 -0
- package/dist/lib/job-queue.d.ts.map +1 -0
- package/dist/lib/job-queue.js +310 -0
- package/dist/lib/job-queue.js.map +1 -0
- package/dist/lib/learning-loop.d.ts +113 -0
- package/dist/lib/learning-loop.d.ts.map +1 -0
- package/dist/lib/learning-loop.js +181 -0
- package/dist/lib/learning-loop.js.map +1 -0
- package/dist/lib/lifecycle-hooks.d.ts +116 -0
- package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
- package/dist/lib/lifecycle-hooks.js +148 -0
- package/dist/lib/lifecycle-hooks.js.map +1 -0
- package/dist/lib/locked-blackboard.d.ts.map +1 -1
- package/dist/lib/locked-blackboard.js +9 -5
- package/dist/lib/locked-blackboard.js.map +1 -1
- package/dist/lib/mcp-tool-consumer.d.ts +153 -0
- package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
- package/dist/lib/mcp-tool-consumer.js +320 -0
- package/dist/lib/mcp-tool-consumer.js.map +1 -0
- package/dist/lib/metrics.d.ts +119 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +284 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/orchestrator-types.d.ts +309 -0
- package/dist/lib/orchestrator-types.d.ts.map +1 -0
- package/dist/lib/orchestrator-types.js +61 -0
- package/dist/lib/orchestrator-types.js.map +1 -0
- package/dist/lib/otel-bridge.d.ts +74 -0
- package/dist/lib/otel-bridge.d.ts.map +1 -0
- package/dist/lib/otel-bridge.js +167 -0
- package/dist/lib/otel-bridge.js.map +1 -0
- package/dist/lib/playground.d.ts +76 -0
- package/dist/lib/playground.d.ts.map +1 -0
- package/dist/lib/playground.js +224 -0
- package/dist/lib/playground.js.map +1 -0
- package/dist/lib/quadtree.d.ts +114 -0
- package/dist/lib/quadtree.d.ts.map +1 -0
- package/dist/lib/quadtree.js +259 -0
- package/dist/lib/quadtree.js.map +1 -0
- package/dist/lib/shared-blackboard.d.ts +101 -0
- package/dist/lib/shared-blackboard.d.ts.map +1 -0
- package/dist/lib/shared-blackboard.js +249 -0
- package/dist/lib/shared-blackboard.js.map +1 -0
- package/dist/lib/speculative-executor.d.ts +89 -0
- package/dist/lib/speculative-executor.d.ts.map +1 -0
- package/dist/lib/speculative-executor.js +107 -0
- package/dist/lib/speculative-executor.js.map +1 -0
- package/dist/lib/swarm-transport.d.ts +150 -0
- package/dist/lib/swarm-transport.d.ts.map +1 -0
- package/dist/lib/swarm-transport.js +307 -0
- package/dist/lib/swarm-transport.js.map +1 -0
- package/dist/lib/task-decomposer.d.ts +41 -0
- package/dist/lib/task-decomposer.d.ts.map +1 -0
- package/dist/lib/task-decomposer.js +272 -0
- package/dist/lib/task-decomposer.js.map +1 -0
- package/dist/lib/timeline-scrubber.d.ts +84 -0
- package/dist/lib/timeline-scrubber.d.ts.map +1 -0
- package/dist/lib/timeline-scrubber.js +173 -0
- package/dist/lib/timeline-scrubber.js.map +1 -0
- package/dist/lib/topology.d.ts +361 -0
- package/dist/lib/topology.d.ts.map +1 -0
- package/dist/lib/topology.js +591 -0
- package/dist/lib/topology.js.map +1 -0
- package/dist/lib/work-tree-dashboard.d.ts +130 -0
- package/dist/lib/work-tree-dashboard.d.ts.map +1 -0
- package/dist/lib/work-tree-dashboard.js +583 -0
- package/dist/lib/work-tree-dashboard.js.map +1 -0
- package/dist/lib/work-tree-ui.d.ts +107 -0
- package/dist/lib/work-tree-ui.d.ts.map +1 -0
- package/dist/lib/work-tree-ui.js +333 -0
- package/dist/lib/work-tree-ui.js.map +1 -0
- package/dist/lib/work-tree.d.ts +184 -0
- package/dist/lib/work-tree.d.ts.map +1 -0
- package/dist/lib/work-tree.js +480 -0
- package/dist/lib/work-tree.js.map +1 -0
- package/dist/security.d.ts +95 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +267 -4
- package/dist/security.js.map +1 -1
- package/package.json +8 -6
- package/types/agent-adapter.d.ts +5 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkTreeUI — Terminal renderer for WorkTree hierarchies
|
|
3
|
+
*
|
|
4
|
+
* Renders a WorkTree as an ASCII/Unicode tree with:
|
|
5
|
+
* - Box-drawing connectors (├─, └─, │)
|
|
6
|
+
* - Status icons and color-coding
|
|
7
|
+
* - Progress bars per branch node
|
|
8
|
+
* - Token counts
|
|
9
|
+
* - Agent assignments
|
|
10
|
+
* - Live auto-refresh mode via WorkTree events
|
|
11
|
+
*
|
|
12
|
+
* Zero external dependencies — uses the {@link ansi} helpers from ConsoleUI.
|
|
13
|
+
*
|
|
14
|
+
* @module WorkTreeUI
|
|
15
|
+
* @version 1.0.0
|
|
16
|
+
*/
|
|
17
|
+
import { EventEmitter } from 'events';
|
|
18
|
+
import type { WorkTree, WorkTreeStats } from './work-tree';
|
|
19
|
+
/** Render options for WorkTreeUI */
|
|
20
|
+
export interface WorkTreeUIOptions {
|
|
21
|
+
/** Output stream (default: process.stdout) */
|
|
22
|
+
output?: NodeJS.WritableStream;
|
|
23
|
+
/** Show token counts (default: true) */
|
|
24
|
+
showTokens?: boolean;
|
|
25
|
+
/** Show agent assignments (default: true) */
|
|
26
|
+
showAgents?: boolean;
|
|
27
|
+
/** Show progress bars (default: true) */
|
|
28
|
+
showProgress?: boolean;
|
|
29
|
+
/** Show stats footer (default: true) */
|
|
30
|
+
showStats?: boolean;
|
|
31
|
+
/** Progress bar width in characters (default: 10) */
|
|
32
|
+
progressBarWidth?: number;
|
|
33
|
+
/** Use color output (default: true) */
|
|
34
|
+
useColor?: boolean;
|
|
35
|
+
/** Indent size per depth level (default: 2) */
|
|
36
|
+
indentSize?: number;
|
|
37
|
+
/** Title override (default: root label) */
|
|
38
|
+
title?: string;
|
|
39
|
+
/** Compact mode — hide nodes at depth > maxDepth (default: Infinity) */
|
|
40
|
+
maxDepth?: number;
|
|
41
|
+
/** Auto-refresh on WorkTree events (default: false) */
|
|
42
|
+
live?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/** Column-aligned render result for programmatic use */
|
|
45
|
+
export interface RenderResult {
|
|
46
|
+
/** The rendered tree as a single string */
|
|
47
|
+
text: string;
|
|
48
|
+
/** Number of lines rendered */
|
|
49
|
+
lineCount: number;
|
|
50
|
+
/** Stats snapshot at render time */
|
|
51
|
+
stats: WorkTreeStats;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Terminal renderer for {@link WorkTree} hierarchies.
|
|
55
|
+
*
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const tree = new WorkTree('root', 'My Project');
|
|
58
|
+
* // ... add children, set statuses ...
|
|
59
|
+
*
|
|
60
|
+
* const ui = new WorkTreeUI(tree);
|
|
61
|
+
* ui.render(); // print to stdout
|
|
62
|
+
*
|
|
63
|
+
* const result = ui.toString(); // get as string
|
|
64
|
+
*
|
|
65
|
+
* ui.startLive(); // auto-refresh on changes
|
|
66
|
+
* ui.stopLive();
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export declare class WorkTreeUI extends EventEmitter {
|
|
70
|
+
private readonly tree;
|
|
71
|
+
private readonly opts;
|
|
72
|
+
private liveCleanup;
|
|
73
|
+
private lastLineCount;
|
|
74
|
+
constructor(tree: WorkTree, options?: WorkTreeUIOptions);
|
|
75
|
+
/**
|
|
76
|
+
* Render the tree to the output stream.
|
|
77
|
+
* In live mode this clears previous output first.
|
|
78
|
+
*/
|
|
79
|
+
render(): RenderResult;
|
|
80
|
+
/**
|
|
81
|
+
* Return the rendered tree as a string (no side effects).
|
|
82
|
+
*/
|
|
83
|
+
toString(): string;
|
|
84
|
+
/**
|
|
85
|
+
* Start live mode — auto-refresh whenever the tree changes.
|
|
86
|
+
*/
|
|
87
|
+
startLive(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Stop live mode.
|
|
90
|
+
*/
|
|
91
|
+
stopLive(): void;
|
|
92
|
+
/**
|
|
93
|
+
* Clean up resources.
|
|
94
|
+
*/
|
|
95
|
+
destroy(): void;
|
|
96
|
+
private buildRender;
|
|
97
|
+
private renderNode;
|
|
98
|
+
private renderProgressBar;
|
|
99
|
+
private renderStatsLine;
|
|
100
|
+
private renderTokenLine;
|
|
101
|
+
private renderOverallProgress;
|
|
102
|
+
private isLastSibling;
|
|
103
|
+
private style;
|
|
104
|
+
private formatTokens;
|
|
105
|
+
private write;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=work-tree-ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-tree-ui.d.ts","sourceRoot":"","sources":["../../lib/work-tree-ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAA4B,aAAa,EAAE,MAAM,aAAa,CAAC;AAMrF,oCAAoC;AACpC,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,wCAAwC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yCAAyC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,KAAK,EAAE,aAAa,CAAC;CACtB;AA8CD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IACnD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,aAAa,CAAK;gBAEd,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,iBAAiB;IA0BvD;;;OAGG;IACH,MAAM,IAAI,YAAY;IAkBtB;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,SAAS,IAAI,IAAI;IAoBjB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAOhB;;OAEG;IACH,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,WAAW;IAuCnB,OAAO,CAAC,UAAU;IAiElB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,qBAAqB;IAsB7B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WorkTreeUI — Terminal renderer for WorkTree hierarchies
|
|
4
|
+
*
|
|
5
|
+
* Renders a WorkTree as an ASCII/Unicode tree with:
|
|
6
|
+
* - Box-drawing connectors (├─, └─, │)
|
|
7
|
+
* - Status icons and color-coding
|
|
8
|
+
* - Progress bars per branch node
|
|
9
|
+
* - Token counts
|
|
10
|
+
* - Agent assignments
|
|
11
|
+
* - Live auto-refresh mode via WorkTree events
|
|
12
|
+
*
|
|
13
|
+
* Zero external dependencies — uses the {@link ansi} helpers from ConsoleUI.
|
|
14
|
+
*
|
|
15
|
+
* @module WorkTreeUI
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.WorkTreeUI = void 0;
|
|
20
|
+
const events_1 = require("events");
|
|
21
|
+
const console_ui_1 = require("./console-ui");
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// CONSTANTS
|
|
24
|
+
// ============================================================================
|
|
25
|
+
const STATUS_ICONS = {
|
|
26
|
+
pending: '○',
|
|
27
|
+
running: '◑',
|
|
28
|
+
completed: '✔',
|
|
29
|
+
failed: '✘',
|
|
30
|
+
skipped: '⏭',
|
|
31
|
+
blocked: '⛔',
|
|
32
|
+
};
|
|
33
|
+
const STATUS_COLORS = {
|
|
34
|
+
pending: console_ui_1.ansi.gray,
|
|
35
|
+
running: console_ui_1.ansi.yellow,
|
|
36
|
+
completed: console_ui_1.ansi.green,
|
|
37
|
+
failed: console_ui_1.ansi.red,
|
|
38
|
+
skipped: console_ui_1.ansi.gray,
|
|
39
|
+
blocked: console_ui_1.ansi.red,
|
|
40
|
+
};
|
|
41
|
+
// Box-drawing characters
|
|
42
|
+
const BOX = {
|
|
43
|
+
pipe: '│',
|
|
44
|
+
tee: '├',
|
|
45
|
+
corner: '└',
|
|
46
|
+
dash: '─',
|
|
47
|
+
space: ' ',
|
|
48
|
+
};
|
|
49
|
+
// Progress bar characters
|
|
50
|
+
const BAR = {
|
|
51
|
+
full: '█',
|
|
52
|
+
seven: '▓',
|
|
53
|
+
half: '▒',
|
|
54
|
+
light: '░',
|
|
55
|
+
empty: '░',
|
|
56
|
+
};
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// WORK TREE UI
|
|
59
|
+
// ============================================================================
|
|
60
|
+
/**
|
|
61
|
+
* Terminal renderer for {@link WorkTree} hierarchies.
|
|
62
|
+
*
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const tree = new WorkTree('root', 'My Project');
|
|
65
|
+
* // ... add children, set statuses ...
|
|
66
|
+
*
|
|
67
|
+
* const ui = new WorkTreeUI(tree);
|
|
68
|
+
* ui.render(); // print to stdout
|
|
69
|
+
*
|
|
70
|
+
* const result = ui.toString(); // get as string
|
|
71
|
+
*
|
|
72
|
+
* ui.startLive(); // auto-refresh on changes
|
|
73
|
+
* ui.stopLive();
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
class WorkTreeUI extends events_1.EventEmitter {
|
|
77
|
+
tree;
|
|
78
|
+
opts;
|
|
79
|
+
liveCleanup = null;
|
|
80
|
+
lastLineCount = 0;
|
|
81
|
+
constructor(tree, options) {
|
|
82
|
+
super();
|
|
83
|
+
this.tree = tree;
|
|
84
|
+
this.opts = {
|
|
85
|
+
output: options?.output ?? process.stdout,
|
|
86
|
+
showTokens: options?.showTokens ?? true,
|
|
87
|
+
showAgents: options?.showAgents ?? true,
|
|
88
|
+
showProgress: options?.showProgress ?? true,
|
|
89
|
+
showStats: options?.showStats ?? true,
|
|
90
|
+
progressBarWidth: options?.progressBarWidth ?? 10,
|
|
91
|
+
useColor: options?.useColor ?? true,
|
|
92
|
+
indentSize: options?.indentSize ?? 2,
|
|
93
|
+
title: options?.title ?? '',
|
|
94
|
+
maxDepth: options?.maxDepth ?? Infinity,
|
|
95
|
+
live: options?.live ?? false,
|
|
96
|
+
};
|
|
97
|
+
if (this.opts.live) {
|
|
98
|
+
this.startLive();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// --------------------------------------------------------------------------
|
|
102
|
+
// PUBLIC API
|
|
103
|
+
// --------------------------------------------------------------------------
|
|
104
|
+
/**
|
|
105
|
+
* Render the tree to the output stream.
|
|
106
|
+
* In live mode this clears previous output first.
|
|
107
|
+
*/
|
|
108
|
+
render() {
|
|
109
|
+
const result = this.buildRender();
|
|
110
|
+
if (this.liveCleanup && this.lastLineCount > 0) {
|
|
111
|
+
// Move cursor up and clear previous render
|
|
112
|
+
this.write(`\x1b[${this.lastLineCount}A`);
|
|
113
|
+
for (let i = 0; i < this.lastLineCount; i++) {
|
|
114
|
+
this.write(`${console_ui_1.ansi.clearLine}\n`);
|
|
115
|
+
}
|
|
116
|
+
this.write(`\x1b[${this.lastLineCount}A`);
|
|
117
|
+
}
|
|
118
|
+
this.write(result.text);
|
|
119
|
+
this.lastLineCount = result.lineCount;
|
|
120
|
+
this.emit('render', result);
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Return the rendered tree as a string (no side effects).
|
|
125
|
+
*/
|
|
126
|
+
toString() {
|
|
127
|
+
return this.buildRender().text;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Start live mode — auto-refresh whenever the tree changes.
|
|
131
|
+
*/
|
|
132
|
+
startLive() {
|
|
133
|
+
if (this.liveCleanup)
|
|
134
|
+
return;
|
|
135
|
+
const handler = () => this.render();
|
|
136
|
+
this.tree.on('node:added', handler);
|
|
137
|
+
this.tree.on('node:removed', handler);
|
|
138
|
+
this.tree.on('node:status', handler);
|
|
139
|
+
this.tree.on('node:tokens', handler);
|
|
140
|
+
this.liveCleanup = () => {
|
|
141
|
+
this.tree.removeListener('node:added', handler);
|
|
142
|
+
this.tree.removeListener('node:removed', handler);
|
|
143
|
+
this.tree.removeListener('node:status', handler);
|
|
144
|
+
this.tree.removeListener('node:tokens', handler);
|
|
145
|
+
};
|
|
146
|
+
// Initial render
|
|
147
|
+
this.render();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Stop live mode.
|
|
151
|
+
*/
|
|
152
|
+
stopLive() {
|
|
153
|
+
if (this.liveCleanup) {
|
|
154
|
+
this.liveCleanup();
|
|
155
|
+
this.liveCleanup = null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Clean up resources.
|
|
160
|
+
*/
|
|
161
|
+
destroy() {
|
|
162
|
+
this.stopLive();
|
|
163
|
+
this.removeAllListeners();
|
|
164
|
+
}
|
|
165
|
+
// --------------------------------------------------------------------------
|
|
166
|
+
// RENDERING
|
|
167
|
+
// --------------------------------------------------------------------------
|
|
168
|
+
buildRender() {
|
|
169
|
+
const lines = [];
|
|
170
|
+
const stats = this.tree.stats();
|
|
171
|
+
const root = this.tree.getRoot();
|
|
172
|
+
const title = this.opts.title || root.label;
|
|
173
|
+
// Header
|
|
174
|
+
lines.push('');
|
|
175
|
+
lines.push(this.style(` ${title}`, console_ui_1.ansi.bold));
|
|
176
|
+
lines.push(` ${this.style('─'.repeat(Math.max(title.length + 4, 50)), console_ui_1.ansi.dim)}`);
|
|
177
|
+
// Tree body
|
|
178
|
+
const flat = this.tree.flatten();
|
|
179
|
+
// Build a set of "has next sibling" per depth for pipe drawing
|
|
180
|
+
const pipeStack = [];
|
|
181
|
+
for (let i = 0; i < flat.length; i++) {
|
|
182
|
+
const node = flat[i];
|
|
183
|
+
if (node.depth > this.opts.maxDepth)
|
|
184
|
+
continue;
|
|
185
|
+
const line = this.renderNode(node, flat, i, pipeStack);
|
|
186
|
+
lines.push(line);
|
|
187
|
+
}
|
|
188
|
+
// Footer
|
|
189
|
+
if (this.opts.showStats) {
|
|
190
|
+
lines.push('');
|
|
191
|
+
lines.push(` ${this.style('─'.repeat(Math.max(title.length + 4, 50)), console_ui_1.ansi.dim)}`);
|
|
192
|
+
lines.push(this.renderStatsLine(stats));
|
|
193
|
+
lines.push(this.renderTokenLine(stats));
|
|
194
|
+
lines.push(this.renderOverallProgress(stats));
|
|
195
|
+
}
|
|
196
|
+
lines.push('');
|
|
197
|
+
const text = lines.join('\n');
|
|
198
|
+
return { text, lineCount: lines.length, stats };
|
|
199
|
+
}
|
|
200
|
+
renderNode(node, flat, index, pipeStack) {
|
|
201
|
+
const depth = node.depth;
|
|
202
|
+
const isRoot = depth === 0;
|
|
203
|
+
// Determine if this node is the last child of its parent
|
|
204
|
+
const isLastChild = this.isLastSibling(node);
|
|
205
|
+
// Update pipe stack for connector drawing
|
|
206
|
+
pipeStack.length = depth;
|
|
207
|
+
if (!isRoot) {
|
|
208
|
+
// At depth-1, set whether we should continue drawing a pipe
|
|
209
|
+
if (depth > 0) {
|
|
210
|
+
pipeStack[depth - 1] = !isLastChild;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Build prefix with connectors
|
|
214
|
+
let prefix = ' '; // left margin
|
|
215
|
+
if (!isRoot) {
|
|
216
|
+
for (let d = 0; d < depth - 1; d++) {
|
|
217
|
+
prefix += pipeStack[d]
|
|
218
|
+
? `${BOX.pipe}${BOX.space.repeat(this.opts.indentSize)}`
|
|
219
|
+
: `${BOX.space}${BOX.space.repeat(this.opts.indentSize)}`;
|
|
220
|
+
}
|
|
221
|
+
prefix += isLastChild
|
|
222
|
+
? `${BOX.corner}${BOX.dash} `
|
|
223
|
+
: `${BOX.tee}${BOX.dash} `;
|
|
224
|
+
}
|
|
225
|
+
// Status icon
|
|
226
|
+
const icon = STATUS_ICONS[node.status];
|
|
227
|
+
const statusColor = STATUS_COLORS[node.status];
|
|
228
|
+
// Label
|
|
229
|
+
const label = this.style(`${icon} ${node.label}`, statusColor);
|
|
230
|
+
// Inline metadata
|
|
231
|
+
const parts = [label];
|
|
232
|
+
// Progress bar for branch nodes
|
|
233
|
+
if (this.opts.showProgress && node.children.length > 0) {
|
|
234
|
+
parts.push(this.renderProgressBar(node.progress, node.status));
|
|
235
|
+
}
|
|
236
|
+
// Token count
|
|
237
|
+
if (this.opts.showTokens && node.totalTokens > 0) {
|
|
238
|
+
const tokenStr = node.children.length > 0
|
|
239
|
+
? `${this.formatTokens(node.totalTokens)} tok`
|
|
240
|
+
: `${this.formatTokens(node.ownTokens)} tok`;
|
|
241
|
+
parts.push(this.style(tokenStr, console_ui_1.ansi.dim));
|
|
242
|
+
}
|
|
243
|
+
// Agent
|
|
244
|
+
if (this.opts.showAgents && node.agent) {
|
|
245
|
+
parts.push(this.style(`@${node.agent}`, console_ui_1.ansi.dim + console_ui_1.ansi.cyan));
|
|
246
|
+
}
|
|
247
|
+
return prefix + parts.join(' ');
|
|
248
|
+
}
|
|
249
|
+
renderProgressBar(progress, status) {
|
|
250
|
+
const width = this.opts.progressBarWidth;
|
|
251
|
+
const filled = Math.round(progress * width);
|
|
252
|
+
const empty = width - filled;
|
|
253
|
+
let barColor;
|
|
254
|
+
if (status === 'completed')
|
|
255
|
+
barColor = console_ui_1.ansi.green;
|
|
256
|
+
else if (status === 'failed')
|
|
257
|
+
barColor = console_ui_1.ansi.red;
|
|
258
|
+
else if (progress >= 0.5)
|
|
259
|
+
barColor = console_ui_1.ansi.yellow;
|
|
260
|
+
else
|
|
261
|
+
barColor = console_ui_1.ansi.gray;
|
|
262
|
+
const filledStr = BAR.full.repeat(filled);
|
|
263
|
+
const emptyStr = BAR.empty.repeat(empty);
|
|
264
|
+
const pct = `${Math.round(progress * 100)}%`;
|
|
265
|
+
return this.style(`${filledStr}`, barColor) +
|
|
266
|
+
this.style(emptyStr, console_ui_1.ansi.dim) +
|
|
267
|
+
' ' +
|
|
268
|
+
this.style(pct, progress === 1 ? console_ui_1.ansi.green : console_ui_1.ansi.dim);
|
|
269
|
+
}
|
|
270
|
+
renderStatsLine(stats) {
|
|
271
|
+
const parts = [
|
|
272
|
+
this.style(`${stats.completed} done`, console_ui_1.ansi.green),
|
|
273
|
+
this.style(`${stats.running} running`, console_ui_1.ansi.yellow),
|
|
274
|
+
this.style(`${stats.failed} failed`, console_ui_1.ansi.red),
|
|
275
|
+
`${stats.pending} pending`,
|
|
276
|
+
];
|
|
277
|
+
if (stats.blocked > 0) {
|
|
278
|
+
parts.push(this.style(`${stats.blocked} blocked`, console_ui_1.ansi.red + console_ui_1.ansi.dim));
|
|
279
|
+
}
|
|
280
|
+
if (stats.skipped > 0) {
|
|
281
|
+
parts.push(this.style(`${stats.skipped} skipped`, console_ui_1.ansi.dim));
|
|
282
|
+
}
|
|
283
|
+
return ` ${this.style(`${stats.total} nodes`, console_ui_1.ansi.bold)} │ ${parts.join(this.style(' │ ', console_ui_1.ansi.dim))}`;
|
|
284
|
+
}
|
|
285
|
+
renderTokenLine(stats) {
|
|
286
|
+
return ` Tokens: ${this.style(this.formatTokens(stats.totalTokens), console_ui_1.ansi.bold)} │ Depth: ${stats.maxDepth}`;
|
|
287
|
+
}
|
|
288
|
+
renderOverallProgress(stats) {
|
|
289
|
+
const width = 30;
|
|
290
|
+
const pct = stats.progress;
|
|
291
|
+
const filled = Math.round(pct * width);
|
|
292
|
+
const empty = width - filled;
|
|
293
|
+
let barColor;
|
|
294
|
+
if (pct === 1)
|
|
295
|
+
barColor = console_ui_1.ansi.green;
|
|
296
|
+
else if (pct >= 0.66)
|
|
297
|
+
barColor = console_ui_1.ansi.yellow;
|
|
298
|
+
else
|
|
299
|
+
barColor = console_ui_1.ansi.cyan;
|
|
300
|
+
const filledStr = BAR.full.repeat(filled);
|
|
301
|
+
const emptyStr = BAR.empty.repeat(empty);
|
|
302
|
+
const pctStr = `${Math.round(pct * 100)}%`;
|
|
303
|
+
return ` Progress: ${this.style(filledStr, barColor)}${this.style(emptyStr, console_ui_1.ansi.dim)} ${this.style(pctStr, console_ui_1.ansi.bold)}`;
|
|
304
|
+
}
|
|
305
|
+
// --------------------------------------------------------------------------
|
|
306
|
+
// HELPERS
|
|
307
|
+
// --------------------------------------------------------------------------
|
|
308
|
+
isLastSibling(node) {
|
|
309
|
+
if (!node.parentId)
|
|
310
|
+
return true;
|
|
311
|
+
const parent = this.tree.getNode(node.parentId);
|
|
312
|
+
if (!parent)
|
|
313
|
+
return true;
|
|
314
|
+
return parent.children[parent.children.length - 1] === node.id;
|
|
315
|
+
}
|
|
316
|
+
style(text, code) {
|
|
317
|
+
if (!this.opts.useColor)
|
|
318
|
+
return text;
|
|
319
|
+
return `${code}${text}${console_ui_1.ansi.reset}`;
|
|
320
|
+
}
|
|
321
|
+
formatTokens(n) {
|
|
322
|
+
if (n >= 1_000_000)
|
|
323
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
324
|
+
if (n >= 1_000)
|
|
325
|
+
return `${(n / 1_000).toFixed(1)}k`;
|
|
326
|
+
return String(n);
|
|
327
|
+
}
|
|
328
|
+
write(text) {
|
|
329
|
+
this.opts.output.write(text);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
exports.WorkTreeUI = WorkTreeUI;
|
|
333
|
+
//# sourceMappingURL=work-tree-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-tree-ui.js","sourceRoot":"","sources":["../../lib/work-tree-ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkTree — Hierarchical task decomposition tree with rollup stats
|
|
3
|
+
*
|
|
4
|
+
* Maintains a rooted tree of work items where each node can spawn children.
|
|
5
|
+
* Status, tokens, and progress roll up automatically from leaves to root.
|
|
6
|
+
* Integrates with {@link TopologyTracker} to add `subtask` edges and sync
|
|
7
|
+
* agent status.
|
|
8
|
+
*
|
|
9
|
+
* @module WorkTree
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
/** Status of a work node */
|
|
14
|
+
export type WorkNodeStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped' | 'blocked';
|
|
15
|
+
/** A single node in the work tree */
|
|
16
|
+
export interface WorkNode {
|
|
17
|
+
/** Unique work-item identifier */
|
|
18
|
+
id: string;
|
|
19
|
+
/** Parent work-item id (undefined for root) */
|
|
20
|
+
parentId?: string;
|
|
21
|
+
/** Human-readable label */
|
|
22
|
+
label: string;
|
|
23
|
+
/** Agent assigned to this work item (if any) */
|
|
24
|
+
agent?: string;
|
|
25
|
+
/** Current status */
|
|
26
|
+
status: WorkNodeStatus;
|
|
27
|
+
/** Depth in the tree (root = 0) */
|
|
28
|
+
depth: number;
|
|
29
|
+
/** Direct children ids (ordered) */
|
|
30
|
+
children: string[];
|
|
31
|
+
/** Tokens consumed by this node alone (not including children) */
|
|
32
|
+
ownTokens: number;
|
|
33
|
+
/** Rollup: total tokens including all descendants */
|
|
34
|
+
totalTokens: number;
|
|
35
|
+
/** Rollup: progress 0–1 based on completed descendants */
|
|
36
|
+
progress: number;
|
|
37
|
+
/** ISO 8601 created timestamp */
|
|
38
|
+
createdAt: string;
|
|
39
|
+
/** ISO 8601 last status change */
|
|
40
|
+
updatedAt: string;
|
|
41
|
+
/** Arbitrary metadata */
|
|
42
|
+
metadata: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
/** Summary statistics for the entire tree */
|
|
45
|
+
export interface WorkTreeStats {
|
|
46
|
+
/** Total node count */
|
|
47
|
+
total: number;
|
|
48
|
+
/** By status */
|
|
49
|
+
pending: number;
|
|
50
|
+
running: number;
|
|
51
|
+
completed: number;
|
|
52
|
+
failed: number;
|
|
53
|
+
skipped: number;
|
|
54
|
+
blocked: number;
|
|
55
|
+
/** Overall progress 0–1 */
|
|
56
|
+
progress: number;
|
|
57
|
+
/** Aggregate tokens across all nodes */
|
|
58
|
+
totalTokens: number;
|
|
59
|
+
/** Max tree depth */
|
|
60
|
+
maxDepth: number;
|
|
61
|
+
}
|
|
62
|
+
/** Flat representation of the tree for serialisation */
|
|
63
|
+
export interface WorkTreeSnapshot {
|
|
64
|
+
/** Root node id */
|
|
65
|
+
rootId: string;
|
|
66
|
+
/** All nodes keyed by id */
|
|
67
|
+
nodes: Record<string, WorkNode>;
|
|
68
|
+
/** Tree-wide stats */
|
|
69
|
+
stats: WorkTreeStats;
|
|
70
|
+
/** ISO 8601 snapshot timestamp */
|
|
71
|
+
timestamp: string;
|
|
72
|
+
}
|
|
73
|
+
/** Events emitted by WorkTree */
|
|
74
|
+
export interface WorkTreeEvents {
|
|
75
|
+
'node:added': (node: WorkNode) => void;
|
|
76
|
+
'node:removed': (id: string) => void;
|
|
77
|
+
'node:status': (id: string, status: WorkNodeStatus, prev: WorkNodeStatus) => void;
|
|
78
|
+
'node:tokens': (id: string, ownTokens: number, totalTokens: number) => void;
|
|
79
|
+
'node:progress': (id: string, progress: number) => void;
|
|
80
|
+
'tree:complete': (stats: WorkTreeStats) => void;
|
|
81
|
+
}
|
|
82
|
+
/** Options for auto-status rollup behaviour */
|
|
83
|
+
export interface WorkTreeOptions {
|
|
84
|
+
/** Auto-complete a parent when all children complete (default: true) */
|
|
85
|
+
autoCompleteParent?: boolean;
|
|
86
|
+
/** Auto-fail a parent when any child fails (default: false) */
|
|
87
|
+
autoFailParent?: boolean;
|
|
88
|
+
/** Auto-block children when parent is not running (default: true) */
|
|
89
|
+
autoBlockChildren?: boolean;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Hierarchical task decomposition tree.
|
|
93
|
+
*
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const tree = new WorkTree('root', 'Build feature');
|
|
96
|
+
* tree.addChild('root', { id: 'design', label: 'Design API' });
|
|
97
|
+
* tree.addChild('root', { id: 'impl', label: 'Implement' });
|
|
98
|
+
* tree.addChild('impl', { id: 'impl-auth', label: 'Auth module', agent: 'worker-1' });
|
|
99
|
+
* tree.addChild('impl', { id: 'impl-db', label: 'DB schema', agent: 'worker-2' });
|
|
100
|
+
*
|
|
101
|
+
* tree.setStatus('impl-auth', 'running');
|
|
102
|
+
* tree.setStatus('impl-auth', 'completed');
|
|
103
|
+
* // impl.progress → 0.5 (1 of 2 children done)
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export declare class WorkTree extends EventEmitter {
|
|
107
|
+
private nodes;
|
|
108
|
+
private readonly rootId;
|
|
109
|
+
private readonly opts;
|
|
110
|
+
constructor(rootId: string, rootLabel: string, options?: WorkTreeOptions);
|
|
111
|
+
/**
|
|
112
|
+
* Add a child work item under a parent.
|
|
113
|
+
* @throws if parentId does not exist or id is already taken.
|
|
114
|
+
*/
|
|
115
|
+
addChild(parentId: string, child: {
|
|
116
|
+
id: string;
|
|
117
|
+
label: string;
|
|
118
|
+
agent?: string;
|
|
119
|
+
metadata?: Record<string, unknown>;
|
|
120
|
+
}): WorkNode;
|
|
121
|
+
/**
|
|
122
|
+
* Remove a node and all its descendants.
|
|
123
|
+
* Cannot remove the root.
|
|
124
|
+
* @returns number of nodes removed
|
|
125
|
+
*/
|
|
126
|
+
removeSubtree(id: string): number;
|
|
127
|
+
/**
|
|
128
|
+
* Set the status of a work node. Triggers rollup.
|
|
129
|
+
*/
|
|
130
|
+
setStatus(id: string, status: WorkNodeStatus): void;
|
|
131
|
+
/**
|
|
132
|
+
* Add tokens to a work node. Rolls up totalTokens to ancestors.
|
|
133
|
+
*/
|
|
134
|
+
addTokens(id: string, tokens: number): void;
|
|
135
|
+
/** Get a single node (copy). */
|
|
136
|
+
getNode(id: string): WorkNode | undefined;
|
|
137
|
+
/** Get the root node. */
|
|
138
|
+
getRoot(): WorkNode;
|
|
139
|
+
/** Get direct children of a node. */
|
|
140
|
+
getChildren(id: string): WorkNode[];
|
|
141
|
+
/** Get all ancestors from node to root (excluding the node itself). */
|
|
142
|
+
getAncestors(id: string): WorkNode[];
|
|
143
|
+
/** Get all descendants (depth-first). */
|
|
144
|
+
getDescendants(id: string): WorkNode[];
|
|
145
|
+
/** Get all leaf nodes (no children). */
|
|
146
|
+
getLeaves(): WorkNode[];
|
|
147
|
+
/** Total node count. */
|
|
148
|
+
size(): number;
|
|
149
|
+
/** The root node id. */
|
|
150
|
+
getRootId(): string;
|
|
151
|
+
/** Compute tree-wide statistics. */
|
|
152
|
+
stats(): WorkTreeStats;
|
|
153
|
+
/** Full snapshot for serialisation. */
|
|
154
|
+
snapshot(): WorkTreeSnapshot;
|
|
155
|
+
/**
|
|
156
|
+
* Flatten the tree into a depth-first ordered array (for rendering).
|
|
157
|
+
*/
|
|
158
|
+
flatten(): WorkNode[];
|
|
159
|
+
/**
|
|
160
|
+
* Build the tree from a flat list of tasks with dependencies.
|
|
161
|
+
* Creates a virtual root if multiple top-level tasks exist.
|
|
162
|
+
* Compatible with TaskDAG nodes from GoalDecomposer.
|
|
163
|
+
*/
|
|
164
|
+
static fromTaskList(tasks: Array<{
|
|
165
|
+
id: string;
|
|
166
|
+
description: string;
|
|
167
|
+
agent?: string;
|
|
168
|
+
dependencies: string[];
|
|
169
|
+
metadata?: Record<string, unknown>;
|
|
170
|
+
}>, rootLabel?: string, options?: WorkTreeOptions): WorkTree;
|
|
171
|
+
/** Collect all node ids in a subtree (including the root of the subtree). */
|
|
172
|
+
private collectSubtree;
|
|
173
|
+
/** Re-compute progress and auto-status from a node up to root. */
|
|
174
|
+
private rollupFrom;
|
|
175
|
+
/** Recompute totalTokens for a single node from its children. */
|
|
176
|
+
private recomputeTokens;
|
|
177
|
+
/** Rollup token totals from a node up to root. */
|
|
178
|
+
private rollupTokensFrom;
|
|
179
|
+
/** Block all pending descendants of a node. */
|
|
180
|
+
private blockDescendants;
|
|
181
|
+
/** Check if the entire tree is done and emit tree:complete. */
|
|
182
|
+
private checkTreeComplete;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=work-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-tree.d.ts","sourceRoot":"","sources":["../../lib/work-tree.ts"],"names":[],"mappings":"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"}
|