aicodeman 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +403 -0
  3. package/dist/ai-checker-base.d.ts +175 -0
  4. package/dist/ai-checker-base.d.ts.map +1 -0
  5. package/dist/ai-checker-base.js +424 -0
  6. package/dist/ai-checker-base.js.map +1 -0
  7. package/dist/ai-idle-checker.d.ts +53 -0
  8. package/dist/ai-idle-checker.d.ts.map +1 -0
  9. package/dist/ai-idle-checker.js +141 -0
  10. package/dist/ai-idle-checker.js.map +1 -0
  11. package/dist/ai-plan-checker.d.ts +52 -0
  12. package/dist/ai-plan-checker.d.ts.map +1 -0
  13. package/dist/ai-plan-checker.js +103 -0
  14. package/dist/ai-plan-checker.js.map +1 -0
  15. package/dist/bash-tool-parser.d.ts +191 -0
  16. package/dist/bash-tool-parser.d.ts.map +1 -0
  17. package/dist/bash-tool-parser.js +598 -0
  18. package/dist/bash-tool-parser.js.map +1 -0
  19. package/dist/cli.d.ts +12 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +460 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config/buffer-limits.d.ts +59 -0
  24. package/dist/config/buffer-limits.d.ts.map +1 -0
  25. package/dist/config/buffer-limits.js +74 -0
  26. package/dist/config/buffer-limits.js.map +1 -0
  27. package/dist/config/map-limits.d.ts +40 -0
  28. package/dist/config/map-limits.d.ts.map +1 -0
  29. package/dist/config/map-limits.js +52 -0
  30. package/dist/config/map-limits.js.map +1 -0
  31. package/dist/file-stream-manager.d.ts +148 -0
  32. package/dist/file-stream-manager.d.ts.map +1 -0
  33. package/dist/file-stream-manager.js +351 -0
  34. package/dist/file-stream-manager.js.map +1 -0
  35. package/dist/hooks-config.d.ts +31 -0
  36. package/dist/hooks-config.d.ts.map +1 -0
  37. package/dist/hooks-config.js +115 -0
  38. package/dist/hooks-config.js.map +1 -0
  39. package/dist/image-watcher.d.ts +86 -0
  40. package/dist/image-watcher.d.ts.map +1 -0
  41. package/dist/image-watcher.js +275 -0
  42. package/dist/image-watcher.js.map +1 -0
  43. package/dist/index.d.ts +11 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +54 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/mux-factory.d.ts +13 -0
  48. package/dist/mux-factory.d.ts.map +1 -0
  49. package/dist/mux-factory.js +19 -0
  50. package/dist/mux-factory.js.map +1 -0
  51. package/dist/mux-interface.d.ts +145 -0
  52. package/dist/mux-interface.d.ts.map +1 -0
  53. package/dist/mux-interface.js +9 -0
  54. package/dist/mux-interface.js.map +1 -0
  55. package/dist/plan-orchestrator.d.ts +123 -0
  56. package/dist/plan-orchestrator.d.ts.map +1 -0
  57. package/dist/plan-orchestrator.js +500 -0
  58. package/dist/plan-orchestrator.js.map +1 -0
  59. package/dist/prompts/index.d.ts +9 -0
  60. package/dist/prompts/index.d.ts.map +1 -0
  61. package/dist/prompts/index.js +9 -0
  62. package/dist/prompts/index.js.map +1 -0
  63. package/dist/prompts/planner.d.ts +14 -0
  64. package/dist/prompts/planner.d.ts.map +1 -0
  65. package/dist/prompts/planner.js +83 -0
  66. package/dist/prompts/planner.js.map +1 -0
  67. package/dist/prompts/research-agent.d.ts +10 -0
  68. package/dist/prompts/research-agent.d.ts.map +1 -0
  69. package/dist/prompts/research-agent.js +143 -0
  70. package/dist/prompts/research-agent.js.map +1 -0
  71. package/dist/push-store.d.ts +41 -0
  72. package/dist/push-store.d.ts.map +1 -0
  73. package/dist/push-store.js +168 -0
  74. package/dist/push-store.js.map +1 -0
  75. package/dist/ralph-config.d.ts +67 -0
  76. package/dist/ralph-config.d.ts.map +1 -0
  77. package/dist/ralph-config.js +134 -0
  78. package/dist/ralph-config.js.map +1 -0
  79. package/dist/ralph-loop.d.ts +124 -0
  80. package/dist/ralph-loop.d.ts.map +1 -0
  81. package/dist/ralph-loop.js +418 -0
  82. package/dist/ralph-loop.js.map +1 -0
  83. package/dist/ralph-tracker.d.ts +1081 -0
  84. package/dist/ralph-tracker.d.ts.map +1 -0
  85. package/dist/ralph-tracker.js +3343 -0
  86. package/dist/ralph-tracker.js.map +1 -0
  87. package/dist/respawn-controller.d.ts +1182 -0
  88. package/dist/respawn-controller.d.ts.map +1 -0
  89. package/dist/respawn-controller.js +2754 -0
  90. package/dist/respawn-controller.js.map +1 -0
  91. package/dist/run-summary.d.ts +123 -0
  92. package/dist/run-summary.d.ts.map +1 -0
  93. package/dist/run-summary.js +325 -0
  94. package/dist/run-summary.js.map +1 -0
  95. package/dist/session-lifecycle-log.d.ts +36 -0
  96. package/dist/session-lifecycle-log.d.ts.map +1 -0
  97. package/dist/session-lifecycle-log.js +101 -0
  98. package/dist/session-lifecycle-log.js.map +1 -0
  99. package/dist/session-manager.d.ts +97 -0
  100. package/dist/session-manager.d.ts.map +1 -0
  101. package/dist/session-manager.js +224 -0
  102. package/dist/session-manager.js.map +1 -0
  103. package/dist/session.d.ts +686 -0
  104. package/dist/session.d.ts.map +1 -0
  105. package/dist/session.js +2025 -0
  106. package/dist/session.js.map +1 -0
  107. package/dist/state-store.d.ts +189 -0
  108. package/dist/state-store.d.ts.map +1 -0
  109. package/dist/state-store.js +730 -0
  110. package/dist/state-store.js.map +1 -0
  111. package/dist/subagent-watcher.d.ts +345 -0
  112. package/dist/subagent-watcher.d.ts.map +1 -0
  113. package/dist/subagent-watcher.js +1469 -0
  114. package/dist/subagent-watcher.js.map +1 -0
  115. package/dist/task-queue.d.ts +108 -0
  116. package/dist/task-queue.d.ts.map +1 -0
  117. package/dist/task-queue.js +235 -0
  118. package/dist/task-queue.js.map +1 -0
  119. package/dist/task-tracker.d.ts +306 -0
  120. package/dist/task-tracker.d.ts.map +1 -0
  121. package/dist/task-tracker.js +488 -0
  122. package/dist/task-tracker.js.map +1 -0
  123. package/dist/task.d.ts +73 -0
  124. package/dist/task.d.ts.map +1 -0
  125. package/dist/task.js +177 -0
  126. package/dist/task.js.map +1 -0
  127. package/dist/team-watcher.d.ts +53 -0
  128. package/dist/team-watcher.d.ts.map +1 -0
  129. package/dist/team-watcher.js +313 -0
  130. package/dist/team-watcher.js.map +1 -0
  131. package/dist/templates/case-template.md +461 -0
  132. package/dist/templates/claude-md.d.ts +26 -0
  133. package/dist/templates/claude-md.d.ts.map +1 -0
  134. package/dist/templates/claude-md.js +74 -0
  135. package/dist/templates/claude-md.js.map +1 -0
  136. package/dist/tmux-manager.d.ts +181 -0
  137. package/dist/tmux-manager.d.ts.map +1 -0
  138. package/dist/tmux-manager.js +1405 -0
  139. package/dist/tmux-manager.js.map +1 -0
  140. package/dist/transcript-watcher.d.ts +110 -0
  141. package/dist/transcript-watcher.d.ts.map +1 -0
  142. package/dist/transcript-watcher.js +338 -0
  143. package/dist/transcript-watcher.js.map +1 -0
  144. package/dist/tunnel-manager.d.ts +54 -0
  145. package/dist/tunnel-manager.d.ts.map +1 -0
  146. package/dist/tunnel-manager.js +251 -0
  147. package/dist/tunnel-manager.js.map +1 -0
  148. package/dist/types.d.ts +1139 -0
  149. package/dist/types.d.ts.map +1 -0
  150. package/dist/types.js +215 -0
  151. package/dist/types.js.map +1 -0
  152. package/dist/utils/buffer-accumulator.d.ts +111 -0
  153. package/dist/utils/buffer-accumulator.d.ts.map +1 -0
  154. package/dist/utils/buffer-accumulator.js +172 -0
  155. package/dist/utils/buffer-accumulator.js.map +1 -0
  156. package/dist/utils/claude-cli-resolver.d.ts +26 -0
  157. package/dist/utils/claude-cli-resolver.d.ts.map +1 -0
  158. package/dist/utils/claude-cli-resolver.js +78 -0
  159. package/dist/utils/claude-cli-resolver.js.map +1 -0
  160. package/dist/utils/cleanup-manager.d.ts +165 -0
  161. package/dist/utils/cleanup-manager.d.ts.map +1 -0
  162. package/dist/utils/cleanup-manager.js +274 -0
  163. package/dist/utils/cleanup-manager.js.map +1 -0
  164. package/dist/utils/index.d.ts +19 -0
  165. package/dist/utils/index.d.ts.map +1 -0
  166. package/dist/utils/index.js +19 -0
  167. package/dist/utils/index.js.map +1 -0
  168. package/dist/utils/lru-map.d.ts +140 -0
  169. package/dist/utils/lru-map.d.ts.map +1 -0
  170. package/dist/utils/lru-map.js +234 -0
  171. package/dist/utils/lru-map.js.map +1 -0
  172. package/dist/utils/nice-wrapper.d.ts +13 -0
  173. package/dist/utils/nice-wrapper.d.ts.map +1 -0
  174. package/dist/utils/nice-wrapper.js +17 -0
  175. package/dist/utils/nice-wrapper.js.map +1 -0
  176. package/dist/utils/opencode-cli-resolver.d.ts +21 -0
  177. package/dist/utils/opencode-cli-resolver.d.ts.map +1 -0
  178. package/dist/utils/opencode-cli-resolver.js +67 -0
  179. package/dist/utils/opencode-cli-resolver.js.map +1 -0
  180. package/dist/utils/regex-patterns.d.ts +64 -0
  181. package/dist/utils/regex-patterns.d.ts.map +1 -0
  182. package/dist/utils/regex-patterns.js +74 -0
  183. package/dist/utils/regex-patterns.js.map +1 -0
  184. package/dist/utils/stale-expiration-map.d.ts +159 -0
  185. package/dist/utils/stale-expiration-map.d.ts.map +1 -0
  186. package/dist/utils/stale-expiration-map.js +277 -0
  187. package/dist/utils/stale-expiration-map.js.map +1 -0
  188. package/dist/utils/string-similarity.d.ts +108 -0
  189. package/dist/utils/string-similarity.d.ts.map +1 -0
  190. package/dist/utils/string-similarity.js +189 -0
  191. package/dist/utils/string-similarity.js.map +1 -0
  192. package/dist/utils/token-validation.d.ts +39 -0
  193. package/dist/utils/token-validation.d.ts.map +1 -0
  194. package/dist/utils/token-validation.js +59 -0
  195. package/dist/utils/token-validation.js.map +1 -0
  196. package/dist/utils/type-safety.d.ts +33 -0
  197. package/dist/utils/type-safety.d.ts.map +1 -0
  198. package/dist/utils/type-safety.js +35 -0
  199. package/dist/utils/type-safety.js.map +1 -0
  200. package/dist/web/public/app.js +491 -0
  201. package/dist/web/public/app.js.br +0 -0
  202. package/dist/web/public/app.js.gz +0 -0
  203. package/dist/web/public/index.html +1675 -0
  204. package/dist/web/public/index.html.br +0 -0
  205. package/dist/web/public/index.html.gz +0 -0
  206. package/dist/web/public/manifest.json +8 -0
  207. package/dist/web/public/mobile.css +1 -0
  208. package/dist/web/public/mobile.css.br +0 -0
  209. package/dist/web/public/mobile.css.gz +0 -0
  210. package/dist/web/public/ralph-wizard.js +1037 -0
  211. package/dist/web/public/ralph-wizard.js.br +0 -0
  212. package/dist/web/public/ralph-wizard.js.gz +0 -0
  213. package/dist/web/public/styles.css +1 -0
  214. package/dist/web/public/styles.css.br +0 -0
  215. package/dist/web/public/styles.css.gz +0 -0
  216. package/dist/web/public/sw.js +67 -0
  217. package/dist/web/public/sw.js.br +0 -0
  218. package/dist/web/public/sw.js.gz +0 -0
  219. package/dist/web/public/upload.html +155 -0
  220. package/dist/web/public/upload.html.br +0 -0
  221. package/dist/web/public/upload.html.gz +0 -0
  222. package/dist/web/public/vendor/xterm-addon-fit.min.js +1 -0
  223. package/dist/web/public/vendor/xterm-addon-fit.min.js.br +0 -0
  224. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  225. package/dist/web/public/vendor/xterm-addon-unicode11.min.js +1 -0
  226. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.br +0 -0
  227. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  228. package/dist/web/public/vendor/xterm-addon-webgl.min.js +2 -0
  229. package/dist/web/public/vendor/xterm-addon-webgl.min.js.br +0 -0
  230. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  231. package/dist/web/public/vendor/xterm.css +209 -0
  232. package/dist/web/public/vendor/xterm.css.br +0 -0
  233. package/dist/web/public/vendor/xterm.css.gz +0 -0
  234. package/dist/web/public/vendor/xterm.min.js +9 -0
  235. package/dist/web/public/vendor/xterm.min.js.br +0 -0
  236. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  237. package/dist/web/schemas.d.ts +479 -0
  238. package/dist/web/schemas.d.ts.map +1 -0
  239. package/dist/web/schemas.js +448 -0
  240. package/dist/web/schemas.js.map +1 -0
  241. package/dist/web/server.d.ts +207 -0
  242. package/dist/web/server.d.ts.map +1 -0
  243. package/dist/web/server.js +5784 -0
  244. package/dist/web/server.js.map +1 -0
  245. package/package.json +110 -0
  246. package/scripts/postinstall.js +390 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @fileoverview Append-only JSONL audit log for session lifecycle events.
3
+ *
4
+ * Records every session creation, start, exit, deletion, recovery, and server
5
+ * start/stop to ~/.codeman/session-lifecycle.jsonl. Survives server restarts
6
+ * (unlike RunSummary which is in-memory only).
7
+ *
8
+ * @module session-lifecycle-log
9
+ */
10
+ import type { LifecycleEventType, LifecycleEntry } from './types.js';
11
+ export declare class SessionLifecycleLog {
12
+ private filePath;
13
+ private writeQueue;
14
+ constructor(filePath?: string);
15
+ /**
16
+ * Append a lifecycle event. Fire-and-forget — errors are logged but never thrown.
17
+ */
18
+ log(entry: Omit<LifecycleEntry, 'ts'> & {
19
+ ts?: number;
20
+ }): void;
21
+ /**
22
+ * Query the log file with optional filters.
23
+ */
24
+ query(opts?: {
25
+ sessionId?: string;
26
+ event?: LifecycleEventType;
27
+ since?: number;
28
+ limit?: number;
29
+ }): Promise<LifecycleEntry[]>;
30
+ /**
31
+ * Trim the log file if it exceeds MAX_LINES. Called on server start.
32
+ */
33
+ trimIfNeeded(): Promise<void>;
34
+ }
35
+ export declare function getLifecycleLog(filePath?: string): SessionLifecycleLog;
36
+ //# sourceMappingURL=session-lifecycle-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lifecycle-log.d.ts","sourceRoot":"","sources":["../src/session-lifecycle-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKrE,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAoC;gBAE1C,QAAQ,CAAC,EAAE,MAAM;IAQ7B;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAU9D;;OAEG;IACG,KAAK,CAAC,IAAI,CAAC,EAAE;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,kBAAkB,CAAC;QAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgC7B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAgBpC;AAKD,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAKtE"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * @fileoverview Append-only JSONL audit log for session lifecycle events.
3
+ *
4
+ * Records every session creation, start, exit, deletion, recovery, and server
5
+ * start/stop to ~/.codeman/session-lifecycle.jsonl. Survives server restarts
6
+ * (unlike RunSummary which is in-memory only).
7
+ *
8
+ * @module session-lifecycle-log
9
+ */
10
+ import { appendFile, readFile, writeFile } from 'node:fs/promises';
11
+ import { existsSync, mkdirSync } from 'node:fs';
12
+ import { dirname, join } from 'node:path';
13
+ import { homedir } from 'node:os';
14
+ const MAX_LINES = 10_000;
15
+ const TRIM_TO = 8_000;
16
+ export class SessionLifecycleLog {
17
+ filePath;
18
+ writeQueue = Promise.resolve();
19
+ constructor(filePath) {
20
+ this.filePath = filePath || join(homedir(), '.codeman', 'session-lifecycle.jsonl');
21
+ const dir = dirname(this.filePath);
22
+ if (!existsSync(dir)) {
23
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
24
+ }
25
+ }
26
+ /**
27
+ * Append a lifecycle event. Fire-and-forget — errors are logged but never thrown.
28
+ */
29
+ log(entry) {
30
+ const line = JSON.stringify({ ts: Date.now(), ...entry }) + '\n';
31
+ // Chain writes to prevent interleaving
32
+ this.writeQueue = this.writeQueue
33
+ .then(() => appendFile(this.filePath, line, 'utf-8'))
34
+ .catch((err) => {
35
+ console.error('[LifecycleLog] Failed to write:', err);
36
+ });
37
+ }
38
+ /**
39
+ * Query the log file with optional filters.
40
+ */
41
+ async query(opts) {
42
+ const limit = opts?.limit ?? 200;
43
+ let raw;
44
+ try {
45
+ raw = await readFile(this.filePath, 'utf-8');
46
+ }
47
+ catch (err) {
48
+ if (err.code === 'ENOENT')
49
+ return [];
50
+ throw err;
51
+ }
52
+ const lines = raw.trim().split('\n').filter(Boolean);
53
+ const entries = [];
54
+ // Parse in reverse (newest first) for efficiency with limit
55
+ for (let i = lines.length - 1; i >= 0 && entries.length < limit; i--) {
56
+ try {
57
+ const entry = JSON.parse(lines[i]);
58
+ if (opts?.sessionId && entry.sessionId !== opts.sessionId)
59
+ continue;
60
+ if (opts?.event && entry.event !== opts.event)
61
+ continue;
62
+ if (opts?.since && entry.ts < opts.since)
63
+ continue;
64
+ entries.push(entry);
65
+ }
66
+ catch {
67
+ // Skip malformed lines
68
+ }
69
+ }
70
+ return entries;
71
+ }
72
+ /**
73
+ * Trim the log file if it exceeds MAX_LINES. Called on server start.
74
+ */
75
+ async trimIfNeeded() {
76
+ let raw;
77
+ try {
78
+ raw = await readFile(this.filePath, 'utf-8');
79
+ }
80
+ catch (err) {
81
+ if (err.code === 'ENOENT')
82
+ return;
83
+ throw err;
84
+ }
85
+ const lines = raw.trim().split('\n').filter(Boolean);
86
+ if (lines.length <= MAX_LINES)
87
+ return;
88
+ const trimmed = lines.slice(-TRIM_TO);
89
+ await writeFile(this.filePath, trimmed.join('\n') + '\n', 'utf-8');
90
+ console.log(`[LifecycleLog] Trimmed from ${lines.length} to ${trimmed.length} entries`);
91
+ }
92
+ }
93
+ // Singleton
94
+ let instance = null;
95
+ export function getLifecycleLog(filePath) {
96
+ if (!instance) {
97
+ instance = new SessionLifecycleLog(filePath);
98
+ }
99
+ return instance;
100
+ }
101
+ //# sourceMappingURL=session-lifecycle-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lifecycle-log.js","sourceRoot":"","sources":["../src/session-lifecycle-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @fileoverview Session Manager for coordinating multiple Claude sessions
3
+ *
4
+ * Provides lifecycle management for Claude CLI sessions:
5
+ * - Session creation with working directory configuration
6
+ * - Event forwarding from individual sessions
7
+ * - State persistence via StateStore
8
+ * - Concurrent session limits
9
+ *
10
+ * @module session-manager
11
+ */
12
+ import { EventEmitter } from 'node:events';
13
+ import { Session } from './session.js';
14
+ import { SessionState } from './types.js';
15
+ /**
16
+ * Events emitted by SessionManager
17
+ */
18
+ export interface SessionManagerEvents {
19
+ /** Fired when a new session starts successfully */
20
+ sessionStarted: (session: Session) => void;
21
+ /** Fired when a session stops (graceful or forced) */
22
+ sessionStopped: (sessionId: string) => void;
23
+ /** Fired when a session encounters an error */
24
+ sessionError: (sessionId: string, error: string) => void;
25
+ /** Fired when a session produces terminal output */
26
+ sessionOutput: (sessionId: string, output: string) => void;
27
+ /** Fired when a completion phrase is detected */
28
+ sessionCompletion: (sessionId: string, phrase: string) => void;
29
+ }
30
+ export declare class SessionManager extends EventEmitter {
31
+ private sessions;
32
+ private sessionHandlers;
33
+ private store;
34
+ private _sessionCreationLock;
35
+ /**
36
+ * Creates a new SessionManager and loads previous session state.
37
+ */
38
+ constructor();
39
+ private loadFromStore;
40
+ /**
41
+ * Creates and starts a new Claude session.
42
+ * Uses mutex to prevent race conditions when multiple requests arrive simultaneously.
43
+ *
44
+ * @param workingDir - Working directory for the session
45
+ * @returns The newly created session
46
+ * @throws Error if max concurrent sessions limit reached
47
+ */
48
+ createSession(workingDir: string): Promise<Session>;
49
+ /**
50
+ * Stops a session by ID.
51
+ *
52
+ * @param id - Session ID to stop
53
+ */
54
+ stopSession(id: string): Promise<void>;
55
+ /**
56
+ * Stops all active sessions.
57
+ * Uses Promise.allSettled to ensure all sessions are stopped even if some fail.
58
+ */
59
+ stopAllSessions(): Promise<void>;
60
+ /**
61
+ * Gets a session by ID.
62
+ * @param id - Session ID
63
+ * @returns The session or undefined if not found
64
+ */
65
+ getSession(id: string): Session | undefined;
66
+ /** Gets all active sessions. */
67
+ getAllSessions(): Session[];
68
+ /** Gets all sessions currently idle (not processing). */
69
+ getIdleSessions(): Session[];
70
+ /** Gets all sessions currently busy (processing). */
71
+ getBusySessions(): Session[];
72
+ /** Gets the count of active sessions. */
73
+ getSessionCount(): number;
74
+ /** Checks if a session exists by ID. */
75
+ hasSession(id: string): boolean;
76
+ private updateSessionState;
77
+ /** Gets all sessions from persistent storage (including stopped). */
78
+ getStoredSessions(): Record<string, SessionState>;
79
+ /**
80
+ * Sends input to a session.
81
+ *
82
+ * @param sessionId - Session ID to send to
83
+ * @param input - Input string to send
84
+ * @throws Error if session not found
85
+ */
86
+ sendToSession(sessionId: string, input: string): Promise<void>;
87
+ /** Gets the output buffer for a session. */
88
+ getSessionOutput(sessionId: string): string | null;
89
+ /** Gets the error buffer for a session. */
90
+ getSessionError(sessionId: string): string | null;
91
+ }
92
+ /**
93
+ * Gets or creates the singleton SessionManager instance.
94
+ * @returns The global SessionManager
95
+ */
96
+ export declare function getSessionManager(): SessionManager;
97
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mDAAmD;IACnD,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,sDAAsD;IACtD,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,+CAA+C;IAC/C,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,oDAAoD;IACpD,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,iDAAiD;IACjD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE;AA4BD,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,KAAK,CAAc;IAG3B,OAAO,CAAC,oBAAoB,CAA8B;IAE1D;;OAEG;;IAMH,OAAO,CAAC,aAAa;IAarB;;;;;;;OAOG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqEzD;;;;OAIG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B5C;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtC;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,gCAAgC;IAChC,cAAc,IAAI,OAAO,EAAE;IAI3B,yDAAyD;IACzD,eAAe,IAAI,OAAO,EAAE;IAI5B,qDAAqD;IACrD,eAAe,IAAI,OAAO,EAAE;IAI5B,yCAAyC;IACzC,eAAe,IAAI,MAAM;IAIzB,wCAAwC;IACxC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,OAAO,CAAC,kBAAkB;IAI1B,qEAAqE;IACrE,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAIjD;;;;;;OAMG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpE,4CAA4C;IAC5C,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKlD,2CAA2C;IAC3C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAIlD;AAKD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * @fileoverview Session Manager for coordinating multiple Claude sessions
3
+ *
4
+ * Provides lifecycle management for Claude CLI sessions:
5
+ * - Session creation with working directory configuration
6
+ * - Event forwarding from individual sessions
7
+ * - State persistence via StateStore
8
+ * - Concurrent session limits
9
+ *
10
+ * @module session-manager
11
+ */
12
+ import { EventEmitter } from 'node:events';
13
+ import { Session } from './session.js';
14
+ import { getStore } from './state-store.js';
15
+ export class SessionManager extends EventEmitter {
16
+ sessions = new Map();
17
+ sessionHandlers = new Map();
18
+ store = getStore();
19
+ // Mutex for session creation to prevent race conditions
20
+ _sessionCreationLock = null;
21
+ /**
22
+ * Creates a new SessionManager and loads previous session state.
23
+ */
24
+ constructor() {
25
+ super();
26
+ this.loadFromStore();
27
+ }
28
+ loadFromStore() {
29
+ const storedSessions = this.store.getSessions();
30
+ // Note: We don't restore actual processes, just the state
31
+ // Dead sessions are marked as stopped
32
+ for (const [id, state] of Object.entries(storedSessions)) {
33
+ if (state.status !== 'stopped') {
34
+ state.status = 'stopped';
35
+ state.pid = null;
36
+ this.store.setSession(id, state);
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * Creates and starts a new Claude session.
42
+ * Uses mutex to prevent race conditions when multiple requests arrive simultaneously.
43
+ *
44
+ * @param workingDir - Working directory for the session
45
+ * @returns The newly created session
46
+ * @throws Error if max concurrent sessions limit reached
47
+ */
48
+ async createSession(workingDir) {
49
+ // Wait for any pending session creation to complete (mutex pattern)
50
+ while (this._sessionCreationLock) {
51
+ await this._sessionCreationLock;
52
+ }
53
+ // Create a new lock promise that others will wait on
54
+ // Define unlock first to ensure it's always in scope before promise assignment
55
+ let unlock;
56
+ const lockPromise = new Promise((resolve) => {
57
+ unlock = resolve;
58
+ });
59
+ this._sessionCreationLock = lockPromise;
60
+ try {
61
+ const config = this.store.getConfig();
62
+ // Check limit INSIDE the lock to prevent race conditions
63
+ if (this.sessions.size >= config.maxConcurrentSessions) {
64
+ throw new Error(`Maximum concurrent sessions (${config.maxConcurrentSessions}) reached`);
65
+ }
66
+ const session = new Session({ workingDir });
67
+ // Set up event forwarding with stored handlers for cleanup
68
+ const handlers = {
69
+ output: (data) => {
70
+ this.emit('sessionOutput', session.id, data);
71
+ this.updateSessionState(session);
72
+ },
73
+ error: (data) => {
74
+ this.emit('sessionError', session.id, data);
75
+ this.updateSessionState(session);
76
+ },
77
+ completion: (phrase) => {
78
+ this.emit('sessionCompletion', session.id, phrase);
79
+ },
80
+ exit: () => {
81
+ this.emit('sessionStopped', session.id);
82
+ this.updateSessionState(session);
83
+ },
84
+ taskError: (taskId, error) => {
85
+ this.emit('sessionTaskError', session.id, taskId, error);
86
+ },
87
+ };
88
+ session.on('output', handlers.output);
89
+ session.on('error', handlers.error);
90
+ session.on('completion', handlers.completion);
91
+ session.on('exit', handlers.exit);
92
+ session.on('taskError', handlers.taskError);
93
+ // Store handlers for later cleanup
94
+ this.sessionHandlers.set(session.id, handlers);
95
+ await session.start();
96
+ this.sessions.set(session.id, session);
97
+ this.store.setSession(session.id, session.toState());
98
+ this.emit('sessionStarted', session);
99
+ return session;
100
+ }
101
+ finally {
102
+ // Release the lock so other createSession calls can proceed
103
+ this._sessionCreationLock = null;
104
+ unlock();
105
+ }
106
+ }
107
+ /**
108
+ * Stops a session by ID.
109
+ *
110
+ * @param id - Session ID to stop
111
+ */
112
+ async stopSession(id) {
113
+ const session = this.sessions.get(id);
114
+ if (!session) {
115
+ // Update store to mark as stopped if it exists there
116
+ const storedSession = this.store.getSession(id);
117
+ if (storedSession) {
118
+ storedSession.status = 'stopped';
119
+ storedSession.pid = null;
120
+ this.store.setSession(id, storedSession);
121
+ }
122
+ return;
123
+ }
124
+ // Remove event listeners to prevent memory leaks
125
+ const handlers = this.sessionHandlers.get(id);
126
+ if (handlers) {
127
+ session.off('output', handlers.output);
128
+ session.off('error', handlers.error);
129
+ session.off('completion', handlers.completion);
130
+ session.off('exit', handlers.exit);
131
+ session.off('taskError', handlers.taskError);
132
+ this.sessionHandlers.delete(id);
133
+ }
134
+ await session.stop();
135
+ this.sessions.delete(id);
136
+ this.updateSessionState(session);
137
+ }
138
+ /**
139
+ * Stops all active sessions.
140
+ * Uses Promise.allSettled to ensure all sessions are stopped even if some fail.
141
+ */
142
+ async stopAllSessions() {
143
+ const stopPromises = Array.from(this.sessions.keys()).map((id) => this.stopSession(id));
144
+ const results = await Promise.allSettled(stopPromises);
145
+ // Log any failures but don't throw - best effort cleanup
146
+ for (const result of results) {
147
+ if (result.status === 'rejected') {
148
+ console.error('[SessionManager] Failed to stop session:', result.reason);
149
+ }
150
+ }
151
+ }
152
+ /**
153
+ * Gets a session by ID.
154
+ * @param id - Session ID
155
+ * @returns The session or undefined if not found
156
+ */
157
+ getSession(id) {
158
+ return this.sessions.get(id);
159
+ }
160
+ /** Gets all active sessions. */
161
+ getAllSessions() {
162
+ return Array.from(this.sessions.values());
163
+ }
164
+ /** Gets all sessions currently idle (not processing). */
165
+ getIdleSessions() {
166
+ return this.getAllSessions().filter((s) => s.isIdle());
167
+ }
168
+ /** Gets all sessions currently busy (processing). */
169
+ getBusySessions() {
170
+ return this.getAllSessions().filter((s) => s.isBusy());
171
+ }
172
+ /** Gets the count of active sessions. */
173
+ getSessionCount() {
174
+ return this.sessions.size;
175
+ }
176
+ /** Checks if a session exists by ID. */
177
+ hasSession(id) {
178
+ return this.sessions.has(id);
179
+ }
180
+ updateSessionState(session) {
181
+ this.store.setSession(session.id, session.toState());
182
+ }
183
+ /** Gets all sessions from persistent storage (including stopped). */
184
+ getStoredSessions() {
185
+ return this.store.getSessions();
186
+ }
187
+ /**
188
+ * Sends input to a session.
189
+ *
190
+ * @param sessionId - Session ID to send to
191
+ * @param input - Input string to send
192
+ * @throws Error if session not found
193
+ */
194
+ async sendToSession(sessionId, input) {
195
+ const session = this.sessions.get(sessionId);
196
+ if (!session) {
197
+ throw new Error(`Session ${sessionId} not found`);
198
+ }
199
+ await session.sendInput(input);
200
+ }
201
+ /** Gets the output buffer for a session. */
202
+ getSessionOutput(sessionId) {
203
+ const session = this.sessions.get(sessionId);
204
+ return session?.getOutput() ?? null;
205
+ }
206
+ /** Gets the error buffer for a session. */
207
+ getSessionError(sessionId) {
208
+ const session = this.sessions.get(sessionId);
209
+ return session?.getError() ?? null;
210
+ }
211
+ }
212
+ // Singleton instance
213
+ let managerInstance = null;
214
+ /**
215
+ * Gets or creates the singleton SessionManager instance.
216
+ * @returns The global SessionManager
217
+ */
218
+ export function getSessionManager() {
219
+ if (!managerInstance) {
220
+ managerInstance = new SessionManager();
221
+ }
222
+ return managerInstance;
223
+ }
224
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}