@downcity/agent 1.1.237 → 1.1.258

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 +21 -20
  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 +117 -0
  137. package/bin/session/SessionMessages.d.ts.map +1 -0
  138. package/bin/session/{recorder/SessionRecorder.js → SessionMessages.js} +194 -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} +131 -90
  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 +29 -89
  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} +254 -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,96 +0,0 @@
1
- /**
2
- * @file 验证 CityModel 上下文窗口元数据与 compact 的明确触发语义。
3
- *
4
- * 关键点(中文)
5
- * - CityModel 目录元数据需要在归一化前读取。
6
- * - compact 不再根据字符/token 预估自动触发。
7
- * - 只有明确 force 或超限恢复才会调用 history store。
8
- */
9
-
10
- import assert from "node:assert/strict";
11
- import test from "node:test";
12
-
13
- import {
14
- JsonlSessionCompactionComposer,
15
- read_agent_model_context_window,
16
- } from "../bin/index.js";
17
- import {
18
- CITY_MODEL_INVOKER,
19
- CITY_MODEL_KIND,
20
- } from "@downcity/type";
21
-
22
- /** 创建仅用于读取公开目录元数据的 CityModel。 */
23
- function create_city_model(context_window) {
24
- return {
25
- id: "context-model",
26
- name: "Context Model",
27
- description: "Context window test model",
28
- context_window,
29
- modalities: ["text"],
30
- tags: [],
31
- meta: {},
32
- kind: CITY_MODEL_KIND,
33
- [CITY_MODEL_INVOKER]: {
34
- connection: () => ({
35
- base_url: "https://example.com/v1/ai",
36
- model_id: "context-model",
37
- }),
38
- },
39
- };
40
- }
41
-
42
- /** 执行一次策略并返回传给 history store 的 compact 参数。 */
43
- async function capture_compact_input(options = {}) {
44
- let compact_input;
45
- const composer = new JsonlSessionCompactionComposer(options.composer_options);
46
- await composer.run({
47
- historyStore: {
48
- compact: async (input) => {
49
- compact_input = input;
50
- return { compacted: false, reason: "captured" };
51
- },
52
- },
53
- model: {},
54
- system: [],
55
- retryCount: options.retry_count ?? 0,
56
- force: true,
57
- ...(options.context_window !== undefined
58
- ? { context_window: options.context_window }
59
- : {}),
60
- });
61
- assert.ok(compact_input);
62
- return compact_input;
63
- }
64
-
65
- test("CityModel exposes its configured context window to Agent", () => {
66
- assert.equal(
67
- read_agent_model_context_window(create_city_model(256000)),
68
- 256000,
69
- );
70
- })
71
-
72
- test("compact input carries only an explicit force request", async () => {
73
- const compact_input = await capture_compact_input({ context_window: 256000 });
74
- assert.equal(compact_input.force, true);
75
- assert.equal("maxInputTokensApprox" in compact_input, false);
76
- assert.equal("compactRatio" in compact_input, false);
77
- assert.equal("keepLastMessages" in compact_input, false);
78
- });
79
-
80
- test("normal composer run does not call history store without force", async () => {
81
- let called = false;
82
- const composer = new JsonlSessionCompactionComposer();
83
- const result = await composer.run({
84
- historyStore: {
85
- compact: async () => {
86
- called = true;
87
- return { compacted: true };
88
- },
89
- },
90
- model: {},
91
- system: [],
92
- retryCount: 0,
93
- });
94
- assert.deepEqual(result, { compacted: false, reason: "not_requested" });
95
- assert.equal(called, false);
96
- });
@@ -1,146 +0,0 @@
1
- /**
2
- * @file 验证 session records 会把运行中的 assistant 收敛到 inflight 快照,并在完成后写回正式历史。
3
- *
4
- * 关键点(中文)
5
- * - 直接覆盖 JSONL history store 的落盘语义,确保运行中不中断丢失过程。
6
- * - `messages.jsonl` 仍保持一轮一条 assistant 的正式历史语义。
7
- * - 运行中快照放在 `assistant_message.json`,浏览层读取时也应可见。
8
- */
9
-
10
- import test from "node:test";
11
- import assert from "node:assert/strict";
12
- import os from "node:os";
13
- import path from "node:path";
14
- import fs from "node:fs/promises";
15
-
16
- import { JsonlSessionHistoryStore } from "../bin/index.js";
17
-
18
- function create_assistant_message(parts) {
19
- return {
20
- id: "a:test:final",
21
- role: "assistant",
22
- metadata: {
23
- v: 1,
24
- ts: Date.now(),
25
- sessionId: "session_test",
26
- source: "egress",
27
- kind: "normal",
28
- },
29
- parts,
30
- };
31
- }
32
-
33
- test("JsonlSessionHistoryStore exposes inflight assistant during execution and finalizes it into history", async () => {
34
- const root_path = await fs.mkdtemp(
35
- path.join(os.tmpdir(), "downcity-agent-history-inflight-"),
36
- );
37
-
38
- const store = new JsonlSessionHistoryStore({
39
- rootPath: root_path,
40
- agentId: "official",
41
- sessionId: "session_test",
42
- });
43
-
44
- await store.write_record(
45
- store.userText({
46
- text: "write to document",
47
- metadata: {
48
- sessionId: "session_test",
49
- },
50
- }),
51
- );
52
-
53
- await store.write_inflight(
54
- create_assistant_message([
55
- { type: "step-start" },
56
- { type: "text", text: "Let me inspect the document.", state: "done" },
57
- {
58
- type: "tool-exec_command",
59
- toolCallId: "call_1",
60
- input: { cmd: "cat demo.mdx" },
61
- state: "output-available",
62
- output: { success: true, output: "# demo" },
63
- },
64
- ]),
65
- );
66
-
67
- const during_run = await store.list_records();
68
- assert.equal(during_run.length, 2);
69
- assert.equal(during_run[1]?.role, "assistant");
70
- assert.deepEqual(
71
- during_run[1]?.parts.map((part) => part.type),
72
- ["step-start", "text", "tool-exec_command"],
73
- );
74
-
75
- await store.finalize_inflight(
76
- create_assistant_message([
77
- { type: "text", text: "Done writing.", state: "done" },
78
- ]),
79
- );
80
-
81
- const after_finish = await store.list_records();
82
- assert.equal(after_finish.length, 2);
83
- assert.deepEqual(
84
- after_finish[1]?.parts.map((part) => part.type),
85
- ["step-start", "text", "tool-exec_command", "text"],
86
- );
87
-
88
- const inflight_path = path.join(
89
- root_path,
90
- ".downcity",
91
- "agents",
92
- "official",
93
- "sessions",
94
- "session_test",
95
- "messages",
96
- "assistant_message.json",
97
- );
98
- const inflight_exists = await fs
99
- .access(inflight_path)
100
- .then(() => true)
101
- .catch(() => false);
102
- assert.equal(inflight_exists, false);
103
- });
104
-
105
- test("Appending a new user message flushes stale inflight assistant before the new turn", async () => {
106
- const root_path = await fs.mkdtemp(
107
- path.join(os.tmpdir(), "downcity-agent-history-flush-"),
108
- );
109
-
110
- const store = new JsonlSessionHistoryStore({
111
- rootPath: root_path,
112
- agentId: "official",
113
- sessionId: "session_flush_test",
114
- });
115
-
116
- await store.write_record(
117
- store.userText({
118
- text: "first",
119
- metadata: {
120
- sessionId: "session_flush_test",
121
- },
122
- }),
123
- );
124
-
125
- await store.write_inflight(
126
- create_assistant_message([
127
- { type: "step-start" },
128
- { type: "text", text: "partial assistant", state: "done" },
129
- ]),
130
- );
131
-
132
- await store.write_record(
133
- store.userText({
134
- text: "second",
135
- metadata: {
136
- sessionId: "session_flush_test",
137
- },
138
- }),
139
- );
140
-
141
- const messages = await store.list_records();
142
- assert.equal(messages.length, 3);
143
- assert.equal(messages[0]?.role, "user");
144
- assert.equal(messages[1]?.role, "assistant");
145
- assert.equal(messages[2]?.role, "user");
146
- });
@@ -1,57 +0,0 @@
1
- /**
2
- * @file 验证 SessionHistoryWriter 不会掩盖事实源写入失败。
3
- *
4
- * 关键点(中文)
5
- * - user 消息写入失败必须向调用方抛出。
6
- * - assistant inflight 落盘失败也必须向调用方抛出。
7
- */
8
-
9
- import test from "node:test";
10
- import assert from "node:assert/strict";
11
-
12
- import { SessionHistoryWriter } from "../bin/executor/composer/history/SessionHistoryWriter.js";
13
-
14
- function create_failing_history_store() {
15
- return {
16
- userText() {
17
- throw new Error("unused");
18
- },
19
- assistantText() {
20
- throw new Error("unused");
21
- },
22
- async write_record() {
23
- throw new Error("disk full");
24
- },
25
- async finalize_inflight() {
26
- throw new Error("disk full");
27
- },
28
- };
29
- }
30
-
31
- test("append_user_message propagates history write failures", async () => {
32
- const writer = new SessionHistoryWriter({
33
- sessionId: "writer_error_session",
34
- getHistoryStore: create_failing_history_store,
35
- });
36
-
37
- await assert.rejects(
38
- writer.append_user_message({
39
- message: { v: 1, id: "user_1", role: "user", parts: [] },
40
- }),
41
- /disk full/,
42
- );
43
- });
44
-
45
- test("append_assistant_message propagates history write failures", async () => {
46
- const writer = new SessionHistoryWriter({
47
- sessionId: "writer_error_session",
48
- getHistoryStore: create_failing_history_store,
49
- });
50
-
51
- await assert.rejects(
52
- writer.append_assistant_message({
53
- message: { v: 1, id: "assistant_1", role: "assistant", parts: [] },
54
- }),
55
- /disk full/,
56
- );
57
- });
@@ -1,390 +0,0 @@
1
- /**
2
- * @file 验证 SessionPromptRuntime 的 actor 队列语义。
3
- *
4
- * 关键点(中文)
5
- * - 测试编译后的 bin 输出,避免把测试文件混入 package 源码导出面。
6
- * - 重点锁住 prompt merge 与排队到下一 turn 的行为,防止后续重构破坏交互模型。
7
- */
8
-
9
- import test from "node:test";
10
- import assert from "node:assert/strict";
11
-
12
- import { SessionPromptRuntime } from "../bin/session/runtime/SessionPromptRuntime.js";
13
-
14
- function createDeferred() {
15
- let resolve;
16
- const promise = new Promise((innerResolve) => {
17
- resolve = innerResolve;
18
- });
19
- return {
20
- promise,
21
- resolve,
22
- };
23
- }
24
-
25
- function createUserMessage(query, index) {
26
- return {
27
- id: `u:test:${String(index)}`,
28
- role: "user",
29
- metadata: {
30
- v: 1,
31
- ts: Date.now(),
32
- sessionId: "test",
33
- source: "sdk",
34
- kind: "normal",
35
- },
36
- parts: [{ type: "text", text: query }],
37
- };
38
- }
39
-
40
- function createAssistantMessage(text, index) {
41
- return {
42
- id: `a:test:${String(index)}`,
43
- role: "assistant",
44
- metadata: {
45
- v: 1,
46
- ts: Date.now(),
47
- sessionId: "test",
48
- source: "sdk",
49
- kind: "normal",
50
- },
51
- parts: [{ type: "text", text }],
52
- };
53
- }
54
-
55
- async function waitUntil(readValue) {
56
- for (let index = 0; index < 20; index += 1) {
57
- const value = readValue();
58
- if (value) return value;
59
- await new Promise((resolve) => setTimeout(resolve, 0));
60
- }
61
- throw new Error("Timed out while waiting for test condition");
62
- }
63
-
64
- async function isSettled(promise) {
65
- const marker = {};
66
- const result = await Promise.race([
67
- promise.then(
68
- () => true,
69
- () => true,
70
- ),
71
- new Promise((resolve) => setTimeout(() => resolve(marker), 0)),
72
- ]);
73
- return result !== marker;
74
- }
75
-
76
- test("SessionPromptRuntime merges queued prompts at the next step boundary", async () => {
77
- const events = [];
78
- const persisted = [];
79
- const merge_lifecycle = [];
80
- const executionFinished = createDeferred();
81
- let stepMerge = null;
82
-
83
- const runtime = new SessionPromptRuntime({
84
- sessionId: "test",
85
- publish: (event) => {
86
- events.push(event);
87
- },
88
- createAndPersistUserMessage: async (input) => {
89
- const message = createUserMessage(input.query, persisted.length + 1);
90
- persisted.push(message);
91
- merge_lifecycle.push(`message:${input.query}`);
92
- return message;
93
- },
94
- appendErrorMessage: async () => {},
95
- executeTurn: async (input) => {
96
- stepMerge = input.onStepMerge;
97
- await executionFinished.promise;
98
- return {
99
- text: "done",
100
- success: true,
101
- assistantMessage: createAssistantMessage("done", 1),
102
- };
103
- },
104
- stopTurn: () => false,
105
- });
106
-
107
- const firstTurn = await runtime.prompt({ query: "first" });
108
- const secondTurnPromise = runtime.prompt({ query: "second" });
109
- const merge = await waitUntil(() => stepMerge);
110
-
111
- assert.equal(await isSettled(secondTurnPromise), false);
112
-
113
- const mergedMessages = await merge();
114
- const secondTurn = await secondTurnPromise;
115
-
116
- assert.equal(secondTurn.id, firstTurn.id);
117
- assert.deepEqual(
118
- mergedMessages.map((message) => message.parts[0]?.text),
119
- ["second"],
120
- );
121
- assert.deepEqual(
122
- persisted.map((message) => message.parts[0]?.text),
123
- ["first", "second"],
124
- );
125
- assert.deepEqual(merge_lifecycle, [
126
- "message:first",
127
- "message:second",
128
- ]);
129
-
130
- executionFinished.resolve();
131
- const result = await firstTurn.finished;
132
-
133
- assert.equal(result.success, true);
134
- assert.equal(result.text, "done");
135
- assert.equal(secondTurn.result, result);
136
- assert.deepEqual(
137
- events.map((event) => event.type),
138
- ["start", "finish"],
139
- );
140
- });
141
-
142
- test("SessionPromptRuntime applies config and steer in queue order at the same step checkpoint", async () => {
143
- const lifecycle = [];
144
- const applied_turn_ids = [];
145
- const execution_finished = createDeferred();
146
- let step_merge = null;
147
-
148
- const runtime = new SessionPromptRuntime({
149
- sessionId: "test",
150
- publish: () => {},
151
- createAndPersistUserMessage: async (input, _turn_id, input_type) => {
152
- lifecycle.push(`${input_type}:${input.query}`);
153
- return createUserMessage(input.query, lifecycle.length);
154
- },
155
- appendErrorMessage: async () => {},
156
- executeTurn: async (input) => {
157
- step_merge = input.onStepMerge;
158
- await execution_finished.promise;
159
- return {
160
- text: "done",
161
- success: true,
162
- assistantMessage: createAssistantMessage("done", 1),
163
- };
164
- },
165
- stopTurn: () => false,
166
- });
167
-
168
- runtime.enqueue_command({
169
- type: "command",
170
- command_id: "config-1",
171
- scope: "agent",
172
- execute: async ({ turn_id }) => {
173
- applied_turn_ids.push(turn_id);
174
- lifecycle.push("config:1");
175
- },
176
- });
177
- const first_turn = await runtime.prompt({ query: "first" });
178
- const merge = await waitUntil(() => step_merge);
179
- runtime.enqueue_command({
180
- type: "command",
181
- command_id: "config-2",
182
- scope: "session",
183
- execute: async ({ turn_id }) => {
184
- applied_turn_ids.push(turn_id);
185
- lifecycle.push("config:2");
186
- },
187
- });
188
- const second_turn_promise = runtime.prompt({ query: "second" });
189
-
190
- const messages = await merge();
191
- const second_turn = await second_turn_promise;
192
-
193
- assert.equal(second_turn.id, first_turn.id);
194
- assert.deepEqual(
195
- messages.map((message) => message.parts[0]?.text),
196
- ["second"],
197
- );
198
- assert.deepEqual(lifecycle, [
199
- "config:1",
200
- "prompt:first",
201
- "config:2",
202
- "steer:second",
203
- ]);
204
- assert.deepEqual(applied_turn_ids, [first_turn.id, first_turn.id]);
205
-
206
- execution_finished.resolve();
207
- await first_turn.finished;
208
- });
209
-
210
- test("SessionPromptRuntime keeps command queued without starting a turn", async () => {
211
- let apply_count = 0;
212
- const runtime = new SessionPromptRuntime({
213
- sessionId: "test",
214
- publish: () => {},
215
- createAndPersistUserMessage: async (input) => createUserMessage(input.query, 1),
216
- appendErrorMessage: async () => {},
217
- executeTurn: async () => ({ text: "done", success: true }),
218
- stopTurn: () => false,
219
- });
220
-
221
- runtime.enqueue_command({
222
- type: "command",
223
- command_id: "config-only",
224
- scope: "agent",
225
- execute: async () => {
226
- apply_count += 1;
227
- },
228
- });
229
-
230
- assert.equal(runtime.isActive(), false);
231
- assert.equal(runtime.has_pending_command(), true);
232
- assert.equal(apply_count, 0);
233
- });
234
-
235
- test("SessionPromptRuntime moves unmerged prompts into the next turn", async () => {
236
- const events = [];
237
- const finishQueue = [];
238
-
239
- const runtime = new SessionPromptRuntime({
240
- sessionId: "test",
241
- publish: (event) => {
242
- events.push(event);
243
- },
244
- createAndPersistUserMessage: async (input) => {
245
- return createUserMessage(input.query, events.length + 1);
246
- },
247
- appendErrorMessage: async () => {},
248
- executeTurn: async (input) => {
249
- const deferred = createDeferred();
250
- finishQueue.push({
251
- query: input.promptInput.query,
252
- deferred,
253
- });
254
- await deferred.promise;
255
- return {
256
- text: `done:${input.promptInput.query}`,
257
- success: true,
258
- assistantMessage: createAssistantMessage(
259
- `done:${input.promptInput.query}`,
260
- finishQueue.length,
261
- ),
262
- };
263
- },
264
- stopTurn: () => false,
265
- });
266
-
267
- const firstTurn = await runtime.prompt({ query: "first" });
268
- const secondTurnPromise = runtime.prompt({ query: "second" });
269
- const firstExecution = await waitUntil(() => finishQueue[0]);
270
-
271
- assert.equal(await isSettled(secondTurnPromise), false);
272
-
273
- firstExecution.deferred.resolve();
274
- const firstResult = await firstTurn.finished;
275
- const secondTurn = await secondTurnPromise;
276
- const secondExecution = await waitUntil(() => finishQueue[1]);
277
-
278
- assert.notEqual(secondTurn.id, firstTurn.id);
279
- assert.equal(firstResult.text, "done:first");
280
- assert.equal(secondExecution.query, "second");
281
-
282
- secondExecution.deferred.resolve();
283
- const secondResult = await secondTurn.finished;
284
-
285
- assert.equal(secondResult.text, "done:second");
286
- assert.deepEqual(
287
- events.map((event) => event.type),
288
- ["start", "finish", "start", "finish"],
289
- );
290
- });
291
-
292
- test("SessionPromptRuntime stops current turn and cancels unmerged queued prompts", async () => {
293
- const events = [];
294
- const executionFinished = createDeferred();
295
- let stopRequested = false;
296
-
297
- const runtime = new SessionPromptRuntime({
298
- sessionId: "test",
299
- publish: (event) => {
300
- events.push(event);
301
- },
302
- createAndPersistUserMessage: async (input) => {
303
- return createUserMessage(input.query, events.length + 1);
304
- },
305
- appendErrorMessage: async () => {},
306
- executeTurn: async (input) => {
307
- await new Promise((resolve) => {
308
- input.abortSignal.addEventListener("abort", resolve, { once: true });
309
- });
310
- await executionFinished.promise;
311
- return {
312
- text: "partial answer",
313
- success: false,
314
- assistantMessage: createAssistantMessage("partial answer", 1),
315
- error: "Turn stopped",
316
- };
317
- },
318
- stopTurn: () => {
319
- stopRequested = true;
320
- executionFinished.resolve();
321
- return true;
322
- },
323
- });
324
-
325
- const firstTurn = await runtime.prompt({ query: "first" });
326
- const secondTurnPromise = runtime.prompt({ query: "second" });
327
- await waitUntil(() => runtime.isActive());
328
-
329
- const stopResult = runtime.stop();
330
- const secondTurn = await secondTurnPromise;
331
- const firstResult = await firstTurn.finished;
332
- const secondResult = await secondTurn.finished;
333
-
334
- assert.equal(stopRequested, true);
335
- assert.equal(stopResult.stopped, true);
336
- assert.equal(stopResult.turnId, firstTurn.id);
337
- assert.equal(stopResult.cancelledQueuedPrompts, 1);
338
- assert.equal(firstResult.success, false);
339
- assert.equal(firstResult.error, "Turn stopped");
340
- assert.equal(firstResult.text, "partial answer");
341
- assert.equal(firstResult.assistantMessage.parts[0]?.text, "partial answer");
342
- assert.equal(secondResult.success, false);
343
- assert.equal(
344
- secondResult.error,
345
- "Prompt cancelled because session was stopped",
346
- );
347
- assert.deepEqual(
348
- events.map((event) => event.type),
349
- ["start", "start", "finish", "finish"],
350
- );
351
- });
352
-
353
- test("SessionPromptRuntime does not synthesize assistant text when stopped before output", async () => {
354
- const executionFinished = createDeferred();
355
-
356
- const runtime = new SessionPromptRuntime({
357
- sessionId: "test",
358
- publish: () => {},
359
- createAndPersistUserMessage: async (input) => {
360
- return createUserMessage(input.query, 1);
361
- },
362
- appendErrorMessage: async () => {},
363
- executeTurn: async (input) => {
364
- await new Promise((resolve) => {
365
- input.abortSignal.addEventListener("abort", resolve, { once: true });
366
- });
367
- await executionFinished.promise;
368
- return {
369
- text: "",
370
- success: false,
371
- error: "Turn stopped",
372
- };
373
- },
374
- stopTurn: () => {
375
- executionFinished.resolve();
376
- return true;
377
- },
378
- });
379
-
380
- const turn = await runtime.prompt({ query: "first" });
381
- await waitUntil(() => runtime.isActive());
382
-
383
- runtime.stop();
384
- const result = await turn.finished;
385
-
386
- assert.equal(result.success, false);
387
- assert.equal(result.error, "Turn stopped");
388
- assert.equal(result.text, "");
389
- assert.equal(result.assistantMessage, undefined);
390
- });