@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,39 +4,28 @@
4
4
  * 关键点(中文)
5
5
  * - SDK 对外对象叫 `Session`,这里是内部执行层。
6
6
  * - 一个 Executor 只对应一个固定的 `sessionId`。
7
- * - 负责 history 写入、run scope、executing 状态、Composer 编排与 tool-loop 执行。
7
+ * - 负责 history 写入、显式运行上下文、executing 状态、Composer 编排与 tool-loop 执行。
8
8
  */
9
9
 
10
- import { streamText, type LanguageModel, type Tool, type ToolExecutionOptions } from "ai";
11
- import { withShellRunScope } from "@downcity/shell";
12
- import { SessionHistoryWriter } from "@executor/composer/history/SessionHistoryWriter.js";
13
- import type { SessionHistoryComposer } from "@executor/composer/history/SessionHistoryComposer.js";
14
- import type { SessionHistoryStore } from "@/executor/store/history/SessionHistoryStore.js";
15
- import { withSessionRunScope } from "@executor/SessionRunScope.js";
16
- import { buildSessionStepParts } from "@executor/messages/SessionStepEventMapper.js";
17
- import { JsonlSessionCompactionComposer } from "@executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.js";
18
- import { LocalSessionContextComposer } from "@executor/composer/context/LocalSessionContextComposer.js";
10
+ import type { LanguageModel, Tool, ToolExecutionOptions } from "ai";
19
11
  import { CoreEngineRunner } from "@executor/core-engine/CoreEngineRunner.js";
20
- import type { SessionCompactionComposer } from "@executor/composer/compaction/SessionCompactionComposer.js";
21
- import type { SessionContextComposer } from "@executor/composer/context/SessionContextComposer.js";
22
- import type { SessionSystemComposer } from "@executor/composer/system/SessionSystemComposer.js";
23
- import { ExecutorInflightService } from "@executor/services/ExecutorInflightService.js";
24
12
  import { ExecutorRecoveryPolicy } from "@executor/services/ExecutorRecoveryPolicy.js";
25
- import { generateId } from "@/utils/Id.js";
26
13
  import type { Logger } from "@/utils/logger/Logger.js";
27
- import type { JsonObject } from "@/types/common/Json.js";
28
- import type {
29
- SessionActionRecordV1,
30
- SessionRecordV1,
31
- } from "@/executor/types/SessionRecords.js";
32
- import { to_session_action_record } from "@/executor/types/SessionRecords.js";
33
14
  import type { SessionExecutor } from "@/executor/types/SessionExecutor.js";
34
15
  import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
16
+ import type { SessionToolExecutionContext } from "@/types/executor/SessionToolExecutionContext.js";
35
17
  import type { AgentPluginExecutionRuntime } from "@/types/plugin/PluginRuntime.js";
18
+ import { inject_read_image_user_message } from "@executor/tools/file/ReadImageToolBridge.js";
36
19
  import type {
37
20
  SessionExecuteInput,
38
21
  SessionRunResult,
39
22
  } from "@/executor/types/SessionRun.js";
23
+ import type {
24
+ SessionComposer,
25
+ SessionCompactionPlan,
26
+ SessionComposeInput,
27
+ SessionStepInput,
28
+ } from "@/types/session/SessionComposer.js";
40
29
 
41
30
  type ExecutorOptions = {
42
31
  /**
@@ -44,65 +33,33 @@ type ExecutorOptions = {
44
33
  */
45
34
  sessionId: string;
46
35
 
47
- /**
48
- * 当前 session 对应的 history 事实源。
49
- */
50
- historyStore: SessionHistoryStore;
36
+ /** 当前 Session 使用的统一 Composer。 */
37
+ composer: SessionComposer;
51
38
 
52
- /**
53
- * 当前 session 对应的 history Composer。
54
- *
55
- * 关键点(中文)
56
- * - Composer 只负责组装本轮 messages,不负责落盘。
57
- */
58
- historyComposer: SessionHistoryComposer;
39
+ /** 为 Composer 创建当前 Step 的只读输入快照。 */
40
+ get_compose_input: (
41
+ run_context: SessionRunContext,
42
+ retry_count: number,
43
+ ) => Promise<SessionComposeInput>;
44
+
45
+ /** 提交 Composer 生成的持久化压缩计划。 */
46
+ commit_compaction: (
47
+ plan: SessionCompactionPlan,
48
+ run_context: SessionRunContext,
49
+ ) => Promise<void>;
59
50
 
60
51
  /**
61
52
  * 读取当前 session 使用的模型实例。
62
53
  */
63
54
  getModel: () => LanguageModel | undefined;
64
55
 
65
- /**
66
- * 读取当前 session 模型支持的总上下文窗口长度。
67
- */
68
- get_model_context_window?: () => number | undefined;
69
-
70
56
  /**
71
57
  * 统一日志器。
72
58
  */
73
59
  logger: Logger;
74
60
 
75
- /**
76
- * 当前 session 对应的 compaction Composer。
77
- */
78
- compactionComposer?: SessionCompactionComposer;
79
-
80
- /**
81
- * 当前 session 对应的 system Composer。
82
- */
83
- systemComposer: SessionSystemComposer;
84
-
85
- /**
86
- * 获取当前可用工具集合。
87
- */
88
- getTools: () => Record<string, Tool>;
89
-
90
- /**
91
- * 读取当前 Session effective Agent env。
92
- */
93
- getEnv: () => Record<string, string>;
94
-
95
- /** 读取当前 Session effective Agent instruction 文本。 */
96
- get_systems?: () => string[];
97
-
98
61
  /** 创建当前 Session effective Plugin 执行视图。 */
99
62
  get_plugins?: () => AgentPluginExecutionRuntime;
100
-
101
- /**
102
- * 可选自定义 context Composer。
103
- */
104
- contextComposer?: SessionContextComposer;
105
-
106
63
  };
107
64
 
108
65
  /**
@@ -114,19 +71,12 @@ export class Executor implements SessionExecutor {
114
71
  */
115
72
  readonly sessionId: string;
116
73
 
117
- private readonly historyComposer: SessionHistoryComposer;
118
- private readonly historyStore: SessionHistoryStore;
74
+ private readonly composer: SessionComposer;
75
+ private readonly get_compose_input: ExecutorOptions["get_compose_input"];
76
+ private readonly commit_compaction: ExecutorOptions["commit_compaction"];
119
77
  private readonly getModel: ExecutorOptions["getModel"];
120
- private readonly getEnv: ExecutorOptions["getEnv"];
121
- private readonly get_systems: ExecutorOptions["get_systems"];
122
78
  private readonly get_plugins: ExecutorOptions["get_plugins"];
123
- private readonly get_model_context_window?: ExecutorOptions["get_model_context_window"];
124
79
  private readonly logger: Logger;
125
- private readonly compactionComposer: SessionCompactionComposer;
126
- private readonly systemComposer: SessionSystemComposer;
127
- protected readonly contextComposer: SessionContextComposer;
128
- private readonly historyWriter: SessionHistoryWriter;
129
- private readonly inflight_service: ExecutorInflightService;
130
80
  private readonly recovery_policy: ExecutorRecoveryPolicy;
131
81
  private readonly core_engine_runner: CoreEngineRunner;
132
82
 
@@ -140,42 +90,22 @@ export class Executor implements SessionExecutor {
140
90
  }
141
91
 
142
92
  this.sessionId = sessionId;
143
- this.historyStore = options.historyStore;
144
- this.historyComposer = options.historyComposer;
93
+ this.composer = options.composer;
94
+ this.get_compose_input = options.get_compose_input;
95
+ this.commit_compaction = options.commit_compaction;
145
96
  this.getModel = options.getModel;
146
- this.getEnv = options.getEnv;
147
- this.get_systems = options.get_systems;
148
97
  this.get_plugins = options.get_plugins;
149
- this.get_model_context_window = options.get_model_context_window;
150
98
  this.logger = options.logger;
151
- this.compactionComposer =
152
- options.compactionComposer || new JsonlSessionCompactionComposer();
153
- this.systemComposer = options.systemComposer;
154
- this.contextComposer =
155
- options.contextComposer ||
156
- new LocalSessionContextComposer({
157
- sessionId: this.sessionId,
158
- getTools: options.getTools,
159
- });
160
- this.historyWriter = new SessionHistoryWriter({
161
- sessionId,
162
- getHistoryStore: () => this.getHistoryStore(),
163
- });
164
- this.inflight_service = new ExecutorInflightService({
165
- session_id: this.sessionId,
166
- history_store: this.historyStore,
167
- });
168
99
  this.recovery_policy = new ExecutorRecoveryPolicy({
169
- compaction_composer: this.compactionComposer,
170
- context_composer: this.contextComposer,
100
+ session_id: this.sessionId,
101
+ should_compact: (error) => this.composer.should_compact(error),
171
102
  logger: this.logger,
172
103
  });
173
104
  this.core_engine_runner = new CoreEngineRunner({
174
- history_store: this.historyStore,
175
- context_composer: this.contextComposer,
105
+ session_id: this.sessionId,
176
106
  logger: this.logger,
177
107
  should_compact_on_error: (error) =>
178
- this.compactionComposer.shouldCompactOnError(error),
108
+ this.composer.should_compact(error),
179
109
  });
180
110
  }
181
111
 
@@ -197,13 +127,6 @@ export class Executor implements SessionExecutor {
197
127
  return true;
198
128
  }
199
129
 
200
- /**
201
- * 获取当前 session 的 history 事实源。
202
- */
203
- getHistoryStore(): SessionHistoryStore {
204
- return this.historyStore;
205
- }
206
-
207
130
  /**
208
131
  * 获取当前 session 的执行端口。
209
132
  *
@@ -214,28 +137,6 @@ export class Executor implements SessionExecutor {
214
137
  return this;
215
138
  }
216
139
 
217
- /**
218
- * 追加一条 user 消息。
219
- */
220
- async append_user_message(params: {
221
- message?: SessionRecordV1 | null;
222
- text?: string;
223
- extra?: JsonObject;
224
- }): Promise<void> {
225
- await this.historyWriter.append_user_message(params);
226
- }
227
-
228
- /**
229
- * 追加一条 assistant 消息。
230
- */
231
- async append_assistant_message(params: {
232
- message?: SessionRecordV1 | null;
233
- fallbackText?: string;
234
- extra?: JsonObject;
235
- }): Promise<void> {
236
- await this.historyWriter.append_assistant_message(params);
237
- }
238
-
239
140
  /**
240
141
  * 运行当前 session 的一次请求。
241
142
  *
@@ -254,31 +155,6 @@ export class Executor implements SessionExecutor {
254
155
  }
255
156
  const query = String(params.query || "").trim();
256
157
  const run_context = this.createRunContext(params.runContext);
257
- const providedOnAssistantStepCallback =
258
- run_context.onAssistantStepCallback;
259
-
260
- const wrappedOnAssistantStepCallback = async (step: {
261
- text: string;
262
- stepIndex: number;
263
- visibility?: "visible" | "internal";
264
- stepResult?: unknown;
265
- }): Promise<void> => {
266
- const step_parts = buildSessionStepParts({
267
- stepIndex: step.stepIndex,
268
- stepResult: step.stepResult,
269
- text: step.text,
270
- visibility: step.visibility,
271
- });
272
- if (step_parts.length > 0) {
273
- await this.inflight_service.append_assistant_step_parts(step_parts);
274
- }
275
-
276
- if (typeof providedOnAssistantStepCallback === "function") {
277
- await providedOnAssistantStepCallback(step);
278
- }
279
- };
280
- run_context.onAssistantStepCallback = wrappedOnAssistantStepCallback;
281
-
282
158
  const upstream_abort_signal = run_context.abortSignal;
283
159
  const abort_controller = new AbortController();
284
160
  const abort_from_upstream = () => {
@@ -298,48 +174,33 @@ export class Executor implements SessionExecutor {
298
174
  this.executing = true;
299
175
  this.recovery_policy.reset_run_state();
300
176
  try {
301
- const result = await withSessionRunScope(
302
- {
303
- runContext: run_context,
304
- },
305
- async () =>
306
- await withShellRunScope(
307
- {
308
- run_context: {
309
- session_id: run_context.sessionId,
310
- ...(run_context.turnId ? { turn_id: run_context.turnId } : {}),
311
- },
312
- },
313
- async () =>
314
- await this.recovery_policy.run_with_retry({
315
- query,
316
- model: this.resolveModelOrThrow(),
317
- run_context,
318
- prepare_execute_input: async ({
319
- query: next_query,
320
- model,
321
- run_context: next_run_context,
322
- retry_count,
323
- }) =>
324
- await this.prepareExecuteInput(
325
- next_query,
326
- model,
327
- next_run_context,
328
- retry_count,
329
- ),
330
- execute_prepared_run: async ({
331
- execute_input,
332
- model,
333
- run_context: next_run_context,
334
- }) =>
335
- await this.executePreparedRun(
336
- execute_input,
337
- model,
338
- next_run_context,
339
- ),
340
- }),
177
+ const result = await this.recovery_policy.run_with_retry({
178
+ query,
179
+ model: this.resolveModelOrThrow(),
180
+ run_context,
181
+ prepare_execute_input: async ({
182
+ query: next_query,
183
+ model,
184
+ run_context: next_run_context,
185
+ retry_count,
186
+ }) =>
187
+ await this.prepareExecuteInput(
188
+ next_query,
189
+ model,
190
+ next_run_context,
191
+ retry_count,
341
192
  ),
342
- );
193
+ execute_prepared_run: async ({
194
+ execute_input,
195
+ model,
196
+ run_context: next_run_context,
197
+ }) =>
198
+ await this.executePreparedRun(
199
+ execute_input,
200
+ model,
201
+ next_run_context,
202
+ ),
203
+ });
343
204
  return result;
344
205
  } finally {
345
206
  await this.release_step_plugins(run_context);
@@ -357,79 +218,22 @@ export class Executor implements SessionExecutor {
357
218
  */
358
219
  private async prepareExecuteInput(
359
220
  query: string,
360
- model: LanguageModel,
221
+ _model: LanguageModel,
361
222
  run_context: SessionRunContext,
362
223
  retry_count: number,
363
224
  ): Promise<SessionExecuteInput> {
364
- if (!String(this.historyComposer.sessionId || "").trim()) {
365
- throw new Error("Executor.run requires historyComposer.sessionId");
366
- }
367
-
368
- await this.refresh_step_runtime(run_context);
369
- const composed_context = await this.contextComposer.compose(run_context);
370
- const tools = this.bind_run_scope_to_tools(composed_context.tools, run_context);
371
- const system = await this.systemComposer.resolve(run_context);
372
- let compaction_action_id = "";
373
-
374
- try {
375
- if (retry_count > 0) {
376
- await this.logger.log("info", "[agent] compacting", {
377
- retryCount: retry_count,
378
- });
379
- }
380
-
381
- const emit_compaction_action = async (
382
- action: SessionActionRecordV1,
383
- ): Promise<void> => {
384
- if (action.state === "running") {
385
- compaction_action_id = action.id;
386
- }
387
- await this.emitAction(run_context, action);
388
- };
389
- const context_window = this.get_model_context_window?.();
390
-
391
- if (retry_count > 0) {
392
- await this.compactionComposer.run({
393
- historyStore: this.historyStore,
394
- model,
395
- ...(context_window !== undefined ? { context_window } : {}),
396
- system,
397
- retryCount: retry_count,
398
- force: true,
399
- onAction: emit_compaction_action,
400
- });
401
- }
402
- } catch (error) {
403
- await this.emitAction(run_context, {
404
- type: "action",
405
- id:
406
- compaction_action_id ||
407
- `compacting:${this.sessionId}:failed:${Date.now()}:${generateId()}`,
408
- title: "Session records compact failed",
409
- description: error instanceof Error ? error.message : String(error),
410
- state: "failed",
411
- metadata: {
412
- v: 1,
413
- ts: Date.now(),
414
- sessionId: this.sessionId,
415
- },
225
+ if (retry_count > 0) {
226
+ await this.logger.log("info", "[agent] compacting", {
227
+ retryCount: retry_count,
416
228
  });
417
- // 压缩失败不阻断主流程,继续使用当前历史消息执行。
229
+ await this.compact_history(run_context, retry_count);
418
230
  }
419
-
420
- const messages = await this.historyComposer.prepare({
421
- query,
422
- tools,
423
- system,
424
- model,
425
- retryCount: retry_count,
426
- });
427
-
231
+ const step = await this.compose_step(run_context, retry_count, true);
428
232
  return {
429
233
  query,
430
- system,
431
- messages,
432
- tools,
234
+ system: step.input.system,
235
+ messages: step.input.messages,
236
+ tools: step.input.tools,
433
237
  };
434
238
  }
435
239
 
@@ -447,6 +251,8 @@ export class Executor implements SessionExecutor {
447
251
  run_context,
448
252
  resolve_step_inputs: async () =>
449
253
  await this.resolve_step_inputs(run_context),
254
+ reload_history: async () =>
255
+ (await this.compose_step(run_context, 0, false)).input.messages,
450
256
  });
451
257
  }
452
258
 
@@ -454,48 +260,29 @@ export class Executor implements SessionExecutor {
454
260
  * 在 Assistant writer 完成后归档当前 canonical 历史。
455
261
  *
456
262
  * 关键点(中文):持久化 compact 不能发生在流式 Assistant 草稿仍打开时,
457
- * 因此由 SessionTurnService 在 writer complete/fail 之后显式调用。
263
+ * 因此由 SessionTurn 在 writer complete/fail 之后显式调用。
458
264
  */
459
- async compact_history(run_context: SessionRunContext): Promise<{
265
+ async compact_history(
266
+ run_context: SessionRunContext,
267
+ retry_count = 0,
268
+ ): Promise<{
460
269
  compacted: boolean;
461
270
  reason?: string;
462
271
  }> {
463
- let compaction_action_id = "";
464
272
  try {
465
- await this.refresh_step_runtime(run_context);
466
- const model = this.resolveModelOrThrow();
467
- const system = await this.systemComposer.resolve(run_context);
468
- const emit_compaction_action = async (
469
- action: SessionActionRecordV1,
470
- ): Promise<void> => {
471
- if (action.state === "running") compaction_action_id = action.id;
472
- await this.emitAction(run_context, action);
473
- };
474
- const context_window = this.get_model_context_window?.();
475
- return await this.compactionComposer.run({
476
- historyStore: this.historyStore,
477
- model,
478
- ...(context_window !== undefined ? { context_window } : {}),
479
- system,
480
- retryCount: 0,
273
+ const composed = await this.compose_step(
274
+ run_context,
275
+ retry_count,
276
+ true,
277
+ );
278
+ const plan = await this.composer.compact({
279
+ ...composed.compose_input,
481
280
  force: true,
482
- onAction: emit_compaction_action,
483
281
  });
282
+ if (!plan) return { compacted: false, reason: "nothing_to_compact" };
283
+ await this.commit_compaction(plan, run_context);
284
+ return { compacted: true };
484
285
  } catch (error) {
485
- await this.emitAction(run_context, {
486
- type: "action",
487
- id:
488
- compaction_action_id ||
489
- `compacting:${this.sessionId}:failed:${Date.now()}:${generateId()}`,
490
- title: "Session records compact failed",
491
- description: error instanceof Error ? error.message : String(error),
492
- state: "failed",
493
- metadata: {
494
- v: 1,
495
- ts: Date.now(),
496
- sessionId: this.sessionId,
497
- },
498
- });
499
286
  return { compacted: false, reason: "compact_failed" };
500
287
  } finally {
501
288
  await this.release_step_plugins(run_context);
@@ -515,17 +302,48 @@ export class Executor implements SessionExecutor {
515
302
  tools: SessionExecuteInput["tools"];
516
303
  context_window?: number;
517
304
  }> {
518
- await this.refresh_step_runtime(run_context);
519
- const composed_context = await this.contextComposer.compose(run_context);
520
- const context_window = this.get_model_context_window?.();
305
+ const composed = await this.compose_step(run_context, 0, true);
521
306
  return {
522
- model: this.resolveModelOrThrow(),
523
- system: await this.systemComposer.resolve(run_context),
524
- tools: this.bind_run_scope_to_tools(
525
- composed_context.tools,
307
+ model: composed.model,
308
+ system: composed.input.system,
309
+ tools: this.bind_run_context_to_tools(
310
+ composed.input.tools,
526
311
  run_context,
527
312
  ),
528
- ...(context_window !== undefined ? { context_window } : {}),
313
+ ...(composed.compose_input.state.model_context_window !== undefined
314
+ ? {
315
+ context_window:
316
+ composed.compose_input.state.model_context_window,
317
+ }
318
+ : {}),
319
+ };
320
+ }
321
+
322
+ /** 读取只读 Session 快照并交给统一 Composer。 */
323
+ private async compose_step(
324
+ run_context: SessionRunContext,
325
+ retry_count: number,
326
+ refresh_plugins: boolean,
327
+ ): Promise<{
328
+ compose_input: SessionComposeInput;
329
+ input: SessionStepInput;
330
+ model: LanguageModel;
331
+ }> {
332
+ if (refresh_plugins) await this.refresh_step_runtime(run_context);
333
+ const compose_input = await this.get_compose_input(
334
+ run_context,
335
+ retry_count,
336
+ );
337
+ const model = compose_input.state.model;
338
+ if (!model) throw new Error("requires a configured model.");
339
+ run_context.agentEnv = Object.freeze({ ...compose_input.state.env });
340
+ run_context.agentSystems = Object.freeze([
341
+ ...compose_input.state.systems,
342
+ ]);
343
+ return {
344
+ compose_input,
345
+ input: await this.composer.compose(compose_input),
346
+ model,
529
347
  };
530
348
  }
531
349
 
@@ -536,12 +354,6 @@ export class Executor implements SessionExecutor {
536
354
  run_context: SessionRunContext,
537
355
  ): Promise<void> {
538
356
  await this.release_step_plugins(run_context);
539
- run_context.agentEnv = Object.freeze({ ...this.getEnv() });
540
- if (this.get_systems) {
541
- run_context.agentSystems = Object.freeze([...this.get_systems()]);
542
- } else {
543
- delete run_context.agentSystems;
544
- }
545
357
  if (this.get_plugins) {
546
358
  run_context.agentPlugins = this.get_plugins().acquire();
547
359
  } else {
@@ -562,19 +374,27 @@ export class Executor implements SessionExecutor {
562
374
  }
563
375
 
564
376
  /**
565
- * 为所有 tool execute callback 绑定 ShellRunScope。
377
+ * 为所有 tool execute callback 绑定显式 Session 运行上下文。
566
378
  *
567
379
  * 关键点(中文)
568
- * - AI SDK streamText 在并行执行 tool callback 时会丢失 AsyncLocalStorage。
569
- * - tool.execute 入口重新进入 withShellRunScope,确保 Shell 能读取到 session/turn 上下文。
380
+ * - 每个 step 使用独立包装工具,不会在并行 Session 间共享可变指针。
381
+ * - Agent Shell 工具通过 ToolExecutionOptions.experimental_context 读取显式快照。
570
382
  */
571
- private bind_run_scope_to_tools(
383
+ private bind_run_context_to_tools(
572
384
  tools: Record<string, Tool>,
573
385
  run_context: SessionRunContext,
574
386
  ): Record<string, Tool> {
575
- const session_id = String(run_context.sessionId || "").trim();
576
- const turn_id = String(run_context.turnId || "").trim();
577
- if (!session_id && !turn_id) return tools;
387
+ const execution_context: SessionToolExecutionContext = {
388
+ session_run_context: run_context,
389
+ shell_run_context: {
390
+ ownerContextId: String(run_context.sessionId || "").trim() || undefined,
391
+ turnId: String(run_context.turnId || "").trim() || undefined,
392
+ ...(run_context.agentEnv ? { env: run_context.agentEnv } : {}),
393
+ ...(run_context.shell_approval_gateway
394
+ ? { approval_gateway: run_context.shell_approval_gateway }
395
+ : {}),
396
+ },
397
+ };
578
398
 
579
399
  const wrapped: Record<string, Tool> = {};
580
400
  for (const [name, tool] of Object.entries(tools)) {
@@ -586,18 +406,23 @@ export class Executor implements SessionExecutor {
586
406
  wrapped[name] = {
587
407
  ...tool,
588
408
  execute: async (args: unknown, options: ToolExecutionOptions) => {
589
- return await withShellRunScope(
590
- {
591
- run_context: {
592
- ...(session_id ? { session_id } : {}),
593
- ...(turn_id ? { turn_id } : {}),
594
- ...(run_context.agentEnv
595
- ? { env: run_context.agentEnv }
596
- : {}),
597
- },
598
- },
599
- async () => await original_execute(args, options),
600
- );
409
+ const tool_call_id = String(options.toolCallId || "").trim();
410
+ if (tool_call_id && run_context.on_tool_input_ready) {
411
+ await run_context.on_tool_input_ready({
412
+ tool_call_id,
413
+ tool_name: name,
414
+ input: args,
415
+ });
416
+ }
417
+ const output = await original_execute(args, {
418
+ ...options,
419
+ experimental_context: execution_context,
420
+ });
421
+ return inject_read_image_user_message({
422
+ tool_name: name,
423
+ output,
424
+ run_context,
425
+ });
601
426
  },
602
427
  };
603
428
  }
@@ -610,69 +435,38 @@ export class Executor implements SessionExecutor {
610
435
  private createRunContext(
611
436
  input?: SessionRunContext,
612
437
  ): SessionRunContext {
438
+ const source = input || {
439
+ sessionId: this.sessionId,
440
+ injectedUserMessages: [],
441
+ deferredPersistedUserMessages: [],
442
+ pendingAssistantFileParts: [],
443
+ };
444
+ const {
445
+ sessionId,
446
+ projectRoot,
447
+ injectedUserMessages,
448
+ deferredPersistedUserMessages,
449
+ pendingAssistantFileParts,
450
+ ...runtime_context
451
+ } = source;
613
452
  return {
614
- sessionId: String(input?.sessionId || this.sessionId).trim(),
615
- ...(typeof input?.projectRoot === "string" && input.projectRoot.trim()
616
- ? { projectRoot: input.projectRoot.trim() }
617
- : {}),
618
- ...(typeof input?.onStepCallback === "function"
619
- ? { onStepCallback: input.onStepCallback }
620
- : {}),
621
- ...(typeof input?.hasPendingStepInput === "function"
622
- ? { hasPendingStepInput: input.hasPendingStepInput }
623
- : {}),
624
- ...(typeof input?.consume_history_reload === "function"
625
- ? { consume_history_reload: input.consume_history_reload }
453
+ ...runtime_context,
454
+ sessionId: String(sessionId || this.sessionId).trim(),
455
+ ...(typeof projectRoot === "string" && projectRoot.trim()
456
+ ? { projectRoot: projectRoot.trim() }
626
457
  : {}),
627
- ...(typeof input?.onAssistantStepCallback === "function"
628
- ? { onAssistantStepCallback: input.onAssistantStepCallback }
629
- : {}),
630
- ...(typeof input?.onUiMessageChunkCallback === "function"
631
- ? { onUiMessageChunkCallback: input.onUiMessageChunkCallback }
632
- : {}),
633
- ...(typeof input?.onActionCallback === "function"
634
- ? { onActionCallback: input.onActionCallback }
635
- : {}),
636
- ...(input?.abortSignal ? { abortSignal: input.abortSignal } : {}),
637
- injectedUserMessages: Array.isArray(input?.injectedUserMessages)
638
- ? [...input.injectedUserMessages]
458
+ injectedUserMessages: Array.isArray(injectedUserMessages)
459
+ ? [...injectedUserMessages]
639
460
  : [],
640
- deferredPersistedUserMessages: Array.isArray(
641
- input?.deferredPersistedUserMessages,
642
- )
643
- ? [...input.deferredPersistedUserMessages]
461
+ deferredPersistedUserMessages: Array.isArray(deferredPersistedUserMessages)
462
+ ? [...deferredPersistedUserMessages]
644
463
  : [],
645
- pendingAssistantFileParts: Array.isArray(input?.pendingAssistantFileParts)
646
- ? [...input.pendingAssistantFileParts]
464
+ pendingAssistantFileParts: Array.isArray(pendingAssistantFileParts)
465
+ ? [...pendingAssistantFileParts]
647
466
  : [],
648
467
  };
649
468
  }
650
469
 
651
- /**
652
- * 发布一次 session action。
653
- */
654
- private async emitAction(
655
- run_context: SessionRunContext,
656
- action: SessionActionRecordV1,
657
- ): Promise<void> {
658
- if (typeof run_context.onActionCallback !== "function") return;
659
- const action_id =
660
- String(action.id || "").trim() ||
661
- `action:${this.sessionId}:${Date.now()}:${generateId()}`;
662
- const event = to_session_action_record({
663
- ...action,
664
- id: action_id,
665
- metadata: {
666
- ...action.metadata,
667
- sessionId: run_context.sessionId || this.sessionId,
668
- ...(run_context.turnId && !action.metadata.turnId
669
- ? { turnId: run_context.turnId }
670
- : {}),
671
- },
672
- }, run_context.sessionId || this.sessionId);
673
- await run_context.onActionCallback(event);
674
- }
675
-
676
470
  /**
677
471
  * 读取当前 session 模型。
678
472
  */