oh-my-claude-sisyphus 3.6.3 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +16 -0
  2. package/dist/__tests__/delegation-enforcement-levels.test.d.ts +9 -0
  3. package/dist/__tests__/delegation-enforcement-levels.test.d.ts.map +1 -0
  4. package/dist/__tests__/delegation-enforcement-levels.test.js +550 -0
  5. package/dist/__tests__/delegation-enforcement-levels.test.js.map +1 -0
  6. package/dist/__tests__/installer.test.js +1 -1
  7. package/dist/__tests__/rate-limit-wait/daemon.test.d.ts +5 -0
  8. package/dist/__tests__/rate-limit-wait/daemon.test.d.ts.map +1 -0
  9. package/dist/__tests__/rate-limit-wait/daemon.test.js +313 -0
  10. package/dist/__tests__/rate-limit-wait/daemon.test.js.map +1 -0
  11. package/dist/__tests__/rate-limit-wait/integration.test.d.ts +8 -0
  12. package/dist/__tests__/rate-limit-wait/integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/rate-limit-wait/integration.test.js +329 -0
  14. package/dist/__tests__/rate-limit-wait/integration.test.js.map +1 -0
  15. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts +5 -0
  16. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts.map +1 -0
  17. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js +167 -0
  18. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js.map +1 -0
  19. package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts +5 -0
  20. package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts.map +1 -0
  21. package/dist/__tests__/rate-limit-wait/tmux-detector.test.js +295 -0
  22. package/dist/__tests__/rate-limit-wait/tmux-detector.test.js.map +1 -0
  23. package/dist/cli/commands/wait.d.ts +52 -0
  24. package/dist/cli/commands/wait.d.ts.map +1 -0
  25. package/dist/cli/commands/wait.js +229 -0
  26. package/dist/cli/commands/wait.js.map +1 -0
  27. package/dist/cli/index.js +54 -0
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/features/rate-limit-wait/daemon.d.ts +52 -0
  30. package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -0
  31. package/dist/features/rate-limit-wait/daemon.js +545 -0
  32. package/dist/features/rate-limit-wait/daemon.js.map +1 -0
  33. package/dist/features/rate-limit-wait/index.d.ts +16 -0
  34. package/dist/features/rate-limit-wait/index.d.ts.map +1 -0
  35. package/dist/features/rate-limit-wait/index.js +18 -0
  36. package/dist/features/rate-limit-wait/index.js.map +1 -0
  37. package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts +22 -0
  38. package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts.map +1 -0
  39. package/dist/features/rate-limit-wait/rate-limit-monitor.js +99 -0
  40. package/dist/features/rate-limit-wait/rate-limit-monitor.js.map +1 -0
  41. package/dist/features/rate-limit-wait/tmux-detector.d.ts +59 -0
  42. package/dist/features/rate-limit-wait/tmux-detector.d.ts.map +1 -0
  43. package/dist/features/rate-limit-wait/tmux-detector.js +304 -0
  44. package/dist/features/rate-limit-wait/tmux-detector.js.map +1 -0
  45. package/dist/features/rate-limit-wait/types.d.ts +121 -0
  46. package/dist/features/rate-limit-wait/types.d.ts.map +1 -0
  47. package/dist/features/rate-limit-wait/types.js +8 -0
  48. package/dist/features/rate-limit-wait/types.js.map +1 -0
  49. package/dist/hooks/bridge.d.ts +1 -1
  50. package/dist/hooks/bridge.d.ts.map +1 -1
  51. package/dist/hooks/bridge.js +50 -4
  52. package/dist/hooks/bridge.js.map +1 -1
  53. package/dist/hooks/index.d.ts +5 -0
  54. package/dist/hooks/index.d.ts.map +1 -1
  55. package/dist/hooks/index.js +15 -0
  56. package/dist/hooks/index.js.map +1 -1
  57. package/dist/hooks/omc-orchestrator/audit.d.ts +2 -1
  58. package/dist/hooks/omc-orchestrator/audit.d.ts.map +1 -1
  59. package/dist/hooks/omc-orchestrator/audit.js.map +1 -1
  60. package/dist/hooks/omc-orchestrator/index.d.ts +7 -0
  61. package/dist/hooks/omc-orchestrator/index.d.ts.map +1 -1
  62. package/dist/hooks/omc-orchestrator/index.js +95 -8
  63. package/dist/hooks/omc-orchestrator/index.js.map +1 -1
  64. package/dist/hooks/permission-handler/__tests__/index.test.d.ts +2 -0
  65. package/dist/hooks/permission-handler/__tests__/index.test.d.ts.map +1 -0
  66. package/dist/hooks/permission-handler/__tests__/index.test.js +244 -0
  67. package/dist/hooks/permission-handler/__tests__/index.test.js.map +1 -0
  68. package/dist/hooks/permission-handler/index.d.ts +42 -0
  69. package/dist/hooks/permission-handler/index.d.ts.map +1 -0
  70. package/dist/hooks/permission-handler/index.js +111 -0
  71. package/dist/hooks/permission-handler/index.js.map +1 -0
  72. package/dist/hooks/pre-compact/index.d.ts +82 -0
  73. package/dist/hooks/pre-compact/index.d.ts.map +1 -0
  74. package/dist/hooks/pre-compact/index.js +265 -0
  75. package/dist/hooks/pre-compact/index.js.map +1 -0
  76. package/dist/hooks/session-end/index.d.ts +50 -0
  77. package/dist/hooks/session-end/index.d.ts.map +1 -0
  78. package/dist/hooks/session-end/index.js +207 -0
  79. package/dist/hooks/session-end/index.js.map +1 -0
  80. package/dist/hooks/setup/index.d.ts +66 -0
  81. package/dist/hooks/setup/index.d.ts.map +1 -0
  82. package/dist/hooks/setup/index.js +299 -0
  83. package/dist/hooks/setup/index.js.map +1 -0
  84. package/dist/hooks/setup/types.d.ts +25 -0
  85. package/dist/hooks/setup/types.d.ts.map +1 -0
  86. package/dist/hooks/setup/types.js +5 -0
  87. package/dist/hooks/setup/types.js.map +1 -0
  88. package/dist/hooks/subagent-tracker/index.d.ts +68 -29
  89. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
  90. package/dist/hooks/subagent-tracker/index.js +301 -131
  91. package/dist/hooks/subagent-tracker/index.js.map +1 -1
  92. package/dist/installer/index.d.ts +1 -1
  93. package/dist/installer/index.js +1 -1
  94. package/hooks/hooks.json +83 -1
  95. package/package.json +3 -1
  96. package/scripts/permission-handler.mjs +23 -0
  97. package/scripts/pre-compact.mjs +23 -0
  98. package/scripts/session-end.mjs +23 -0
  99. package/scripts/setup-init.mjs +23 -0
  100. package/scripts/setup-maintenance.mjs +23 -0
  101. package/scripts/subagent-tracker.mjs +35 -0
  102. package/templates/hooks/keyword-detector.mjs +198 -0
  103. package/templates/hooks/keyword-detector.sh +102 -0
  104. package/templates/hooks/persistent-mode.mjs +249 -0
  105. package/templates/hooks/persistent-mode.sh +187 -0
  106. package/templates/hooks/post-tool-use.mjs +133 -0
  107. package/templates/hooks/post-tool-use.sh +90 -0
  108. package/templates/hooks/pre-tool-use.mjs +145 -0
  109. package/templates/hooks/pre-tool-use.sh +113 -0
  110. package/templates/hooks/session-start.mjs +100 -0
  111. package/templates/hooks/session-start.sh +62 -0
  112. package/templates/hooks/stop-continuation.mjs +80 -0
  113. package/templates/hooks/stop-continuation.sh +40 -0
  114. package/templates/rules/README.md +40 -0
  115. package/templates/rules/coding-style.md +74 -0
  116. package/templates/rules/git-workflow.md +41 -0
  117. package/templates/rules/performance.md +40 -0
  118. package/templates/rules/security.md +41 -0
  119. package/templates/rules/testing.md +42 -0
@@ -1,207 +1,377 @@
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
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
21
+ // ============================================================================
22
+ // State Management
11
23
  // ============================================================================
12
24
  /**
13
- * Get the path to the subagent tracking state file.
25
+ * Acquire file lock with timeout and stale lock detection
26
+ */
27
+ function acquireLock(directory) {
28
+ const lockPath = join(directory, '.omc', 'state', 'subagent-tracker.lock');
29
+ const lockDir = join(directory, '.omc', 'state');
30
+ if (!existsSync(lockDir)) {
31
+ mkdirSync(lockDir, { recursive: true });
32
+ }
33
+ const startTime = Date.now();
34
+ while (Date.now() - startTime < LOCK_TIMEOUT_MS) {
35
+ try {
36
+ // Check for stale lock (older than timeout)
37
+ if (existsSync(lockPath)) {
38
+ const lockContent = readFileSync(lockPath, 'utf-8');
39
+ const lockTime = parseInt(lockContent, 10);
40
+ if (Date.now() - lockTime > LOCK_TIMEOUT_MS) {
41
+ // Stale lock, remove it
42
+ try {
43
+ unlinkSync(lockPath);
44
+ }
45
+ catch { }
46
+ }
47
+ else {
48
+ // Lock is held, wait and retry
49
+ const waitUntil = Date.now() + LOCK_RETRY_MS;
50
+ while (Date.now() < waitUntil) { } // Busy wait (sync context)
51
+ continue;
52
+ }
53
+ }
54
+ // Try to create lock atomically
55
+ writeFileSync(lockPath, String(Date.now()), { flag: 'wx' });
56
+ return true;
57
+ }
58
+ catch (e) {
59
+ if (e.code === 'EEXIST') {
60
+ // Lock exists, retry
61
+ const waitUntil = Date.now() + LOCK_RETRY_MS;
62
+ while (Date.now() < waitUntil) { }
63
+ continue;
64
+ }
65
+ return false;
66
+ }
67
+ }
68
+ return false; // Timeout
69
+ }
70
+ /**
71
+ * Release file lock
72
+ */
73
+ function releaseLock(directory) {
74
+ const lockPath = join(directory, '.omc', 'state', 'subagent-tracker.lock');
75
+ try {
76
+ unlinkSync(lockPath);
77
+ }
78
+ catch {
79
+ // Ignore errors
80
+ }
81
+ }
82
+ /**
83
+ * Get the state file path
14
84
  */
15
85
  export function getStateFilePath(directory) {
16
- return join(directory, '.omc', 'state', 'subagent-tracking.json');
86
+ const stateDir = join(directory, '.omc', 'state');
87
+ if (!existsSync(stateDir)) {
88
+ mkdirSync(stateDir, { recursive: true });
89
+ }
90
+ return join(stateDir, STATE_FILE);
17
91
  }
18
92
  /**
19
- * Read the current subagent tracking state.
93
+ * Read tracking state from file
20
94
  */
21
95
  export function readTrackingState(directory) {
22
- const filePath = getStateFilePath(directory);
23
- if (!existsSync(filePath)) {
24
- return null;
96
+ const statePath = getStateFilePath(directory);
97
+ if (!existsSync(statePath)) {
98
+ return {
99
+ agents: [],
100
+ total_spawned: 0,
101
+ total_completed: 0,
102
+ total_failed: 0,
103
+ last_updated: new Date().toISOString(),
104
+ };
25
105
  }
26
106
  try {
27
- const content = readFileSync(filePath, 'utf-8');
107
+ const content = readFileSync(statePath, 'utf-8');
28
108
  return JSON.parse(content);
29
109
  }
30
110
  catch (error) {
31
- console.error('[subagent-tracker] Failed to read state:', error);
32
- return null;
111
+ console.error('[SubagentTracker] Error reading state:', error);
112
+ return {
113
+ agents: [],
114
+ total_spawned: 0,
115
+ total_completed: 0,
116
+ total_failed: 0,
117
+ last_updated: new Date().toISOString(),
118
+ };
33
119
  }
34
120
  }
35
121
  /**
36
- * Write subagent tracking state to disk.
122
+ * Write tracking state to file
37
123
  */
38
124
  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
- }
125
+ const statePath = getStateFilePath(directory);
126
+ state.last_updated = new Date().toISOString();
44
127
  try {
45
- writeFileSync(filePath, JSON.stringify(state, null, 2), 'utf-8');
128
+ writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf-8');
46
129
  }
47
130
  catch (error) {
48
- console.error('[subagent-tracker] Failed to write state:', error);
131
+ console.error('[SubagentTracker] Error writing state:', error);
49
132
  }
50
133
  }
134
+ // ============================================================================
135
+ // Helper Functions
136
+ // ============================================================================
51
137
  /**
52
- * Get or initialize tracking state.
138
+ * Detect the current parent mode from state files
53
139
  */
54
- function getOrInitState(directory) {
55
- const existing = readTrackingState(directory);
56
- if (existing) {
57
- return existing;
140
+ function detectParentMode(directory) {
141
+ const stateDir = join(directory, '.omc', 'state');
142
+ if (!existsSync(stateDir)) {
143
+ return 'none';
58
144
  }
59
- return {
60
- active_agents: {},
61
- completed_agents: {},
62
- total_spawned: 0,
63
- total_completed: 0,
64
- };
145
+ // Check in order of specificity
146
+ const modeFiles = [
147
+ { file: 'ultrapilot-state.json', mode: 'ultrapilot' },
148
+ { file: 'autopilot-state.json', mode: 'autopilot' },
149
+ { file: 'swarm-state.json', mode: 'swarm' },
150
+ { file: 'ultrawork-state.json', mode: 'ultrawork' },
151
+ { file: 'ralph-state.json', mode: 'ralph' },
152
+ ];
153
+ for (const { file, mode } of modeFiles) {
154
+ const filePath = join(stateDir, file);
155
+ if (existsSync(filePath)) {
156
+ try {
157
+ const content = readFileSync(filePath, 'utf-8');
158
+ const state = JSON.parse(content);
159
+ if (state.active === true || state.status === 'running' || state.status === 'active') {
160
+ return mode;
161
+ }
162
+ }
163
+ catch {
164
+ continue;
165
+ }
166
+ }
167
+ }
168
+ return 'none';
169
+ }
170
+ /**
171
+ * Get list of stale agents (running for too long)
172
+ */
173
+ export function getStaleAgents(state) {
174
+ const now = Date.now();
175
+ return state.agents.filter((agent) => {
176
+ if (agent.status !== 'running') {
177
+ return false;
178
+ }
179
+ const startTime = new Date(agent.started_at).getTime();
180
+ const elapsed = now - startTime;
181
+ return elapsed > STALE_THRESHOLD_MS;
182
+ });
65
183
  }
66
184
  // ============================================================================
67
- // Hook Event Processors
185
+ // Hook Processors
68
186
  // ============================================================================
69
187
  /**
70
- * Process SubagentStart event - track new agent spawn.
188
+ * Process SubagentStart event
71
189
  */
72
190
  export function processSubagentStart(input) {
73
- const { cwd, agent_id, agent_type } = input;
191
+ if (!acquireLock(input.cwd)) {
192
+ return { continue: true }; // Fail gracefully
193
+ }
74
194
  try {
75
- const state = getOrInitState(cwd);
76
- // Add to active agents
77
- state.active_agents[agent_id] = {
78
- agent_id,
79
- agent_type,
195
+ const state = readTrackingState(input.cwd);
196
+ const parentMode = detectParentMode(input.cwd);
197
+ // Create new agent entry
198
+ const agentInfo = {
199
+ agent_id: input.agent_id,
200
+ agent_type: input.agent_type,
80
201
  started_at: new Date().toISOString(),
202
+ parent_mode: parentMode,
203
+ task_description: input.prompt?.substring(0, 200), // Truncate for storage
204
+ status: 'running',
81
205
  };
206
+ // Add to state
207
+ state.agents.push(agentInfo);
82
208
  state.total_spawned++;
83
- writeTrackingState(cwd, state);
209
+ // Write updated state
210
+ writeTrackingState(input.cwd, state);
211
+ // Check for stale agents
212
+ const staleAgents = getStaleAgents(state);
84
213
  return {
85
- status: 'success',
86
- message: `Tracking started for agent ${agent_id} (${agent_type})`,
87
- data: { agent_id, agent_type },
214
+ continue: true,
215
+ hookSpecificOutput: {
216
+ hookEventName: 'SubagentStart',
217
+ additionalContext: `Agent ${input.agent_type} started (${input.agent_id})`,
218
+ agent_count: state.agents.filter((a) => a.status === 'running').length,
219
+ stale_agents: staleAgents.map((a) => a.agent_id),
220
+ },
88
221
  };
89
222
  }
90
- catch (error) {
91
- return {
92
- status: 'error',
93
- message: `Failed to process SubagentStart: ${error}`,
94
- };
223
+ finally {
224
+ releaseLock(input.cwd);
95
225
  }
96
226
  }
97
227
  /**
98
- * Process SubagentStop event - mark agent as completed.
228
+ * Process SubagentStop event
99
229
  */
100
230
  export function processSubagentStop(input) {
101
- const { cwd, agent_id, agent_transcript_path } = input;
231
+ if (!acquireLock(input.cwd)) {
232
+ return { continue: true }; // Fail gracefully
233
+ }
102
234
  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
- };
235
+ const state = readTrackingState(input.cwd);
236
+ // Find the agent
237
+ const agentIndex = state.agents.findIndex((a) => a.agent_id === input.agent_id);
238
+ if (agentIndex !== -1) {
239
+ const agent = state.agents[agentIndex];
240
+ // Update agent status
241
+ agent.status = input.success ? 'completed' : 'failed';
242
+ agent.completed_at = new Date().toISOString();
243
+ // Calculate duration
244
+ const startTime = new Date(agent.started_at).getTime();
245
+ const endTime = new Date(agent.completed_at).getTime();
246
+ agent.duration_ms = endTime - startTime;
247
+ // Store output summary (truncated)
248
+ if (input.output) {
249
+ agent.output_summary = input.output.substring(0, 500);
250
+ }
251
+ // Update counters
252
+ if (input.success) {
253
+ state.total_completed++;
254
+ }
255
+ else {
256
+ state.total_failed++;
257
+ }
111
258
  }
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);
259
+ // Evict oldest completed agents if over limit
260
+ const completedAgents = state.agents.filter(a => a.status === 'completed' || a.status === 'failed');
261
+ if (completedAgents.length > MAX_COMPLETED_AGENTS) {
262
+ // Sort by completed_at and keep only the most recent
263
+ completedAgents.sort((a, b) => {
264
+ const timeA = a.completed_at ? new Date(a.completed_at).getTime() : 0;
265
+ const timeB = b.completed_at ? new Date(b.completed_at).getTime() : 0;
266
+ return timeB - timeA; // Newest first
267
+ });
268
+ const toRemove = new Set(completedAgents.slice(MAX_COMPLETED_AGENTS).map(a => a.agent_id));
269
+ state.agents = state.agents.filter(a => !toRemove.has(a.agent_id));
270
+ }
271
+ // Write updated state
272
+ writeTrackingState(input.cwd, state);
273
+ const runningCount = state.agents.filter((a) => a.status === 'running').length;
128
274
  return {
129
- status: 'success',
130
- message: `Agent ${agent_id} completed in ${duration_ms}ms`,
131
- data: { agent_id, duration_ms },
275
+ continue: true,
276
+ hookSpecificOutput: {
277
+ hookEventName: 'SubagentStop',
278
+ additionalContext: `Agent ${input.agent_type} ${input.success ? 'completed' : 'failed'} (${input.agent_id})`,
279
+ agent_count: runningCount,
280
+ },
132
281
  };
133
282
  }
134
- catch (error) {
135
- return {
136
- status: 'error',
137
- message: `Failed to process SubagentStop: ${error}`,
138
- };
283
+ finally {
284
+ releaseLock(input.cwd);
139
285
  }
140
286
  }
141
287
  // ============================================================================
142
- // Utility Functions
288
+ // Cleanup Functions
143
289
  // ============================================================================
144
290
  /**
145
- * Remove agents that have been active for longer than maxAgeMs.
146
- * Useful for cleaning up stale agents that may have crashed.
291
+ * Cleanup stale agents (mark as failed)
147
292
  */
148
- export function cleanupStaleAgents(directory, maxAgeMs = 300000 // 5 minutes default
149
- ) {
293
+ export function cleanupStaleAgents(directory) {
150
294
  const state = readTrackingState(directory);
151
- if (!state) {
152
- return;
295
+ const staleAgents = getStaleAgents(state);
296
+ if (staleAgents.length === 0) {
297
+ return 0;
153
298
  }
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++;
299
+ for (const stale of staleAgents) {
300
+ const agentIndex = state.agents.findIndex((a) => a.agent_id === stale.agent_id);
301
+ if (agentIndex !== -1) {
302
+ state.agents[agentIndex].status = 'failed';
303
+ state.agents[agentIndex].completed_at = new Date().toISOString();
304
+ state.agents[agentIndex].output_summary = 'Marked as stale - exceeded timeout';
305
+ state.total_failed++;
171
306
  }
172
307
  }
173
- if (cleaned > 0) {
174
- writeTrackingState(directory, state);
175
- console.log(`[subagent-tracker] Cleaned up ${cleaned} stale agent(s)`);
176
- }
308
+ writeTrackingState(directory, state);
309
+ return staleAgents.length;
177
310
  }
311
+ // ============================================================================
312
+ // Query Functions
313
+ // ============================================================================
178
314
  /**
179
- * Get the count of currently active agents.
315
+ * Get count of active (running) agents
180
316
  */
181
317
  export function getActiveAgentCount(directory) {
182
318
  const state = readTrackingState(directory);
183
- if (!state) {
184
- return 0;
185
- }
186
- return Object.keys(state.active_agents).length;
319
+ return state.agents.filter((a) => a.status === 'running').length;
187
320
  }
188
321
  /**
189
- * Get a count of agents by type (both active and completed).
322
+ * Get agents by type
190
323
  */
191
- export function getAgentsByType(directory) {
324
+ export function getAgentsByType(directory, agentType) {
192
325
  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;
326
+ return state.agents.filter((a) => a.agent_type === agentType);
327
+ }
328
+ /**
329
+ * Get all running agents
330
+ */
331
+ export function getRunningAgents(directory) {
332
+ const state = readTrackingState(directory);
333
+ return state.agents.filter((a) => a.status === 'running');
334
+ }
335
+ /**
336
+ * Get tracking stats
337
+ */
338
+ export function getTrackingStats(directory) {
339
+ const state = readTrackingState(directory);
340
+ return {
341
+ running: state.agents.filter((a) => a.status === 'running').length,
342
+ completed: state.total_completed,
343
+ failed: state.total_failed,
344
+ total: state.total_spawned,
345
+ };
346
+ }
347
+ // ============================================================================
348
+ // Main Entry Points
349
+ // ============================================================================
350
+ /**
351
+ * Handle SubagentStart hook
352
+ */
353
+ export async function handleSubagentStart(input) {
354
+ return processSubagentStart(input);
355
+ }
356
+ /**
357
+ * Handle SubagentStop hook
358
+ */
359
+ export async function handleSubagentStop(input) {
360
+ return processSubagentStop(input);
361
+ }
362
+ /**
363
+ * Clear all tracking state (for testing or cleanup)
364
+ */
365
+ export function clearTrackingState(directory) {
366
+ const statePath = getStateFilePath(directory);
367
+ if (existsSync(statePath)) {
368
+ try {
369
+ const { unlinkSync } = require('fs');
370
+ unlinkSync(statePath);
371
+ }
372
+ catch (error) {
373
+ console.error('[SubagentTracker] Error clearing state:', error);
374
+ }
204
375
  }
205
- return counts;
206
376
  }
207
377
  //# 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":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA6D5B,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAC5C,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AACtD,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,wBAAwB;AACtD,MAAM,aAAa,GAAG,EAAE,CAAC,CAAC,mBAAmB;AAE7C,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,WAAW,CAAC,SAAiB;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,eAAe,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,4CAA4C;YAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAC3C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,eAAe,EAAE,CAAC;oBAC5C,wBAAwB;oBACxB,IAAI,CAAC;wBAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACN,+BAA+B;oBAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;oBAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,CAAA,CAAC,CAAC,2BAA2B;oBAC7D,SAAS;gBACX,CAAC;YACH,CAAC;YAED,gCAAgC;YAChC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxB,qBAAqB;gBACrB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;gBAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,CAAA,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,UAAU;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,SAAiB;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAC3E,IAAI,CAAC;QACH,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;QAC/D,OAAO;YACL,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAA4B;IAChF,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9C,KAAK,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE9C,IAAI,CAAC;QACH,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAElD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gCAAgC;IAChC,MAAM,SAAS,GAAG;QAChB,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,YAAY,EAAE;QACrD,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,WAAW,EAAE;QACnD,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE;QAC3C,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,WAAW,EAAE;QACnD,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE;KAC5C,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACrF,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAA4B;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,OAAO,GAAG,GAAG,GAAG,SAAS,CAAC;QAEhC,OAAO,OAAO,GAAG,kBAAkB,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAyB;IAC5D,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB;IAC/C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE/C,yBAAyB;QACzB,MAAM,SAAS,GAAiB;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,WAAW,EAAE,UAAU;YACvB,gBAAgB,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,uBAAuB;YAC1E,MAAM,EAAE,SAAS;SAClB,CAAC;QAEF,eAAe;QACf,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,KAAK,CAAC,aAAa,EAAE,CAAC;QAEtB,sBAAsB;QACtB,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAErC,yBAAyB;QACzB,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAE1C,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,kBAAkB,EAAE;gBAClB,aAAa,EAAE,eAAe;gBAC9B,iBAAiB,EAAE,SAAS,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC,QAAQ,GAAG;gBAC1E,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;gBACtE,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;aACjD;SACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAwB;IAC1D,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB;IAC/C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE3C,iBAAiB;QACjB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEhF,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEvC,sBAAsB;YACtB,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;YACtD,KAAK,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE9C,qBAAqB;YACrB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;YACvD,KAAK,CAAC,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;YAExC,mCAAmC;YACnC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACxD,CAAC;YAED,kBAAkB;YAClB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;QACpG,IAAI,eAAe,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;YAClD,qDAAqD;YACrD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtE,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtE,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe;YACvC,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3F,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,sBAAsB;QACtB,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAErC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAE/E,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,kBAAkB,EAAE;gBAClB,aAAa,EAAE,cAAc;gBAC7B,iBAAiB,EAAE,SAAS,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,GAAG;gBAC5G,WAAW,EAAE,YAAY;aAC1B;SACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChF,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC3C,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACjE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,GAAG,oCAAoC,CAAC;YAC/E,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAErC,OAAO,WAAW,CAAC,MAAM,CAAC;AAC5B,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,SAAiB;IAClE,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAMhD,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QAClE,SAAS,EAAE,KAAK,CAAC,eAAe;QAChC,MAAM,EAAE,KAAK,CAAC,YAAY;QAC1B,KAAK,EAAE,KAAK,CAAC,aAAa;KAC3B,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAyB;IACjE,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAwB;IAC/D,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACrC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -31,7 +31,7 @@ export declare const VERSION_FILE: string;
31
31
  */
32
32
  export declare const CORE_COMMANDS: string[];
33
33
  /** Current version */
34
- export declare const VERSION = "3.6.3";
34
+ export declare const VERSION = "3.7.0";
35
35
  /** Installation result */
36
36
  export interface InstallResult {
37
37
  success: boolean;
@@ -37,7 +37,7 @@ export const VERSION_FILE = join(CLAUDE_CONFIG_DIR, '.omc-version.json');
37
37
  */
38
38
  export const CORE_COMMANDS = [];
39
39
  /** Current version */
40
- export const VERSION = '3.6.3';
40
+ export const VERSION = '3.7.0';
41
41
  /**
42
42
  * Check if the current Node.js version meets the minimum requirement
43
43
  */