@ai-devkit/agent-manager 0.29.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +1 -342
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/database/DurableAgentsDatabase.test.js +31 -3
- package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +1 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js +129 -0
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +84 -0
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +126 -0
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/durable/CodexPrintAgentService.test.js +271 -0
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/durable/CodexPrintRunner.test.js +393 -0
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/print/ClaudeCliProbe.test.js +3 -7
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +25 -28
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js +65 -0
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js +4 -10
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +79 -0
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +436 -0
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +76 -0
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +43 -0
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +202 -0
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +119 -0
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +386 -0
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +34 -0
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -0
- package/dist/__tests__/utils/ClaudeSessionParser.test.js +2 -2
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/database/migrations/004_codex_durable_sessions.sql +1 -0
- package/dist/durable/DurableAgent.d.ts +23 -3
- package/dist/durable/DurableAgent.d.ts.map +1 -1
- package/dist/durable/DurableAgent.js +12 -0
- package/dist/durable/DurableAgent.js.map +1 -1
- package/dist/durable/DurableAgentRepository.d.ts +6 -7
- package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
- package/dist/durable/DurableAgentRepository.js +73 -42
- package/dist/durable/DurableAgentRepository.js.map +1 -1
- package/dist/durable/process.d.ts +8 -0
- package/dist/durable/process.d.ts.map +1 -0
- package/dist/durable/process.js +40 -0
- package/dist/durable/process.js.map +1 -0
- package/dist/durable/run.d.ts +32 -0
- package/dist/durable/run.d.ts.map +1 -0
- package/dist/durable/run.js +46 -0
- package/dist/durable/run.js.map +1 -0
- package/dist/durable/utils.d.ts +19 -0
- package/dist/durable/utils.d.ts.map +1 -0
- package/dist/durable/utils.js +52 -0
- package/dist/durable/utils.js.map +1 -0
- package/dist/index.d.ts +17 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -8
- package/dist/index.js.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts +21 -0
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -0
- package/dist/providers/claude/ClaudeAgentMapper.js +42 -0
- package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +29 -0
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/providers/claude/ClaudeCodeAdapter.js +129 -0
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/{adapters/ClaudeCodeAdapter.d.ts → providers/claude/ClaudeSessionLocator.d.ts} +68 -52
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -0
- package/dist/{adapters/ClaudeCodeAdapter.js → providers/claude/ClaudeSessionLocator.js} +71 -189
- package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/{utils → providers/claude}/ClaudeSessionParser.d.ts +2 -2
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/{utils → providers/claude}/ClaudeSessionParser.js +1 -1
- package/dist/providers/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -0
- package/dist/{durable → providers/claude/durable}/ClaudeCliProbe.js +4 -9
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -0
- package/dist/{durable → providers/claude/durable}/ClaudePrintAgentService.d.ts +4 -9
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -0
- package/dist/providers/claude/durable/ClaudePrintAgentService.js +45 -0
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -0
- package/dist/{durable → providers/claude/durable}/ClaudePrintRunner.d.ts +3 -3
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -0
- package/dist/providers/claude/durable/ClaudePrintRunner.js +75 -0
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -0
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +17 -0
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -0
- package/dist/providers/claude/durable/ClaudeStreamParser.js +69 -0
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts +20 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.js +61 -0
- package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -0
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +40 -0
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -0
- package/dist/providers/codex/durable/CodexPrintAgentService.js +50 -0
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -0
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts +34 -0
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -0
- package/dist/providers/codex/durable/CodexPrintRunner.js +78 -0
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -0
- package/dist/providers/codex/durable/CodexStreamParser.d.ts +21 -0
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -0
- package/dist/providers/codex/durable/CodexStreamParser.js +86 -0
- package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts +20 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.js +51 -0
- package/dist/providers/pi/durable/PiCliProbe.js.map +1 -0
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts +39 -0
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiPrintAgentService.js +47 -0
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -0
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts +4 -0
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiPrintProtocol.js +44 -0
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -0
- package/dist/providers/pi/durable/PiPrintRunner.d.ts +32 -0
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiPrintRunner.js +61 -0
- package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -0
- package/dist/providers/pi/durable/PiStreamParser.d.ts +21 -0
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiStreamParser.js +71 -0
- package/dist/providers/pi/durable/PiStreamParser.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1 -307
- package/src/__tests__/database/DurableAgentsDatabase.test.ts +28 -3
- package/src/__tests__/durable/CodexCliProbe.test.ts +63 -0
- package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +54 -0
- package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +79 -0
- package/src/__tests__/durable/CodexPrintAgentService.test.ts +139 -0
- package/src/__tests__/durable/CodexPrintRunner.test.ts +189 -0
- package/src/__tests__/fixtures/fake-codex.cjs +45 -0
- package/src/__tests__/print/ClaudeCliProbe.test.ts +3 -7
- package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +11 -21
- package/src/__tests__/print/ClaudePrintAgentService.test.ts +33 -1
- package/src/__tests__/print/ClaudePrintRunner.test.ts +4 -10
- package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +84 -0
- package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +411 -0
- package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +38 -0
- package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +32 -0
- package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +69 -0
- package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +33 -0
- package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +107 -0
- package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +24 -0
- package/src/__tests__/utils/ClaudeSessionParser.test.ts +2 -2
- package/src/adapters/index.ts +1 -1
- package/src/database/migrations/004_codex_durable_sessions.sql +1 -0
- package/src/durable/DurableAgent.ts +51 -3
- package/src/durable/DurableAgentRepository.ts +60 -31
- package/src/durable/process.ts +28 -0
- package/src/durable/run.ts +74 -0
- package/src/durable/utils.ts +61 -0
- package/src/index.ts +31 -15
- package/src/providers/claude/ClaudeAgentMapper.ts +62 -0
- package/src/providers/claude/ClaudeCodeAdapter.ts +160 -0
- package/src/{adapters/ClaudeCodeAdapter.ts → providers/claude/ClaudeSessionLocator.ts} +97 -239
- package/src/{utils → providers/claude}/ClaudeSessionParser.ts +2 -2
- package/src/{durable → providers/claude/durable}/ClaudeCliProbe.ts +4 -10
- package/src/providers/claude/durable/ClaudePrintAgentService.ts +66 -0
- package/src/providers/claude/durable/ClaudePrintRunner.ts +92 -0
- package/src/providers/claude/durable/ClaudeStreamParser.ts +79 -0
- package/src/providers/codex/durable/CodexCliProbe.ts +60 -0
- package/src/providers/codex/durable/CodexPrintAgentService.ts +65 -0
- package/src/providers/codex/durable/CodexPrintRunner.ts +94 -0
- package/src/providers/codex/durable/CodexStreamParser.ts +104 -0
- package/src/providers/pi/durable/PiCliProbe.ts +48 -0
- package/src/providers/pi/durable/PiPrintAgentService.ts +69 -0
- package/src/providers/pi/durable/PiPrintProtocol.ts +39 -0
- package/src/providers/pi/durable/PiPrintRunner.ts +88 -0
- package/src/providers/pi/durable/PiStreamParser.ts +84 -0
- package/dist/adapters/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/adapters/ClaudeCodeAdapter.js.map +0 -1
- package/dist/durable/ClaudeCliProbe.d.ts.map +0 -1
- package/dist/durable/ClaudeCliProbe.js.map +0 -1
- package/dist/durable/ClaudePrintAgentService.d.ts.map +0 -1
- package/dist/durable/ClaudePrintAgentService.js +0 -66
- package/dist/durable/ClaudePrintAgentService.js.map +0 -1
- package/dist/durable/ClaudePrintRunner.d.ts.map +0 -1
- package/dist/durable/ClaudePrintRunner.js +0 -128
- package/dist/durable/ClaudePrintRunner.js.map +0 -1
- package/dist/utils/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/utils/ClaudeSessionParser.js.map +0 -1
- package/src/durable/ClaudePrintAgentService.ts +0 -94
- package/src/durable/ClaudePrintRunner.ts +0 -139
- /package/dist/{durable → providers/claude/durable}/ClaudeCliProbe.d.ts +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export function waitForChildClose(child) {
|
|
2
|
+
return new Promise((resolve, reject)=>{
|
|
3
|
+
child.once('error', reject);
|
|
4
|
+
child.once('close', (code, signal)=>resolve({
|
|
5
|
+
code,
|
|
6
|
+
signal
|
|
7
|
+
}));
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function sanitizeText(value, max, options = {}) {
|
|
11
|
+
return Array.from(value, (character)=>{
|
|
12
|
+
const code = character.charCodeAt(0);
|
|
13
|
+
if (options.preserveFormatting && (code === 9 || code === 10 || code === 13)) return character;
|
|
14
|
+
return code <= 31 || code === 127 ? ' ' : character;
|
|
15
|
+
}).join('').trim().slice(0, max);
|
|
16
|
+
}
|
|
17
|
+
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
18
|
+
export function isUuid(value) {
|
|
19
|
+
return UUID_PATTERN.test(value);
|
|
20
|
+
}
|
|
21
|
+
export class LineBuffer {
|
|
22
|
+
maxLineBytes;
|
|
23
|
+
createOversizedLineError;
|
|
24
|
+
buffer = Buffer.alloc(0);
|
|
25
|
+
constructor(maxLineBytes, createOversizedLineError){
|
|
26
|
+
this.maxLineBytes = maxLineBytes;
|
|
27
|
+
this.createOversizedLineError = createOversizedLineError;
|
|
28
|
+
}
|
|
29
|
+
accept(chunk) {
|
|
30
|
+
this.buffer = Buffer.concat([
|
|
31
|
+
this.buffer,
|
|
32
|
+
Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)
|
|
33
|
+
]);
|
|
34
|
+
if (this.buffer.length > this.maxLineBytes && this.buffer.indexOf(0x0a) < 0) {
|
|
35
|
+
throw this.createOversizedLineError();
|
|
36
|
+
}
|
|
37
|
+
const lines = [];
|
|
38
|
+
let newline;
|
|
39
|
+
while((newline = this.buffer.indexOf(0x0a)) >= 0){
|
|
40
|
+
const line = this.buffer.subarray(0, newline);
|
|
41
|
+
this.buffer = this.buffer.subarray(newline + 1);
|
|
42
|
+
if (line.length > this.maxLineBytes) throw this.createOversizedLineError();
|
|
43
|
+
lines.push(line);
|
|
44
|
+
}
|
|
45
|
+
return lines;
|
|
46
|
+
}
|
|
47
|
+
assertComplete(createIncompleteLineError) {
|
|
48
|
+
if (this.buffer.length > 0) throw createIncompleteLineError();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/durable/utils.ts"],"sourcesContent":["import type { ChildProcessWithoutNullStreams } from 'child_process';\n\nexport interface ChildCloseResult {\n code: number | null;\n signal: NodeJS.Signals | null;\n}\n\nexport function waitForChildClose(child: ChildProcessWithoutNullStreams): Promise<ChildCloseResult> {\n return new Promise((resolve, reject) => {\n child.once('error', reject);\n child.once('close', (code, signal) => resolve({ code, signal }));\n });\n}\n\nexport function sanitizeText(\n value: string,\n max: number,\n options: { preserveFormatting?: boolean } = {},\n): string {\n return Array.from(value, (character) => {\n const code = character.charCodeAt(0);\n if (options.preserveFormatting && (code === 9 || code === 10 || code === 13)) return character;\n return code <= 31 || code === 127 ? ' ' : character;\n }).join('').trim().slice(0, max);\n}\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport function isUuid(value: string): boolean {\n return UUID_PATTERN.test(value);\n}\n\nexport class LineBuffer {\n private buffer = Buffer.alloc(0);\n\n constructor(\n private readonly maxLineBytes: number,\n private readonly createOversizedLineError: () => Error,\n ) {}\n\n accept(chunk: Buffer | string): Buffer[] {\n this.buffer = Buffer.concat([this.buffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]);\n if (this.buffer.length > this.maxLineBytes && this.buffer.indexOf(0x0a) < 0) {\n throw this.createOversizedLineError();\n }\n\n const lines: Buffer[] = [];\n let newline: number;\n while ((newline = this.buffer.indexOf(0x0a)) >= 0) {\n const line = this.buffer.subarray(0, newline);\n this.buffer = this.buffer.subarray(newline + 1);\n if (line.length > this.maxLineBytes) throw this.createOversizedLineError();\n lines.push(line);\n }\n return lines;\n }\n\n assertComplete(createIncompleteLineError: () => Error): void {\n if (this.buffer.length > 0) throw createIncompleteLineError();\n }\n}\n"],"names":["waitForChildClose","child","Promise","resolve","reject","once","code","signal","sanitizeText","value","max","options","Array","from","character","charCodeAt","preserveFormatting","join","trim","slice","UUID_PATTERN","isUuid","test","LineBuffer","buffer","Buffer","alloc","maxLineBytes","createOversizedLineError","accept","chunk","concat","isBuffer","length","indexOf","lines","newline","line","subarray","push","assertComplete","createIncompleteLineError"],"mappings":"AAOA,OAAO,SAASA,kBAAkBC,KAAqC;IACnE,OAAO,IAAIC,QAAQ,CAACC,SAASC;QACzBH,MAAMI,IAAI,CAAC,SAASD;QACpBH,MAAMI,IAAI,CAAC,SAAS,CAACC,MAAMC,SAAWJ,QAAQ;gBAAEG;gBAAMC;YAAO;IACjE;AACJ;AAEA,OAAO,SAASC,aACZC,KAAa,EACbC,GAAW,EACXC,UAA4C,CAAC,CAAC;IAE9C,OAAOC,MAAMC,IAAI,CAACJ,OAAO,CAACK;QACtB,MAAMR,OAAOQ,UAAUC,UAAU,CAAC;QAClC,IAAIJ,QAAQK,kBAAkB,IAAKV,CAAAA,SAAS,KAAKA,SAAS,MAAMA,SAAS,EAAC,GAAI,OAAOQ;QACrF,OAAOR,QAAQ,MAAMA,SAAS,MAAM,MAAMQ;IAC9C,GAAGG,IAAI,CAAC,IAAIC,IAAI,GAAGC,KAAK,CAAC,GAAGT;AAChC;AAEA,MAAMU,eAAe;AAErB,OAAO,SAASC,OAAOZ,KAAa;IAChC,OAAOW,aAAaE,IAAI,CAACb;AAC7B;AAEA,OAAO,MAAMc;;;IACDC,SAASC,OAAOC,KAAK,CAAC,GAAG;IAEjC,YACI,AAAiBC,YAAoB,EACrC,AAAiBC,wBAAqC,CACxD;aAFmBD,eAAAA;aACAC,2BAAAA;IAClB;IAEHC,OAAOC,KAAsB,EAAY;QACrC,IAAI,CAACN,MAAM,GAAGC,OAAOM,MAAM,CAAC;YAAC,IAAI,CAACP,MAAM;YAAEC,OAAOO,QAAQ,CAACF,SAASA,QAAQL,OAAOZ,IAAI,CAACiB;SAAO;QAC9F,IAAI,IAAI,CAACN,MAAM,CAACS,MAAM,GAAG,IAAI,CAACN,YAAY,IAAI,IAAI,CAACH,MAAM,CAACU,OAAO,CAAC,QAAQ,GAAG;YACzE,MAAM,IAAI,CAACN,wBAAwB;QACvC;QAEA,MAAMO,QAAkB,EAAE;QAC1B,IAAIC;QACJ,MAAO,AAACA,CAAAA,UAAU,IAAI,CAACZ,MAAM,CAACU,OAAO,CAAC,KAAI,KAAM,EAAG;YAC/C,MAAMG,OAAO,IAAI,CAACb,MAAM,CAACc,QAAQ,CAAC,GAAGF;YACrC,IAAI,CAACZ,MAAM,GAAG,IAAI,CAACA,MAAM,CAACc,QAAQ,CAACF,UAAU;YAC7C,IAAIC,KAAKJ,MAAM,GAAG,IAAI,CAACN,YAAY,EAAE,MAAM,IAAI,CAACC,wBAAwB;YACxEO,MAAMI,IAAI,CAACF;QACf;QACA,OAAOF;IACX;IAEAK,eAAeC,yBAAsC,EAAQ;QACzD,IAAI,IAAI,CAACjB,MAAM,CAACS,MAAM,GAAG,GAAG,MAAMQ;IACtC;AACJ"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { AgentManager, AgentNotRunningError } from './AgentManager.js';
|
|
2
2
|
export { getCodexCapacityReport } from './capacity/index.js';
|
|
3
3
|
export type { CapacityProbeOptions, CapacityReport, CapacityWindow, } from './capacity/index.js';
|
|
4
|
-
export { ClaudeCodeAdapter } from './
|
|
4
|
+
export { ClaudeCodeAdapter } from './providers/claude/ClaudeCodeAdapter.js';
|
|
5
5
|
export { CodexAdapter } from './adapters/CodexAdapter.js';
|
|
6
6
|
export { CopilotAdapter } from './adapters/CopilotAdapter.js';
|
|
7
7
|
export { GeminiCliAdapter } from './adapters/GeminiCliAdapter.js';
|
|
@@ -13,9 +13,6 @@ export type { AgentAdapter, AgentType, AgentInfo, ProcessInfo, ConversationMessa
|
|
|
13
13
|
export { TerminalFocusManager, TerminalType } from './terminal/TerminalFocusManager.js';
|
|
14
14
|
export type { TerminalLocation } from './terminal/TerminalFocusManager.js';
|
|
15
15
|
export { TtyWriter } from './terminal/TtyWriter.js';
|
|
16
|
-
export { getProcessTty } from './utils/process.js';
|
|
17
|
-
export { captureProcessSnapshot, executableBasename, filterByProcessNames } from './utils/process.js';
|
|
18
|
-
export type { AgentSortKey } from './utils/sortAgents.js';
|
|
19
16
|
export type { ListAgentsOptions } from './AgentManager.js';
|
|
20
17
|
export { AgentRegistry, RenameNotFoundError, RenameConflictError } from './utils/AgentRegistry.js';
|
|
21
18
|
export type { AgentRegistryOptions, RegistryEntry } from './utils/AgentRegistry.js';
|
|
@@ -24,15 +21,22 @@ export { AGENTS } from './utils/agents.js';
|
|
|
24
21
|
export type { AgentConfig, StartableAgentType } from './utils/agents.js';
|
|
25
22
|
export type { AgentRequest } from './utils/agent-requests.js';
|
|
26
23
|
export { getAgentRequestPath, readLatestAgentRequest, writeAgentRequest } from './utils/agent-requests.js';
|
|
27
|
-
export { AGENT_MODES, DurableAgentError, DurableAgentBusyError, DurableAgentNotFoundError, DurableAgentRepositoryError, DurableAgentNameConflictError, ClaudePrintError, } from './durable/DurableAgent.js';
|
|
28
|
-
export type { DurableAgent, DurableAgentState, DurableSessionHealth, DurableRunStatus, DurableActiveRun, DurableLastResult, ProcessIdentity, } from './durable/DurableAgent.js';
|
|
24
|
+
export { AGENT_MODES, DurableAgentError, DurableAgentBusyError, DurableAgentNotFoundError, DurableAgentRepositoryError, DurableAgentNameConflictError, ClaudePrintError, CodexPrintError, PiPrintError, } from './durable/DurableAgent.js';
|
|
25
|
+
export type { DurableAgent, DurableAgentBase, ClaudeDurableAgent, CodexDurableAgent, PiDurableAgent, DurableProvider, CodexPrintErrorCode, DurableAgentState, DurableSessionHealth, DurableRunStatus, DurableActiveRun, DurableLastResult, PiPrintErrorCode, ProcessIdentity, } from './durable/DurableAgent.js';
|
|
29
26
|
export { DurableAgentRepository } from './durable/DurableAgentRepository.js';
|
|
30
|
-
export { LocalProcessInspector } from './durable/DurableAgentRepository.js';
|
|
31
27
|
export type { CreateDurableAgentInput, DurableAgentRepositoryOptions, ProcessInspector, DurableRunCompletion, } from './durable/DurableAgentRepository.js';
|
|
32
|
-
export {
|
|
33
|
-
export type {
|
|
34
|
-
export {
|
|
35
|
-
export type {
|
|
36
|
-
export {
|
|
37
|
-
export type {
|
|
28
|
+
export { ClaudePrintAgentService } from './providers/claude/durable/ClaudePrintAgentService.js';
|
|
29
|
+
export type { ClaudePrintAgentServiceOptions, ClaudePrintSendResult, } from './providers/claude/durable/ClaudePrintAgentService.js';
|
|
30
|
+
export { CodexCliProbe } from './providers/codex/durable/CodexCliProbe.js';
|
|
31
|
+
export type { CodexCliProbeOptions } from './providers/codex/durable/CodexCliProbe.js';
|
|
32
|
+
export { CodexPrintRunner } from './providers/codex/durable/CodexPrintRunner.js';
|
|
33
|
+
export type { CodexPrintRunnerOptions, CodexPrintRunRequest, CodexPrintRunResult, } from './providers/codex/durable/CodexPrintRunner.js';
|
|
34
|
+
export { CodexPrintAgentService } from './providers/codex/durable/CodexPrintAgentService.js';
|
|
35
|
+
export type { CodexPrintAgentServiceOptions, CodexPrintSendResult, } from './providers/codex/durable/CodexPrintAgentService.js';
|
|
36
|
+
export { PiCliProbe } from './providers/pi/durable/PiCliProbe.js';
|
|
37
|
+
export type { PiCliProbeOptions } from './providers/pi/durable/PiCliProbe.js';
|
|
38
|
+
export { PiPrintRunner } from './providers/pi/durable/PiPrintRunner.js';
|
|
39
|
+
export type { PiPrintRunnerOptions, PiPrintRunRequest, PiPrintRunResult } from './providers/pi/durable/PiPrintRunner.js';
|
|
40
|
+
export { PiPrintAgentService } from './providers/pi/durable/PiPrintAgentService.js';
|
|
41
|
+
export type { PiPrintAgentServiceOptions, PiPrintSendResult } from './providers/pi/durable/PiPrintAgentService.js';
|
|
38
42
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EACR,oBAAoB,EACpB,cAAc,EACd,cAAc,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { AgentManager, AgentNotRunningError } from './AgentManager.js';
|
|
2
2
|
export { getCodexCapacityReport } from './capacity/index.js';
|
|
3
|
-
export { ClaudeCodeAdapter } from './
|
|
3
|
+
export { ClaudeCodeAdapter } from './providers/claude/ClaudeCodeAdapter.js';
|
|
4
4
|
export { CodexAdapter } from './adapters/CodexAdapter.js';
|
|
5
5
|
export { CopilotAdapter } from './adapters/CopilotAdapter.js';
|
|
6
6
|
export { GeminiCliAdapter } from './adapters/GeminiCliAdapter.js';
|
|
@@ -10,17 +10,18 @@ export { PiAdapter } from './adapters/PiAdapter.js';
|
|
|
10
10
|
export { AgentStatus } from './adapters/AgentAdapter.js';
|
|
11
11
|
export { TerminalFocusManager, TerminalType } from './terminal/TerminalFocusManager.js';
|
|
12
12
|
export { TtyWriter } from './terminal/TtyWriter.js';
|
|
13
|
-
export { getProcessTty } from './utils/process.js';
|
|
14
|
-
export { captureProcessSnapshot, executableBasename, filterByProcessNames } from './utils/process.js';
|
|
15
13
|
export { AgentRegistry, RenameNotFoundError, RenameConflictError } from './utils/AgentRegistry.js';
|
|
16
14
|
export { TmuxManager } from './terminal/TmuxManager.js';
|
|
17
15
|
export { AGENTS } from './utils/agents.js';
|
|
18
16
|
export { getAgentRequestPath, readLatestAgentRequest, writeAgentRequest } from './utils/agent-requests.js';
|
|
19
|
-
export { AGENT_MODES, DurableAgentError, DurableAgentBusyError, DurableAgentNotFoundError, DurableAgentRepositoryError, DurableAgentNameConflictError, ClaudePrintError } from './durable/DurableAgent.js';
|
|
17
|
+
export { AGENT_MODES, DurableAgentError, DurableAgentBusyError, DurableAgentNotFoundError, DurableAgentRepositoryError, DurableAgentNameConflictError, ClaudePrintError, CodexPrintError, PiPrintError } from './durable/DurableAgent.js';
|
|
20
18
|
export { DurableAgentRepository } from './durable/DurableAgentRepository.js';
|
|
21
|
-
export {
|
|
22
|
-
export {
|
|
23
|
-
export {
|
|
24
|
-
export {
|
|
19
|
+
export { ClaudePrintAgentService } from './providers/claude/durable/ClaudePrintAgentService.js';
|
|
20
|
+
export { CodexCliProbe } from './providers/codex/durable/CodexCliProbe.js';
|
|
21
|
+
export { CodexPrintRunner } from './providers/codex/durable/CodexPrintRunner.js';
|
|
22
|
+
export { CodexPrintAgentService } from './providers/codex/durable/CodexPrintAgentService.js';
|
|
23
|
+
export { PiCliProbe } from './providers/pi/durable/PiCliProbe.js';
|
|
24
|
+
export { PiPrintRunner } from './providers/pi/durable/PiPrintRunner.js';
|
|
25
|
+
export { PiPrintAgentService } from './providers/pi/durable/PiPrintAgentService.js';
|
|
25
26
|
|
|
26
27
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from './AgentManager.js';\nexport { getCodexCapacityReport } from './capacity/index.js';\nexport type {\n CapacityProbeOptions,\n CapacityReport,\n CapacityWindow,\n} from './capacity/index.js';\n\nexport { ClaudeCodeAdapter } from './
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from './AgentManager.js';\nexport { getCodexCapacityReport } from './capacity/index.js';\nexport type {\n CapacityProbeOptions,\n CapacityReport,\n CapacityWindow,\n} from './capacity/index.js';\n\nexport { ClaudeCodeAdapter } from './providers/claude/ClaudeCodeAdapter.js';\nexport { CodexAdapter } from './adapters/CodexAdapter.js';\nexport { CopilotAdapter } from './adapters/CopilotAdapter.js';\nexport { GeminiCliAdapter } from './adapters/GeminiCliAdapter.js';\nexport { GrokCliAdapter } from './adapters/GrokCliAdapter.js';\nexport { OpenCodeAdapter } from './adapters/OpenCodeAdapter.js';\nexport { PiAdapter } from './adapters/PiAdapter.js';\nexport { AgentStatus } from './adapters/AgentAdapter.js';\nexport type {\n AgentAdapter,\n AgentType,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from './adapters/AgentAdapter.js';\n\nexport { TerminalFocusManager, TerminalType } from './terminal/TerminalFocusManager.js';\nexport type { TerminalLocation } from './terminal/TerminalFocusManager.js';\nexport { TtyWriter } from './terminal/TtyWriter.js';\n\nexport type { ListAgentsOptions } from './AgentManager.js';\n\nexport { AgentRegistry, RenameNotFoundError, RenameConflictError } from './utils/AgentRegistry.js';\nexport type { AgentRegistryOptions, RegistryEntry } from './utils/AgentRegistry.js';\nexport { TmuxManager } from './terminal/TmuxManager.js';\nexport { AGENTS } from './utils/agents.js';\nexport type { AgentConfig, StartableAgentType } from './utils/agents.js';\n\nexport type { AgentRequest } from './utils/agent-requests.js';\nexport { getAgentRequestPath, readLatestAgentRequest, writeAgentRequest } from './utils/agent-requests.js';\n\nexport {\n AGENT_MODES,\n DurableAgentError,\n DurableAgentBusyError,\n DurableAgentNotFoundError,\n DurableAgentRepositoryError,\n DurableAgentNameConflictError,\n ClaudePrintError,\n CodexPrintError,\n PiPrintError,\n} from './durable/DurableAgent.js';\nexport type {\n DurableAgent,\n DurableAgentBase,\n ClaudeDurableAgent,\n CodexDurableAgent,\n PiDurableAgent,\n DurableProvider,\n CodexPrintErrorCode,\n DurableAgentState,\n DurableSessionHealth,\n DurableRunStatus,\n DurableActiveRun,\n DurableLastResult,\n PiPrintErrorCode,\n ProcessIdentity,\n} from './durable/DurableAgent.js';\nexport { DurableAgentRepository } from './durable/DurableAgentRepository.js';\nexport type {\n CreateDurableAgentInput,\n DurableAgentRepositoryOptions,\n ProcessInspector,\n DurableRunCompletion,\n} from './durable/DurableAgentRepository.js';\nexport { ClaudePrintAgentService } from './providers/claude/durable/ClaudePrintAgentService.js';\nexport type {\n ClaudePrintAgentServiceOptions,\n ClaudePrintSendResult,\n} from './providers/claude/durable/ClaudePrintAgentService.js';\nexport { CodexCliProbe } from './providers/codex/durable/CodexCliProbe.js';\nexport type { CodexCliProbeOptions } from './providers/codex/durable/CodexCliProbe.js';\nexport { CodexPrintRunner } from './providers/codex/durable/CodexPrintRunner.js';\nexport type {\n CodexPrintRunnerOptions,\n CodexPrintRunRequest,\n CodexPrintRunResult,\n} from './providers/codex/durable/CodexPrintRunner.js';\nexport { CodexPrintAgentService } from './providers/codex/durable/CodexPrintAgentService.js';\nexport type {\n CodexPrintAgentServiceOptions,\n CodexPrintSendResult,\n} from './providers/codex/durable/CodexPrintAgentService.js';\nexport { PiCliProbe } from './providers/pi/durable/PiCliProbe.js';\nexport type { PiCliProbeOptions } from './providers/pi/durable/PiCliProbe.js';\nexport { PiPrintRunner } from './providers/pi/durable/PiPrintRunner.js';\nexport type { PiPrintRunnerOptions, PiPrintRunRequest, PiPrintRunResult } from './providers/pi/durable/PiPrintRunner.js';\nexport { PiPrintAgentService } from './providers/pi/durable/PiPrintAgentService.js';\nexport type { PiPrintAgentServiceOptions, PiPrintSendResult } from './providers/pi/durable/PiPrintAgentService.js';\n"],"names":["AgentManager","AgentNotRunningError","getCodexCapacityReport","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus","TerminalFocusManager","TerminalType","TtyWriter","AgentRegistry","RenameNotFoundError","RenameConflictError","TmuxManager","AGENTS","getAgentRequestPath","readLatestAgentRequest","writeAgentRequest","AGENT_MODES","DurableAgentError","DurableAgentBusyError","DurableAgentNotFoundError","DurableAgentRepositoryError","DurableAgentNameConflictError","ClaudePrintError","CodexPrintError","PiPrintError","DurableAgentRepository","ClaudePrintAgentService","CodexCliProbe","CodexPrintRunner","CodexPrintAgentService","PiCliProbe","PiPrintRunner","PiPrintAgentService"],"mappings":"AAAA,SAASA,YAAY,EAAEC,oBAAoB,QAAQ,oBAAoB;AACvE,SAASC,sBAAsB,QAAQ,sBAAsB;AAO7D,SAASC,iBAAiB,QAAQ,0CAA0C;AAC5E,SAASC,YAAY,QAAQ,6BAA6B;AAC1D,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,gBAAgB,QAAQ,iCAAiC;AAClE,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,0BAA0B;AACpD,SAASC,WAAW,QAAQ,6BAA6B;AAYzD,SAASC,oBAAoB,EAAEC,YAAY,QAAQ,qCAAqC;AAExF,SAASC,SAAS,QAAQ,0BAA0B;AAIpD,SAASC,aAAa,EAAEC,mBAAmB,EAAEC,mBAAmB,QAAQ,2BAA2B;AAEnG,SAASC,WAAW,QAAQ,4BAA4B;AACxD,SAASC,MAAM,QAAQ,oBAAoB;AAI3C,SAASC,mBAAmB,EAAEC,sBAAsB,EAAEC,iBAAiB,QAAQ,4BAA4B;AAE3G,SACIC,WAAW,EACXC,iBAAiB,EACjBC,qBAAqB,EACrBC,yBAAyB,EACzBC,2BAA2B,EAC3BC,6BAA6B,EAC7BC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,QACT,4BAA4B;AAiBnC,SAASC,sBAAsB,QAAQ,sCAAsC;AAO7E,SAASC,uBAAuB,QAAQ,wDAAwD;AAKhG,SAASC,aAAa,QAAQ,6CAA6C;AAE3E,SAASC,gBAAgB,QAAQ,gDAAgD;AAMjF,SAASC,sBAAsB,QAAQ,sDAAsD;AAK7F,SAASC,UAAU,QAAQ,uCAAuC;AAElE,SAASC,aAAa,QAAQ,0CAA0C;AAExE,SAASC,mBAAmB,QAAQ,gDAAgD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AgentInfo, ProcessInfo } from '../../adapters/AgentAdapter.js';
|
|
2
|
+
import { AgentStatus } from '../../adapters/AgentAdapter.js';
|
|
3
|
+
import type { SessionFile } from '../../utils/session.js';
|
|
4
|
+
import { ClaudeSessionParser, type ClaudeSession } from './ClaudeSessionParser.js';
|
|
5
|
+
export interface ClaudeAgentLiveInfo {
|
|
6
|
+
pidStatus?: AgentStatus;
|
|
7
|
+
waitingFor?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ClaudeSessionAgentInput {
|
|
10
|
+
session: ClaudeSession;
|
|
11
|
+
processInfo: ProcessInfo;
|
|
12
|
+
sessionFile: SessionFile;
|
|
13
|
+
liveInfo?: ClaudeAgentLiveInfo;
|
|
14
|
+
}
|
|
15
|
+
export declare class ClaudeAgentMapper {
|
|
16
|
+
private readonly parser;
|
|
17
|
+
constructor(parser?: ClaudeSessionParser);
|
|
18
|
+
mapSessionToAgent({ session, processInfo, sessionFile, liveInfo, }: ClaudeSessionAgentInput): AgentInfo;
|
|
19
|
+
mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ClaudeAgentMapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEnF,MAAM,WAAW,mBAAmB;IAChC,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED,qBAAa,iBAAiB;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,mBAA+C;IAEpF,iBAAiB,CAAC,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACX,QAAQ,GACX,EAAE,uBAAuB,GAAG,SAAS;IAuBtC,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAY3D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AgentStatus } from '../../adapters/AgentAdapter.js';
|
|
2
|
+
import { generateAgentName } from '../../utils/matching.js';
|
|
3
|
+
import { ClaudeSessionParser } from './ClaudeSessionParser.js';
|
|
4
|
+
export class ClaudeAgentMapper {
|
|
5
|
+
parser;
|
|
6
|
+
constructor(parser = new ClaudeSessionParser()){
|
|
7
|
+
this.parser = parser;
|
|
8
|
+
}
|
|
9
|
+
mapSessionToAgent({ session, processInfo, sessionFile, liveInfo }) {
|
|
10
|
+
// Live PID-file status is authoritative when present — JSONL-derived
|
|
11
|
+
// status mis-classifies sessions whose latest entry is a UI-state
|
|
12
|
+
// event like `permission-mode` or `ai-title`.
|
|
13
|
+
const status = liveInfo?.pidStatus ?? this.parser.determineStatus(session);
|
|
14
|
+
const baseSummary = session.lastUserMessage || 'Session started';
|
|
15
|
+
const summary = status === AgentStatus.WAITING && liveInfo?.waitingFor ? `${baseSummary} — waiting for ${liveInfo.waitingFor}` : baseSummary;
|
|
16
|
+
return {
|
|
17
|
+
name: generateAgentName(processInfo.cwd, processInfo.pid),
|
|
18
|
+
type: 'claude',
|
|
19
|
+
status,
|
|
20
|
+
summary,
|
|
21
|
+
pid: processInfo.pid,
|
|
22
|
+
projectPath: sessionFile.resolvedCwd || processInfo.cwd || '',
|
|
23
|
+
sessionId: sessionFile.sessionId,
|
|
24
|
+
lastActive: session.lastActive,
|
|
25
|
+
sessionFilePath: sessionFile.filePath
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
mapProcessOnlyAgent(processInfo) {
|
|
29
|
+
return {
|
|
30
|
+
name: generateAgentName(processInfo.cwd || '', processInfo.pid),
|
|
31
|
+
type: 'claude',
|
|
32
|
+
status: AgentStatus.IDLE,
|
|
33
|
+
summary: 'Unknown',
|
|
34
|
+
pid: processInfo.pid,
|
|
35
|
+
projectPath: processInfo.cwd || '',
|
|
36
|
+
sessionId: `pid-${processInfo.pid}`,
|
|
37
|
+
lastActive: new Date()
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=ClaudeAgentMapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport { AgentStatus } from '../../adapters/AgentAdapter.js';\nimport { generateAgentName } from '../../utils/matching.js';\nimport type { SessionFile } from '../../utils/session.js';\nimport { ClaudeSessionParser, type ClaudeSession } from './ClaudeSessionParser.js';\n\nexport interface ClaudeAgentLiveInfo {\n pidStatus?: AgentStatus;\n waitingFor?: string;\n}\n\nexport interface ClaudeSessionAgentInput {\n session: ClaudeSession;\n processInfo: ProcessInfo;\n sessionFile: SessionFile;\n liveInfo?: ClaudeAgentLiveInfo;\n}\n\nexport class ClaudeAgentMapper {\n constructor(private readonly parser: ClaudeSessionParser = new ClaudeSessionParser()) {}\n\n mapSessionToAgent({\n session,\n processInfo,\n sessionFile,\n liveInfo,\n }: ClaudeSessionAgentInput): AgentInfo {\n // Live PID-file status is authoritative when present — JSONL-derived\n // status mis-classifies sessions whose latest entry is a UI-state\n // event like `permission-mode` or `ai-title`.\n const status = liveInfo?.pidStatus ?? this.parser.determineStatus(session);\n const baseSummary = session.lastUserMessage || 'Session started';\n const summary = status === AgentStatus.WAITING && liveInfo?.waitingFor\n ? `${baseSummary} — waiting for ${liveInfo.waitingFor}`\n : baseSummary;\n\n return {\n name: generateAgentName(processInfo.cwd, processInfo.pid),\n type: 'claude',\n status,\n summary,\n pid: processInfo.pid,\n projectPath: sessionFile.resolvedCwd || processInfo.cwd || '',\n sessionId: sessionFile.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: sessionFile.filePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return {\n name: generateAgentName(processInfo.cwd || '', processInfo.pid),\n type: 'claude',\n status: AgentStatus.IDLE,\n summary: 'Unknown',\n pid: processInfo.pid,\n projectPath: processInfo.cwd || '',\n sessionId: `pid-${processInfo.pid}`,\n lastActive: new Date(),\n };\n }\n}\n"],"names":["AgentStatus","generateAgentName","ClaudeSessionParser","ClaudeAgentMapper","parser","mapSessionToAgent","session","processInfo","sessionFile","liveInfo","status","pidStatus","determineStatus","baseSummary","lastUserMessage","summary","WAITING","waitingFor","name","cwd","pid","type","projectPath","resolvedCwd","sessionId","lastActive","sessionFilePath","filePath","mapProcessOnlyAgent","IDLE","Date"],"mappings":"AACA,SAASA,WAAW,QAAQ,iCAAiC;AAC7D,SAASC,iBAAiB,QAAQ,0BAA0B;AAE5D,SAASC,mBAAmB,QAA4B,2BAA2B;AAcnF,OAAO,MAAMC;;IACT,YAAY,AAAiBC,SAA8B,IAAIF,qBAAqB,CAAE;aAAzDE,SAAAA;IAA0D;IAEvFC,kBAAkB,EACdC,OAAO,EACPC,WAAW,EACXC,WAAW,EACXC,QAAQ,EACc,EAAa;QACnC,qEAAqE;QACrE,kEAAkE;QAClE,8CAA8C;QAC9C,MAAMC,SAASD,UAAUE,aAAa,IAAI,CAACP,MAAM,CAACQ,eAAe,CAACN;QAClE,MAAMO,cAAcP,QAAQQ,eAAe,IAAI;QAC/C,MAAMC,UAAUL,WAAWV,YAAYgB,OAAO,IAAIP,UAAUQ,aACtD,GAAGJ,YAAY,eAAe,EAAEJ,SAASQ,UAAU,EAAE,GACrDJ;QAEN,OAAO;YACHK,MAAMjB,kBAAkBM,YAAYY,GAAG,EAAEZ,YAAYa,GAAG;YACxDC,MAAM;YACNX;YACAK;YACAK,KAAKb,YAAYa,GAAG;YACpBE,aAAad,YAAYe,WAAW,IAAIhB,YAAYY,GAAG,IAAI;YAC3DK,WAAWhB,YAAYgB,SAAS;YAChCC,YAAYnB,QAAQmB,UAAU;YAC9BC,iBAAiBlB,YAAYmB,QAAQ;QACzC;IACJ;IAEAC,oBAAoBrB,WAAwB,EAAa;QACrD,OAAO;YACHW,MAAMjB,kBAAkBM,YAAYY,GAAG,IAAI,IAAIZ,YAAYa,GAAG;YAC9DC,MAAM;YACNX,QAAQV,YAAY6B,IAAI;YACxBd,SAAS;YACTK,KAAKb,YAAYa,GAAG;YACpBE,aAAaf,YAAYY,GAAG,IAAI;YAChCK,WAAW,CAAC,IAAI,EAAEjB,YAAYa,GAAG,EAAE;YACnCK,YAAY,IAAIK;QACpB;IACJ;AACJ"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from '../../adapters/AgentAdapter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code Adapter
|
|
4
|
+
*
|
|
5
|
+
* Detects Claude Code agents by:
|
|
6
|
+
* 1. Filtering Claude processes from a shared asynchronous process snapshot
|
|
7
|
+
* 2. Using snapshot CWD and start-time enrichment
|
|
8
|
+
* 3. Attempting authoritative PID-file matching via ~/.claude/sessions/<pid>.json
|
|
9
|
+
* 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file
|
|
10
|
+
* 5. Extracting summary from last user message in session JSONL
|
|
11
|
+
*/
|
|
12
|
+
export declare class ClaudeCodeAdapter implements AgentAdapter {
|
|
13
|
+
readonly type: "claude";
|
|
14
|
+
readonly processNames: readonly ["claude"];
|
|
15
|
+
private parser;
|
|
16
|
+
private mapper;
|
|
17
|
+
private projectsDir;
|
|
18
|
+
private sessionsDir;
|
|
19
|
+
constructor();
|
|
20
|
+
canHandle(processInfo: ProcessInfo): boolean;
|
|
21
|
+
private isClaudeExecutable;
|
|
22
|
+
detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
|
|
23
|
+
private createLocator;
|
|
24
|
+
getConversation(sessionFilePath: string, options?: {
|
|
25
|
+
verbose?: boolean;
|
|
26
|
+
}): ConversationMessage[];
|
|
27
|
+
listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=ClaudeCodeAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeCodeAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACxB,MAAM,gCAAgC,CAAC;AAOxC;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,YAAY,sBAAuB;IAE5C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;;IAU5B,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C,OAAO,CAAC,kBAAkB;IAKpB,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA+DzE,OAAO,CAAC,aAAa;IAOrB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAI1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAiC5E"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { captureProcessSnapshot, executableBasename, filterByProcessNames } from '../../utils/process.js';
|
|
3
|
+
import { safeStat } from '../../utils/session.js';
|
|
4
|
+
import { ClaudeSessionParser } from './ClaudeSessionParser.js';
|
|
5
|
+
import { ClaudeAgentMapper } from './ClaudeAgentMapper.js';
|
|
6
|
+
import { ClaudeSessionLocator } from './ClaudeSessionLocator.js';
|
|
7
|
+
/**
|
|
8
|
+
* Claude Code Adapter
|
|
9
|
+
*
|
|
10
|
+
* Detects Claude Code agents by:
|
|
11
|
+
* 1. Filtering Claude processes from a shared asynchronous process snapshot
|
|
12
|
+
* 2. Using snapshot CWD and start-time enrichment
|
|
13
|
+
* 3. Attempting authoritative PID-file matching via ~/.claude/sessions/<pid>.json
|
|
14
|
+
* 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file
|
|
15
|
+
* 5. Extracting summary from last user message in session JSONL
|
|
16
|
+
*/ export class ClaudeCodeAdapter {
|
|
17
|
+
type = 'claude';
|
|
18
|
+
processNames = [
|
|
19
|
+
'claude'
|
|
20
|
+
];
|
|
21
|
+
parser;
|
|
22
|
+
mapper;
|
|
23
|
+
projectsDir;
|
|
24
|
+
sessionsDir;
|
|
25
|
+
constructor(){
|
|
26
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
27
|
+
this.projectsDir = path.join(homeDir, '.claude', 'projects');
|
|
28
|
+
this.sessionsDir = path.join(homeDir, '.claude', 'sessions');
|
|
29
|
+
this.parser = new ClaudeSessionParser();
|
|
30
|
+
this.mapper = new ClaudeAgentMapper(this.parser);
|
|
31
|
+
}
|
|
32
|
+
canHandle(processInfo) {
|
|
33
|
+
return this.isClaudeExecutable(processInfo.command);
|
|
34
|
+
}
|
|
35
|
+
isClaudeExecutable(command) {
|
|
36
|
+
const base = executableBasename(command);
|
|
37
|
+
return base === 'claude' || base === 'claude.exe';
|
|
38
|
+
}
|
|
39
|
+
async detectAgents(context) {
|
|
40
|
+
const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);
|
|
41
|
+
const relevant = filterByProcessNames(snapshot, this.processNames);
|
|
42
|
+
const processes = relevant.filter((process1)=>this.canHandle(process1));
|
|
43
|
+
if (processes.length === 0) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
const { direct, legacyMatches } = this.createLocator().matchRunningProcesses(processes);
|
|
47
|
+
const matchedPids = new Set([
|
|
48
|
+
...direct.map((d)=>d.process.pid),
|
|
49
|
+
...legacyMatches.map((m)=>m.process.pid)
|
|
50
|
+
]);
|
|
51
|
+
const agents = [];
|
|
52
|
+
// Build agents from direct (resume + PID-file) matches
|
|
53
|
+
for (const match of direct){
|
|
54
|
+
const { process: proc, sessionFile } = match;
|
|
55
|
+
const sessionData = this.parser.readSession(sessionFile.filePath, sessionFile.resolvedCwd);
|
|
56
|
+
if (sessionData) {
|
|
57
|
+
agents.push(this.mapper.mapSessionToAgent({
|
|
58
|
+
session: sessionData,
|
|
59
|
+
processInfo: proc,
|
|
60
|
+
sessionFile,
|
|
61
|
+
liveInfo: {
|
|
62
|
+
pidStatus: match.pidStatus,
|
|
63
|
+
waitingFor: match.waitingFor
|
|
64
|
+
}
|
|
65
|
+
}));
|
|
66
|
+
} else {
|
|
67
|
+
matchedPids.delete(proc.pid);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Build agents from legacy matches
|
|
71
|
+
for (const match of legacyMatches){
|
|
72
|
+
const sessionData = this.parser.readSession(match.session.filePath, match.session.resolvedCwd);
|
|
73
|
+
if (sessionData) {
|
|
74
|
+
agents.push(this.mapper.mapSessionToAgent({
|
|
75
|
+
session: sessionData,
|
|
76
|
+
processInfo: match.process,
|
|
77
|
+
sessionFile: match.session
|
|
78
|
+
}));
|
|
79
|
+
} else {
|
|
80
|
+
matchedPids.delete(match.process.pid);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Any process with no match (direct or legacy) appears as IDLE
|
|
84
|
+
for (const proc of processes){
|
|
85
|
+
if (!matchedPids.has(proc.pid)) {
|
|
86
|
+
agents.push(this.mapper.mapProcessOnlyAgent(proc));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return agents;
|
|
90
|
+
}
|
|
91
|
+
createLocator() {
|
|
92
|
+
return new ClaudeSessionLocator({
|
|
93
|
+
projectsDir: this.projectsDir,
|
|
94
|
+
sessionsDir: this.sessionsDir
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
getConversation(sessionFilePath, options) {
|
|
98
|
+
return this.parser.getConversation(sessionFilePath, options);
|
|
99
|
+
}
|
|
100
|
+
async listSessions(opts) {
|
|
101
|
+
const filterCwd = opts?.cwd;
|
|
102
|
+
const candidates = this.createLocator().discoverHistoricalSessionFiles();
|
|
103
|
+
const summaries = [];
|
|
104
|
+
for (const { filePath, defaultCwd } of candidates){
|
|
105
|
+
const session = this.parser.readSession(filePath, defaultCwd);
|
|
106
|
+
if (!session) continue;
|
|
107
|
+
// Drop sessions whose JSONL had no parseable conversation entries.
|
|
108
|
+
// readSession is permissive (returns a shell record even when every
|
|
109
|
+
// line fails to parse); listSessions needs at least one real entry
|
|
110
|
+
// so we don't surface garbage files.
|
|
111
|
+
if (!session.lastEntryType) continue;
|
|
112
|
+
const recordedCwd = session.lastCwd || defaultCwd;
|
|
113
|
+
if (filterCwd !== undefined && recordedCwd !== filterCwd) continue;
|
|
114
|
+
const stat = safeStat(filePath);
|
|
115
|
+
summaries.push({
|
|
116
|
+
type: 'claude',
|
|
117
|
+
sessionId: session.sessionId,
|
|
118
|
+
cwd: recordedCwd,
|
|
119
|
+
firstUserMessage: session.firstUserMessage || '',
|
|
120
|
+
lastActive: session.lastActive ?? stat?.mtime ?? new Date(),
|
|
121
|
+
startedAt: session.sessionStart ?? stat?.birthtime ?? stat?.mtime ?? new Date(),
|
|
122
|
+
sessionFilePath: filePath
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return summaries;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
//# sourceMappingURL=ClaudeCodeAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"sourcesContent":["import * as path from 'path';\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from '../../adapters/AgentAdapter.js';\nimport { captureProcessSnapshot, executableBasename, filterByProcessNames } from '../../utils/process.js';\nimport { safeStat } from '../../utils/session.js';\nimport { ClaudeSessionParser } from './ClaudeSessionParser.js';\nimport { ClaudeAgentMapper } from './ClaudeAgentMapper.js';\nimport { ClaudeSessionLocator } from './ClaudeSessionLocator.js';\n\n/**\n * Claude Code Adapter\n *\n * Detects Claude Code agents by:\n * 1. Filtering Claude processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Attempting authoritative PID-file matching via ~/.claude/sessions/<pid>.json\n * 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file\n * 5. Extracting summary from last user message in session JSONL\n */\nexport class ClaudeCodeAdapter implements AgentAdapter {\n readonly type = 'claude' as const;\n readonly processNames = ['claude'] as const;\n\n private parser: ClaudeSessionParser;\n private mapper: ClaudeAgentMapper;\n private projectsDir: string;\n private sessionsDir: string;\n\n constructor() {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n this.projectsDir = path.join(homeDir, '.claude', 'projects');\n this.sessionsDir = path.join(homeDir, '.claude', 'sessions');\n this.parser = new ClaudeSessionParser();\n this.mapper = new ClaudeAgentMapper(this.parser);\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isClaudeExecutable(processInfo.command);\n }\n\n private isClaudeExecutable(command: string): boolean {\n const base = executableBasename(command);\n return base === 'claude' || base === 'claude.exe';\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) {\n return [];\n }\n\n const { direct, legacyMatches } = this.createLocator().matchRunningProcesses(processes);\n\n const matchedPids = new Set([\n ...direct.map((d) => d.process.pid),\n ...legacyMatches.map((m) => m.process.pid),\n ]);\n\n const agents: AgentInfo[] = [];\n\n // Build agents from direct (resume + PID-file) matches\n for (const match of direct) {\n const { process: proc, sessionFile } = match;\n const sessionData = this.parser.readSession(sessionFile.filePath, sessionFile.resolvedCwd);\n if (sessionData) {\n agents.push(this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: proc,\n sessionFile,\n liveInfo: {\n pidStatus: match.pidStatus,\n waitingFor: match.waitingFor,\n },\n }));\n } else {\n matchedPids.delete(proc.pid);\n }\n }\n\n // Build agents from legacy matches\n for (const match of legacyMatches) {\n const sessionData = this.parser.readSession(\n match.session.filePath,\n match.session.resolvedCwd,\n );\n if (sessionData) {\n agents.push(this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: match.process,\n sessionFile: match.session,\n }));\n } else {\n matchedPids.delete(match.process.pid);\n }\n }\n\n // Any process with no match (direct or legacy) appears as IDLE\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid)) {\n agents.push(this.mapper.mapProcessOnlyAgent(proc));\n }\n }\n\n return agents;\n }\n\n private createLocator(): ClaudeSessionLocator {\n return new ClaudeSessionLocator({\n projectsDir: this.projectsDir,\n sessionsDir: this.sessionsDir,\n });\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const filterCwd = opts?.cwd;\n const candidates = this.createLocator().discoverHistoricalSessionFiles();\n const summaries: SessionSummary[] = [];\n\n for (const { filePath, defaultCwd } of candidates) {\n const session = this.parser.readSession(filePath, defaultCwd);\n if (!session) continue;\n\n // Drop sessions whose JSONL had no parseable conversation entries.\n // readSession is permissive (returns a shell record even when every\n // line fails to parse); listSessions needs at least one real entry\n // so we don't surface garbage files.\n if (!session.lastEntryType) continue;\n\n const recordedCwd = session.lastCwd || defaultCwd;\n if (filterCwd !== undefined && recordedCwd !== filterCwd) continue;\n\n const stat = safeStat(filePath);\n\n summaries.push({\n type: 'claude',\n sessionId: session.sessionId,\n cwd: recordedCwd,\n firstUserMessage: session.firstUserMessage || '',\n lastActive: session.lastActive ?? stat?.mtime ?? new Date(),\n startedAt: session.sessionStart ?? stat?.birthtime ?? stat?.mtime ?? new Date(),\n sessionFilePath: filePath,\n });\n }\n\n return summaries;\n }\n}\n"],"names":["path","captureProcessSnapshot","executableBasename","filterByProcessNames","safeStat","ClaudeSessionParser","ClaudeAgentMapper","ClaudeSessionLocator","ClaudeCodeAdapter","type","processNames","parser","mapper","projectsDir","sessionsDir","homeDir","process","env","HOME","USERPROFILE","join","canHandle","processInfo","isClaudeExecutable","command","base","detectAgents","context","snapshot","processes","relevant","filter","length","direct","legacyMatches","createLocator","matchRunningProcesses","matchedPids","Set","map","d","pid","m","agents","match","proc","sessionFile","sessionData","readSession","filePath","resolvedCwd","push","mapSessionToAgent","session","liveInfo","pidStatus","waitingFor","delete","has","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","filterCwd","cwd","candidates","discoverHistoricalSessionFiles","summaries","defaultCwd","lastEntryType","recordedCwd","lastCwd","undefined","stat","sessionId","firstUserMessage","lastActive","mtime","Date","startedAt","sessionStart","birthtime"],"mappings":"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"}
|
|
@@ -1,24 +1,72 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ProcessInfo } from '../../adapters/AgentAdapter.js';
|
|
2
|
+
import { AgentStatus } from '../../adapters/AgentAdapter.js';
|
|
3
|
+
import { type MatchResult } from '../../utils/matching.js';
|
|
4
|
+
import { type SessionFile } from '../../utils/session.js';
|
|
2
5
|
/**
|
|
3
|
-
*
|
|
6
|
+
* A process directly matched to a session via PID file (authoritative path).
|
|
4
7
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* 3. Attempting authoritative PID-file matching via ~/.claude/sessions/<pid>.json
|
|
9
|
-
* 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file
|
|
10
|
-
* 5. Extracting summary from last user message in session JSONL
|
|
8
|
+
* When the matching PID file also exposes live status/waitingFor metadata,
|
|
9
|
+
* those values are carried here so the agent mapper can prefer them over
|
|
10
|
+
* the JSONL-derived heuristic.
|
|
11
11
|
*/
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
export interface ClaudeDirectMatch {
|
|
13
|
+
process: ProcessInfo;
|
|
14
|
+
sessionFile: SessionFile;
|
|
15
|
+
pidStatus?: AgentStatus;
|
|
16
|
+
waitingFor?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ClaudeProcessSessionMatches {
|
|
19
|
+
direct: ClaudeDirectMatch[];
|
|
20
|
+
legacyMatches: MatchResult[];
|
|
21
|
+
}
|
|
22
|
+
export interface ClaudeSessionLocatorOptions {
|
|
23
|
+
projectsDir?: string;
|
|
24
|
+
sessionsDir?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare class ClaudeSessionLocator {
|
|
27
|
+
private readonly projectsDir;
|
|
28
|
+
private readonly sessionsDir;
|
|
29
|
+
constructor(options?: ClaudeSessionLocatorOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Pair live Claude processes with their session files.
|
|
32
|
+
*
|
|
33
|
+
* Runs three staged strategies, each handing its unmatched processes
|
|
34
|
+
* to the next:
|
|
35
|
+
* 1. `--resume <id>` on the command line — authoritative for resumed
|
|
36
|
+
* sessions whose JSONL predates the process.
|
|
37
|
+
* 2. PID-file matching via ~/.claude/sessions/<pid>.json.
|
|
38
|
+
* 3. Legacy CWD+birthtime heuristic, for processes with no PID file.
|
|
39
|
+
*/
|
|
40
|
+
matchRunningProcesses(processes: ProcessInfo[]): ClaudeProcessSessionMatches;
|
|
41
|
+
/**
|
|
42
|
+
* Discover candidate session files for listing historical sessions.
|
|
43
|
+
*
|
|
44
|
+
* Always walks every subdirectory of `projectsDir`. We can't use the
|
|
45
|
+
* encoded-dir shortcut for the cwd-scoped path because Claude Code
|
|
46
|
+
* indexes session files by where the *process was launched*, not by
|
|
47
|
+
* the recorded `cwd` field inside the session — these diverge in
|
|
48
|
+
* worktrees and similar setups. The cwd filter is applied later
|
|
49
|
+
* against `session.lastCwd` so callers see exactly the sessions whose
|
|
50
|
+
* recorded cwd matches.
|
|
51
|
+
*/
|
|
52
|
+
discoverHistoricalSessionFiles(): Array<{
|
|
53
|
+
filePath: string;
|
|
54
|
+
defaultCwd: string;
|
|
55
|
+
}>;
|
|
56
|
+
/**
|
|
57
|
+
* Derive the Claude Code project directory for a given CWD.
|
|
58
|
+
*
|
|
59
|
+
* Claude Code encodes paths by replacing every non-alphanumeric
|
|
60
|
+
* character with '-', so '/', '_', '.', spaces, etc. all collapse:
|
|
61
|
+
* /Users/foo/bar → -Users-foo-bar
|
|
62
|
+
* /Users/foo/my_project → -Users-foo-my-project
|
|
63
|
+
* /Users/foo/.worktrees/x → -Users-foo--worktrees-x
|
|
64
|
+
*
|
|
65
|
+
* The encoding is lossy — multiple real paths can collide on the
|
|
66
|
+
* same encoded dir. Callers that need to disambiguate must read the
|
|
67
|
+
* `cwd` field inside each session JSONL.
|
|
68
|
+
*/
|
|
69
|
+
private getProjectDir;
|
|
22
70
|
/**
|
|
23
71
|
* Discover session files for the given processes.
|
|
24
72
|
*
|
|
@@ -26,7 +74,7 @@ export declare class ClaudeCodeAdapter implements AgentAdapter {
|
|
|
26
74
|
* ~/.claude/projects/<encoded>/ directory, then gets session file birthtimes
|
|
27
75
|
* via a single batched stat call across all directories.
|
|
28
76
|
*/
|
|
29
|
-
|
|
77
|
+
discoverLiveSessions(processes: ProcessInfo[]): SessionFile[];
|
|
30
78
|
/**
|
|
31
79
|
* Match processes via `claude --resume <uuid>` in their command line.
|
|
32
80
|
* This works for resumed sessions, where the JSONL was created earlier
|
|
@@ -63,37 +111,5 @@ export declare class ClaudeCodeAdapter implements AgentAdapter {
|
|
|
63
111
|
* stale startedAt (>60s from proc.startTime), or missing JSONL.
|
|
64
112
|
*/
|
|
65
113
|
private tryPidFileMatching;
|
|
66
|
-
/**
|
|
67
|
-
* Derive the Claude Code project directory for a given CWD.
|
|
68
|
-
*
|
|
69
|
-
* Claude Code encodes paths by replacing every non-alphanumeric
|
|
70
|
-
* character with '-', so '/', '_', '.', spaces, etc. all collapse:
|
|
71
|
-
* /Users/foo/bar → -Users-foo-bar
|
|
72
|
-
* /Users/foo/my_project → -Users-foo-my-project
|
|
73
|
-
* /Users/foo/.worktrees/x → -Users-foo--worktrees-x
|
|
74
|
-
*
|
|
75
|
-
* The encoding is lossy — multiple real paths can collide on the
|
|
76
|
-
* same encoded dir. Callers that need to disambiguate must read the
|
|
77
|
-
* `cwd` field inside each session JSONL.
|
|
78
|
-
*/
|
|
79
|
-
private getProjectDir;
|
|
80
|
-
private mapSessionToAgent;
|
|
81
|
-
private mapProcessOnlyAgent;
|
|
82
|
-
getConversation(sessionFilePath: string, options?: {
|
|
83
|
-
verbose?: boolean;
|
|
84
|
-
}): ConversationMessage[];
|
|
85
|
-
listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
|
|
86
|
-
/**
|
|
87
|
-
* Discover candidate session files for {@link listSessions}.
|
|
88
|
-
*
|
|
89
|
-
* Always walks every subdirectory of `projectsDir`. We can't use the
|
|
90
|
-
* encoded-dir shortcut for the cwd-scoped path because Claude Code
|
|
91
|
-
* indexes session files by where the *process was launched*, not by
|
|
92
|
-
* the recorded `cwd` field inside the session — these diverge in
|
|
93
|
-
* worktrees and similar setups. The cwd filter is applied later
|
|
94
|
-
* against `session.lastCwd` so callers see exactly the sessions whose
|
|
95
|
-
* recorded cwd matches.
|
|
96
|
-
*/
|
|
97
|
-
private discoverSessionFiles;
|
|
98
114
|
}
|
|
99
|
-
//# sourceMappingURL=
|
|
115
|
+
//# sourceMappingURL=ClaudeSessionLocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeSessionLocator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAMH,KAAK,WAAW,EACnB,MAAM,wBAAwB,CAAC;AAyBhC;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,aAAa,EAAE,WAAW,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,GAAE,2BAAgC;IAMrD;;;;;;;;;OASG;IACH,qBAAqB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,2BAA2B;IAe5E;;;;;;;;;;OAUG;IACH,8BAA8B,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBjF;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;;OAMG;IACH,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IA6B7D;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA8CzB,OAAO,CAAC,sBAAsB;IAK9B;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;CAsC7B"}
|