oh-my-claude-sisyphus 3.6.3 → 3.7.2

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 (163) hide show
  1. package/README.md +40 -1
  2. package/commands/hud.md +37 -5
  3. package/commands/omc-setup.md +105 -0
  4. package/dist/__tests__/delegation-enforcement-levels.test.d.ts +9 -0
  5. package/dist/__tests__/delegation-enforcement-levels.test.d.ts.map +1 -0
  6. package/dist/__tests__/delegation-enforcement-levels.test.js +550 -0
  7. package/dist/__tests__/delegation-enforcement-levels.test.js.map +1 -0
  8. package/dist/__tests__/hud/analytics-display.test.js +137 -1
  9. package/dist/__tests__/hud/analytics-display.test.js.map +1 -1
  10. package/dist/__tests__/hud-windows.test.d.ts +2 -0
  11. package/dist/__tests__/hud-windows.test.d.ts.map +1 -0
  12. package/dist/__tests__/hud-windows.test.js +91 -0
  13. package/dist/__tests__/hud-windows.test.js.map +1 -0
  14. package/dist/__tests__/installer.test.js +1 -1
  15. package/dist/__tests__/rate-limit-wait/daemon.test.d.ts +5 -0
  16. package/dist/__tests__/rate-limit-wait/daemon.test.d.ts.map +1 -0
  17. package/dist/__tests__/rate-limit-wait/daemon.test.js +313 -0
  18. package/dist/__tests__/rate-limit-wait/daemon.test.js.map +1 -0
  19. package/dist/__tests__/rate-limit-wait/integration.test.d.ts +8 -0
  20. package/dist/__tests__/rate-limit-wait/integration.test.d.ts.map +1 -0
  21. package/dist/__tests__/rate-limit-wait/integration.test.js +329 -0
  22. package/dist/__tests__/rate-limit-wait/integration.test.js.map +1 -0
  23. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts +5 -0
  24. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts.map +1 -0
  25. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js +167 -0
  26. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js.map +1 -0
  27. package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts +5 -0
  28. package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts.map +1 -0
  29. package/dist/__tests__/rate-limit-wait/tmux-detector.test.js +295 -0
  30. package/dist/__tests__/rate-limit-wait/tmux-detector.test.js.map +1 -0
  31. package/dist/cli/commands/wait.d.ts +52 -0
  32. package/dist/cli/commands/wait.d.ts.map +1 -0
  33. package/dist/cli/commands/wait.js +229 -0
  34. package/dist/cli/commands/wait.js.map +1 -0
  35. package/dist/cli/index.js +54 -0
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/features/rate-limit-wait/daemon.d.ts +52 -0
  38. package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -0
  39. package/dist/features/rate-limit-wait/daemon.js +585 -0
  40. package/dist/features/rate-limit-wait/daemon.js.map +1 -0
  41. package/dist/features/rate-limit-wait/index.d.ts +16 -0
  42. package/dist/features/rate-limit-wait/index.d.ts.map +1 -0
  43. package/dist/features/rate-limit-wait/index.js +18 -0
  44. package/dist/features/rate-limit-wait/index.js.map +1 -0
  45. package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts +22 -0
  46. package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts.map +1 -0
  47. package/dist/features/rate-limit-wait/rate-limit-monitor.js +99 -0
  48. package/dist/features/rate-limit-wait/rate-limit-monitor.js.map +1 -0
  49. package/dist/features/rate-limit-wait/tmux-detector.d.ts +59 -0
  50. package/dist/features/rate-limit-wait/tmux-detector.d.ts.map +1 -0
  51. package/dist/features/rate-limit-wait/tmux-detector.js +304 -0
  52. package/dist/features/rate-limit-wait/tmux-detector.js.map +1 -0
  53. package/dist/features/rate-limit-wait/types.d.ts +121 -0
  54. package/dist/features/rate-limit-wait/types.d.ts.map +1 -0
  55. package/dist/features/rate-limit-wait/types.js +8 -0
  56. package/dist/features/rate-limit-wait/types.js.map +1 -0
  57. package/dist/features/state-manager/index.d.ts.map +1 -1
  58. package/dist/features/state-manager/index.js +4 -1
  59. package/dist/features/state-manager/index.js.map +1 -1
  60. package/dist/hooks/bridge.d.ts +1 -1
  61. package/dist/hooks/bridge.d.ts.map +1 -1
  62. package/dist/hooks/bridge.js +50 -4
  63. package/dist/hooks/bridge.js.map +1 -1
  64. package/dist/hooks/index.d.ts +5 -0
  65. package/dist/hooks/index.d.ts.map +1 -1
  66. package/dist/hooks/index.js +15 -0
  67. package/dist/hooks/index.js.map +1 -1
  68. package/dist/hooks/omc-orchestrator/audit.d.ts +2 -1
  69. package/dist/hooks/omc-orchestrator/audit.d.ts.map +1 -1
  70. package/dist/hooks/omc-orchestrator/audit.js.map +1 -1
  71. package/dist/hooks/omc-orchestrator/index.d.ts +7 -0
  72. package/dist/hooks/omc-orchestrator/index.d.ts.map +1 -1
  73. package/dist/hooks/omc-orchestrator/index.js +95 -8
  74. package/dist/hooks/omc-orchestrator/index.js.map +1 -1
  75. package/dist/hooks/permission-handler/__tests__/index.test.d.ts +2 -0
  76. package/dist/hooks/permission-handler/__tests__/index.test.d.ts.map +1 -0
  77. package/dist/hooks/permission-handler/__tests__/index.test.js +291 -0
  78. package/dist/hooks/permission-handler/__tests__/index.test.js.map +1 -0
  79. package/dist/hooks/permission-handler/index.d.ts +42 -0
  80. package/dist/hooks/permission-handler/index.d.ts.map +1 -0
  81. package/dist/hooks/permission-handler/index.js +107 -0
  82. package/dist/hooks/permission-handler/index.js.map +1 -0
  83. package/dist/hooks/plugin-patterns/index.d.ts +5 -0
  84. package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
  85. package/dist/hooks/plugin-patterns/index.js +26 -1
  86. package/dist/hooks/plugin-patterns/index.js.map +1 -1
  87. package/dist/hooks/pre-compact/index.d.ts +82 -0
  88. package/dist/hooks/pre-compact/index.d.ts.map +1 -0
  89. package/dist/hooks/pre-compact/index.js +265 -0
  90. package/dist/hooks/pre-compact/index.js.map +1 -0
  91. package/dist/hooks/session-end/index.d.ts +42 -0
  92. package/dist/hooks/session-end/index.d.ts.map +1 -0
  93. package/dist/hooks/session-end/index.js +200 -0
  94. package/dist/hooks/session-end/index.js.map +1 -0
  95. package/dist/hooks/setup/index.d.ts +66 -0
  96. package/dist/hooks/setup/index.d.ts.map +1 -0
  97. package/dist/hooks/setup/index.js +299 -0
  98. package/dist/hooks/setup/index.js.map +1 -0
  99. package/dist/hooks/setup/types.d.ts +25 -0
  100. package/dist/hooks/setup/types.d.ts.map +1 -0
  101. package/dist/hooks/setup/types.js +5 -0
  102. package/dist/hooks/setup/types.js.map +1 -0
  103. package/dist/hooks/subagent-tracker/index.d.ts +68 -29
  104. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
  105. package/dist/hooks/subagent-tracker/index.js +316 -131
  106. package/dist/hooks/subagent-tracker/index.js.map +1 -1
  107. package/dist/hud/analytics-display.d.ts +16 -0
  108. package/dist/hud/analytics-display.d.ts.map +1 -1
  109. package/dist/hud/analytics-display.js +35 -9
  110. package/dist/hud/analytics-display.js.map +1 -1
  111. package/dist/hud/render.d.ts.map +1 -1
  112. package/dist/hud/render.js +49 -18
  113. package/dist/hud/render.js.map +1 -1
  114. package/dist/hud/types.d.ts +2 -0
  115. package/dist/hud/types.d.ts.map +1 -1
  116. package/dist/hud/types.js +14 -0
  117. package/dist/hud/types.js.map +1 -1
  118. package/dist/installer/index.d.ts +1 -1
  119. package/dist/installer/index.d.ts.map +1 -1
  120. package/dist/installer/index.js +4 -3
  121. package/dist/installer/index.js.map +1 -1
  122. package/hooks/hooks.json +83 -1
  123. package/hooks/keyword-detector.sh +4 -4
  124. package/hooks/persistent-mode.sh +10 -10
  125. package/hooks/session-start.sh +4 -4
  126. package/package.json +3 -1
  127. package/scripts/keyword-detector.mjs +4 -4
  128. package/scripts/permission-handler.mjs +23 -0
  129. package/scripts/persistent-mode.mjs +6 -6
  130. package/scripts/persistent-mode.sh +10 -10
  131. package/scripts/pre-compact.mjs +23 -0
  132. package/scripts/session-end.mjs +23 -0
  133. package/scripts/session-start.mjs +4 -4
  134. package/scripts/setup-init.mjs +23 -0
  135. package/scripts/setup-maintenance.mjs +23 -0
  136. package/scripts/subagent-tracker.mjs +35 -0
  137. package/skills/hud/SKILL.md +37 -5
  138. package/skills/omc-setup/SKILL.md +162 -4
  139. package/skills/writer-memory/SKILL.md +443 -0
  140. package/skills/writer-memory/lib/character-tracker.ts +338 -0
  141. package/skills/writer-memory/lib/memory-manager.ts +804 -0
  142. package/skills/writer-memory/lib/relationship-graph.ts +400 -0
  143. package/skills/writer-memory/lib/scene-organizer.ts +544 -0
  144. package/skills/writer-memory/lib/synopsis-builder.ts +339 -0
  145. package/skills/writer-memory/templates/synopsis-template.md +46 -0
  146. package/templates/hooks/keyword-detector.mjs +198 -0
  147. package/templates/hooks/keyword-detector.sh +102 -0
  148. package/templates/hooks/persistent-mode.mjs +249 -0
  149. package/templates/hooks/persistent-mode.sh +187 -0
  150. package/templates/hooks/post-tool-use.mjs +133 -0
  151. package/templates/hooks/post-tool-use.sh +90 -0
  152. package/templates/hooks/pre-tool-use.mjs +145 -0
  153. package/templates/hooks/pre-tool-use.sh +113 -0
  154. package/templates/hooks/session-start.mjs +100 -0
  155. package/templates/hooks/session-start.sh +62 -0
  156. package/templates/hooks/stop-continuation.mjs +80 -0
  157. package/templates/hooks/stop-continuation.sh +40 -0
  158. package/templates/rules/README.md +40 -0
  159. package/templates/rules/coding-style.md +74 -0
  160. package/templates/rules/git-workflow.md +41 -0
  161. package/templates/rules/performance.md +40 -0
  162. package/templates/rules/security.md +41 -0
  163. package/templates/rules/testing.md +42 -0
@@ -1,207 +1,392 @@
1
1
  /**
2
- * Subagent Tracker Hook
2
+ * Subagent Tracker Hook Module
3
3
  *
4
- * Tracks SubagentStart and SubagentStop events to maintain state of active agents.
5
- * Useful for monitoring parallel execution in ultrapilot, swarm, and other multi-agent modes.
4
+ * Tracks SubagentStart and SubagentStop events for comprehensive agent monitoring.
5
+ * Features:
6
+ * - Track all spawned agents with parent mode context
7
+ * - Detect stuck/stale agents (>5 min without progress)
8
+ * - HUD integration for agent status display
9
+ * - Automatic cleanup of orphaned agent state
6
10
  */
7
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
11
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'fs';
8
12
  import { join } from 'path';
9
13
  // ============================================================================
10
- // State File Management
14
+ // Constants
11
15
  // ============================================================================
16
+ const STATE_FILE = 'subagent-tracking.json';
17
+ const STALE_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes
18
+ const MAX_COMPLETED_AGENTS = 100;
19
+ const LOCK_TIMEOUT_MS = 5000; // 5 second lock timeout
20
+ const LOCK_RETRY_MS = 50; // Retry every 50ms
12
21
  /**
13
- * Get the path to the subagent tracking state file.
22
+ * Synchronous sleep using Atomics.wait
23
+ * Avoids CPU-spinning busy-wait loops
24
+ */
25
+ function syncSleep(ms) {
26
+ const buffer = new SharedArrayBuffer(4);
27
+ const view = new Int32Array(buffer);
28
+ Atomics.wait(view, 0, 0, ms);
29
+ }
30
+ // ============================================================================
31
+ // State Management
32
+ // ============================================================================
33
+ /**
34
+ * Acquire file lock with timeout and stale lock detection
35
+ */
36
+ function acquireLock(directory) {
37
+ const lockPath = join(directory, '.omc', 'state', 'subagent-tracker.lock');
38
+ const lockDir = join(directory, '.omc', 'state');
39
+ if (!existsSync(lockDir)) {
40
+ mkdirSync(lockDir, { recursive: true });
41
+ }
42
+ const startTime = Date.now();
43
+ while (Date.now() - startTime < LOCK_TIMEOUT_MS) {
44
+ try {
45
+ // Check for stale lock (older than timeout)
46
+ if (existsSync(lockPath)) {
47
+ const lockContent = readFileSync(lockPath, 'utf-8');
48
+ const lockTime = parseInt(lockContent, 10);
49
+ if (Date.now() - lockTime > LOCK_TIMEOUT_MS) {
50
+ // Stale lock, remove it
51
+ try {
52
+ unlinkSync(lockPath);
53
+ }
54
+ catch { }
55
+ }
56
+ else {
57
+ // Lock is held, wait and retry
58
+ syncSleep(LOCK_RETRY_MS);
59
+ continue;
60
+ }
61
+ }
62
+ // Try to create lock atomically
63
+ writeFileSync(lockPath, String(Date.now()), { flag: 'wx' });
64
+ return true;
65
+ }
66
+ catch (e) {
67
+ if (e.code === 'EEXIST') {
68
+ // Lock exists, retry
69
+ syncSleep(LOCK_RETRY_MS);
70
+ continue;
71
+ }
72
+ return false;
73
+ }
74
+ }
75
+ return false; // Timeout
76
+ }
77
+ /**
78
+ * Release file lock
79
+ */
80
+ function releaseLock(directory) {
81
+ const lockPath = join(directory, '.omc', 'state', 'subagent-tracker.lock');
82
+ try {
83
+ unlinkSync(lockPath);
84
+ }
85
+ catch {
86
+ // Ignore errors
87
+ }
88
+ }
89
+ /**
90
+ * Get the state file path
14
91
  */
15
92
  export function getStateFilePath(directory) {
16
- return join(directory, '.omc', 'state', 'subagent-tracking.json');
93
+ const stateDir = join(directory, '.omc', 'state');
94
+ if (!existsSync(stateDir)) {
95
+ mkdirSync(stateDir, { recursive: true });
96
+ }
97
+ return join(stateDir, STATE_FILE);
17
98
  }
18
99
  /**
19
- * Read the current subagent tracking state.
100
+ * Read tracking state from file
20
101
  */
21
102
  export function readTrackingState(directory) {
22
- const filePath = getStateFilePath(directory);
23
- if (!existsSync(filePath)) {
24
- return null;
103
+ const statePath = getStateFilePath(directory);
104
+ if (!existsSync(statePath)) {
105
+ return {
106
+ agents: [],
107
+ total_spawned: 0,
108
+ total_completed: 0,
109
+ total_failed: 0,
110
+ last_updated: new Date().toISOString(),
111
+ };
25
112
  }
26
113
  try {
27
- const content = readFileSync(filePath, 'utf-8');
114
+ const content = readFileSync(statePath, 'utf-8');
28
115
  return JSON.parse(content);
29
116
  }
30
117
  catch (error) {
31
- console.error('[subagent-tracker] Failed to read state:', error);
32
- return null;
118
+ console.error('[SubagentTracker] Error reading state:', error);
119
+ return {
120
+ agents: [],
121
+ total_spawned: 0,
122
+ total_completed: 0,
123
+ total_failed: 0,
124
+ last_updated: new Date().toISOString(),
125
+ };
33
126
  }
34
127
  }
35
128
  /**
36
- * Write subagent tracking state to disk.
129
+ * Write tracking state to file
37
130
  */
38
131
  export function writeTrackingState(directory, state) {
39
- const filePath = getStateFilePath(directory);
40
- const stateDir = join(directory, '.omc', 'state');
41
- if (!existsSync(stateDir)) {
42
- mkdirSync(stateDir, { recursive: true });
43
- }
132
+ const statePath = getStateFilePath(directory);
133
+ state.last_updated = new Date().toISOString();
44
134
  try {
45
- writeFileSync(filePath, JSON.stringify(state, null, 2), 'utf-8');
135
+ writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf-8');
46
136
  }
47
137
  catch (error) {
48
- console.error('[subagent-tracker] Failed to write state:', error);
138
+ console.error('[SubagentTracker] Error writing state:', error);
49
139
  }
50
140
  }
141
+ // ============================================================================
142
+ // Helper Functions
143
+ // ============================================================================
51
144
  /**
52
- * Get or initialize tracking state.
145
+ * Detect the current parent mode from state files
53
146
  */
54
- function getOrInitState(directory) {
55
- const existing = readTrackingState(directory);
56
- if (existing) {
57
- return existing;
147
+ function detectParentMode(directory) {
148
+ const stateDir = join(directory, '.omc', 'state');
149
+ if (!existsSync(stateDir)) {
150
+ return 'none';
58
151
  }
59
- return {
60
- active_agents: {},
61
- completed_agents: {},
62
- total_spawned: 0,
63
- total_completed: 0,
64
- };
152
+ // Check in order of specificity
153
+ const modeFiles = [
154
+ { file: 'ultrapilot-state.json', mode: 'ultrapilot' },
155
+ { file: 'autopilot-state.json', mode: 'autopilot' },
156
+ { file: 'swarm-state.json', mode: 'swarm' },
157
+ { file: 'ultrawork-state.json', mode: 'ultrawork' },
158
+ { file: 'ralph-state.json', mode: 'ralph' },
159
+ ];
160
+ for (const { file, mode } of modeFiles) {
161
+ const filePath = join(stateDir, file);
162
+ if (existsSync(filePath)) {
163
+ try {
164
+ const content = readFileSync(filePath, 'utf-8');
165
+ const state = JSON.parse(content);
166
+ if (state.active === true || state.status === 'running' || state.status === 'active') {
167
+ return mode;
168
+ }
169
+ }
170
+ catch {
171
+ continue;
172
+ }
173
+ }
174
+ }
175
+ return 'none';
176
+ }
177
+ /**
178
+ * Get list of stale agents (running for too long)
179
+ */
180
+ export function getStaleAgents(state) {
181
+ const now = Date.now();
182
+ return state.agents.filter((agent) => {
183
+ if (agent.status !== 'running') {
184
+ return false;
185
+ }
186
+ const startTime = new Date(agent.started_at).getTime();
187
+ const elapsed = now - startTime;
188
+ return elapsed > STALE_THRESHOLD_MS;
189
+ });
65
190
  }
66
191
  // ============================================================================
67
- // Hook Event Processors
192
+ // Hook Processors
68
193
  // ============================================================================
69
194
  /**
70
- * Process SubagentStart event - track new agent spawn.
195
+ * Process SubagentStart event
71
196
  */
72
197
  export function processSubagentStart(input) {
73
- const { cwd, agent_id, agent_type } = input;
198
+ if (!acquireLock(input.cwd)) {
199
+ return { continue: true }; // Fail gracefully
200
+ }
74
201
  try {
75
- const state = getOrInitState(cwd);
76
- // Add to active agents
77
- state.active_agents[agent_id] = {
78
- agent_id,
79
- agent_type,
202
+ const state = readTrackingState(input.cwd);
203
+ const parentMode = detectParentMode(input.cwd);
204
+ // Create new agent entry
205
+ const agentInfo = {
206
+ agent_id: input.agent_id,
207
+ agent_type: input.agent_type,
80
208
  started_at: new Date().toISOString(),
209
+ parent_mode: parentMode,
210
+ task_description: input.prompt?.substring(0, 200), // Truncate for storage
211
+ status: 'running',
81
212
  };
213
+ // Add to state
214
+ state.agents.push(agentInfo);
82
215
  state.total_spawned++;
83
- writeTrackingState(cwd, state);
216
+ // Write updated state
217
+ writeTrackingState(input.cwd, state);
218
+ // Check for stale agents
219
+ const staleAgents = getStaleAgents(state);
84
220
  return {
85
- status: 'success',
86
- message: `Tracking started for agent ${agent_id} (${agent_type})`,
87
- data: { agent_id, agent_type },
221
+ continue: true,
222
+ hookSpecificOutput: {
223
+ hookEventName: 'SubagentStart',
224
+ additionalContext: `Agent ${input.agent_type} started (${input.agent_id})`,
225
+ agent_count: state.agents.filter((a) => a.status === 'running').length,
226
+ stale_agents: staleAgents.map((a) => a.agent_id),
227
+ },
88
228
  };
89
229
  }
90
- catch (error) {
91
- return {
92
- status: 'error',
93
- message: `Failed to process SubagentStart: ${error}`,
94
- };
230
+ finally {
231
+ releaseLock(input.cwd);
95
232
  }
96
233
  }
97
234
  /**
98
- * Process SubagentStop event - mark agent as completed.
235
+ * Process SubagentStop event
99
236
  */
100
237
  export function processSubagentStop(input) {
101
- const { cwd, agent_id, agent_transcript_path } = input;
238
+ if (!acquireLock(input.cwd)) {
239
+ return { continue: true }; // Fail gracefully
240
+ }
102
241
  try {
103
- const state = getOrInitState(cwd);
104
- // Find the active agent
105
- const activeAgent = state.active_agents[agent_id];
106
- if (!activeAgent) {
107
- return {
108
- status: 'error',
109
- message: `Agent ${agent_id} not found in active agents`,
110
- };
242
+ const state = readTrackingState(input.cwd);
243
+ // Find the agent
244
+ const agentIndex = state.agents.findIndex((a) => a.agent_id === input.agent_id);
245
+ if (agentIndex !== -1) {
246
+ const agent = state.agents[agentIndex];
247
+ // Update agent status
248
+ agent.status = input.success ? 'completed' : 'failed';
249
+ agent.completed_at = new Date().toISOString();
250
+ // Calculate duration
251
+ const startTime = new Date(agent.started_at).getTime();
252
+ const endTime = new Date(agent.completed_at).getTime();
253
+ agent.duration_ms = endTime - startTime;
254
+ // Store output summary (truncated)
255
+ if (input.output) {
256
+ agent.output_summary = input.output.substring(0, 500);
257
+ }
258
+ // Update counters
259
+ if (input.success) {
260
+ state.total_completed++;
261
+ }
262
+ else {
263
+ state.total_failed++;
264
+ }
111
265
  }
112
- // Calculate duration
113
- const startTime = new Date(activeAgent.started_at).getTime();
114
- const endTime = Date.now();
115
- const duration_ms = endTime - startTime;
116
- // Move to completed agents
117
- state.completed_agents[agent_id] = {
118
- agent_id,
119
- agent_type: activeAgent.agent_type,
120
- duration_ms,
121
- success: true, // Default to true; could be enhanced with exit code
122
- output_summary: agent_transcript_path,
123
- };
124
- // Remove from active agents
125
- delete state.active_agents[agent_id];
126
- state.total_completed++;
127
- writeTrackingState(cwd, state);
266
+ // Evict oldest completed agents if over limit
267
+ const completedAgents = state.agents.filter(a => a.status === 'completed' || a.status === 'failed');
268
+ if (completedAgents.length > MAX_COMPLETED_AGENTS) {
269
+ // Sort by completed_at and keep only the most recent
270
+ completedAgents.sort((a, b) => {
271
+ const timeA = a.completed_at ? new Date(a.completed_at).getTime() : 0;
272
+ const timeB = b.completed_at ? new Date(b.completed_at).getTime() : 0;
273
+ return timeB - timeA; // Newest first
274
+ });
275
+ const toRemove = new Set(completedAgents.slice(MAX_COMPLETED_AGENTS).map(a => a.agent_id));
276
+ state.agents = state.agents.filter(a => !toRemove.has(a.agent_id));
277
+ }
278
+ // Write updated state
279
+ writeTrackingState(input.cwd, state);
280
+ const runningCount = state.agents.filter((a) => a.status === 'running').length;
128
281
  return {
129
- status: 'success',
130
- message: `Agent ${agent_id} completed in ${duration_ms}ms`,
131
- data: { agent_id, duration_ms },
282
+ continue: true,
283
+ hookSpecificOutput: {
284
+ hookEventName: 'SubagentStop',
285
+ additionalContext: `Agent ${input.agent_type} ${input.success ? 'completed' : 'failed'} (${input.agent_id})`,
286
+ agent_count: runningCount,
287
+ },
132
288
  };
133
289
  }
134
- catch (error) {
135
- return {
136
- status: 'error',
137
- message: `Failed to process SubagentStop: ${error}`,
138
- };
290
+ finally {
291
+ releaseLock(input.cwd);
139
292
  }
140
293
  }
141
294
  // ============================================================================
142
- // Utility Functions
295
+ // Cleanup Functions
143
296
  // ============================================================================
144
297
  /**
145
- * Remove agents that have been active for longer than maxAgeMs.
146
- * Useful for cleaning up stale agents that may have crashed.
298
+ * Cleanup stale agents (mark as failed)
147
299
  */
148
- export function cleanupStaleAgents(directory, maxAgeMs = 300000 // 5 minutes default
149
- ) {
150
- const state = readTrackingState(directory);
151
- if (!state) {
152
- return;
300
+ export function cleanupStaleAgents(directory) {
301
+ if (!acquireLock(directory)) {
302
+ return 0; // Could not acquire lock
153
303
  }
154
- const now = Date.now();
155
- let cleaned = 0;
156
- for (const [agent_id, info] of Object.entries(state.active_agents)) {
157
- const startTime = new Date(info.started_at).getTime();
158
- const age = now - startTime;
159
- if (age > maxAgeMs) {
160
- // Move to completed as failed
161
- state.completed_agents[agent_id] = {
162
- agent_id,
163
- agent_type: info.agent_type,
164
- duration_ms: age,
165
- success: false,
166
- output_summary: 'Cleaned up as stale',
167
- };
168
- delete state.active_agents[agent_id];
169
- state.total_completed++;
170
- cleaned++;
304
+ try {
305
+ const state = readTrackingState(directory);
306
+ const staleAgents = getStaleAgents(state);
307
+ if (staleAgents.length === 0) {
308
+ return 0;
309
+ }
310
+ for (const stale of staleAgents) {
311
+ const agentIndex = state.agents.findIndex((a) => a.agent_id === stale.agent_id);
312
+ if (agentIndex !== -1) {
313
+ state.agents[agentIndex].status = 'failed';
314
+ state.agents[agentIndex].completed_at = new Date().toISOString();
315
+ state.agents[agentIndex].output_summary = 'Marked as stale - exceeded timeout';
316
+ state.total_failed++;
317
+ }
171
318
  }
172
- }
173
- if (cleaned > 0) {
174
319
  writeTrackingState(directory, state);
175
- console.log(`[subagent-tracker] Cleaned up ${cleaned} stale agent(s)`);
320
+ return staleAgents.length;
321
+ }
322
+ finally {
323
+ releaseLock(directory);
176
324
  }
177
325
  }
326
+ // ============================================================================
327
+ // Query Functions
328
+ // ============================================================================
178
329
  /**
179
- * Get the count of currently active agents.
330
+ * Get count of active (running) agents
180
331
  */
181
332
  export function getActiveAgentCount(directory) {
182
333
  const state = readTrackingState(directory);
183
- if (!state) {
184
- return 0;
185
- }
186
- return Object.keys(state.active_agents).length;
334
+ return state.agents.filter((a) => a.status === 'running').length;
187
335
  }
188
336
  /**
189
- * Get a count of agents by type (both active and completed).
337
+ * Get agents by type
190
338
  */
191
- export function getAgentsByType(directory) {
339
+ export function getAgentsByType(directory, agentType) {
192
340
  const state = readTrackingState(directory);
193
- if (!state) {
194
- return {};
195
- }
196
- const counts = {};
197
- // Count active agents
198
- for (const info of Object.values(state.active_agents)) {
199
- counts[info.agent_type] = (counts[info.agent_type] || 0) + 1;
200
- }
201
- // Count completed agents
202
- for (const info of Object.values(state.completed_agents)) {
203
- counts[info.agent_type] = (counts[info.agent_type] || 0) + 1;
341
+ return state.agents.filter((a) => a.agent_type === agentType);
342
+ }
343
+ /**
344
+ * Get all running agents
345
+ */
346
+ export function getRunningAgents(directory) {
347
+ const state = readTrackingState(directory);
348
+ return state.agents.filter((a) => a.status === 'running');
349
+ }
350
+ /**
351
+ * Get tracking stats
352
+ */
353
+ export function getTrackingStats(directory) {
354
+ const state = readTrackingState(directory);
355
+ return {
356
+ running: state.agents.filter((a) => a.status === 'running').length,
357
+ completed: state.total_completed,
358
+ failed: state.total_failed,
359
+ total: state.total_spawned,
360
+ };
361
+ }
362
+ // ============================================================================
363
+ // Main Entry Points
364
+ // ============================================================================
365
+ /**
366
+ * Handle SubagentStart hook
367
+ */
368
+ export async function handleSubagentStart(input) {
369
+ return processSubagentStart(input);
370
+ }
371
+ /**
372
+ * Handle SubagentStop hook
373
+ */
374
+ export async function handleSubagentStop(input) {
375
+ return processSubagentStop(input);
376
+ }
377
+ /**
378
+ * Clear all tracking state (for testing or cleanup)
379
+ */
380
+ export function clearTrackingState(directory) {
381
+ const statePath = getStateFilePath(directory);
382
+ if (existsSync(statePath)) {
383
+ try {
384
+ const { unlinkSync } = require('fs');
385
+ unlinkSync(statePath);
386
+ }
387
+ catch (error) {
388
+ console.error('[SubagentTracker] Error clearing state:', error);
389
+ }
204
390
  }
205
- return counts;
206
391
  }
207
392
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/subagent-tracker/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/subagent-tracker/index.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,13 @@ export interface AnalyticsDisplay {
12
12
  cacheEfficiency: string;
13
13
  costColor: 'green' | 'yellow' | 'red';
14
14
  }
15
+ export interface SessionHealthAnalyticsData {
16
+ costIndicator: string;
17
+ cost: string;
18
+ tokens: string;
19
+ cache: string;
20
+ costHour: string;
21
+ }
15
22
  /**
16
23
  * Get analytics display data for the current session.
17
24
  * Safe to call even if analytics modules are not initialized.
@@ -25,12 +32,21 @@ export declare function getAnalyticsDisplay(): Promise<AnalyticsDisplay>;
25
32
  * @deprecated Use renderSessionHealthAnalytics instead
26
33
  */
27
34
  export declare function renderAnalyticsLine(analytics: AnalyticsDisplay): string;
35
+ /**
36
+ * Render analytics respecting showCost/showCache config flags.
37
+ */
38
+ export declare function renderAnalyticsLineWithConfig(analytics: AnalyticsDisplay, showCost: boolean, showCache: boolean): string;
28
39
  /**
29
40
  * Get current session info for HUD display.
30
41
  */
31
42
  export declare function getSessionInfo(): Promise<string>;
43
+ /**
44
+ * Extract structured analytics data from SessionHealth
45
+ */
46
+ export declare function getSessionHealthAnalyticsData(sessionHealth: SessionHealth): SessionHealthAnalyticsData;
32
47
  /**
33
48
  * Render analytics from SessionHealth (no longer calls TokenTracker directly)
49
+ * @deprecated Use getSessionHealthAnalyticsData() and compose in render.ts for config-aware rendering
34
50
  */
35
51
  export declare function renderSessionHealthAnalytics(sessionHealth: SessionHealth): string;
36
52
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"analytics-display.d.ts","sourceRoot":"","sources":["../../src/hud/analytics-display.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA2DrE;AAWD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAKvE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAkBtD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAejF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAUxE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAQ1E"}
1
+ {"version":3,"file":"analytics-display.d.ts","sourceRoot":"","sources":["../../src/hud/analytics-display.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA2DrE;AAWD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAKvE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,gBAAgB,EAC3B,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,OAAO,GACjB,MAAM,CAkBR;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAkBtD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,aAAa,EAAE,aAAa,GAAG,0BAA0B,CAWtG;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAKjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAUxE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAQ1E"}