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.
Files changed (246) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +403 -0
  3. package/dist/ai-checker-base.d.ts +175 -0
  4. package/dist/ai-checker-base.d.ts.map +1 -0
  5. package/dist/ai-checker-base.js +424 -0
  6. package/dist/ai-checker-base.js.map +1 -0
  7. package/dist/ai-idle-checker.d.ts +53 -0
  8. package/dist/ai-idle-checker.d.ts.map +1 -0
  9. package/dist/ai-idle-checker.js +141 -0
  10. package/dist/ai-idle-checker.js.map +1 -0
  11. package/dist/ai-plan-checker.d.ts +52 -0
  12. package/dist/ai-plan-checker.d.ts.map +1 -0
  13. package/dist/ai-plan-checker.js +103 -0
  14. package/dist/ai-plan-checker.js.map +1 -0
  15. package/dist/bash-tool-parser.d.ts +191 -0
  16. package/dist/bash-tool-parser.d.ts.map +1 -0
  17. package/dist/bash-tool-parser.js +598 -0
  18. package/dist/bash-tool-parser.js.map +1 -0
  19. package/dist/cli.d.ts +12 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +460 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config/buffer-limits.d.ts +59 -0
  24. package/dist/config/buffer-limits.d.ts.map +1 -0
  25. package/dist/config/buffer-limits.js +74 -0
  26. package/dist/config/buffer-limits.js.map +1 -0
  27. package/dist/config/map-limits.d.ts +40 -0
  28. package/dist/config/map-limits.d.ts.map +1 -0
  29. package/dist/config/map-limits.js +52 -0
  30. package/dist/config/map-limits.js.map +1 -0
  31. package/dist/file-stream-manager.d.ts +148 -0
  32. package/dist/file-stream-manager.d.ts.map +1 -0
  33. package/dist/file-stream-manager.js +351 -0
  34. package/dist/file-stream-manager.js.map +1 -0
  35. package/dist/hooks-config.d.ts +31 -0
  36. package/dist/hooks-config.d.ts.map +1 -0
  37. package/dist/hooks-config.js +115 -0
  38. package/dist/hooks-config.js.map +1 -0
  39. package/dist/image-watcher.d.ts +86 -0
  40. package/dist/image-watcher.d.ts.map +1 -0
  41. package/dist/image-watcher.js +275 -0
  42. package/dist/image-watcher.js.map +1 -0
  43. package/dist/index.d.ts +11 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +54 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/mux-factory.d.ts +13 -0
  48. package/dist/mux-factory.d.ts.map +1 -0
  49. package/dist/mux-factory.js +19 -0
  50. package/dist/mux-factory.js.map +1 -0
  51. package/dist/mux-interface.d.ts +145 -0
  52. package/dist/mux-interface.d.ts.map +1 -0
  53. package/dist/mux-interface.js +9 -0
  54. package/dist/mux-interface.js.map +1 -0
  55. package/dist/plan-orchestrator.d.ts +123 -0
  56. package/dist/plan-orchestrator.d.ts.map +1 -0
  57. package/dist/plan-orchestrator.js +500 -0
  58. package/dist/plan-orchestrator.js.map +1 -0
  59. package/dist/prompts/index.d.ts +9 -0
  60. package/dist/prompts/index.d.ts.map +1 -0
  61. package/dist/prompts/index.js +9 -0
  62. package/dist/prompts/index.js.map +1 -0
  63. package/dist/prompts/planner.d.ts +14 -0
  64. package/dist/prompts/planner.d.ts.map +1 -0
  65. package/dist/prompts/planner.js +83 -0
  66. package/dist/prompts/planner.js.map +1 -0
  67. package/dist/prompts/research-agent.d.ts +10 -0
  68. package/dist/prompts/research-agent.d.ts.map +1 -0
  69. package/dist/prompts/research-agent.js +143 -0
  70. package/dist/prompts/research-agent.js.map +1 -0
  71. package/dist/push-store.d.ts +41 -0
  72. package/dist/push-store.d.ts.map +1 -0
  73. package/dist/push-store.js +168 -0
  74. package/dist/push-store.js.map +1 -0
  75. package/dist/ralph-config.d.ts +67 -0
  76. package/dist/ralph-config.d.ts.map +1 -0
  77. package/dist/ralph-config.js +134 -0
  78. package/dist/ralph-config.js.map +1 -0
  79. package/dist/ralph-loop.d.ts +124 -0
  80. package/dist/ralph-loop.d.ts.map +1 -0
  81. package/dist/ralph-loop.js +418 -0
  82. package/dist/ralph-loop.js.map +1 -0
  83. package/dist/ralph-tracker.d.ts +1081 -0
  84. package/dist/ralph-tracker.d.ts.map +1 -0
  85. package/dist/ralph-tracker.js +3343 -0
  86. package/dist/ralph-tracker.js.map +1 -0
  87. package/dist/respawn-controller.d.ts +1182 -0
  88. package/dist/respawn-controller.d.ts.map +1 -0
  89. package/dist/respawn-controller.js +2754 -0
  90. package/dist/respawn-controller.js.map +1 -0
  91. package/dist/run-summary.d.ts +123 -0
  92. package/dist/run-summary.d.ts.map +1 -0
  93. package/dist/run-summary.js +325 -0
  94. package/dist/run-summary.js.map +1 -0
  95. package/dist/session-lifecycle-log.d.ts +36 -0
  96. package/dist/session-lifecycle-log.d.ts.map +1 -0
  97. package/dist/session-lifecycle-log.js +101 -0
  98. package/dist/session-lifecycle-log.js.map +1 -0
  99. package/dist/session-manager.d.ts +97 -0
  100. package/dist/session-manager.d.ts.map +1 -0
  101. package/dist/session-manager.js +224 -0
  102. package/dist/session-manager.js.map +1 -0
  103. package/dist/session.d.ts +686 -0
  104. package/dist/session.d.ts.map +1 -0
  105. package/dist/session.js +2025 -0
  106. package/dist/session.js.map +1 -0
  107. package/dist/state-store.d.ts +189 -0
  108. package/dist/state-store.d.ts.map +1 -0
  109. package/dist/state-store.js +730 -0
  110. package/dist/state-store.js.map +1 -0
  111. package/dist/subagent-watcher.d.ts +345 -0
  112. package/dist/subagent-watcher.d.ts.map +1 -0
  113. package/dist/subagent-watcher.js +1469 -0
  114. package/dist/subagent-watcher.js.map +1 -0
  115. package/dist/task-queue.d.ts +108 -0
  116. package/dist/task-queue.d.ts.map +1 -0
  117. package/dist/task-queue.js +235 -0
  118. package/dist/task-queue.js.map +1 -0
  119. package/dist/task-tracker.d.ts +306 -0
  120. package/dist/task-tracker.d.ts.map +1 -0
  121. package/dist/task-tracker.js +488 -0
  122. package/dist/task-tracker.js.map +1 -0
  123. package/dist/task.d.ts +73 -0
  124. package/dist/task.d.ts.map +1 -0
  125. package/dist/task.js +177 -0
  126. package/dist/task.js.map +1 -0
  127. package/dist/team-watcher.d.ts +53 -0
  128. package/dist/team-watcher.d.ts.map +1 -0
  129. package/dist/team-watcher.js +313 -0
  130. package/dist/team-watcher.js.map +1 -0
  131. package/dist/templates/case-template.md +461 -0
  132. package/dist/templates/claude-md.d.ts +26 -0
  133. package/dist/templates/claude-md.d.ts.map +1 -0
  134. package/dist/templates/claude-md.js +74 -0
  135. package/dist/templates/claude-md.js.map +1 -0
  136. package/dist/tmux-manager.d.ts +181 -0
  137. package/dist/tmux-manager.d.ts.map +1 -0
  138. package/dist/tmux-manager.js +1405 -0
  139. package/dist/tmux-manager.js.map +1 -0
  140. package/dist/transcript-watcher.d.ts +110 -0
  141. package/dist/transcript-watcher.d.ts.map +1 -0
  142. package/dist/transcript-watcher.js +338 -0
  143. package/dist/transcript-watcher.js.map +1 -0
  144. package/dist/tunnel-manager.d.ts +54 -0
  145. package/dist/tunnel-manager.d.ts.map +1 -0
  146. package/dist/tunnel-manager.js +251 -0
  147. package/dist/tunnel-manager.js.map +1 -0
  148. package/dist/types.d.ts +1139 -0
  149. package/dist/types.d.ts.map +1 -0
  150. package/dist/types.js +215 -0
  151. package/dist/types.js.map +1 -0
  152. package/dist/utils/buffer-accumulator.d.ts +111 -0
  153. package/dist/utils/buffer-accumulator.d.ts.map +1 -0
  154. package/dist/utils/buffer-accumulator.js +172 -0
  155. package/dist/utils/buffer-accumulator.js.map +1 -0
  156. package/dist/utils/claude-cli-resolver.d.ts +26 -0
  157. package/dist/utils/claude-cli-resolver.d.ts.map +1 -0
  158. package/dist/utils/claude-cli-resolver.js +78 -0
  159. package/dist/utils/claude-cli-resolver.js.map +1 -0
  160. package/dist/utils/cleanup-manager.d.ts +165 -0
  161. package/dist/utils/cleanup-manager.d.ts.map +1 -0
  162. package/dist/utils/cleanup-manager.js +274 -0
  163. package/dist/utils/cleanup-manager.js.map +1 -0
  164. package/dist/utils/index.d.ts +19 -0
  165. package/dist/utils/index.d.ts.map +1 -0
  166. package/dist/utils/index.js +19 -0
  167. package/dist/utils/index.js.map +1 -0
  168. package/dist/utils/lru-map.d.ts +140 -0
  169. package/dist/utils/lru-map.d.ts.map +1 -0
  170. package/dist/utils/lru-map.js +234 -0
  171. package/dist/utils/lru-map.js.map +1 -0
  172. package/dist/utils/nice-wrapper.d.ts +13 -0
  173. package/dist/utils/nice-wrapper.d.ts.map +1 -0
  174. package/dist/utils/nice-wrapper.js +17 -0
  175. package/dist/utils/nice-wrapper.js.map +1 -0
  176. package/dist/utils/opencode-cli-resolver.d.ts +21 -0
  177. package/dist/utils/opencode-cli-resolver.d.ts.map +1 -0
  178. package/dist/utils/opencode-cli-resolver.js +67 -0
  179. package/dist/utils/opencode-cli-resolver.js.map +1 -0
  180. package/dist/utils/regex-patterns.d.ts +64 -0
  181. package/dist/utils/regex-patterns.d.ts.map +1 -0
  182. package/dist/utils/regex-patterns.js +74 -0
  183. package/dist/utils/regex-patterns.js.map +1 -0
  184. package/dist/utils/stale-expiration-map.d.ts +159 -0
  185. package/dist/utils/stale-expiration-map.d.ts.map +1 -0
  186. package/dist/utils/stale-expiration-map.js +277 -0
  187. package/dist/utils/stale-expiration-map.js.map +1 -0
  188. package/dist/utils/string-similarity.d.ts +108 -0
  189. package/dist/utils/string-similarity.d.ts.map +1 -0
  190. package/dist/utils/string-similarity.js +189 -0
  191. package/dist/utils/string-similarity.js.map +1 -0
  192. package/dist/utils/token-validation.d.ts +39 -0
  193. package/dist/utils/token-validation.d.ts.map +1 -0
  194. package/dist/utils/token-validation.js +59 -0
  195. package/dist/utils/token-validation.js.map +1 -0
  196. package/dist/utils/type-safety.d.ts +33 -0
  197. package/dist/utils/type-safety.d.ts.map +1 -0
  198. package/dist/utils/type-safety.js +35 -0
  199. package/dist/utils/type-safety.js.map +1 -0
  200. package/dist/web/public/app.js +491 -0
  201. package/dist/web/public/app.js.br +0 -0
  202. package/dist/web/public/app.js.gz +0 -0
  203. package/dist/web/public/index.html +1675 -0
  204. package/dist/web/public/index.html.br +0 -0
  205. package/dist/web/public/index.html.gz +0 -0
  206. package/dist/web/public/manifest.json +8 -0
  207. package/dist/web/public/mobile.css +1 -0
  208. package/dist/web/public/mobile.css.br +0 -0
  209. package/dist/web/public/mobile.css.gz +0 -0
  210. package/dist/web/public/ralph-wizard.js +1037 -0
  211. package/dist/web/public/ralph-wizard.js.br +0 -0
  212. package/dist/web/public/ralph-wizard.js.gz +0 -0
  213. package/dist/web/public/styles.css +1 -0
  214. package/dist/web/public/styles.css.br +0 -0
  215. package/dist/web/public/styles.css.gz +0 -0
  216. package/dist/web/public/sw.js +67 -0
  217. package/dist/web/public/sw.js.br +0 -0
  218. package/dist/web/public/sw.js.gz +0 -0
  219. package/dist/web/public/upload.html +155 -0
  220. package/dist/web/public/upload.html.br +0 -0
  221. package/dist/web/public/upload.html.gz +0 -0
  222. package/dist/web/public/vendor/xterm-addon-fit.min.js +1 -0
  223. package/dist/web/public/vendor/xterm-addon-fit.min.js.br +0 -0
  224. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  225. package/dist/web/public/vendor/xterm-addon-unicode11.min.js +1 -0
  226. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.br +0 -0
  227. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  228. package/dist/web/public/vendor/xterm-addon-webgl.min.js +2 -0
  229. package/dist/web/public/vendor/xterm-addon-webgl.min.js.br +0 -0
  230. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  231. package/dist/web/public/vendor/xterm.css +209 -0
  232. package/dist/web/public/vendor/xterm.css.br +0 -0
  233. package/dist/web/public/vendor/xterm.css.gz +0 -0
  234. package/dist/web/public/vendor/xterm.min.js +9 -0
  235. package/dist/web/public/vendor/xterm.min.js.br +0 -0
  236. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  237. package/dist/web/schemas.d.ts +479 -0
  238. package/dist/web/schemas.d.ts.map +1 -0
  239. package/dist/web/schemas.js +448 -0
  240. package/dist/web/schemas.js.map +1 -0
  241. package/dist/web/server.d.ts +207 -0
  242. package/dist/web/server.d.ts.map +1 -0
  243. package/dist/web/server.js +5784 -0
  244. package/dist/web/server.js.map +1 -0
  245. package/package.json +110 -0
  246. 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"}