@downcity/agent 1.1.338 → 1.1.400

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 (987) hide show
  1. package/README.md +31 -15
  2. package/bin/agent/Agent.d.ts +42 -91
  3. package/bin/agent/Agent.d.ts.map +1 -1
  4. package/bin/agent/Agent.js +115 -200
  5. package/bin/agent/Agent.js.map +1 -1
  6. package/bin/agent/AgentModel.d.ts +8 -8
  7. package/bin/agent/AgentModel.d.ts.map +1 -1
  8. package/bin/agent/AgentModel.js +5 -5
  9. package/bin/agent/AgentModel.js.map +1 -1
  10. package/bin/agent/AgentSessions.d.ts +42 -28
  11. package/bin/agent/AgentSessions.d.ts.map +1 -1
  12. package/bin/agent/AgentSessions.js +80 -44
  13. package/bin/agent/AgentSessions.js.map +1 -1
  14. package/bin/agent/WorkspaceEntry.d.ts +82 -0
  15. package/bin/agent/WorkspaceEntry.d.ts.map +1 -0
  16. package/bin/agent/WorkspaceEntry.js +246 -0
  17. package/bin/agent/WorkspaceEntry.js.map +1 -0
  18. package/bin/agent/index.d.ts +5 -0
  19. package/bin/agent/index.d.ts.map +1 -0
  20. package/bin/agent/index.js +5 -0
  21. package/bin/agent/index.js.map +1 -0
  22. package/bin/city/host/CityHostRegistry.d.ts +44 -0
  23. package/bin/city/host/CityHostRegistry.d.ts.map +1 -0
  24. package/bin/city/host/CityHostRegistry.js +225 -0
  25. package/bin/city/host/CityHostRegistry.js.map +1 -0
  26. package/bin/city/index.d.ts +22 -0
  27. package/bin/city/index.d.ts.map +1 -0
  28. package/bin/city/index.js +10 -0
  29. package/bin/city/index.js.map +1 -0
  30. package/bin/city/runtime/City.d.ts +99 -0
  31. package/bin/city/runtime/City.d.ts.map +1 -0
  32. package/bin/city/runtime/City.js +376 -0
  33. package/bin/city/runtime/City.js.map +1 -0
  34. package/bin/city/transport/SerializedTransport.d.ts +30 -0
  35. package/bin/city/transport/SerializedTransport.d.ts.map +1 -0
  36. package/bin/city/transport/SerializedTransport.js +57 -0
  37. package/bin/city/transport/SerializedTransport.js.map +1 -0
  38. package/bin/city/transport/http/AgentHTTP.d.ts +66 -0
  39. package/bin/city/transport/http/AgentHTTP.d.ts.map +1 -0
  40. package/bin/city/transport/http/AgentHTTP.js +142 -0
  41. package/bin/city/transport/http/AgentHTTP.js.map +1 -0
  42. package/bin/city/transport/http/CityHTTP.d.ts +44 -0
  43. package/bin/city/transport/http/CityHTTP.d.ts.map +1 -0
  44. package/bin/city/transport/http/CityHTTP.js +171 -0
  45. package/bin/city/transport/http/CityHTTP.js.map +1 -0
  46. package/bin/city/transport/http/NodeHttpAdapter.d.ts +27 -0
  47. package/bin/city/transport/http/NodeHttpAdapter.d.ts.map +1 -0
  48. package/bin/city/transport/http/NodeHttpAdapter.js +57 -0
  49. package/bin/city/transport/http/NodeHttpAdapter.js.map +1 -0
  50. package/bin/city/transport/http/routes/RuntimeRoutes.d.ts +15 -0
  51. package/bin/city/transport/http/routes/RuntimeRoutes.d.ts.map +1 -0
  52. package/bin/city/transport/http/routes/RuntimeRoutes.js +38 -0
  53. package/bin/city/transport/http/routes/RuntimeRoutes.js.map +1 -0
  54. package/bin/city/transport/http/routes/SessionRoutes.d.ts +17 -0
  55. package/bin/city/transport/http/routes/SessionRoutes.d.ts.map +1 -0
  56. package/bin/city/transport/http/routes/SessionRoutes.js +417 -0
  57. package/bin/city/transport/http/routes/SessionRoutes.js.map +1 -0
  58. package/bin/city/transport/rpc/AgentRPC.d.ts +47 -0
  59. package/bin/city/transport/rpc/AgentRPC.d.ts.map +1 -0
  60. package/bin/city/transport/rpc/AgentRPC.js +89 -0
  61. package/bin/city/transport/rpc/AgentRPC.js.map +1 -0
  62. package/bin/city/transport/rpc/CityRPC.d.ts +26 -0
  63. package/bin/city/transport/rpc/CityRPC.d.ts.map +1 -0
  64. package/bin/city/transport/rpc/CityRPC.js +110 -0
  65. package/bin/city/transport/rpc/CityRPC.js.map +1 -0
  66. package/bin/city/transport/rpc/RpcServer.d.ts +30 -0
  67. package/bin/city/transport/rpc/RpcServer.d.ts.map +1 -0
  68. package/bin/city/transport/rpc/RpcServer.js +125 -0
  69. package/bin/city/transport/rpc/RpcServer.js.map +1 -0
  70. package/bin/city/transport/rpc/server/InternalHandlers.d.ts +22 -0
  71. package/bin/city/transport/rpc/server/InternalHandlers.d.ts.map +1 -0
  72. package/bin/city/transport/rpc/server/InternalHandlers.js +196 -0
  73. package/bin/city/transport/rpc/server/InternalHandlers.js.map +1 -0
  74. package/bin/city/transport/rpc/server/RequestDispatcher.d.ts +27 -0
  75. package/bin/city/transport/rpc/server/RequestDispatcher.d.ts.map +1 -0
  76. package/bin/city/transport/rpc/server/RequestDispatcher.js +38 -0
  77. package/bin/city/transport/rpc/server/RequestDispatcher.js.map +1 -0
  78. package/bin/city/transport/rpc/server/SdkSessionHandlers.d.ts +25 -0
  79. package/bin/city/transport/rpc/server/SdkSessionHandlers.d.ts.map +1 -0
  80. package/bin/city/transport/rpc/server/SdkSessionHandlers.js +146 -0
  81. package/bin/city/transport/rpc/server/SdkSessionHandlers.js.map +1 -0
  82. package/bin/city/transport/rpc/server/ServerTypes.d.ts +94 -0
  83. package/bin/city/transport/rpc/server/ServerTypes.d.ts.map +1 -0
  84. package/bin/city/transport/rpc/server/ServerTypes.js +9 -0
  85. package/bin/city/transport/rpc/server/ServerTypes.js.map +1 -0
  86. package/bin/city/transport/session/RemoteSessionConfig.d.ts +15 -0
  87. package/bin/city/transport/session/RemoteSessionConfig.d.ts.map +1 -0
  88. package/bin/city/transport/session/RemoteSessionConfig.js +23 -0
  89. package/bin/city/transport/session/RemoteSessionConfig.js.map +1 -0
  90. package/bin/city/transport/types/AgentHttpBinding.d.ts +24 -0
  91. package/bin/city/transport/types/AgentHttpBinding.d.ts.map +1 -0
  92. package/bin/city/transport/types/AgentHttpBinding.js +5 -0
  93. package/bin/city/transport/types/AgentHttpBinding.js.map +1 -0
  94. package/bin/city/transport/types/AgentHttpRuntime.d.ts +12 -0
  95. package/bin/city/transport/types/AgentHttpRuntime.d.ts.map +1 -0
  96. package/bin/city/transport/types/AgentHttpRuntime.js +7 -0
  97. package/bin/city/transport/types/AgentHttpRuntime.js.map +1 -0
  98. package/bin/city/transport/types/AgentRpcBinding.d.ts +27 -0
  99. package/bin/city/transport/types/AgentRpcBinding.d.ts.map +1 -0
  100. package/bin/city/transport/types/AgentRpcBinding.js +8 -0
  101. package/bin/city/transport/types/AgentRpcBinding.js.map +1 -0
  102. package/bin/city/transport/types/AgentRpcRuntime.d.ts +18 -0
  103. package/bin/city/transport/types/AgentRpcRuntime.d.ts.map +1 -0
  104. package/bin/city/transport/types/AgentRpcRuntime.js +7 -0
  105. package/bin/city/transport/types/AgentRpcRuntime.js.map +1 -0
  106. package/bin/city/transport/types/AgentSessionModelResolver.d.ts +11 -0
  107. package/bin/city/transport/types/AgentSessionModelResolver.d.ts.map +1 -0
  108. package/bin/city/transport/types/AgentSessionModelResolver.js +7 -0
  109. package/bin/city/transport/types/AgentSessionModelResolver.js.map +1 -0
  110. package/bin/city/transport/types/CityHttpRuntime.d.ts +36 -0
  111. package/bin/city/transport/types/CityHttpRuntime.d.ts.map +1 -0
  112. package/bin/city/transport/types/CityHttpRuntime.js +8 -0
  113. package/bin/city/transport/types/CityHttpRuntime.js.map +1 -0
  114. package/bin/city/transport/types/CityRpcRuntime.d.ts +17 -0
  115. package/bin/city/transport/types/CityRpcRuntime.d.ts.map +1 -0
  116. package/bin/city/transport/types/CityRpcRuntime.js +8 -0
  117. package/bin/city/transport/types/CityRpcRuntime.js.map +1 -0
  118. package/bin/city/transport/types/RpcProtocol.d.ts +24 -0
  119. package/bin/city/transport/types/RpcProtocol.d.ts.map +1 -0
  120. package/bin/city/transport/types/RpcProtocol.js +9 -0
  121. package/bin/city/transport/types/RpcProtocol.js.map +1 -0
  122. package/bin/city/types/City.d.ts +84 -0
  123. package/bin/city/types/City.d.ts.map +1 -0
  124. package/bin/city/types/City.js +7 -0
  125. package/bin/city/types/City.js.map +1 -0
  126. package/bin/city/types/PluginHostContext.d.ts +31 -0
  127. package/bin/city/types/PluginHostContext.d.ts.map +1 -0
  128. package/bin/city/types/PluginHostContext.js +11 -0
  129. package/bin/city/types/PluginHostContext.js.map +1 -0
  130. package/bin/city/types/SerializedTransport.d.ts +16 -0
  131. package/bin/city/types/SerializedTransport.d.ts.map +1 -0
  132. package/bin/city/types/SerializedTransport.js +3 -0
  133. package/bin/city/types/SerializedTransport.js.map +1 -0
  134. package/bin/executor/Executor.d.ts +4 -4
  135. package/bin/executor/Executor.d.ts.map +1 -1
  136. package/bin/executor/Executor.js +90 -34
  137. package/bin/executor/Executor.js.map +1 -1
  138. package/bin/executor/composer/system/SessionSystemComposer.d.ts +2 -2
  139. package/bin/executor/composer/system/SessionSystemComposer.d.ts.map +1 -1
  140. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts +3 -3
  141. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.js +1 -1
  142. package/bin/executor/composer/system/default/PromptRenderer.d.ts +3 -3
  143. package/bin/executor/composer/system/default/PromptRenderer.d.ts.map +1 -1
  144. package/bin/executor/composer/system/default/PromptRenderer.js +1 -1
  145. package/bin/executor/composer/system/default/SystemDomain.d.ts +3 -3
  146. package/bin/executor/composer/system/default/SystemDomain.d.ts.map +1 -1
  147. package/bin/executor/composer/system/default/SystemDomain.js +3 -3
  148. package/bin/executor/composer/system/default/SystemDomain.js.map +1 -1
  149. package/bin/executor/composer/system/default/SystemPromptAssets.js +2 -2
  150. package/bin/executor/composer/system/default/assets/core.prompt.d.ts +1 -1
  151. package/bin/executor/composer/system/default/assets/core.prompt.d.ts.map +1 -1
  152. package/bin/executor/composer/system/default/assets/core.prompt.js +1 -1
  153. package/bin/executor/composer/system/default/assets/core.prompt.js.map +1 -1
  154. package/bin/executor/composer/system/default/variables/GeoContext.d.ts +1 -1
  155. package/bin/executor/composer/system/default/variables/VariableReplacer.js +1 -1
  156. package/bin/executor/core-engine/CoreEngineContextCompaction.d.ts +6 -23
  157. package/bin/executor/core-engine/CoreEngineContextCompaction.d.ts.map +1 -1
  158. package/bin/executor/core-engine/CoreEngineContextCompaction.js +112 -344
  159. package/bin/executor/core-engine/CoreEngineContextCompaction.js.map +1 -1
  160. package/bin/executor/core-engine/CoreEngineError.d.ts +1 -1
  161. package/bin/executor/core-engine/CoreEngineError.js +1 -1
  162. package/bin/executor/core-engine/CoreEngineLoopDecision.d.ts +2 -3
  163. package/bin/executor/core-engine/CoreEngineLoopDecision.d.ts.map +1 -1
  164. package/bin/executor/core-engine/CoreEngineLoopDecision.js +1 -15
  165. package/bin/executor/core-engine/CoreEngineLoopDecision.js.map +1 -1
  166. package/bin/executor/core-engine/CoreEngineMessageState.d.ts +16 -39
  167. package/bin/executor/core-engine/CoreEngineMessageState.d.ts.map +1 -1
  168. package/bin/executor/core-engine/CoreEngineMessageState.js +25 -60
  169. package/bin/executor/core-engine/CoreEngineMessageState.js.map +1 -1
  170. package/bin/executor/core-engine/CoreEngineRunner.d.ts +10 -6
  171. package/bin/executor/core-engine/CoreEngineRunner.d.ts.map +1 -1
  172. package/bin/executor/core-engine/CoreEngineRunner.js +146 -234
  173. package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -1
  174. package/bin/executor/core-engine/CoreEngineSignals.d.ts +20 -58
  175. package/bin/executor/core-engine/CoreEngineSignals.d.ts.map +1 -1
  176. package/bin/executor/core-engine/CoreEngineSignals.js +84 -304
  177. package/bin/executor/core-engine/CoreEngineSignals.js.map +1 -1
  178. package/bin/executor/messages/SessionAttachmentMapper.d.ts +6 -37
  179. package/bin/executor/messages/SessionAttachmentMapper.d.ts.map +1 -1
  180. package/bin/executor/messages/SessionAttachmentMapper.js +12 -243
  181. package/bin/executor/messages/SessionAttachmentMapper.js.map +1 -1
  182. package/bin/executor/messages/SessionMessageLog.d.ts +7 -14
  183. package/bin/executor/messages/SessionMessageLog.d.ts.map +1 -1
  184. package/bin/executor/messages/SessionMessageLog.js +11 -26
  185. package/bin/executor/messages/SessionMessageLog.js.map +1 -1
  186. package/bin/executor/messages/SessionModelMessages.d.ts +14 -0
  187. package/bin/executor/messages/SessionModelMessages.d.ts.map +1 -0
  188. package/bin/executor/messages/SessionModelMessages.js +187 -0
  189. package/bin/executor/messages/SessionModelMessages.js.map +1 -0
  190. package/bin/executor/model/ModelGenerate.d.ts +22 -0
  191. package/bin/executor/model/ModelGenerate.d.ts.map +1 -0
  192. package/bin/executor/model/ModelGenerate.js +54 -0
  193. package/bin/executor/model/ModelGenerate.js.map +1 -0
  194. package/bin/executor/model/ModelStepRunner.d.ts +70 -0
  195. package/bin/executor/model/ModelStepRunner.d.ts.map +1 -0
  196. package/bin/executor/model/ModelStepRunner.js +284 -0
  197. package/bin/executor/model/ModelStepRunner.js.map +1 -0
  198. package/bin/executor/services/ExecutorRecoveryPolicy.d.ts +4 -4
  199. package/bin/executor/services/ExecutorRecoveryPolicy.d.ts.map +1 -1
  200. package/bin/executor/types/SessionHistoryMeta.d.ts +7 -2
  201. package/bin/executor/types/SessionHistoryMeta.d.ts.map +1 -1
  202. package/bin/executor/types/SessionHistoryMeta.js +1 -1
  203. package/bin/executor/types/SessionLoop.d.ts +1 -21
  204. package/bin/executor/types/SessionLoop.d.ts.map +1 -1
  205. package/bin/executor/types/SessionPrompts.d.ts +8 -7
  206. package/bin/executor/types/SessionPrompts.d.ts.map +1 -1
  207. package/bin/executor/types/SessionPrompts.js +1 -2
  208. package/bin/executor/types/SessionPrompts.js.map +1 -1
  209. package/bin/group/Group.d.ts +20 -0
  210. package/bin/group/Group.d.ts.map +1 -0
  211. package/bin/group/Group.js +42 -0
  212. package/bin/group/Group.js.map +1 -0
  213. package/bin/group/GroupSession.d.ts +103 -0
  214. package/bin/group/GroupSession.d.ts.map +1 -0
  215. package/bin/group/GroupSession.js +666 -0
  216. package/bin/group/GroupSession.js.map +1 -0
  217. package/bin/group/GroupSessions.d.ts +21 -0
  218. package/bin/group/GroupSessions.d.ts.map +1 -0
  219. package/bin/group/GroupSessions.js +89 -0
  220. package/bin/group/GroupSessions.js.map +1 -0
  221. package/bin/group/index.d.ts +9 -0
  222. package/bin/group/index.d.ts.map +1 -0
  223. package/bin/group/index.js +6 -0
  224. package/bin/group/index.js.map +1 -0
  225. package/bin/index.d.ts +28 -20
  226. package/bin/index.d.ts.map +1 -1
  227. package/bin/index.js +7 -9
  228. package/bin/index.js.map +1 -1
  229. package/bin/internal/AgentRuntime.d.ts +43 -0
  230. package/bin/internal/AgentRuntime.d.ts.map +1 -0
  231. package/bin/internal/AgentRuntime.js +179 -0
  232. package/bin/internal/AgentRuntime.js.map +1 -0
  233. package/bin/internal/GroupRuntime.d.ts +17 -0
  234. package/bin/internal/GroupRuntime.d.ts.map +1 -0
  235. package/bin/internal/GroupRuntime.js +66 -0
  236. package/bin/internal/GroupRuntime.js.map +1 -0
  237. package/bin/internal/index.d.ts +8 -0
  238. package/bin/internal/index.d.ts.map +1 -0
  239. package/bin/internal/index.js +8 -0
  240. package/bin/internal/index.js.map +1 -0
  241. package/bin/plugin/core/ActionScheduleExecutor.d.ts +3 -2
  242. package/bin/plugin/core/ActionScheduleExecutor.d.ts.map +1 -1
  243. package/bin/plugin/core/ActionScheduleExecutor.js +14 -3
  244. package/bin/plugin/core/ActionScheduleExecutor.js.map +1 -1
  245. package/bin/plugin/core/ActionScheduleRuntime.d.ts +3 -1
  246. package/bin/plugin/core/ActionScheduleRuntime.d.ts.map +1 -1
  247. package/bin/plugin/core/ActionScheduleRuntime.js +9 -8
  248. package/bin/plugin/core/ActionScheduleRuntime.js.map +1 -1
  249. package/bin/plugin/core/ActionScheduleStore.d.ts +7 -3
  250. package/bin/plugin/core/ActionScheduleStore.d.ts.map +1 -1
  251. package/bin/plugin/core/ActionScheduleStore.js +32 -9
  252. package/bin/plugin/core/ActionScheduleStore.js.map +1 -1
  253. package/bin/plugin/core/HookRegistry.d.ts +4 -6
  254. package/bin/plugin/core/HookRegistry.d.ts.map +1 -1
  255. package/bin/plugin/core/HookRegistry.js +8 -14
  256. package/bin/plugin/core/HookRegistry.js.map +1 -1
  257. package/bin/plugin/core/PluginActionExecution.d.ts +33 -0
  258. package/bin/plugin/core/PluginActionExecution.d.ts.map +1 -0
  259. package/bin/plugin/core/PluginActionExecution.js +168 -0
  260. package/bin/plugin/core/PluginActionExecution.js.map +1 -0
  261. package/bin/plugin/core/PluginActionFactory.d.ts +6 -3
  262. package/bin/plugin/core/PluginActionFactory.d.ts.map +1 -1
  263. package/bin/plugin/core/PluginActionFactory.js +3 -0
  264. package/bin/plugin/core/PluginActionFactory.js.map +1 -1
  265. package/bin/plugin/core/PluginContext.d.ts +14 -4
  266. package/bin/plugin/core/PluginContext.d.ts.map +1 -1
  267. package/bin/plugin/core/PluginContext.js +11 -2
  268. package/bin/plugin/core/PluginContext.js.map +1 -1
  269. package/bin/plugin/core/PluginHttpRoutes.d.ts +1 -1
  270. package/bin/plugin/core/PluginHttpRoutes.d.ts.map +1 -1
  271. package/bin/plugin/core/PluginHttpRoutes.js +1 -1
  272. package/bin/plugin/core/PluginHttpRoutes.js.map +1 -1
  273. package/bin/plugin/core/PluginRegistry.d.ts +41 -26
  274. package/bin/plugin/core/PluginRegistry.d.ts.map +1 -1
  275. package/bin/plugin/core/PluginRegistry.js +125 -107
  276. package/bin/plugin/core/PluginRegistry.js.map +1 -1
  277. package/bin/plugin/tool/PluginToolRuntime.d.ts.map +1 -1
  278. package/bin/plugin/tool/PluginToolRuntime.js +4 -1
  279. package/bin/plugin/tool/PluginToolRuntime.js.map +1 -1
  280. package/bin/plugin/tool/PluginToolSchemas.d.ts +22 -2
  281. package/bin/plugin/tool/PluginToolSchemas.d.ts.map +1 -1
  282. package/bin/plugin/tool/PluginToolSchemas.js +3 -4
  283. package/bin/plugin/tool/PluginToolSchemas.js.map +1 -1
  284. package/bin/plugin/tool/PluginTools.d.ts +5 -8
  285. package/bin/plugin/tool/PluginTools.d.ts.map +1 -1
  286. package/bin/plugin/tool/PluginTools.js +9 -8
  287. package/bin/plugin/tool/PluginTools.js.map +1 -1
  288. package/bin/plugin/types/ActionSchedule.d.ts +6 -0
  289. package/bin/plugin/types/ActionSchedule.d.ts.map +1 -1
  290. package/bin/remote/RemoteAgent.js +2 -2
  291. package/bin/remote/RemoteSession.d.ts +1 -1
  292. package/bin/remote/TransportFactory.d.ts +1 -1
  293. package/bin/remote/TransportFactory.js +2 -2
  294. package/bin/remote/transports/HttpRemoteAgentTransport.d.ts +1 -1
  295. package/bin/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -1
  296. package/bin/remote/transports/HttpRemoteAgentTransport.js +3 -3
  297. package/bin/remote/transports/HttpRemoteAgentTransport.js.map +1 -1
  298. package/bin/remote/transports/RpcClient.d.ts +1 -0
  299. package/bin/remote/transports/RpcClient.d.ts.map +1 -1
  300. package/bin/remote/transports/RpcClient.js +16 -0
  301. package/bin/remote/transports/RpcClient.js.map +1 -1
  302. package/bin/remote/transports/RpcRemoteAgentTransport.d.ts +1 -1
  303. package/bin/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -1
  304. package/bin/remote/transports/RpcRemoteAgentTransport.js +2 -1
  305. package/bin/remote/transports/RpcRemoteAgentTransport.js.map +1 -1
  306. package/bin/session/DefaultSessionComposer.js +4 -4
  307. package/bin/session/DefaultSessionComposer.js.map +1 -1
  308. package/bin/session/Session.d.ts +9 -3
  309. package/bin/session/Session.d.ts.map +1 -1
  310. package/bin/session/Session.js +62 -53
  311. package/bin/session/Session.js.map +1 -1
  312. package/bin/session/SessionLoop.d.ts.map +1 -1
  313. package/bin/session/SessionLoop.js +23 -25
  314. package/bin/session/SessionLoop.js.map +1 -1
  315. package/bin/session/SessionMessages.d.ts +9 -11
  316. package/bin/session/SessionMessages.d.ts.map +1 -1
  317. package/bin/session/SessionMessages.js +56 -104
  318. package/bin/session/SessionMessages.js.map +1 -1
  319. package/bin/session/SessionQueue.d.ts +1 -1
  320. package/bin/session/SessionState.d.ts +3 -0
  321. package/bin/session/SessionState.d.ts.map +1 -1
  322. package/bin/session/SessionState.js +42 -12
  323. package/bin/session/SessionState.js.map +1 -1
  324. package/bin/session/SessionTitle.d.ts +6 -6
  325. package/bin/session/SessionTitle.d.ts.map +1 -1
  326. package/bin/session/SessionTitle.js +11 -39
  327. package/bin/session/SessionTitle.js.map +1 -1
  328. package/bin/session/browse/Browse.d.ts +6 -4
  329. package/bin/session/browse/Browse.d.ts.map +1 -1
  330. package/bin/session/browse/Browse.js +25 -43
  331. package/bin/session/browse/Browse.js.map +1 -1
  332. package/bin/session/control/SessionInteractions.d.ts +2 -2
  333. package/bin/session/control/SessionInteractions.d.ts.map +1 -1
  334. package/bin/session/control/SessionInteractions.js +68 -32
  335. package/bin/session/control/SessionInteractions.js.map +1 -1
  336. package/bin/session/execution/SessionAssistantOutputAdapter.d.ts +20 -17
  337. package/bin/session/execution/SessionAssistantOutputAdapter.d.ts.map +1 -1
  338. package/bin/session/execution/SessionAssistantOutputAdapter.js +35 -35
  339. package/bin/session/execution/SessionAssistantOutputAdapter.js.map +1 -1
  340. package/bin/session/execution/tools/SessionShellApprovalAdapter.d.ts +2 -2
  341. package/bin/session/execution/tools/SessionShellApprovalAdapter.d.ts.map +1 -1
  342. package/bin/session/execution/tools/SessionShellApprovalAdapter.js +20 -8
  343. package/bin/session/execution/tools/SessionShellApprovalAdapter.js.map +1 -1
  344. package/bin/session/messages/SessionAssistantMessageWriter.d.ts +42 -48
  345. package/bin/session/messages/SessionAssistantMessageWriter.d.ts.map +1 -1
  346. package/bin/session/messages/SessionAssistantMessageWriter.js +225 -543
  347. package/bin/session/messages/SessionAssistantMessageWriter.js.map +1 -1
  348. package/bin/session/messages/SessionJsonValue.d.ts +0 -10
  349. package/bin/session/messages/SessionJsonValue.d.ts.map +1 -1
  350. package/bin/session/messages/SessionJsonValue.js +0 -23
  351. package/bin/session/messages/SessionJsonValue.js.map +1 -1
  352. package/bin/session/messages/SessionMessageCompaction.d.ts +7 -3
  353. package/bin/session/messages/SessionMessageCompaction.d.ts.map +1 -1
  354. package/bin/session/messages/SessionMessageCompaction.js +69 -91
  355. package/bin/session/messages/SessionMessageCompaction.js.map +1 -1
  356. package/bin/session/messages/SessionMessageInteractionWriter.d.ts.map +1 -1
  357. package/bin/session/messages/SessionMessageInteractionWriter.js +22 -21
  358. package/bin/session/messages/SessionMessageInteractionWriter.js.map +1 -1
  359. package/bin/session/messages/SessionMessageText.d.ts +25 -0
  360. package/bin/session/messages/SessionMessageText.d.ts.map +1 -0
  361. package/bin/session/messages/SessionMessageText.js +52 -0
  362. package/bin/session/messages/SessionMessageText.js.map +1 -0
  363. package/bin/session/preview/SessionMessagePreview.d.ts +3 -3
  364. package/bin/session/preview/SessionMessagePreview.d.ts.map +1 -1
  365. package/bin/session/preview/SessionMessagePreview.js +10 -30
  366. package/bin/session/preview/SessionMessagePreview.js.map +1 -1
  367. package/bin/session/runtime/SessionTurnContext.d.ts.map +1 -1
  368. package/bin/session/runtime/SessionTurnContext.js +4 -2
  369. package/bin/session/runtime/SessionTurnContext.js.map +1 -1
  370. package/bin/session/storage/Metadata.d.ts +5 -3
  371. package/bin/session/storage/Metadata.d.ts.map +1 -1
  372. package/bin/session/storage/Metadata.js +26 -7
  373. package/bin/session/storage/Metadata.js.map +1 -1
  374. package/bin/tools/ask/AskQuestionsTool.d.ts +2 -16
  375. package/bin/tools/ask/AskQuestionsTool.d.ts.map +1 -1
  376. package/bin/tools/ask/AskQuestionsTool.js +21 -17
  377. package/bin/tools/ask/AskQuestionsTool.js.map +1 -1
  378. package/bin/types/action/ActionResult.d.ts +15 -10
  379. package/bin/types/action/ActionResult.d.ts.map +1 -1
  380. package/bin/types/action/ActionResult.js +2 -2
  381. package/bin/types/action/ActionResult.js.map +1 -1
  382. package/bin/types/agent/AgentOptions.d.ts +7 -14
  383. package/bin/types/agent/AgentOptions.d.ts.map +1 -1
  384. package/bin/types/agent/AgentSessionCollection.d.ts +42 -0
  385. package/bin/types/agent/AgentSessionCollection.d.ts.map +1 -0
  386. package/bin/types/agent/AgentSessionCollection.js +7 -0
  387. package/bin/types/agent/AgentSessionCollection.js.map +1 -0
  388. package/bin/types/agent/AgentStorage.d.ts +18 -0
  389. package/bin/types/agent/AgentStorage.d.ts.map +1 -0
  390. package/bin/types/agent/AgentStorage.js +8 -0
  391. package/bin/types/agent/AgentStorage.js.map +1 -0
  392. package/bin/types/agent/RemoteAgentOptions.d.ts +1 -1
  393. package/bin/types/agent/RemoteAgentPluginAction.d.ts +2 -2
  394. package/bin/types/agent/SessionActor.d.ts +15 -8
  395. package/bin/types/agent/SessionActor.d.ts.map +1 -1
  396. package/bin/types/agent/SessionTypes.d.ts +30 -11
  397. package/bin/types/agent/SessionTypes.d.ts.map +1 -1
  398. package/bin/types/agent/WorkspaceEntryOptions.d.ts +16 -0
  399. package/bin/types/agent/WorkspaceEntryOptions.d.ts.map +1 -0
  400. package/bin/types/agent/WorkspaceEntryOptions.js +8 -0
  401. package/bin/types/agent/WorkspaceEntryOptions.js.map +1 -0
  402. package/bin/types/executor/SessionAssistantOutput.d.ts +19 -17
  403. package/bin/types/executor/SessionAssistantOutput.d.ts.map +1 -1
  404. package/bin/types/executor/SessionAssistantOutput.js +2 -3
  405. package/bin/types/executor/SessionAssistantOutput.js.map +1 -1
  406. package/bin/types/executor/SessionToolExecutionContext.d.ts +8 -5
  407. package/bin/types/executor/SessionToolExecutionContext.d.ts.map +1 -1
  408. package/bin/types/executor/SessionToolExecutionContext.js +1 -1
  409. package/bin/types/executor/SessionTurnContext.d.ts +16 -16
  410. package/bin/types/executor/SessionTurnContext.d.ts.map +1 -1
  411. package/bin/types/group/DispatchStrategy.d.ts +62 -0
  412. package/bin/types/group/DispatchStrategy.d.ts.map +1 -0
  413. package/bin/types/group/DispatchStrategy.js +93 -0
  414. package/bin/types/group/DispatchStrategy.js.map +1 -0
  415. package/bin/types/group/Group.d.ts +61 -0
  416. package/bin/types/group/Group.d.ts.map +1 -0
  417. package/bin/types/group/Group.js +3 -0
  418. package/bin/types/group/Group.js.map +1 -0
  419. package/bin/types/group/GroupSession.d.ts +149 -0
  420. package/bin/types/group/GroupSession.d.ts.map +1 -0
  421. package/bin/types/group/GroupSession.js +3 -0
  422. package/bin/types/group/GroupSession.js.map +1 -0
  423. package/bin/types/group/GroupSessionStore.d.ts +77 -0
  424. package/bin/types/group/GroupSessionStore.d.ts.map +1 -0
  425. package/bin/types/group/GroupSessionStore.js +3 -0
  426. package/bin/types/group/GroupSessionStore.js.map +1 -0
  427. package/bin/types/plugin/AgentPluginContext.d.ts +25 -0
  428. package/bin/types/plugin/AgentPluginContext.d.ts.map +1 -0
  429. package/bin/types/plugin/AgentPluginContext.js +10 -0
  430. package/bin/types/plugin/AgentPluginContext.js.map +1 -0
  431. package/bin/types/plugin/PluginAction.d.ts +10 -8
  432. package/bin/types/plugin/PluginAction.d.ts.map +1 -1
  433. package/bin/types/plugin/PluginActionExecution.d.ts +31 -0
  434. package/bin/types/plugin/PluginActionExecution.d.ts.map +1 -0
  435. package/bin/types/plugin/PluginActionExecution.js +10 -0
  436. package/bin/types/plugin/PluginActionExecution.js.map +1 -0
  437. package/bin/types/plugin/PluginCommand.d.ts +5 -5
  438. package/bin/types/plugin/PluginCommand.d.ts.map +1 -1
  439. package/bin/types/plugin/PluginContext.d.ts +19 -8
  440. package/bin/types/plugin/PluginContext.d.ts.map +1 -1
  441. package/bin/types/plugin/PluginContext.js +1 -1
  442. package/bin/types/plugin/PluginDefinition.d.ts +6 -6
  443. package/bin/types/plugin/PluginExecutionContext.d.ts +4 -10
  444. package/bin/types/plugin/PluginExecutionContext.d.ts.map +1 -1
  445. package/bin/types/plugin/PluginExecutionContext.js +3 -5
  446. package/bin/types/plugin/PluginExecutionContext.js.map +1 -1
  447. package/bin/types/plugin/PluginHttp.d.ts +1 -1
  448. package/bin/types/plugin/PluginRuntime.d.ts +13 -8
  449. package/bin/types/plugin/PluginRuntime.d.ts.map +1 -1
  450. package/bin/types/plugin/PluginServices.d.ts +10 -0
  451. package/bin/types/plugin/PluginServices.d.ts.map +1 -0
  452. package/bin/types/plugin/PluginServices.js +3 -0
  453. package/bin/types/plugin/PluginServices.js.map +1 -0
  454. package/bin/types/plugin/PluginState.d.ts +3 -3
  455. package/bin/types/plugin/PluginState.d.ts.map +1 -1
  456. package/bin/types/plugin/PluginState.js +1 -1
  457. package/bin/types/plugin/PluginTool.d.ts +6 -4
  458. package/bin/types/plugin/PluginTool.d.ts.map +1 -1
  459. package/bin/types/rpc/RpcProtocol.d.ts +30 -8
  460. package/bin/types/rpc/RpcProtocol.d.ts.map +1 -1
  461. package/bin/types/sdk/AgentSessionAction.d.ts +6 -7
  462. package/bin/types/sdk/AgentSessionAction.d.ts.map +1 -1
  463. package/bin/types/sdk/AgentSessionAction.js +2 -3
  464. package/bin/types/sdk/AgentSessionAction.js.map +1 -1
  465. package/bin/types/sdk/AgentSessionPrompt.d.ts +7 -7
  466. package/bin/types/sdk/AgentSessionPrompt.d.ts.map +1 -1
  467. package/bin/types/sdk/AgentSessionPrompt.js +1 -4
  468. package/bin/types/sdk/AgentSessionPrompt.js.map +1 -1
  469. package/bin/types/session/SessionAction.d.ts +39 -0
  470. package/bin/types/session/SessionAction.d.ts.map +1 -0
  471. package/bin/types/session/SessionAction.js +8 -0
  472. package/bin/types/session/SessionAction.js.map +1 -0
  473. package/bin/types/session/SessionComposer.d.ts +10 -11
  474. package/bin/types/session/SessionComposer.d.ts.map +1 -1
  475. package/bin/types/session/SessionContent.d.ts +41 -0
  476. package/bin/types/session/SessionContent.d.ts.map +1 -0
  477. package/bin/types/session/SessionContent.js +8 -0
  478. package/bin/types/session/SessionContent.js.map +1 -0
  479. package/bin/types/session/SessionExecution.d.ts +9 -68
  480. package/bin/types/session/SessionExecution.d.ts.map +1 -1
  481. package/bin/types/session/SessionInteraction.d.ts +92 -58
  482. package/bin/types/session/SessionInteraction.d.ts.map +1 -1
  483. package/bin/types/session/SessionInteraction.js +11 -4
  484. package/bin/types/session/SessionInteraction.js.map +1 -1
  485. package/bin/types/session/SessionInteractions.d.ts +1 -1
  486. package/bin/types/session/SessionLocalState.d.ts +2 -2
  487. package/bin/types/session/SessionLoop.d.ts +5 -5
  488. package/bin/types/session/SessionLoop.d.ts.map +1 -1
  489. package/bin/types/session/SessionMessage.d.ts +27 -87
  490. package/bin/types/session/SessionMessage.d.ts.map +1 -1
  491. package/bin/types/session/SessionMessages.d.ts +14 -14
  492. package/bin/types/session/SessionMessages.d.ts.map +1 -1
  493. package/bin/types/session/SessionMutation.d.ts +2 -2
  494. package/bin/types/session/SessionOptions.d.ts +14 -9
  495. package/bin/types/session/SessionOptions.d.ts.map +1 -1
  496. package/bin/types/session/SessionOrigin.d.ts +19 -0
  497. package/bin/types/session/SessionOrigin.d.ts.map +1 -0
  498. package/bin/types/session/SessionOrigin.js +8 -0
  499. package/bin/types/session/SessionOrigin.js.map +1 -0
  500. package/bin/types/session/SessionPort.d.ts +16 -20
  501. package/bin/types/session/SessionPort.d.ts.map +1 -1
  502. package/bin/types/session/SessionSegment.d.ts +1 -1
  503. package/bin/types/session/SessionState.d.ts +9 -6
  504. package/bin/types/session/SessionState.d.ts.map +1 -1
  505. package/bin/types/session/SessionSystem.d.ts +1 -1
  506. package/bin/types/session/SessionTool.d.ts +12 -1
  507. package/bin/types/session/SessionTool.d.ts.map +1 -1
  508. package/bin/types/store/LocalStore.d.ts +19 -11
  509. package/bin/types/store/LocalStore.d.ts.map +1 -1
  510. package/bin/types/store/LocalStore.js +2 -2
  511. package/bin/types/store/SessionAttachmentStore.d.ts +4 -4
  512. package/bin/types/store/SessionAttachmentStore.js +3 -3
  513. package/bin/types/store/SessionDataStore.d.ts +85 -0
  514. package/bin/types/store/SessionDataStore.d.ts.map +1 -0
  515. package/bin/types/store/SessionDataStore.js +9 -0
  516. package/bin/types/store/SessionDataStore.js.map +1 -0
  517. package/bin/types/store/SessionStore.d.ts +24 -78
  518. package/bin/types/store/SessionStore.d.ts.map +1 -1
  519. package/bin/types/store/SessionStore.js +3 -3
  520. package/bin/types/tools/ToolActionExecutionContext.d.ts +30 -0
  521. package/bin/types/tools/ToolActionExecutionContext.d.ts.map +1 -0
  522. package/bin/types/tools/ToolActionExecutionContext.js +8 -0
  523. package/bin/types/tools/ToolActionExecutionContext.js.map +1 -0
  524. package/bin/types/tools/ask/AskQuestionsTool.d.ts +1 -1
  525. package/bin/utils/logger/Logger.d.ts +21 -9
  526. package/bin/utils/logger/Logger.d.ts.map +1 -1
  527. package/bin/utils/logger/Logger.js +18 -9
  528. package/bin/utils/logger/Logger.js.map +1 -1
  529. package/bin/workspace/WorkspacePaths.d.ts +3 -32
  530. package/bin/workspace/WorkspacePaths.d.ts.map +1 -1
  531. package/bin/workspace/WorkspacePaths.js +7 -46
  532. package/bin/workspace/WorkspacePaths.js.map +1 -1
  533. package/bin/workspace/store/JsonlSessionMessageStore.d.ts +1 -1
  534. package/bin/workspace/store/JsonlSessionMessageStore.d.ts.map +1 -1
  535. package/bin/workspace/store/LocalGroupSessionDataStore.d.ts +46 -0
  536. package/bin/workspace/store/LocalGroupSessionDataStore.d.ts.map +1 -0
  537. package/bin/workspace/store/LocalGroupSessionDataStore.js +197 -0
  538. package/bin/workspace/store/LocalGroupSessionDataStore.js.map +1 -0
  539. package/bin/workspace/store/LocalGroupSessionStore.d.ts +22 -0
  540. package/bin/workspace/store/LocalGroupSessionStore.d.ts.map +1 -0
  541. package/bin/workspace/store/LocalGroupSessionStore.js +75 -0
  542. package/bin/workspace/store/LocalGroupSessionStore.js.map +1 -0
  543. package/bin/workspace/store/LocalSessionAttachmentStore.d.ts +2 -2
  544. package/bin/workspace/store/LocalSessionAttachmentStore.d.ts.map +1 -1
  545. package/bin/workspace/store/LocalSessionAttachmentStore.js +2 -2
  546. package/bin/workspace/store/LocalSessionAttachmentStore.js.map +1 -1
  547. package/bin/workspace/store/LocalSessionDataStore.d.ts +45 -0
  548. package/bin/workspace/store/LocalSessionDataStore.d.ts.map +1 -0
  549. package/bin/workspace/store/LocalSessionDataStore.js +100 -0
  550. package/bin/workspace/store/LocalSessionDataStore.js.map +1 -0
  551. package/bin/workspace/store/LocalSessionStore.d.ts +38 -28
  552. package/bin/workspace/store/LocalSessionStore.d.ts.map +1 -1
  553. package/bin/workspace/store/LocalSessionStore.js +151 -51
  554. package/bin/workspace/store/LocalSessionStore.js.map +1 -1
  555. package/bin/workspace/store/LocalStorePaths.d.ts +31 -83
  556. package/bin/workspace/store/LocalStorePaths.d.ts.map +1 -1
  557. package/bin/workspace/store/LocalStorePaths.js +43 -101
  558. package/bin/workspace/store/LocalStorePaths.js.map +1 -1
  559. package/bin/workspace/store/SessionMessageStoreFactory.d.ts +1 -1
  560. package/bin/workspace/store/SessionMessageStoreFactory.d.ts.map +1 -1
  561. package/bin/workspace/store/SessionMessageStoreFactory.js +1 -1
  562. package/city-test/agent-http.test.mjs +326 -0
  563. package/city-test/city-container.test.mjs +156 -0
  564. package/city-test/city-host-registry.test.mjs +68 -0
  565. package/city-test/city-transport.test.mjs +282 -0
  566. package/city-test/group.test.mjs +739 -0
  567. package/city-test/session-model.test.mjs +169 -0
  568. package/city-test/transport-lifecycle.test.mjs +164 -0
  569. package/package.json +30 -17
  570. package/scripts/ModelClientMock.mjs +165 -0
  571. package/scripts/action-schedule-store.test.mjs +81 -11
  572. package/scripts/agent-compiler.mjs +10 -6
  573. package/scripts/agent-env-shell-sandbox.test.mjs +10 -10
  574. package/scripts/agent-env.test.mjs +6 -8
  575. package/scripts/agent-multi-workspace.test.mjs +213 -0
  576. package/scripts/agent-ready.test.mjs +71 -16
  577. package/scripts/agent-session-maintenance.test.mjs +15 -28
  578. package/scripts/agent-store.test.mjs +121 -22
  579. package/scripts/city-model-tool-loop.test.mjs +66 -195
  580. package/scripts/core-engine-context-compaction.test.mjs +65 -113
  581. package/scripts/core-engine-model-stream.test.mjs +87 -0
  582. package/scripts/executor-failure-result.test.mjs +13 -29
  583. package/scripts/file-tools.test.mjs +6 -6
  584. package/scripts/image-plugin-job.test.mjs +77 -40
  585. package/scripts/logger-isolation.test.mjs +2 -2
  586. package/scripts/multi-agent-plugin-isolation.test.mjs +11 -9
  587. package/scripts/plugin-tools.test.mjs +153 -18
  588. package/scripts/public-api-naming.test.mjs +0 -1
  589. package/scripts/rewrite-build-aliases.mjs +49 -0
  590. package/scripts/rpc-url-routing.test.mjs +29 -0
  591. package/scripts/search-tools.test.mjs +4 -4
  592. package/scripts/session-ask-question.test.mjs +23 -21
  593. package/scripts/session-attachments.test.mjs +11 -9
  594. package/scripts/session-compact-handle.test.mjs +6 -5
  595. package/scripts/session-composer.test.mjs +61 -18
  596. package/scripts/session-config-turn-boundary.test.mjs +123 -92
  597. package/scripts/session-dynamic-interaction.test.mjs +75 -0
  598. package/scripts/session-fork.test.mjs +35 -0
  599. package/scripts/session-list-title.test.mjs +14 -56
  600. package/scripts/session-messages.test.mjs +306 -1681
  601. package/scripts/session-shell-approval.test.mjs +16 -13
  602. package/scripts/session-system-blocks.test.mjs +1 -1
  603. package/scripts/session-title-event.test.mjs +38 -24
  604. package/scripts/session-tool-approval.test.mjs +17 -15
  605. package/scripts/session-turn-context.test.mjs +31 -28
  606. package/scripts/session-turn-failure.test.mjs +112 -110
  607. package/scripts/verify-build-aliases.mjs +32 -0
  608. package/scripts/workspace.test.mjs +146 -32
  609. package/src/agent/Agent.ts +138 -238
  610. package/src/agent/AgentModel.ts +9 -9
  611. package/src/agent/AgentSessions.ts +116 -65
  612. package/src/agent/WorkspaceEntry.ts +309 -0
  613. package/src/agent/index.ts +4 -0
  614. package/src/city/host/CityHostRegistry.ts +260 -0
  615. package/src/city/index.ts +49 -0
  616. package/src/city/runtime/City.ts +425 -0
  617. package/src/city/transport/SerializedTransport.ts +65 -0
  618. package/src/city/transport/http/AgentHTTP.ts +176 -0
  619. package/src/city/transport/http/CityHTTP.ts +196 -0
  620. package/src/city/transport/http/NodeHttpAdapter.ts +75 -0
  621. package/src/city/transport/http/routes/RuntimeRoutes.ts +51 -0
  622. package/src/city/transport/http/routes/SessionRoutes.ts +497 -0
  623. package/src/city/transport/rpc/AgentRPC.ts +111 -0
  624. package/src/city/transport/rpc/CityRPC.ts +138 -0
  625. package/src/city/transport/rpc/RpcServer.ts +158 -0
  626. package/src/city/transport/rpc/server/InternalHandlers.ts +223 -0
  627. package/src/city/transport/rpc/server/RequestDispatcher.ts +67 -0
  628. package/src/city/transport/rpc/server/SdkSessionHandlers.ts +166 -0
  629. package/src/city/transport/rpc/server/ServerTypes.ts +103 -0
  630. package/src/city/transport/session/RemoteSessionConfig.ts +34 -0
  631. package/src/city/transport/types/AgentHttpBinding.ts +25 -0
  632. package/src/city/transport/types/AgentHttpRuntime.ts +13 -0
  633. package/src/city/transport/types/AgentRpcBinding.ts +28 -0
  634. package/src/city/transport/types/AgentRpcRuntime.ts +20 -0
  635. package/src/city/transport/types/AgentSessionModelResolver.ts +13 -0
  636. package/src/city/transport/types/CityHttpRuntime.ts +45 -0
  637. package/src/city/transport/types/CityRpcRuntime.ts +27 -0
  638. package/src/city/transport/types/RpcProtocol.ts +32 -0
  639. package/src/city/types/City.ts +99 -0
  640. package/src/city/types/PluginHostContext.ts +40 -0
  641. package/src/city/types/SerializedTransport.ts +19 -0
  642. package/src/executor/Executor.ts +101 -43
  643. package/src/executor/README.md +11 -8
  644. package/src/executor/composer/system/SessionSystemComposer.ts +2 -2
  645. package/src/executor/composer/system/default/PromptRenderer.ts +2 -2
  646. package/src/executor/composer/system/default/SystemDomain.ts +5 -5
  647. package/src/executor/composer/system/default/assets/core.prompt.ts +1 -1
  648. package/src/executor/composer/system/default/assets/core.prompt.ts.txt +4 -12
  649. package/src/executor/core-engine/CoreEngineContextCompaction.ts +113 -427
  650. package/src/executor/core-engine/CoreEngineError.ts +1 -1
  651. package/src/executor/core-engine/CoreEngineLoopDecision.ts +1 -18
  652. package/src/executor/core-engine/CoreEngineMessageState.ts +32 -101
  653. package/src/executor/core-engine/CoreEngineRunner.ts +179 -281
  654. package/src/executor/core-engine/CoreEngineSignals.ts +98 -346
  655. package/src/executor/messages/SessionAttachmentMapper.ts +15 -273
  656. package/src/executor/messages/SessionMessageLog.ts +12 -25
  657. package/src/executor/messages/SessionModelMessages.ts +223 -0
  658. package/src/executor/model/ModelGenerate.ts +71 -0
  659. package/src/executor/model/ModelStepRunner.ts +381 -0
  660. package/src/executor/services/ExecutorRecoveryPolicy.ts +4 -4
  661. package/src/executor/types/SessionHistoryMeta.ts +8 -2
  662. package/src/executor/types/SessionLoop.ts +0 -26
  663. package/src/executor/types/SessionPrompts.ts +8 -8
  664. package/src/group/Group.ts +45 -0
  665. package/src/group/GroupSession.ts +728 -0
  666. package/src/group/GroupSessions.ts +104 -0
  667. package/src/group/index.ts +29 -0
  668. package/src/index.ts +108 -60
  669. package/src/internal/AgentRuntime.ts +229 -0
  670. package/src/internal/GroupRuntime.ts +89 -0
  671. package/src/internal/index.ts +33 -0
  672. package/src/plugin/core/ActionScheduleExecutor.ts +17 -5
  673. package/src/plugin/core/ActionScheduleRuntime.ts +16 -6
  674. package/src/plugin/core/ActionScheduleStore.ts +43 -12
  675. package/src/plugin/core/HookRegistry.ts +24 -14
  676. package/src/plugin/core/PluginActionExecution.ts +230 -0
  677. package/src/plugin/core/PluginActionFactory.ts +9 -3
  678. package/src/plugin/core/PluginContext.ts +25 -6
  679. package/src/plugin/core/PluginHttpRoutes.ts +2 -2
  680. package/src/plugin/core/PluginRegistry.ts +193 -107
  681. package/src/plugin/tool/PluginToolRuntime.ts +4 -1
  682. package/src/plugin/tool/PluginToolSchemas.ts +3 -4
  683. package/src/plugin/tool/PluginTools.ts +12 -8
  684. package/src/plugin/types/ActionSchedule.ts +6 -0
  685. package/src/remote/transports/HttpRemoteAgentTransport.ts +3 -3
  686. package/src/remote/transports/RpcClient.ts +17 -0
  687. package/src/remote/transports/RpcRemoteAgentTransport.ts +1 -0
  688. package/src/session/DefaultSessionComposer.ts +3 -3
  689. package/src/session/Session.ts +54 -42
  690. package/src/session/SessionLoop.ts +27 -34
  691. package/src/session/SessionMessages.ts +63 -121
  692. package/src/session/SessionState.ts +46 -21
  693. package/src/session/SessionTitle.ts +23 -40
  694. package/src/session/browse/Browse.ts +35 -63
  695. package/src/session/control/SessionInteractions.ts +72 -51
  696. package/src/session/execution/SessionAssistantOutputAdapter.ts +44 -45
  697. package/src/session/execution/tools/SessionShellApprovalAdapter.ts +20 -9
  698. package/src/session/messages/SessionAssistantMessageWriter.ts +259 -637
  699. package/src/session/messages/SessionJsonValue.ts +0 -23
  700. package/src/session/messages/SessionMessageCompaction.ts +78 -103
  701. package/src/session/messages/SessionMessageInteractionWriter.ts +22 -22
  702. package/src/session/messages/SessionMessageText.ts +73 -0
  703. package/src/session/preview/SessionMessagePreview.ts +15 -45
  704. package/src/session/runtime/SessionTurnContext.ts +11 -9
  705. package/src/session/storage/Metadata.ts +38 -9
  706. package/src/tools/ask/AskQuestionsTool.ts +28 -17
  707. package/src/types/action/ActionResult.ts +20 -11
  708. package/src/types/agent/AgentOptions.ts +6 -13
  709. package/src/types/agent/AgentSessionCollection.ts +61 -0
  710. package/src/types/agent/AgentStorage.ts +19 -0
  711. package/src/types/agent/RemoteAgentOptions.ts +1 -1
  712. package/src/types/agent/SessionActor.ts +9 -0
  713. package/src/types/agent/SessionTypes.ts +31 -11
  714. package/src/types/agent/WorkspaceEntryOptions.ts +18 -0
  715. package/src/types/executor/SessionAssistantOutput.ts +22 -17
  716. package/src/types/executor/SessionToolExecutionContext.ts +9 -4
  717. package/src/types/executor/SessionTurnContext.ts +11 -11
  718. package/src/types/group/DispatchStrategy.ts +165 -0
  719. package/src/types/group/Group.ts +64 -0
  720. package/src/types/group/GroupSession.ts +154 -0
  721. package/src/types/group/GroupSessionStore.ts +82 -0
  722. package/src/types/plugin/AgentPluginContext.ts +30 -0
  723. package/src/types/plugin/PluginAction.ts +7 -5
  724. package/src/types/plugin/PluginActionExecution.ts +36 -0
  725. package/src/types/plugin/PluginCommand.ts +5 -5
  726. package/src/types/plugin/PluginContext.ts +23 -7
  727. package/src/types/plugin/PluginExecutionContext.ts +6 -11
  728. package/src/types/plugin/PluginRuntime.ts +5 -0
  729. package/src/types/plugin/PluginServices.ts +11 -0
  730. package/src/types/plugin/PluginState.ts +2 -2
  731. package/src/types/plugin/PluginTool.ts +4 -1
  732. package/src/types/rpc/RpcProtocol.ts +24 -2
  733. package/src/types/sdk/AgentSessionAction.ts +8 -9
  734. package/src/types/sdk/AgentSessionPrompt.ts +8 -11
  735. package/src/types/session/SessionAction.ts +41 -0
  736. package/src/types/session/SessionComposer.ts +8 -13
  737. package/src/types/session/SessionContent.ts +52 -0
  738. package/src/types/session/SessionExecution.ts +9 -88
  739. package/src/types/session/SessionInteraction.ts +106 -73
  740. package/src/types/session/SessionLoop.ts +1 -1
  741. package/src/types/session/SessionMessage.ts +27 -94
  742. package/src/types/session/SessionMessages.ts +12 -9
  743. package/src/types/session/SessionOptions.ts +11 -4
  744. package/src/types/session/SessionOrigin.ts +21 -0
  745. package/src/types/session/SessionPort.ts +12 -20
  746. package/src/types/session/SessionState.ts +7 -4
  747. package/src/types/session/SessionTool.ts +12 -0
  748. package/src/types/store/LocalStore.ts +19 -11
  749. package/src/types/store/SessionAttachmentStore.ts +4 -4
  750. package/src/types/store/SessionDataStore.ts +109 -0
  751. package/src/types/store/SessionStore.ts +37 -94
  752. package/src/types/tools/ToolActionExecutionContext.ts +32 -0
  753. package/src/utils/logger/Logger.ts +33 -12
  754. package/src/workspace/WorkspacePaths.ts +7 -51
  755. package/src/workspace/store/JsonlSessionMessageStore.ts +2 -2
  756. package/src/workspace/store/LocalGroupSessionDataStore.ts +232 -0
  757. package/src/workspace/store/LocalGroupSessionStore.ts +90 -0
  758. package/src/workspace/store/LocalSessionAttachmentStore.ts +3 -3
  759. package/src/workspace/store/LocalSessionDataStore.ts +169 -0
  760. package/src/workspace/store/LocalSessionStore.ts +202 -86
  761. package/src/workspace/store/LocalStorePaths.ts +65 -147
  762. package/src/workspace/store/SessionMessageStoreFactory.ts +1 -1
  763. package/tsconfig.json +2 -1
  764. package/tsconfig.tsbuildinfo +1 -1
  765. package/LICENSE +0 -183
  766. package/bin/agent/AgentState.d.ts +0 -45
  767. package/bin/agent/AgentState.d.ts.map +0 -1
  768. package/bin/agent/AgentState.js +0 -74
  769. package/bin/agent/AgentState.js.map +0 -1
  770. package/bin/executor/core-engine/CoreEngineUiStreamCollector.d.ts +0 -48
  771. package/bin/executor/core-engine/CoreEngineUiStreamCollector.d.ts.map +0 -1
  772. package/bin/executor/core-engine/CoreEngineUiStreamCollector.js +0 -92
  773. package/bin/executor/core-engine/CoreEngineUiStreamCollector.js.map +0 -1
  774. package/bin/executor/messages/SessionMessageCodec.d.ts +0 -29
  775. package/bin/executor/messages/SessionMessageCodec.d.ts.map +0 -1
  776. package/bin/executor/messages/SessionMessageCodec.js +0 -75
  777. package/bin/executor/messages/SessionMessageCodec.js.map +0 -1
  778. package/bin/executor/messages/SessionStepEventMapper.d.ts +0 -19
  779. package/bin/executor/messages/SessionStepEventMapper.d.ts.map +0 -1
  780. package/bin/executor/messages/SessionStepEventMapper.js +0 -177
  781. package/bin/executor/messages/SessionStepEventMapper.js.map +0 -1
  782. package/bin/executor/messages/UIMessageTransformer.d.ts +0 -29
  783. package/bin/executor/messages/UIMessageTransformer.d.ts.map +0 -1
  784. package/bin/executor/messages/UIMessageTransformer.js +0 -114
  785. package/bin/executor/messages/UIMessageTransformer.js.map +0 -1
  786. package/bin/executor/messages/UserVisibleText.d.ts +0 -26
  787. package/bin/executor/messages/UserVisibleText.d.ts.map +0 -1
  788. package/bin/executor/messages/UserVisibleText.js +0 -65
  789. package/bin/executor/messages/UserVisibleText.js.map +0 -1
  790. package/bin/executor/types/SessionRecords.d.ts +0 -162
  791. package/bin/executor/types/SessionRecords.d.ts.map +0 -1
  792. package/bin/executor/types/SessionRecords.js +0 -51
  793. package/bin/executor/types/SessionRecords.js.map +0 -1
  794. package/bin/plugin/core/PluginActionRunner.d.ts +0 -24
  795. package/bin/plugin/core/PluginActionRunner.d.ts.map +0 -1
  796. package/bin/plugin/core/PluginActionRunner.js +0 -19
  797. package/bin/plugin/core/PluginActionRunner.js.map +0 -1
  798. package/bin/session/messages/SessionMessageCodec.d.ts +0 -23
  799. package/bin/session/messages/SessionMessageCodec.d.ts.map +0 -1
  800. package/bin/session/messages/SessionMessageCodec.js +0 -455
  801. package/bin/session/messages/SessionMessageCodec.js.map +0 -1
  802. package/bin/types/agent/AgentState.d.ts +0 -19
  803. package/bin/types/agent/AgentState.d.ts.map +0 -1
  804. package/bin/types/agent/AgentState.js +0 -9
  805. package/bin/types/agent/AgentState.js.map +0 -1
  806. package/bin/types/store/AgentStore.d.ts +0 -31
  807. package/bin/types/store/AgentStore.d.ts.map +0 -1
  808. package/bin/types/store/AgentStore.js +0 -9
  809. package/bin/types/store/AgentStore.js.map +0 -1
  810. package/bin/types/workspace/FileSystem.d.ts +0 -55
  811. package/bin/types/workspace/FileSystem.d.ts.map +0 -1
  812. package/bin/types/workspace/FileSystem.js +0 -9
  813. package/bin/types/workspace/FileSystem.js.map +0 -1
  814. package/bin/types/workspace/FileTool.d.ts +0 -181
  815. package/bin/types/workspace/FileTool.d.ts.map +0 -1
  816. package/bin/types/workspace/FileTool.js +0 -10
  817. package/bin/types/workspace/FileTool.js.map +0 -1
  818. package/bin/types/workspace/SearchTool.d.ts +0 -131
  819. package/bin/types/workspace/SearchTool.d.ts.map +0 -1
  820. package/bin/types/workspace/SearchTool.js +0 -10
  821. package/bin/types/workspace/SearchTool.js.map +0 -1
  822. package/bin/types/workspace/Workspace.d.ts +0 -24
  823. package/bin/types/workspace/Workspace.d.ts.map +0 -1
  824. package/bin/types/workspace/Workspace.js +0 -9
  825. package/bin/types/workspace/Workspace.js.map +0 -1
  826. package/bin/types/workspace/WorkspaceEnv.d.ts +0 -16
  827. package/bin/types/workspace/WorkspaceEnv.d.ts.map +0 -1
  828. package/bin/types/workspace/WorkspaceEnv.js +0 -9
  829. package/bin/types/workspace/WorkspaceEnv.js.map +0 -1
  830. package/bin/types/workspace/WorkspaceTools.d.ts +0 -20
  831. package/bin/types/workspace/WorkspaceTools.d.ts.map +0 -1
  832. package/bin/types/workspace/WorkspaceTools.js +0 -9
  833. package/bin/types/workspace/WorkspaceTools.js.map +0 -1
  834. package/bin/utils/cli/CliOutput.d.ts +0 -14
  835. package/bin/utils/cli/CliOutput.d.ts.map +0 -1
  836. package/bin/utils/cli/CliOutput.js +0 -98
  837. package/bin/utils/cli/CliOutput.js.map +0 -1
  838. package/bin/utils/cli/PrettyStatus.d.ts +0 -25
  839. package/bin/utils/cli/PrettyStatus.d.ts.map +0 -1
  840. package/bin/utils/cli/PrettyStatus.js +0 -77
  841. package/bin/utils/cli/PrettyStatus.js.map +0 -1
  842. package/bin/utils/logger/FormatRequest.d.ts +0 -29
  843. package/bin/utils/logger/FormatRequest.d.ts.map +0 -1
  844. package/bin/utils/logger/FormatRequest.js +0 -309
  845. package/bin/utils/logger/FormatRequest.js.map +0 -1
  846. package/bin/utils/logger/FormatResponse.d.ts +0 -46
  847. package/bin/utils/logger/FormatResponse.d.ts.map +0 -1
  848. package/bin/utils/logger/FormatResponse.js +0 -186
  849. package/bin/utils/logger/FormatResponse.js.map +0 -1
  850. package/bin/utils/logger/FormatShared.d.ts +0 -33
  851. package/bin/utils/logger/FormatShared.d.ts.map +0 -1
  852. package/bin/utils/logger/FormatShared.js +0 -215
  853. package/bin/utils/logger/FormatShared.js.map +0 -1
  854. package/bin/utils/object/DeepMerge.d.ts +0 -18
  855. package/bin/utils/object/DeepMerge.d.ts.map +0 -1
  856. package/bin/utils/object/DeepMerge.js +0 -37
  857. package/bin/utils/object/DeepMerge.js.map +0 -1
  858. package/bin/utils/object/ObjectGuards.d.ts +0 -17
  859. package/bin/utils/object/ObjectGuards.d.ts.map +0 -1
  860. package/bin/utils/object/ObjectGuards.js +0 -19
  861. package/bin/utils/object/ObjectGuards.js.map +0 -1
  862. package/bin/utils/path/AncestorFiles.d.ts +0 -17
  863. package/bin/utils/path/AncestorFiles.d.ts.map +0 -1
  864. package/bin/utils/path/AncestorFiles.js +0 -36
  865. package/bin/utils/path/AncestorFiles.js.map +0 -1
  866. package/bin/utils/storage/index.d.ts +0 -4
  867. package/bin/utils/storage/index.d.ts.map +0 -1
  868. package/bin/utils/storage/index.js +0 -17
  869. package/bin/utils/storage/index.js.map +0 -1
  870. package/bin/utils/string/EscapeRegExp.d.ts +0 -17
  871. package/bin/utils/string/EscapeRegExp.d.ts.map +0 -1
  872. package/bin/utils/string/EscapeRegExp.js +0 -19
  873. package/bin/utils/string/EscapeRegExp.js.map +0 -1
  874. package/bin/workspace/LocalFileSystem.d.ts +0 -44
  875. package/bin/workspace/LocalFileSystem.d.ts.map +0 -1
  876. package/bin/workspace/LocalFileSystem.js +0 -153
  877. package/bin/workspace/LocalFileSystem.js.map +0 -1
  878. package/bin/workspace/Workspace.d.ts +0 -53
  879. package/bin/workspace/Workspace.d.ts.map +0 -1
  880. package/bin/workspace/Workspace.js +0 -151
  881. package/bin/workspace/Workspace.js.map +0 -1
  882. package/bin/workspace/WorkspaceBase.d.ts +0 -41
  883. package/bin/workspace/WorkspaceBase.d.ts.map +0 -1
  884. package/bin/workspace/WorkspaceBase.js +0 -19
  885. package/bin/workspace/WorkspaceBase.js.map +0 -1
  886. package/bin/workspace/WorkspaceEnv.d.ts +0 -19
  887. package/bin/workspace/WorkspaceEnv.d.ts.map +0 -1
  888. package/bin/workspace/WorkspaceEnv.js +0 -50
  889. package/bin/workspace/WorkspaceEnv.js.map +0 -1
  890. package/bin/workspace/file/FileActionRuntime.d.ts +0 -14
  891. package/bin/workspace/file/FileActionRuntime.d.ts.map +0 -1
  892. package/bin/workspace/file/FileActionRuntime.js +0 -386
  893. package/bin/workspace/file/FileActionRuntime.js.map +0 -1
  894. package/bin/workspace/file/FileAtomicWriter.d.ts +0 -20
  895. package/bin/workspace/file/FileAtomicWriter.d.ts.map +0 -1
  896. package/bin/workspace/file/FileAtomicWriter.js +0 -50
  897. package/bin/workspace/file/FileAtomicWriter.js.map +0 -1
  898. package/bin/workspace/file/FileEncoding.d.ts +0 -34
  899. package/bin/workspace/file/FileEncoding.d.ts.map +0 -1
  900. package/bin/workspace/file/FileEncoding.js +0 -152
  901. package/bin/workspace/file/FileEncoding.js.map +0 -1
  902. package/bin/workspace/file/FilePathPolicy.d.ts +0 -26
  903. package/bin/workspace/file/FilePathPolicy.d.ts.map +0 -1
  904. package/bin/workspace/file/FilePathPolicy.js +0 -134
  905. package/bin/workspace/file/FilePathPolicy.js.map +0 -1
  906. package/bin/workspace/file/FileToolError.d.ts +0 -30
  907. package/bin/workspace/file/FileToolError.d.ts.map +0 -1
  908. package/bin/workspace/file/FileToolError.js +0 -78
  909. package/bin/workspace/file/FileToolError.js.map +0 -1
  910. package/bin/workspace/search/SearchActionRuntime.d.ts +0 -14
  911. package/bin/workspace/search/SearchActionRuntime.d.ts.map +0 -1
  912. package/bin/workspace/search/SearchActionRuntime.js +0 -359
  913. package/bin/workspace/search/SearchActionRuntime.js.map +0 -1
  914. package/bin/workspace/search/SearchToolError.d.ts +0 -26
  915. package/bin/workspace/search/SearchToolError.d.ts.map +0 -1
  916. package/bin/workspace/search/SearchToolError.js +0 -76
  917. package/bin/workspace/search/SearchToolError.js.map +0 -1
  918. package/bin/workspace/store/LocalAgentStore.d.ts +0 -43
  919. package/bin/workspace/store/LocalAgentStore.d.ts.map +0 -1
  920. package/bin/workspace/store/LocalAgentStore.js +0 -135
  921. package/bin/workspace/store/LocalAgentStore.js.map +0 -1
  922. package/bin/workspace/tool/FileToolSchemas.d.ts +0 -35
  923. package/bin/workspace/tool/FileToolSchemas.d.ts.map +0 -1
  924. package/bin/workspace/tool/FileToolSchemas.js +0 -73
  925. package/bin/workspace/tool/FileToolSchemas.js.map +0 -1
  926. package/bin/workspace/tool/FileTools.d.ts +0 -11
  927. package/bin/workspace/tool/FileTools.d.ts.map +0 -1
  928. package/bin/workspace/tool/FileTools.js +0 -61
  929. package/bin/workspace/tool/FileTools.js.map +0 -1
  930. package/bin/workspace/tool/SearchToolSchemas.d.ts +0 -24
  931. package/bin/workspace/tool/SearchToolSchemas.d.ts.map +0 -1
  932. package/bin/workspace/tool/SearchToolSchemas.js +0 -60
  933. package/bin/workspace/tool/SearchToolSchemas.js.map +0 -1
  934. package/bin/workspace/tool/SearchTools.d.ts +0 -11
  935. package/bin/workspace/tool/SearchTools.d.ts.map +0 -1
  936. package/bin/workspace/tool/SearchTools.js +0 -38
  937. package/bin/workspace/tool/SearchTools.js.map +0 -1
  938. package/bin/workspace/tool/WorkspaceTools.d.ts +0 -11
  939. package/bin/workspace/tool/WorkspaceTools.d.ts.map +0 -1
  940. package/bin/workspace/tool/WorkspaceTools.js +0 -22
  941. package/bin/workspace/tool/WorkspaceTools.js.map +0 -1
  942. package/scripts/core-engine-ui-stream-collector.test.mjs +0 -38
  943. package/scripts/openai-responses-continuation.test.mjs +0 -78
  944. package/src/agent/AgentState.ts +0 -96
  945. package/src/executor/core-engine/CoreEngineUiStreamCollector.ts +0 -136
  946. package/src/executor/messages/SessionMessageCodec.ts +0 -106
  947. package/src/executor/messages/SessionStepEventMapper.ts +0 -191
  948. package/src/executor/messages/UIMessageTransformer.ts +0 -152
  949. package/src/executor/messages/UserVisibleText.ts +0 -75
  950. package/src/executor/types/SessionRecords.ts +0 -217
  951. package/src/plugin/core/PluginActionRunner.ts +0 -36
  952. package/src/session/messages/SessionMessageCodec.ts +0 -495
  953. package/src/types/agent/AgentState.ts +0 -22
  954. package/src/types/store/AgentStore.ts +0 -52
  955. package/src/types/workspace/FileSystem.ts +0 -76
  956. package/src/types/workspace/FileTool.ts +0 -225
  957. package/src/types/workspace/SearchTool.ts +0 -156
  958. package/src/types/workspace/Workspace.ts +0 -27
  959. package/src/types/workspace/WorkspaceEnv.ts +0 -19
  960. package/src/types/workspace/WorkspaceTools.ts +0 -23
  961. package/src/utils/cli/CliOutput.ts +0 -128
  962. package/src/utils/cli/PrettyStatus.ts +0 -94
  963. package/src/utils/logger/FormatRequest.ts +0 -455
  964. package/src/utils/logger/FormatResponse.ts +0 -265
  965. package/src/utils/logger/FormatShared.ts +0 -258
  966. package/src/utils/object/DeepMerge.ts +0 -40
  967. package/src/utils/object/ObjectGuards.ts +0 -19
  968. package/src/utils/path/AncestorFiles.ts +0 -40
  969. package/src/utils/storage/index.ts +0 -19
  970. package/src/utils/string/EscapeRegExp.ts +0 -19
  971. package/src/workspace/LocalFileSystem.ts +0 -209
  972. package/src/workspace/Workspace.ts +0 -178
  973. package/src/workspace/WorkspaceBase.ts +0 -62
  974. package/src/workspace/WorkspaceEnv.ts +0 -54
  975. package/src/workspace/file/FileActionRuntime.ts +0 -433
  976. package/src/workspace/file/FileAtomicWriter.ts +0 -61
  977. package/src/workspace/file/FileEncoding.ts +0 -175
  978. package/src/workspace/file/FilePathPolicy.ts +0 -162
  979. package/src/workspace/file/FileToolError.ts +0 -99
  980. package/src/workspace/search/SearchActionRuntime.ts +0 -438
  981. package/src/workspace/search/SearchToolError.ts +0 -94
  982. package/src/workspace/store/LocalAgentStore.ts +0 -191
  983. package/src/workspace/tool/FileToolSchemas.ts +0 -77
  984. package/src/workspace/tool/FileTools.ts +0 -91
  985. package/src/workspace/tool/SearchToolSchemas.ts +0 -62
  986. package/src/workspace/tool/SearchTools.ts +0 -61
  987. package/src/workspace/tool/WorkspaceTools.ts +0 -31
@@ -1,37 +1,34 @@
1
1
  /**
2
- * 单个 Assistant Message 的流式写入器。
2
+ * 单个 canonical Assistant Message 的流式写入器。
3
3
  *
4
- * Writer AI SDK chunk、Executor Tool 输入屏障和最终关闭操作收口到同一条
5
- * 单写者队列,保证并发回调不会产生 revision 冲突。
4
+ * Writer 直接消费 Downcity `ModelStreamEvent`,并把模型内容、Tool 状态和 Action 内容
5
+ * 串行写入 `SessionMessages`。它不理解 UI Message 或 Provider 私有事件。
6
6
  */
7
7
 
8
- import type { UIMessageChunk } from "ai";
8
+ import type { ModelStreamEvent } from "@downcity/type";
9
9
  import type { SessionMessages } from "@/session/SessionMessages.js";
10
- import {
11
- to_session_json_object,
12
- to_session_json_value,
13
- to_session_provider_metadata,
14
- } from "@/session/messages/SessionJsonValue.js";
10
+ import { to_session_json_value } from "@/session/messages/SessionJsonValue.js";
15
11
  import { SessionToolPartGate } from "@/session/messages/SessionToolPartGate.js";
12
+ import type { SessionAssistantResultPart } from "@/types/session/SessionContent.js";
16
13
  import type {
17
- SessionAssistantFilePart,
18
14
  SessionAssistantMessage,
19
15
  SessionAssistantMessagePart,
20
- SessionAssistantTextPart,
21
16
  SessionAssistantToolPart,
22
17
  } from "@/types/session/SessionMessage.js";
23
- import type { SessionToolInputReady } from "@/types/session/SessionTool.js";
18
+ import type {
19
+ SessionToolExecutionResult,
20
+ SessionToolInputReady,
21
+ } from "@/types/session/SessionTool.js";
24
22
  import { generate_id } from "@/utils/Id.js";
25
23
 
26
- /** 单个 Assistant Message 的流式 writer。 */
24
+ /** 单个 Assistant Message 的流式 Writer。 */
27
25
  export class SessionAssistantMessageWriter {
26
+ /** 当前 canonical Assistant Message 标识。 */
28
27
  readonly message_id: string;
28
+
29
29
  private readonly recorder: SessionMessages;
30
- private readonly pending_text_parts = new Map<
31
- string,
32
- Pick<SessionAssistantTextPart, "type" | "provider_metadata">
33
- >();
34
- private readonly active_text_part_ids = new Map<string, string>();
30
+ private readonly content_part_ids = new Map<string, string>();
31
+ private readonly tool_call_ids = new Map<string, string>();
35
32
  private readonly current_step_part_ids = new Set<string>();
36
33
  private readonly tool_part_gate = new SessionToolPartGate();
37
34
  private write_chain: Promise<void> = Promise.resolve();
@@ -44,14 +41,7 @@ export class SessionAssistantMessageWriter {
44
41
  this.message_id = message_id;
45
42
  }
46
43
 
47
- /** 应用一个原始 AI SDK UI chunk。 */
48
- async apply_chunk(chunk: UIMessageChunk): Promise<void> {
49
- await this.enqueue_write(async () => {
50
- await this.apply_chunk_serialized(chunk);
51
- });
52
- }
53
-
54
- /** 建立一个独立模型 UI stream 的 canonical step 作用域。 */
44
+ /** 建立一个独立模型 Step canonical Part 作用域。 */
55
45
  async begin_step(): Promise<void> {
56
46
  await this.enqueue_write(async () => {
57
47
  if (this.closed) throw new Error("Assistant Message writer is closed");
@@ -60,17 +50,63 @@ export class SessionAssistantMessageWriter {
60
50
  }
61
51
  this.step_index += 1;
62
52
  this.step_active = true;
53
+ this.content_part_ids.clear();
54
+ this.tool_call_ids.clear();
63
55
  this.current_step_part_ids.clear();
64
- this.pending_text_parts.clear();
65
- this.active_text_part_ids.clear();
56
+ });
57
+ }
58
+
59
+ /** 直接把单个标准模型事件写入 canonical Assistant Message。 */
60
+ async apply_model_event(event: ModelStreamEvent): Promise<void> {
61
+ await this.enqueue_write(async () => await this.apply_model_event_serialized(event));
62
+ }
63
+
64
+ /** 在 Tool 实现执行前提交完整输入,供审批与执行状态共同使用。 */
65
+ async prepare_tool_input(input: SessionToolInputReady): Promise<void> {
66
+ await this.tool_part_gate.wait_until_available(input.tool_call_id);
67
+ await this.enqueue_write(async () => {
68
+ const tool = this.require_tool(input.tool_call_id);
69
+ if (
70
+ tool.state !== "input-streaming" &&
71
+ tool.state !== "ready" &&
72
+ tool.state !== "waiting-user" &&
73
+ tool.state !== "running"
74
+ ) {
75
+ throw new Error(
76
+ `Tool input cannot be prepared from ${tool.state}: ${input.tool_call_id}`,
77
+ );
78
+ }
79
+ await this.upsert_tool(input.tool_call_id, {
80
+ tool_name: input.tool_name,
81
+ state: "ready",
82
+ input: to_session_json_value(input.input),
83
+ });
84
+ });
85
+ }
86
+
87
+ /** 把 Tool 执行终态直接写入对应 canonical Tool Part。 */
88
+ async apply_tool_result(result: SessionToolExecutionResult): Promise<void> {
89
+ await this.enqueue_write(async () => {
90
+ const tool = this.require_tool(result.tool_call_id);
91
+ if (tool.state === "failed" && result.succeeded) return;
92
+ await this.upsert_tool(result.tool_call_id, result.succeeded
93
+ ? {
94
+ tool_name: result.tool_name,
95
+ state: "completed",
96
+ output: to_session_json_value(result.output),
97
+ }
98
+ : {
99
+ tool_name: result.tool_name,
100
+ state: "failed",
101
+ error: read_tool_error(result.output),
102
+ });
66
103
  });
67
104
  }
68
105
 
69
106
  /**
70
- * 校验当前 step 的最终快照并原子补充 metadata。
107
+ * 校验当前 Step 最终 canonical Part 快照。
71
108
  *
72
- * 最终快照不能创建、删除或重排 Part;任何不一致都表示 canonical chunk
73
- * 链路不完整,必须让当前 Turn 失败。
109
+ * 最终快照不能创建、删除或重排模型 Part;不一致意味着事件链不完整。
74
110
  */
75
111
  async finish_step(parts: SessionAssistantMessagePart[]): Promise<void> {
76
112
  await this.enqueue_write(async () => {
@@ -78,22 +114,18 @@ export class SessionAssistantMessageWriter {
78
114
  throw new Error("Assistant canonical step is not active");
79
115
  }
80
116
  const current = this.current_message();
81
- const current_step_parts = current.parts.filter(
82
- (part) =>
83
- this.current_step_part_ids.has(part.part_id) &&
84
- part.type !== "step-start",
117
+ const current_parts = current.parts.filter((part) =>
118
+ this.current_step_part_ids.has(part.part_id) && part.type !== "interaction"
85
119
  );
86
- const final_step_parts = parts.filter((part) => part.type !== "step-start");
87
- if (current_step_parts.length !== final_step_parts.length) {
120
+ if (current_parts.length !== parts.length) {
88
121
  throw this.step_snapshot_error(
89
- `part count ${current_step_parts.length} != ${final_step_parts.length}`,
122
+ `part count ${current_parts.length} != ${parts.length}`,
90
123
  );
91
124
  }
92
-
93
125
  const merged_parts = new Map<string, SessionAssistantMessagePart>();
94
- for (let index = 0; index < current_step_parts.length; index += 1) {
95
- const current_part = current_step_parts[index];
96
- const final_part = final_step_parts[index];
126
+ for (let index = 0; index < current_parts.length; index += 1) {
127
+ const current_part = current_parts[index];
128
+ const final_part = parts[index];
97
129
  merged_parts.set(
98
130
  current_part.part_id,
99
131
  this.merge_step_part(current_part, final_part, index),
@@ -101,13 +133,13 @@ export class SessionAssistantMessageWriter {
101
133
  }
102
134
  await this.recorder.commit_assistant_step(
103
135
  this.message_id,
104
- current.parts.map((part) => merged_parts.get(part.part_id) || part),
136
+ current.parts.map((part) => merged_parts.get(part.part_id) ?? part),
105
137
  );
106
138
  this.reset_step_state();
107
139
  });
108
140
  }
109
141
 
110
- /** 释放异常结束的 step 作用域并保留已经写入的 canonical Parts。 */
142
+ /** 释放异常结束的 Step 作用域并保留已经写入的 canonical Parts。 */
111
143
  async abort_step(): Promise<void> {
112
144
  await this.enqueue_write(async () => {
113
145
  this.tool_part_gate.reject_pending("Assistant canonical step was aborted");
@@ -115,476 +147,146 @@ export class SessionAssistantMessageWriter {
115
147
  });
116
148
  }
117
149
 
118
- /** 在当前 Assistant writer 的单写者队列中应用原始 chunk。 */
119
- private async apply_chunk_serialized(chunk: UIMessageChunk): Promise<void> {
120
- if (this.closed) throw new Error("Assistant Message writer is closed");
121
- const current = this.current_message();
122
- switch (chunk.type) {
123
- case "text-start":
124
- case "reasoning-start": {
125
- const type = chunk.type === "text-start" ? "text" : "reasoning";
126
- const part_id = this.resolve_text_part_id(type, chunk.id);
127
- if (!current.parts.some((part) => part.part_id === part_id)) {
128
- this.pending_text_parts.set(part_id, {
129
- type,
130
- provider_metadata: to_session_provider_metadata(chunk.providerMetadata),
131
- });
132
- }
133
- return;
134
- }
135
- case "text-delta":
136
- case "reasoning-delta": {
137
- if (chunk.delta.length === 0) return;
138
- const type = chunk.type === "text-delta" ? "text" : "reasoning";
139
- const part_id = this.resolve_text_part_id(type, chunk.id);
140
- await this.ensure_text_part(
141
- part_id,
142
- type,
143
- to_session_provider_metadata(chunk.providerMetadata),
144
- );
145
- await this.recorder.append_assistant_delta(
146
- this.message_id,
147
- part_id,
148
- type,
149
- chunk.delta,
150
- );
151
- return;
152
- }
153
- case "text-end":
154
- case "reasoning-end": {
155
- const type = chunk.type === "text-end" ? "text" : "reasoning";
156
- const source_part_id = this.source_text_part_id(type, chunk.id);
157
- const part_id = this.active_text_part_ids.get(source_part_id);
158
- if (!part_id) return;
159
- const provider_metadata = to_session_provider_metadata(chunk.providerMetadata);
160
- const pending = this.pending_text_parts.get(part_id);
161
- // 关键点(中文):Responses API 可能只输出 reasoning start/end 与 itemId,
162
- // 却没有可见 reasoning delta。这个空 Part 不是 UI 占位,而是后续 msg_* 重放必需的协议关联。
163
- if (
164
- type === "reasoning" &&
165
- !current.parts.some((item) => item.part_id === part_id) &&
166
- (provider_metadata !== undefined || pending?.provider_metadata !== undefined)
167
- ) {
168
- await this.ensure_text_part(part_id, type, provider_metadata);
169
- }
170
- const part = this.current_message().parts.find(
171
- (item) => item.part_id === part_id,
172
- );
173
- if (part?.type === "text" || part?.type === "reasoning") {
150
+ /** Action 产生的封闭内容追加到当前 Assistant Message。 */
151
+ async append_result_parts(parts: readonly SessionAssistantResultPart[]): Promise<void> {
152
+ await this.enqueue_write(async () => {
153
+ if (this.closed) throw new Error("Assistant Message writer is closed");
154
+ for (const part of parts) {
155
+ if (part.type === "text") {
174
156
  await this.upsert_part({
175
- ...part,
157
+ part_id: `text:${generate_id()}`,
158
+ sequence: this.next_part_sequence(),
159
+ type: "text",
160
+ text: part.text,
176
161
  state: "done",
177
- ...(provider_metadata !== undefined ? { provider_metadata } : {}),
178
162
  });
179
- } else {
180
- this.pending_text_parts.delete(part_id);
181
- }
182
- this.active_text_part_ids.delete(source_part_id);
183
- return;
184
- }
185
- case "tool-input-start": {
186
- const tool = this.find_tool(chunk.toolCallId);
187
- const call_provider_metadata = to_session_provider_metadata(
188
- chunk.providerMetadata,
189
- );
190
- const tool_metadata = to_session_json_object(chunk.toolMetadata);
191
- if (tool) {
192
- if (
193
- call_provider_metadata === undefined &&
194
- chunk.providerExecuted === undefined &&
195
- chunk.title === undefined &&
196
- tool_metadata === undefined &&
197
- chunk.dynamic === undefined
198
- ) return;
199
- await this.upsert_tool(chunk.toolCallId, {
200
- tool_name: tool.tool_name,
201
- state: tool.state,
202
- ...(call_provider_metadata !== undefined
203
- ? { call_provider_metadata }
204
- : {}),
205
- ...(chunk.providerExecuted !== undefined
206
- ? { provider_executed: chunk.providerExecuted }
207
- : {}),
208
- ...(chunk.title !== undefined ? { title: chunk.title } : {}),
209
- ...(tool_metadata !== undefined ? { tool_metadata } : {}),
210
- ...(chunk.dynamic !== undefined ? { dynamic: chunk.dynamic } : {}),
211
- });
212
- return;
213
- }
214
- await this.create_tool(chunk.toolCallId, {
215
- tool_name: chunk.toolName,
216
- state: "input-streaming",
217
- input_text: "",
218
- ...(call_provider_metadata !== undefined
219
- ? { call_provider_metadata }
220
- : {}),
221
- ...(chunk.providerExecuted !== undefined
222
- ? { provider_executed: chunk.providerExecuted }
223
- : {}),
224
- ...(chunk.title !== undefined ? { title: chunk.title } : {}),
225
- ...(tool_metadata !== undefined ? { tool_metadata } : {}),
226
- ...(chunk.dynamic !== undefined ? { dynamic: chunk.dynamic } : {}),
227
- });
228
- this.tool_part_gate.mark_available(chunk.toolCallId);
229
- return;
230
- }
231
- case "tool-input-delta": {
232
- if (chunk.inputTextDelta.length === 0) return;
233
- const tool = this.find_tool(chunk.toolCallId);
234
- if (!tool) {
235
- throw new Error(
236
- `Assistant canonical Tool Part not found: ${chunk.toolCallId}`,
237
- );
238
- }
239
- if (tool.state !== "input-streaming") return;
240
- await this.recorder.append_assistant_tool_input_delta(
241
- this.message_id,
242
- tool.part_id,
243
- chunk.toolCallId,
244
- chunk.inputTextDelta,
245
- );
246
- return;
247
- }
248
- case "tool-input-available": {
249
- const tool = this.find_tool(chunk.toolCallId);
250
- const call_provider_metadata = to_session_provider_metadata(
251
- chunk.providerMetadata,
252
- );
253
- const tool_metadata = to_session_json_object(chunk.toolMetadata);
254
- if (tool && tool.state !== "input-streaming") {
255
- if (
256
- call_provider_metadata === undefined &&
257
- chunk.providerExecuted === undefined &&
258
- chunk.title === undefined &&
259
- tool_metadata === undefined &&
260
- chunk.dynamic === undefined
261
- ) return;
262
- await this.upsert_tool(chunk.toolCallId, {
263
- tool_name: tool.tool_name,
264
- state: tool.state,
265
- ...(call_provider_metadata !== undefined
266
- ? { call_provider_metadata }
267
- : {}),
268
- ...(chunk.providerExecuted !== undefined
269
- ? { provider_executed: chunk.providerExecuted }
270
- : {}),
271
- ...(chunk.title !== undefined ? { title: chunk.title } : {}),
272
- ...(tool_metadata !== undefined ? { tool_metadata } : {}),
273
- ...(chunk.dynamic !== undefined ? { dynamic: chunk.dynamic } : {}),
163
+ } else if (part.type === "file") {
164
+ await this.upsert_part({
165
+ part_id: `file:${generate_id()}`,
166
+ sequence: this.next_part_sequence(),
167
+ type: "file",
168
+ media_type: part.media_type,
169
+ url: part.url,
170
+ ...(part.filename ? { filename: part.filename } : {}),
274
171
  });
275
- return;
276
- }
277
- const changes = {
278
- tool_name: chunk.toolName,
279
- state: "ready",
280
- input: to_session_json_value(chunk.input),
281
- ...(call_provider_metadata !== undefined
282
- ? { call_provider_metadata }
283
- : {}),
284
- ...(chunk.providerExecuted !== undefined
285
- ? { provider_executed: chunk.providerExecuted }
286
- : {}),
287
- ...(chunk.title !== undefined ? { title: chunk.title } : {}),
288
- ...(tool_metadata !== undefined ? { tool_metadata } : {}),
289
- ...(chunk.dynamic !== undefined ? { dynamic: chunk.dynamic } : {}),
290
- } as const;
291
- if (tool) {
292
- await this.upsert_tool(chunk.toolCallId, changes);
293
172
  } else {
294
- await this.create_tool(chunk.toolCallId, changes);
295
- this.tool_part_gate.mark_available(chunk.toolCallId);
296
- }
297
- return;
298
- }
299
- case "tool-input-error": {
300
- const call_provider_metadata = to_session_provider_metadata(
301
- chunk.providerMetadata,
302
- );
303
- const tool_metadata = to_session_json_object(chunk.toolMetadata);
304
- await this.upsert_tool(chunk.toolCallId, {
305
- tool_name: chunk.toolName,
306
- state: "failed",
307
- input: to_session_json_value(chunk.input),
308
- error: chunk.errorText,
309
- ...(chunk.input === undefined && "rawInput" in chunk && chunk.rawInput !== undefined
310
- ? { raw_input: to_session_json_value(chunk.rawInput) }
311
- : {}),
312
- ...(call_provider_metadata !== undefined
313
- ? { call_provider_metadata }
314
- : {}),
315
- ...(chunk.providerExecuted !== undefined
316
- ? { provider_executed: chunk.providerExecuted }
317
- : {}),
318
- ...(chunk.title !== undefined ? { title: chunk.title } : {}),
319
- ...(tool_metadata !== undefined ? { tool_metadata } : {}),
320
- ...(chunk.dynamic !== undefined ? { dynamic: chunk.dynamic } : {}),
321
- });
322
- return;
323
- }
324
- case "tool-approval-request": {
325
- const tool = this.find_tool(chunk.toolCallId);
326
- await this.upsert_tool(chunk.toolCallId, {
327
- tool_name: tool?.tool_name || "unknown",
328
- state: "waiting-user",
329
- });
330
- return;
331
- }
332
- case "tool-output-available": {
333
- const tool = this.find_tool(chunk.toolCallId);
334
- if (tool?.state === "failed") return;
335
- const result_provider_metadata = to_session_provider_metadata(
336
- chunk.providerMetadata,
337
- );
338
- const tool_metadata = to_session_json_object(chunk.toolMetadata);
339
- await this.upsert_tool(chunk.toolCallId, {
340
- tool_name: tool?.tool_name || "unknown",
341
- state: "completed",
342
- output: to_session_json_value(chunk.output),
343
- ...(result_provider_metadata !== undefined
344
- ? { result_provider_metadata }
345
- : {}),
346
- ...(chunk.providerExecuted !== undefined
347
- ? { provider_executed: chunk.providerExecuted }
348
- : {}),
349
- ...(tool_metadata !== undefined ? { tool_metadata } : {}),
350
- ...(chunk.dynamic !== undefined ? { dynamic: chunk.dynamic } : {}),
351
- ...(chunk.preliminary !== undefined
352
- ? { preliminary: chunk.preliminary }
353
- : {}),
354
- });
355
- return;
356
- }
357
- case "tool-output-error": {
358
- const tool = this.find_tool(chunk.toolCallId);
359
- const result_provider_metadata = to_session_provider_metadata(
360
- chunk.providerMetadata,
361
- );
362
- const tool_metadata = to_session_json_object(chunk.toolMetadata);
363
- await this.upsert_tool(chunk.toolCallId, {
364
- tool_name: tool?.tool_name || "unknown",
365
- state: "failed",
366
- error: chunk.errorText,
367
- ...(result_provider_metadata !== undefined
368
- ? { result_provider_metadata }
369
- : {}),
370
- ...(chunk.providerExecuted !== undefined
371
- ? { provider_executed: chunk.providerExecuted }
372
- : {}),
373
- ...(tool_metadata !== undefined ? { tool_metadata } : {}),
374
- ...(chunk.dynamic !== undefined ? { dynamic: chunk.dynamic } : {}),
375
- });
376
- return;
377
- }
378
- case "tool-output-denied": {
379
- const tool = this.find_tool(chunk.toolCallId);
380
- await this.upsert_tool(chunk.toolCallId, {
381
- tool_name: tool?.tool_name || "unknown",
382
- state: "failed",
383
- error: "Tool output denied",
384
- });
385
- return;
386
- }
387
- case "file":
388
- await this.append_file_part({
389
- media_type: chunk.mediaType,
390
- url: chunk.url,
391
- provider_metadata: to_session_provider_metadata(chunk.providerMetadata),
392
- });
393
- return;
394
- case "source-url": {
395
- const part_id = `source:${this.step_index}:${chunk.sourceId}`;
396
- const current_part = current.parts.find((part) => part.part_id === part_id);
397
- const provider_metadata = to_session_provider_metadata(chunk.providerMetadata);
398
- await this.upsert_part({
399
- part_id,
400
- sequence: current_part?.sequence || this.next_part_sequence(),
401
- type: "source",
402
- source_type: "url",
403
- source_id: chunk.sourceId,
404
- url: chunk.url,
405
- ...(chunk.title !== undefined ? { title: chunk.title } : {}),
406
- ...(provider_metadata !== undefined
407
- ? { provider_metadata }
408
- : {}),
409
- });
410
- return;
411
- }
412
- case "source-document": {
413
- const part_id = `source:${this.step_index}:${chunk.sourceId}`;
414
- const current_part = current.parts.find((part) => part.part_id === part_id);
415
- const provider_metadata = to_session_provider_metadata(chunk.providerMetadata);
416
- await this.upsert_part({
417
- part_id,
418
- sequence: current_part?.sequence || this.next_part_sequence(),
419
- type: "source",
420
- source_type: "document",
421
- source_id: chunk.sourceId,
422
- media_type: chunk.mediaType,
423
- title: chunk.title,
424
- ...(chunk.filename !== undefined ? { filename: chunk.filename } : {}),
425
- ...(provider_metadata !== undefined
426
- ? { provider_metadata }
427
- : {}),
428
- });
429
- return;
430
- }
431
- case "start-step":
432
- await this.upsert_part({
433
- part_id: `step:${generate_id()}`,
434
- sequence: this.next_part_sequence(),
435
- type: "step-start",
436
- });
437
- return;
438
- default: {
439
- if (chunk.type.startsWith("data-")) {
440
- const data_chunk = chunk as unknown as Record<string, unknown>;
441
- if (data_chunk.transient === true) return;
442
- const data_id = typeof data_chunk.id === "string"
443
- ? data_chunk.id
444
- : undefined;
445
- const part_id = data_id
446
- ? `data:${this.step_index}:${data_id}`
447
- : `data:${generate_id()}`;
448
- const current_part = current.parts.find((part) => part.part_id === part_id);
449
173
  await this.upsert_part({
450
- part_id,
451
- sequence: current_part?.sequence || this.next_part_sequence(),
174
+ part_id: `data:${generate_id()}`,
175
+ sequence: this.next_part_sequence(),
452
176
  type: "data",
453
- data_type: chunk.type,
454
- data: to_session_json_value(data_chunk.data),
455
- ...(data_id !== undefined ? { data_id } : {}),
177
+ data_type: part.data_type,
178
+ data: part.data,
179
+ ...(part.data_id ? { data_id: part.data_id } : {}),
456
180
  });
457
181
  }
458
- return;
459
182
  }
460
- }
183
+ });
461
184
  }
462
185
 
463
- /** 写入一个完整 Assistant part。 */
186
+ /** 写入一个完整 canonical Assistant Part。 */
464
187
  async upsert_part(part: SessionAssistantMessagePart): Promise<void> {
465
188
  await this.recorder.update_assistant_part(this.message_id, part);
466
189
  if (this.step_active) this.current_step_part_ids.add(part.part_id);
467
190
  }
468
191
 
469
- /** Executor 在调用 Tool 实现前写入完整输入。 */
470
- async prepare_tool_input(input: SessionToolInputReady): Promise<void> {
471
- await this.tool_part_gate.wait_until_available(input.tool_call_id);
472
- await this.enqueue_write(async () => {
473
- if (this.closed) throw new Error("Assistant Message writer is closed");
474
- const current = this.find_tool(input.tool_call_id);
475
- if (!current) {
476
- throw new Error(
477
- `Assistant canonical Tool Part not found: ${input.tool_call_id}`,
478
- );
479
- }
480
- // 原生 needsApproval 恢复时,AI SDK 不会重新发送 Tool 输入;沿用已审批并
481
- // 已转为 running 的 Part,仅补齐执行前的 canonical 输入屏障。
482
- if (
483
- current.state !== "input-streaming" &&
484
- current.state !== "ready" &&
485
- current.state !== "waiting-user" &&
486
- current.state !== "running"
487
- ) {
488
- throw new Error(
489
- `Tool input cannot be prepared from ${current.state}: ${input.tool_call_id}`,
490
- );
491
- }
492
- await this.write_prepared_tool_input(input);
493
- });
494
- }
495
-
496
- /** 把最终结果中的文件补入当前 Assistant,并对流式已写入文件去重。 */
497
- async append_file_part(
498
- input: Pick<
499
- SessionAssistantFilePart,
500
- "filename" | "media_type" | "provider_metadata" | "url"
501
- >,
502
- ): Promise<void> {
503
- const filename = String(input.filename || "").trim();
504
- const current = this.current_message();
505
- const existing = current.parts.find(
506
- (part) =>
507
- part.type === "file" &&
508
- (!this.step_active || this.current_step_part_ids.has(part.part_id)) &&
509
- part.url === input.url &&
510
- part.media_type === input.media_type,
511
- );
512
- if (existing?.type === "file") {
513
- if (
514
- (filename && String(existing.filename || "").trim() !== filename) ||
515
- input.provider_metadata !== undefined
516
- ) {
517
- await this.upsert_part({
518
- ...existing,
519
- ...(filename ? { filename } : {}),
520
- ...(input.provider_metadata !== undefined
521
- ? { provider_metadata: input.provider_metadata }
522
- : {}),
523
- });
524
- }
525
- return;
526
- }
527
- await this.upsert_part({
528
- part_id: `file:${generate_id()}`,
529
- sequence: this.next_part_sequence(),
530
- type: "file",
531
- media_type: input.media_type,
532
- url: input.url,
533
- ...(filename ? { filename } : {}),
534
- ...(input.provider_metadata !== undefined
535
- ? { provider_metadata: input.provider_metadata }
536
- : {}),
537
- });
538
- }
539
-
540
- /** 把 Action 产生的完整 Assistant Parts 按当前消息顺序追加。 */
541
- async append_parts(parts: SessionAssistantMessagePart[]): Promise<void> {
542
- await this.enqueue_write(async () => {
543
- if (this.closed) throw new Error("Assistant Message writer is closed");
544
- for (const part of parts) {
545
- if (part.type === "tool" || part.type === "interaction") {
546
- throw new Error(`Action cannot append Assistant ${part.type} Part`);
547
- }
548
- const part_id = `${part.type}:${generate_id()}`;
549
- await this.upsert_part({
550
- ...part,
551
- part_id,
552
- sequence: this.next_part_sequence(),
553
- ...(part.type === "text" || part.type === "reasoning"
554
- ? { state: "done" as const }
555
- : {}),
556
- } as SessionAssistantMessagePart);
557
- }
558
- });
559
- }
560
-
561
- /** 等待当前 Assistant writer 已入队的全部写操作完成。 */
192
+ /** 等待当前 Writer 已入队的全部写操作完成。 */
562
193
  async flush(): Promise<void> {
563
194
  await this.write_chain;
564
195
  }
565
196
 
566
197
  /** 正常完成当前 Assistant Message。 */
567
198
  async complete(): Promise<void> {
568
- await this.enqueue_write(async () => {
569
- await this.close_serialized("completed");
570
- });
199
+ await this.enqueue_write(async () => await this.close_serialized("completed"));
571
200
  }
572
201
 
573
202
  /** 停止当前 Assistant Message,并保留已有 Parts。 */
574
203
  async stop(): Promise<void> {
575
- await this.enqueue_write(async () => {
576
- await this.close_serialized("stopped");
577
- });
204
+ await this.enqueue_write(async () => await this.close_serialized("stopped"));
578
205
  }
579
206
 
580
207
  /** 以失败状态关闭当前 Assistant Message。 */
581
208
  async fail(error: unknown): Promise<void> {
582
- await this.enqueue_write(async () => {
583
- await this.close_serialized(
584
- "failed",
585
- error instanceof Error ? error.message : String(error || ""),
209
+ await this.enqueue_write(async () => await this.close_serialized(
210
+ "failed",
211
+ error instanceof Error ? error.message : String(error || ""),
212
+ ));
213
+ }
214
+
215
+ /** 在单写队列中应用标准模型事件。 */
216
+ private async apply_model_event_serialized(event: ModelStreamEvent): Promise<void> {
217
+ if (this.closed) throw new Error("Assistant Message writer is closed");
218
+ if (event.type === "model_error") throw new Error(event.error.message);
219
+ if (event.type === "text_start" || event.type === "reasoning_start") {
220
+ const type = event.type === "text_start" ? "text" : "reasoning";
221
+ const part_id = `${type}:${generate_id()}`;
222
+ this.content_part_ids.set(event.content_id, part_id);
223
+ await this.upsert_part({
224
+ part_id,
225
+ sequence: this.next_part_sequence(),
226
+ type,
227
+ text: "",
228
+ state: "streaming",
229
+ });
230
+ return;
231
+ }
232
+ if (event.type === "text_delta" || event.type === "reasoning_delta") {
233
+ if (!event.delta) return;
234
+ const type = event.type === "text_delta" ? "text" : "reasoning";
235
+ const part_id = this.require_content_part_id(event.content_id);
236
+ await this.recorder.append_assistant_delta(
237
+ this.message_id,
238
+ part_id,
239
+ type,
240
+ event.delta,
586
241
  );
587
- });
242
+ return;
243
+ }
244
+ if (event.type === "text_finish" || event.type === "reasoning_finish") {
245
+ const part_id = this.require_content_part_id(event.content_id);
246
+ const part = this.current_message().parts.find((item) => item.part_id === part_id);
247
+ if (!part || (part.type !== "text" && part.type !== "reasoning")) {
248
+ throw new Error(`Assistant content Part not found: ${event.content_id}`);
249
+ }
250
+ await this.upsert_part({
251
+ ...part,
252
+ state: "done",
253
+ ...(event.type === "reasoning_finish" && event.signature
254
+ ? { reasoning_signature: event.signature }
255
+ : {}),
256
+ });
257
+ return;
258
+ }
259
+ if (event.type === "tool_call_start") {
260
+ this.tool_call_ids.set(event.content_id, event.tool_call_id);
261
+ await this.create_tool(event.tool_call_id, {
262
+ tool_name: event.tool_name,
263
+ state: "input-streaming",
264
+ input_text: "",
265
+ });
266
+ this.tool_part_gate.mark_available(event.tool_call_id);
267
+ return;
268
+ }
269
+ if (event.type === "tool_call_delta") {
270
+ if (!event.input_delta) return;
271
+ const tool_call_id = this.require_tool_call_id(event.content_id);
272
+ const tool = this.require_tool(tool_call_id);
273
+ await this.recorder.append_assistant_tool_input_delta(
274
+ this.message_id,
275
+ tool.part_id,
276
+ tool_call_id,
277
+ event.input_delta,
278
+ );
279
+ return;
280
+ }
281
+ if (event.type === "tool_call_finish") {
282
+ const tool_call_id = this.require_tool_call_id(event.content_id);
283
+ const tool = this.require_tool(tool_call_id);
284
+ await this.upsert_tool(tool_call_id, {
285
+ tool_name: tool.tool_name,
286
+ state: "ready",
287
+ input: event.input,
288
+ });
289
+ }
588
290
  }
589
291
 
590
292
  /** 读取当前 Assistant Message 快照。 */
@@ -596,7 +298,7 @@ export class SessionAssistantMessageWriter {
596
298
  return message;
597
299
  }
598
300
 
599
- /** 读取当前 Assistant 中的指定 Tool Part。 */
301
+ /** 查找当前 Assistant 中的指定 Tool Part。 */
600
302
  private find_tool(tool_call_id: string): SessionAssistantToolPart | undefined {
601
303
  return this.current_message().parts.find(
602
304
  (part): part is SessionAssistantToolPart =>
@@ -604,7 +306,56 @@ export class SessionAssistantMessageWriter {
604
306
  );
605
307
  }
606
308
 
607
- /** 校验并合并同一位置的 canonical Part 与 step 最终快照。 */
309
+ /** 读取指定 Tool Part,否则抛出稳定错误。 */
310
+ private require_tool(tool_call_id: string): SessionAssistantToolPart {
311
+ const tool = this.find_tool(tool_call_id);
312
+ if (tool) return tool;
313
+ throw new Error(`Assistant canonical Tool Part not found: ${tool_call_id}`);
314
+ }
315
+
316
+ /** 读取当前 Step content_id 对应的 canonical Part。 */
317
+ private require_content_part_id(content_id: string): string {
318
+ const part_id = this.content_part_ids.get(content_id);
319
+ if (part_id) return part_id;
320
+ throw new Error(`Assistant content_id not found: ${content_id}`);
321
+ }
322
+
323
+ /** 读取当前 Step content_id 对应的 Tool Call。 */
324
+ private require_tool_call_id(content_id: string): string {
325
+ const tool_call_id = this.tool_call_ids.get(content_id);
326
+ if (tool_call_id) return tool_call_id;
327
+ throw new Error(`Assistant Tool content_id not found: ${content_id}`);
328
+ }
329
+
330
+ /** 更新已经由模型事件创建的 Tool Part。 */
331
+ private async upsert_tool(
332
+ tool_call_id: string,
333
+ changes: Pick<SessionAssistantToolPart, "tool_name" | "state"> &
334
+ Partial<Omit<SessionAssistantToolPart, "part_id" | "type" | "tool_call_id" | "tool_name" | "state">>,
335
+ ): Promise<void> {
336
+ const current = this.require_tool(tool_call_id);
337
+ await this.upsert_part({ ...current, ...changes });
338
+ }
339
+
340
+ /** 创建由模型事件声明的 Tool Part。 */
341
+ private async create_tool(
342
+ tool_call_id: string,
343
+ changes: Pick<SessionAssistantToolPart, "tool_name" | "state"> &
344
+ Partial<Omit<SessionAssistantToolPart, "part_id" | "type" | "tool_call_id" | "tool_name" | "state">>,
345
+ ): Promise<void> {
346
+ if (this.find_tool(tool_call_id)) {
347
+ throw new Error(`Assistant canonical Tool Part already exists: ${tool_call_id}`);
348
+ }
349
+ await this.upsert_part({
350
+ part_id: `tool:${tool_call_id}`,
351
+ sequence: this.next_part_sequence(),
352
+ type: "tool",
353
+ tool_call_id,
354
+ ...changes,
355
+ });
356
+ }
357
+
358
+ /** 校验并合并同一位置的 canonical Part 与 Step 最终快照。 */
608
359
  private merge_step_part(
609
360
  current_part: SessionAssistantMessagePart,
610
361
  final_part: SessionAssistantMessagePart,
@@ -617,36 +368,17 @@ export class SessionAssistantMessageWriter {
617
368
  }
618
369
  if (
619
370
  (current_part.type === "text" || current_part.type === "reasoning") &&
620
- (final_part.type === "text" || final_part.type === "reasoning")
371
+ (final_part.type === "text" || final_part.type === "reasoning") &&
372
+ current_part.text !== final_part.text
621
373
  ) {
622
- if (current_part.text !== final_part.text) {
623
- throw this.step_snapshot_error(`part ${index + 1} text differs`);
624
- }
625
- } else if (current_part.type === "tool" && final_part.type === "tool") {
626
- if (current_part.tool_call_id !== final_part.tool_call_id) {
627
- throw this.step_snapshot_error(`part ${index + 1} tool_call_id differs`);
628
- }
629
- } else if (current_part.type === "file" && final_part.type === "file") {
630
- if (
631
- current_part.url !== final_part.url ||
632
- current_part.media_type !== final_part.media_type
633
- ) {
634
- throw this.step_snapshot_error(`part ${index + 1} file identity differs`);
635
- }
636
- } else if (current_part.type === "source" && final_part.type === "source") {
637
- if (
638
- current_part.source_type !== final_part.source_type ||
639
- current_part.source_id !== final_part.source_id
640
- ) {
641
- throw this.step_snapshot_error(`part ${index + 1} source identity differs`);
642
- }
643
- } else if (current_part.type === "data" && final_part.type === "data") {
644
- if (
645
- current_part.data_type !== final_part.data_type ||
646
- current_part.data_id !== final_part.data_id
647
- ) {
648
- throw this.step_snapshot_error(`part ${index + 1} data identity differs`);
649
- }
374
+ throw this.step_snapshot_error(`part ${index + 1} text differs`);
375
+ }
376
+ if (
377
+ current_part.type === "tool" &&
378
+ final_part.type === "tool" &&
379
+ current_part.tool_call_id !== final_part.tool_call_id
380
+ ) {
381
+ throw this.step_snapshot_error(`part ${index + 1} tool_call_id differs`);
650
382
  }
651
383
  return {
652
384
  ...current_part,
@@ -656,148 +388,29 @@ export class SessionAssistantMessageWriter {
656
388
  } as SessionAssistantMessagePart;
657
389
  }
658
390
 
659
- /** 构造不包含正文与工具输出的结构化 step 快照错误。 */
391
+ /** 构造不包含正文与 Tool 输出的结构化 Step 快照错误。 */
660
392
  private step_snapshot_error(detail: string): Error {
661
393
  return new Error(
662
394
  `Assistant canonical step ${this.step_index} snapshot mismatch: ${detail}`,
663
395
  );
664
396
  }
665
397
 
666
- /** 清理当前 step 的临时关联状态。 */
398
+ /** 清理当前 Step 的临时关联状态。 */
667
399
  private reset_step_state(): void {
668
400
  this.step_active = false;
401
+ this.content_part_ids.clear();
402
+ this.tool_call_ids.clear();
669
403
  this.current_step_part_ids.clear();
670
- this.pending_text_parts.clear();
671
- this.active_text_part_ids.clear();
672
404
  }
673
405
 
674
406
  /** 计算下一个不可变 Part 顺序号。 */
675
407
  private next_part_sequence(): number {
676
408
  return this.current_message().parts.reduce(
677
- (value, part) => Math.max(value, part.sequence + 1),
409
+ (sequence, part) => Math.max(sequence, part.sequence + 1),
678
410
  1,
679
411
  );
680
412
  }
681
413
 
682
- /**
683
- * 把 AI SDK 当前 stream 内的临时 chunk ID 映射为 Message 内唯一 Part ID。
684
- *
685
- * AI SDK 会在不同 `streamText()` 调用中重复使用 `txt-0`、`reasoning-0`
686
- * 等 ID,因此这些 ID 只能用于关联当前尚未结束的文本片段。
687
- */
688
- private resolve_text_part_id(
689
- type: "text" | "reasoning",
690
- chunk_id: string,
691
- ): string {
692
- const source_part_id = this.source_text_part_id(type, chunk_id);
693
- const active_part_id = this.active_text_part_ids.get(source_part_id);
694
- if (active_part_id) return active_part_id;
695
- const part_id = `${type}:${generate_id()}`;
696
- this.active_text_part_ids.set(source_part_id, part_id);
697
- return part_id;
698
- }
699
-
700
- /** 构造当前流片段使用的临时关联键。 */
701
- private source_text_part_id(
702
- type: "text" | "reasoning",
703
- chunk_id: string,
704
- ): string {
705
- return `${this.step_index}:${type}:${chunk_id}`;
706
- }
707
-
708
- /** 在首个有效 Delta 到达时才固定文本 Part 的真实顺序。 */
709
- private async ensure_text_part(
710
- part_id: string,
711
- type: "text" | "reasoning",
712
- provider_metadata?: SessionAssistantTextPart["provider_metadata"],
713
- ): Promise<void> {
714
- const existing = this.current_message().parts.find(
715
- (part) => part.part_id === part_id,
716
- );
717
- if (existing) {
718
- if (existing.type !== type) {
719
- throw new Error(`Assistant Part type changed: ${part_id}`);
720
- }
721
- if (
722
- (existing.type === "text" || existing.type === "reasoning") &&
723
- provider_metadata !== undefined
724
- ) {
725
- await this.upsert_part({ ...existing, provider_metadata });
726
- }
727
- return;
728
- }
729
- const pending = this.pending_text_parts.get(part_id);
730
- if (pending && pending.type !== type) {
731
- throw new Error(`Assistant pending Part type changed: ${part_id}`);
732
- }
733
- await this.upsert_part({
734
- part_id,
735
- sequence: this.next_part_sequence(),
736
- type,
737
- text: "",
738
- state: "streaming",
739
- ...(provider_metadata !== undefined
740
- ? { provider_metadata }
741
- : pending?.provider_metadata !== undefined
742
- ? { provider_metadata: pending.provider_metadata }
743
- : {}),
744
- });
745
- this.pending_text_parts.delete(part_id);
746
- }
747
-
748
- /** 更新已经由 canonical stream 创建的 Tool Part。 */
749
- private async upsert_tool(
750
- tool_call_id: string,
751
- changes: Pick<SessionAssistantToolPart, "tool_name" | "state"> &
752
- Partial<Omit<SessionAssistantToolPart, "part_id" | "type" | "tool_call_id" | "tool_name" | "state">>,
753
- ): Promise<void> {
754
- const current = this.find_tool(tool_call_id);
755
- if (!current) {
756
- throw new Error(
757
- `Assistant canonical Tool Part not found: ${tool_call_id}`,
758
- );
759
- }
760
- await this.upsert_part({
761
- ...current,
762
- part_id: `tool:${tool_call_id}`,
763
- sequence: current.sequence,
764
- type: "tool",
765
- tool_call_id,
766
- ...changes,
767
- });
768
- }
769
-
770
- /** 仅由 Tool 输入 stream chunk 创建 canonical Tool Part。 */
771
- private async create_tool(
772
- tool_call_id: string,
773
- changes: Pick<SessionAssistantToolPart, "tool_name" | "state"> &
774
- Partial<Omit<SessionAssistantToolPart, "part_id" | "type" | "tool_call_id" | "tool_name" | "state">>,
775
- ): Promise<void> {
776
- if (this.find_tool(tool_call_id)) {
777
- throw new Error(
778
- `Assistant canonical Tool Part already exists: ${tool_call_id}`,
779
- );
780
- }
781
- await this.upsert_part({
782
- part_id: `tool:${tool_call_id}`,
783
- sequence: this.next_part_sequence(),
784
- type: "tool",
785
- tool_call_id,
786
- ...changes,
787
- });
788
- }
789
-
790
- /** 将 Executor 完整输入写入已经由 stream 创建的 Tool Part。 */
791
- private async write_prepared_tool_input(
792
- input: SessionToolInputReady,
793
- ): Promise<void> {
794
- await this.upsert_tool(input.tool_call_id, {
795
- tool_name: input.tool_name,
796
- state: "ready",
797
- input: to_session_json_value(input.input),
798
- });
799
- }
800
-
801
414
  /** 串行执行对当前 Assistant Message 的全部写操作。 */
802
415
  private async enqueue_write(operation: () => Promise<void>): Promise<void> {
803
416
  const current = this.write_chain.then(operation, operation);
@@ -819,3 +432,12 @@ export class SessionAssistantMessageWriter {
819
432
  this.closed = true;
820
433
  }
821
434
  }
435
+
436
+ /** 从 Tool 失败输出中提取稳定错误文本。 */
437
+ function read_tool_error(output: unknown): string {
438
+ if (output && typeof output === "object" && "error" in output) {
439
+ const error = (output as { error?: unknown }).error;
440
+ if (typeof error === "string" && error.trim()) return error;
441
+ }
442
+ return "Tool execution failed";
443
+ }