@ai-devkit/agent-manager 0.29.0 → 0.31.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/connection.d.ts.map +1 -1
- package/dist/database/connection.js +5 -1
- package/dist/database/connection.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/connection.ts +3 -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,46 @@
|
|
|
1
|
+
import { DurableAgentNotFoundError } from './DurableAgent.js';
|
|
2
|
+
import { sanitizeText } from './utils.js';
|
|
3
|
+
const MAX_RESULT_SUMMARY_LENGTH = 4096;
|
|
4
|
+
export async function runDurableAgent(options) {
|
|
5
|
+
const resolved = await options.repository.resolve(options.reference);
|
|
6
|
+
if (!resolved) throw new DurableAgentNotFoundError(options.reference);
|
|
7
|
+
if (Array.isArray(resolved)) throw options.ambiguousError();
|
|
8
|
+
if (resolved.provider !== options.provider) throw options.providerError();
|
|
9
|
+
const target = resolved;
|
|
10
|
+
const acquired = await options.repository.acquireRun(target.id);
|
|
11
|
+
let result;
|
|
12
|
+
try {
|
|
13
|
+
result = await options.execute(acquired.agent, acquired.token);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
await options.repository.completeRun(target.id, acquired.token, createFailedCompletion(error, options.isSessionMismatch(error)));
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
await options.repository.completeRun(target.id, acquired.token, createSucceededCompletion(result));
|
|
19
|
+
return {
|
|
20
|
+
agent: target,
|
|
21
|
+
result
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function createSucceededCompletion(result) {
|
|
25
|
+
return {
|
|
26
|
+
status: 'succeeded',
|
|
27
|
+
exitCode: result.exitCode,
|
|
28
|
+
summary: sanitizeText(result.result, MAX_RESULT_SUMMARY_LENGTH, {
|
|
29
|
+
preserveFormatting: true
|
|
30
|
+
}),
|
|
31
|
+
sessionHealth: 'healthy'
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function createFailedCompletion(error, sessionMismatch) {
|
|
35
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
36
|
+
return {
|
|
37
|
+
status: 'failed',
|
|
38
|
+
exitCode: null,
|
|
39
|
+
summary: sanitizeText(message, MAX_RESULT_SUMMARY_LENGTH, {
|
|
40
|
+
preserveFormatting: true
|
|
41
|
+
}),
|
|
42
|
+
sessionHealth: sessionMismatch ? 'mismatch' : 'unknown'
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/durable/run.ts"],"sourcesContent":["import type { DurableAgent, DurableProvider } from './DurableAgent.js';\nimport { DurableAgentNotFoundError } from './DurableAgent.js';\nimport type { DurableRunCompletion } from './DurableAgentRepository.js';\nimport { sanitizeText } from './utils.js';\n\nconst MAX_RESULT_SUMMARY_LENGTH = 4096;\n\nexport interface DurableRunRepository {\n resolve(reference: string): Promise<DurableAgent | DurableAgent[] | null>;\n acquireRun(id: string): Promise<{ agent: DurableAgent; token: string }>;\n completeRun(id: string, token: string, result: DurableRunCompletion): Promise<DurableAgent>;\n}\n\ntype ProviderAgent<Provider extends DurableProvider> = Extract<DurableAgent, { provider: Provider }>;\n\ninterface DurableRunResult {\n result: string;\n exitCode: number;\n}\n\ninterface DurableRunOptions<Provider extends DurableProvider, Result extends DurableRunResult> {\n reference: string;\n provider: Provider;\n repository: DurableRunRepository;\n ambiguousError(): Error;\n providerError(): Error;\n execute(agent: ProviderAgent<Provider>, token: string): Promise<Result>;\n isSessionMismatch(error: unknown): boolean;\n}\n\nexport async function runDurableAgent<Provider extends DurableProvider, Result extends DurableRunResult>(\n options: DurableRunOptions<Provider, Result>,\n): Promise<{ agent: ProviderAgent<Provider>; result: Result }> {\n const resolved = await options.repository.resolve(options.reference);\n if (!resolved) throw new DurableAgentNotFoundError(options.reference);\n if (Array.isArray(resolved)) throw options.ambiguousError();\n if (resolved.provider !== options.provider) throw options.providerError();\n\n const target = resolved as ProviderAgent<Provider>;\n const acquired = await options.repository.acquireRun(target.id);\n let result: Result;\n try {\n result = await options.execute(acquired.agent as ProviderAgent<Provider>, acquired.token);\n } catch (error) {\n await options.repository.completeRun(\n target.id,\n acquired.token,\n createFailedCompletion(error, options.isSessionMismatch(error)),\n );\n throw error;\n }\n\n await options.repository.completeRun(target.id, acquired.token, createSucceededCompletion(result));\n return { agent: target, result };\n}\n\nfunction createSucceededCompletion(result: DurableRunResult): DurableRunCompletion {\n return {\n status: 'succeeded',\n exitCode: result.exitCode,\n summary: sanitizeText(result.result, MAX_RESULT_SUMMARY_LENGTH, { preserveFormatting: true }),\n sessionHealth: 'healthy',\n };\n}\n\nfunction createFailedCompletion(error: unknown, sessionMismatch: boolean): DurableRunCompletion {\n const message = error instanceof Error ? error.message : String(error);\n return {\n status: 'failed',\n exitCode: null,\n summary: sanitizeText(message, MAX_RESULT_SUMMARY_LENGTH, { preserveFormatting: true }),\n sessionHealth: sessionMismatch ? 'mismatch' : 'unknown',\n };\n}\n"],"names":["DurableAgentNotFoundError","sanitizeText","MAX_RESULT_SUMMARY_LENGTH","runDurableAgent","options","resolved","repository","resolve","reference","Array","isArray","ambiguousError","provider","providerError","target","acquired","acquireRun","id","result","execute","agent","token","error","completeRun","createFailedCompletion","isSessionMismatch","createSucceededCompletion","status","exitCode","summary","preserveFormatting","sessionHealth","sessionMismatch","message","Error","String"],"mappings":"AACA,SAASA,yBAAyB,QAAQ,oBAAoB;AAE9D,SAASC,YAAY,QAAQ,aAAa;AAE1C,MAAMC,4BAA4B;AAyBlC,OAAO,eAAeC,gBAClBC,OAA4C;IAE5C,MAAMC,WAAW,MAAMD,QAAQE,UAAU,CAACC,OAAO,CAACH,QAAQI,SAAS;IACnE,IAAI,CAACH,UAAU,MAAM,IAAIL,0BAA0BI,QAAQI,SAAS;IACpE,IAAIC,MAAMC,OAAO,CAACL,WAAW,MAAMD,QAAQO,cAAc;IACzD,IAAIN,SAASO,QAAQ,KAAKR,QAAQQ,QAAQ,EAAE,MAAMR,QAAQS,aAAa;IAEvE,MAAMC,SAAST;IACf,MAAMU,WAAW,MAAMX,QAAQE,UAAU,CAACU,UAAU,CAACF,OAAOG,EAAE;IAC9D,IAAIC;IACJ,IAAI;QACAA,SAAS,MAAMd,QAAQe,OAAO,CAACJ,SAASK,KAAK,EAA6BL,SAASM,KAAK;IAC5F,EAAE,OAAOC,OAAO;QACZ,MAAMlB,QAAQE,UAAU,CAACiB,WAAW,CAChCT,OAAOG,EAAE,EACTF,SAASM,KAAK,EACdG,uBAAuBF,OAAOlB,QAAQqB,iBAAiB,CAACH;QAE5D,MAAMA;IACV;IAEA,MAAMlB,QAAQE,UAAU,CAACiB,WAAW,CAACT,OAAOG,EAAE,EAAEF,SAASM,KAAK,EAAEK,0BAA0BR;IAC1F,OAAO;QAAEE,OAAON;QAAQI;IAAO;AACnC;AAEA,SAASQ,0BAA0BR,MAAwB;IACvD,OAAO;QACHS,QAAQ;QACRC,UAAUV,OAAOU,QAAQ;QACzBC,SAAS5B,aAAaiB,OAAOA,MAAM,EAAEhB,2BAA2B;YAAE4B,oBAAoB;QAAK;QAC3FC,eAAe;IACnB;AACJ;AAEA,SAASP,uBAAuBF,KAAc,EAAEU,eAAwB;IACpE,MAAMC,UAAUX,iBAAiBY,QAAQZ,MAAMW,OAAO,GAAGE,OAAOb;IAChE,OAAO;QACHK,QAAQ;QACRC,UAAU;QACVC,SAAS5B,aAAagC,SAAS/B,2BAA2B;YAAE4B,oBAAoB;QAAK;QACrFC,eAAeC,kBAAkB,aAAa;IAClD;AACJ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ChildProcessWithoutNullStreams } from 'child_process';
|
|
2
|
+
export interface ChildCloseResult {
|
|
3
|
+
code: number | null;
|
|
4
|
+
signal: NodeJS.Signals | null;
|
|
5
|
+
}
|
|
6
|
+
export declare function waitForChildClose(child: ChildProcessWithoutNullStreams): Promise<ChildCloseResult>;
|
|
7
|
+
export declare function sanitizeText(value: string, max: number, options?: {
|
|
8
|
+
preserveFormatting?: boolean;
|
|
9
|
+
}): string;
|
|
10
|
+
export declare function isUuid(value: string): boolean;
|
|
11
|
+
export declare class LineBuffer {
|
|
12
|
+
private readonly maxLineBytes;
|
|
13
|
+
private readonly createOversizedLineError;
|
|
14
|
+
private buffer;
|
|
15
|
+
constructor(maxLineBytes: number, createOversizedLineError: () => Error);
|
|
16
|
+
accept(chunk: Buffer | string): Buffer[];
|
|
17
|
+
assertComplete(createIncompleteLineError: () => Error): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/durable/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAKlG;AAED,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,MAAM,CAMR;AAID,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED,qBAAa,UAAU;IAIf,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,wBAAwB;IAJ7C,OAAO,CAAC,MAAM,CAAmB;gBAGZ,YAAY,EAAE,MAAM,EACpB,wBAAwB,EAAE,MAAM,KAAK;IAG1D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE;IAiBxC,cAAc,CAAC,yBAAyB,EAAE,MAAM,KAAK,GAAG,IAAI;CAG/D"}
|
|
@@ -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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"}
|