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
@@ -0,0 +1,265 @@
1
+ /**
2
+ * PreCompact Hook - State Preservation Before Context Compaction
3
+ *
4
+ * Creates checkpoints before compaction to preserve critical state including:
5
+ * - Active mode states (autopilot, ralph, ultrawork, swarm)
6
+ * - TODO summary
7
+ * - Wisdom from notepads
8
+ *
9
+ * This ensures no critical information is lost during context window compaction.
10
+ */
11
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from 'fs';
12
+ import { join } from 'path';
13
+ // ============================================================================
14
+ // Constants
15
+ // ============================================================================
16
+ const CHECKPOINT_DIR = 'checkpoints';
17
+ // ============================================================================
18
+ // Helper Functions
19
+ // ============================================================================
20
+ /**
21
+ * Get the checkpoint directory path
22
+ */
23
+ export function getCheckpointPath(directory) {
24
+ const checkpointDir = join(directory, '.omc', 'state', CHECKPOINT_DIR);
25
+ if (!existsSync(checkpointDir)) {
26
+ mkdirSync(checkpointDir, { recursive: true });
27
+ }
28
+ return checkpointDir;
29
+ }
30
+ /**
31
+ * Export wisdom from notepads to checkpoint
32
+ */
33
+ export async function exportWisdomToNotepad(directory) {
34
+ const notepadsDir = join(directory, '.omc', 'notepads');
35
+ if (!existsSync(notepadsDir)) {
36
+ return { wisdom: '', exported: false };
37
+ }
38
+ const wisdomParts = [];
39
+ let hasWisdom = false;
40
+ try {
41
+ // Read all plan directories
42
+ const planDirs = readdirSync(notepadsDir).filter(name => {
43
+ const path = join(notepadsDir, name);
44
+ return statSync(path).isDirectory();
45
+ });
46
+ for (const planDir of planDirs) {
47
+ const planPath = join(notepadsDir, planDir);
48
+ const wisdomFiles = ['learnings.md', 'decisions.md', 'issues.md', 'problems.md'];
49
+ for (const wisdomFile of wisdomFiles) {
50
+ const wisdomPath = join(planPath, wisdomFile);
51
+ if (existsSync(wisdomPath)) {
52
+ const content = readFileSync(wisdomPath, 'utf-8').trim();
53
+ if (content) {
54
+ wisdomParts.push(`### ${planDir}/${wisdomFile}\n${content}`);
55
+ hasWisdom = true;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
61
+ catch (error) {
62
+ console.error('[PreCompact] Error reading wisdom files:', error);
63
+ }
64
+ const wisdom = wisdomParts.length > 0
65
+ ? `## Plan Wisdom\n\n${wisdomParts.join('\n\n')}`
66
+ : '';
67
+ return { wisdom, exported: hasWisdom };
68
+ }
69
+ /**
70
+ * Save summary of active modes
71
+ */
72
+ export function saveModeSummary(directory) {
73
+ const stateDir = join(directory, '.omc', 'state');
74
+ const modes = {};
75
+ // Check autopilot
76
+ const autopilotPath = join(stateDir, 'autopilot-state.json');
77
+ if (existsSync(autopilotPath)) {
78
+ try {
79
+ const autopilotState = JSON.parse(readFileSync(autopilotPath, 'utf-8'));
80
+ if (autopilotState.active) {
81
+ modes.autopilot = {
82
+ phase: autopilotState.phase || 'unknown',
83
+ originalIdea: autopilotState.originalIdea || ''
84
+ };
85
+ }
86
+ }
87
+ catch (error) {
88
+ console.error('[PreCompact] Error reading autopilot state:', error);
89
+ }
90
+ }
91
+ // Check ralph
92
+ const ralphPath = join(stateDir, 'ralph-state.json');
93
+ if (existsSync(ralphPath)) {
94
+ try {
95
+ const ralphState = JSON.parse(readFileSync(ralphPath, 'utf-8'));
96
+ if (ralphState.active) {
97
+ modes.ralph = {
98
+ iteration: ralphState.iteration || 0,
99
+ prompt: ralphState.originalPrompt || ralphState.prompt || ''
100
+ };
101
+ }
102
+ }
103
+ catch (error) {
104
+ console.error('[PreCompact] Error reading ralph state:', error);
105
+ }
106
+ }
107
+ // Check ultrawork
108
+ const ultraworkPath = join(stateDir, 'ultrawork-state.json');
109
+ if (existsSync(ultraworkPath)) {
110
+ try {
111
+ const ultraworkState = JSON.parse(readFileSync(ultraworkPath, 'utf-8'));
112
+ if (ultraworkState.active) {
113
+ modes.ultrawork = {
114
+ original_prompt: ultraworkState.original_prompt || ultraworkState.prompt || ''
115
+ };
116
+ }
117
+ }
118
+ catch (error) {
119
+ console.error('[PreCompact] Error reading ultrawork state:', error);
120
+ }
121
+ }
122
+ // Check swarm (SQLite database)
123
+ const swarmPath = join(stateDir, 'swarm.db');
124
+ if (existsSync(swarmPath)) {
125
+ try {
126
+ const stats = statSync(swarmPath);
127
+ if (stats.size > 0) {
128
+ modes.swarm = {
129
+ session_id: 'active',
130
+ task_count: 0 // Can't read SQLite without a library
131
+ };
132
+ }
133
+ }
134
+ catch (error) {
135
+ console.error('[PreCompact] Error checking swarm state:', error);
136
+ }
137
+ }
138
+ return modes;
139
+ }
140
+ /**
141
+ * Create a compact checkpoint
142
+ */
143
+ export function createCompactCheckpoint(directory, trigger) {
144
+ const activeModes = saveModeSummary(directory);
145
+ // TODO summary - basic implementation
146
+ // In a real implementation, this would read from TodoWrite state
147
+ const todoSummary = {
148
+ pending: 0,
149
+ in_progress: 0,
150
+ completed: 0
151
+ };
152
+ return {
153
+ created_at: new Date().toISOString(),
154
+ trigger,
155
+ active_modes: activeModes,
156
+ todo_summary: todoSummary,
157
+ wisdom_exported: false
158
+ };
159
+ }
160
+ /**
161
+ * Format checkpoint summary for context injection
162
+ */
163
+ export function formatCompactSummary(checkpoint) {
164
+ const lines = [
165
+ '# PreCompact Checkpoint',
166
+ '',
167
+ `Created: ${checkpoint.created_at}`,
168
+ `Trigger: ${checkpoint.trigger}`,
169
+ ''
170
+ ];
171
+ // Active modes
172
+ const modeCount = Object.keys(checkpoint.active_modes).length;
173
+ if (modeCount > 0) {
174
+ lines.push('## Active Modes');
175
+ lines.push('');
176
+ if (checkpoint.active_modes.autopilot) {
177
+ const ap = checkpoint.active_modes.autopilot;
178
+ lines.push(`- **Autopilot** (Phase: ${ap.phase})`);
179
+ lines.push(` Original Idea: ${ap.originalIdea}`);
180
+ }
181
+ if (checkpoint.active_modes.ralph) {
182
+ const ralph = checkpoint.active_modes.ralph;
183
+ lines.push(`- **Ralph** (Iteration: ${ralph.iteration})`);
184
+ lines.push(` Prompt: ${ralph.prompt}`);
185
+ }
186
+ if (checkpoint.active_modes.ultrawork) {
187
+ const uw = checkpoint.active_modes.ultrawork;
188
+ lines.push(`- **Ultrawork**`);
189
+ lines.push(` Prompt: ${uw.original_prompt}`);
190
+ }
191
+ if (checkpoint.active_modes.swarm) {
192
+ const swarm = checkpoint.active_modes.swarm;
193
+ lines.push(`- **Swarm** (Session: ${swarm.session_id}, Tasks: ${swarm.task_count})`);
194
+ }
195
+ lines.push('');
196
+ }
197
+ // TODO summary
198
+ const total = checkpoint.todo_summary.pending +
199
+ checkpoint.todo_summary.in_progress +
200
+ checkpoint.todo_summary.completed;
201
+ if (total > 0) {
202
+ lines.push('## TODO Summary');
203
+ lines.push('');
204
+ lines.push(`- Pending: ${checkpoint.todo_summary.pending}`);
205
+ lines.push(`- In Progress: ${checkpoint.todo_summary.in_progress}`);
206
+ lines.push(`- Completed: ${checkpoint.todo_summary.completed}`);
207
+ lines.push('');
208
+ }
209
+ // Wisdom status
210
+ if (checkpoint.wisdom_exported) {
211
+ lines.push('## Wisdom');
212
+ lines.push('');
213
+ lines.push('Plan wisdom has been preserved in checkpoint.');
214
+ lines.push('');
215
+ }
216
+ lines.push('---');
217
+ lines.push('**Note:** This checkpoint preserves critical state before compaction.');
218
+ lines.push('Review active modes to ensure continuity after compaction.');
219
+ return lines.join('\n');
220
+ }
221
+ /**
222
+ * Main handler for PreCompact hook
223
+ */
224
+ export async function processPreCompact(input) {
225
+ const directory = input.cwd;
226
+ // Create checkpoint
227
+ const checkpoint = createCompactCheckpoint(directory, input.trigger);
228
+ // Export wisdom
229
+ const { wisdom, exported } = await exportWisdomToNotepad(directory);
230
+ checkpoint.wisdom_exported = exported;
231
+ // Save checkpoint
232
+ const checkpointPath = getCheckpointPath(directory);
233
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
234
+ const checkpointFile = join(checkpointPath, `checkpoint-${timestamp}.json`);
235
+ try {
236
+ writeFileSync(checkpointFile, JSON.stringify(checkpoint, null, 2), 'utf-8');
237
+ }
238
+ catch (error) {
239
+ console.error('[PreCompact] Error saving checkpoint:', error);
240
+ }
241
+ // Save wisdom separately if exported
242
+ if (exported && wisdom) {
243
+ const wisdomFile = join(checkpointPath, `wisdom-${timestamp}.md`);
244
+ try {
245
+ writeFileSync(wisdomFile, wisdom, 'utf-8');
246
+ }
247
+ catch (error) {
248
+ console.error('[PreCompact] Error saving wisdom:', error);
249
+ }
250
+ }
251
+ // Format summary for context injection
252
+ const summary = formatCompactSummary(checkpoint);
253
+ return {
254
+ continue: true,
255
+ hookSpecificOutput: {
256
+ hookEventName: 'PreCompact',
257
+ additionalContext: summary
258
+ }
259
+ };
260
+ }
261
+ // ============================================================================
262
+ // Exports
263
+ // ============================================================================
264
+ export default processPreCompact;
265
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/pre-compact/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export interface SessionEndInput {
2
+ session_id: string;
3
+ transcript_path: string;
4
+ cwd: string;
5
+ permission_mode: string;
6
+ hook_event_name: 'SessionEnd';
7
+ reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other';
8
+ }
9
+ export interface SessionMetrics {
10
+ session_id: string;
11
+ started_at?: string;
12
+ ended_at: string;
13
+ reason: string;
14
+ duration_ms?: number;
15
+ agents_spawned: number;
16
+ agents_completed: number;
17
+ modes_used: string[];
18
+ }
19
+ export interface HookOutput {
20
+ continue: boolean;
21
+ hookSpecificOutput?: {
22
+ hookEventName: string;
23
+ metrics?: SessionMetrics;
24
+ cleanup_summary?: {
25
+ files_removed: number;
26
+ state_cleared: boolean;
27
+ };
28
+ };
29
+ }
30
+ /**
31
+ * Record session metrics
32
+ */
33
+ export declare function recordSessionMetrics(directory: string, input: SessionEndInput): SessionMetrics;
34
+ /**
35
+ * Clean up transient state files
36
+ */
37
+ export declare function cleanupTransientState(directory: string): number;
38
+ /**
39
+ * Export session summary to .omc/sessions/
40
+ */
41
+ export declare function exportSessionSummary(directory: string, metrics: SessionMetrics): void;
42
+ /**
43
+ * Process session end
44
+ */
45
+ export declare function processSessionEnd(input: SessionEndInput): HookOutput;
46
+ /**
47
+ * Main hook entry point
48
+ */
49
+ export declare function handleSessionEnd(input: SessionEndInput): Promise<HookOutput>;
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/session-end/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,YAAY,CAAC;IAC9B,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,mBAAmB,GAAG,OAAO,CAAC;CAC5D;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,cAAc,CAAC;QACzB,eAAe,CAAC,EAAE;YAChB,aAAa,EAAE,MAAM,CAAC;YACtB,aAAa,EAAE,OAAO,CAAC;SACxB,CAAC;KACH,CAAC;CACH;AAqFD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,cAAc,CA4B9F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAgE/D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAgBrF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAiBpE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAElF"}
@@ -0,0 +1,207 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /**
4
+ * Read agent tracking to get spawn/completion counts
5
+ */
6
+ function getAgentCounts(directory) {
7
+ const trackingPath = path.join(directory, '.omc', 'state', 'subagent-tracking.json');
8
+ if (!fs.existsSync(trackingPath)) {
9
+ return { spawned: 0, completed: 0 };
10
+ }
11
+ try {
12
+ const content = fs.readFileSync(trackingPath, 'utf-8');
13
+ const tracking = JSON.parse(content);
14
+ const spawned = tracking.agents?.length || 0;
15
+ const completed = tracking.agents?.filter((a) => a.status === 'completed').length || 0;
16
+ return { spawned, completed };
17
+ }
18
+ catch (error) {
19
+ return { spawned: 0, completed: 0 };
20
+ }
21
+ }
22
+ /**
23
+ * Detect which modes were used during the session
24
+ */
25
+ function getModesUsed(directory) {
26
+ const stateDir = path.join(directory, '.omc', 'state');
27
+ const modes = [];
28
+ if (!fs.existsSync(stateDir)) {
29
+ return modes;
30
+ }
31
+ const modeStateFiles = [
32
+ { file: 'autopilot-state.json', mode: 'autopilot' },
33
+ { file: 'ultrapilot-state.json', mode: 'ultrapilot' },
34
+ { file: 'ralph-state.json', mode: 'ralph' },
35
+ { file: 'ultrawork-state.json', mode: 'ultrawork' },
36
+ { file: 'ecomode-state.json', mode: 'ecomode' },
37
+ { file: 'swarm-state.json', mode: 'swarm' },
38
+ { file: 'pipeline-state.json', mode: 'pipeline' },
39
+ ];
40
+ for (const { file, mode } of modeStateFiles) {
41
+ const statePath = path.join(stateDir, file);
42
+ if (fs.existsSync(statePath)) {
43
+ modes.push(mode);
44
+ }
45
+ }
46
+ return modes;
47
+ }
48
+ /**
49
+ * Get session start time from state files
50
+ */
51
+ function getSessionStartTime(directory) {
52
+ const stateDir = path.join(directory, '.omc', 'state');
53
+ if (!fs.existsSync(stateDir)) {
54
+ return undefined;
55
+ }
56
+ const stateFiles = fs.readdirSync(stateDir).filter(f => f.endsWith('.json'));
57
+ for (const file of stateFiles) {
58
+ try {
59
+ const statePath = path.join(stateDir, file);
60
+ const content = fs.readFileSync(statePath, 'utf-8');
61
+ const state = JSON.parse(content);
62
+ if (state.started_at) {
63
+ return state.started_at;
64
+ }
65
+ }
66
+ catch (error) {
67
+ continue;
68
+ }
69
+ }
70
+ return undefined;
71
+ }
72
+ /**
73
+ * Record session metrics
74
+ */
75
+ export function recordSessionMetrics(directory, input) {
76
+ const endedAt = new Date().toISOString();
77
+ const startedAt = getSessionStartTime(directory);
78
+ const { spawned, completed } = getAgentCounts(directory);
79
+ const modesUsed = getModesUsed(directory);
80
+ const metrics = {
81
+ session_id: input.session_id,
82
+ started_at: startedAt,
83
+ ended_at: endedAt,
84
+ reason: input.reason,
85
+ agents_spawned: spawned,
86
+ agents_completed: completed,
87
+ modes_used: modesUsed,
88
+ };
89
+ // Calculate duration if start time is available
90
+ if (startedAt) {
91
+ try {
92
+ const startTime = new Date(startedAt).getTime();
93
+ const endTime = new Date(endedAt).getTime();
94
+ metrics.duration_ms = endTime - startTime;
95
+ }
96
+ catch (error) {
97
+ // Invalid date, skip duration
98
+ }
99
+ }
100
+ return metrics;
101
+ }
102
+ /**
103
+ * Clean up transient state files
104
+ */
105
+ export function cleanupTransientState(directory) {
106
+ let filesRemoved = 0;
107
+ const omcDir = path.join(directory, '.omc');
108
+ if (!fs.existsSync(omcDir)) {
109
+ return filesRemoved;
110
+ }
111
+ // Remove transient agent tracking
112
+ const trackingPath = path.join(omcDir, 'state', 'subagent-tracking.json');
113
+ if (fs.existsSync(trackingPath)) {
114
+ try {
115
+ fs.unlinkSync(trackingPath);
116
+ filesRemoved++;
117
+ }
118
+ catch (error) {
119
+ // Ignore removal errors
120
+ }
121
+ }
122
+ // Clean stale checkpoints (older than 24 hours)
123
+ const checkpointsDir = path.join(omcDir, 'checkpoints');
124
+ if (fs.existsSync(checkpointsDir)) {
125
+ const now = Date.now();
126
+ const oneDayAgo = now - 24 * 60 * 60 * 1000;
127
+ try {
128
+ const files = fs.readdirSync(checkpointsDir);
129
+ for (const file of files) {
130
+ const filePath = path.join(checkpointsDir, file);
131
+ const stats = fs.statSync(filePath);
132
+ if (stats.mtimeMs < oneDayAgo) {
133
+ fs.unlinkSync(filePath);
134
+ filesRemoved++;
135
+ }
136
+ }
137
+ }
138
+ catch (error) {
139
+ // Ignore cleanup errors
140
+ }
141
+ }
142
+ // Remove .tmp files in .omc/
143
+ const removeTmpFiles = (dir) => {
144
+ try {
145
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
146
+ for (const entry of entries) {
147
+ const fullPath = path.join(dir, entry.name);
148
+ if (entry.isDirectory()) {
149
+ removeTmpFiles(fullPath);
150
+ }
151
+ else if (entry.name.endsWith('.tmp')) {
152
+ fs.unlinkSync(fullPath);
153
+ filesRemoved++;
154
+ }
155
+ }
156
+ }
157
+ catch (error) {
158
+ // Ignore errors
159
+ }
160
+ };
161
+ removeTmpFiles(omcDir);
162
+ return filesRemoved;
163
+ }
164
+ /**
165
+ * Export session summary to .omc/sessions/
166
+ */
167
+ export function exportSessionSummary(directory, metrics) {
168
+ const sessionsDir = path.join(directory, '.omc', 'sessions');
169
+ // Create sessions directory if it doesn't exist
170
+ if (!fs.existsSync(sessionsDir)) {
171
+ fs.mkdirSync(sessionsDir, { recursive: true });
172
+ }
173
+ // Write session summary
174
+ const sessionFile = path.join(sessionsDir, `${metrics.session_id}.json`);
175
+ try {
176
+ fs.writeFileSync(sessionFile, JSON.stringify(metrics, null, 2), 'utf-8');
177
+ }
178
+ catch (error) {
179
+ // Ignore write errors
180
+ }
181
+ }
182
+ /**
183
+ * Process session end
184
+ */
185
+ export function processSessionEnd(input) {
186
+ const metrics = recordSessionMetrics(input.cwd, input);
187
+ const filesRemoved = cleanupTransientState(input.cwd);
188
+ exportSessionSummary(input.cwd, metrics);
189
+ return {
190
+ continue: true,
191
+ hookSpecificOutput: {
192
+ hookEventName: 'SessionEnd',
193
+ metrics,
194
+ cleanup_summary: {
195
+ files_removed: filesRemoved,
196
+ state_cleared: true,
197
+ },
198
+ },
199
+ };
200
+ }
201
+ /**
202
+ * Main hook entry point
203
+ */
204
+ export async function handleSessionEnd(input) {
205
+ return processSessionEnd(input);
206
+ }
207
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/session-end/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Setup Hook Module
3
+ *
4
+ * Handles OMC initialization and maintenance tasks.
5
+ * Triggers:
6
+ * - init: Create directory structure, validate configs, set environment
7
+ * - maintenance: Prune old state files, cleanup orphaned state, vacuum SQLite
8
+ */
9
+ export interface SetupInput {
10
+ session_id: string;
11
+ transcript_path: string;
12
+ cwd: string;
13
+ permission_mode: string;
14
+ hook_event_name: 'Setup';
15
+ trigger: 'init' | 'maintenance';
16
+ }
17
+ export interface SetupResult {
18
+ directories_created: string[];
19
+ configs_validated: string[];
20
+ errors: string[];
21
+ env_vars_set: string[];
22
+ }
23
+ export interface HookOutput {
24
+ continue: boolean;
25
+ hookSpecificOutput: {
26
+ hookEventName: 'Setup';
27
+ additionalContext: string;
28
+ };
29
+ }
30
+ /**
31
+ * Ensure all required directories exist
32
+ */
33
+ export declare function ensureDirectoryStructure(directory: string): string[];
34
+ /**
35
+ * Validate that config files exist and are readable
36
+ */
37
+ export declare function validateConfigFiles(directory: string): string[];
38
+ /**
39
+ * Set environment variables for OMC initialization
40
+ */
41
+ export declare function setEnvironmentVariables(): string[];
42
+ /**
43
+ * Process setup init trigger
44
+ */
45
+ export declare function processSetupInit(input: SetupInput): Promise<HookOutput>;
46
+ /**
47
+ * Prune old state files from .omc/state directory
48
+ */
49
+ export declare function pruneOldStateFiles(directory: string, maxAgeDays?: number): number;
50
+ /**
51
+ * Clean up orphaned state files (state files without corresponding active sessions)
52
+ */
53
+ export declare function cleanupOrphanedState(directory: string): number;
54
+ /**
55
+ * Run VACUUM on swarm SQLite database if it exists
56
+ */
57
+ export declare function vacuumSwarmDb(directory: string): boolean;
58
+ /**
59
+ * Process setup maintenance trigger
60
+ */
61
+ export declare function processSetupMaintenance(input: SetupInput): Promise<HookOutput>;
62
+ /**
63
+ * Process setup hook based on trigger type
64
+ */
65
+ export declare function processSetup(input: SetupInput): Promise<HookOutput>;
66
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/setup/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE;QAClB,aAAa,EAAE,OAAO,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAwBD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB/D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAgBlD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAsC7E;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,MAAmC,GAAG,MAAM,CAgD7G;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsC9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAsBxD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CA6CpF;AAMD;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAczE"}