@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.
Files changed (202) hide show
  1. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +1 -342
  2. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
  3. package/dist/__tests__/database/DurableAgentsDatabase.test.js +31 -3
  4. package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +1 -1
  5. package/dist/__tests__/durable/CodexCliProbe.test.js +129 -0
  6. package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -0
  7. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +84 -0
  8. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -0
  9. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +126 -0
  10. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -0
  11. package/dist/__tests__/durable/CodexPrintAgentService.test.js +271 -0
  12. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -0
  13. package/dist/__tests__/durable/CodexPrintRunner.test.js +393 -0
  14. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -0
  15. package/dist/__tests__/print/ClaudeCliProbe.test.js +3 -7
  16. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
  17. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +25 -28
  18. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
  19. package/dist/__tests__/print/ClaudePrintAgentService.test.js +65 -0
  20. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
  21. package/dist/__tests__/print/ClaudePrintRunner.test.js +4 -10
  22. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
  23. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +79 -0
  24. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -0
  25. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +436 -0
  26. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -0
  27. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +76 -0
  28. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -0
  29. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +43 -0
  30. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -0
  31. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +202 -0
  32. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -0
  33. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +119 -0
  34. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -0
  35. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +386 -0
  36. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -0
  37. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +34 -0
  38. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -0
  39. package/dist/__tests__/utils/ClaudeSessionParser.test.js +2 -2
  40. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
  41. package/dist/adapters/index.d.ts +1 -1
  42. package/dist/adapters/index.d.ts.map +1 -1
  43. package/dist/adapters/index.js +1 -1
  44. package/dist/adapters/index.js.map +1 -1
  45. package/dist/database/connection.d.ts.map +1 -1
  46. package/dist/database/connection.js +5 -1
  47. package/dist/database/connection.js.map +1 -1
  48. package/dist/database/migrations/004_codex_durable_sessions.sql +1 -0
  49. package/dist/durable/DurableAgent.d.ts +23 -3
  50. package/dist/durable/DurableAgent.d.ts.map +1 -1
  51. package/dist/durable/DurableAgent.js +12 -0
  52. package/dist/durable/DurableAgent.js.map +1 -1
  53. package/dist/durable/DurableAgentRepository.d.ts +6 -7
  54. package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
  55. package/dist/durable/DurableAgentRepository.js +73 -42
  56. package/dist/durable/DurableAgentRepository.js.map +1 -1
  57. package/dist/durable/process.d.ts +8 -0
  58. package/dist/durable/process.d.ts.map +1 -0
  59. package/dist/durable/process.js +40 -0
  60. package/dist/durable/process.js.map +1 -0
  61. package/dist/durable/run.d.ts +32 -0
  62. package/dist/durable/run.d.ts.map +1 -0
  63. package/dist/durable/run.js +46 -0
  64. package/dist/durable/run.js.map +1 -0
  65. package/dist/durable/utils.d.ts +19 -0
  66. package/dist/durable/utils.d.ts.map +1 -0
  67. package/dist/durable/utils.js +52 -0
  68. package/dist/durable/utils.js.map +1 -0
  69. package/dist/index.d.ts +17 -13
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +9 -8
  72. package/dist/index.js.map +1 -1
  73. package/dist/providers/claude/ClaudeAgentMapper.d.ts +21 -0
  74. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -0
  75. package/dist/providers/claude/ClaudeAgentMapper.js +42 -0
  76. package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -0
  77. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +29 -0
  78. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  79. package/dist/providers/claude/ClaudeCodeAdapter.js +129 -0
  80. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -0
  81. package/dist/{adapters/ClaudeCodeAdapter.d.ts → providers/claude/ClaudeSessionLocator.d.ts} +68 -52
  82. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -0
  83. package/dist/{adapters/ClaudeCodeAdapter.js → providers/claude/ClaudeSessionLocator.js} +71 -189
  84. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -0
  85. package/dist/{utils → providers/claude}/ClaudeSessionParser.d.ts +2 -2
  86. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -0
  87. package/dist/{utils → providers/claude}/ClaudeSessionParser.js +1 -1
  88. package/dist/providers/claude/ClaudeSessionParser.js.map +1 -0
  89. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -0
  90. package/dist/{durable → providers/claude/durable}/ClaudeCliProbe.js +4 -9
  91. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -0
  92. package/dist/{durable → providers/claude/durable}/ClaudePrintAgentService.d.ts +4 -9
  93. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -0
  94. package/dist/providers/claude/durable/ClaudePrintAgentService.js +45 -0
  95. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -0
  96. package/dist/{durable → providers/claude/durable}/ClaudePrintRunner.d.ts +3 -3
  97. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -0
  98. package/dist/providers/claude/durable/ClaudePrintRunner.js +75 -0
  99. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -0
  100. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +17 -0
  101. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -0
  102. package/dist/providers/claude/durable/ClaudeStreamParser.js +69 -0
  103. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -0
  104. package/dist/providers/codex/durable/CodexCliProbe.d.ts +20 -0
  105. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -0
  106. package/dist/providers/codex/durable/CodexCliProbe.js +61 -0
  107. package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -0
  108. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +40 -0
  109. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -0
  110. package/dist/providers/codex/durable/CodexPrintAgentService.js +50 -0
  111. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -0
  112. package/dist/providers/codex/durable/CodexPrintRunner.d.ts +34 -0
  113. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -0
  114. package/dist/providers/codex/durable/CodexPrintRunner.js +78 -0
  115. package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -0
  116. package/dist/providers/codex/durable/CodexStreamParser.d.ts +21 -0
  117. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -0
  118. package/dist/providers/codex/durable/CodexStreamParser.js +86 -0
  119. package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -0
  120. package/dist/providers/pi/durable/PiCliProbe.d.ts +20 -0
  121. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -0
  122. package/dist/providers/pi/durable/PiCliProbe.js +51 -0
  123. package/dist/providers/pi/durable/PiCliProbe.js.map +1 -0
  124. package/dist/providers/pi/durable/PiPrintAgentService.d.ts +39 -0
  125. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -0
  126. package/dist/providers/pi/durable/PiPrintAgentService.js +47 -0
  127. package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -0
  128. package/dist/providers/pi/durable/PiPrintProtocol.d.ts +4 -0
  129. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -0
  130. package/dist/providers/pi/durable/PiPrintProtocol.js +44 -0
  131. package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -0
  132. package/dist/providers/pi/durable/PiPrintRunner.d.ts +32 -0
  133. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -0
  134. package/dist/providers/pi/durable/PiPrintRunner.js +61 -0
  135. package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -0
  136. package/dist/providers/pi/durable/PiStreamParser.d.ts +21 -0
  137. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -0
  138. package/dist/providers/pi/durable/PiStreamParser.js +71 -0
  139. package/dist/providers/pi/durable/PiStreamParser.js.map +1 -0
  140. package/package.json +1 -1
  141. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1 -307
  142. package/src/__tests__/database/DurableAgentsDatabase.test.ts +28 -3
  143. package/src/__tests__/durable/CodexCliProbe.test.ts +63 -0
  144. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +54 -0
  145. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +79 -0
  146. package/src/__tests__/durable/CodexPrintAgentService.test.ts +139 -0
  147. package/src/__tests__/durable/CodexPrintRunner.test.ts +189 -0
  148. package/src/__tests__/fixtures/fake-codex.cjs +45 -0
  149. package/src/__tests__/print/ClaudeCliProbe.test.ts +3 -7
  150. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +11 -21
  151. package/src/__tests__/print/ClaudePrintAgentService.test.ts +33 -1
  152. package/src/__tests__/print/ClaudePrintRunner.test.ts +4 -10
  153. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +84 -0
  154. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +411 -0
  155. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +38 -0
  156. package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +32 -0
  157. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +69 -0
  158. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +33 -0
  159. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +107 -0
  160. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +24 -0
  161. package/src/__tests__/utils/ClaudeSessionParser.test.ts +2 -2
  162. package/src/adapters/index.ts +1 -1
  163. package/src/database/connection.ts +3 -1
  164. package/src/database/migrations/004_codex_durable_sessions.sql +1 -0
  165. package/src/durable/DurableAgent.ts +51 -3
  166. package/src/durable/DurableAgentRepository.ts +60 -31
  167. package/src/durable/process.ts +28 -0
  168. package/src/durable/run.ts +74 -0
  169. package/src/durable/utils.ts +61 -0
  170. package/src/index.ts +31 -15
  171. package/src/providers/claude/ClaudeAgentMapper.ts +62 -0
  172. package/src/providers/claude/ClaudeCodeAdapter.ts +160 -0
  173. package/src/{adapters/ClaudeCodeAdapter.ts → providers/claude/ClaudeSessionLocator.ts} +97 -239
  174. package/src/{utils → providers/claude}/ClaudeSessionParser.ts +2 -2
  175. package/src/{durable → providers/claude/durable}/ClaudeCliProbe.ts +4 -10
  176. package/src/providers/claude/durable/ClaudePrintAgentService.ts +66 -0
  177. package/src/providers/claude/durable/ClaudePrintRunner.ts +92 -0
  178. package/src/providers/claude/durable/ClaudeStreamParser.ts +79 -0
  179. package/src/providers/codex/durable/CodexCliProbe.ts +60 -0
  180. package/src/providers/codex/durable/CodexPrintAgentService.ts +65 -0
  181. package/src/providers/codex/durable/CodexPrintRunner.ts +94 -0
  182. package/src/providers/codex/durable/CodexStreamParser.ts +104 -0
  183. package/src/providers/pi/durable/PiCliProbe.ts +48 -0
  184. package/src/providers/pi/durable/PiPrintAgentService.ts +69 -0
  185. package/src/providers/pi/durable/PiPrintProtocol.ts +39 -0
  186. package/src/providers/pi/durable/PiPrintRunner.ts +88 -0
  187. package/src/providers/pi/durable/PiStreamParser.ts +84 -0
  188. package/dist/adapters/ClaudeCodeAdapter.d.ts.map +0 -1
  189. package/dist/adapters/ClaudeCodeAdapter.js.map +0 -1
  190. package/dist/durable/ClaudeCliProbe.d.ts.map +0 -1
  191. package/dist/durable/ClaudeCliProbe.js.map +0 -1
  192. package/dist/durable/ClaudePrintAgentService.d.ts.map +0 -1
  193. package/dist/durable/ClaudePrintAgentService.js +0 -66
  194. package/dist/durable/ClaudePrintAgentService.js.map +0 -1
  195. package/dist/durable/ClaudePrintRunner.d.ts.map +0 -1
  196. package/dist/durable/ClaudePrintRunner.js +0 -128
  197. package/dist/durable/ClaudePrintRunner.js.map +0 -1
  198. package/dist/utils/ClaudeSessionParser.d.ts.map +0 -1
  199. package/dist/utils/ClaudeSessionParser.js.map +0 -1
  200. package/src/durable/ClaudePrintAgentService.ts +0 -94
  201. package/src/durable/ClaudePrintRunner.ts +0 -139
  202. /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 './adapters/ClaudeCodeAdapter.js';
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 { ClaudeCliProbe } from './durable/ClaudeCliProbe.js';
33
- export type { ClaudeCliProbeOptions } from './durable/ClaudeCliProbe.js';
34
- export { ClaudePrintRunner } from './durable/ClaudePrintRunner.js';
35
- export type { ClaudePrintRunnerOptions, ClaudePrintRunRequest, ClaudePrintRunResult, } from './durable/ClaudePrintRunner.js';
36
- export { ClaudePrintAgentService } from './durable/ClaudePrintAgentService.js';
37
- export type { ClaudePrintAgentServiceOptions, ClaudePrintSendResult, } from './durable/ClaudePrintAgentService.js';
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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 './adapters/ClaudeCodeAdapter.js';
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 { LocalProcessInspector } from './durable/DurableAgentRepository.js';
22
- export { ClaudeCliProbe } from './durable/ClaudeCliProbe.js';
23
- export { ClaudePrintRunner } from './durable/ClaudePrintRunner.js';
24
- export { ClaudePrintAgentService } from './durable/ClaudePrintAgentService.js';
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 './adapters/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 { getProcessTty } from './utils/process.js';\nexport { captureProcessSnapshot, executableBasename, filterByProcessNames } from './utils/process.js';\nexport type { AgentSortKey } from './utils/sortAgents.js';\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} from './durable/DurableAgent.js';\nexport type {\n DurableAgent,\n DurableAgentState,\n DurableSessionHealth,\n DurableRunStatus,\n DurableActiveRun,\n DurableLastResult,\n ProcessIdentity,\n} from './durable/DurableAgent.js';\nexport { DurableAgentRepository } from './durable/DurableAgentRepository.js';\nexport { LocalProcessInspector } from './durable/DurableAgentRepository.js';\nexport type {\n CreateDurableAgentInput,\n DurableAgentRepositoryOptions,\n ProcessInspector,\n DurableRunCompletion,\n} from './durable/DurableAgentRepository.js';\nexport { ClaudeCliProbe } from './durable/ClaudeCliProbe.js';\nexport type { ClaudeCliProbeOptions } from './durable/ClaudeCliProbe.js';\nexport { ClaudePrintRunner } from './durable/ClaudePrintRunner.js';\nexport type {\n ClaudePrintRunnerOptions,\n ClaudePrintRunRequest,\n ClaudePrintRunResult,\n} from './durable/ClaudePrintRunner.js';\nexport { ClaudePrintAgentService } from './durable/ClaudePrintAgentService.js';\nexport type {\n ClaudePrintAgentServiceOptions,\n ClaudePrintSendResult,\n} from './durable/ClaudePrintAgentService.js';\n"],"names":["AgentManager","AgentNotRunningError","getCodexCapacityReport","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus","TerminalFocusManager","TerminalType","TtyWriter","getProcessTty","captureProcessSnapshot","executableBasename","filterByProcessNames","AgentRegistry","RenameNotFoundError","RenameConflictError","TmuxManager","AGENTS","getAgentRequestPath","readLatestAgentRequest","writeAgentRequest","AGENT_MODES","DurableAgentError","DurableAgentBusyError","DurableAgentNotFoundError","DurableAgentRepositoryError","DurableAgentNameConflictError","ClaudePrintError","DurableAgentRepository","LocalProcessInspector","ClaudeCliProbe","ClaudePrintRunner","ClaudePrintAgentService"],"mappings":"AAAA,SAASA,YAAY,EAAEC,oBAAoB,QAAQ,oBAAoB;AACvE,SAASC,sBAAsB,QAAQ,sBAAsB;AAO7D,SAASC,iBAAiB,QAAQ,kCAAkC;AACpE,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;AAEpD,SAASC,aAAa,QAAQ,qBAAqB;AACnD,SAASC,sBAAsB,EAAEC,kBAAkB,EAAEC,oBAAoB,QAAQ,qBAAqB;AAItG,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,QACb,4BAA4B;AAUnC,SAASC,sBAAsB,QAAQ,sCAAsC;AAC7E,SAASC,qBAAqB,QAAQ,sCAAsC;AAO5E,SAASC,cAAc,QAAQ,8BAA8B;AAE7D,SAASC,iBAAiB,QAAQ,iCAAiC;AAMnE,SAASC,uBAAuB,QAAQ,uCAAuC"}
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":"AAAA,YAAYA,UAAU,OAAO;AAU7B,SAASC,sBAAsB,EAAEC,kBAAkB,EAAEC,oBAAoB,QAAQ,yBAAyB;AAC1G,SAASC,QAAQ,QAAQ,yBAAyB;AAClD,SAASC,mBAAmB,QAAQ,2BAA2B;AAC/D,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SAASC,oBAAoB,QAAQ,4BAA4B;AAEjE;;;;;;;;;CASC,GACD,OAAO,MAAMC;IACAC,OAAO,SAAkB;IACzBC,eAAe;QAAC;KAAS,CAAU;IAEpCC,OAA4B;IAC5BC,OAA0B;IAC1BC,YAAoB;IACpBC,YAAoB;IAE5B,aAAc;QACV,MAAMC,UAAUC,QAAQC,GAAG,CAACC,IAAI,IAAIF,QAAQC,GAAG,CAACE,WAAW,IAAI;QAC/D,IAAI,CAACN,WAAW,GAAGb,KAAKoB,IAAI,CAACL,SAAS,WAAW;QACjD,IAAI,CAACD,WAAW,GAAGd,KAAKoB,IAAI,CAACL,SAAS,WAAW;QACjD,IAAI,CAACJ,MAAM,GAAG,IAAIN;QAClB,IAAI,CAACO,MAAM,GAAG,IAAIN,kBAAkB,IAAI,CAACK,MAAM;IACnD;IAEAU,UAAUC,WAAwB,EAAW;QACzC,OAAO,IAAI,CAACC,kBAAkB,CAACD,YAAYE,OAAO;IACtD;IAEQD,mBAAmBC,OAAe,EAAW;QACjD,MAAMC,OAAOvB,mBAAmBsB;QAChC,OAAOC,SAAS,YAAYA,SAAS;IACzC;IAEA,MAAMC,aAAaC,OAA+B,EAAwB;QACtE,MAAMC,WAAWD,SAASE,aAAa,MAAM5B,uBAAuB,IAAI,CAACS,YAAY;QACrF,MAAMoB,WAAW3B,qBAAqByB,UAAU,IAAI,CAAClB,YAAY;QACjE,MAAMmB,YAAYC,SAASC,MAAM,CAAC,CAACf,WAAY,IAAI,CAACK,SAAS,CAACL;QAC9D,IAAIa,UAAUG,MAAM,KAAK,GAAG;YACxB,OAAO,EAAE;QACb;QAEA,MAAM,EAAEC,MAAM,EAAEC,aAAa,EAAE,GAAG,IAAI,CAACC,aAAa,GAAGC,qBAAqB,CAACP;QAE7E,MAAMQ,cAAc,IAAIC,IAAI;eACrBL,OAAOM,GAAG,CAAC,CAACC,IAAMA,EAAExB,OAAO,CAACyB,GAAG;eAC/BP,cAAcK,GAAG,CAAC,CAACG,IAAMA,EAAE1B,OAAO,CAACyB,GAAG;SAC5C;QAED,MAAME,SAAsB,EAAE;QAE9B,uDAAuD;QACvD,KAAK,MAAMC,SAASX,OAAQ;YACxB,MAAM,EAAEjB,SAAS6B,IAAI,EAAEC,WAAW,EAAE,GAAGF;YACvC,MAAMG,cAAc,IAAI,CAACpC,MAAM,CAACqC,WAAW,CAACF,YAAYG,QAAQ,EAAEH,YAAYI,WAAW;YACzF,IAAIH,aAAa;gBACbJ,OAAOQ,IAAI,CAAC,IAAI,CAACvC,MAAM,CAACwC,iBAAiB,CAAC;oBACtCC,SAASN;oBACTzB,aAAauB;oBACbC;oBACAQ,UAAU;wBACNC,WAAWX,MAAMW,SAAS;wBAC1BC,YAAYZ,MAAMY,UAAU;oBAChC;gBACJ;YACJ,OAAO;gBACHnB,YAAYoB,MAAM,CAACZ,KAAKJ,GAAG;YAC/B;QACJ;QAEA,mCAAmC;QACnC,KAAK,MAAMG,SAASV,cAAe;YAC/B,MAAMa,cAAc,IAAI,CAACpC,MAAM,CAACqC,WAAW,CACvCJ,MAAMS,OAAO,CAACJ,QAAQ,EACtBL,MAAMS,OAAO,CAACH,WAAW;YAE7B,IAAIH,aAAa;gBACbJ,OAAOQ,IAAI,CAAC,IAAI,CAACvC,MAAM,CAACwC,iBAAiB,CAAC;oBACtCC,SAASN;oBACTzB,aAAasB,MAAM5B,OAAO;oBAC1B8B,aAAaF,MAAMS,OAAO;gBAC9B;YACJ,OAAO;gBACHhB,YAAYoB,MAAM,CAACb,MAAM5B,OAAO,CAACyB,GAAG;YACxC;QACJ;QAEA,+DAA+D;QAC/D,KAAK,MAAMI,QAAQhB,UAAW;YAC1B,IAAI,CAACQ,YAAYqB,GAAG,CAACb,KAAKJ,GAAG,GAAG;gBAC5BE,OAAOQ,IAAI,CAAC,IAAI,CAACvC,MAAM,CAAC+C,mBAAmB,CAACd;YAChD;QACJ;QAEA,OAAOF;IACX;IAEQR,gBAAsC;QAC1C,OAAO,IAAI5B,qBAAqB;YAC5BM,aAAa,IAAI,CAACA,WAAW;YAC7BC,aAAa,IAAI,CAACA,WAAW;QACjC;IACJ;IAEA8C,gBAAgBC,eAAuB,EAAEC,OAA+B,EAAyB;QAC7F,OAAO,IAAI,CAACnD,MAAM,CAACiD,eAAe,CAACC,iBAAiBC;IACxD;IAEA,MAAMC,aAAaC,IAA0B,EAA6B;QACtE,MAAMC,YAAYD,MAAME;QACxB,MAAMC,aAAa,IAAI,CAAChC,aAAa,GAAGiC,8BAA8B;QACtE,MAAMC,YAA8B,EAAE;QAEtC,KAAK,MAAM,EAAEpB,QAAQ,EAAEqB,UAAU,EAAE,IAAIH,WAAY;YAC/C,MAAMd,UAAU,IAAI,CAAC1C,MAAM,CAACqC,WAAW,CAACC,UAAUqB;YAClD,IAAI,CAACjB,SAAS;YAEd,mEAAmE;YACnE,oEAAoE;YACpE,mEAAmE;YACnE,qCAAqC;YACrC,IAAI,CAACA,QAAQkB,aAAa,EAAE;YAE5B,MAAMC,cAAcnB,QAAQoB,OAAO,IAAIH;YACvC,IAAIL,cAAcS,aAAaF,gBAAgBP,WAAW;YAE1D,MAAMU,OAAOvE,SAAS6C;YAEtBoB,UAAUlB,IAAI,CAAC;gBACX1C,MAAM;gBACNmE,WAAWvB,QAAQuB,SAAS;gBAC5BV,KAAKM;gBACLK,kBAAkBxB,QAAQwB,gBAAgB,IAAI;gBAC9CC,YAAYzB,QAAQyB,UAAU,IAAIH,MAAMI,SAAS,IAAIC;gBACrDC,WAAW5B,QAAQ6B,YAAY,IAAIP,MAAMQ,aAAaR,MAAMI,SAAS,IAAIC;gBACzEnB,iBAAiBZ;YACrB;QACJ;QAEA,OAAOoB;IACX;AACJ"}