@coralai/sps-cli 0.63.6 → 0.65.1

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 (458) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README-CN.md +2 -0
  3. package/README.md +2 -0
  4. package/dist/commands/agentCommand.d.ts.map +1 -1
  5. package/dist/commands/agentCommand.js +4 -3
  6. package/dist/commands/agentCommand.js.map +1 -1
  7. package/dist/commands/agentRenderer.js +3 -3
  8. package/dist/commands/agentRenderer.js.map +1 -1
  9. package/dist/commands/cardDashboard.d.ts.map +1 -1
  10. package/dist/commands/cardDashboard.js +2 -2
  11. package/dist/commands/cardDashboard.js.map +1 -1
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/doctor.js +0 -3
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/logs.d.ts.map +1 -1
  16. package/dist/commands/logs.js +15 -15
  17. package/dist/commands/logs.js.map +1 -1
  18. package/dist/commands/openaiAgent.d.ts +3 -0
  19. package/dist/commands/openaiAgent.d.ts.map +1 -0
  20. package/dist/commands/openaiAgent.js +81 -0
  21. package/dist/commands/openaiAgent.js.map +1 -0
  22. package/dist/commands/pipelineRunner.js.map +1 -1
  23. package/dist/commands/pipelineTick.js +1 -1
  24. package/dist/commands/pipelineTick.js.map +1 -1
  25. package/dist/commands/projectInit.d.ts +11 -1
  26. package/dist/commands/projectInit.d.ts.map +1 -1
  27. package/dist/commands/projectInit.js +38 -7
  28. package/dist/commands/projectInit.js.map +1 -1
  29. package/dist/commands/prune.d.ts +6 -0
  30. package/dist/commands/prune.d.ts.map +1 -0
  31. package/dist/commands/prune.js +87 -0
  32. package/dist/commands/prune.js.map +1 -0
  33. package/dist/commands/qaTick.js +1 -1
  34. package/dist/commands/qaTick.js.map +1 -1
  35. package/dist/commands/reset.d.ts.map +1 -1
  36. package/dist/commands/reset.js +3 -2
  37. package/dist/commands/reset.js.map +1 -1
  38. package/dist/commands/setup.d.ts.map +1 -1
  39. package/dist/commands/setup.js +8 -1
  40. package/dist/commands/setup.js.map +1 -1
  41. package/dist/commands/skillCommand.d.ts.map +1 -1
  42. package/dist/commands/skillCommand.js +2 -3
  43. package/dist/commands/skillCommand.js.map +1 -1
  44. package/dist/commands/status.js +2 -2
  45. package/dist/commands/status.js.map +1 -1
  46. package/dist/commands/stop.js +3 -3
  47. package/dist/commands/stop.js.map +1 -1
  48. package/dist/commands/tick.d.ts.map +1 -1
  49. package/dist/commands/tick.js +5 -2
  50. package/dist/commands/tick.js.map +1 -1
  51. package/dist/commands/workerDashboard.d.ts.map +1 -1
  52. package/dist/commands/workerDashboard.js +27 -26
  53. package/dist/commands/workerDashboard.js.map +1 -1
  54. package/dist/commands/workerLaunch.js +1 -1
  55. package/dist/commands/workerLaunch.js.map +1 -1
  56. package/dist/console/routes/chat.d.ts +18 -1
  57. package/dist/console/routes/chat.d.ts.map +1 -1
  58. package/dist/console/routes/chat.js +529 -40
  59. package/dist/console/routes/chat.js.map +1 -1
  60. package/dist/console/routes/fs.d.ts.map +1 -1
  61. package/dist/console/routes/fs.js +2 -1
  62. package/dist/console/routes/fs.js.map +1 -1
  63. package/dist/console/routes/logs.d.ts.map +1 -1
  64. package/dist/console/routes/logs.js +17 -5
  65. package/dist/console/routes/logs.js.map +1 -1
  66. package/dist/console/routes/projects.d.ts.map +1 -1
  67. package/dist/console/routes/projects.js +25 -2
  68. package/dist/console/routes/projects.js.map +1 -1
  69. package/dist/console/routes/workers.js +3 -3
  70. package/dist/console/routes/workers.js.map +1 -1
  71. package/dist/console-assets/assets/{ShowcasePage-BWHyDQhw.js → ShowcasePage-DFRO5bAO.js} +1 -1
  72. package/dist/console-assets/assets/{index-rQ_2k-G9.css → index-DZ28qAcd.css} +1 -1
  73. package/dist/console-assets/assets/{index-DH_TQHY4.js → index-De5GjRjY.js} +220 -215
  74. package/dist/console-assets/index.html +2 -2
  75. package/dist/core/agents/AgentBackend.d.ts +2 -2
  76. package/dist/core/agents/AgentBackend.d.ts.map +1 -1
  77. package/dist/core/agents/AgentBackend.js.map +1 -1
  78. package/dist/core/agents/DaemonBackend.d.ts +12 -2
  79. package/dist/core/agents/DaemonBackend.d.ts.map +1 -1
  80. package/dist/core/agents/DaemonBackend.js +59 -12
  81. package/dist/core/agents/DaemonBackend.js.map +1 -1
  82. package/dist/core/agents/resolveBackend.d.ts +4 -1
  83. package/dist/core/agents/resolveBackend.d.ts.map +1 -1
  84. package/dist/core/agents/resolveBackend.js +31 -1
  85. package/dist/core/agents/resolveBackend.js.map +1 -1
  86. package/dist/core/auditLog.d.ts +1 -1
  87. package/dist/core/auditLog.d.ts.map +1 -1
  88. package/dist/core/config.d.ts +5 -8
  89. package/dist/core/config.d.ts.map +1 -1
  90. package/dist/core/config.js +3 -9
  91. package/dist/core/config.js.map +1 -1
  92. package/dist/core/intel/agentsConfig.d.ts +9 -0
  93. package/dist/core/intel/agentsConfig.d.ts.map +1 -1
  94. package/dist/core/intel/agentsConfig.js +42 -0
  95. package/dist/core/intel/agentsConfig.js.map +1 -1
  96. package/dist/core/intel/types.d.ts +1 -0
  97. package/dist/core/intel/types.d.ts.map +1 -1
  98. package/dist/core/markerFile.d.ts.map +1 -1
  99. package/dist/core/markerFile.js +2 -2
  100. package/dist/core/markerFile.js.map +1 -1
  101. package/dist/core/openaiWorkerLog.d.ts +7 -0
  102. package/dist/core/openaiWorkerLog.d.ts.map +1 -0
  103. package/dist/core/openaiWorkerLog.js +98 -0
  104. package/dist/core/openaiWorkerLog.js.map +1 -0
  105. package/dist/core/paths.d.ts +1 -1
  106. package/dist/core/paths.d.ts.map +1 -1
  107. package/dist/core/paths.js +9 -7
  108. package/dist/core/paths.js.map +1 -1
  109. package/dist/core/pipelineConfig.js +7 -7
  110. package/dist/core/pipelineConfig.js.map +1 -1
  111. package/dist/core/pipelineSession.d.ts +3 -1
  112. package/dist/core/pipelineSession.d.ts.map +1 -1
  113. package/dist/core/pipelineSession.js +8 -2
  114. package/dist/core/pipelineSession.js.map +1 -1
  115. package/dist/core/processInspect.d.ts +5 -0
  116. package/dist/core/processInspect.d.ts.map +1 -1
  117. package/dist/core/processInspect.js +41 -11
  118. package/dist/core/processInspect.js.map +1 -1
  119. package/dist/core/projectPipelineAdapter.d.ts.map +1 -1
  120. package/dist/core/projectPipelineAdapter.js +4 -4
  121. package/dist/core/projectPipelineAdapter.js.map +1 -1
  122. package/dist/core/runtimeSnapshot.d.ts +2 -2
  123. package/dist/core/runtimeSnapshot.d.ts.map +1 -1
  124. package/dist/core/runtimeSnapshot.js +2 -2
  125. package/dist/core/runtimeSnapshot.js.map +1 -1
  126. package/dist/core/runtimeStore.d.ts +12 -12
  127. package/dist/core/runtimeStore.d.ts.map +1 -1
  128. package/dist/core/runtimeStore.js +16 -16
  129. package/dist/core/runtimeStore.js.map +1 -1
  130. package/dist/core/runtimeTypes.d.ts +109 -24
  131. package/dist/core/runtimeTypes.d.ts.map +1 -1
  132. package/dist/core/runtimeTypes.js +1 -1
  133. package/dist/core/sessionCleanup.d.ts +1 -1
  134. package/dist/core/sessionCleanup.d.ts.map +1 -1
  135. package/dist/core/sessionCleanup.js +2 -2
  136. package/dist/core/sessionCleanup.js.map +1 -1
  137. package/dist/core/sessionContext.d.ts +2 -2
  138. package/dist/core/sessionContext.d.ts.map +1 -1
  139. package/dist/core/sessionContext.js +1 -1
  140. package/dist/core/sessionContext.js.map +1 -1
  141. package/dist/core/sessionLiveness.d.ts +7 -6
  142. package/dist/core/sessionLiveness.d.ts.map +1 -1
  143. package/dist/core/sessionLiveness.js +3 -4
  144. package/dist/core/sessionLiveness.js.map +1 -1
  145. package/dist/core/state.d.ts +13 -12
  146. package/dist/core/state.d.ts.map +1 -1
  147. package/dist/core/state.js +9 -1
  148. package/dist/core/state.js.map +1 -1
  149. package/dist/core/workerRuntimeSummary.js +2 -2
  150. package/dist/core/workerRuntimeSummary.js.map +1 -1
  151. package/dist/core/workspacePaths.d.ts +22 -0
  152. package/dist/core/workspacePaths.d.ts.map +1 -0
  153. package/dist/core/workspacePaths.js +73 -0
  154. package/dist/core/workspacePaths.js.map +1 -0
  155. package/dist/daemon/daemonClient.d.ts +19 -22
  156. package/dist/daemon/daemonClient.d.ts.map +1 -1
  157. package/dist/daemon/daemonClient.js +82 -2
  158. package/dist/daemon/daemonClient.js.map +1 -1
  159. package/dist/daemon/sessionDaemon.d.ts +52 -7
  160. package/dist/daemon/sessionDaemon.d.ts.map +1 -1
  161. package/dist/daemon/sessionDaemon.js +40 -24
  162. package/dist/daemon/sessionDaemon.js.map +1 -1
  163. package/dist/engines/EventHandler.js +1 -1
  164. package/dist/engines/EventHandler.js.map +1 -1
  165. package/dist/engines/MonitorEngine.d.ts +2 -2
  166. package/dist/engines/MonitorEngine.d.ts.map +1 -1
  167. package/dist/engines/MonitorEngine.js +15 -17
  168. package/dist/engines/MonitorEngine.js.map +1 -1
  169. package/dist/engines/StageEngine.d.ts +5 -3
  170. package/dist/engines/StageEngine.d.ts.map +1 -1
  171. package/dist/engines/StageEngine.js +33 -18
  172. package/dist/engines/StageEngine.js.map +1 -1
  173. package/dist/main.js +41 -2
  174. package/dist/main.js.map +1 -1
  175. package/dist/manager/makeBackendFactory.d.ts +11 -4
  176. package/dist/manager/makeBackendFactory.d.ts.map +1 -1
  177. package/dist/manager/makeBackendFactory.js +28 -15
  178. package/dist/manager/makeBackendFactory.js.map +1 -1
  179. package/dist/manager/runtime-coordinator.js.map +1 -1
  180. package/dist/manager/supervisor.d.ts +7 -7
  181. package/dist/manager/supervisor.d.ts.map +1 -1
  182. package/dist/manager/supervisor.js +7 -7
  183. package/dist/manager/supervisor.js.map +1 -1
  184. package/dist/manager/worker-manager-impl.d.ts +4 -4
  185. package/dist/manager/worker-manager-impl.d.ts.map +1 -1
  186. package/dist/manager/worker-manager-impl.js +56 -24
  187. package/dist/manager/worker-manager-impl.js.map +1 -1
  188. package/dist/manager/worker-manager.d.ts +6 -6
  189. package/dist/manager/worker-manager.d.ts.map +1 -1
  190. package/dist/openai-agent/agentFactory.d.ts +10 -0
  191. package/dist/openai-agent/agentFactory.d.ts.map +1 -0
  192. package/dist/openai-agent/agentFactory.js +26 -0
  193. package/dist/openai-agent/agentFactory.js.map +1 -0
  194. package/dist/openai-agent/eventMap.d.ts +11 -0
  195. package/dist/openai-agent/eventMap.d.ts.map +1 -0
  196. package/dist/openai-agent/eventMap.js +191 -0
  197. package/dist/openai-agent/eventMap.js.map +1 -0
  198. package/dist/openai-agent/hooks.d.ts +13 -0
  199. package/dist/openai-agent/hooks.d.ts.map +1 -0
  200. package/dist/openai-agent/hooks.js +63 -0
  201. package/dist/openai-agent/hooks.js.map +1 -0
  202. package/dist/openai-agent/instructions.d.ts +3 -0
  203. package/dist/openai-agent/instructions.d.ts.map +1 -0
  204. package/dist/openai-agent/instructions.js +63 -0
  205. package/dist/openai-agent/instructions.js.map +1 -0
  206. package/dist/openai-agent/interactions/broker.d.ts +23 -0
  207. package/dist/openai-agent/interactions/broker.d.ts.map +1 -0
  208. package/dist/openai-agent/interactions/broker.js +316 -0
  209. package/dist/openai-agent/interactions/broker.js.map +1 -0
  210. package/dist/openai-agent/mcp/managedMcp.d.ts +31 -0
  211. package/dist/openai-agent/mcp/managedMcp.d.ts.map +1 -0
  212. package/dist/openai-agent/mcp/managedMcp.js +95 -0
  213. package/dist/openai-agent/mcp/managedMcp.js.map +1 -0
  214. package/dist/openai-agent/protocolWriter.d.ts +29 -0
  215. package/dist/openai-agent/protocolWriter.d.ts.map +1 -0
  216. package/dist/openai-agent/protocolWriter.js +74 -0
  217. package/dist/openai-agent/protocolWriter.js.map +1 -0
  218. package/dist/openai-agent/providerCapabilities.d.ts +31 -0
  219. package/dist/openai-agent/providerCapabilities.d.ts.map +1 -0
  220. package/dist/openai-agent/providerCapabilities.js +49 -0
  221. package/dist/openai-agent/providerCapabilities.js.map +1 -0
  222. package/dist/openai-agent/providerFactory.d.ts +18 -0
  223. package/dist/openai-agent/providerFactory.d.ts.map +1 -0
  224. package/dist/openai-agent/providerFactory.js +38 -0
  225. package/dist/openai-agent/providerFactory.js.map +1 -0
  226. package/dist/openai-agent/request.d.ts +22 -0
  227. package/dist/openai-agent/request.d.ts.map +1 -0
  228. package/dist/openai-agent/request.js +89 -0
  229. package/dist/openai-agent/request.js.map +1 -0
  230. package/dist/openai-agent/runWorker.d.ts +25 -0
  231. package/dist/openai-agent/runWorker.d.ts.map +1 -0
  232. package/dist/openai-agent/runWorker.js +635 -0
  233. package/dist/openai-agent/runWorker.js.map +1 -0
  234. package/dist/openai-agent/sandbox/execution.d.ts +36 -0
  235. package/dist/openai-agent/sandbox/execution.d.ts.map +1 -0
  236. package/dist/openai-agent/sandbox/execution.js +239 -0
  237. package/dist/openai-agent/sandbox/execution.js.map +1 -0
  238. package/dist/openai-agent/sandbox/productionDocker.d.ts +17 -0
  239. package/dist/openai-agent/sandbox/productionDocker.d.ts.map +1 -0
  240. package/dist/openai-agent/sandbox/productionDocker.js +76 -0
  241. package/dist/openai-agent/sandbox/productionDocker.js.map +1 -0
  242. package/dist/openai-agent/sdkContract.d.ts +18 -0
  243. package/dist/openai-agent/sdkContract.d.ts.map +1 -0
  244. package/dist/openai-agent/sdkContract.js +2 -0
  245. package/dist/openai-agent/sdkContract.js.map +1 -0
  246. package/dist/openai-agent/storage/atomic.d.ts +10 -0
  247. package/dist/openai-agent/storage/atomic.d.ts.map +1 -0
  248. package/dist/openai-agent/storage/atomic.js +112 -0
  249. package/dist/openai-agent/storage/atomic.js.map +1 -0
  250. package/dist/openai-agent/storage/checkpoint.d.ts +38 -0
  251. package/dist/openai-agent/storage/checkpoint.d.ts.map +1 -0
  252. package/dist/openai-agent/storage/checkpoint.js +141 -0
  253. package/dist/openai-agent/storage/checkpoint.js.map +1 -0
  254. package/dist/openai-agent/storage/errors.d.ts +8 -0
  255. package/dist/openai-agent/storage/errors.d.ts.map +1 -0
  256. package/dist/openai-agent/storage/errors.js +11 -0
  257. package/dist/openai-agent/storage/errors.js.map +1 -0
  258. package/dist/openai-agent/storage/index.d.ts +12 -0
  259. package/dist/openai-agent/storage/index.d.ts.map +1 -0
  260. package/dist/openai-agent/storage/index.js +12 -0
  261. package/dist/openai-agent/storage/index.js.map +1 -0
  262. package/dist/openai-agent/storage/interaction.d.ts +45 -0
  263. package/dist/openai-agent/storage/interaction.d.ts.map +1 -0
  264. package/dist/openai-agent/storage/interaction.js +372 -0
  265. package/dist/openai-agent/storage/interaction.js.map +1 -0
  266. package/dist/openai-agent/storage/lock.d.ts +13 -0
  267. package/dist/openai-agent/storage/lock.d.ts.map +1 -0
  268. package/dist/openai-agent/storage/lock.js +95 -0
  269. package/dist/openai-agent/storage/lock.js.map +1 -0
  270. package/dist/openai-agent/storage/metrics.d.ts +34 -0
  271. package/dist/openai-agent/storage/metrics.d.ts.map +1 -0
  272. package/dist/openai-agent/storage/metrics.js +74 -0
  273. package/dist/openai-agent/storage/metrics.js.map +1 -0
  274. package/dist/openai-agent/storage/output.d.ts +22 -0
  275. package/dist/openai-agent/storage/output.d.ts.map +1 -0
  276. package/dist/openai-agent/storage/output.js +175 -0
  277. package/dist/openai-agent/storage/output.js.map +1 -0
  278. package/dist/openai-agent/storage/session.d.ts +38 -0
  279. package/dist/openai-agent/storage/session.d.ts.map +1 -0
  280. package/dist/openai-agent/storage/session.js +216 -0
  281. package/dist/openai-agent/storage/session.js.map +1 -0
  282. package/dist/openai-agent/storage/toolLedger.d.ts +64 -0
  283. package/dist/openai-agent/storage/toolLedger.d.ts.map +1 -0
  284. package/dist/openai-agent/storage/toolLedger.js +281 -0
  285. package/dist/openai-agent/storage/toolLedger.js.map +1 -0
  286. package/dist/openai-agent/storage/workerStorage.d.ts +21 -0
  287. package/dist/openai-agent/storage/workerStorage.d.ts.map +1 -0
  288. package/dist/openai-agent/storage/workerStorage.js +38 -0
  289. package/dist/openai-agent/storage/workerStorage.js.map +1 -0
  290. package/dist/openai-agent/storage/workspace.d.ts +17 -0
  291. package/dist/openai-agent/storage/workspace.d.ts.map +1 -0
  292. package/dist/openai-agent/storage/workspace.js +67 -0
  293. package/dist/openai-agent/storage/workspace.js.map +1 -0
  294. package/dist/openai-agent/testHelpers.d.ts +9 -0
  295. package/dist/openai-agent/testHelpers.d.ts.map +1 -0
  296. package/dist/openai-agent/testHelpers.js +35 -0
  297. package/dist/openai-agent/testHelpers.js.map +1 -0
  298. package/dist/openai-agent/tools/ledgerTools.d.ts +12 -0
  299. package/dist/openai-agent/tools/ledgerTools.d.ts.map +1 -0
  300. package/dist/openai-agent/tools/ledgerTools.js +151 -0
  301. package/dist/openai-agent/tools/ledgerTools.js.map +1 -0
  302. package/dist/providers/MarkdownTaskBackend.d.ts.map +1 -1
  303. package/dist/providers/MarkdownTaskBackend.js +2 -2
  304. package/dist/providers/MarkdownTaskBackend.js.map +1 -1
  305. package/dist/providers/RuntimeSessionRuntime.d.ts +35 -15
  306. package/dist/providers/RuntimeSessionRuntime.d.ts.map +1 -1
  307. package/dist/providers/RuntimeSessionRuntime.js +239 -22
  308. package/dist/providers/RuntimeSessionRuntime.js.map +1 -1
  309. package/dist/providers/llm/chatTools.d.ts.map +1 -1
  310. package/dist/providers/llm/chatTools.js +3 -3
  311. package/dist/providers/llm/chatTools.js.map +1 -1
  312. package/dist/providers/llm/codexAuth.d.ts +6 -1
  313. package/dist/providers/llm/codexAuth.d.ts.map +1 -1
  314. package/dist/providers/llm/codexAuth.js +45 -9
  315. package/dist/providers/llm/codexAuth.js.map +1 -1
  316. package/dist/providers/llm/codexModel.d.ts +4 -1
  317. package/dist/providers/llm/codexModel.d.ts.map +1 -1
  318. package/dist/providers/llm/codexModel.js +13 -3
  319. package/dist/providers/llm/codexModel.js.map +1 -1
  320. package/dist/providers/llm/localSubscription.d.ts +1 -1
  321. package/dist/providers/llm/localSubscription.d.ts.map +1 -1
  322. package/dist/providers/llm/localSubscription.js +2 -2
  323. package/dist/providers/llm/localSubscription.js.map +1 -1
  324. package/dist/providers/runtimeEventMap.d.ts +54 -5
  325. package/dist/providers/runtimeEventMap.d.ts.map +1 -1
  326. package/dist/providers/runtimeEventMap.js +110 -11
  327. package/dist/providers/runtimeEventMap.js.map +1 -1
  328. package/dist/runtime/agentd/client.d.ts +29 -0
  329. package/dist/runtime/agentd/client.d.ts.map +1 -0
  330. package/dist/runtime/agentd/client.js +131 -0
  331. package/dist/runtime/agentd/client.js.map +1 -0
  332. package/dist/runtime/agentd/main.d.ts +10 -0
  333. package/dist/runtime/agentd/main.d.ts.map +1 -0
  334. package/dist/runtime/agentd/main.js +49 -0
  335. package/dist/runtime/agentd/main.js.map +1 -0
  336. package/dist/runtime/agentd/protocol.d.ts +74 -0
  337. package/dist/runtime/agentd/protocol.d.ts.map +1 -0
  338. package/dist/runtime/agentd/protocol.js +21 -0
  339. package/dist/runtime/agentd/protocol.js.map +1 -0
  340. package/dist/runtime/agentd/server.d.ts +15 -0
  341. package/dist/runtime/agentd/server.d.ts.map +1 -0
  342. package/dist/runtime/agentd/server.js +116 -0
  343. package/dist/runtime/agentd/server.js.map +1 -0
  344. package/dist/runtime/backends/claude/ClaudeBackend.d.ts +155 -0
  345. package/dist/runtime/backends/claude/ClaudeBackend.d.ts.map +1 -0
  346. package/dist/runtime/backends/claude/ClaudeBackend.js +398 -0
  347. package/dist/runtime/backends/claude/ClaudeBackend.js.map +1 -0
  348. package/dist/runtime/backends/claude/ClaudeSessions.d.ts +23 -0
  349. package/dist/runtime/backends/claude/ClaudeSessions.d.ts.map +1 -0
  350. package/dist/runtime/backends/claude/ClaudeSessions.js +45 -0
  351. package/dist/runtime/backends/claude/ClaudeSessions.js.map +1 -0
  352. package/dist/runtime/backends/claude/inprocTools.d.ts +17 -0
  353. package/dist/runtime/backends/claude/inprocTools.d.ts.map +1 -0
  354. package/dist/runtime/backends/claude/inprocTools.js +14 -0
  355. package/dist/runtime/backends/claude/inprocTools.js.map +1 -0
  356. package/dist/runtime/backends/process/ExternalProcessBackend.d.ts +83 -0
  357. package/dist/runtime/backends/process/ExternalProcessBackend.d.ts.map +1 -0
  358. package/dist/runtime/backends/process/ExternalProcessBackend.js +642 -0
  359. package/dist/runtime/backends/process/ExternalProcessBackend.js.map +1 -0
  360. package/dist/runtime/contract/AgentBackend.d.ts +199 -0
  361. package/dist/runtime/contract/AgentBackend.d.ts.map +1 -0
  362. package/dist/runtime/contract/AgentBackend.js +2 -0
  363. package/dist/runtime/contract/AgentBackend.js.map +1 -0
  364. package/dist/runtime/contract/events.d.ts +96 -0
  365. package/dist/runtime/contract/events.d.ts.map +1 -0
  366. package/dist/runtime/contract/events.js +2 -0
  367. package/dist/runtime/contract/events.js.map +1 -0
  368. package/dist/runtime/contract/index.d.ts +13 -0
  369. package/dist/runtime/contract/index.d.ts.map +1 -0
  370. package/dist/runtime/contract/index.js +2 -0
  371. package/dist/runtime/contract/index.js.map +1 -0
  372. package/dist/runtime/contract/lifecycle.d.ts +26 -0
  373. package/dist/runtime/contract/lifecycle.d.ts.map +1 -0
  374. package/dist/runtime/contract/lifecycle.js +6 -0
  375. package/dist/runtime/contract/lifecycle.js.map +1 -0
  376. package/dist/runtime/contract/processProtocol.d.ts +263 -0
  377. package/dist/runtime/contract/processProtocol.d.ts.map +1 -0
  378. package/dist/runtime/contract/processProtocol.js +779 -0
  379. package/dist/runtime/contract/processProtocol.js.map +1 -0
  380. package/dist/runtime/contract/service.d.ts +85 -0
  381. package/dist/runtime/contract/service.d.ts.map +1 -0
  382. package/dist/runtime/contract/service.js +2 -0
  383. package/dist/runtime/contract/service.js.map +1 -0
  384. package/dist/runtime/contract/versioning.d.ts +44 -0
  385. package/dist/runtime/contract/versioning.d.ts.map +1 -0
  386. package/dist/runtime/contract/versioning.js +10 -0
  387. package/dist/runtime/contract/versioning.js.map +1 -0
  388. package/dist/runtime/index.d.ts +21 -0
  389. package/dist/runtime/index.d.ts.map +1 -0
  390. package/dist/runtime/index.js +26 -0
  391. package/dist/runtime/index.js.map +1 -0
  392. package/dist/runtime/runtime.d.ts +21 -0
  393. package/dist/runtime/runtime.d.ts.map +1 -0
  394. package/dist/runtime/runtime.js +34 -0
  395. package/dist/runtime/runtime.js.map +1 -0
  396. package/dist/runtime/service/AgentRuntime.d.ts +60 -0
  397. package/dist/runtime/service/AgentRuntime.d.ts.map +1 -0
  398. package/dist/runtime/service/AgentRuntime.js +396 -0
  399. package/dist/runtime/service/AgentRuntime.js.map +1 -0
  400. package/dist/runtime/service/FileRecordStore.d.ts +12 -0
  401. package/dist/runtime/service/FileRecordStore.d.ts.map +1 -0
  402. package/dist/runtime/service/FileRecordStore.js +48 -0
  403. package/dist/runtime/service/FileRecordStore.js.map +1 -0
  404. package/dist/runtime/service/backendFactory.d.ts +8 -0
  405. package/dist/runtime/service/backendFactory.d.ts.map +1 -0
  406. package/dist/runtime/service/backendFactory.js +20 -0
  407. package/dist/runtime/service/backendFactory.js.map +1 -0
  408. package/dist/runtime/stub/NoopBackend.d.ts +29 -0
  409. package/dist/runtime/stub/NoopBackend.d.ts.map +1 -0
  410. package/dist/runtime/stub/NoopBackend.js +56 -0
  411. package/dist/runtime/stub/NoopBackend.js.map +1 -0
  412. package/dist/runtime/stub/NoopService.d.ts +23 -0
  413. package/dist/runtime/stub/NoopService.d.ts.map +1 -0
  414. package/dist/runtime/stub/NoopService.js +136 -0
  415. package/dist/runtime/stub/NoopService.js.map +1 -0
  416. package/dist/runtime/stub/index.d.ts +8 -0
  417. package/dist/runtime/stub/index.d.ts.map +1 -0
  418. package/dist/runtime/stub/index.js +8 -0
  419. package/dist/runtime/stub/index.js.map +1 -0
  420. package/dist/runtime/versioning/VersionManager.d.ts +31 -0
  421. package/dist/runtime/versioning/VersionManager.d.ts.map +1 -0
  422. package/dist/runtime/versioning/VersionManager.js +142 -0
  423. package/dist/runtime/versioning/VersionManager.js.map +1 -0
  424. package/dist/services/ChatService.d.ts +11 -0
  425. package/dist/services/ChatService.d.ts.map +1 -1
  426. package/dist/services/ChatService.js +35 -5
  427. package/dist/services/ChatService.js.map +1 -1
  428. package/dist/services/LogService.d.ts +10 -4
  429. package/dist/services/LogService.d.ts.map +1 -1
  430. package/dist/services/LogService.js +26 -5
  431. package/dist/services/LogService.js.map +1 -1
  432. package/dist/services/ProjectService.d.ts +56 -0
  433. package/dist/services/ProjectService.d.ts.map +1 -1
  434. package/dist/services/ProjectService.js +182 -15
  435. package/dist/services/ProjectService.js.map +1 -1
  436. package/dist/services/WorkerService.d.ts +1 -0
  437. package/dist/services/WorkerService.d.ts.map +1 -1
  438. package/dist/services/WorkerService.js +72 -0
  439. package/dist/services/WorkerService.js.map +1 -1
  440. package/dist/services/executors.d.ts +1 -0
  441. package/dist/services/executors.d.ts.map +1 -1
  442. package/dist/services/executors.js +9 -1
  443. package/dist/services/executors.js.map +1 -1
  444. package/dist/services/promptPreview.d.ts.map +1 -1
  445. package/dist/services/promptPreview.js +4 -3
  446. package/dist/services/promptPreview.js.map +1 -1
  447. package/dist/shared/runtimePaths.d.ts +4 -0
  448. package/dist/shared/runtimePaths.d.ts.map +1 -1
  449. package/dist/shared/runtimePaths.js +8 -0
  450. package/dist/shared/runtimePaths.js.map +1 -1
  451. package/dist/shared/runtimeSchemas.d.ts +6 -2
  452. package/dist/shared/runtimeSchemas.d.ts.map +1 -1
  453. package/dist/shared/runtimeSchemas.js +3 -2
  454. package/dist/shared/runtimeSchemas.js.map +1 -1
  455. package/docs/openai-daemon-agent.md +144 -0
  456. package/package.json +15 -9
  457. package/project-template/.claude/hooks/openai/on-start.sh +6 -0
  458. package/project-template/.claude/hooks/openai/on-stop.sh +6 -0
@@ -0,0 +1,396 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { basename } from 'node:path';
3
+ export class AgentRuntime {
4
+ slots = new Map();
5
+ factory;
6
+ capacity;
7
+ store;
8
+ tenantOf;
9
+ now;
10
+ constructor(opts) {
11
+ this.factory = opts.factory;
12
+ this.capacity = opts.capacity ?? {};
13
+ this.store = opts.store;
14
+ this.tenantOf = opts.tenantOf ?? ((slot) => (slot.includes(':') ? slot.slice(0, slot.indexOf(':')) : slot));
15
+ this.now = opts.now ?? (() => Date.now());
16
+ // 重启恢复:从 store 读回历史记录(标记为 dead/待重连;真实重连按 pid/证据,见 recover)。
17
+ for (const rec of this.store?.loadAll() ?? []) {
18
+ this.slots.set(rec.slot, {
19
+ // Trusted backend configuration is intentionally not restored from the
20
+ // worker-owned state file. ensureSession() must rebind it explicitly.
21
+ backend: null,
22
+ record: { ...rec, sessionState: 'dead' },
23
+ listeners: new Set(),
24
+ unsub: () => { },
25
+ });
26
+ }
27
+ }
28
+ iso(ms = this.now()) {
29
+ return new Date(ms).toISOString();
30
+ }
31
+ persist(rec) {
32
+ this.store?.put(rec);
33
+ }
34
+ async ensureSession(slot, config) {
35
+ let entry = this.slots.get(slot);
36
+ if (entry && entry.record.sessionState !== 'dead') {
37
+ this.touchIdle(slot);
38
+ return { ...entry.record };
39
+ }
40
+ if (!entry) {
41
+ this.enforceCapacity(slot, config);
42
+ entry = this.createEntry(slot, config);
43
+ this.slots.set(slot, entry);
44
+ }
45
+ else {
46
+ await retireUncontrolledWorker(entry.record.pid, config);
47
+ // 复活一条 dead 记录:重建后端(resume 经 config.resumeSessionId)。
48
+ entry.backend = this.factory(config);
49
+ entry.unsub = this.wire(entry);
50
+ }
51
+ const backend = this.requireBackend(entry);
52
+ const res = await backend.ensure();
53
+ entry.record.sessionId = res.sessionId;
54
+ entry.record.resumed = res.resumed; // R1 穿透
55
+ entry.record.resumeFailed = res.resumeFailed;
56
+ entry.record.liveness = backend.liveness
57
+ ? { ...backend.liveness }
58
+ : entry.record.liveness;
59
+ const waiting = res.resumed &&
60
+ entry.record.terminal?.type === 'run.waiting_for_input' &&
61
+ entry.record.runId &&
62
+ entry.record.turnId &&
63
+ (entry.record.lastSequence ?? 0) > 0;
64
+ const recoverableLost = res.resumed &&
65
+ entry.record.runState === 'lost' &&
66
+ entry.record.terminal == null &&
67
+ entry.record.runId &&
68
+ entry.record.turnId &&
69
+ (entry.record.lastSequence ?? 0) > 0;
70
+ if (waiting) {
71
+ if (!backend.restoreInterruptedRun) {
72
+ throw new Error(`Backend ${backend.kind} cannot restore a waiting run`);
73
+ }
74
+ backend.restoreInterruptedRun({
75
+ sessionId: res.sessionId,
76
+ runId: entry.record.runId,
77
+ turnId: entry.record.turnId,
78
+ lastSequence: entry.record.lastSequence,
79
+ });
80
+ entry.record.runState = 'awaiting_input';
81
+ entry.record.sessionState = 'paused';
82
+ }
83
+ else if (recoverableLost) {
84
+ if (!backend.recoverRun) {
85
+ throw new Error(`Backend ${backend.kind} cannot recover a lost run`);
86
+ }
87
+ await backend.recoverRun({
88
+ sessionId: res.sessionId,
89
+ runId: entry.record.runId,
90
+ turnId: entry.record.turnId,
91
+ lastSequence: entry.record.lastSequence,
92
+ });
93
+ entry.record.terminal = null;
94
+ entry.record.runState = 'starting';
95
+ entry.record.sessionState = 'running';
96
+ }
97
+ else {
98
+ entry.record.sessionState = 'idle';
99
+ }
100
+ entry.record.updatedAt = this.iso();
101
+ this.persist(entry.record);
102
+ this.touchIdle(slot);
103
+ return { ...entry.record };
104
+ }
105
+ createEntry(slot, config) {
106
+ const backend = this.factory(config);
107
+ const ts = this.iso();
108
+ const record = {
109
+ slot,
110
+ sessionId: '',
111
+ backend: config.backend,
112
+ model: config.model,
113
+ cwd: config.cwd,
114
+ pid: null,
115
+ sessionState: 'launching',
116
+ runState: 'idle',
117
+ createdAt: ts,
118
+ updatedAt: ts,
119
+ lastOutputAt: null,
120
+ usage: { inputTokens: 0, outputTokens: 0 },
121
+ runId: undefined,
122
+ lastSequence: 0,
123
+ turnId: undefined,
124
+ terminal: null,
125
+ };
126
+ const entry = { backend, record, listeners: new Set(), unsub: () => { } };
127
+ entry.unsub = this.wire(entry);
128
+ return entry;
129
+ }
130
+ /** 后端事件 → 更新 record + 扇出。 */
131
+ wire(entry) {
132
+ const backend = this.requireBackend(entry);
133
+ return backend.subscribe((ev) => {
134
+ const rec = entry.record;
135
+ rec.updatedAt = this.iso();
136
+ rec.lastOutputAt = rec.updatedAt;
137
+ if (ev.kind === 'session')
138
+ rec.sessionId = ev.sessionId;
139
+ else if (ev.kind === 'process') {
140
+ rec.runId = ev.event.runId;
141
+ rec.turnId = ev.event.turnId;
142
+ rec.lastSequence = ev.event.sequence;
143
+ if (ev.event.type === 'capabilities') {
144
+ rec.capabilities = ev.event.payload;
145
+ }
146
+ if (ev.event.type === 'run.waiting_for_input' ||
147
+ ev.event.type === 'run.completed' ||
148
+ ev.event.type === 'run.failed' ||
149
+ ev.event.type === 'run.cancelled') {
150
+ rec.terminal = {
151
+ type: ev.event.type,
152
+ sequence: ev.event.sequence,
153
+ };
154
+ }
155
+ }
156
+ else if (ev.kind === 'result') {
157
+ rec.runState = ev.status === 'completed' ? 'completed' : 'failed';
158
+ rec.sessionState = 'idle';
159
+ if (ev.usage)
160
+ rec.usage = ev.usage;
161
+ }
162
+ else if (ev.kind === 'run_state') {
163
+ // dispatch 同步 emit 的 'starting' run_state 已带新 runId —— 及时把 record 切到新 run,
164
+ // 否则 startRun 返回后到首个 process 事件之间(worker 冷启动窗口),inspect 仍报旧 runId,
165
+ // 订阅方会按旧 runId 重放上一轮的 terminal(表现为"新消息秒回上一轮的错误/结果")。
166
+ if (ev.runId)
167
+ rec.runId = ev.runId;
168
+ rec.runState = ev.state;
169
+ rec.sessionState =
170
+ ev.state === 'starting' || ev.state === 'running'
171
+ ? 'running'
172
+ : ev.state === 'awaiting_input'
173
+ ? 'paused'
174
+ : 'idle';
175
+ }
176
+ rec.pid = backend.pid ?? null;
177
+ if (backend.liveness)
178
+ rec.liveness = { ...backend.liveness };
179
+ this.persist(rec);
180
+ for (const l of entry.listeners)
181
+ l(ev);
182
+ });
183
+ }
184
+ async startRun(slot, prompt) {
185
+ const entry = this.require(slot);
186
+ this.clearIdle(slot);
187
+ entry.record.sessionState = 'running';
188
+ entry.record.runState = 'starting';
189
+ entry.record.updatedAt = this.iso();
190
+ entry.record.terminal = null;
191
+ const backend = this.requireBackend(entry);
192
+ await backend.dispatch(prompt);
193
+ entry.record.pid = backend.pid ?? null;
194
+ if (backend.liveness)
195
+ entry.record.liveness = { ...backend.liveness };
196
+ this.persist(entry.record);
197
+ this.touchIdle(slot);
198
+ return { ...entry.record };
199
+ }
200
+ async submitInteraction(slot, interactionId, answer) {
201
+ const entry = this.require(slot);
202
+ const backend = this.requireBackend(entry);
203
+ if (!backend.resumeInteraction) {
204
+ throw new Error(`Backend ${backend.kind} does not support interactions`);
205
+ }
206
+ this.clearIdle(slot);
207
+ entry.record.sessionState = 'running';
208
+ entry.record.runState = 'starting';
209
+ entry.record.updatedAt = this.iso();
210
+ entry.record.terminal = null;
211
+ await backend.resumeInteraction(interactionId, answer);
212
+ entry.record.pid = backend.pid ?? null;
213
+ if (backend.liveness)
214
+ entry.record.liveness = { ...backend.liveness };
215
+ this.persist(entry.record);
216
+ this.touchIdle(slot);
217
+ return { ...entry.record };
218
+ }
219
+ subscribe(slot) {
220
+ const entry = this.require(slot);
221
+ const queue = [];
222
+ let pending = null;
223
+ let closed = false;
224
+ const push = (ev) => {
225
+ if (pending) {
226
+ const r = pending;
227
+ pending = null;
228
+ r({ value: ev, done: false });
229
+ }
230
+ else
231
+ queue.push(ev);
232
+ };
233
+ entry.listeners.add(push);
234
+ const cancel = () => {
235
+ if (closed)
236
+ return;
237
+ closed = true;
238
+ entry.listeners.delete(push);
239
+ if (pending) {
240
+ const r = pending;
241
+ pending = null;
242
+ r({ value: undefined, done: true });
243
+ }
244
+ };
245
+ const iterator = {
246
+ next() {
247
+ const head = queue.shift();
248
+ if (head !== undefined)
249
+ return Promise.resolve({ value: head, done: false });
250
+ if (closed)
251
+ return Promise.resolve({ value: undefined, done: true });
252
+ return new Promise((resolve) => {
253
+ pending = resolve;
254
+ });
255
+ },
256
+ return() {
257
+ cancel();
258
+ return Promise.resolve({ value: undefined, done: true });
259
+ },
260
+ };
261
+ return { [Symbol.asyncIterator]: () => iterator, cancel };
262
+ }
263
+ async cancelRun(slot) {
264
+ const entry = this.require(slot);
265
+ const backend = this.requireBackend(entry);
266
+ await backend.cancel();
267
+ entry.record.runState = await backend.runState();
268
+ entry.record.pid = backend.pid ?? null;
269
+ if (backend.liveness)
270
+ entry.record.liveness = { ...backend.liveness };
271
+ entry.record.sessionState = entry.record.runState === 'awaiting_input' ? 'paused' : 'idle';
272
+ entry.record.updatedAt = this.iso();
273
+ this.persist(entry.record);
274
+ }
275
+ async stopSession(slot, reason) {
276
+ const entry = this.slots.get(slot);
277
+ if (!entry)
278
+ return;
279
+ this.clearIdle(slot);
280
+ if (entry.backend)
281
+ await entry.backend.stop(reason);
282
+ entry.unsub();
283
+ entry.record.sessionState = 'dead';
284
+ entry.record.updatedAt = this.iso();
285
+ this.slots.delete(slot);
286
+ this.store?.remove(slot);
287
+ }
288
+ async inspect(slot) {
289
+ if (slot !== undefined) {
290
+ const entry = this.slots.get(slot);
291
+ return entry ? [{ ...entry.record }] : [];
292
+ }
293
+ return [...this.slots.values()].map((e) => ({ ...e.record }));
294
+ }
295
+ // ── 容量 / 空闲回收(CapacityPolicy 执行) ──
296
+ enforceCapacity(slot, config) {
297
+ const live = [...this.slots.values()].filter((e) => e.record.sessionState !== 'dead');
298
+ const max = this.capacity.maxConcurrent;
299
+ if (max != null && live.length >= max) {
300
+ throw new Error(`capacity: 全局并发已达上限 ${max}(slot=${slot})`);
301
+ }
302
+ const tenant = this.tenantOf(slot);
303
+ const perTenant = this.capacity.perTenant?.[tenant];
304
+ if (perTenant != null) {
305
+ const n = live.filter((e) => this.tenantOf(e.record.slot) === tenant).length;
306
+ if (n >= perTenant)
307
+ throw new Error(`capacity: 租户 "${tenant}" 并发已达上限 ${perTenant}`);
308
+ }
309
+ void config;
310
+ }
311
+ touchIdle(slot) {
312
+ const ttl = this.capacity.sessionIdleTtlMs;
313
+ if (ttl == null)
314
+ return;
315
+ const entry = this.slots.get(slot);
316
+ if (!entry)
317
+ return;
318
+ this.clearIdle(slot);
319
+ entry.idleTimer = setTimeout(() => {
320
+ void this.stopSession(slot, 'timeout');
321
+ }, ttl);
322
+ // 不挡进程退出。
323
+ entry.idleTimer.unref?.();
324
+ }
325
+ clearIdle(slot) {
326
+ const entry = this.slots.get(slot);
327
+ if (entry?.idleTimer) {
328
+ clearTimeout(entry.idleTimer);
329
+ entry.idleTimer = undefined;
330
+ }
331
+ }
332
+ require(slot) {
333
+ const entry = this.slots.get(slot);
334
+ if (!entry)
335
+ throw new Error(`AgentRuntime: unknown slot "${slot}"(先 ensureSession)`);
336
+ return entry;
337
+ }
338
+ requireBackend(entry) {
339
+ if (!entry.backend) {
340
+ throw new Error(`AgentRuntime: slot "${entry.record.slot}" must be rebound with trusted config`);
341
+ }
342
+ return entry.backend;
343
+ }
344
+ }
345
+ async function retireUncontrolledWorker(pid, config) {
346
+ if (!pid || !isProcessAlive(pid))
347
+ return;
348
+ if (pid === process.pid) {
349
+ throw new Error('Refusing to terminate the current supervisor process');
350
+ }
351
+ const spec = config.externalProcess;
352
+ if (!spec || !matchesExpectedWorker(pid, spec.executable, spec.args ?? [])) {
353
+ throw new Error(`Cannot recover while uncontrolled pid ${pid} is alive and its identity cannot be verified`);
354
+ }
355
+ process.kill(pid, 'SIGTERM');
356
+ if (await waitForProcessExit(pid, spec.killGraceMs ?? 2_000))
357
+ return;
358
+ process.kill(pid, 'SIGKILL');
359
+ if (!(await waitForProcessExit(pid, spec.killGraceMs ?? 2_000))) {
360
+ throw new Error(`Uncontrolled worker pid ${pid} did not exit`);
361
+ }
362
+ }
363
+ function matchesExpectedWorker(pid, executable, args) {
364
+ try {
365
+ const command = execFileSync('/bin/ps', ['-p', String(pid), '-o', 'command='], { encoding: 'utf8' }).trim();
366
+ if (!command.includes(basename(executable)))
367
+ return false;
368
+ const identityArg = args.find((arg) => arg.startsWith('/'));
369
+ return !identityArg || command.includes(basename(identityArg));
370
+ }
371
+ catch {
372
+ return false;
373
+ }
374
+ }
375
+ function isProcessAlive(pid) {
376
+ try {
377
+ process.kill(pid, 0);
378
+ return true;
379
+ }
380
+ catch {
381
+ return false;
382
+ }
383
+ }
384
+ async function waitForProcessExit(pid, timeoutMs) {
385
+ const deadline = Date.now() + timeoutMs;
386
+ while (Date.now() < deadline) {
387
+ if (!isProcessAlive(pid))
388
+ return true;
389
+ await new Promise((resolve) => {
390
+ const timer = setTimeout(resolve, 25);
391
+ timer.unref?.();
392
+ });
393
+ }
394
+ return !isProcessAlive(pid);
395
+ }
396
+ //# sourceMappingURL=AgentRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentRuntime.js","sourceRoot":"","sources":["../../../src/runtime/service/AgentRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SessionRecord } from '../contract/service.js';
2
+ import type { RecordStore } from './AgentRuntime.js';
3
+ export declare class FileRecordStore implements RecordStore {
4
+ private readonly path;
5
+ private readonly map;
6
+ constructor(path: string);
7
+ loadAll(): SessionRecord[];
8
+ put(rec: SessionRecord): void;
9
+ remove(slot: string): void;
10
+ private flush;
11
+ }
12
+ //# sourceMappingURL=FileRecordStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileRecordStore.d.ts","sourceRoot":"","sources":["../../../src/runtime/service/FileRecordStore.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AASrD,qBAAa,eAAgB,YAAW,WAAW;IAGrC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoC;gBAE3B,IAAI,EAAE,MAAM;IAWzC,OAAO,IAAI,aAAa,EAAE;IAI1B,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAK7B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI1B,OAAO,CAAC,KAAK;CAQd"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @module service/FileRecordStore
3
+ * P2:`SessionRecord` 的文件持久(state 文件)。agentd 用它扛自身重启——
4
+ * 重启后从盘上读回会话记录,再按 pid/证据决定重连或标 dead(见 recover)。
5
+ * 写用 tmp+rename 原子落盘,避免崩溃中途写坏。
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
8
+ import { dirname } from 'node:path';
9
+ const SCHEMA = 1;
10
+ export class FileRecordStore {
11
+ path;
12
+ map = new Map();
13
+ constructor(path) {
14
+ this.path = path;
15
+ if (existsSync(path)) {
16
+ try {
17
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
18
+ if (parsed.schemaVersion === SCHEMA)
19
+ for (const r of parsed.records)
20
+ this.map.set(r.slot, r);
21
+ }
22
+ catch {
23
+ /* state 文件损坏 → 当空起步(不阻断启动) */
24
+ }
25
+ }
26
+ }
27
+ loadAll() {
28
+ return [...this.map.values()];
29
+ }
30
+ put(rec) {
31
+ this.map.set(rec.slot, { ...rec });
32
+ this.flush();
33
+ }
34
+ remove(slot) {
35
+ if (this.map.delete(slot))
36
+ this.flush();
37
+ }
38
+ flush() {
39
+ const dir = dirname(this.path);
40
+ if (!existsSync(dir))
41
+ mkdirSync(dir, { recursive: true });
42
+ const data = { schemaVersion: SCHEMA, records: [...this.map.values()] };
43
+ const tmp = `${this.path}.tmp`;
44
+ writeFileSync(tmp, JSON.stringify(data, null, 2));
45
+ renameSync(tmp, this.path); // 原子替换
46
+ }
47
+ }
48
+ //# sourceMappingURL=FileRecordStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileRecordStore.js","sourceRoot":"","sources":["../../../src/runtime/service/FileRecordStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,MAAM,GAAG,CAAC,CAAC;AAEjB,MAAM,OAAO,eAAe;IAGG;IAFZ,GAAG,GAAG,IAAI,GAAG,EAAyB,CAAC;IAExD,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QACvC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAc,CAAC;gBACnE,IAAI,MAAM,CAAC,aAAa,KAAK,MAAM;oBAAE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;wBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/F,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,GAAG,CAAC,GAAkB;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;IAEO,KAAK;QACX,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAc,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QACnF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC;QAC/B,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;IACrC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { type ClaudeSdkModule } from '../backends/claude/ClaudeBackend.js';
2
+ import type { BackendFactory } from './AgentRuntime.js';
3
+ export interface BackendFactoryDeps {
4
+ /** 已解析的 claude SDK 模块(query/getSessionInfo)。P3:`await VersionManager.load('@anthropic-ai/claude-agent-sdk')`。 */
5
+ claudeSdk?: ClaudeSdkModule;
6
+ }
7
+ export declare function createBackendFactory(deps: BackendFactoryDeps): BackendFactory;
8
+ //# sourceMappingURL=backendFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendFactory.d.ts","sourceRoot":"","sources":["../../../src/runtime/service/backendFactory.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAE1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,iHAAiH;IACjH,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAc7E"}
@@ -0,0 +1,20 @@
1
+ import { ClaudeBackend } from '../backends/claude/ClaudeBackend.js';
2
+ import { ExternalProcessBackend } from '../backends/process/ExternalProcessBackend.js';
3
+ export function createBackendFactory(deps) {
4
+ return (config) => {
5
+ switch (config.backend) {
6
+ case 'claude':
7
+ if (!deps.claudeSdk)
8
+ throw new Error('backendFactory: claude SDK 未加载(注入 claudeSdk 或经 VersionManager.load)');
9
+ return new ClaudeBackend(config, deps.claudeSdk);
10
+ case 'openai':
11
+ // in-process OpenAiBackend 已退役;openai/codex 一律走独立进程 worker(sps-cli/src/openai-agent)。
12
+ if (config.externalProcess)
13
+ return new ExternalProcessBackend(config);
14
+ throw new Error('backendFactory: openai 后端需 externalProcess(in-process OpenAiBackend 已移除)');
15
+ default:
16
+ throw new Error(`backendFactory: 未知 backend "${config.backend}"`);
17
+ }
18
+ };
19
+ }
20
+ //# sourceMappingURL=backendFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendFactory.js","sourceRoot":"","sources":["../../../src/runtime/service/backendFactory.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAwB,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAQvF,MAAM,UAAU,oBAAoB,CAAC,IAAwB;IAC3D,OAAO,CAAC,MAAqB,EAAgB,EAAE;QAC7C,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,QAAQ;gBACX,IAAI,CAAC,IAAI,CAAC,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;gBAC5G,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,KAAK,QAAQ;gBACX,sFAAsF;gBACtF,IAAI,MAAM,CAAC,eAAe;oBAAE,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;YAC9F;gBACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,OAAiB,GAAG,CAAC,CAAC;QAChF,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @module stub/NoopBackend
3
+ * AgentBackend 的 no-op 实现(test double)。不连任何 SDK,用假数据把
4
+ * ensure → dispatch → subscribe → result 这条事件链端到端走通,
5
+ * 用于 P0 阶段验证契约形状可实现、可被消费者驱动。真实现见 P1 ClaudeBackend。
6
+ */
7
+ import type { AgentBackend, SessionConfig } from '../contract/AgentBackend.js';
8
+ import type { WorkerOutputListener } from '../contract/events.js';
9
+ import type { RunState, StopReason } from '../contract/lifecycle.js';
10
+ export declare class NoopBackend implements AgentBackend {
11
+ private readonly config;
12
+ readonly kind: string;
13
+ private readonly listeners;
14
+ private sessionId;
15
+ private _runState;
16
+ constructor(config: SessionConfig);
17
+ private emit;
18
+ ensure(): Promise<{
19
+ sessionId: string;
20
+ resumed: boolean;
21
+ resumeFailed?: 'session_lost' | 'not_found';
22
+ }>;
23
+ dispatch(prompt: string): Promise<void>;
24
+ runState(): Promise<RunState>;
25
+ cancel(): Promise<void>;
26
+ stop(_reason?: StopReason): Promise<void>;
27
+ subscribe(listener: WorkerOutputListener): () => void;
28
+ }
29
+ //# sourceMappingURL=NoopBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoopBackend.d.ts","sourceRoot":"","sources":["../../../src/runtime/stub/NoopBackend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAIrE,qBAAa,WAAY,YAAW,YAAY;IAMlC,OAAO,CAAC,QAAQ,CAAC,MAAM;IALnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAC7D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAoB;gBAER,MAAM,EAAE,aAAa;IAIlD,OAAO,CAAC,IAAI;IAIN,MAAM,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,cAAc,GAAG,WAAW,CAAA;KAAE,CAAC;IAUvG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAI7B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;CAMtD"}
@@ -0,0 +1,56 @@
1
+ let counter = 0;
2
+ export class NoopBackend {
3
+ config;
4
+ kind;
5
+ listeners = new Set();
6
+ sessionId = null;
7
+ _runState = 'idle';
8
+ constructor(config) {
9
+ this.config = config;
10
+ this.kind = config.backend;
11
+ }
12
+ emit(ev) {
13
+ for (const l of this.listeners)
14
+ l(ev);
15
+ }
16
+ async ensure() {
17
+ // noop:有 resumeSessionId 即"重载成功"(真实 ClaudeBackend 会按 SDK 反馈填 resumeFailed)。
18
+ const resumed = this.config.resumeSessionId != null;
19
+ if (!this.sessionId) {
20
+ this.sessionId = this.config.resumeSessionId ?? `noop-${this.config.backend}-${++counter}`;
21
+ this.emit({ kind: 'session', sessionId: this.sessionId });
22
+ }
23
+ return { sessionId: this.sessionId, resumed };
24
+ }
25
+ async dispatch(prompt) {
26
+ await this.ensure();
27
+ this._runState = 'running';
28
+ this.emit({ kind: 'text', text: `[noop] echo: ${prompt}` });
29
+ this._runState = 'completed';
30
+ this.emit({
31
+ kind: 'result',
32
+ status: 'completed',
33
+ text: '[noop] done',
34
+ usage: { inputTokens: 0, outputTokens: 0, costUsd: 0 },
35
+ stopReason: 'end_turn',
36
+ });
37
+ }
38
+ async runState() {
39
+ return this._runState;
40
+ }
41
+ async cancel() {
42
+ this._runState = 'cancelled';
43
+ }
44
+ async stop(_reason) {
45
+ this._runState = 'idle';
46
+ this.listeners.clear();
47
+ this.sessionId = null;
48
+ }
49
+ subscribe(listener) {
50
+ this.listeners.add(listener);
51
+ return () => {
52
+ this.listeners.delete(listener);
53
+ };
54
+ }
55
+ }
56
+ //# sourceMappingURL=NoopBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoopBackend.js","sourceRoot":"","sources":["../../../src/runtime/stub/NoopBackend.ts"],"names":[],"mappings":"AAUA,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,MAAM,OAAO,WAAW;IAMO;IALpB,IAAI,CAAS;IACL,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IACrD,SAAS,GAAkB,IAAI,CAAC;IAChC,SAAS,GAAa,MAAM,CAAC;IAErC,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;QAChD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAEO,IAAI,CAAC,EAAqB;QAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,4EAA4E;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;YAC3F,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YACtD,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,SAAS,CAAC,QAA8B;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @module stub/NoopService
3
+ * AgentService 的 no-op 实现(test double)。每个 slot 背一个 NoopBackend,
4
+ * 维护 SessionRecord、把后端事件扇出给 subscribe 的异步迭代器。
5
+ * 用于 P0 验证服务契约形状端到端可用;真实现见 P2(in-process 内核 + agentd 外壳)。
6
+ */
7
+ import type { SessionConfig } from '../contract/AgentBackend.js';
8
+ import type { AgentService, SessionRecord } from '../contract/service.js';
9
+ import type { StopReason } from '../contract/lifecycle.js';
10
+ import type { WorkerOutputEvent } from '../contract/events.js';
11
+ export declare class NoopService implements AgentService {
12
+ private readonly slots;
13
+ ensureSession(slot: string, config: SessionConfig): Promise<SessionRecord>;
14
+ startRun(slot: string, prompt: string): Promise<SessionRecord>;
15
+ subscribe(slot: string): AsyncIterable<WorkerOutputEvent> & {
16
+ cancel(): void;
17
+ };
18
+ cancelRun(slot: string): Promise<void>;
19
+ stopSession(slot: string, reason?: StopReason): Promise<void>;
20
+ inspect(slot?: string): Promise<SessionRecord[]>;
21
+ private require;
22
+ }
23
+ //# sourceMappingURL=NoopService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoopService.d.ts","sourceRoot":"","sources":["../../../src/runtime/stub/NoopService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAwB,MAAM,uBAAuB,CAAC;AAYrF,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;IAE5C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA4C1E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IASpE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,iBAAiB,CAAC,GAAG;QAAE,MAAM,IAAI,IAAI,CAAA;KAAE;IAiDxE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7D,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAQtD,OAAO,CAAC,OAAO;CAKhB"}