@downcity/agent 1.1.238 → 1.1.259

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 (578) hide show
  1. package/README.md +38 -45
  2. package/bin/agent/{local/Agent.d.ts → Agent.d.ts} +37 -27
  3. package/bin/agent/Agent.d.ts.map +1 -0
  4. package/bin/agent/Agent.js +211 -0
  5. package/bin/agent/Agent.js.map +1 -0
  6. package/bin/agent/AgentContext.d.ts +64 -0
  7. package/bin/agent/AgentContext.d.ts.map +1 -0
  8. package/bin/agent/AgentContext.js +53 -0
  9. package/bin/agent/AgentContext.js.map +1 -0
  10. package/bin/agent/{local/AgentInstructions.d.ts → AgentInstructions.d.ts} +1 -6
  11. package/bin/agent/AgentInstructions.d.ts.map +1 -0
  12. package/bin/agent/{local/AgentInstructions.js → AgentInstructions.js} +1 -10
  13. package/bin/agent/AgentInstructions.js.map +1 -0
  14. package/bin/{model/CityModelAdapter.d.ts → agent/AgentModel.d.ts} +3 -3
  15. package/bin/agent/AgentModel.d.ts.map +1 -0
  16. package/bin/{model/CityModelAdapter.js → agent/AgentModel.js} +11 -4
  17. package/bin/agent/AgentModel.js.map +1 -0
  18. package/bin/agent/{local/services/AgentSessions.d.ts → AgentSessions.d.ts} +30 -40
  19. package/bin/agent/AgentSessions.d.ts.map +1 -0
  20. package/bin/agent/{local/services/AgentSessions.js → AgentSessions.js} +62 -79
  21. package/bin/agent/AgentSessions.js.map +1 -0
  22. package/bin/agent/AgentState.d.ts +64 -0
  23. package/bin/agent/AgentState.d.ts.map +1 -0
  24. package/bin/agent/AgentState.js +118 -0
  25. package/bin/agent/AgentState.js.map +1 -0
  26. package/bin/config/Paths.d.ts +0 -43
  27. package/bin/config/Paths.d.ts.map +1 -1
  28. package/bin/config/Paths.js +0 -79
  29. package/bin/config/Paths.js.map +1 -1
  30. package/bin/config/ProjectSetup.d.ts.map +1 -0
  31. package/bin/{agent/local → config}/ProjectSetup.js +1 -1
  32. package/bin/config/ProjectSetup.js.map +1 -0
  33. package/bin/executor/Executor.d.ts +20 -86
  34. package/bin/executor/Executor.d.ts.map +1 -1
  35. package/bin/executor/Executor.js +109 -260
  36. package/bin/executor/Executor.js.map +1 -1
  37. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts +1 -1
  38. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts.map +1 -1
  39. package/bin/executor/composer/system/default/SystemDomain.d.ts +1 -1
  40. package/bin/executor/composer/system/default/SystemDomain.d.ts.map +1 -1
  41. package/bin/executor/composer/system/default/SystemDomain.js +4 -1
  42. package/bin/executor/composer/system/default/SystemDomain.js.map +1 -1
  43. package/bin/executor/composer/system/default/assets/core.prompt.d.ts +1 -1
  44. package/bin/executor/composer/system/default/assets/core.prompt.d.ts.map +1 -1
  45. package/bin/executor/composer/system/default/assets/core.prompt.js +1 -1
  46. package/bin/executor/composer/system/default/assets/core.prompt.js.map +1 -1
  47. package/bin/executor/core-engine/CoreEngineRunner.d.ts +7 -13
  48. package/bin/executor/core-engine/CoreEngineRunner.d.ts.map +1 -1
  49. package/bin/executor/core-engine/CoreEngineRunner.js +81 -34
  50. package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -1
  51. package/bin/executor/services/ExecutorRecoveryPolicy.d.ts +6 -12
  52. package/bin/executor/services/ExecutorRecoveryPolicy.d.ts.map +1 -1
  53. package/bin/executor/services/ExecutorRecoveryPolicy.js +20 -6
  54. package/bin/executor/services/ExecutorRecoveryPolicy.js.map +1 -1
  55. package/bin/executor/tools/file/ReadImageToolBridge.d.ts +21 -0
  56. package/bin/executor/tools/file/ReadImageToolBridge.d.ts.map +1 -0
  57. package/bin/executor/tools/file/ReadImageToolBridge.js +69 -0
  58. package/bin/executor/tools/file/ReadImageToolBridge.js.map +1 -0
  59. package/bin/executor/tools/plugin/PluginToolBridge.d.ts.map +1 -1
  60. package/bin/executor/tools/plugin/PluginToolBridge.js +6 -5
  61. package/bin/executor/tools/plugin/PluginToolBridge.js.map +1 -1
  62. package/bin/executor/tools/plugin/PluginToolDefinition.d.ts.map +1 -1
  63. package/bin/executor/tools/plugin/PluginToolDefinition.js +15 -2
  64. package/bin/executor/tools/plugin/PluginToolDefinition.js.map +1 -1
  65. package/bin/executor/types/SessionHistoryMeta.d.ts +0 -2
  66. package/bin/executor/types/SessionHistoryMeta.d.ts.map +1 -1
  67. package/bin/index.d.ts +17 -21
  68. package/bin/index.d.ts.map +1 -1
  69. package/bin/index.js +9 -11
  70. package/bin/index.js.map +1 -1
  71. package/bin/plugin/core/ActionScheduleExecutor.d.ts +1 -1
  72. package/bin/plugin/core/ActionScheduleExecutor.d.ts.map +1 -1
  73. package/bin/plugin/core/ActionScheduleRuntime.d.ts +1 -1
  74. package/bin/plugin/core/ActionScheduleRuntime.d.ts.map +1 -1
  75. package/bin/plugin/core/BasePlugin.d.ts +4 -3
  76. package/bin/plugin/core/BasePlugin.d.ts.map +1 -1
  77. package/bin/plugin/core/BasePlugin.js.map +1 -1
  78. package/bin/plugin/core/HookRegistry.d.ts +5 -8
  79. package/bin/plugin/core/HookRegistry.d.ts.map +1 -1
  80. package/bin/plugin/core/HookRegistry.js +12 -12
  81. package/bin/plugin/core/HookRegistry.js.map +1 -1
  82. package/bin/plugin/core/PluginActionFactory.d.ts +6 -3
  83. package/bin/plugin/core/PluginActionFactory.d.ts.map +1 -1
  84. package/bin/plugin/core/PluginActionFactory.js.map +1 -1
  85. package/bin/plugin/core/PluginActionRunner.d.ts +1 -1
  86. package/bin/plugin/core/PluginActionRunner.d.ts.map +1 -1
  87. package/bin/plugin/core/PluginCatalog.d.ts +1 -1
  88. package/bin/plugin/core/PluginCatalog.d.ts.map +1 -1
  89. package/bin/plugin/core/PluginHttpRoutes.d.ts +1 -1
  90. package/bin/plugin/core/PluginHttpRoutes.d.ts.map +1 -1
  91. package/bin/plugin/core/PluginLocalExecution.d.ts +4 -5
  92. package/bin/plugin/core/PluginLocalExecution.d.ts.map +1 -1
  93. package/bin/plugin/core/PluginLocalExecution.js +4 -12
  94. package/bin/plugin/core/PluginLocalExecution.js.map +1 -1
  95. package/bin/plugin/core/PluginRegistry.d.ts +16 -12
  96. package/bin/plugin/core/PluginRegistry.d.ts.map +1 -1
  97. package/bin/plugin/core/PluginRegistry.js +43 -22
  98. package/bin/plugin/core/PluginRegistry.js.map +1 -1
  99. package/bin/plugin/core/PluginStateController.d.ts +1 -1
  100. package/bin/plugin/core/PluginStateController.d.ts.map +1 -1
  101. package/bin/{agent/remote → remote}/RemoteAgent.d.ts +4 -4
  102. package/bin/remote/RemoteAgent.d.ts.map +1 -0
  103. package/bin/{agent/remote → remote}/RemoteAgent.js +3 -3
  104. package/bin/remote/RemoteAgent.js.map +1 -0
  105. package/bin/{agent/remote → remote}/RemoteSession.d.ts +9 -11
  106. package/bin/remote/RemoteSession.d.ts.map +1 -0
  107. package/bin/{agent/remote → remote}/RemoteSession.js +3 -33
  108. package/bin/remote/RemoteSession.js.map +1 -0
  109. package/bin/{agent/remote → remote}/RemoteTransport.d.ts +7 -9
  110. package/bin/remote/RemoteTransport.d.ts.map +1 -0
  111. package/bin/remote/RemoteTransport.js.map +1 -0
  112. package/bin/{agent/remote → remote}/TransportFactory.d.ts +1 -1
  113. package/bin/remote/TransportFactory.d.ts.map +1 -0
  114. package/bin/{agent/remote → remote}/TransportFactory.js +2 -2
  115. package/bin/remote/TransportFactory.js.map +1 -0
  116. package/bin/{agent/remote → remote}/transports/HttpRemoteAgentTransport.d.ts +8 -9
  117. package/bin/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -0
  118. package/bin/{agent/remote → remote}/transports/HttpRemoteAgentTransport.js +0 -13
  119. package/bin/remote/transports/HttpRemoteAgentTransport.js.map +1 -0
  120. package/bin/{rpc/Client.d.ts → remote/transports/RpcClient.d.ts} +15 -22
  121. package/bin/remote/transports/RpcClient.d.ts.map +1 -0
  122. package/bin/{rpc/Client.js → remote/transports/RpcClient.js} +2 -13
  123. package/bin/remote/transports/RpcClient.js.map +1 -0
  124. package/bin/{agent/remote → remote}/transports/RpcRemoteAgentTransport.d.ts +8 -9
  125. package/bin/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -0
  126. package/bin/{agent/remote → remote}/transports/RpcRemoteAgentTransport.js +1 -4
  127. package/bin/remote/transports/RpcRemoteAgentTransport.js.map +1 -0
  128. package/bin/session/DefaultSessionComposer.d.ts +18 -0
  129. package/bin/session/DefaultSessionComposer.d.ts.map +1 -0
  130. package/bin/session/DefaultSessionComposer.js +62 -0
  131. package/bin/session/DefaultSessionComposer.js.map +1 -0
  132. package/bin/session/Session.d.ts +44 -33
  133. package/bin/session/Session.d.ts.map +1 -1
  134. package/bin/session/Session.js +440 -274
  135. package/bin/session/Session.js.map +1 -1
  136. package/bin/session/SessionMessages.d.ts +133 -0
  137. package/bin/session/SessionMessages.d.ts.map +1 -0
  138. package/bin/session/{recorder/SessionRecorder.js → SessionMessages.js} +247 -284
  139. package/bin/session/SessionMessages.js.map +1 -0
  140. package/bin/session/SessionQueue.d.ts +34 -0
  141. package/bin/session/SessionQueue.d.ts.map +1 -0
  142. package/bin/session/SessionQueue.js +60 -0
  143. package/bin/session/SessionQueue.js.map +1 -0
  144. package/bin/session/SessionState.d.ts +70 -0
  145. package/bin/session/SessionState.d.ts.map +1 -0
  146. package/bin/session/SessionState.js +267 -0
  147. package/bin/session/SessionState.js.map +1 -0
  148. package/bin/session/SessionSystem.d.ts +15 -0
  149. package/bin/session/SessionSystem.d.ts.map +1 -0
  150. package/bin/session/SessionSystem.js +95 -0
  151. package/bin/session/SessionSystem.js.map +1 -0
  152. package/bin/session/SessionTurn.d.ts +84 -0
  153. package/bin/session/SessionTurn.d.ts.map +1 -0
  154. package/bin/session/SessionTurn.js +588 -0
  155. package/bin/session/SessionTurn.js.map +1 -0
  156. package/bin/session/approval/SessionApprovalBroker.d.ts +48 -0
  157. package/bin/session/approval/SessionApprovalBroker.d.ts.map +1 -0
  158. package/bin/session/approval/SessionApprovalBroker.js +126 -0
  159. package/bin/session/approval/SessionApprovalBroker.js.map +1 -0
  160. package/bin/session/browse/Browse.d.ts.map +1 -1
  161. package/bin/session/browse/Browse.js +1 -4
  162. package/bin/session/browse/Browse.js.map +1 -1
  163. package/bin/session/{recorder → messages}/JsonlSessionMessageStore.d.ts.map +1 -1
  164. package/bin/session/{recorder → messages}/JsonlSessionMessageStore.js.map +1 -1
  165. package/bin/session/messages/SessionAssistantMessageWriter.d.ts +62 -0
  166. package/bin/session/messages/SessionAssistantMessageWriter.d.ts.map +1 -0
  167. package/bin/session/messages/SessionAssistantMessageWriter.js +287 -0
  168. package/bin/session/messages/SessionAssistantMessageWriter.js.map +1 -0
  169. package/bin/session/messages/SessionJsonValue.d.ts +10 -0
  170. package/bin/session/messages/SessionJsonValue.d.ts.map +1 -0
  171. package/bin/session/messages/SessionJsonValue.js +23 -0
  172. package/bin/session/messages/SessionJsonValue.js.map +1 -0
  173. package/bin/session/{recorder → messages}/SessionMessageCodec.d.ts +4 -1
  174. package/bin/session/messages/SessionMessageCodec.d.ts.map +1 -0
  175. package/bin/session/{recorder → messages}/SessionMessageCodec.js +33 -19
  176. package/bin/session/messages/SessionMessageCodec.js.map +1 -0
  177. package/bin/session/messages/SessionMessageCompaction.d.ts +22 -0
  178. package/bin/session/messages/SessionMessageCompaction.d.ts.map +1 -0
  179. package/bin/session/{recorder/SessionRecorderCompaction.js → messages/SessionMessageCompaction.js} +19 -51
  180. package/bin/session/messages/SessionMessageCompaction.js.map +1 -0
  181. package/bin/session/runtime/SessionEventHub.d.ts +1 -8
  182. package/bin/session/runtime/SessionEventHub.d.ts.map +1 -1
  183. package/bin/session/runtime/SessionEventHub.js +1 -6
  184. package/bin/session/runtime/SessionEventHub.js.map +1 -1
  185. package/bin/session/storage/Metadata.d.ts +23 -5
  186. package/bin/session/storage/Metadata.d.ts.map +1 -1
  187. package/bin/session/storage/Metadata.js +32 -29
  188. package/bin/session/storage/Metadata.js.map +1 -1
  189. package/bin/session/storage/RuntimeSessionPort.d.ts +5 -10
  190. package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
  191. package/bin/session/storage/RuntimeSessionPort.js +2 -4
  192. package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
  193. package/bin/types/agent/AgentOptions.d.ts +6 -35
  194. package/bin/types/agent/AgentOptions.d.ts.map +1 -1
  195. package/bin/types/agent/AgentState.d.ts +28 -0
  196. package/bin/types/agent/AgentState.d.ts.map +1 -0
  197. package/bin/types/agent/AgentState.js +9 -0
  198. package/bin/types/agent/AgentState.js.map +1 -0
  199. package/bin/types/agent/SessionActor.d.ts +0 -2
  200. package/bin/types/agent/SessionActor.d.ts.map +1 -1
  201. package/bin/types/agent/SessionTypes.d.ts +5 -18
  202. package/bin/types/agent/SessionTypes.d.ts.map +1 -1
  203. package/bin/types/executor/SessionRunContext.d.ts +8 -2
  204. package/bin/types/executor/SessionRunContext.d.ts.map +1 -1
  205. package/bin/types/executor/SessionRunContext.js +1 -1
  206. package/bin/types/executor/SessionToolExecutionContext.d.ts +20 -0
  207. package/bin/types/executor/SessionToolExecutionContext.d.ts.map +1 -0
  208. package/bin/types/executor/SessionToolExecutionContext.js +10 -0
  209. package/bin/types/executor/SessionToolExecutionContext.js.map +1 -0
  210. package/bin/types/plugin/PluginAction.d.ts +10 -1
  211. package/bin/types/plugin/PluginAction.d.ts.map +1 -1
  212. package/bin/types/plugin/PluginCommand.d.ts +3 -11
  213. package/bin/types/plugin/PluginCommand.d.ts.map +1 -1
  214. package/bin/types/plugin/PluginConfig.d.ts +12 -0
  215. package/bin/types/plugin/PluginConfig.d.ts.map +1 -0
  216. package/bin/types/plugin/PluginConfig.js +5 -0
  217. package/bin/types/plugin/PluginConfig.js.map +1 -0
  218. package/bin/types/plugin/PluginDefinition.d.ts +10 -3
  219. package/bin/types/plugin/PluginDefinition.d.ts.map +1 -1
  220. package/bin/types/plugin/PluginHttp.d.ts +1 -1
  221. package/bin/types/plugin/PluginHttp.d.ts.map +1 -1
  222. package/bin/types/plugin/PluginRunContext.d.ts +26 -0
  223. package/bin/types/plugin/PluginRunContext.d.ts.map +1 -0
  224. package/bin/types/plugin/PluginRunContext.js +10 -0
  225. package/bin/types/plugin/PluginRunContext.js.map +1 -0
  226. package/bin/types/plugin/PluginRuntime.d.ts +9 -3
  227. package/bin/types/plugin/PluginRuntime.d.ts.map +1 -1
  228. package/bin/types/plugin/PluginToolRuntime.d.ts +11 -0
  229. package/bin/types/plugin/PluginToolRuntime.d.ts.map +1 -1
  230. package/bin/types/rpc/RpcProtocol.d.ts +1 -13
  231. package/bin/types/rpc/RpcProtocol.d.ts.map +1 -1
  232. package/bin/types/session/SessionApproval.d.ts +4 -38
  233. package/bin/types/session/SessionApproval.d.ts.map +1 -1
  234. package/bin/types/session/SessionApprovalBroker.d.ts +17 -0
  235. package/bin/types/session/SessionApprovalBroker.d.ts.map +1 -0
  236. package/bin/types/session/SessionApprovalBroker.js +7 -0
  237. package/bin/types/session/SessionApprovalBroker.js.map +1 -0
  238. package/bin/types/session/SessionComposer.d.ts +99 -0
  239. package/bin/types/session/SessionComposer.d.ts.map +1 -0
  240. package/bin/types/session/SessionComposer.js +8 -0
  241. package/bin/types/session/SessionComposer.js.map +1 -0
  242. package/bin/types/session/SessionLocalState.d.ts +6 -6
  243. package/bin/types/session/SessionLocalState.d.ts.map +1 -1
  244. package/bin/types/session/SessionLocalState.js +1 -1
  245. package/bin/types/session/SessionMessage.d.ts +3 -2
  246. package/bin/types/session/SessionMessage.d.ts.map +1 -1
  247. package/bin/types/session/SessionMessages.d.ts +115 -0
  248. package/bin/types/session/SessionMessages.d.ts.map +1 -0
  249. package/bin/types/session/SessionMessages.js +7 -0
  250. package/bin/types/session/SessionMessages.js.map +1 -0
  251. package/bin/types/session/SessionMutation.d.ts +1 -10
  252. package/bin/types/session/SessionMutation.d.ts.map +1 -1
  253. package/bin/types/session/SessionMutation.js.map +1 -1
  254. package/bin/types/session/SessionOptions.d.ts +8 -23
  255. package/bin/types/session/SessionOptions.d.ts.map +1 -1
  256. package/bin/types/session/SessionPort.d.ts +72 -0
  257. package/bin/types/session/SessionPort.d.ts.map +1 -0
  258. package/bin/types/session/SessionPort.js +9 -0
  259. package/bin/types/session/SessionPort.js.map +1 -0
  260. package/bin/types/session/SessionQueue.d.ts +104 -0
  261. package/bin/types/session/SessionQueue.d.ts.map +1 -0
  262. package/bin/types/session/SessionQueue.js +7 -0
  263. package/bin/types/session/SessionQueue.js.map +1 -0
  264. package/bin/types/session/SessionState.d.ts +43 -0
  265. package/bin/types/session/SessionState.d.ts.map +1 -0
  266. package/bin/types/session/SessionState.js +7 -0
  267. package/bin/types/session/SessionState.js.map +1 -0
  268. package/bin/types/session/SessionSystem.d.ts +26 -0
  269. package/bin/types/session/SessionSystem.d.ts.map +1 -0
  270. package/bin/types/session/SessionSystem.js +7 -0
  271. package/bin/types/session/SessionSystem.js.map +1 -0
  272. package/bin/types/session/SessionTool.d.ts +23 -0
  273. package/bin/types/session/SessionTool.d.ts.map +1 -0
  274. package/bin/types/session/SessionTool.js +7 -0
  275. package/bin/types/session/SessionTool.js.map +1 -0
  276. package/bin/types/session/SessionTurn.d.ts +52 -0
  277. package/bin/types/session/SessionTurn.d.ts.map +1 -0
  278. package/bin/types/session/SessionTurn.js +7 -0
  279. package/bin/types/session/SessionTurn.js.map +1 -0
  280. package/package.json +3 -3
  281. package/scripts/agent-env.test.mjs +4 -18
  282. package/scripts/agent-ready.test.mjs +33 -2
  283. package/scripts/agent-session-maintenance.test.mjs +52 -0
  284. package/scripts/city-model-tool-loop.test.mjs +3 -4
  285. package/scripts/core-engine-context-compaction.test.mjs +5 -22
  286. package/scripts/image-plugin-job.test.mjs +4 -6
  287. package/scripts/plugin-tool-bridge.test.mjs +44 -36
  288. package/scripts/read-image-tool-bridge.test.mjs +71 -0
  289. package/scripts/remote-session-reconnect.test.mjs +1 -34
  290. package/scripts/session-compaction-prompts.test.mjs +1 -49
  291. package/scripts/session-composer.test.mjs +163 -0
  292. package/scripts/session-config-turn-boundary.test.mjs +2 -5
  293. package/scripts/session-list-title.test.mjs +3 -2
  294. package/scripts/session-messages-error.test.mjs +57 -0
  295. package/scripts/{session-recorder.test.mjs → session-messages.test.mjs} +245 -93
  296. package/scripts/session-queue.test.mjs +64 -0
  297. package/scripts/session-shell-approval.test.mjs +171 -0
  298. package/scripts/session-system-blocks.test.mjs +10 -10
  299. package/scripts/session-title-event.test.mjs +1 -0
  300. package/src/agent/Agent.ts +241 -0
  301. package/src/agent/AgentContext.ts +92 -0
  302. package/src/agent/{local/AgentInstructions.ts → AgentInstructions.ts} +0 -11
  303. package/src/{model/CityModelAdapter.ts → agent/AgentModel.ts} +10 -3
  304. package/src/agent/{local/services/AgentSessions.ts → AgentSessions.ts} +81 -110
  305. package/src/agent/AgentState.ts +151 -0
  306. package/src/config/Paths.ts +0 -91
  307. package/src/executor/Executor.ts +180 -386
  308. package/src/executor/README.md +62 -86
  309. package/src/executor/composer/system/default/DefaultSessionSystemComposer.ts +1 -1
  310. package/src/executor/composer/system/default/SystemDomain.ts +4 -2
  311. package/src/executor/composer/system/default/assets/core.prompt.ts +1 -1
  312. package/src/executor/composer/system/default/assets/core.prompt.ts.txt +15 -2
  313. package/src/executor/core-engine/CoreEngineRunner.ts +95 -54
  314. package/src/executor/services/ExecutorRecoveryPolicy.ts +24 -19
  315. package/src/executor/tools/file/ReadImageToolBridge.ts +79 -0
  316. package/src/executor/tools/plugin/PluginToolBridge.ts +6 -8
  317. package/src/executor/tools/plugin/PluginToolDefinition.ts +23 -3
  318. package/src/executor/types/SessionHistoryMeta.ts +0 -2
  319. package/src/index.ts +34 -53
  320. package/src/plugin/core/ActionScheduleExecutor.ts +1 -1
  321. package/src/plugin/core/ActionScheduleRuntime.ts +1 -1
  322. package/src/plugin/core/BasePlugin.ts +7 -3
  323. package/src/plugin/core/HookRegistry.ts +15 -18
  324. package/src/plugin/core/PluginActionFactory.ts +9 -3
  325. package/src/plugin/core/PluginActionRunner.ts +1 -1
  326. package/src/plugin/core/PluginCatalog.ts +1 -1
  327. package/src/plugin/core/PluginHttpRoutes.ts +1 -1
  328. package/src/plugin/core/PluginLocalExecution.ts +11 -24
  329. package/src/plugin/core/PluginRegistry.ts +55 -32
  330. package/src/plugin/core/PluginStateController.ts +1 -1
  331. package/src/{agent/remote → remote}/RemoteAgent.ts +4 -4
  332. package/src/{agent/remote → remote}/RemoteSession.ts +2 -35
  333. package/src/{agent/remote → remote}/RemoteTransport.ts +0 -3
  334. package/src/{agent/remote → remote}/TransportFactory.ts +3 -3
  335. package/src/{agent/remote → remote}/transports/HttpRemoteAgentTransport.ts +1 -23
  336. package/src/{rpc/Client.ts → remote/transports/RpcClient.ts} +1 -19
  337. package/src/{agent/remote → remote}/transports/RpcRemoteAgentTransport.ts +2 -10
  338. package/src/session/DefaultSessionComposer.ts +79 -0
  339. package/src/session/Session.ts +496 -332
  340. package/src/session/{recorder/SessionRecorder.ts → SessionMessages.ts} +324 -428
  341. package/src/session/SessionQueue.ts +86 -0
  342. package/src/session/SessionState.ts +322 -0
  343. package/src/session/SessionSystem.ts +117 -0
  344. package/src/session/SessionTurn.ts +684 -0
  345. package/src/session/approval/SessionApprovalBroker.ts +164 -0
  346. package/src/session/browse/Browse.ts +1 -4
  347. package/src/session/messages/SessionAssistantMessageWriter.ts +345 -0
  348. package/src/session/messages/SessionJsonValue.ts +25 -0
  349. package/src/session/{recorder → messages}/SessionMessageCodec.ts +38 -20
  350. package/src/session/{recorder/SessionRecorderCompaction.ts → messages/SessionMessageCompaction.ts} +30 -69
  351. package/src/session/runtime/SessionEventHub.ts +1 -14
  352. package/src/session/storage/Metadata.ts +60 -34
  353. package/src/session/storage/RuntimeSessionPort.ts +7 -14
  354. package/src/types/agent/AgentOptions.ts +6 -38
  355. package/src/types/agent/AgentState.ts +33 -0
  356. package/src/types/agent/SessionActor.ts +0 -3
  357. package/src/types/agent/SessionTypes.ts +5 -18
  358. package/src/types/executor/SessionRunContext.ts +10 -2
  359. package/src/types/executor/SessionToolExecutionContext.ts +21 -0
  360. package/src/types/plugin/PluginAction.ts +10 -1
  361. package/src/types/plugin/PluginCommand.ts +3 -14
  362. package/src/types/plugin/PluginConfig.ts +13 -0
  363. package/src/types/plugin/PluginDefinition.ts +13 -6
  364. package/src/types/plugin/PluginHttp.ts +1 -1
  365. package/src/types/plugin/PluginRunContext.ts +31 -0
  366. package/src/types/plugin/PluginRuntime.ts +13 -6
  367. package/src/types/plugin/PluginToolRuntime.ts +13 -1
  368. package/src/types/rpc/RpcProtocol.ts +0 -14
  369. package/src/types/session/SessionApproval.ts +4 -43
  370. package/src/types/session/SessionApprovalBroker.ts +18 -0
  371. package/src/types/session/SessionComposer.ts +114 -0
  372. package/src/types/session/SessionLocalState.ts +6 -6
  373. package/src/types/session/SessionMessage.ts +3 -2
  374. package/src/types/session/SessionMessages.ts +127 -0
  375. package/src/types/session/SessionMutation.ts +0 -11
  376. package/src/types/session/SessionOptions.ts +8 -40
  377. package/src/types/session/SessionPort.ts +97 -0
  378. package/src/types/session/SessionQueue.ts +122 -0
  379. package/src/types/session/SessionState.ts +47 -0
  380. package/src/types/session/SessionSystem.ts +27 -0
  381. package/src/types/session/SessionTool.ts +25 -0
  382. package/src/types/session/SessionTurn.ts +56 -0
  383. package/tsconfig.tsbuildinfo +1 -1
  384. package/bin/agent/local/Agent.d.ts.map +0 -1
  385. package/bin/agent/local/Agent.js +0 -216
  386. package/bin/agent/local/Agent.js.map +0 -1
  387. package/bin/agent/local/AgentInstructions.d.ts.map +0 -1
  388. package/bin/agent/local/AgentInstructions.js.map +0 -1
  389. package/bin/agent/local/AgentPluginFactory.d.ts +0 -26
  390. package/bin/agent/local/AgentPluginFactory.d.ts.map +0 -1
  391. package/bin/agent/local/AgentPluginFactory.js +0 -33
  392. package/bin/agent/local/AgentPluginFactory.js.map +0 -1
  393. package/bin/agent/local/AgentRuntimeAssembly.d.ts +0 -10
  394. package/bin/agent/local/AgentRuntimeAssembly.d.ts.map +0 -1
  395. package/bin/agent/local/AgentRuntimeAssembly.js +0 -43
  396. package/bin/agent/local/AgentRuntimeAssembly.js.map +0 -1
  397. package/bin/agent/local/ProjectSetup.d.ts.map +0 -1
  398. package/bin/agent/local/ProjectSetup.js.map +0 -1
  399. package/bin/agent/local/services/AgentAssemblyService.d.ts +0 -105
  400. package/bin/agent/local/services/AgentAssemblyService.d.ts.map +0 -1
  401. package/bin/agent/local/services/AgentAssemblyService.js +0 -184
  402. package/bin/agent/local/services/AgentAssemblyService.js.map +0 -1
  403. package/bin/agent/local/services/AgentBackgroundService.d.ts +0 -55
  404. package/bin/agent/local/services/AgentBackgroundService.d.ts.map +0 -1
  405. package/bin/agent/local/services/AgentBackgroundService.js +0 -85
  406. package/bin/agent/local/services/AgentBackgroundService.js.map +0 -1
  407. package/bin/agent/local/services/AgentSessions.d.ts.map +0 -1
  408. package/bin/agent/local/services/AgentSessions.js.map +0 -1
  409. package/bin/agent/remote/RemoteAgent.d.ts.map +0 -1
  410. package/bin/agent/remote/RemoteAgent.js.map +0 -1
  411. package/bin/agent/remote/RemoteSession.d.ts.map +0 -1
  412. package/bin/agent/remote/RemoteSession.js.map +0 -1
  413. package/bin/agent/remote/RemoteTransport.d.ts.map +0 -1
  414. package/bin/agent/remote/RemoteTransport.js.map +0 -1
  415. package/bin/agent/remote/TransportFactory.d.ts.map +0 -1
  416. package/bin/agent/remote/TransportFactory.js.map +0 -1
  417. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +0 -1
  418. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +0 -1
  419. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts.map +0 -1
  420. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js.map +0 -1
  421. package/bin/executor/SessionRunScope.d.ts +0 -68
  422. package/bin/executor/SessionRunScope.d.ts.map +0 -1
  423. package/bin/executor/SessionRunScope.js +0 -96
  424. package/bin/executor/SessionRunScope.js.map +0 -1
  425. package/bin/executor/composer/compaction/SessionCompactionComposer.d.ts +0 -74
  426. package/bin/executor/composer/compaction/SessionCompactionComposer.d.ts.map +0 -1
  427. package/bin/executor/composer/compaction/SessionCompactionComposer.js +0 -9
  428. package/bin/executor/composer/compaction/SessionCompactionComposer.js.map +0 -1
  429. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.d.ts +0 -27
  430. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.d.ts.map +0 -1
  431. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.js +0 -39
  432. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.js.map +0 -1
  433. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.d.ts +0 -44
  434. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.d.ts.map +0 -1
  435. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.js +0 -218
  436. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.js.map +0 -1
  437. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.d.ts +0 -27
  438. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.d.ts.map +0 -1
  439. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.js +0 -181
  440. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.js.map +0 -1
  441. package/bin/executor/composer/context/LocalSessionContextComposer.d.ts +0 -50
  442. package/bin/executor/composer/context/LocalSessionContextComposer.d.ts.map +0 -1
  443. package/bin/executor/composer/context/LocalSessionContextComposer.js +0 -108
  444. package/bin/executor/composer/context/LocalSessionContextComposer.js.map +0 -1
  445. package/bin/executor/composer/context/SessionContextComposer.d.ts +0 -67
  446. package/bin/executor/composer/context/SessionContextComposer.d.ts.map +0 -1
  447. package/bin/executor/composer/context/SessionContextComposer.js +0 -9
  448. package/bin/executor/composer/context/SessionContextComposer.js.map +0 -1
  449. package/bin/executor/composer/history/SessionHistoryComposer.d.ts +0 -54
  450. package/bin/executor/composer/history/SessionHistoryComposer.d.ts.map +0 -1
  451. package/bin/executor/composer/history/SessionHistoryComposer.js +0 -10
  452. package/bin/executor/composer/history/SessionHistoryComposer.js.map +0 -1
  453. package/bin/executor/composer/history/SessionHistoryWriter.d.ts +0 -46
  454. package/bin/executor/composer/history/SessionHistoryWriter.d.ts.map +0 -1
  455. package/bin/executor/composer/history/SessionHistoryWriter.js +0 -65
  456. package/bin/executor/composer/history/SessionHistoryWriter.js.map +0 -1
  457. package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.d.ts +0 -35
  458. package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.d.ts.map +0 -1
  459. package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.js +0 -105
  460. package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.js.map +0 -1
  461. package/bin/executor/messages/AssistantResultPersistence.d.ts +0 -66
  462. package/bin/executor/messages/AssistantResultPersistence.d.ts.map +0 -1
  463. package/bin/executor/messages/AssistantResultPersistence.js +0 -44
  464. package/bin/executor/messages/AssistantResultPersistence.js.map +0 -1
  465. package/bin/executor/services/ExecutorInflightService.d.ts +0 -34
  466. package/bin/executor/services/ExecutorInflightService.d.ts.map +0 -1
  467. package/bin/executor/services/ExecutorInflightService.js +0 -73
  468. package/bin/executor/services/ExecutorInflightService.js.map +0 -1
  469. package/bin/executor/store/history/SessionHistoryStore.d.ts +0 -140
  470. package/bin/executor/store/history/SessionHistoryStore.d.ts.map +0 -1
  471. package/bin/executor/store/history/SessionHistoryStore.js +0 -10
  472. package/bin/executor/store/history/SessionHistoryStore.js.map +0 -1
  473. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts +0 -116
  474. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts.map +0 -1
  475. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js +0 -709
  476. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js.map +0 -1
  477. package/bin/executor/types/SessionHistoryPaths.d.ts +0 -34
  478. package/bin/executor/types/SessionHistoryPaths.d.ts.map +0 -1
  479. package/bin/executor/types/SessionHistoryPaths.js +0 -2
  480. package/bin/executor/types/SessionHistoryPaths.js.map +0 -1
  481. package/bin/model/CityModelAdapter.d.ts.map +0 -1
  482. package/bin/model/CityModelAdapter.js.map +0 -1
  483. package/bin/rpc/Client.d.ts.map +0 -1
  484. package/bin/rpc/Client.js.map +0 -1
  485. package/bin/session/SessionSystemBuilder.d.ts +0 -107
  486. package/bin/session/SessionSystemBuilder.d.ts.map +0 -1
  487. package/bin/session/SessionSystemBuilder.js +0 -148
  488. package/bin/session/SessionSystemBuilder.js.map +0 -1
  489. package/bin/session/recorder/SessionMessageCodec.d.ts.map +0 -1
  490. package/bin/session/recorder/SessionMessageCodec.js.map +0 -1
  491. package/bin/session/recorder/SessionRecorder.d.ts +0 -217
  492. package/bin/session/recorder/SessionRecorder.d.ts.map +0 -1
  493. package/bin/session/recorder/SessionRecorder.js.map +0 -1
  494. package/bin/session/recorder/SessionRecorderCompaction.d.ts +0 -18
  495. package/bin/session/recorder/SessionRecorderCompaction.d.ts.map +0 -1
  496. package/bin/session/recorder/SessionRecorderCompaction.js.map +0 -1
  497. package/bin/session/recorder/SessionRecorderHistoryStore.d.ts +0 -66
  498. package/bin/session/recorder/SessionRecorderHistoryStore.d.ts.map +0 -1
  499. package/bin/session/recorder/SessionRecorderHistoryStore.js +0 -190
  500. package/bin/session/recorder/SessionRecorderHistoryStore.js.map +0 -1
  501. package/bin/session/runtime/SessionPromptRuntime.d.ts +0 -112
  502. package/bin/session/runtime/SessionPromptRuntime.d.ts.map +0 -1
  503. package/bin/session/runtime/SessionPromptRuntime.js +0 -357
  504. package/bin/session/runtime/SessionPromptRuntime.js.map +0 -1
  505. package/bin/session/services/SessionStateService.d.ts +0 -187
  506. package/bin/session/services/SessionStateService.d.ts.map +0 -1
  507. package/bin/session/services/SessionStateService.js +0 -467
  508. package/bin/session/services/SessionStateService.js.map +0 -1
  509. package/bin/session/services/SessionTurnService.d.ts +0 -90
  510. package/bin/session/services/SessionTurnService.d.ts.map +0 -1
  511. package/bin/session/services/SessionTurnService.js +0 -293
  512. package/bin/session/services/SessionTurnService.js.map +0 -1
  513. package/bin/session/services/SessionViewService.d.ts +0 -114
  514. package/bin/session/services/SessionViewService.d.ts.map +0 -1
  515. package/bin/session/services/SessionViewService.js +0 -204
  516. package/bin/session/services/SessionViewService.js.map +0 -1
  517. package/bin/session/storage/Persistence.d.ts +0 -73
  518. package/bin/session/storage/Persistence.d.ts.map +0 -1
  519. package/bin/session/storage/Persistence.js +0 -63
  520. package/bin/session/storage/Persistence.js.map +0 -1
  521. package/bin/types/agent/AgentRuntimeAssembly.d.ts +0 -72
  522. package/bin/types/agent/AgentRuntimeAssembly.d.ts.map +0 -1
  523. package/bin/types/agent/AgentRuntimeAssembly.js +0 -10
  524. package/bin/types/agent/AgentRuntimeAssembly.js.map +0 -1
  525. package/bin/types/runtime/agent/AgentContext.d.ts +0 -306
  526. package/bin/types/runtime/agent/AgentContext.d.ts.map +0 -1
  527. package/bin/types/runtime/agent/AgentContext.js +0 -128
  528. package/bin/types/runtime/agent/AgentContext.js.map +0 -1
  529. package/bin/types/session/SessionComposerOptions.d.ts +0 -90
  530. package/bin/types/session/SessionComposerOptions.d.ts.map +0 -1
  531. package/bin/types/session/SessionComposerOptions.js +0 -10
  532. package/bin/types/session/SessionComposerOptions.js.map +0 -1
  533. package/bin/types/session/SessionQueueCommand.d.ts +0 -68
  534. package/bin/types/session/SessionQueueCommand.d.ts.map +0 -1
  535. package/bin/types/session/SessionQueueCommand.js +0 -10
  536. package/bin/types/session/SessionQueueCommand.js.map +0 -1
  537. package/scripts/session-action-message.test.mjs +0 -410
  538. package/scripts/session-compaction-context-window.test.mjs +0 -96
  539. package/scripts/session-history-inflight.test.mjs +0 -146
  540. package/scripts/session-history-writer-error.test.mjs +0 -57
  541. package/scripts/session-prompt-runtime.test.mjs +0 -390
  542. package/src/agent/local/Agent.ts +0 -250
  543. package/src/agent/local/AgentPluginFactory.ts +0 -51
  544. package/src/agent/local/AgentRuntimeAssembly.ts +0 -65
  545. package/src/agent/local/services/AgentAssemblyService.ts +0 -307
  546. package/src/agent/local/services/AgentBackgroundService.ts +0 -115
  547. package/src/executor/SessionRunScope.ts +0 -122
  548. package/src/executor/composer/compaction/SessionCompactionComposer.ts +0 -84
  549. package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.ts +0 -51
  550. package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.ts +0 -294
  551. package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.ts +0 -197
  552. package/src/executor/composer/context/LocalSessionContextComposer.ts +0 -175
  553. package/src/executor/composer/context/SessionContextComposer.ts +0 -83
  554. package/src/executor/composer/history/SessionHistoryComposer.ts +0 -62
  555. package/src/executor/composer/history/SessionHistoryWriter.ts +0 -100
  556. package/src/executor/composer/history/jsonl/JsonlSessionHistoryComposer.ts +0 -133
  557. package/src/executor/messages/AssistantResultPersistence.ts +0 -106
  558. package/src/executor/services/ExecutorInflightService.ts +0 -95
  559. package/src/executor/store/history/SessionHistoryStore.ts +0 -172
  560. package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +0 -879
  561. package/src/executor/types/SessionHistoryPaths.ts +0 -38
  562. package/src/session/SessionSystemBuilder.ts +0 -262
  563. package/src/session/recorder/SessionRecorderHistoryStore.ts +0 -256
  564. package/src/session/runtime/SessionPromptRuntime.ts +0 -518
  565. package/src/session/services/SessionStateService.ts +0 -628
  566. package/src/session/services/SessionTurnService.ts +0 -368
  567. package/src/session/services/SessionViewService.ts +0 -335
  568. package/src/session/storage/Persistence.ts +0 -137
  569. package/src/types/agent/AgentRuntimeAssembly.ts +0 -74
  570. package/src/types/runtime/agent/AgentContext.ts +0 -387
  571. package/src/types/session/SessionComposerOptions.ts +0 -107
  572. package/src/types/session/SessionQueueCommand.ts +0 -78
  573. /package/bin/{agent/local → config}/ProjectSetup.d.ts +0 -0
  574. /package/bin/{agent/remote → remote}/RemoteTransport.js +0 -0
  575. /package/bin/session/{recorder → messages}/JsonlSessionMessageStore.d.ts +0 -0
  576. /package/bin/session/{recorder → messages}/JsonlSessionMessageStore.js +0 -0
  577. /package/src/{agent/local → config}/ProjectSetup.ts +0 -0
  578. /package/src/session/{recorder → messages}/JsonlSessionMessageStore.ts +0 -0
@@ -1,22 +1,32 @@
1
1
  /**
2
- * SessionRecorder:Session Message 的唯一持久化与发布入口。
2
+ * SessionMessages:Session Message 的唯一领域入口。
3
3
  *
4
4
  * 完整 Message 与 Assistant 草稿先持久化,成功后再发布实时 Mutation。
5
+ * 同一 Assistant Message 的流式、审批与关闭操作共享一条写队列,保证 revision
6
+ * 从最新快照严格递增。
5
7
  */
6
- import { generateId } from "../../utils/Id.js";
8
+ import { generateId } from "../utils/Id.js";
9
+ import { SessionAssistantMessageWriter } from "../session/messages/SessionAssistantMessageWriter.js";
10
+ import { to_session_json_value } from "../session/messages/SessionJsonValue.js";
11
+ import { is_session_action_record } from "../executor/types/SessionRecords.js";
12
+ import { from_ui_assistant_parts, from_ui_user_parts, to_executor_ui_message, } from "../session/messages/SessionMessageCodec.js";
13
+ import { hydrateUserPromptFileParts } from "../executor/messages/SessionAttachmentMapper.js";
14
+ export { SessionAssistantMessageWriter } from "../session/messages/SessionAssistantMessageWriter.js";
7
15
  /** 唯一 Session Message 写入服务。 */
8
- export class SessionRecorder {
16
+ export class SessionMessages {
9
17
  session_id;
10
18
  store;
11
19
  publish;
12
20
  messages_by_id = new Map();
21
+ /** 按 Assistant Message 隔离的完整写事务链。 */
22
+ assistant_write_chains = new Map();
13
23
  initialized = false;
14
24
  constructor(options) {
15
25
  this.session_id = String(options.session_id || "").trim();
16
26
  this.store = options.store;
17
27
  this.publish = options.publish;
18
28
  if (!this.session_id)
19
- throw new Error("SessionRecorder requires session_id");
29
+ throw new Error("SessionMessages requires session_id");
20
30
  }
21
31
  /** 恢复已有 Message,并收口进程中断遗留的运行状态。 */
22
32
  async initialize() {
@@ -101,6 +111,140 @@ export class SessionRecorder {
101
111
  await writer.complete();
102
112
  return this.get_message(writer.message_id);
103
113
  }
114
+ /** 把内部 Executor Record 收口为 canonical Session Message。 */
115
+ async append_record(record) {
116
+ if (is_session_action_record(record)) {
117
+ const action = record;
118
+ const existing = this.get_message(action.id);
119
+ if (existing?.type === "action") {
120
+ if (action.state !== "running") {
121
+ await this.update_action_message(action.id, action.state, {
122
+ title: action.title,
123
+ description: action.description,
124
+ });
125
+ }
126
+ return;
127
+ }
128
+ const writer = await this.open_action_message({
129
+ message_id: action.id,
130
+ turn_id: action.metadata.turnId,
131
+ action_type: String(action.id || "").split(":")[0] || "action",
132
+ title: action.title,
133
+ description: action.description,
134
+ });
135
+ if (action.state === "completed")
136
+ await writer.complete();
137
+ if (action.state === "failed") {
138
+ await writer.fail(action.description || action.title);
139
+ }
140
+ return;
141
+ }
142
+ const turn_id = String(record.metadata?.turnId || `external:${this.session_id}:${generateId()}`);
143
+ if (record.role === "user") {
144
+ await this.append_user_message({
145
+ turn_id,
146
+ input_type: record.metadata?.extra?.inputType === "steer" ? "steer" : "prompt",
147
+ parts: from_ui_user_parts(record.parts),
148
+ });
149
+ return;
150
+ }
151
+ await this.append_completed_assistant_message({
152
+ turn_id,
153
+ parts: from_ui_assistant_parts(record.parts),
154
+ visibility: record.metadata?.extra?.visibility === "internal"
155
+ ? "internal"
156
+ : "visible",
157
+ kind: record.metadata?.kind === "summary" ? "summary" : "normal",
158
+ });
159
+ }
160
+ /** 把公开 Session API 的 User 输入转换为 canonical Message 并持久化。 */
161
+ async append_external_user_message(input) {
162
+ const parts = input.message && "role" in input.message
163
+ ? from_ui_user_parts(input.message.parts)
164
+ : [{
165
+ part_id: `external-user-text:${Date.now()}`,
166
+ type: "text",
167
+ text: String(input.text || "").trim(),
168
+ state: "done",
169
+ }];
170
+ if (parts.length === 0)
171
+ return false;
172
+ await this.append_user_message({
173
+ turn_id: `external:${this.session_id}:${Date.now()}`,
174
+ input_type: "prompt",
175
+ parts,
176
+ });
177
+ return true;
178
+ }
179
+ /** 把公开 Session API 的 Assistant 输入转换为 canonical Message 并持久化。 */
180
+ async append_external_assistant_message(input) {
181
+ const parts = input.message && "role" in input.message
182
+ ? from_ui_assistant_parts(input.message.parts)
183
+ : [{
184
+ part_id: `external-assistant-text:${Date.now()}`,
185
+ sequence: 1,
186
+ type: "text",
187
+ text: String(input.fallback_text || "").trim(),
188
+ state: "done",
189
+ }];
190
+ if (parts.length === 0)
191
+ return false;
192
+ await this.append_completed_assistant_message({ parts });
193
+ return true;
194
+ }
195
+ /** 把 Session prompt 转换为 canonical User Message 并持久化。 */
196
+ async append_prompt_message(input) {
197
+ const query = input.prompt.query;
198
+ const ui_parts = typeof query === "string"
199
+ ? [{ type: "text", text: query.trim() }]
200
+ : await hydrateUserPromptFileParts(Array.isArray(query) ? query : [], input.project_root);
201
+ const canonical = await this.append_user_message({
202
+ turn_id: input.turn_id,
203
+ input_type: input.input_type,
204
+ parts: normalize_session_user_parts(ui_parts),
205
+ });
206
+ return to_executor_ui_message(canonical);
207
+ }
208
+ /** 持久化 Executor 在本轮延迟产生的 User Message。 */
209
+ async append_deferred_user_messages(deferred_messages) {
210
+ const messages = Array.isArray(deferred_messages)
211
+ ? deferred_messages
212
+ : [];
213
+ for (const message of messages) {
214
+ await this.append_user_message({
215
+ turn_id: String(message.metadata?.turnId ||
216
+ `deferred:${this.session_id}:${Date.now()}`),
217
+ input_type: "steer",
218
+ parts: from_ui_user_parts(message.parts),
219
+ });
220
+ }
221
+ return messages.length;
222
+ }
223
+ /** 按稳定 Action ID 创建或更新 canonical Action Message。 */
224
+ async persist_action_record(event) {
225
+ const existing = this.get_message(event.id);
226
+ if (!existing) {
227
+ const writer = await this.open_action_message({
228
+ message_id: event.id,
229
+ turn_id: event.metadata.turnId,
230
+ action_type: infer_action_type(event.id),
231
+ title: event.title,
232
+ description: event.description,
233
+ });
234
+ if (event.state === "completed")
235
+ await writer.complete();
236
+ if (event.state === "failed") {
237
+ await writer.fail(event.description || event.title);
238
+ }
239
+ return;
240
+ }
241
+ if (existing.type === "action" && event.state !== "running") {
242
+ await this.update_action_message(event.id, event.state, {
243
+ title: event.title,
244
+ description: event.description,
245
+ });
246
+ }
247
+ }
104
248
  /** 创建 running Action Message。 */
105
249
  async open_action_message(input) {
106
250
  const message = (await this.create_message((sequence, created_at) => ({
@@ -258,6 +402,12 @@ export class SessionRecorder {
258
402
  async append_assistant_delta(message_id, part_id, type, delta) {
259
403
  if (!delta)
260
404
  return;
405
+ await this.enqueue_assistant_write(message_id, async () => {
406
+ await this.append_assistant_delta_serialized(message_id, part_id, type, delta);
407
+ });
408
+ }
409
+ /** 在 Assistant 写队列内追加文本 delta。 */
410
+ async append_assistant_delta_serialized(message_id, part_id, type, delta) {
261
411
  const current = require_message([...this.messages_by_id.values()], message_id, "assistant");
262
412
  require_streaming_assistant(current);
263
413
  const part = current.parts.find((item) => item.part_id === part_id);
@@ -291,6 +441,12 @@ export class SessionRecorder {
291
441
  }
292
442
  /** @internal 写入 Assistant 完整 part。 */
293
443
  async update_assistant_part(message_id, part) {
444
+ await this.enqueue_assistant_write(message_id, async () => {
445
+ await this.update_assistant_part_serialized(message_id, part);
446
+ });
447
+ }
448
+ /** 在 Assistant 写队列内提交完整 Part 快照。 */
449
+ async update_assistant_part_serialized(message_id, part) {
294
450
  const current = require_message([...this.messages_by_id.values()], message_id, "assistant");
295
451
  require_streaming_assistant(current);
296
452
  const existing = current.parts.find((item) => item.part_id === part.part_id);
@@ -323,6 +479,12 @@ export class SessionRecorder {
323
479
  }
324
480
  /** @internal 收口 Assistant Message。 */
325
481
  async complete_assistant_message(message_id, status) {
482
+ await this.enqueue_assistant_write(message_id, async () => {
483
+ await this.complete_assistant_message_serialized(message_id, status);
484
+ });
485
+ }
486
+ /** 在 Assistant 写队列内关闭草稿并写入 Active。 */
487
+ async complete_assistant_message_serialized(message_id, status) {
326
488
  const current = require_message([...this.messages_by_id.values()], message_id, "assistant");
327
489
  require_streaming_assistant(current);
328
490
  const created_at = Date.now();
@@ -338,30 +500,8 @@ export class SessionRecorder {
338
500
  await this.store.finalize_assistant_message(message);
339
501
  this.accept_message(message);
340
502
  }
341
- /** @internal 将 Shell Runtime 审批请求更新到当前 Tool Part。 */
342
- async require_tool_approval(input) {
343
- const tool = this.find_streaming_tool(input.tool_call_id);
344
- await this.update_assistant_part(tool.message_id, {
345
- ...tool.part,
346
- state: "approval-required",
347
- approval_id: input.approval_id,
348
- });
349
- }
350
- /** @internal 将审批结果更新到当前 Tool Part。 */
351
- async resolve_tool_approval(input) {
352
- const tool = this.find_streaming_tool(input.tool_call_id);
353
- if (tool.part.approval_id && tool.part.approval_id !== input.approval_id) {
354
- throw new Error(`Tool approval identity mismatch: ${input.approval_id}`);
355
- }
356
- await this.update_assistant_part(tool.message_id, {
357
- ...tool.part,
358
- state: input.decision === "approved" ? "running" : "failed",
359
- ...(input.decision === "approved"
360
- ? {}
361
- : { error: input.decision === "expired" ? "Approval expired" : "Approval denied" }),
362
- });
363
- }
364
503
  async create_message(factory, draft = false) {
504
+ await this.ensure_initialized();
365
505
  if (draft) {
366
506
  const message = await this.store.create_assistant_message((state) => {
367
507
  const candidate = factory(state.message_sequence, Date.now());
@@ -377,6 +517,7 @@ export class SessionRecorder {
377
517
  this.accept_message(message);
378
518
  return message;
379
519
  }
520
+ /** 读取当前流式 Assistant 中的指定 Tool Part。 */
380
521
  find_streaming_tool(tool_call_id) {
381
522
  for (const message of this.messages_by_id.values()) {
382
523
  if (message.type !== "assistant" || message.status !== "streaming")
@@ -385,6 +526,74 @@ export class SessionRecorder {
385
526
  if (part)
386
527
  return { message_id: message.message_id, part };
387
528
  }
529
+ return undefined;
530
+ }
531
+ /** 把完整审批请求写入对应的流式 Tool Part。 */
532
+ async request_tool_approval(approval) {
533
+ const { message_id } = this.require_streaming_tool(approval.tool_call_id);
534
+ await this.enqueue_assistant_write(message_id, async () => {
535
+ const tool = this.require_streaming_tool(approval.tool_call_id);
536
+ if (tool.message_id !== message_id) {
537
+ throw new Error(`Tool Assistant Message changed: ${approval.tool_call_id}`);
538
+ }
539
+ if (tool.part.state !== "ready") {
540
+ throw new Error(`Tool approval requires ready input: ${approval.tool_call_id} (${tool.part.state})`);
541
+ }
542
+ await this.update_assistant_part_serialized(message_id, {
543
+ ...tool.part,
544
+ state: "approval-required",
545
+ approval,
546
+ });
547
+ });
548
+ }
549
+ /** 在 Tool 恢复执行前提交审批决定对应的 Part 状态。 */
550
+ async resolve_tool_approval(input) {
551
+ const { message_id } = this.require_streaming_tool(input.tool_call_id);
552
+ await this.enqueue_assistant_write(message_id, async () => {
553
+ const tool = this.require_streaming_tool(input.tool_call_id);
554
+ if (tool.message_id !== message_id) {
555
+ throw new Error(`Tool Assistant Message changed: ${input.tool_call_id}`);
556
+ }
557
+ if (tool.part.approval?.approval_id !== input.approval_id) {
558
+ throw new Error(`Tool approval identity mismatch: ${input.approval_id}`);
559
+ }
560
+ await this.update_assistant_part_serialized(message_id, {
561
+ ...tool.part,
562
+ state: input.decision === "approved" ? "running" : "failed",
563
+ ...(input.decision === "approved"
564
+ ? {}
565
+ : {
566
+ error: input.decision === "expired"
567
+ ? "Approval expired"
568
+ : "Approval denied",
569
+ }),
570
+ });
571
+ });
572
+ }
573
+ /**
574
+ * 串行执行同一 Assistant Message 的完整写事务。
575
+ *
576
+ * 失败事务不会阻塞后续写入;链尾仅用于排序,真实错误仍返回给调用方。
577
+ */
578
+ async enqueue_assistant_write(message_id, operation) {
579
+ const previous = this.assistant_write_chains.get(message_id) || Promise.resolve();
580
+ const result = previous.then(operation, operation);
581
+ const chain = result.then(() => undefined, () => undefined);
582
+ this.assistant_write_chains.set(message_id, chain);
583
+ try {
584
+ return await result;
585
+ }
586
+ finally {
587
+ if (this.assistant_write_chains.get(message_id) === chain) {
588
+ this.assistant_write_chains.delete(message_id);
589
+ }
590
+ }
591
+ }
592
+ /** 查找当前流式 Assistant 中的 Tool Part,否则抛出明确错误。 */
593
+ require_streaming_tool(tool_call_id) {
594
+ const tool = this.find_streaming_tool(tool_call_id);
595
+ if (tool)
596
+ return tool;
388
597
  throw new Error(`Streaming Tool Part not found: ${tool_call_id}`);
389
598
  }
390
599
  build_message_mutation(message) {
@@ -413,265 +622,27 @@ export class SessionRecorder {
413
622
  await this.initialize();
414
623
  }
415
624
  }
416
- /** 单个 Assistant segment 的流式 writer。 */
417
- export class SessionAssistantMessageWriter {
418
- message_id;
419
- recorder;
420
- pending_text_parts = new Map();
421
- active_text_part_ids = new Map();
422
- closed = false;
423
- constructor(recorder, message_id) {
424
- this.recorder = recorder;
425
- this.message_id = message_id;
426
- }
427
- /** 应用一个原始 AI SDK UI chunk。 */
428
- async apply_chunk(chunk) {
429
- if (this.closed)
430
- throw new Error("Assistant Message writer is closed");
431
- const current = this.current_message();
432
- switch (chunk.type) {
433
- case "text-start":
434
- case "reasoning-start": {
435
- const type = chunk.type === "text-start" ? "text" : "reasoning";
436
- const part_id = this.resolve_text_part_id(type, chunk.id);
437
- if (!current.parts.some((part) => part.part_id === part_id)) {
438
- this.pending_text_parts.set(part_id, type);
439
- }
440
- return;
441
- }
442
- case "text-delta":
443
- case "reasoning-delta": {
444
- const type = chunk.type === "text-delta" ? "text" : "reasoning";
445
- const part_id = this.resolve_text_part_id(type, chunk.id);
446
- await this.ensure_text_part(part_id, type);
447
- await this.recorder.append_assistant_delta(this.message_id, part_id, type, chunk.delta);
448
- return;
449
- }
450
- case "text-end":
451
- case "reasoning-end": {
452
- const type = chunk.type === "text-end" ? "text" : "reasoning";
453
- const source_part_id = this.source_text_part_id(type, chunk.id);
454
- const part_id = this.active_text_part_ids.get(source_part_id);
455
- if (!part_id)
456
- return;
457
- const part = current.parts.find((item) => item.part_id === part_id);
458
- if (part?.type === "text" || part?.type === "reasoning") {
459
- await this.upsert_part({ ...part, state: "done" });
460
- }
461
- else {
462
- this.pending_text_parts.delete(part_id);
463
- }
464
- this.active_text_part_ids.delete(source_part_id);
465
- return;
466
- }
467
- case "tool-input-start":
468
- await this.upsert_tool(chunk.toolCallId, {
469
- tool_name: chunk.toolName,
470
- state: "input-streaming",
471
- input_text: "",
472
- });
473
- return;
474
- case "tool-input-delta": {
475
- const tool = this.find_tool(chunk.toolCallId);
476
- await this.upsert_tool(chunk.toolCallId, {
477
- tool_name: tool?.tool_name || "unknown",
478
- state: "input-streaming",
479
- input_text: `${tool?.input_text || ""}${chunk.inputTextDelta}`,
480
- });
481
- return;
482
- }
483
- case "tool-input-available":
484
- await this.upsert_tool(chunk.toolCallId, {
485
- tool_name: chunk.toolName,
486
- state: "ready",
487
- input: to_json_value(chunk.input),
488
- });
489
- return;
490
- case "tool-input-error":
491
- await this.upsert_tool(chunk.toolCallId, {
492
- tool_name: chunk.toolName,
493
- state: "failed",
494
- input: to_json_value(chunk.input),
495
- error: chunk.errorText,
496
- });
497
- return;
498
- case "tool-approval-request": {
499
- const tool = this.find_tool(chunk.toolCallId);
500
- await this.upsert_tool(chunk.toolCallId, {
501
- tool_name: tool?.tool_name || "unknown",
502
- state: "approval-required",
503
- approval_id: chunk.approvalId,
504
- });
505
- return;
506
- }
507
- case "tool-output-available": {
508
- const tool = this.find_tool(chunk.toolCallId);
509
- await this.upsert_tool(chunk.toolCallId, {
510
- tool_name: tool?.tool_name || "unknown",
511
- state: "completed",
512
- output: to_json_value(chunk.output),
513
- });
514
- return;
515
- }
516
- case "tool-output-error":
517
- case "tool-output-denied": {
518
- const tool = this.find_tool(chunk.toolCallId);
519
- await this.upsert_tool(chunk.toolCallId, {
520
- tool_name: tool?.tool_name || "unknown",
521
- state: "failed",
522
- error: chunk.type === "tool-output-error"
523
- ? chunk.errorText
524
- : "Tool output denied",
525
- });
526
- return;
527
- }
528
- case "file":
529
- await this.append_file_part({
530
- media_type: chunk.mediaType,
531
- url: chunk.url,
532
- });
533
- return;
534
- default:
535
- return;
536
- }
537
- }
538
- /** 写入一个完整 Assistant part。 */
539
- async upsert_part(part) {
540
- await this.recorder.update_assistant_part(this.message_id, part);
541
- }
542
- /**
543
- * 把最终结果中的文件补入当前 Assistant,并对流式已写入文件去重。
544
- */
545
- async append_file_part(input) {
546
- const filename = String(input.filename || "").trim();
547
- const current = this.current_message();
548
- const existing = current.parts.find((part) => part.type === "file" &&
549
- part.url === input.url &&
550
- part.media_type === input.media_type);
551
- if (existing?.type === "file") {
552
- if (filename && String(existing.filename || "").trim() !== filename) {
553
- await this.upsert_part({ ...existing, filename });
554
- }
555
- return;
556
- }
557
- await this.upsert_part({
558
- part_id: `file:${generateId()}`,
559
- sequence: this.next_part_sequence(),
560
- type: "file",
561
- media_type: input.media_type,
562
- url: input.url,
563
- ...(filename ? { filename } : {}),
564
- });
565
- }
566
- /** 当前实现逐 chunk 等待落盘,因此 flush 在返回时天然完成。 */
567
- async flush() { }
568
- /** 正常完成当前 assistant segment。 */
569
- async complete() {
570
- await this.close("completed");
571
- }
572
- /** 停止当前 assistant segment,并保留已有 parts。 */
573
- async stop() {
574
- await this.close("stopped");
575
- }
576
- /** 以失败状态关闭当前 assistant segment。 */
577
- async fail(_error) {
578
- await this.close("failed");
579
- }
580
- current_message() {
581
- const message = this.recorder.get_message(this.message_id);
582
- if (!message || message.type !== "assistant") {
583
- throw new Error(`Assistant Message not found: ${this.message_id}`);
584
- }
585
- return message;
586
- }
587
- find_tool(tool_call_id) {
588
- return this.current_message().parts.find((part) => part.type === "tool" && part.tool_call_id === tool_call_id);
589
- }
590
- next_part_sequence() {
591
- return this.current_message().parts.reduce((value, part) => Math.max(value, part.sequence + 1), 1);
592
- }
593
- /**
594
- * 把 AI SDK 当前 stream 内的临时 chunk ID 映射为 Message 内唯一 Part ID。
595
- *
596
- * AI SDK 会在不同 `streamText()` 调用中重复使用 `txt-0`、`reasoning-0`
597
- * 等 ID,因此这些 ID 只能用于关联当前尚未结束的文本片段。
598
- */
599
- resolve_text_part_id(type, chunk_id) {
600
- const source_part_id = this.source_text_part_id(type, chunk_id);
601
- const active_part_id = this.active_text_part_ids.get(source_part_id);
602
- if (active_part_id)
603
- return active_part_id;
604
- const part_id = `${type}:${generateId()}`;
605
- this.active_text_part_ids.set(source_part_id, part_id);
606
- return part_id;
607
- }
608
- /** 构造当前流片段使用的临时关联键。 */
609
- source_text_part_id(type, chunk_id) {
610
- return `${type}:${chunk_id}`;
611
- }
612
- /** 在首个有效 Delta 到达时才固定文本 Part 的真实顺序。 */
613
- async ensure_text_part(part_id, type) {
614
- const existing = this.current_message().parts.find((part) => part.part_id === part_id);
615
- if (existing) {
616
- if (existing.type !== type) {
617
- throw new Error(`Assistant Part type changed: ${part_id}`);
618
- }
619
- return;
620
- }
621
- const pending_type = this.pending_text_parts.get(part_id);
622
- if (pending_type && pending_type !== type) {
623
- throw new Error(`Assistant pending Part type changed: ${part_id}`);
624
- }
625
- await this.upsert_part({
626
- part_id,
627
- sequence: this.next_part_sequence(),
628
- type,
629
- text: "",
630
- state: "streaming",
631
- });
632
- this.pending_text_parts.delete(part_id);
633
- }
634
- async upsert_tool(tool_call_id, changes) {
635
- const current = this.find_tool(tool_call_id);
636
- await this.upsert_part({
637
- ...(current || {}),
638
- part_id: `tool:${tool_call_id}`,
639
- sequence: current?.sequence || this.next_part_sequence(),
640
- type: "tool",
641
- tool_call_id,
642
- ...changes,
643
- });
644
- }
645
- async close(status) {
646
- if (this.closed)
647
- return;
648
- this.pending_text_parts.clear();
649
- this.active_text_part_ids.clear();
650
- await this.recorder.complete_assistant_message(this.message_id, status);
651
- this.closed = true;
652
- }
653
- }
654
625
  /** 单个 Action Message 的生命周期 writer。 */
655
626
  export class SessionActionMessageWriter {
656
627
  message_id;
657
- recorder;
628
+ messages;
658
629
  closed = false;
659
- constructor(recorder, message_id) {
660
- this.recorder = recorder;
630
+ constructor(messages, message_id) {
631
+ this.messages = messages;
661
632
  this.message_id = message_id;
662
633
  }
663
634
  /** 把 Action 更新为 completed。 */
664
635
  async complete(input) {
665
636
  if (this.closed)
666
637
  return;
667
- await this.recorder.update_action_message(this.message_id, "completed", input);
638
+ await this.messages.update_action_message(this.message_id, "completed", input);
668
639
  this.closed = true;
669
640
  }
670
641
  /** 把 Action 更新为 failed。 */
671
642
  async fail(error) {
672
643
  if (this.closed)
673
644
  return;
674
- await this.recorder.update_action_message(this.message_id, "failed", {
645
+ await this.messages.update_action_message(this.message_id, "failed", {
675
646
  description: error instanceof Error ? error.message : String(error),
676
647
  });
677
648
  this.closed = true;
@@ -707,7 +678,7 @@ export function normalize_session_user_parts(parts) {
707
678
  part_id: `user-data:${index + 1}`,
708
679
  type: "data",
709
680
  data_type: String(candidate.type),
710
- data: to_json_value(candidate.data),
681
+ data: to_session_json_value(candidate.data),
711
682
  }];
712
683
  }
713
684
  return [];
@@ -729,18 +700,6 @@ function require_streaming_assistant(message) {
729
700
  }
730
701
  return message;
731
702
  }
732
- function to_json_value(input) {
733
- if (input === undefined || input === null)
734
- return null;
735
- if (typeof input === "string" || typeof input === "number" || typeof input === "boolean")
736
- return input;
737
- try {
738
- return JSON.parse(JSON.stringify(input));
739
- }
740
- catch {
741
- return String(input);
742
- }
743
- }
744
703
  function resolve_import_id(map, source_id, prefix) {
745
704
  const existing = map.get(source_id);
746
705
  if (existing)
@@ -749,8 +708,12 @@ function resolve_import_id(map, source_id, prefix) {
749
708
  map.set(source_id, created);
750
709
  return created;
751
710
  }
711
+ /** 从 Action Message ID 提取稳定业务类型。 */
712
+ function infer_action_type(message_id) {
713
+ return String(message_id || "").split(":")[0] || "action";
714
+ }
752
715
  /** 按真实 Message sequence 升序排序。 */
753
716
  function compare_message_sequence(left, right) {
754
717
  return left.sequence - right.sequence;
755
718
  }
756
- //# sourceMappingURL=SessionRecorder.js.map
719
+ //# sourceMappingURL=SessionMessages.js.map