aicodeman 0.2.8
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/LICENSE +21 -0
- package/README.md +403 -0
- package/dist/ai-checker-base.d.ts +175 -0
- package/dist/ai-checker-base.d.ts.map +1 -0
- package/dist/ai-checker-base.js +424 -0
- package/dist/ai-checker-base.js.map +1 -0
- package/dist/ai-idle-checker.d.ts +53 -0
- package/dist/ai-idle-checker.d.ts.map +1 -0
- package/dist/ai-idle-checker.js +141 -0
- package/dist/ai-idle-checker.js.map +1 -0
- package/dist/ai-plan-checker.d.ts +52 -0
- package/dist/ai-plan-checker.d.ts.map +1 -0
- package/dist/ai-plan-checker.js +103 -0
- package/dist/ai-plan-checker.js.map +1 -0
- package/dist/bash-tool-parser.d.ts +191 -0
- package/dist/bash-tool-parser.d.ts.map +1 -0
- package/dist/bash-tool-parser.js +598 -0
- package/dist/bash-tool-parser.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +460 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/buffer-limits.d.ts +59 -0
- package/dist/config/buffer-limits.d.ts.map +1 -0
- package/dist/config/buffer-limits.js +74 -0
- package/dist/config/buffer-limits.js.map +1 -0
- package/dist/config/map-limits.d.ts +40 -0
- package/dist/config/map-limits.d.ts.map +1 -0
- package/dist/config/map-limits.js +52 -0
- package/dist/config/map-limits.js.map +1 -0
- package/dist/file-stream-manager.d.ts +148 -0
- package/dist/file-stream-manager.d.ts.map +1 -0
- package/dist/file-stream-manager.js +351 -0
- package/dist/file-stream-manager.js.map +1 -0
- package/dist/hooks-config.d.ts +31 -0
- package/dist/hooks-config.d.ts.map +1 -0
- package/dist/hooks-config.js +115 -0
- package/dist/hooks-config.js.map +1 -0
- package/dist/image-watcher.d.ts +86 -0
- package/dist/image-watcher.d.ts.map +1 -0
- package/dist/image-watcher.js +275 -0
- package/dist/image-watcher.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/mux-factory.d.ts +13 -0
- package/dist/mux-factory.d.ts.map +1 -0
- package/dist/mux-factory.js +19 -0
- package/dist/mux-factory.js.map +1 -0
- package/dist/mux-interface.d.ts +145 -0
- package/dist/mux-interface.d.ts.map +1 -0
- package/dist/mux-interface.js +9 -0
- package/dist/mux-interface.js.map +1 -0
- package/dist/plan-orchestrator.d.ts +123 -0
- package/dist/plan-orchestrator.d.ts.map +1 -0
- package/dist/plan-orchestrator.js +500 -0
- package/dist/plan-orchestrator.js.map +1 -0
- package/dist/prompts/index.d.ts +9 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +9 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/planner.d.ts +14 -0
- package/dist/prompts/planner.d.ts.map +1 -0
- package/dist/prompts/planner.js +83 -0
- package/dist/prompts/planner.js.map +1 -0
- package/dist/prompts/research-agent.d.ts +10 -0
- package/dist/prompts/research-agent.d.ts.map +1 -0
- package/dist/prompts/research-agent.js +143 -0
- package/dist/prompts/research-agent.js.map +1 -0
- package/dist/push-store.d.ts +41 -0
- package/dist/push-store.d.ts.map +1 -0
- package/dist/push-store.js +168 -0
- package/dist/push-store.js.map +1 -0
- package/dist/ralph-config.d.ts +67 -0
- package/dist/ralph-config.d.ts.map +1 -0
- package/dist/ralph-config.js +134 -0
- package/dist/ralph-config.js.map +1 -0
- package/dist/ralph-loop.d.ts +124 -0
- package/dist/ralph-loop.d.ts.map +1 -0
- package/dist/ralph-loop.js +418 -0
- package/dist/ralph-loop.js.map +1 -0
- package/dist/ralph-tracker.d.ts +1081 -0
- package/dist/ralph-tracker.d.ts.map +1 -0
- package/dist/ralph-tracker.js +3343 -0
- package/dist/ralph-tracker.js.map +1 -0
- package/dist/respawn-controller.d.ts +1182 -0
- package/dist/respawn-controller.d.ts.map +1 -0
- package/dist/respawn-controller.js +2754 -0
- package/dist/respawn-controller.js.map +1 -0
- package/dist/run-summary.d.ts +123 -0
- package/dist/run-summary.d.ts.map +1 -0
- package/dist/run-summary.js +325 -0
- package/dist/run-summary.js.map +1 -0
- package/dist/session-lifecycle-log.d.ts +36 -0
- package/dist/session-lifecycle-log.d.ts.map +1 -0
- package/dist/session-lifecycle-log.js +101 -0
- package/dist/session-lifecycle-log.js.map +1 -0
- package/dist/session-manager.d.ts +97 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +224 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/session.d.ts +686 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +2025 -0
- package/dist/session.js.map +1 -0
- package/dist/state-store.d.ts +189 -0
- package/dist/state-store.d.ts.map +1 -0
- package/dist/state-store.js +730 -0
- package/dist/state-store.js.map +1 -0
- package/dist/subagent-watcher.d.ts +345 -0
- package/dist/subagent-watcher.d.ts.map +1 -0
- package/dist/subagent-watcher.js +1469 -0
- package/dist/subagent-watcher.js.map +1 -0
- package/dist/task-queue.d.ts +108 -0
- package/dist/task-queue.d.ts.map +1 -0
- package/dist/task-queue.js +235 -0
- package/dist/task-queue.js.map +1 -0
- package/dist/task-tracker.d.ts +306 -0
- package/dist/task-tracker.d.ts.map +1 -0
- package/dist/task-tracker.js +488 -0
- package/dist/task-tracker.js.map +1 -0
- package/dist/task.d.ts +73 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +177 -0
- package/dist/task.js.map +1 -0
- package/dist/team-watcher.d.ts +53 -0
- package/dist/team-watcher.d.ts.map +1 -0
- package/dist/team-watcher.js +313 -0
- package/dist/team-watcher.js.map +1 -0
- package/dist/templates/case-template.md +461 -0
- package/dist/templates/claude-md.d.ts +26 -0
- package/dist/templates/claude-md.d.ts.map +1 -0
- package/dist/templates/claude-md.js +74 -0
- package/dist/templates/claude-md.js.map +1 -0
- package/dist/tmux-manager.d.ts +181 -0
- package/dist/tmux-manager.d.ts.map +1 -0
- package/dist/tmux-manager.js +1405 -0
- package/dist/tmux-manager.js.map +1 -0
- package/dist/transcript-watcher.d.ts +110 -0
- package/dist/transcript-watcher.d.ts.map +1 -0
- package/dist/transcript-watcher.js +338 -0
- package/dist/transcript-watcher.js.map +1 -0
- package/dist/tunnel-manager.d.ts +54 -0
- package/dist/tunnel-manager.d.ts.map +1 -0
- package/dist/tunnel-manager.js +251 -0
- package/dist/tunnel-manager.js.map +1 -0
- package/dist/types.d.ts +1139 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +215 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buffer-accumulator.d.ts +111 -0
- package/dist/utils/buffer-accumulator.d.ts.map +1 -0
- package/dist/utils/buffer-accumulator.js +172 -0
- package/dist/utils/buffer-accumulator.js.map +1 -0
- package/dist/utils/claude-cli-resolver.d.ts +26 -0
- package/dist/utils/claude-cli-resolver.d.ts.map +1 -0
- package/dist/utils/claude-cli-resolver.js +78 -0
- package/dist/utils/claude-cli-resolver.js.map +1 -0
- package/dist/utils/cleanup-manager.d.ts +165 -0
- package/dist/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/utils/cleanup-manager.js +274 -0
- package/dist/utils/cleanup-manager.js.map +1 -0
- package/dist/utils/index.d.ts +19 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +19 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/lru-map.d.ts +140 -0
- package/dist/utils/lru-map.d.ts.map +1 -0
- package/dist/utils/lru-map.js +234 -0
- package/dist/utils/lru-map.js.map +1 -0
- package/dist/utils/nice-wrapper.d.ts +13 -0
- package/dist/utils/nice-wrapper.d.ts.map +1 -0
- package/dist/utils/nice-wrapper.js +17 -0
- package/dist/utils/nice-wrapper.js.map +1 -0
- package/dist/utils/opencode-cli-resolver.d.ts +21 -0
- package/dist/utils/opencode-cli-resolver.d.ts.map +1 -0
- package/dist/utils/opencode-cli-resolver.js +67 -0
- package/dist/utils/opencode-cli-resolver.js.map +1 -0
- package/dist/utils/regex-patterns.d.ts +64 -0
- package/dist/utils/regex-patterns.d.ts.map +1 -0
- package/dist/utils/regex-patterns.js +74 -0
- package/dist/utils/regex-patterns.js.map +1 -0
- package/dist/utils/stale-expiration-map.d.ts +159 -0
- package/dist/utils/stale-expiration-map.d.ts.map +1 -0
- package/dist/utils/stale-expiration-map.js +277 -0
- package/dist/utils/stale-expiration-map.js.map +1 -0
- package/dist/utils/string-similarity.d.ts +108 -0
- package/dist/utils/string-similarity.d.ts.map +1 -0
- package/dist/utils/string-similarity.js +189 -0
- package/dist/utils/string-similarity.js.map +1 -0
- package/dist/utils/token-validation.d.ts +39 -0
- package/dist/utils/token-validation.d.ts.map +1 -0
- package/dist/utils/token-validation.js +59 -0
- package/dist/utils/token-validation.js.map +1 -0
- package/dist/utils/type-safety.d.ts +33 -0
- package/dist/utils/type-safety.d.ts.map +1 -0
- package/dist/utils/type-safety.js +35 -0
- package/dist/utils/type-safety.js.map +1 -0
- package/dist/web/public/app.js +491 -0
- package/dist/web/public/app.js.br +0 -0
- package/dist/web/public/app.js.gz +0 -0
- package/dist/web/public/index.html +1675 -0
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/manifest.json +8 -0
- package/dist/web/public/mobile.css +1 -0
- package/dist/web/public/mobile.css.br +0 -0
- package/dist/web/public/mobile.css.gz +0 -0
- package/dist/web/public/ralph-wizard.js +1037 -0
- package/dist/web/public/ralph-wizard.js.br +0 -0
- package/dist/web/public/ralph-wizard.js.gz +0 -0
- package/dist/web/public/styles.css +1 -0
- package/dist/web/public/styles.css.br +0 -0
- package/dist/web/public/styles.css.gz +0 -0
- package/dist/web/public/sw.js +67 -0
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/upload.html +155 -0
- package/dist/web/public/upload.html.br +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js +1 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.br +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js +1 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.br +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js +2 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.br +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css +209 -0
- package/dist/web/public/vendor/xterm.css.br +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js +9 -0
- package/dist/web/public/vendor/xterm.min.js.br +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/schemas.d.ts +479 -0
- package/dist/web/schemas.d.ts.map +1 -0
- package/dist/web/schemas.js +448 -0
- package/dist/web/schemas.js.map +1 -0
- package/dist/web/server.d.ts +207 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +5784 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +110 -0
- package/scripts/postinstall.js +390 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Background Task Tracker for Claude Code sessions
|
|
3
|
+
*
|
|
4
|
+
* This module tracks background tasks (subagents) spawned by Claude Code
|
|
5
|
+
* during session execution. It parses both JSON messages and terminal output
|
|
6
|
+
* to detect when tasks are created, updated, and completed.
|
|
7
|
+
*
|
|
8
|
+
* ## Task Hierarchy
|
|
9
|
+
*
|
|
10
|
+
* Tasks can be nested (parent-child relationships) when Claude spawns
|
|
11
|
+
* a subagent from within another subagent. The tracker maintains a stack
|
|
12
|
+
* to track nesting and a tree structure for visualization.
|
|
13
|
+
*
|
|
14
|
+
* ## Detection Methods
|
|
15
|
+
*
|
|
16
|
+
* 1. **JSON Messages**: Parses `tool_use` blocks for Task tool invocations
|
|
17
|
+
* and `tool_result` blocks for completion
|
|
18
|
+
* 2. **Terminal Output**: Fallback pattern matching for launch/complete messages
|
|
19
|
+
*
|
|
20
|
+
* @module task-tracker
|
|
21
|
+
*/
|
|
22
|
+
import { EventEmitter } from 'node:events';
|
|
23
|
+
import { assertNever } from './utils/index.js';
|
|
24
|
+
// ========== Configuration Constants ==========
|
|
25
|
+
/**
|
|
26
|
+
* Maximum number of completed tasks to keep in memory.
|
|
27
|
+
* Oldest completed tasks are removed when this limit is exceeded.
|
|
28
|
+
*/
|
|
29
|
+
const MAX_COMPLETED_TASKS = 100;
|
|
30
|
+
/**
|
|
31
|
+
* Maximum age for pending tool uses (in milliseconds).
|
|
32
|
+
* Entries older than this are cleaned up to prevent unbounded growth.
|
|
33
|
+
* Default: 1 hour
|
|
34
|
+
*/
|
|
35
|
+
const PENDING_TOOL_USE_MAX_AGE_MS = 60 * 60 * 1000;
|
|
36
|
+
/**
|
|
37
|
+
* Maximum number of pending tool uses to allow.
|
|
38
|
+
* Prevents unbounded growth if tool_results never arrive.
|
|
39
|
+
*/
|
|
40
|
+
const MAX_PENDING_TOOL_USES = 100;
|
|
41
|
+
// ========== Pre-compiled Regex Patterns ==========
|
|
42
|
+
/**
|
|
43
|
+
* Patterns that indicate a new task/agent is being launched.
|
|
44
|
+
* Used as fallback when JSON parsing doesn't capture the launch.
|
|
45
|
+
* Capture group 1: Agent/task type name
|
|
46
|
+
*/
|
|
47
|
+
const LAUNCH_PATTERNS = [/Launching\s+(\w+)\s+agent/i, /Starting\s+(\w+)\s+task/i, /Spawning\s+(\w+)\s+agent/i];
|
|
48
|
+
/**
|
|
49
|
+
* Patterns that indicate a task has completed.
|
|
50
|
+
* Used as fallback when JSON parsing doesn't capture the result.
|
|
51
|
+
*/
|
|
52
|
+
const COMPLETE_PATTERNS = [/Task\s+completed/i, /Agent\s+finished/i, /Background\s+task\s+done/i];
|
|
53
|
+
/**
|
|
54
|
+
* TaskTracker - Detects and tracks background tasks in Claude Code sessions.
|
|
55
|
+
*
|
|
56
|
+
* ## How It Works
|
|
57
|
+
*
|
|
58
|
+
* Claude Code outputs JSON messages when executing. When it spawns a subagent
|
|
59
|
+
* via the Task tool, we see:
|
|
60
|
+
*
|
|
61
|
+
* 1. `tool_use` block with `name: "Task"` and input parameters
|
|
62
|
+
* 2. ... task execution output ...
|
|
63
|
+
* 3. `tool_result` block with the result or error
|
|
64
|
+
*
|
|
65
|
+
* The tracker maintains:
|
|
66
|
+
* - A map of all tasks by ID
|
|
67
|
+
* - A stack of currently running tasks (for nesting)
|
|
68
|
+
* - Parent-child relationships between tasks
|
|
69
|
+
*
|
|
70
|
+
* ## Usage
|
|
71
|
+
*
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const tracker = new TaskTracker();
|
|
74
|
+
*
|
|
75
|
+
* tracker.on('taskCreated', (task) => {
|
|
76
|
+
* console.log(`New task: ${task.description}`);
|
|
77
|
+
* });
|
|
78
|
+
*
|
|
79
|
+
* tracker.on('taskCompleted', (task) => {
|
|
80
|
+
* console.log(`Task done: ${task.id}`);
|
|
81
|
+
* });
|
|
82
|
+
*
|
|
83
|
+
* // Feed in Claude messages
|
|
84
|
+
* tracker.processMessage(claudeJsonMessage);
|
|
85
|
+
*
|
|
86
|
+
* // Or terminal output as fallback
|
|
87
|
+
* tracker.processTerminalOutput(ptyData);
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @extends EventEmitter
|
|
91
|
+
*/
|
|
92
|
+
export class TaskTracker extends EventEmitter {
|
|
93
|
+
/** Map of task ID to task object */
|
|
94
|
+
tasks = new Map();
|
|
95
|
+
/** Stack of active task IDs for tracking nesting depth */
|
|
96
|
+
taskStack = [];
|
|
97
|
+
/** Pending tool_use blocks waiting for results (with timestamp for cleanup) */
|
|
98
|
+
pendingToolUses = new Map();
|
|
99
|
+
/**
|
|
100
|
+
* Creates a new TaskTracker instance.
|
|
101
|
+
*/
|
|
102
|
+
constructor() {
|
|
103
|
+
super();
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Process a Claude JSON message to detect task events.
|
|
107
|
+
*
|
|
108
|
+
* Looks for `tool_use` blocks with `name: "Task"` and `tool_result` blocks
|
|
109
|
+
* to track task lifecycle.
|
|
110
|
+
*
|
|
111
|
+
* @param msg - Parsed Claude JSON message object
|
|
112
|
+
* @fires taskCreated - When a new task is detected
|
|
113
|
+
* @fires taskCompleted - When a task finishes successfully
|
|
114
|
+
* @fires taskFailed - When a task finishes with error
|
|
115
|
+
*/
|
|
116
|
+
processMessage(msg) {
|
|
117
|
+
if (!msg || !msg.message?.content)
|
|
118
|
+
return;
|
|
119
|
+
for (const block of msg.message.content) {
|
|
120
|
+
if (block.type === 'tool_use' && block.name === 'Task') {
|
|
121
|
+
this.handleTaskToolUse(block);
|
|
122
|
+
}
|
|
123
|
+
else if (block.type === 'tool_result') {
|
|
124
|
+
this.handleToolResult(block);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Process raw terminal output to detect task patterns.
|
|
130
|
+
*
|
|
131
|
+
* This is a fallback for when JSON parsing doesn't capture everything.
|
|
132
|
+
* Uses pre-compiled patterns to detect launch and completion messages.
|
|
133
|
+
*
|
|
134
|
+
* Note: May create duplicate tasks in some cases; deduplication is
|
|
135
|
+
* handled by checking for existing running tasks of the same type.
|
|
136
|
+
*
|
|
137
|
+
* @param data - Raw terminal output string
|
|
138
|
+
* @fires taskCreated - When a launch pattern is matched
|
|
139
|
+
* @fires taskCompleted - When a complete pattern is matched
|
|
140
|
+
*/
|
|
141
|
+
processTerminalOutput(data) {
|
|
142
|
+
// Detect task launch patterns in terminal output
|
|
143
|
+
// Claude Code shows things like "Launching explore agent..." or similar
|
|
144
|
+
for (const pattern of LAUNCH_PATTERNS) {
|
|
145
|
+
const match = data.match(pattern);
|
|
146
|
+
if (match) {
|
|
147
|
+
// This is a heuristic detection - might create duplicate tasks
|
|
148
|
+
// but we dedupe by checking if we already have a running task of this type
|
|
149
|
+
const agentType = match[1].toLowerCase();
|
|
150
|
+
// Optimize: use iterator directly instead of Array.from
|
|
151
|
+
let existingRunning = false;
|
|
152
|
+
for (const task of this.tasks.values()) {
|
|
153
|
+
if (task.subagentType === agentType && task.status === 'running') {
|
|
154
|
+
existingRunning = true;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (!existingRunning) {
|
|
159
|
+
this.createTaskFromTerminal(agentType, data);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Detect task completion patterns
|
|
164
|
+
for (const pattern of COMPLETE_PATTERNS) {
|
|
165
|
+
if (pattern.test(data)) {
|
|
166
|
+
// Complete the most recent running task
|
|
167
|
+
const runningTask = this.getMostRecentRunningTask();
|
|
168
|
+
if (runningTask) {
|
|
169
|
+
this.completeTask(runningTask.id);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Handle a tool_use block for the Task tool.
|
|
176
|
+
* Creates a new task and pushes it onto the stack.
|
|
177
|
+
*
|
|
178
|
+
* @param block - The tool_use content block
|
|
179
|
+
* @fires taskCreated
|
|
180
|
+
*/
|
|
181
|
+
handleTaskToolUse(block) {
|
|
182
|
+
const toolUseId = block.id;
|
|
183
|
+
const params = block.input || {};
|
|
184
|
+
const description = params.description || params.prompt?.substring(0, 50) || 'Background task';
|
|
185
|
+
const subagentType = params.subagent_type || 'general';
|
|
186
|
+
// Determine parent (current top of stack or null)
|
|
187
|
+
const parentId = this.taskStack.length > 0 ? this.taskStack[this.taskStack.length - 1] : null;
|
|
188
|
+
// Store pending tool use - task starts when we see activity
|
|
189
|
+
this.pendingToolUses.set(toolUseId, {
|
|
190
|
+
description,
|
|
191
|
+
subagentType,
|
|
192
|
+
parentId,
|
|
193
|
+
createdAt: Date.now(),
|
|
194
|
+
});
|
|
195
|
+
// Clean up old pending entries to prevent unbounded growth
|
|
196
|
+
this.cleanupOldPendingToolUses();
|
|
197
|
+
// Create the task immediately
|
|
198
|
+
const task = {
|
|
199
|
+
id: toolUseId,
|
|
200
|
+
parentId,
|
|
201
|
+
description,
|
|
202
|
+
subagentType,
|
|
203
|
+
status: 'running',
|
|
204
|
+
startTime: Date.now(),
|
|
205
|
+
children: [],
|
|
206
|
+
};
|
|
207
|
+
this.tasks.set(toolUseId, task);
|
|
208
|
+
this.taskStack.push(toolUseId);
|
|
209
|
+
// Update parent's children list
|
|
210
|
+
if (parentId) {
|
|
211
|
+
const parent = this.tasks.get(parentId);
|
|
212
|
+
if (parent) {
|
|
213
|
+
parent.children.push(toolUseId);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
this.emit('taskCreated', task);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Handle a tool_result block.
|
|
220
|
+
* Marks the corresponding task as completed or failed.
|
|
221
|
+
*
|
|
222
|
+
* @param block - The tool_result content block
|
|
223
|
+
* @fires taskCompleted - If result is success
|
|
224
|
+
* @fires taskFailed - If result is error
|
|
225
|
+
*/
|
|
226
|
+
handleToolResult(block) {
|
|
227
|
+
const toolUseId = block.tool_use_id;
|
|
228
|
+
const task = this.tasks.get(toolUseId);
|
|
229
|
+
if (task) {
|
|
230
|
+
task.status = block.is_error ? 'failed' : 'completed';
|
|
231
|
+
task.endTime = Date.now();
|
|
232
|
+
task.output = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);
|
|
233
|
+
// Remove from stack
|
|
234
|
+
const stackIndex = this.taskStack.indexOf(toolUseId);
|
|
235
|
+
if (stackIndex !== -1) {
|
|
236
|
+
this.taskStack.splice(stackIndex, 1);
|
|
237
|
+
}
|
|
238
|
+
if (block.is_error) {
|
|
239
|
+
this.emit('taskFailed', task, task.output || 'Unknown error');
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
this.emit('taskCompleted', task);
|
|
243
|
+
}
|
|
244
|
+
// Clean up old completed tasks to prevent unbounded growth
|
|
245
|
+
this.cleanupCompletedTasks();
|
|
246
|
+
}
|
|
247
|
+
// Clean up pending
|
|
248
|
+
this.pendingToolUses.delete(toolUseId);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Remove old pending tool uses that never received results.
|
|
252
|
+
* Prevents unbounded growth if tool_results never arrive.
|
|
253
|
+
*/
|
|
254
|
+
cleanupOldPendingToolUses() {
|
|
255
|
+
const now = Date.now();
|
|
256
|
+
const toDelete = [];
|
|
257
|
+
// Remove entries older than PENDING_TOOL_USE_MAX_AGE_MS
|
|
258
|
+
for (const [id, entry] of this.pendingToolUses) {
|
|
259
|
+
if (now - entry.createdAt > PENDING_TOOL_USE_MAX_AGE_MS) {
|
|
260
|
+
toDelete.push(id);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// If still over limit after age-based cleanup, remove oldest entries
|
|
264
|
+
if (this.pendingToolUses.size - toDelete.length > MAX_PENDING_TOOL_USES) {
|
|
265
|
+
const entries = Array.from(this.pendingToolUses.entries())
|
|
266
|
+
.filter(([id]) => !toDelete.includes(id))
|
|
267
|
+
.sort((a, b) => a[1].createdAt - b[1].createdAt);
|
|
268
|
+
const removeCount = entries.length - MAX_PENDING_TOOL_USES;
|
|
269
|
+
for (let i = 0; i < removeCount; i++) {
|
|
270
|
+
toDelete.push(entries[i][0]);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
for (const id of toDelete) {
|
|
274
|
+
this.pendingToolUses.delete(id);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Remove old completed/failed tasks when exceeding the limit
|
|
279
|
+
* Keeps running tasks and the most recent completed tasks
|
|
280
|
+
*/
|
|
281
|
+
cleanupCompletedTasks() {
|
|
282
|
+
const completedTasks = [];
|
|
283
|
+
// Collect all completed/failed tasks
|
|
284
|
+
for (const task of this.tasks.values()) {
|
|
285
|
+
if (task.status === 'completed' || task.status === 'failed') {
|
|
286
|
+
completedTasks.push(task);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// If under limit, no cleanup needed
|
|
290
|
+
if (completedTasks.length <= MAX_COMPLETED_TASKS) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
// Sort by end time (oldest first)
|
|
294
|
+
completedTasks.sort((a, b) => (a.endTime || 0) - (b.endTime || 0));
|
|
295
|
+
// Remove oldest tasks beyond the limit
|
|
296
|
+
const toRemove = completedTasks.slice(0, completedTasks.length - MAX_COMPLETED_TASKS);
|
|
297
|
+
for (const task of toRemove) {
|
|
298
|
+
// Remove from parent's children list if applicable
|
|
299
|
+
if (task.parentId) {
|
|
300
|
+
const parent = this.tasks.get(task.parentId);
|
|
301
|
+
if (parent) {
|
|
302
|
+
const childIndex = parent.children.indexOf(task.id);
|
|
303
|
+
if (childIndex !== -1) {
|
|
304
|
+
parent.children.splice(childIndex, 1);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
this.tasks.delete(task.id);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Create a task from terminal pattern detection.
|
|
313
|
+
* Used as fallback when JSON messages aren't available.
|
|
314
|
+
*
|
|
315
|
+
* @param agentType - Type of agent detected
|
|
316
|
+
* @param context - Terminal context for debugging
|
|
317
|
+
* @fires taskCreated
|
|
318
|
+
*/
|
|
319
|
+
createTaskFromTerminal(agentType, _context) {
|
|
320
|
+
const taskId = `terminal-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
|
|
321
|
+
const parentId = this.taskStack.length > 0 ? this.taskStack[this.taskStack.length - 1] : null;
|
|
322
|
+
const task = {
|
|
323
|
+
id: taskId,
|
|
324
|
+
parentId,
|
|
325
|
+
description: `${agentType} agent`,
|
|
326
|
+
subagentType: agentType,
|
|
327
|
+
status: 'running',
|
|
328
|
+
startTime: Date.now(),
|
|
329
|
+
children: [],
|
|
330
|
+
};
|
|
331
|
+
this.tasks.set(taskId, task);
|
|
332
|
+
this.taskStack.push(taskId);
|
|
333
|
+
if (parentId) {
|
|
334
|
+
const parent = this.tasks.get(parentId);
|
|
335
|
+
if (parent) {
|
|
336
|
+
parent.children.push(taskId);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
this.emit('taskCreated', task);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Mark a task as completed.
|
|
343
|
+
*
|
|
344
|
+
* @param taskId - ID of task to complete
|
|
345
|
+
* @fires taskCompleted - If task was running
|
|
346
|
+
*/
|
|
347
|
+
completeTask(taskId) {
|
|
348
|
+
const task = this.tasks.get(taskId);
|
|
349
|
+
if (task && task.status === 'running') {
|
|
350
|
+
task.status = 'completed';
|
|
351
|
+
task.endTime = Date.now();
|
|
352
|
+
const stackIndex = this.taskStack.indexOf(taskId);
|
|
353
|
+
if (stackIndex !== -1) {
|
|
354
|
+
this.taskStack.splice(stackIndex, 1);
|
|
355
|
+
}
|
|
356
|
+
this.emit('taskCompleted', task);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get the most recently started running task.
|
|
361
|
+
* Returns the task at the top of the stack (most nested).
|
|
362
|
+
*
|
|
363
|
+
* @returns Most recent running task, or undefined if none
|
|
364
|
+
*/
|
|
365
|
+
getMostRecentRunningTask() {
|
|
366
|
+
// Return the task at the top of the stack
|
|
367
|
+
if (this.taskStack.length > 0) {
|
|
368
|
+
const taskId = this.taskStack[this.taskStack.length - 1];
|
|
369
|
+
return this.tasks.get(taskId);
|
|
370
|
+
}
|
|
371
|
+
return undefined;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Get root-level tasks as a list.
|
|
375
|
+
*
|
|
376
|
+
* Child tasks can be accessed via the `children` array on each task.
|
|
377
|
+
* Use this for displaying a task tree in the UI.
|
|
378
|
+
*
|
|
379
|
+
* @returns Array of tasks without parents (root level)
|
|
380
|
+
*/
|
|
381
|
+
getTaskTree() {
|
|
382
|
+
const rootTasks = [];
|
|
383
|
+
for (const task of this.tasks.values()) {
|
|
384
|
+
if (!task.parentId) {
|
|
385
|
+
rootTasks.push(task);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return rootTasks;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Lightweight task tree for SSE broadcasts — strips large `output` strings
|
|
392
|
+
* to avoid serializing 5-10MB of task results every 500ms.
|
|
393
|
+
* Full task details available via getTaskTree().
|
|
394
|
+
*
|
|
395
|
+
* @returns Array of root tasks with output truncated to 200 chars
|
|
396
|
+
*/
|
|
397
|
+
getTaskTreeLight() {
|
|
398
|
+
const rootTasks = [];
|
|
399
|
+
for (const task of this.tasks.values()) {
|
|
400
|
+
if (!task.parentId) {
|
|
401
|
+
// Strip output to avoid serializing large strings on every broadcast
|
|
402
|
+
const { output: _output, ...lightTask } = task;
|
|
403
|
+
rootTasks.push(lightTask);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return rootTasks;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Get all tasks as a flat Map.
|
|
410
|
+
*
|
|
411
|
+
* @returns Copy of the internal tasks map (safe to modify)
|
|
412
|
+
*/
|
|
413
|
+
getAllTasks() {
|
|
414
|
+
return new Map(this.tasks);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Get a specific task by its ID.
|
|
418
|
+
*
|
|
419
|
+
* @param taskId - The task ID to look up
|
|
420
|
+
* @returns The task if found, undefined otherwise
|
|
421
|
+
*/
|
|
422
|
+
getTask(taskId) {
|
|
423
|
+
return this.tasks.get(taskId);
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Get the count of currently running tasks.
|
|
427
|
+
*
|
|
428
|
+
* @returns Number of tasks with status 'running'
|
|
429
|
+
*/
|
|
430
|
+
getRunningCount() {
|
|
431
|
+
let count = 0;
|
|
432
|
+
for (const task of this.tasks.values()) {
|
|
433
|
+
if (task.status === 'running')
|
|
434
|
+
count++;
|
|
435
|
+
}
|
|
436
|
+
return count;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Get aggregated statistics about all tracked tasks.
|
|
440
|
+
*
|
|
441
|
+
* @returns Object with counts:
|
|
442
|
+
* - total: Total number of tracked tasks
|
|
443
|
+
* - running: Tasks currently executing
|
|
444
|
+
* - completed: Successfully finished tasks
|
|
445
|
+
* - failed: Tasks that ended with errors
|
|
446
|
+
*/
|
|
447
|
+
getStats() {
|
|
448
|
+
let running = 0, completed = 0, failed = 0;
|
|
449
|
+
for (const task of this.tasks.values()) {
|
|
450
|
+
switch (task.status) {
|
|
451
|
+
case 'running':
|
|
452
|
+
running++;
|
|
453
|
+
break;
|
|
454
|
+
case 'completed':
|
|
455
|
+
completed++;
|
|
456
|
+
break;
|
|
457
|
+
case 'failed':
|
|
458
|
+
failed++;
|
|
459
|
+
break;
|
|
460
|
+
default:
|
|
461
|
+
assertNever(task.status, `Unhandled BackgroundTask status: ${task.status}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return { total: this.tasks.size, running, completed, failed };
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Clear all tracked tasks.
|
|
468
|
+
*
|
|
469
|
+
* Use when the session is cleared or closed.
|
|
470
|
+
* Resets the task map, stack, and pending tool uses.
|
|
471
|
+
*/
|
|
472
|
+
clear() {
|
|
473
|
+
this.tasks.clear();
|
|
474
|
+
this.taskStack = [];
|
|
475
|
+
this.pendingToolUses.clear();
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Clean up resources and release memory.
|
|
479
|
+
*
|
|
480
|
+
* Call this when the session is being destroyed to prevent memory leaks.
|
|
481
|
+
* Clears all data and removes all event listeners.
|
|
482
|
+
*/
|
|
483
|
+
destroy() {
|
|
484
|
+
this.clear();
|
|
485
|
+
this.removeAllListeners();
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=task-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-tracker.js","sourceRoot":"","sources":["../src/task-tracker.ts"],"names":[],"mappings":"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"}
|
package/dist/task.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Task model for Claude prompt execution
|
|
3
|
+
*
|
|
4
|
+
* Represents a single task (prompt) to be executed by a Claude session.
|
|
5
|
+
* Tasks support priority ordering, dependencies, and completion detection.
|
|
6
|
+
*
|
|
7
|
+
* @module task
|
|
8
|
+
*/
|
|
9
|
+
import { TaskDefinition, TaskState, TaskStatus } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Options for creating a new task.
|
|
12
|
+
*/
|
|
13
|
+
export interface CreateTaskOptions {
|
|
14
|
+
prompt: string;
|
|
15
|
+
workingDir?: string;
|
|
16
|
+
priority?: number;
|
|
17
|
+
dependencies?: string[];
|
|
18
|
+
completionPhrase?: string;
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A task representing a prompt to be executed by a Claude session.
|
|
23
|
+
*
|
|
24
|
+
* @description
|
|
25
|
+
* Tasks have a lifecycle: pending → running → completed/failed
|
|
26
|
+
* They support priority ordering and dependency chains.
|
|
27
|
+
*/
|
|
28
|
+
export declare class Task {
|
|
29
|
+
readonly id: string;
|
|
30
|
+
readonly prompt: string;
|
|
31
|
+
readonly workingDir: string;
|
|
32
|
+
readonly priority: number;
|
|
33
|
+
readonly dependencies: string[];
|
|
34
|
+
readonly completionPhrase: string | undefined;
|
|
35
|
+
readonly timeoutMs: number | undefined;
|
|
36
|
+
readonly createdAt: number;
|
|
37
|
+
private _status;
|
|
38
|
+
private _assignedSessionId;
|
|
39
|
+
private _startedAt;
|
|
40
|
+
private _completedAt;
|
|
41
|
+
private _output;
|
|
42
|
+
private _error;
|
|
43
|
+
/** Pre-compiled regex for completion phrase detection (avoids re-creation per check) */
|
|
44
|
+
private readonly _completionPattern;
|
|
45
|
+
constructor(options: CreateTaskOptions, id?: string);
|
|
46
|
+
get status(): TaskStatus;
|
|
47
|
+
get assignedSessionId(): string | null;
|
|
48
|
+
get startedAt(): number | null;
|
|
49
|
+
get completedAt(): number | null;
|
|
50
|
+
get output(): string;
|
|
51
|
+
get error(): string | null;
|
|
52
|
+
isPending(): boolean;
|
|
53
|
+
isRunning(): boolean;
|
|
54
|
+
isCompleted(): boolean;
|
|
55
|
+
isFailed(): boolean;
|
|
56
|
+
isDone(): boolean;
|
|
57
|
+
toDefinition(): TaskDefinition;
|
|
58
|
+
toState(): TaskState;
|
|
59
|
+
/** Reconstructs a Task from persisted state. */
|
|
60
|
+
static fromState(state: TaskState): Task;
|
|
61
|
+
/** Assigns this task to a session and marks it as running. */
|
|
62
|
+
assign(sessionId: string): void;
|
|
63
|
+
appendOutput(output: string): void;
|
|
64
|
+
setError(error: string): void;
|
|
65
|
+
complete(): void;
|
|
66
|
+
fail(error?: string): void;
|
|
67
|
+
reset(): void;
|
|
68
|
+
/** Checks if output contains the completion phrase. */
|
|
69
|
+
checkCompletion(output: string): boolean;
|
|
70
|
+
/** Returns true if the task has exceeded its timeout. */
|
|
71
|
+
isTimedOut(): boolean;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAUnE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,qBAAa,IAAI;IACf,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgB;gBAEvC,OAAO,EAAE,iBAAiB,EAAE,EAAE,CAAC,EAAE,MAAM;IAcnD,IAAI,MAAM,IAAI,UAAU,CAEvB;IAED,IAAI,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAErC;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,SAAS,IAAI,OAAO;IAIpB,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,OAAO;IAItB,QAAQ,IAAI,OAAO;IAInB,MAAM,IAAI,OAAO;IAIjB,YAAY,IAAI,cAAc;IAY9B,OAAO,IAAI,SAAS;IAapB,gDAAgD;IAChD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAqBxC,8DAA8D;IAC9D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAS/B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,QAAQ,IAAI,IAAI;IAKhB,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ1B,KAAK,IAAI,IAAI;IASb,uDAAuD;IACvD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAQxC,yDAAyD;IACzD,UAAU,IAAI,OAAO;CAMtB"}
|