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
@@ -0,0 +1,585 @@
1
+ /**
2
+ * Rate Limit Wait Daemon
3
+ *
4
+ * Background daemon that monitors rate limits and auto-resumes
5
+ * Claude Code sessions when rate limits reset.
6
+ *
7
+ * Security considerations:
8
+ * - State/PID/log files use restrictive permissions (0600)
9
+ * - No sensitive data (tokens, credentials) is logged or stored
10
+ * - Input validation for tmux pane IDs
11
+ *
12
+ * Reference: https://github.com/EvanOman/cc-wait
13
+ */
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync, statSync } from 'fs';
15
+ import { join, dirname } from 'path';
16
+ import { homedir } from 'os';
17
+ import { spawn } from 'child_process';
18
+ import { checkRateLimitStatus, formatRateLimitStatus } from './rate-limit-monitor.js';
19
+ import { isTmuxAvailable, scanForBlockedPanes, sendResumeSequence, formatBlockedPanesSummary, } from './tmux-detector.js';
20
+ /** Default configuration */
21
+ const DEFAULT_CONFIG = {
22
+ pollIntervalMs: 60 * 1000, // 1 minute
23
+ paneLinesToCapture: 15,
24
+ verbose: false,
25
+ stateFilePath: join(homedir(), '.omc', 'state', 'rate-limit-daemon.json'),
26
+ pidFilePath: join(homedir(), '.omc', 'state', 'rate-limit-daemon.pid'),
27
+ logFilePath: join(homedir(), '.omc', 'state', 'rate-limit-daemon.log'),
28
+ };
29
+ /** Maximum log file size before rotation (1MB) */
30
+ const MAX_LOG_SIZE_BYTES = 1 * 1024 * 1024;
31
+ /** Restrictive file permissions (owner read/write only) */
32
+ const SECURE_FILE_MODE = 0o600;
33
+ /**
34
+ * Allowlist of environment variables safe to pass to daemon child process.
35
+ * This prevents leaking sensitive variables like ANTHROPIC_API_KEY, GITHUB_TOKEN, etc.
36
+ */
37
+ const DAEMON_ENV_ALLOWLIST = [
38
+ // Core system paths
39
+ 'PATH', 'HOME', 'USERPROFILE',
40
+ // User identification
41
+ 'USER', 'USERNAME', 'LOGNAME',
42
+ // Locale settings
43
+ 'LANG', 'LC_ALL', 'LC_CTYPE',
44
+ // Terminal/tmux (required for tmux integration)
45
+ 'TERM', 'TMUX', 'TMUX_PANE',
46
+ // Temp directories
47
+ 'TMPDIR', 'TMP', 'TEMP',
48
+ // XDG directories (Linux)
49
+ 'XDG_RUNTIME_DIR', 'XDG_DATA_HOME', 'XDG_CONFIG_HOME',
50
+ // Shell
51
+ 'SHELL',
52
+ // Node.js
53
+ 'NODE_ENV',
54
+ // Proxy settings
55
+ 'HTTP_PROXY', 'HTTPS_PROXY', 'http_proxy', 'https_proxy', 'NO_PROXY', 'no_proxy',
56
+ // Windows system
57
+ 'SystemRoot', 'SYSTEMROOT', 'windir', 'COMSPEC',
58
+ ];
59
+ /**
60
+ * Create a minimal environment for daemon child processes.
61
+ * Only includes allowlisted variables to prevent credential leakage.
62
+ */
63
+ function createMinimalDaemonEnv() {
64
+ const env = {};
65
+ for (const key of DAEMON_ENV_ALLOWLIST) {
66
+ if (process.env[key] !== undefined) {
67
+ env[key] = process.env[key];
68
+ }
69
+ }
70
+ return env;
71
+ }
72
+ /**
73
+ * Get effective configuration by merging with defaults
74
+ */
75
+ function getConfig(config) {
76
+ return { ...DEFAULT_CONFIG, ...config };
77
+ }
78
+ /**
79
+ * Ensure state directory exists with secure permissions
80
+ */
81
+ function ensureStateDir(config) {
82
+ const stateDir = dirname(config.stateFilePath);
83
+ if (!existsSync(stateDir)) {
84
+ mkdirSync(stateDir, { recursive: true, mode: 0o700 });
85
+ }
86
+ }
87
+ /**
88
+ * Write file with secure permissions (0600 - owner read/write only)
89
+ */
90
+ function writeSecureFile(filePath, content) {
91
+ writeFileSync(filePath, content, { mode: SECURE_FILE_MODE });
92
+ // Ensure permissions are set even if file existed
93
+ try {
94
+ chmodSync(filePath, SECURE_FILE_MODE);
95
+ }
96
+ catch {
97
+ // Ignore permission errors (e.g., on Windows)
98
+ }
99
+ }
100
+ /**
101
+ * Rotate log file if it exceeds maximum size
102
+ */
103
+ function rotateLogIfNeeded(logPath) {
104
+ try {
105
+ if (!existsSync(logPath))
106
+ return;
107
+ const stats = statSync(logPath);
108
+ if (stats.size > MAX_LOG_SIZE_BYTES) {
109
+ const backupPath = `${logPath}.old`;
110
+ // Remove old backup if exists
111
+ if (existsSync(backupPath)) {
112
+ unlinkSync(backupPath);
113
+ }
114
+ // Rename current to backup
115
+ const { renameSync } = require('fs');
116
+ renameSync(logPath, backupPath);
117
+ }
118
+ }
119
+ catch {
120
+ // Ignore rotation errors
121
+ }
122
+ }
123
+ /**
124
+ * Read daemon state from disk
125
+ */
126
+ export function readDaemonState(config) {
127
+ const cfg = getConfig(config);
128
+ try {
129
+ if (!existsSync(cfg.stateFilePath)) {
130
+ return null;
131
+ }
132
+ const content = readFileSync(cfg.stateFilePath, 'utf-8');
133
+ const state = JSON.parse(content);
134
+ // Restore Date objects
135
+ if (state.startedAt)
136
+ state.startedAt = new Date(state.startedAt);
137
+ if (state.lastPollAt)
138
+ state.lastPollAt = new Date(state.lastPollAt);
139
+ if (state.rateLimitStatus?.lastCheckedAt) {
140
+ state.rateLimitStatus.lastCheckedAt = new Date(state.rateLimitStatus.lastCheckedAt);
141
+ }
142
+ if (state.rateLimitStatus?.fiveHourResetsAt) {
143
+ state.rateLimitStatus.fiveHourResetsAt = new Date(state.rateLimitStatus.fiveHourResetsAt);
144
+ }
145
+ if (state.rateLimitStatus?.weeklyResetsAt) {
146
+ state.rateLimitStatus.weeklyResetsAt = new Date(state.rateLimitStatus.weeklyResetsAt);
147
+ }
148
+ if (state.rateLimitStatus?.nextResetAt) {
149
+ state.rateLimitStatus.nextResetAt = new Date(state.rateLimitStatus.nextResetAt);
150
+ }
151
+ for (const pane of state.blockedPanes || []) {
152
+ if (pane.firstDetectedAt)
153
+ pane.firstDetectedAt = new Date(pane.firstDetectedAt);
154
+ }
155
+ return state;
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ }
161
+ /**
162
+ * Write daemon state to disk with secure permissions
163
+ * Note: State file contains only non-sensitive operational data
164
+ */
165
+ function writeDaemonState(state, config) {
166
+ ensureStateDir(config);
167
+ writeSecureFile(config.stateFilePath, JSON.stringify(state, null, 2));
168
+ }
169
+ /**
170
+ * Read PID file
171
+ */
172
+ function readPidFile(config) {
173
+ try {
174
+ if (!existsSync(config.pidFilePath)) {
175
+ return null;
176
+ }
177
+ const content = readFileSync(config.pidFilePath, 'utf-8');
178
+ return parseInt(content.trim(), 10);
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ }
184
+ /**
185
+ * Write PID file with secure permissions
186
+ */
187
+ function writePidFile(pid, config) {
188
+ ensureStateDir(config);
189
+ writeSecureFile(config.pidFilePath, String(pid));
190
+ }
191
+ /**
192
+ * Remove PID file
193
+ */
194
+ function removePidFile(config) {
195
+ if (existsSync(config.pidFilePath)) {
196
+ unlinkSync(config.pidFilePath);
197
+ }
198
+ }
199
+ /**
200
+ * Check if a process is running
201
+ */
202
+ function isProcessRunning(pid) {
203
+ try {
204
+ // Signal 0 doesn't actually send a signal, just checks if process exists
205
+ process.kill(pid, 0);
206
+ return true;
207
+ }
208
+ catch {
209
+ return false;
210
+ }
211
+ }
212
+ /**
213
+ * Check if daemon is currently running
214
+ */
215
+ export function isDaemonRunning(config) {
216
+ const cfg = getConfig(config);
217
+ const pid = readPidFile(cfg);
218
+ if (pid === null) {
219
+ return false;
220
+ }
221
+ if (!isProcessRunning(pid)) {
222
+ // Stale PID file, clean up
223
+ removePidFile(cfg);
224
+ return false;
225
+ }
226
+ return true;
227
+ }
228
+ /**
229
+ * Log message to daemon log file with rotation
230
+ * Note: Only operational messages are logged, never credentials or tokens
231
+ */
232
+ function log(message, config) {
233
+ if (config.verbose) {
234
+ console.log(`[${new Date().toISOString()}] ${message}`);
235
+ }
236
+ try {
237
+ ensureStateDir(config);
238
+ // Rotate log if needed (prevents unbounded growth)
239
+ rotateLogIfNeeded(config.logFilePath);
240
+ const timestamp = new Date().toISOString();
241
+ const logLine = `[${timestamp}] ${message}\n`;
242
+ // Append to log file with secure permissions
243
+ const { appendFileSync } = require('fs');
244
+ appendFileSync(config.logFilePath, logLine, { mode: SECURE_FILE_MODE });
245
+ }
246
+ catch {
247
+ // Ignore log write errors
248
+ }
249
+ }
250
+ /**
251
+ * Create initial daemon state
252
+ */
253
+ function createInitialState() {
254
+ return {
255
+ isRunning: true,
256
+ pid: process.pid,
257
+ startedAt: new Date(),
258
+ lastPollAt: null,
259
+ rateLimitStatus: null,
260
+ blockedPanes: [],
261
+ resumedPaneIds: [],
262
+ totalResumeAttempts: 0,
263
+ successfulResumes: 0,
264
+ errorCount: 0,
265
+ };
266
+ }
267
+ /**
268
+ * Main daemon polling loop
269
+ */
270
+ async function pollLoop(config) {
271
+ const state = readDaemonState(config) || createInitialState();
272
+ state.isRunning = true;
273
+ state.pid = process.pid;
274
+ log('Starting poll loop', config);
275
+ while (state.isRunning) {
276
+ try {
277
+ state.lastPollAt = new Date();
278
+ // Check rate limit status
279
+ const rateLimitStatus = await checkRateLimitStatus();
280
+ const wasLimited = state.rateLimitStatus?.isLimited ?? false;
281
+ const isNowLimited = rateLimitStatus?.isLimited ?? false;
282
+ state.rateLimitStatus = rateLimitStatus;
283
+ if (rateLimitStatus) {
284
+ log(`Rate limit status: ${formatRateLimitStatus(rateLimitStatus)}`, config);
285
+ }
286
+ else {
287
+ log('Rate limit status unavailable (no OAuth credentials?)', config);
288
+ }
289
+ // If currently rate limited, scan for blocked panes
290
+ if (isNowLimited && isTmuxAvailable()) {
291
+ log('Rate limited - scanning for blocked panes', config);
292
+ const blockedPanes = scanForBlockedPanes(config.paneLinesToCapture);
293
+ // Add newly detected blocked panes
294
+ for (const pane of blockedPanes) {
295
+ const existing = state.blockedPanes.find((p) => p.id === pane.id);
296
+ if (!existing) {
297
+ state.blockedPanes.push(pane);
298
+ log(`Detected blocked pane: ${pane.id} in ${pane.session}:${pane.windowIndex}`, config);
299
+ }
300
+ }
301
+ // Remove panes that are no longer blocked
302
+ state.blockedPanes = state.blockedPanes.filter((tracked) => blockedPanes.some((current) => current.id === tracked.id));
303
+ }
304
+ // If rate limit just cleared (was limited, now not), attempt resume
305
+ if (wasLimited && !isNowLimited && state.blockedPanes.length > 0) {
306
+ log('Rate limit cleared! Attempting to resume blocked panes', config);
307
+ for (const pane of state.blockedPanes) {
308
+ if (state.resumedPaneIds.includes(pane.id)) {
309
+ log(`Skipping already resumed pane: ${pane.id}`, config);
310
+ continue;
311
+ }
312
+ state.totalResumeAttempts++;
313
+ log(`Attempting resume for pane: ${pane.id}`, config);
314
+ const success = sendResumeSequence(pane.id);
315
+ pane.resumeAttempted = true;
316
+ pane.resumeSuccessful = success;
317
+ if (success) {
318
+ state.successfulResumes++;
319
+ state.resumedPaneIds.push(pane.id);
320
+ log(`Successfully sent resume to pane: ${pane.id}`, config);
321
+ }
322
+ else {
323
+ state.errorCount++;
324
+ log(`Failed to send resume to pane: ${pane.id}`, config);
325
+ }
326
+ }
327
+ // Clear blocked panes after resume attempt
328
+ state.blockedPanes = [];
329
+ }
330
+ // If rate limit cleared and no blocked panes, clear resumed list
331
+ if (!isNowLimited && state.blockedPanes.length === 0) {
332
+ state.resumedPaneIds = [];
333
+ }
334
+ writeDaemonState(state, config);
335
+ }
336
+ catch (error) {
337
+ state.errorCount++;
338
+ state.lastError = error instanceof Error ? error.message : String(error);
339
+ log(`Poll error: ${state.lastError}`, config);
340
+ writeDaemonState(state, config);
341
+ }
342
+ // Wait for next poll
343
+ await new Promise((resolve) => setTimeout(resolve, config.pollIntervalMs));
344
+ }
345
+ }
346
+ /**
347
+ * Start the daemon
348
+ */
349
+ export function startDaemon(config) {
350
+ const cfg = getConfig(config);
351
+ // Check if already running
352
+ if (isDaemonRunning(cfg)) {
353
+ const state = readDaemonState(cfg);
354
+ return {
355
+ success: false,
356
+ message: 'Daemon is already running',
357
+ state: state ?? undefined,
358
+ };
359
+ }
360
+ // Check for tmux
361
+ if (!isTmuxAvailable()) {
362
+ console.warn('[RateLimitDaemon] tmux not available - resume functionality will be limited');
363
+ }
364
+ ensureStateDir(cfg);
365
+ // Fork a new process for the daemon
366
+ const daemonScript = `
367
+ const { pollLoop } = require('${__filename.replace(/\.ts$/, '.js')}');
368
+ const config = ${JSON.stringify(cfg)};
369
+ pollLoop(config).catch(console.error);
370
+ `;
371
+ try {
372
+ // Use node to run the daemon in background
373
+ // Note: Using minimal env to prevent leaking sensitive credentials
374
+ const child = spawn('node', ['-e', daemonScript], {
375
+ detached: true,
376
+ stdio: 'ignore',
377
+ cwd: process.cwd(),
378
+ env: createMinimalDaemonEnv(),
379
+ });
380
+ child.unref();
381
+ const pid = child.pid;
382
+ if (pid) {
383
+ writePidFile(pid, cfg);
384
+ const state = createInitialState();
385
+ state.pid = pid;
386
+ writeDaemonState(state, cfg);
387
+ return {
388
+ success: true,
389
+ message: `Daemon started with PID ${pid}`,
390
+ state,
391
+ };
392
+ }
393
+ return {
394
+ success: false,
395
+ message: 'Failed to start daemon process',
396
+ };
397
+ }
398
+ catch (error) {
399
+ return {
400
+ success: false,
401
+ message: 'Failed to start daemon',
402
+ error: error instanceof Error ? error.message : String(error),
403
+ };
404
+ }
405
+ }
406
+ /**
407
+ * Run daemon in foreground (for direct execution)
408
+ */
409
+ export async function runDaemonForeground(config) {
410
+ const cfg = getConfig(config);
411
+ // Check if already running
412
+ if (isDaemonRunning(cfg)) {
413
+ console.error('Daemon is already running. Use "omc wait daemon stop" first.');
414
+ process.exit(1);
415
+ }
416
+ // Write PID file
417
+ writePidFile(process.pid, cfg);
418
+ // Handle shutdown
419
+ const shutdown = () => {
420
+ console.log('\nShutting down daemon...');
421
+ removePidFile(cfg);
422
+ const state = readDaemonState(cfg);
423
+ if (state) {
424
+ state.isRunning = false;
425
+ writeDaemonState(state, cfg);
426
+ }
427
+ process.exit(0);
428
+ };
429
+ process.on('SIGINT', shutdown);
430
+ process.on('SIGTERM', shutdown);
431
+ console.log('Rate Limit Wait daemon starting in foreground mode...');
432
+ console.log('Press Ctrl+C to stop.\n');
433
+ // Run poll loop
434
+ await pollLoop(cfg);
435
+ }
436
+ /**
437
+ * Stop the daemon
438
+ */
439
+ export function stopDaemon(config) {
440
+ const cfg = getConfig(config);
441
+ const pid = readPidFile(cfg);
442
+ if (pid === null) {
443
+ return {
444
+ success: true,
445
+ message: 'Daemon is not running',
446
+ };
447
+ }
448
+ if (!isProcessRunning(pid)) {
449
+ removePidFile(cfg);
450
+ return {
451
+ success: true,
452
+ message: 'Daemon was not running (cleaned up stale PID file)',
453
+ };
454
+ }
455
+ try {
456
+ process.kill(pid, 'SIGTERM');
457
+ removePidFile(cfg);
458
+ // Update state
459
+ const state = readDaemonState(cfg);
460
+ if (state) {
461
+ state.isRunning = false;
462
+ state.pid = null;
463
+ writeDaemonState(state, cfg);
464
+ }
465
+ return {
466
+ success: true,
467
+ message: `Daemon stopped (PID ${pid})`,
468
+ state: state ?? undefined,
469
+ };
470
+ }
471
+ catch (error) {
472
+ return {
473
+ success: false,
474
+ message: 'Failed to stop daemon',
475
+ error: error instanceof Error ? error.message : String(error),
476
+ };
477
+ }
478
+ }
479
+ /**
480
+ * Get daemon status
481
+ */
482
+ export function getDaemonStatus(config) {
483
+ const cfg = getConfig(config);
484
+ const state = readDaemonState(cfg);
485
+ const running = isDaemonRunning(cfg);
486
+ if (!running && !state) {
487
+ return {
488
+ success: true,
489
+ message: 'Daemon has never been started',
490
+ };
491
+ }
492
+ if (!running && state) {
493
+ return {
494
+ success: true,
495
+ message: 'Daemon is not running',
496
+ state: { ...state, isRunning: false, pid: null },
497
+ };
498
+ }
499
+ return {
500
+ success: true,
501
+ message: 'Daemon is running',
502
+ state: state ?? undefined,
503
+ };
504
+ }
505
+ /**
506
+ * Detect blocked panes (one-time scan)
507
+ */
508
+ export async function detectBlockedPanes(config) {
509
+ const cfg = getConfig(config);
510
+ if (!isTmuxAvailable()) {
511
+ return {
512
+ success: false,
513
+ message: 'tmux is not available',
514
+ };
515
+ }
516
+ const rateLimitStatus = await checkRateLimitStatus();
517
+ const blockedPanes = scanForBlockedPanes(cfg.paneLinesToCapture);
518
+ return {
519
+ success: true,
520
+ message: formatBlockedPanesSummary(blockedPanes),
521
+ state: {
522
+ isRunning: isDaemonRunning(cfg),
523
+ pid: readPidFile(cfg),
524
+ startedAt: null,
525
+ lastPollAt: new Date(),
526
+ rateLimitStatus,
527
+ blockedPanes,
528
+ resumedPaneIds: [],
529
+ totalResumeAttempts: 0,
530
+ successfulResumes: 0,
531
+ errorCount: 0,
532
+ },
533
+ };
534
+ }
535
+ /**
536
+ * Format daemon state for CLI display
537
+ */
538
+ export function formatDaemonState(state) {
539
+ const lines = [];
540
+ // Status header
541
+ if (state.isRunning) {
542
+ lines.push(`✓ Daemon running (PID: ${state.pid})`);
543
+ }
544
+ else {
545
+ lines.push('✗ Daemon not running');
546
+ }
547
+ // Timing info
548
+ if (state.startedAt) {
549
+ lines.push(` Started: ${state.startedAt.toLocaleString()}`);
550
+ }
551
+ if (state.lastPollAt) {
552
+ lines.push(` Last poll: ${state.lastPollAt.toLocaleString()}`);
553
+ }
554
+ // Rate limit status
555
+ lines.push('');
556
+ if (state.rateLimitStatus) {
557
+ if (state.rateLimitStatus.isLimited) {
558
+ lines.push(`⚠ ${formatRateLimitStatus(state.rateLimitStatus)}`);
559
+ }
560
+ else {
561
+ lines.push('✓ Not rate limited');
562
+ }
563
+ }
564
+ else {
565
+ lines.push('? Rate limit status unavailable');
566
+ }
567
+ // Blocked panes
568
+ if (state.blockedPanes.length > 0) {
569
+ lines.push('');
570
+ lines.push(formatBlockedPanesSummary(state.blockedPanes));
571
+ }
572
+ // Statistics
573
+ lines.push('');
574
+ lines.push('Statistics:');
575
+ lines.push(` Resume attempts: ${state.totalResumeAttempts}`);
576
+ lines.push(` Successful: ${state.successfulResumes}`);
577
+ lines.push(` Errors: ${state.errorCount}`);
578
+ if (state.lastError) {
579
+ lines.push(` Last error: ${state.lastError}`);
580
+ }
581
+ return lines.join('\n');
582
+ }
583
+ // Export pollLoop for use by the daemon subprocess
584
+ export { pollLoop };
585
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/features/rate-limit-wait/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Rate Limit Wait Feature
3
+ *
4
+ * Auto-resume Claude Code sessions when rate limits reset.
5
+ *
6
+ * Usage:
7
+ * omc wait status - Show current rate limit status
8
+ * omc wait daemon start - Start the background daemon
9
+ * omc wait daemon stop - Stop the daemon
10
+ * omc wait detect - Scan for blocked Claude Code sessions
11
+ */
12
+ export type { RateLimitStatus, TmuxPane, PaneAnalysisResult, BlockedPane, DaemonState, DaemonConfig, ResumeResult, DaemonCommand, DaemonResponse, } from './types.js';
13
+ export { checkRateLimitStatus, formatTimeUntilReset, formatRateLimitStatus, } from './rate-limit-monitor.js';
14
+ export { isTmuxAvailable, isInsideTmux, listTmuxPanes, capturePaneContent, analyzePaneContent, scanForBlockedPanes, sendResumeSequence, sendToPane, formatBlockedPanesSummary, } from './tmux-detector.js';
15
+ export { readDaemonState, isDaemonRunning, startDaemon, runDaemonForeground, stopDaemon, getDaemonStatus, detectBlockedPanes, formatDaemonState, } from './daemon.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/rate-limit-wait/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,YAAY,EACV,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,eAAe,EACf,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Rate Limit Wait Feature
3
+ *
4
+ * Auto-resume Claude Code sessions when rate limits reset.
5
+ *
6
+ * Usage:
7
+ * omc wait status - Show current rate limit status
8
+ * omc wait daemon start - Start the background daemon
9
+ * omc wait daemon stop - Stop the daemon
10
+ * omc wait detect - Scan for blocked Claude Code sessions
11
+ */
12
+ // Rate limit monitor exports
13
+ export { checkRateLimitStatus, formatTimeUntilReset, formatRateLimitStatus, } from './rate-limit-monitor.js';
14
+ // tmux detector exports
15
+ export { isTmuxAvailable, isInsideTmux, listTmuxPanes, capturePaneContent, analyzePaneContent, scanForBlockedPanes, sendResumeSequence, sendToPane, formatBlockedPanesSummary, } from './tmux-detector.js';
16
+ // Daemon exports
17
+ export { readDaemonState, isDaemonRunning, startDaemon, runDaemonForeground, stopDaemon, getDaemonStatus, detectBlockedPanes, formatDaemonState, } from './daemon.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/rate-limit-wait/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAeH,6BAA6B;AAC7B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAEjC,wBAAwB;AACxB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,iBAAiB;AACjB,OAAO,EACL,eAAe,EACf,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Rate Limit Monitor
3
+ *
4
+ * Wraps the existing usage-api.ts to provide rate limit status monitoring.
5
+ * Uses the OAuth API to check utilization percentages.
6
+ */
7
+ import type { RateLimitStatus } from './types.js';
8
+ /**
9
+ * Check current rate limit status using the OAuth API
10
+ *
11
+ * @returns Rate limit status or null if API unavailable
12
+ */
13
+ export declare function checkRateLimitStatus(): Promise<RateLimitStatus | null>;
14
+ /**
15
+ * Format time until reset for display
16
+ */
17
+ export declare function formatTimeUntilReset(ms: number): string;
18
+ /**
19
+ * Get a human-readable rate limit status message
20
+ */
21
+ export declare function formatRateLimitStatus(status: RateLimitStatus): string;
22
+ //# sourceMappingURL=rate-limit-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-monitor.d.ts","sourceRoot":"","sources":["../../../src/features/rate-limit-wait/rate-limit-monitor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAoD5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAevD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAqBrE"}