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.
- package/LICENSE +21 -0
- package/README.md +403 -0
- package/dist/ai-checker-base.d.ts +175 -0
- package/dist/ai-checker-base.d.ts.map +1 -0
- package/dist/ai-checker-base.js +424 -0
- package/dist/ai-checker-base.js.map +1 -0
- package/dist/ai-idle-checker.d.ts +53 -0
- package/dist/ai-idle-checker.d.ts.map +1 -0
- package/dist/ai-idle-checker.js +141 -0
- package/dist/ai-idle-checker.js.map +1 -0
- package/dist/ai-plan-checker.d.ts +52 -0
- package/dist/ai-plan-checker.d.ts.map +1 -0
- package/dist/ai-plan-checker.js +103 -0
- package/dist/ai-plan-checker.js.map +1 -0
- package/dist/bash-tool-parser.d.ts +191 -0
- package/dist/bash-tool-parser.d.ts.map +1 -0
- package/dist/bash-tool-parser.js +598 -0
- package/dist/bash-tool-parser.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +460 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/buffer-limits.d.ts +59 -0
- package/dist/config/buffer-limits.d.ts.map +1 -0
- package/dist/config/buffer-limits.js +74 -0
- package/dist/config/buffer-limits.js.map +1 -0
- package/dist/config/map-limits.d.ts +40 -0
- package/dist/config/map-limits.d.ts.map +1 -0
- package/dist/config/map-limits.js +52 -0
- package/dist/config/map-limits.js.map +1 -0
- package/dist/file-stream-manager.d.ts +148 -0
- package/dist/file-stream-manager.d.ts.map +1 -0
- package/dist/file-stream-manager.js +351 -0
- package/dist/file-stream-manager.js.map +1 -0
- package/dist/hooks-config.d.ts +31 -0
- package/dist/hooks-config.d.ts.map +1 -0
- package/dist/hooks-config.js +115 -0
- package/dist/hooks-config.js.map +1 -0
- package/dist/image-watcher.d.ts +86 -0
- package/dist/image-watcher.d.ts.map +1 -0
- package/dist/image-watcher.js +275 -0
- package/dist/image-watcher.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/mux-factory.d.ts +13 -0
- package/dist/mux-factory.d.ts.map +1 -0
- package/dist/mux-factory.js +19 -0
- package/dist/mux-factory.js.map +1 -0
- package/dist/mux-interface.d.ts +145 -0
- package/dist/mux-interface.d.ts.map +1 -0
- package/dist/mux-interface.js +9 -0
- package/dist/mux-interface.js.map +1 -0
- package/dist/plan-orchestrator.d.ts +123 -0
- package/dist/plan-orchestrator.d.ts.map +1 -0
- package/dist/plan-orchestrator.js +500 -0
- package/dist/plan-orchestrator.js.map +1 -0
- package/dist/prompts/index.d.ts +9 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +9 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/planner.d.ts +14 -0
- package/dist/prompts/planner.d.ts.map +1 -0
- package/dist/prompts/planner.js +83 -0
- package/dist/prompts/planner.js.map +1 -0
- package/dist/prompts/research-agent.d.ts +10 -0
- package/dist/prompts/research-agent.d.ts.map +1 -0
- package/dist/prompts/research-agent.js +143 -0
- package/dist/prompts/research-agent.js.map +1 -0
- package/dist/push-store.d.ts +41 -0
- package/dist/push-store.d.ts.map +1 -0
- package/dist/push-store.js +168 -0
- package/dist/push-store.js.map +1 -0
- package/dist/ralph-config.d.ts +67 -0
- package/dist/ralph-config.d.ts.map +1 -0
- package/dist/ralph-config.js +134 -0
- package/dist/ralph-config.js.map +1 -0
- package/dist/ralph-loop.d.ts +124 -0
- package/dist/ralph-loop.d.ts.map +1 -0
- package/dist/ralph-loop.js +418 -0
- package/dist/ralph-loop.js.map +1 -0
- package/dist/ralph-tracker.d.ts +1081 -0
- package/dist/ralph-tracker.d.ts.map +1 -0
- package/dist/ralph-tracker.js +3343 -0
- package/dist/ralph-tracker.js.map +1 -0
- package/dist/respawn-controller.d.ts +1182 -0
- package/dist/respawn-controller.d.ts.map +1 -0
- package/dist/respawn-controller.js +2754 -0
- package/dist/respawn-controller.js.map +1 -0
- package/dist/run-summary.d.ts +123 -0
- package/dist/run-summary.d.ts.map +1 -0
- package/dist/run-summary.js +325 -0
- package/dist/run-summary.js.map +1 -0
- package/dist/session-lifecycle-log.d.ts +36 -0
- package/dist/session-lifecycle-log.d.ts.map +1 -0
- package/dist/session-lifecycle-log.js +101 -0
- package/dist/session-lifecycle-log.js.map +1 -0
- package/dist/session-manager.d.ts +97 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +224 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/session.d.ts +686 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +2025 -0
- package/dist/session.js.map +1 -0
- package/dist/state-store.d.ts +189 -0
- package/dist/state-store.d.ts.map +1 -0
- package/dist/state-store.js +730 -0
- package/dist/state-store.js.map +1 -0
- package/dist/subagent-watcher.d.ts +345 -0
- package/dist/subagent-watcher.d.ts.map +1 -0
- package/dist/subagent-watcher.js +1469 -0
- package/dist/subagent-watcher.js.map +1 -0
- package/dist/task-queue.d.ts +108 -0
- package/dist/task-queue.d.ts.map +1 -0
- package/dist/task-queue.js +235 -0
- package/dist/task-queue.js.map +1 -0
- package/dist/task-tracker.d.ts +306 -0
- package/dist/task-tracker.d.ts.map +1 -0
- package/dist/task-tracker.js +488 -0
- package/dist/task-tracker.js.map +1 -0
- package/dist/task.d.ts +73 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +177 -0
- package/dist/task.js.map +1 -0
- package/dist/team-watcher.d.ts +53 -0
- package/dist/team-watcher.d.ts.map +1 -0
- package/dist/team-watcher.js +313 -0
- package/dist/team-watcher.js.map +1 -0
- package/dist/templates/case-template.md +461 -0
- package/dist/templates/claude-md.d.ts +26 -0
- package/dist/templates/claude-md.d.ts.map +1 -0
- package/dist/templates/claude-md.js +74 -0
- package/dist/templates/claude-md.js.map +1 -0
- package/dist/tmux-manager.d.ts +181 -0
- package/dist/tmux-manager.d.ts.map +1 -0
- package/dist/tmux-manager.js +1405 -0
- package/dist/tmux-manager.js.map +1 -0
- package/dist/transcript-watcher.d.ts +110 -0
- package/dist/transcript-watcher.d.ts.map +1 -0
- package/dist/transcript-watcher.js +338 -0
- package/dist/transcript-watcher.js.map +1 -0
- package/dist/tunnel-manager.d.ts +54 -0
- package/dist/tunnel-manager.d.ts.map +1 -0
- package/dist/tunnel-manager.js +251 -0
- package/dist/tunnel-manager.js.map +1 -0
- package/dist/types.d.ts +1139 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +215 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buffer-accumulator.d.ts +111 -0
- package/dist/utils/buffer-accumulator.d.ts.map +1 -0
- package/dist/utils/buffer-accumulator.js +172 -0
- package/dist/utils/buffer-accumulator.js.map +1 -0
- package/dist/utils/claude-cli-resolver.d.ts +26 -0
- package/dist/utils/claude-cli-resolver.d.ts.map +1 -0
- package/dist/utils/claude-cli-resolver.js +78 -0
- package/dist/utils/claude-cli-resolver.js.map +1 -0
- package/dist/utils/cleanup-manager.d.ts +165 -0
- package/dist/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/utils/cleanup-manager.js +274 -0
- package/dist/utils/cleanup-manager.js.map +1 -0
- package/dist/utils/index.d.ts +19 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +19 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/lru-map.d.ts +140 -0
- package/dist/utils/lru-map.d.ts.map +1 -0
- package/dist/utils/lru-map.js +234 -0
- package/dist/utils/lru-map.js.map +1 -0
- package/dist/utils/nice-wrapper.d.ts +13 -0
- package/dist/utils/nice-wrapper.d.ts.map +1 -0
- package/dist/utils/nice-wrapper.js +17 -0
- package/dist/utils/nice-wrapper.js.map +1 -0
- package/dist/utils/opencode-cli-resolver.d.ts +21 -0
- package/dist/utils/opencode-cli-resolver.d.ts.map +1 -0
- package/dist/utils/opencode-cli-resolver.js +67 -0
- package/dist/utils/opencode-cli-resolver.js.map +1 -0
- package/dist/utils/regex-patterns.d.ts +64 -0
- package/dist/utils/regex-patterns.d.ts.map +1 -0
- package/dist/utils/regex-patterns.js +74 -0
- package/dist/utils/regex-patterns.js.map +1 -0
- package/dist/utils/stale-expiration-map.d.ts +159 -0
- package/dist/utils/stale-expiration-map.d.ts.map +1 -0
- package/dist/utils/stale-expiration-map.js +277 -0
- package/dist/utils/stale-expiration-map.js.map +1 -0
- package/dist/utils/string-similarity.d.ts +108 -0
- package/dist/utils/string-similarity.d.ts.map +1 -0
- package/dist/utils/string-similarity.js +189 -0
- package/dist/utils/string-similarity.js.map +1 -0
- package/dist/utils/token-validation.d.ts +39 -0
- package/dist/utils/token-validation.d.ts.map +1 -0
- package/dist/utils/token-validation.js +59 -0
- package/dist/utils/token-validation.js.map +1 -0
- package/dist/utils/type-safety.d.ts +33 -0
- package/dist/utils/type-safety.d.ts.map +1 -0
- package/dist/utils/type-safety.js +35 -0
- package/dist/utils/type-safety.js.map +1 -0
- package/dist/web/public/app.js +491 -0
- package/dist/web/public/app.js.br +0 -0
- package/dist/web/public/app.js.gz +0 -0
- package/dist/web/public/index.html +1675 -0
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/manifest.json +8 -0
- package/dist/web/public/mobile.css +1 -0
- package/dist/web/public/mobile.css.br +0 -0
- package/dist/web/public/mobile.css.gz +0 -0
- package/dist/web/public/ralph-wizard.js +1037 -0
- package/dist/web/public/ralph-wizard.js.br +0 -0
- package/dist/web/public/ralph-wizard.js.gz +0 -0
- package/dist/web/public/styles.css +1 -0
- package/dist/web/public/styles.css.br +0 -0
- package/dist/web/public/styles.css.gz +0 -0
- package/dist/web/public/sw.js +67 -0
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/upload.html +155 -0
- package/dist/web/public/upload.html.br +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js +1 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.br +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js +1 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.br +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js +2 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.br +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css +209 -0
- package/dist/web/public/vendor/xterm.css.br +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js +9 -0
- package/dist/web/public/vendor/xterm.min.js.br +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/schemas.d.ts +479 -0
- package/dist/web/schemas.d.ts.map +1 -0
- package/dist/web/schemas.js +448 -0
- package/dist/web/schemas.js.map +1 -0
- package/dist/web/server.d.ts +207 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +5784 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +110 -0
- 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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"}
|