@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
@@ -4,15 +4,18 @@
4
4
  * 关键点(中文)
5
5
  * - 面向 `new Agent(...)` 的本地会话使用场景。
6
6
  * - 对外保留稳定 Session facade,把状态、turn、view 逻辑下沉到独立 service。
7
- * - 内部使用 `SessionRecorder` 统一管理 Active、Segment 与流式 Assistant 草稿。
7
+ * - 内部使用 `SessionMessages` 统一管理 Active、Segment 与流式 Assistant 草稿。
8
8
  */
9
9
 
10
10
  import { Executor } from "@executor/Executor.js";
11
- import type { Tool } from "ai";
12
- import { JsonlSessionHistoryComposer } from "@executor/composer/history/jsonl/JsonlSessionHistoryComposer.js";
13
- import { SessionRecorderHistoryStore } from "@/session/recorder/SessionRecorderHistoryStore.js";
14
- import { JsonlSessionMessageStore } from "@/session/recorder/JsonlSessionMessageStore.js";
15
- import { SessionRecorder } from "@/session/recorder/SessionRecorder.js";
11
+ import type { LanguageModel, Tool } from "ai";
12
+ import {
13
+ normalizeAgentModel,
14
+ read_agent_model_context_window,
15
+ type AgentModel,
16
+ } from "@/agent/AgentModel.js";
17
+ import { JsonlSessionMessageStore } from "@/session/messages/JsonlSessionMessageStore.js";
18
+ import { SessionMessages } from "@/session/SessionMessages.js";
16
19
  import type {
17
20
  AgentSessionConfigSnapshot,
18
21
  AgentSessionForkInput,
@@ -28,10 +31,8 @@ import {
28
31
  } from "@/session/storage/Paths.js";
29
32
  import { resolveSystemTimezone } from "@/session/storage/Metadata.js";
30
33
  import { createRuntimeSessionPort } from "@/session/storage/RuntimeSessionPort.js";
31
- import { SessionSystemBuilder } from "@/session/SessionSystemBuilder.js";
32
- import type { SessionPort } from "@/types/runtime/agent/AgentContext.js";
34
+ import type { SessionPort } from "@/types/session/SessionPort.js";
33
35
  import type {
34
- SessionMutation,
35
36
  SessionMutationSubscriber,
36
37
  SessionMutationUnsubscribe,
37
38
  } from "@/types/session/SessionMutation.js";
@@ -41,7 +42,6 @@ import type {
41
42
  SessionApprovalModeSnapshot,
42
43
  SessionApprovalResult,
43
44
  SetSessionApprovalModeInput,
44
- SessionApprovalRuntimeEvent,
45
45
  } from "@/types/session/SessionApproval.js";
46
46
  import type {
47
47
  ListSessionMessagesInput,
@@ -51,22 +51,35 @@ import type { AgentSessionPromptInput } from "@/types/sdk/AgentSessionPrompt.js"
51
51
  import type { AgentSessionStopResult } from "@/types/sdk/AgentSessionStop.js";
52
52
  import type { AgentSessionTurnHandle } from "@/types/sdk/AgentSessionTurn.js";
53
53
  import { SessionEventHub } from "@/session/runtime/SessionEventHub.js";
54
- import { SessionStateService } from "@/session/services/SessionStateService.js";
55
- import { SessionTurnService } from "@/session/services/SessionTurnService.js";
56
- import { SessionViewService } from "@/session/services/SessionViewService.js";
54
+ import { SessionState } from "@/session/SessionState.js";
55
+ import { SessionTurn } from "@/session/SessionTurn.js";
57
56
  import type { SessionLocalState } from "@/types/session/SessionLocalState.js";
58
- import type { AgentSessionCommand } from "@/types/session/SessionQueueCommand.js";
59
57
  import type {
60
- SessionComposerFactoryContext,
61
- SessionComposerInput,
62
- SessionComposerOptions,
63
- } from "@/types/session/SessionComposerOptions.js";
64
- import type { SessionCompactionComposer } from "@/executor/composer/compaction/SessionCompactionComposer.js";
65
- import type { SessionContextComposer } from "@/executor/composer/context/SessionContextComposer.js";
66
- import type { SessionHistoryComposer } from "@/executor/composer/history/SessionHistoryComposer.js";
67
- import type { SessionSystemComposer } from "@/executor/composer/system/SessionSystemComposer.js";
58
+ AgentSessionCommand,
59
+ SessionQueueCommand,
60
+ } from "@/types/session/SessionQueue.js";
68
61
  import type { SessionOptions } from "@/types/session/SessionOptions.js";
69
62
  import type { AgentPluginExecutionRuntime } from "@/types/plugin/PluginRuntime.js";
63
+ import { SessionApprovalBroker } from "@/session/approval/SessionApprovalBroker.js";
64
+ import { DefaultSessionComposer } from "@/session/DefaultSessionComposer.js";
65
+ import type {
66
+ SessionComposer,
67
+ SessionCompactionPlan,
68
+ SessionComposeInput,
69
+ SessionStepInput,
70
+ } from "@/types/session/SessionComposer.js";
71
+ import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
72
+ import { generateId } from "@/utils/Id.js";
73
+ import { nanoid } from "nanoid";
74
+ import { buildSessionInfo } from "@/session/browse/Browse.js";
75
+ import { ensureSessionTitle } from "@/session/SessionTitle.js";
76
+ import { readSessionMetadata } from "@/session/storage/Metadata.js";
77
+ import { to_executor_history } from "@/session/messages/SessionMessageCodec.js";
78
+ import type { SessionMessage } from "@/types/session/SessionMessage.js";
79
+ import type {
80
+ SessionActionRecordInputV1,
81
+ SessionActionRecordV1,
82
+ } from "@/executor/types/SessionRecords.js";
70
83
 
71
84
  /**
72
85
  * SDK 本地 Session。
@@ -75,150 +88,99 @@ export class Session implements AgentSession {
75
88
  readonly id: string;
76
89
  readonly agentId: string;
77
90
 
78
- private readonly projectRoot: string;
91
+ private readonly project_root: string;
79
92
  private readonly tools: Record<string, Tool>;
80
93
  private readonly logger: SessionOptions["logger"];
81
- private readonly getInstructionSystemBlocks: SessionOptions["getInstructionSystemBlocks"];
82
- private readonly getManagedPluginSystemBlocks: SessionOptions["getManagedPluginSystemBlocks"];
83
- private readonly getPluginSystemBlocks: SessionOptions["getPluginSystemBlocks"];
84
- private readonly ensureConfiguredHook?: SessionOptions["ensureConfigured"];
85
- private readonly composers?: SessionComposerOptions;
86
- private readonly historyStore: SessionRecorderHistoryStore;
87
- private readonly messageStore: JsonlSessionMessageStore;
88
- private readonly recorder: SessionRecorder;
89
- private readonly historyComposer: SessionHistoryComposer;
94
+ private readonly get_instruction_system_blocks: SessionOptions["getInstructionSystemBlocks"];
95
+ private readonly get_managed_plugin_system_blocks: SessionOptions["getManagedPluginSystemBlocks"];
96
+ private readonly ensure_configured_hook?: SessionOptions["ensureConfigured"];
97
+ private readonly composer: SessionComposer;
98
+ private readonly message_store: JsonlSessionMessageStore;
99
+ private readonly session_messages: SessionMessages;
90
100
  private readonly executor: Executor;
91
- private readonly eventHub: SessionEventHub;
92
- private readonly list_approvals: SessionOptions["list_approvals"];
93
- private readonly get_approval_mode: SessionOptions["get_approval_mode"];
94
- private readonly set_approval_mode_hook: SessionOptions["set_approval_mode"];
95
- private readonly resolve_approval_hook: SessionOptions["resolve_approval"];
96
- private readonly localState: SessionLocalState;
97
- private readonly getAgentEnv: SessionOptions["getAgentEnv"];
101
+ private readonly events: SessionEventHub;
102
+ private readonly approval_broker: SessionApprovalBroker;
103
+ private readonly local_state: SessionLocalState;
104
+ private readonly get_agent_env: SessionOptions["getAgentEnv"];
105
+ private readonly get_agent_model: SessionOptions["getAgentModel"];
98
106
  private readonly get_agent_plugins: SessionOptions["get_agent_plugins"];
99
107
  private effective_instruction_system_blocks: AgentSessionSystemBlock[];
100
108
  private effective_agent_env: Record<string, string>;
101
109
  private effective_agent_plugins: AgentPluginExecutionRuntime;
102
- private readonly stateService: SessionStateService;
103
- private readonly turnService: SessionTurnService;
104
- private readonly viewService: SessionViewService<this>;
105
- private runtimePort: SessionPort | null = null;
110
+ private readonly state: SessionState;
111
+ private readonly session_turn: SessionTurn;
112
+ private runtime_port: SessionPort | null = null;
106
113
 
107
114
  constructor(options: SessionOptions) {
108
115
  this.id = String(options.sessionId || "").trim();
109
116
  this.agentId = String(options.agentId || "").trim();
110
- this.projectRoot = String(options.projectRoot || "").trim();
117
+ this.project_root = String(options.projectRoot || "").trim();
111
118
  this.tools = options.tools;
112
119
  this.logger = options.logger;
113
- this.getInstructionSystemBlocks = options.getInstructionSystemBlocks;
114
- this.getAgentEnv = options.getAgentEnv;
120
+ this.get_instruction_system_blocks = options.getInstructionSystemBlocks;
121
+ this.get_agent_env = options.getAgentEnv;
122
+ this.get_agent_model = options.getAgentModel;
115
123
  this.get_agent_plugins = options.get_agent_plugins;
116
124
  this.effective_instruction_system_blocks = options
117
125
  .getInstructionSystemBlocks()
118
126
  .map((block) => ({ ...block }));
119
127
  this.effective_agent_env = { ...options.getAgentEnv() };
120
128
  this.effective_agent_plugins = options.get_agent_plugins();
121
- this.getManagedPluginSystemBlocks = options.getManagedPluginSystemBlocks;
122
- this.getPluginSystemBlocks = options.getPluginSystemBlocks;
123
- this.ensureConfiguredHook = options.ensureConfigured;
124
- this.composers = options.composers;
125
- this.list_approvals = options.list_approvals;
126
- this.get_approval_mode = options.get_approval_mode;
127
- this.set_approval_mode_hook = options.set_approval_mode;
128
- this.resolve_approval_hook = options.resolve_approval;
129
+ this.get_managed_plugin_system_blocks = options.getManagedPluginSystemBlocks;
130
+ this.ensure_configured_hook = options.ensureConfigured;
131
+ this.composer = options.composer || new DefaultSessionComposer();
129
132
  if (!this.id) {
130
133
  throw new Error("Session requires a non-empty sessionId");
131
134
  }
132
135
  if (!this.agentId) {
133
136
  throw new Error("Session requires a non-empty agentId");
134
137
  }
135
- if (!this.projectRoot) {
136
- throw new Error("Session requires a non-empty projectRoot");
138
+ if (!this.project_root) {
139
+ throw new Error("Session requires a non-empty project_root");
137
140
  }
138
141
 
139
- this.eventHub = new SessionEventHub({
140
- create_reply: (mutation) => ({
141
- approval: async ({ decision }) => {
142
- const approval_id = require_approval_id(mutation);
143
- return await this.resolve_approval({ approval_id, decision });
144
- },
145
- }),
146
- });
147
- this.messageStore = this.create_message_store();
148
- this.recorder = new SessionRecorder({
142
+ this.events = new SessionEventHub();
143
+ this.message_store = this.create_message_store();
144
+ this.session_messages = new SessionMessages({
149
145
  session_id: this.id,
150
- store: this.messageStore,
146
+ store: this.message_store,
151
147
  publish: (mutation) => {
152
- this.eventHub.publish(mutation);
148
+ this.events.publish(mutation);
153
149
  },
154
150
  });
155
- this.historyStore = this.create_history_store();
156
- this.localState = this.create_local_state();
157
- const composer_context = this.create_composer_context();
158
- this.historyComposer = this.create_history_composer(composer_context);
159
- const system_composer = this.create_system_composer(composer_context);
160
- const context_composer = this.create_context_composer(composer_context);
161
- const compaction_composer =
162
- this.create_compaction_composer(composer_context);
163
- this.executor = this.create_executor(
164
- system_composer,
165
- context_composer,
166
- compaction_composer,
167
- );
168
- this.stateService = new SessionStateService({
151
+ this.approval_broker = new SessionApprovalBroker({
152
+ session_id: this.id,
153
+ messages: this.session_messages,
154
+ });
155
+ this.local_state = this.create_local_state();
156
+ this.executor = this.create_executor();
157
+ this.state = new SessionState({
169
158
  agent_id: this.agentId,
170
- project_root: this.projectRoot,
159
+ project_root: this.project_root,
171
160
  session_id: this.id,
172
- history_store: this.historyStore,
173
- recorder: this.recorder,
174
- executor: this.executor,
175
- state: this.localState,
161
+ messages: this.session_messages,
162
+ state: this.local_state,
176
163
  logger: this.logger,
177
- ensure_configured_hook: this.ensureConfiguredHook
164
+ ensure_configured_hook: this.ensure_configured_hook
178
165
  ? async () => {
179
- await this.ensureConfiguredHook?.(this);
166
+ await this.ensure_configured_hook?.(this);
180
167
  }
181
168
  : undefined,
182
- ...(options.resolve_model ? { resolve_model: options.resolve_model } : {}),
169
+ get_model: () => this.get_model(),
183
170
  publish_event: (event) => {
184
- this.eventHub.publish(event);
171
+ this.events.publish(event);
185
172
  },
186
173
  });
187
- this.turnService = new SessionTurnService({
174
+ this.session_turn = new SessionTurn({
188
175
  session_id: this.id,
189
- project_root: this.projectRoot,
176
+ project_root: this.project_root,
190
177
  executor: this.executor,
191
- state_service: this.stateService,
192
- event_hub: this.eventHub,
193
- recorder: this.recorder,
194
- });
195
- this.viewService = new SessionViewService<this>({
196
- agent_id: this.agentId,
197
- project_root: this.projectRoot,
198
- session_id: this.id,
199
- history_store: this.historyStore,
200
- recorder: this.recorder,
201
- state_service: this.stateService,
202
- logger: this.logger,
203
- is_executing: () => this.isExecuting(),
204
- get_instruction_system_blocks: () =>
205
- this.effective_instruction_system_blocks.map((block) => ({ ...block })),
206
- get_managed_plugin_system_blocks: this.getManagedPluginSystemBlocks,
207
- get_plugin_system_blocks: async () =>
208
- await this.effective_agent_plugins.systemBlocks(),
209
- ...(this.composers?.systemComposer
210
- ? { custom_system_composer: system_composer }
211
- : {}),
212
- create_fork_session: async (session_id) => {
213
- const session = this.create_fork_session(session_id);
214
- await session.initialize();
215
- return {
216
- session,
217
- history_store: session.historyStore,
218
- recorder: session.recorder,
219
- state_service: session.stateService,
220
- };
221
- },
178
+ state: this.state,
179
+ events: this.events,
180
+ messages: this.session_messages,
181
+ approvals: this.approval_broker,
182
+ apply_command: async (command, turn_id) =>
183
+ await this.apply_queue_command(command, turn_id),
222
184
  });
223
185
  }
224
186
 
@@ -226,8 +188,8 @@ export class Session implements AgentSession {
226
188
  * 初始化当前 session。
227
189
  */
228
190
  async initialize(): Promise<this> {
229
- await this.recorder.initialize();
230
- await this.stateService.initialize();
191
+ await this.session_messages.initialize();
192
+ await this.state.initialize();
231
193
  return this;
232
194
  }
233
195
 
@@ -235,16 +197,16 @@ export class Session implements AgentSession {
235
197
  * 读取当前 session 配置快照。
236
198
  */
237
199
  get config(): AgentSessionConfigSnapshot {
238
- return this.stateService.get_config();
200
+ return this.state.get_config();
239
201
  }
240
202
 
241
203
  /**
242
204
  * 写入当前 session 默认配置。
243
205
  */
244
206
  async set(input: AgentSessionSetInput): Promise<void> {
245
- const configured = await this.stateService.set(input);
207
+ const configured = await this.state.set(input);
246
208
  if (configured.command) {
247
- this.turnService.enqueue_command(configured.command);
209
+ this.session_turn.enqueue_command(configured.command);
248
210
  }
249
211
  }
250
212
 
@@ -252,62 +214,97 @@ export class Session implements AgentSession {
252
214
  * 追加一条新的 Session prompt。
253
215
  */
254
216
  async prompt(input: AgentSessionPromptInput): Promise<AgentSessionTurnHandle> {
255
- return await this.turnService.prompt(input);
217
+ return await this.session_turn.prompt(input);
256
218
  }
257
219
 
258
220
  /**
259
221
  * 停止当前 turn,并取消尚未被吸收的排队 prompt。
260
222
  */
261
223
  async stop(): Promise<AgentSessionStopResult> {
262
- return await this.turnService.stop();
224
+ await this.approval_broker.expire_all();
225
+ return this.session_turn.stop();
263
226
  }
264
227
 
265
228
  /**
266
229
  * 把一次显式历史压缩加入当前 Session 的有序输入队列。
267
230
  */
268
231
  async compact(): Promise<void> {
269
- await this.turnService.compact();
232
+ await this.session_turn.compact();
270
233
  }
271
234
 
272
235
  /**
273
236
  * 把 Agent configured state command 加入当前 Session 的统一输入队列。
274
237
  */
275
238
  enqueue_agent_command(command: AgentSessionCommand): void {
276
- this.turnService.enqueue_command({
277
- type: "command",
239
+ if (command.type === "instruction") {
240
+ this.session_turn.enqueue_command({
241
+ type: "agent_instruction",
242
+ command_id: command.command_id,
243
+ instruction_blocks: command.instruction_blocks,
244
+ });
245
+ return;
246
+ }
247
+ if (command.type === "env") {
248
+ this.session_turn.enqueue_command({
249
+ type: "agent_env",
250
+ command_id: command.command_id,
251
+ env: command.env,
252
+ });
253
+ return;
254
+ }
255
+ this.session_turn.enqueue_command({
256
+ type: "agent_plugins",
278
257
  command_id: command.command_id,
279
- scope: "agent",
280
- execute: async ({ turn_id }) => {
281
- if (command.type === "instruction") {
282
- this.effective_instruction_system_blocks = command
283
- .instruction_blocks
284
- .map((block) => ({ ...block }));
285
- await this.stateService.emit_config_action_event({
286
- id: `agent-instruction:${this.id}:${command.command_id}`,
287
- title: "Agent instruction updated",
288
- state: "completed",
289
- turnId: turn_id,
290
- });
291
- return;
292
- }
293
- if (command.type === "env") {
294
- this.effective_agent_env = { ...command.env };
295
- await this.stateService.emit_config_action_event({
296
- id: `agent-env:${this.id}:${command.command_id}`,
297
- title: "Agent environment updated",
298
- state: "completed",
299
- turnId: turn_id,
300
- });
301
- return;
302
- }
303
- this.effective_agent_plugins = command.plugins;
304
- await this.stateService.emit_config_action_event({
305
- id: `agent-plugins:${this.id}:${command.command_id}`,
306
- title: command.title,
258
+ title: command.title,
259
+ plugins: command.plugins,
260
+ });
261
+ }
262
+
263
+ /** Step 检查点提交明确的 Session/Agent 状态命令。 */
264
+ private async apply_queue_command(
265
+ command: Exclude<SessionQueueCommand, { type: "compact" }>,
266
+ turn_id: string,
267
+ ): Promise<void> {
268
+ if (command.type === "session_model") {
269
+ await this.state.apply_model_command(command);
270
+ if (command.action_id && command.action_title) {
271
+ await this.emit_config_action_event({
272
+ id: command.action_id,
273
+ title: command.action_title,
307
274
  state: "completed",
308
275
  turnId: turn_id,
309
276
  });
310
- },
277
+ }
278
+ return;
279
+ }
280
+ if (command.type === "agent_instruction") {
281
+ this.effective_instruction_system_blocks = command.instruction_blocks.map(
282
+ (block) => ({ ...block }),
283
+ );
284
+ await this.emit_config_action_event({
285
+ id: `agent-instruction:${this.id}:${command.command_id}`,
286
+ title: "Agent instruction updated",
287
+ state: "completed",
288
+ turnId: turn_id,
289
+ });
290
+ return;
291
+ }
292
+ if (command.type === "agent_env") {
293
+ this.effective_agent_env = { ...command.env };
294
+ await this.emit_config_action_event({
295
+ id: `agent-env:${this.id}:${command.command_id}`,
296
+ title: "Agent environment updated",
297
+ state: "completed",
298
+ turnId: turn_id,
299
+ });
300
+ return;
301
+ }
302
+ this.effective_agent_plugins = command.plugins;
303
+ await this.emit_config_action_event({
304
+ id: `agent-plugins:${this.id}:${command.command_id}`,
305
+ title: command.title,
306
+ state: "completed",
307
+ turnId: turn_id,
311
308
  });
312
309
  }
313
310
 
@@ -317,42 +314,27 @@ export class Session implements AgentSession {
317
314
  subscribe(
318
315
  subscriber: SessionMutationSubscriber,
319
316
  ): SessionMutationUnsubscribe {
320
- return this.eventHub.subscribe(subscriber);
317
+ return this.events.subscribe(subscriber);
321
318
  }
322
319
 
323
320
  /** 列出当前 Session 的 pending 工具审批。 */
324
321
  async approvals(): Promise<SessionApproval[]> {
325
- return await this.list_approvals(this.id);
322
+ return this.approval_broker.list();
326
323
  }
327
324
 
328
325
  /** 读取当前 Session 的工具审批模式。 */
329
326
  async approval_mode(): Promise<SessionApprovalModeSnapshot> {
330
- return await this.get_approval_mode(this.id);
327
+ return this.approval_broker.get_mode();
331
328
  }
332
329
 
333
330
  /** 更新当前 Session 的工具审批模式。 */
334
331
  async set_approval_mode(input: SetSessionApprovalModeInput): Promise<SessionApprovalModeSnapshot> {
335
- return await this.set_approval_mode_hook(this.id, input);
332
+ return this.approval_broker.set_mode(input.mode);
336
333
  }
337
334
 
338
335
  /** 处理当前 Session 的 pending 工具审批。 */
339
336
  async resolve_approval(input: ResolveSessionApprovalInput): Promise<SessionApprovalResult> {
340
- return await this.resolve_approval_hook(this.id, input);
341
- }
342
-
343
- private async apply_runtime_event(event: SessionApprovalRuntimeEvent): Promise<void> {
344
- if (event.type === "tool-approval-request") {
345
- await this.recorder.require_tool_approval({
346
- tool_call_id: event.tool_call_id,
347
- approval_id: event.approval_id,
348
- });
349
- return;
350
- }
351
- await this.recorder.resolve_tool_approval({
352
- tool_call_id: event.tool_call_id,
353
- approval_id: event.approval_id,
354
- decision: event.decision,
355
- });
337
+ return await this.approval_broker.resolve(input);
356
338
  }
357
339
 
358
340
  /**
@@ -361,9 +343,12 @@ export class Session implements AgentSession {
361
343
  async append_user_message(input: {
362
344
  text: string;
363
345
  }): Promise<void> {
364
- await this.stateService.append_user_message({
346
+ const appended = await this.session_messages.append_external_user_message({
365
347
  text: String(input.text || "").trim(),
366
348
  });
349
+ if (!appended) return;
350
+ await this.state.ensure_title_from_history({ generate: true });
351
+ await this.state.touch_metadata();
367
352
  }
368
353
 
369
354
  /**
@@ -372,101 +357,199 @@ export class Session implements AgentSession {
372
357
  async append_assistant_message(input: {
373
358
  text: string;
374
359
  }): Promise<void> {
375
- await this.stateService.append_assistant_message({
376
- fallbackText: String(input.text || "").trim(),
360
+ const appended = await this.session_messages.append_external_assistant_message({
361
+ fallback_text: String(input.text || "").trim(),
377
362
  });
363
+ if (appended) await this.state.touch_metadata();
378
364
  }
379
365
 
380
366
  /**
381
367
  * 读取当前 session 详情。
382
368
  */
383
369
  async get_info(): Promise<AgentSessionInfo> {
384
- return await this.viewService.get_info();
370
+ const [metadata, snapshot] = await Promise.all([
371
+ readSessionMetadata({
372
+ projectRoot: this.project_root,
373
+ agentId: this.agentId,
374
+ sessionId: this.id,
375
+ }),
376
+ this.session_messages.context_snapshot(),
377
+ ]);
378
+ const records = to_executor_history(this.id, snapshot);
379
+ const metadata_with_title = metadata.title
380
+ ? metadata
381
+ : await ensureSessionTitle({
382
+ projectRoot: this.project_root,
383
+ agentId: this.agentId,
384
+ sessionId: this.id,
385
+ messages: records,
386
+ logger: this.logger,
387
+ });
388
+ return buildSessionInfo({
389
+ projectRoot: this.project_root,
390
+ agentId: this.agentId,
391
+ sessionId: this.id,
392
+ metadata: metadata_with_title,
393
+ messages: records,
394
+ executing: this.isExecuting(),
395
+ });
385
396
  }
386
397
 
387
398
  /**
388
399
  * 读取当前 session records 分页。
389
400
  */
390
401
  async messages(input?: ListSessionMessagesInput): Promise<SessionMessagePage> {
391
- return await this.recorder.list_messages(input);
402
+ return await this.session_messages.list_messages(input);
392
403
  }
393
404
 
394
405
  /**
395
406
  * 读取当前 session 生效的 system 快照。
396
407
  */
397
408
  async system(): Promise<AgentSessionSystemSnapshot> {
398
- return await this.viewService.system();
409
+ const composed = await this.compose_for_view();
410
+ const blocks = resolve_composed_system_blocks(composed);
411
+ return {
412
+ sessionId: this.id,
413
+ session: {
414
+ agentId: this.agentId,
415
+ sessionId: this.id,
416
+ projectRoot: this.project_root,
417
+ createdAt: new Date(this.state.get_created_at()).toISOString(),
418
+ timezone: this.state.get_timezone(),
419
+ },
420
+ blocks,
421
+ };
399
422
  }
400
423
 
401
424
  /**
402
425
  * 返回当前 session 是否正在执行。
403
426
  */
404
427
  isExecuting(): boolean {
405
- return this.turnService.is_prompt_runtime_active() || this.executor.isExecuting();
428
+ return this.session_turn.is_active() || this.executor.isExecuting();
406
429
  }
407
430
 
408
431
  /**
409
432
  * 从当前 session 创建一个分叉会话。
410
433
  */
411
434
  async fork(input?: AgentSessionForkInput | string): Promise<this> {
412
- return await this.viewService.fork(input);
435
+ const message_id = typeof input === "string"
436
+ ? String(input || "").trim() || undefined
437
+ : String(input?.messageId || "").trim() || undefined;
438
+ const messages = await this.session_messages.list_history_messages();
439
+ const fork_messages = message_id
440
+ ? this.resolve_fork_messages(messages, message_id)
441
+ : messages;
442
+ const action_id = `history-forking:${this.id}:${Date.now()}:${nanoid(8)}`;
443
+ await this.emit_action_event({
444
+ id: action_id,
445
+ title: "Forking session messages",
446
+ description: `Preparing ${String(fork_messages.length)} messages for the new session.`,
447
+ state: "running",
448
+ });
449
+ try {
450
+ const forked = this.create_fork_session(
451
+ `fork-${Date.now()}-${nanoid(8)}`,
452
+ );
453
+ await forked.initialize();
454
+ const session_config = this.state.get_config();
455
+ if (session_config.model) {
456
+ await forked.state.set(
457
+ { model: session_config.model },
458
+ { emit_action: false },
459
+ );
460
+ }
461
+ await forked.session_messages.import_messages(fork_messages);
462
+ await this.emit_action_event({
463
+ id: action_id,
464
+ title: "Session messages forked",
465
+ description: `Created ${forked.id} with ${String(fork_messages.length)} messages.`,
466
+ state: "completed",
467
+ });
468
+ return forked;
469
+ } catch (error) {
470
+ await this.emit_action_event({
471
+ id: action_id,
472
+ title: "Session messages fork failed",
473
+ description: error instanceof Error ? error.message : String(error),
474
+ state: "failed",
475
+ });
476
+ throw error;
477
+ }
478
+ }
479
+
480
+ /** 截取 Fork 目标 Message 及其之前的完整历史。 */
481
+ private resolve_fork_messages(
482
+ messages: SessionMessage[],
483
+ message_id: string,
484
+ ): SessionMessage[] {
485
+ const target_index = messages.findIndex(
486
+ (message) => message.message_id === message_id,
487
+ );
488
+ if (target_index < 0) {
489
+ throw new Error(
490
+ `Cannot fork session "${this.id}": messageId "${message_id}" not found.`,
491
+ );
492
+ }
493
+ return messages.slice(0, target_index + 1);
413
494
  }
414
495
 
415
496
  /**
416
497
  * 返回供受托管 plugin 使用的 session 端口。
417
498
  */
418
499
  getRuntimePort(): SessionPort {
419
- if (this.runtimePort) return this.runtimePort;
420
- this.runtimePort = createRuntimeSessionPort({
500
+ if (this.runtime_port) return this.runtime_port;
501
+ this.runtime_port = createRuntimeSessionPort({
421
502
  sessionId: this.id,
503
+ getModel: () => this.get_model(),
422
504
  getExecutor: () => this.executor.getExecutor(),
423
505
  prompt: async (input) => await this.prompt(input),
424
506
  stop: async () => await this.stop(),
425
507
  subscribe: (subscriber) => this.subscribe(subscriber),
426
- publishEvent: async (event) => {
427
- await this.apply_runtime_event(event);
428
- },
429
508
  append_user_message: async (message_params) => {
430
- await this.stateService.append_user_message(message_params);
509
+ const appended = await this.session_messages.append_external_user_message(
510
+ message_params,
511
+ );
512
+ if (!appended) return;
513
+ await this.state.ensure_title_from_history({ generate: true });
514
+ await this.state.touch_metadata();
431
515
  },
432
516
  append_assistant_message: async (message_params) => {
433
- await this.stateService.append_assistant_message(message_params);
517
+ const appended = await this.session_messages.append_external_assistant_message({
518
+ message: message_params.message,
519
+ fallback_text: message_params.fallbackText,
520
+ });
521
+ if (appended) await this.state.touch_metadata();
434
522
  },
435
523
  isExecuting: () => this.isExecuting(),
436
- historyStore: this.historyStore,
524
+ context: async () => await this.session_messages.context_snapshot(),
437
525
  ensureReadyForExecution: async () => {
438
526
  await this.ensureReadyForExecution();
439
527
  },
440
528
  });
441
- return this.runtimePort;
529
+ return this.runtime_port;
442
530
  }
443
531
 
444
532
  /**
445
533
  * 在执行前确保 session 已完成初始化与宿主装配。
446
534
  */
447
535
  async ensureReadyForExecution(): Promise<void> {
448
- await this.stateService.ensure_ready_for_execution();
536
+ await this.state.ensure_ready_for_execution();
449
537
  }
450
538
 
451
539
  private create_fork_session(session_id: string): this {
452
540
  return this.create_child_session({
453
541
  agentId: this.agentId,
454
- projectRoot: this.projectRoot,
542
+ projectRoot: this.project_root,
455
543
  sessionId: session_id,
456
544
  tools: this.tools,
457
545
  logger: this.logger,
458
- getInstructionSystemBlocks: this.getInstructionSystemBlocks,
459
- getAgentEnv: this.getAgentEnv,
546
+ getInstructionSystemBlocks: this.get_instruction_system_blocks,
547
+ getAgentEnv: this.get_agent_env,
460
548
  get_agent_plugins: this.get_agent_plugins,
461
- getManagedPluginSystemBlocks: this.getManagedPluginSystemBlocks,
462
- getPluginSystemBlocks: async () =>
463
- await this.effective_agent_plugins.systemBlocks(),
464
- ensureConfigured: this.ensureConfiguredHook,
465
- composers: this.composers,
466
- list_approvals: this.list_approvals,
467
- get_approval_mode: this.get_approval_mode,
468
- set_approval_mode: this.set_approval_mode_hook,
469
- resolve_approval: this.resolve_approval_hook,
549
+ getManagedPluginSystemBlocks: this.get_managed_plugin_system_blocks,
550
+ ensureConfigured: this.ensure_configured_hook,
551
+ getAgentModel: this.get_agent_model,
552
+ composer: this.composer,
470
553
  });
471
554
  }
472
555
 
@@ -486,7 +569,7 @@ export class Session implements AgentSession {
486
569
 
487
570
  private create_message_store(): JsonlSessionMessageStore {
488
571
  const session_dir_path = getSdkAgentSessionDirPath(
489
- this.projectRoot,
572
+ this.project_root,
490
573
  this.agentId,
491
574
  this.id,
492
575
  );
@@ -495,156 +578,237 @@ export class Session implements AgentSession {
495
578
  session_id: this.id,
496
579
  file_path: `${messages_dir_path}/active.jsonl`,
497
580
  assistant_message_file_path: getSdkAgentSessionAssistantMessagePath(
498
- this.projectRoot,
581
+ this.project_root,
499
582
  this.agentId,
500
583
  this.id,
501
584
  ),
502
585
  });
503
586
  }
504
587
 
505
- private create_history_store(): SessionRecorderHistoryStore {
506
- return new SessionRecorderHistoryStore({
507
- session_id: this.id,
508
- recorder: this.recorder,
509
- });
510
- }
511
-
512
588
  private create_local_state(): SessionLocalState {
513
589
  return {
514
- sessionConfig: {},
590
+ session_config: {},
515
591
  effective_session_config: {},
516
- createdAt: Date.now(),
592
+ created_at: Date.now(),
517
593
  timezone: resolveSystemTimezone(),
518
- initializePromise: null,
519
- ensureConfiguredPromise: null,
594
+ initialize_promise: null,
595
+ ensure_configured_promise: null,
520
596
  };
521
597
  }
522
598
 
523
- private create_composer_context(): SessionComposerFactoryContext {
524
- return {
525
- agentId: this.agentId,
526
- projectRoot: this.projectRoot,
599
+ /** 创建只依赖统一 Composer 的 Turn Executor。 */
600
+ private create_executor(): Executor {
601
+ return new Executor({
527
602
  sessionId: this.id,
528
- historyStore: this.historyStore,
529
- getTools: () => this.tools,
530
- getInstructionSystemBlocks: () =>
531
- this.effective_instruction_system_blocks.map((block) => ({ ...block })),
532
- getManagedPluginSystemBlocks: this.getManagedPluginSystemBlocks,
533
- getPluginSystemBlocks: async () =>
534
- await this.effective_agent_plugins.systemBlocks(),
535
- getSessionCreatedAt: () => this.localState.createdAt,
536
- getSessionTimezone: () => this.localState.timezone,
603
+ composer: this.composer,
604
+ get_compose_input: async (run_context, retry_count) =>
605
+ await this.create_compose_input(run_context, retry_count),
606
+ commit_compaction: async (plan, run_context) =>
607
+ await this.commit_compaction_plan(plan, run_context),
608
+ getModel: () => this.get_model(),
609
+ logger: this.logger,
610
+ get_plugins: () => this.effective_agent_plugins,
611
+ });
612
+ }
613
+
614
+ /** 为 Composer 创建当前 Step 的只读 Session 快照。 */
615
+ private async create_compose_input(
616
+ run_context: SessionRunContext,
617
+ retry_count: number,
618
+ ): Promise<SessionComposeInput> {
619
+ const plugin_system_blocks = run_context.agentPlugins
620
+ ? await run_context.agentPlugins.systemBlocks(run_context)
621
+ : await this.effective_agent_plugins.systemBlocks(run_context);
622
+ return {
623
+ session: {
624
+ agent_id: this.agentId,
625
+ session_id: this.id,
626
+ project_root: this.project_root,
627
+ created_at: this.local_state.created_at,
628
+ timezone: this.local_state.timezone,
629
+ },
630
+ state: {
631
+ model: this.get_model(),
632
+ model_context_window: this.get_model_context_window(),
633
+ env: Object.freeze({ ...this.effective_agent_env }),
634
+ systems: Object.freeze(
635
+ this.effective_instruction_system_blocks.map(
636
+ (block) => block.content,
637
+ ),
638
+ ),
639
+ tools: Object.freeze({ ...this.tools }),
640
+ instruction_system_blocks:
641
+ this.effective_instruction_system_blocks.map(
642
+ (block) => ({ ...block }),
643
+ ),
644
+ managed_plugin_system_blocks:
645
+ await this.get_managed_plugin_system_blocks(),
646
+ plugin_system_blocks,
647
+ },
648
+ history: await this.session_messages.context_snapshot(),
649
+ turn: {
650
+ ...(run_context.turnId ? { turn_id: run_context.turnId } : {}),
651
+ retry_count,
652
+ },
537
653
  };
538
654
  }
539
655
 
540
- private create_history_composer(
541
- context: SessionComposerFactoryContext,
542
- ): SessionHistoryComposer {
543
- return this.resolve_composer(this.composers?.historyComposer, context, () =>
544
- new JsonlSessionHistoryComposer({
545
- store: this.historyStore,
546
- }),
656
+ /** 使用统一 Composer 生成只读 system/history 查询结果。 */
657
+ private async compose_for_view(): Promise<SessionStepInput> {
658
+ const run_context: SessionRunContext = {
659
+ sessionId: this.id,
660
+ injectedUserMessages: [],
661
+ deferredPersistedUserMessages: [],
662
+ pendingAssistantFileParts: [],
663
+ };
664
+ return await this.composer.compose(
665
+ await this.create_compose_input(run_context, 0),
547
666
  );
548
667
  }
549
668
 
550
- private create_system_composer(
551
- context: SessionComposerFactoryContext,
552
- ): SessionSystemComposer {
553
- return this.resolve_composer(this.composers?.systemComposer, context, () =>
554
- new SessionSystemBuilder({
555
- agentId: this.agentId,
556
- projectRoot: this.projectRoot,
557
- getSessionCreatedAt: () => this.localState.createdAt,
558
- getSessionTimezone: () => this.localState.timezone,
559
- getInstructionSystemBlocks: () =>
560
- this.effective_instruction_system_blocks.map((block) => ({ ...block })),
561
- getManagedPluginSystemBlocks: this.getManagedPluginSystemBlocks,
562
- getPluginSystemBlocks: async () =>
563
- await this.effective_agent_plugins.systemBlocks(),
564
- }),
565
- );
669
+ /** 提交 Composer 生成的 Segment 压缩计划。 */
670
+ private async commit_compaction_plan(
671
+ plan: SessionCompactionPlan,
672
+ run_context: SessionRunContext,
673
+ ): Promise<void> {
674
+ const action_id = `compacting:${this.id}:${generateId()}`;
675
+ await this.emit_action_event({
676
+ id: action_id,
677
+ title: "Compacting session messages",
678
+ state: "running",
679
+ ...(run_context.turnId ? { turnId: run_context.turnId } : {}),
680
+ });
681
+ try {
682
+ await this.session_messages.compact_active({
683
+ through_sequence: plan.through_sequence,
684
+ summary: plan.summary,
685
+ });
686
+ await this.emit_action_event({
687
+ id: action_id,
688
+ title: "Session messages compacted",
689
+ description: plan.used_fallback
690
+ ? `Closed Active through Message ${plan.boundary_message_id} with deterministic fallback Summary.`
691
+ : `Closed Active through Message ${plan.boundary_message_id}.`,
692
+ state: "completed",
693
+ ...(run_context.turnId ? { turnId: run_context.turnId } : {}),
694
+ });
695
+ await this.state.touch_metadata();
696
+ } catch (error) {
697
+ await this.emit_action_event({
698
+ id: action_id,
699
+ title: "Session messages compact failed",
700
+ description: error instanceof Error ? error.message : String(error),
701
+ state: "failed",
702
+ ...(run_context.turnId ? { turnId: run_context.turnId } : {}),
703
+ });
704
+ throw error;
705
+ }
566
706
  }
567
707
 
568
- private create_context_composer(
569
- context: SessionComposerFactoryContext,
570
- ): SessionContextComposer | undefined {
571
- return this.resolve_optional_composer<SessionContextComposer>(
572
- this.composers?.contextComposer,
573
- context,
574
- );
708
+ /**
709
+ * 返回当前 Session 实际使用的模型实例。
710
+ *
711
+ * 解析顺序固定为 Session 覆盖模型,其次回退到 Agent 模型。
712
+ */
713
+ get_model(): LanguageModel | undefined {
714
+ const model = this.get_selected_model();
715
+ return model ? normalizeAgentModel(model) : undefined;
575
716
  }
576
717
 
577
- private create_compaction_composer(
578
- context: SessionComposerFactoryContext,
579
- ): SessionCompactionComposer | undefined {
580
- return this.resolve_optional_composer<SessionCompactionComposer>(
581
- this.composers?.compactionComposer,
582
- context,
718
+ /** 按 Session 优先、Agent 兜底规则读取当前配置的 AgentModel。 */
719
+ private get_selected_model(): AgentModel | undefined {
720
+ return (
721
+ this.local_state.effective_session_config.model ||
722
+ this.local_state.session_config.model ||
723
+ this.get_agent_model()
583
724
  );
584
725
  }
585
726
 
586
- private create_executor(
587
- system_composer: SessionSystemComposer,
588
- context_composer?: SessionContextComposer,
589
- compaction_composer?: SessionCompactionComposer,
590
- ): Executor {
591
- return new Executor({
592
- sessionId: this.id,
593
- historyStore: this.historyStore,
594
- historyComposer: this.historyComposer,
595
- getModel: () =>
596
- this.localState.effective_session_config.model ||
597
- this.localState.sessionConfig.model,
598
- get_model_context_window: () =>
599
- this.localState.effective_session_config.model
600
- ? this.localState.effective_session_config.model_context_window
601
- : this.localState.sessionConfig.model_context_window,
602
- logger: this.logger,
603
- systemComposer: system_composer,
604
- getTools: () => this.tools,
605
- getEnv: () => ({ ...this.effective_agent_env }),
606
- get_systems: () =>
607
- this.effective_instruction_system_blocks.map((block) => block.content),
608
- get_plugins: () => this.effective_agent_plugins,
609
- ...(context_composer ? { contextComposer: context_composer } : {}),
610
- ...(compaction_composer
611
- ? { compactionComposer: compaction_composer }
612
- : {}),
613
- });
727
+ /** 读取当前有效模型对应的上下文窗口。 */
728
+ private get_model_context_window(): number | undefined {
729
+ return (
730
+ this.local_state.effective_session_config.model_context_window ||
731
+ this.local_state.session_config.model_context_window ||
732
+ read_agent_model_context_window(this.get_selected_model())
733
+ );
614
734
  }
615
735
 
616
- private resolve_composer<TComposer>(
617
- input: SessionComposerInput<TComposer> | undefined,
618
- context: SessionComposerFactoryContext,
619
- create_default: () => TComposer,
620
- ): TComposer {
621
- const composer = this.resolve_optional_composer(input, context);
622
- return composer || create_default();
623
- }
624
-
625
- private resolve_optional_composer<TComposer>(
626
- input: SessionComposerInput<TComposer> | undefined,
627
- context: SessionComposerFactoryContext,
628
- ): TComposer | undefined {
629
- if (!input) return undefined;
630
- if (typeof input === "function") {
631
- const create_composer = input as (
632
- context: SessionComposerFactoryContext,
633
- ) => TComposer;
634
- return create_composer(context);
736
+ /** 持久化并发布一条 canonical Action Message。 */
737
+ private async emit_action_event(input: SessionActionRecordInputV1): Promise<void> {
738
+ const action_id = String(input.id || "").trim() ||
739
+ `action:${this.id}:${Date.now()}`;
740
+ await this.session_messages.persist_action_record({
741
+ type: "action",
742
+ id: action_id,
743
+ title: input.title,
744
+ ...(input.description ? { description: input.description } : {}),
745
+ state: input.state,
746
+ metadata: {
747
+ v: 1,
748
+ ts: Date.now(),
749
+ sessionId: this.id,
750
+ ...(input.turnId ? { turnId: input.turnId } : {}),
751
+ },
752
+ });
753
+ await this.state.touch_metadata();
754
+ }
755
+
756
+ /** 尽力记录配置 Action,不让 timeline 故障反向改变已提交配置。 */
757
+ private async emit_config_action_event(
758
+ input: SessionActionRecordInputV1 | SessionActionRecordV1,
759
+ ): Promise<boolean> {
760
+ try {
761
+ await this.emit_action_event({
762
+ id: input.id,
763
+ title: input.title,
764
+ description: input.description,
765
+ state: input.state,
766
+ turnId: "turnId" in input ? input.turnId : input.metadata?.turnId,
767
+ });
768
+ return true;
769
+ } catch (error) {
770
+ try {
771
+ await this.logger.log("warn", "[agent] config action persistence failed", {
772
+ sessionId: this.id,
773
+ actionId: String(input.id || ""),
774
+ error: error instanceof Error ? error.message : String(error),
775
+ });
776
+ } catch {
777
+ // 配置已提交,日志失败也不能反向改变 effective state。
778
+ }
779
+ return false;
635
780
  }
636
- return input;
637
781
  }
782
+
638
783
  }
639
784
 
640
- function require_approval_id(mutation: SessionMutation): string {
641
- if (
642
- mutation.variant === "part" &&
643
- mutation.type === "tool" &&
644
- mutation.part.state === "approval-required" &&
645
- mutation.part.approval_id
646
- ) {
647
- return mutation.part.approval_id;
785
+ /** 把自定义 Composer system content 转为可展示文本。 */
786
+ function stringify_system_content(content: unknown): string {
787
+ if (typeof content === "string") return content.trim();
788
+ if (content === null || content === undefined) return "";
789
+ try {
790
+ return JSON.stringify(content);
791
+ } catch {
792
+ return String(content || "").trim();
648
793
  }
649
- throw new Error("Current Session Mutation is not an approval-required Tool Part");
794
+ }
795
+
796
+ /** 以实际模型输入为准,保留仍与其一致的 system block 来源信息。 */
797
+ function resolve_composed_system_blocks(
798
+ composed: SessionStepInput,
799
+ ): AgentSessionSystemBlock[] {
800
+ const declared_blocks = composed.system_blocks || [];
801
+ return composed.system.flatMap((message, index) => {
802
+ const content = stringify_system_content(message.content);
803
+ if (!content) return [];
804
+ const declared = declared_blocks[index];
805
+ if (declared && declared.content.trim() === content) {
806
+ return [{ ...declared, content }];
807
+ }
808
+ return [{
809
+ source: "session" as const,
810
+ name: `custom_system:${index + 1}`,
811
+ content,
812
+ }];
813
+ });
650
814
  }