@downcity/agent 1.1.74 → 1.1.79

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 (373) hide show
  1. package/README.md +14 -17
  2. package/bin/agent/{Agent.d.ts → local/Agent.d.ts} +8 -36
  3. package/bin/agent/local/Agent.d.ts.map +1 -0
  4. package/bin/agent/{Agent.js → local/Agent.js} +45 -200
  5. package/bin/agent/local/Agent.js.map +1 -0
  6. package/bin/agent/local/AgentInstructions.d.ts +22 -0
  7. package/bin/agent/local/AgentInstructions.d.ts.map +1 -0
  8. package/bin/agent/local/AgentInstructions.js +57 -0
  9. package/bin/agent/local/AgentInstructions.js.map +1 -0
  10. package/bin/agent/local/AgentPluginFactory.d.ts +29 -0
  11. package/bin/agent/local/AgentPluginFactory.d.ts.map +1 -0
  12. package/bin/agent/local/AgentPluginFactory.js +53 -0
  13. package/bin/agent/local/AgentPluginFactory.js.map +1 -0
  14. package/bin/{runtime/host/AgentHostRuntime.d.ts → agent/local/AgentRuntimeAssembly.d.ts} +2 -2
  15. package/bin/agent/local/AgentRuntimeAssembly.d.ts.map +1 -0
  16. package/bin/{runtime/host/AgentHostRuntime.js → agent/local/AgentRuntimeAssembly.js} +2 -2
  17. package/bin/agent/local/AgentRuntimeAssembly.js.map +1 -0
  18. package/bin/agent/local/AgentRuntimeFactory.d.ts +72 -0
  19. package/bin/agent/local/AgentRuntimeFactory.d.ts.map +1 -0
  20. package/bin/agent/local/AgentRuntimeFactory.js +94 -0
  21. package/bin/agent/local/AgentRuntimeFactory.js.map +1 -0
  22. package/bin/{runtime/host → agent/local}/ProjectSetup.d.ts +1 -1
  23. package/bin/agent/local/ProjectSetup.d.ts.map +1 -0
  24. package/bin/{runtime/host → agent/local}/ProjectSetup.js +1 -1
  25. package/bin/agent/local/ProjectSetup.js.map +1 -0
  26. package/bin/agent/{RemoteAgent.d.ts → remote/RemoteAgent.d.ts} +3 -3
  27. package/bin/agent/remote/RemoteAgent.d.ts.map +1 -0
  28. package/bin/agent/remote/RemoteAgent.js +58 -0
  29. package/bin/agent/remote/RemoteAgent.js.map +1 -0
  30. package/bin/agent/remote/RemoteSession.d.ts +62 -0
  31. package/bin/agent/remote/RemoteSession.d.ts.map +1 -0
  32. package/bin/agent/remote/RemoteSession.js +225 -0
  33. package/bin/agent/remote/RemoteSession.js.map +1 -0
  34. package/bin/agent/remote/RemoteTransport.d.ts +52 -0
  35. package/bin/agent/remote/RemoteTransport.d.ts.map +1 -0
  36. package/bin/agent/remote/RemoteTransport.js +9 -0
  37. package/bin/agent/remote/RemoteTransport.js.map +1 -0
  38. package/bin/agent/remote/TransportFactory.d.ts +13 -0
  39. package/bin/agent/remote/TransportFactory.d.ts.map +1 -0
  40. package/bin/agent/remote/TransportFactory.js +22 -0
  41. package/bin/agent/remote/TransportFactory.js.map +1 -0
  42. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts +35 -0
  43. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -0
  44. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js +259 -0
  45. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +1 -0
  46. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts +34 -0
  47. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -0
  48. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js +66 -0
  49. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js.map +1 -0
  50. package/bin/executor/Executor.d.ts +4 -0
  51. package/bin/executor/Executor.d.ts.map +1 -1
  52. package/bin/executor/Executor.js +52 -35
  53. package/bin/executor/Executor.js.map +1 -1
  54. package/bin/executor/composer/history/SessionHistoryWriter.js +2 -2
  55. package/bin/executor/composer/history/SessionHistoryWriter.js.map +1 -1
  56. package/bin/executor/messages/AssistantResultPersistence.d.ts +3 -3
  57. package/bin/executor/messages/AssistantResultPersistence.d.ts.map +1 -1
  58. package/bin/executor/messages/AssistantResultPersistence.js +2 -6
  59. package/bin/executor/messages/AssistantResultPersistence.js.map +1 -1
  60. package/bin/executor/messages/SessionStepEventMapper.d.ts +7 -8
  61. package/bin/executor/messages/SessionStepEventMapper.d.ts.map +1 -1
  62. package/bin/executor/messages/SessionStepEventMapper.js +55 -86
  63. package/bin/executor/messages/SessionStepEventMapper.js.map +1 -1
  64. package/bin/executor/messages/UserVisibleText.d.ts +2 -10
  65. package/bin/executor/messages/UserVisibleText.d.ts.map +1 -1
  66. package/bin/executor/messages/UserVisibleText.js +3 -16
  67. package/bin/executor/messages/UserVisibleText.js.map +1 -1
  68. package/bin/executor/store/history/SessionHistoryStore.d.ts +12 -0
  69. package/bin/executor/store/history/SessionHistoryStore.d.ts.map +1 -1
  70. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts +12 -0
  71. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts.map +1 -1
  72. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js +145 -8
  73. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js.map +1 -1
  74. package/bin/executor/tools/shell/ShellToolFormatting.d.ts +1 -10
  75. package/bin/executor/tools/shell/ShellToolFormatting.d.ts.map +1 -1
  76. package/bin/executor/tools/shell/ShellToolFormatting.js +1 -39
  77. package/bin/executor/tools/shell/ShellToolFormatting.js.map +1 -1
  78. package/bin/executor/types/SessionHistoryPaths.d.ts +4 -0
  79. package/bin/executor/types/SessionHistoryPaths.d.ts.map +1 -1
  80. package/bin/index.d.ts +5 -5
  81. package/bin/index.d.ts.map +1 -1
  82. package/bin/index.js +3 -3
  83. package/bin/index.js.map +1 -1
  84. package/bin/plugin/core/PluginCommandRequest.d.ts +1 -1
  85. package/bin/plugin/core/PluginCommandRequest.js +1 -1
  86. package/bin/plugin/core/PluginLocalExecution.js +1 -1
  87. package/bin/plugin/core/PluginLocalExecution.js.map +1 -1
  88. package/bin/plugin/core/ProjectConfigStore.d.ts +3 -2
  89. package/bin/plugin/core/ProjectConfigStore.d.ts.map +1 -1
  90. package/bin/plugin/core/ProjectConfigStore.js +3 -4
  91. package/bin/plugin/core/ProjectConfigStore.js.map +1 -1
  92. package/bin/plugin/types/Plugin.d.ts +10 -842
  93. package/bin/plugin/types/Plugin.d.ts.map +1 -1
  94. package/bin/plugin/types/Plugin.js +3 -4
  95. package/bin/plugin/types/Plugin.js.map +1 -1
  96. package/bin/plugin/types/PluginState.d.ts +1 -1
  97. package/bin/plugin/types/PluginState.d.ts.map +1 -1
  98. package/bin/rpc/Client.d.ts +2 -99
  99. package/bin/rpc/Client.d.ts.map +1 -1
  100. package/bin/rpc/Client.js +0 -46
  101. package/bin/rpc/Client.js.map +1 -1
  102. package/bin/rpc/Server.d.ts +5 -21
  103. package/bin/rpc/Server.d.ts.map +1 -1
  104. package/bin/rpc/Server.js +30 -315
  105. package/bin/rpc/Server.js.map +1 -1
  106. package/bin/rpc/server/InternalHandlers.d.ts +21 -0
  107. package/bin/rpc/server/InternalHandlers.d.ts.map +1 -0
  108. package/bin/rpc/server/InternalHandlers.js +190 -0
  109. package/bin/rpc/server/InternalHandlers.js.map +1 -0
  110. package/bin/rpc/server/RequestDispatcher.d.ts +27 -0
  111. package/bin/rpc/server/RequestDispatcher.d.ts.map +1 -0
  112. package/bin/rpc/server/RequestDispatcher.js +38 -0
  113. package/bin/rpc/server/RequestDispatcher.js.map +1 -0
  114. package/bin/rpc/server/SdkSessionHandlers.d.ts +25 -0
  115. package/bin/rpc/server/SdkSessionHandlers.d.ts.map +1 -0
  116. package/bin/rpc/server/SdkSessionHandlers.js +86 -0
  117. package/bin/rpc/server/SdkSessionHandlers.js.map +1 -0
  118. package/bin/rpc/server/ServerTypes.d.ts +59 -0
  119. package/bin/rpc/server/ServerTypes.d.ts.map +1 -0
  120. package/bin/rpc/server/ServerTypes.js +9 -0
  121. package/bin/rpc/server/ServerTypes.js.map +1 -0
  122. package/bin/{runtime/sandbox → sandbox}/MacOsSeatbeltSandbox.d.ts +1 -1
  123. package/bin/sandbox/MacOsSeatbeltSandbox.d.ts.map +1 -0
  124. package/bin/sandbox/MacOsSeatbeltSandbox.js.map +1 -0
  125. package/bin/{runtime/sandbox → sandbox}/SandboxConfigResolver.d.ts +2 -2
  126. package/bin/sandbox/SandboxConfigResolver.d.ts.map +1 -0
  127. package/bin/sandbox/SandboxConfigResolver.js.map +1 -0
  128. package/bin/{runtime/sandbox → sandbox}/SandboxRunner.d.ts +2 -2
  129. package/bin/sandbox/SandboxRunner.d.ts.map +1 -0
  130. package/bin/{runtime/sandbox → sandbox}/SandboxRunner.js +2 -2
  131. package/bin/sandbox/SandboxRunner.js.map +1 -0
  132. package/bin/sandbox/types/Sandbox.d.ts.map +1 -0
  133. package/bin/sandbox/types/Sandbox.js.map +1 -0
  134. package/bin/{runtime/sandbox → sandbox}/types/SandboxRuntime.d.ts +2 -2
  135. package/bin/sandbox/types/SandboxRuntime.d.ts.map +1 -0
  136. package/bin/sandbox/types/SandboxRuntime.js.map +1 -0
  137. package/bin/session/Session.d.ts.map +1 -1
  138. package/bin/session/Session.js +2 -1
  139. package/bin/session/Session.js.map +1 -1
  140. package/bin/session/browse/Browse.d.ts +1 -1
  141. package/bin/session/browse/Browse.d.ts.map +1 -1
  142. package/bin/session/browse/Browse.js +28 -13
  143. package/bin/session/browse/Browse.js.map +1 -1
  144. package/bin/session/index.d.ts +1 -1
  145. package/bin/session/index.d.ts.map +1 -1
  146. package/bin/session/index.js +1 -1
  147. package/bin/session/index.js.map +1 -1
  148. package/bin/session/storage/Paths.d.ts +9 -0
  149. package/bin/session/storage/Paths.d.ts.map +1 -1
  150. package/bin/session/storage/Paths.js +11 -0
  151. package/bin/session/storage/Paths.js.map +1 -1
  152. package/bin/types/agent/AgentOptions.d.ts +134 -0
  153. package/bin/types/agent/AgentOptions.d.ts.map +1 -0
  154. package/bin/types/agent/AgentOptions.js +9 -0
  155. package/bin/types/agent/AgentOptions.js.map +1 -0
  156. package/bin/types/{runtime/host/AgentHost.d.ts → agent/AgentRuntimeAssembly.d.ts} +4 -4
  157. package/bin/types/agent/AgentRuntimeAssembly.d.ts.map +1 -0
  158. package/bin/types/{runtime/host/AgentHost.js → agent/AgentRuntimeAssembly.js} +3 -3
  159. package/bin/types/agent/AgentRuntimeAssembly.js.map +1 -0
  160. package/bin/types/agent/AgentTypes.d.ts +8 -613
  161. package/bin/types/agent/AgentTypes.d.ts.map +1 -1
  162. package/bin/types/agent/AgentTypes.js +4 -4
  163. package/bin/types/agent/RemoteAgentOptions.d.ts +28 -0
  164. package/bin/types/agent/RemoteAgentOptions.d.ts.map +1 -0
  165. package/bin/types/agent/RemoteAgentOptions.js +9 -0
  166. package/bin/types/agent/RemoteAgentOptions.js.map +1 -0
  167. package/bin/types/agent/SessionActor.d.ts +60 -0
  168. package/bin/types/agent/SessionActor.d.ts.map +1 -0
  169. package/bin/types/agent/SessionActor.js +9 -0
  170. package/bin/types/agent/SessionActor.js.map +1 -0
  171. package/bin/types/agent/SessionTypes.d.ts +312 -0
  172. package/bin/types/agent/SessionTypes.d.ts.map +1 -0
  173. package/bin/types/agent/SessionTypes.js +9 -0
  174. package/bin/types/agent/SessionTypes.js.map +1 -0
  175. package/bin/types/config/DowncityConfig.d.ts +1 -1
  176. package/bin/types/config/DowncityConfig.d.ts.map +1 -1
  177. package/bin/types/{runtime/host → platform}/Store.d.ts +1 -1
  178. package/bin/types/platform/Store.d.ts.map +1 -0
  179. package/bin/types/{runtime/host → platform}/Store.js +1 -1
  180. package/bin/types/platform/Store.js.map +1 -0
  181. package/bin/types/plugin/PluginAction.d.ts +119 -0
  182. package/bin/types/plugin/PluginAction.d.ts.map +1 -0
  183. package/bin/types/plugin/PluginAction.js +9 -0
  184. package/bin/types/plugin/PluginAction.js.map +1 -0
  185. package/bin/types/plugin/PluginCommand.d.ts +80 -0
  186. package/bin/types/plugin/PluginCommand.d.ts.map +1 -0
  187. package/bin/types/plugin/PluginCommand.js +9 -0
  188. package/bin/types/plugin/PluginCommand.js.map +1 -0
  189. package/bin/types/plugin/PluginDefinition.d.ts +57 -0
  190. package/bin/types/plugin/PluginDefinition.d.ts.map +1 -0
  191. package/bin/types/plugin/PluginDefinition.js +9 -0
  192. package/bin/types/plugin/PluginDefinition.js.map +1 -0
  193. package/bin/types/plugin/PluginHttp.d.ts +34 -0
  194. package/bin/types/plugin/PluginHttp.d.ts.map +1 -0
  195. package/bin/types/plugin/PluginHttp.js +9 -0
  196. package/bin/types/plugin/PluginHttp.js.map +1 -0
  197. package/bin/types/plugin/PluginRuntime.d.ts +148 -0
  198. package/bin/types/plugin/PluginRuntime.d.ts.map +1 -0
  199. package/bin/types/plugin/PluginRuntime.js +9 -0
  200. package/bin/types/plugin/PluginRuntime.js.map +1 -0
  201. package/bin/types/plugin/PluginSetup.d.ts +133 -0
  202. package/bin/types/plugin/PluginSetup.d.ts.map +1 -0
  203. package/bin/types/plugin/PluginSetup.js +9 -0
  204. package/bin/types/plugin/PluginSetup.js.map +1 -0
  205. package/bin/types/plugin/PluginState.d.ts +69 -0
  206. package/bin/types/plugin/PluginState.d.ts.map +1 -0
  207. package/bin/types/plugin/PluginState.js +9 -0
  208. package/bin/types/plugin/PluginState.js.map +1 -0
  209. package/bin/types/rpc/RpcProtocol.d.ts +323 -0
  210. package/bin/types/rpc/RpcProtocol.d.ts.map +1 -0
  211. package/bin/types/rpc/RpcProtocol.js +10 -0
  212. package/bin/types/rpc/RpcProtocol.js.map +1 -0
  213. package/bin/types/runtime/agent/AgentContext.d.ts +1 -1
  214. package/bin/types/runtime/agent/AgentContext.d.ts.map +1 -1
  215. package/bin/types/runtime/agent/AgentRuntime.d.ts +1 -1
  216. package/bin/types/runtime/agent/AgentRuntime.d.ts.map +1 -1
  217. package/package.json +2 -2
  218. package/scripts/session-history-inflight.test.mjs +146 -0
  219. package/src/agent/{Agent.ts → local/Agent.ts} +50 -228
  220. package/src/agent/local/AgentInstructions.ts +68 -0
  221. package/src/agent/local/AgentPluginFactory.ts +83 -0
  222. package/src/{runtime/host/AgentHostRuntime.ts → agent/local/AgentRuntimeAssembly.ts} +2 -2
  223. package/src/agent/local/AgentRuntimeFactory.ts +173 -0
  224. package/src/{runtime/host → agent/local}/ProjectSetup.ts +1 -1
  225. package/src/agent/remote/RemoteAgent.ts +76 -0
  226. package/src/agent/remote/RemoteSession.ts +287 -0
  227. package/src/agent/remote/RemoteTransport.ts +71 -0
  228. package/src/agent/remote/TransportFactory.ts +29 -0
  229. package/src/agent/remote/transports/HttpRemoteAgentTransport.ts +347 -0
  230. package/src/agent/remote/transports/RpcRemoteAgentTransport.ts +107 -0
  231. package/src/executor/Executor.ts +56 -37
  232. package/src/executor/composer/history/SessionHistoryWriter.ts +2 -2
  233. package/src/executor/messages/AssistantResultPersistence.ts +4 -12
  234. package/src/executor/messages/SessionStepEventMapper.ts +59 -101
  235. package/src/executor/messages/UserVisibleText.ts +3 -18
  236. package/src/executor/store/history/SessionHistoryStore.ts +15 -0
  237. package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +164 -11
  238. package/src/executor/tools/shell/ShellToolFormatting.ts +1 -50
  239. package/src/executor/types/SessionHistoryPaths.ts +5 -0
  240. package/src/index.ts +5 -5
  241. package/src/plugin/core/PluginCommandRequest.ts +1 -1
  242. package/src/plugin/core/PluginLocalExecution.ts +1 -1
  243. package/src/plugin/core/ProjectConfigStore.ts +4 -4
  244. package/src/plugin/types/Plugin.ts +54 -913
  245. package/src/plugin/types/PluginState.ts +1 -1
  246. package/src/rpc/Client.ts +16 -322
  247. package/src/rpc/Server.ts +39 -565
  248. package/src/rpc/server/InternalHandlers.ts +230 -0
  249. package/src/rpc/server/RequestDispatcher.ts +67 -0
  250. package/src/rpc/server/SdkSessionHandlers.ts +106 -0
  251. package/src/rpc/server/ServerTypes.ts +65 -0
  252. package/src/{runtime/sandbox → sandbox}/MacOsSeatbeltSandbox.ts +1 -1
  253. package/src/{runtime/sandbox → sandbox}/SandboxConfigResolver.ts +1 -1
  254. package/src/{runtime/sandbox → sandbox}/SandboxRunner.ts +3 -3
  255. package/src/{runtime/sandbox → sandbox}/types/SandboxRuntime.ts +2 -2
  256. package/src/session/Session.ts +6 -0
  257. package/src/session/browse/Browse.ts +29 -10
  258. package/src/session/index.ts +1 -0
  259. package/src/session/storage/Paths.ts +19 -0
  260. package/src/types/agent/AgentOptions.ts +147 -0
  261. package/src/types/{runtime/host/AgentHost.ts → agent/AgentRuntimeAssembly.ts} +2 -2
  262. package/src/types/agent/AgentTypes.ts +37 -709
  263. package/src/types/agent/RemoteAgentOptions.ts +29 -0
  264. package/src/types/agent/SessionActor.ts +88 -0
  265. package/src/types/agent/SessionTypes.ts +334 -0
  266. package/src/types/config/DowncityConfig.ts +1 -1
  267. package/src/types/{runtime/host → platform}/Store.ts +1 -1
  268. package/src/types/plugin/PluginAction.ts +133 -0
  269. package/src/types/plugin/PluginCommand.ts +89 -0
  270. package/src/types/plugin/PluginDefinition.ts +74 -0
  271. package/src/types/plugin/PluginHttp.ts +36 -0
  272. package/src/types/plugin/PluginRuntime.ts +169 -0
  273. package/src/types/plugin/PluginSetup.ts +138 -0
  274. package/src/types/plugin/PluginState.ts +82 -0
  275. package/src/types/rpc/RpcProtocol.ts +361 -0
  276. package/src/types/runtime/agent/AgentContext.ts +1 -1
  277. package/src/types/runtime/agent/AgentRuntime.ts +1 -1
  278. package/tsconfig.tsbuildinfo +1 -1
  279. package/bin/agent/Agent.d.ts.map +0 -1
  280. package/bin/agent/Agent.js.map +0 -1
  281. package/bin/agent/RemoteAgent.d.ts.map +0 -1
  282. package/bin/agent/RemoteAgent.js +0 -585
  283. package/bin/agent/RemoteAgent.js.map +0 -1
  284. package/bin/runtime/auth/AuthEnv.d.ts +0 -36
  285. package/bin/runtime/auth/AuthEnv.d.ts.map +0 -1
  286. package/bin/runtime/auth/AuthEnv.js +0 -54
  287. package/bin/runtime/auth/AuthEnv.js.map +0 -1
  288. package/bin/runtime/auth/CliAuthStateStore.d.ts +0 -29
  289. package/bin/runtime/auth/CliAuthStateStore.d.ts.map +0 -1
  290. package/bin/runtime/auth/CliAuthStateStore.js +0 -26
  291. package/bin/runtime/auth/CliAuthStateStore.js.map +0 -1
  292. package/bin/runtime/control/AuthControlService.d.ts +0 -34
  293. package/bin/runtime/control/AuthControlService.d.ts.map +0 -1
  294. package/bin/runtime/control/AuthControlService.js +0 -129
  295. package/bin/runtime/control/AuthControlService.js.map +0 -1
  296. package/bin/runtime/control/CommonHelpers.d.ts +0 -36
  297. package/bin/runtime/control/CommonHelpers.d.ts.map +0 -1
  298. package/bin/runtime/control/CommonHelpers.js +0 -63
  299. package/bin/runtime/control/CommonHelpers.js.map +0 -1
  300. package/bin/runtime/control/ExecuteBySession.d.ts +0 -30
  301. package/bin/runtime/control/ExecuteBySession.d.ts.map +0 -1
  302. package/bin/runtime/control/ExecuteBySession.js +0 -41
  303. package/bin/runtime/control/ExecuteBySession.js.map +0 -1
  304. package/bin/runtime/control/ExecuteInput.d.ts +0 -18
  305. package/bin/runtime/control/ExecuteInput.d.ts.map +0 -1
  306. package/bin/runtime/control/ExecuteInput.js +0 -201
  307. package/bin/runtime/control/ExecuteInput.js.map +0 -1
  308. package/bin/runtime/control/Helpers.d.ts +0 -13
  309. package/bin/runtime/control/Helpers.d.ts.map +0 -1
  310. package/bin/runtime/control/Helpers.js +0 -13
  311. package/bin/runtime/control/Helpers.js.map +0 -1
  312. package/bin/runtime/control/MessageTimeline.d.ts +0 -22
  313. package/bin/runtime/control/MessageTimeline.d.ts.map +0 -1
  314. package/bin/runtime/control/MessageTimeline.js +0 -226
  315. package/bin/runtime/control/MessageTimeline.js.map +0 -1
  316. package/bin/runtime/control/SessionSummaryStore.d.ts +0 -20
  317. package/bin/runtime/control/SessionSummaryStore.d.ts.map +0 -1
  318. package/bin/runtime/control/SessionSummaryStore.js +0 -50
  319. package/bin/runtime/control/SessionSummaryStore.js.map +0 -1
  320. package/bin/runtime/control/TaskStore.d.ts +0 -33
  321. package/bin/runtime/control/TaskStore.d.ts.map +0 -1
  322. package/bin/runtime/control/TaskStore.js +0 -175
  323. package/bin/runtime/control/TaskStore.js.map +0 -1
  324. package/bin/runtime/control/types/AuthControl.d.ts +0 -30
  325. package/bin/runtime/control/types/AuthControl.d.ts.map +0 -1
  326. package/bin/runtime/control/types/AuthControl.js +0 -9
  327. package/bin/runtime/control/types/AuthControl.js.map +0 -1
  328. package/bin/runtime/control/types/ControlSessionExecute.d.ts +0 -85
  329. package/bin/runtime/control/types/ControlSessionExecute.d.ts.map +0 -1
  330. package/bin/runtime/control/types/ControlSessionExecute.js +0 -9
  331. package/bin/runtime/control/types/ControlSessionExecute.js.map +0 -1
  332. package/bin/runtime/control/types/ControlViewData.d.ts +0 -320
  333. package/bin/runtime/control/types/ControlViewData.d.ts.map +0 -1
  334. package/bin/runtime/control/types/ControlViewData.js +0 -9
  335. package/bin/runtime/control/types/ControlViewData.js.map +0 -1
  336. package/bin/runtime/host/AgentHostRuntime.d.ts.map +0 -1
  337. package/bin/runtime/host/AgentHostRuntime.js.map +0 -1
  338. package/bin/runtime/host/ProjectSetup.d.ts.map +0 -1
  339. package/bin/runtime/host/ProjectSetup.js.map +0 -1
  340. package/bin/runtime/sandbox/MacOsSeatbeltSandbox.d.ts.map +0 -1
  341. package/bin/runtime/sandbox/MacOsSeatbeltSandbox.js.map +0 -1
  342. package/bin/runtime/sandbox/SandboxConfigResolver.d.ts.map +0 -1
  343. package/bin/runtime/sandbox/SandboxConfigResolver.js.map +0 -1
  344. package/bin/runtime/sandbox/SandboxRunner.d.ts.map +0 -1
  345. package/bin/runtime/sandbox/SandboxRunner.js.map +0 -1
  346. package/bin/runtime/sandbox/types/Sandbox.d.ts.map +0 -1
  347. package/bin/runtime/sandbox/types/Sandbox.js.map +0 -1
  348. package/bin/runtime/sandbox/types/SandboxRuntime.d.ts.map +0 -1
  349. package/bin/runtime/sandbox/types/SandboxRuntime.js.map +0 -1
  350. package/bin/types/runtime/host/AgentHost.d.ts.map +0 -1
  351. package/bin/types/runtime/host/AgentHost.js.map +0 -1
  352. package/bin/types/runtime/host/Store.d.ts.map +0 -1
  353. package/bin/types/runtime/host/Store.js.map +0 -1
  354. package/src/agent/RemoteAgent.ts +0 -834
  355. package/src/runtime/auth/AuthEnv.ts +0 -62
  356. package/src/runtime/auth/CliAuthStateStore.ts +0 -46
  357. package/src/runtime/control/AuthControlService.ts +0 -169
  358. package/src/runtime/control/CommonHelpers.ts +0 -69
  359. package/src/runtime/control/ExecuteBySession.ts +0 -52
  360. package/src/runtime/control/ExecuteInput.ts +0 -236
  361. package/src/runtime/control/Helpers.ts +0 -22
  362. package/src/runtime/control/MessageTimeline.ts +0 -269
  363. package/src/runtime/control/SessionSummaryStore.ts +0 -72
  364. package/src/runtime/control/TaskStore.ts +0 -242
  365. package/src/runtime/control/types/AuthControl.ts +0 -34
  366. package/src/runtime/control/types/ControlSessionExecute.ts +0 -99
  367. package/src/runtime/control/types/ControlViewData.ts +0 -392
  368. /package/bin/{runtime/sandbox → sandbox}/MacOsSeatbeltSandbox.js +0 -0
  369. /package/bin/{runtime/sandbox → sandbox}/SandboxConfigResolver.js +0 -0
  370. /package/bin/{runtime/sandbox → sandbox}/types/Sandbox.d.ts +0 -0
  371. /package/bin/{runtime/sandbox → sandbox}/types/Sandbox.js +0 -0
  372. /package/bin/{runtime/sandbox → sandbox}/types/SandboxRuntime.js +0 -0
  373. /package/src/{runtime/sandbox → sandbox}/types/Sandbox.ts +0 -0
@@ -0,0 +1,347 @@
1
+ /**
2
+ * RemoteAgent HTTP transport。
3
+ *
4
+ * 关键点(中文)
5
+ * - 只适配 Town Agent HTTP gateway 的 SDK routes。
6
+ * - 不处理 RemoteSession 的 turn lifecycle,避免 transport 与 actor 逻辑混在一起。
7
+ */
8
+
9
+ import type {
10
+ AgentCreateSessionInput,
11
+ AgentListSessionsInput,
12
+ AgentSessionForkInput,
13
+ AgentSessionHistoryInput,
14
+ AgentSessionHistoryPage,
15
+ AgentSessionInfo,
16
+ AgentSessionSummaryPage,
17
+ AgentSessionSystemSnapshot,
18
+ } from "@/types/agent/AgentTypes.js";
19
+ import type { AgentSessionEvent } from "@/types/sdk/AgentSessionEvent.js";
20
+ import type { AgentSessionPromptInput } from "@/types/sdk/AgentSessionPrompt.js";
21
+ import type {
22
+ RemoteAgentTransport,
23
+ TransportSubscription,
24
+ } from "@/agent/remote/RemoteTransport.js";
25
+
26
+ type SdkEventsReadyFrame = {
27
+ /** SDK HTTP events 连接内部 ready 标记。 */
28
+ type: "sdk-events-ready";
29
+ };
30
+
31
+ /**
32
+ * Town HTTP gateway transport。
33
+ */
34
+ export class HttpRemoteAgentTransport implements RemoteAgentTransport {
35
+ private readonly base_url: string;
36
+ private readonly token: string;
37
+
38
+ constructor(url: string, token?: string) {
39
+ this.base_url = url.replace(/\/+$/, "");
40
+ this.token = String(token || "").trim();
41
+ }
42
+
43
+ private headers(input?: Record<string, string>): Headers {
44
+ const headers = new Headers(input);
45
+ if (this.token) {
46
+ headers.set("Authorization", `Bearer ${this.token}`);
47
+ }
48
+ return headers;
49
+ }
50
+
51
+ async create_session(input?: AgentCreateSessionInput): Promise<AgentSessionInfo> {
52
+ const payload = await read_http_json<{
53
+ success?: boolean;
54
+ error?: string;
55
+ session?: AgentSessionInfo;
56
+ }>(`${this.base_url}/api/sdk/sessions`, {
57
+ method: "POST",
58
+ headers: this.headers({
59
+ "Content-Type": "application/json",
60
+ }),
61
+ body: JSON.stringify({
62
+ ...(input?.sessionId ? { sessionId: input.sessionId } : {}),
63
+ }),
64
+ });
65
+ if (!payload.success || !payload.session?.sessionId) {
66
+ throw new Error(String(payload.error || "Remote session create failed"));
67
+ }
68
+ return payload.session;
69
+ }
70
+
71
+ async get_info(session_id: string): Promise<AgentSessionInfo> {
72
+ const payload = await read_http_json<{
73
+ success?: boolean;
74
+ error?: string;
75
+ session?: AgentSessionInfo;
76
+ }>(`${this.base_url}/api/sdk/sessions/${encodeURIComponent(session_id)}`, {
77
+ headers: this.headers(),
78
+ });
79
+ if (!payload.success || !payload.session?.sessionId) {
80
+ throw new Error(String(payload.error || "Remote session info failed"));
81
+ }
82
+ return payload.session;
83
+ }
84
+
85
+ async prompt(
86
+ session_id: string,
87
+ input: AgentSessionPromptInput,
88
+ ): Promise<{ id: string }> {
89
+ const payload = await read_http_json<{
90
+ success?: boolean;
91
+ error?: string;
92
+ turn?: {
93
+ id?: string;
94
+ };
95
+ }>(`${this.base_url}/api/sdk/sessions/${encodeURIComponent(session_id)}/prompt`, {
96
+ method: "POST",
97
+ headers: this.headers({
98
+ "Content-Type": "application/json",
99
+ }),
100
+ body: JSON.stringify({
101
+ query: input.query,
102
+ }),
103
+ });
104
+ const id = String(payload.turn?.id || "").trim();
105
+ if (!payload.success || !id) {
106
+ throw new Error(String(payload.error || "Remote session prompt failed"));
107
+ }
108
+ return { id };
109
+ }
110
+
111
+ async subscribe(params: {
112
+ session_id: string;
113
+ on_ready: () => void;
114
+ on_event: (event: AgentSessionEvent) => void;
115
+ }): Promise<TransportSubscription> {
116
+ const abort_controller = new AbortController();
117
+ let resolve_ready!: () => void;
118
+ let reject_ready!: (error: unknown) => void;
119
+ const ready_promise = new Promise<void>((resolve, reject) => {
120
+ resolve_ready = resolve;
121
+ reject_ready = reject;
122
+ });
123
+ const response = await fetch(
124
+ `${this.base_url}/api/sdk/sessions/${encodeURIComponent(params.session_id)}/events`,
125
+ {
126
+ headers: this.headers(),
127
+ signal: abort_controller.signal,
128
+ },
129
+ );
130
+ if (!response.ok || !response.body) {
131
+ const text = await response.text().catch(() => "");
132
+ throw new Error(text || `Remote session events failed (${response.status})`);
133
+ }
134
+ void consume_http_event_stream({
135
+ body: response.body,
136
+ abort_controller,
137
+ on_ready: () => {
138
+ params.on_ready();
139
+ resolve_ready();
140
+ },
141
+ on_ready_error: (error) => {
142
+ reject_ready(error);
143
+ },
144
+ on_event: params.on_event,
145
+ });
146
+ await ready_promise;
147
+ return {
148
+ close: async () => {
149
+ abort_controller.abort();
150
+ },
151
+ };
152
+ }
153
+
154
+ async history(
155
+ session_id: string,
156
+ input?: AgentSessionHistoryInput,
157
+ ): Promise<AgentSessionHistoryPage> {
158
+ const query = new URLSearchParams();
159
+ if (input?.limit !== undefined) query.set("limit", String(input.limit));
160
+ if (input?.cursor) query.set("cursor", input.cursor);
161
+ if (input?.order) query.set("order", input.order);
162
+ if (input?.view) query.set("view", input.view);
163
+ const payload = await read_http_json<{
164
+ success?: boolean;
165
+ error?: string;
166
+ history?: AgentSessionHistoryPage;
167
+ }>(
168
+ `${this.base_url}/api/sdk/sessions/${encodeURIComponent(session_id)}/history${
169
+ query.size > 0 ? `?${query.toString()}` : ""
170
+ }`,
171
+ {
172
+ headers: this.headers(),
173
+ },
174
+ );
175
+ if (!payload.success || !payload.history || !Array.isArray(payload.history.items)) {
176
+ throw new Error(String(payload.error || "Remote session history failed"));
177
+ }
178
+ return payload.history;
179
+ }
180
+
181
+ async system(session_id: string): Promise<AgentSessionSystemSnapshot> {
182
+ const payload = await read_http_json<{
183
+ success?: boolean;
184
+ error?: string;
185
+ system?: AgentSessionSystemSnapshot;
186
+ }>(`${this.base_url}/api/sdk/sessions/${encodeURIComponent(session_id)}/system`, {
187
+ headers: this.headers(),
188
+ });
189
+ if (!payload.success || !payload.system || !Array.isArray(payload.system.blocks)) {
190
+ throw new Error(String(payload.error || "Remote session system failed"));
191
+ }
192
+ return payload.system;
193
+ }
194
+
195
+ async fork(
196
+ session_id: string,
197
+ input?: AgentSessionForkInput | string,
198
+ ): Promise<AgentSessionInfo> {
199
+ const message_id =
200
+ typeof input === "string"
201
+ ? String(input || "").trim() || undefined
202
+ : String(input?.messageId || "").trim() || undefined;
203
+ const payload = await read_http_json<{
204
+ success?: boolean;
205
+ error?: string;
206
+ session?: AgentSessionInfo;
207
+ }>(`${this.base_url}/api/sdk/sessions/${encodeURIComponent(session_id)}/fork`, {
208
+ method: "POST",
209
+ headers: this.headers({
210
+ "Content-Type": "application/json",
211
+ }),
212
+ body: JSON.stringify({
213
+ ...(message_id ? { messageId: message_id } : {}),
214
+ }),
215
+ });
216
+ if (!payload.success || !payload.session?.sessionId) {
217
+ throw new Error(String(payload.error || "Remote session fork failed"));
218
+ }
219
+ return payload.session;
220
+ }
221
+
222
+ async list_sessions(input?: AgentListSessionsInput): Promise<AgentSessionSummaryPage> {
223
+ const query = new URLSearchParams();
224
+ if (input?.limit !== undefined) query.set("limit", String(input.limit));
225
+ if (input?.cursor) query.set("cursor", input.cursor);
226
+ if (input?.query) query.set("query", input.query);
227
+ const payload = await read_http_json<{
228
+ success?: boolean;
229
+ error?: string;
230
+ page?: AgentSessionSummaryPage;
231
+ }>(
232
+ `${this.base_url}/api/sdk/sessions${query.size > 0 ? `?${query.toString()}` : ""}`,
233
+ {
234
+ headers: this.headers(),
235
+ },
236
+ );
237
+ if (!payload.success || !payload.page) {
238
+ throw new Error(String(payload.error || "Remote sessions list failed"));
239
+ }
240
+ return payload.page;
241
+ }
242
+ }
243
+
244
+ async function read_http_json<T>(input: string, init?: RequestInit): Promise<T> {
245
+ const response = await fetch(input, init);
246
+ const payload = (await response.json().catch(() => ({}))) as T;
247
+ if (!response.ok) {
248
+ const message = extract_error_message(payload);
249
+ throw new Error(message || `HTTP ${response.status}`);
250
+ }
251
+ return payload;
252
+ }
253
+
254
+ async function consume_http_event_stream(params: {
255
+ body: ReadableStream<Uint8Array>;
256
+ abort_controller: AbortController;
257
+ on_ready: () => void;
258
+ on_ready_error: (error: unknown) => void;
259
+ on_event: (event: AgentSessionEvent) => void;
260
+ }): Promise<void> {
261
+ const decoder = new TextDecoder();
262
+ const reader = params.body.getReader();
263
+ let buffered = "";
264
+ let ready_resolved = false;
265
+
266
+ try {
267
+ while (true) {
268
+ const { done, value } = await reader.read();
269
+ if (done) break;
270
+ buffered += decoder.decode(value, { stream: true });
271
+ let newline_index = buffered.indexOf("\n");
272
+ while (newline_index >= 0) {
273
+ const line = buffered.slice(0, newline_index).trim();
274
+ buffered = buffered.slice(newline_index + 1);
275
+ if (line) {
276
+ const value = JSON.parse(line) as unknown;
277
+ if (is_sdk_events_ready_frame(value)) {
278
+ ready_resolved = true;
279
+ params.on_ready();
280
+ } else {
281
+ params.on_event(value as AgentSessionEvent);
282
+ }
283
+ }
284
+ newline_index = buffered.indexOf("\n");
285
+ }
286
+ }
287
+
288
+ const tail = buffered.trim();
289
+ if (tail) {
290
+ const value = JSON.parse(tail) as unknown;
291
+ if (is_sdk_events_ready_frame(value)) {
292
+ ready_resolved = true;
293
+ params.on_ready();
294
+ } else {
295
+ params.on_event(value as AgentSessionEvent);
296
+ }
297
+ }
298
+
299
+ if (!params.abort_controller.signal.aborted) {
300
+ if (!ready_resolved) {
301
+ const error = new Error("Remote session events connection closed before ready");
302
+ params.on_ready_error(error);
303
+ throw error;
304
+ }
305
+ params.on_event({
306
+ type: "error",
307
+ message: "Remote session events connection closed",
308
+ });
309
+ }
310
+ } catch (error) {
311
+ if (!params.abort_controller.signal.aborted) {
312
+ if (!ready_resolved) {
313
+ params.on_ready_error(error);
314
+ }
315
+ params.on_event({
316
+ type: "error",
317
+ message: error instanceof Error ? error.message : String(error),
318
+ });
319
+ }
320
+ } finally {
321
+ try {
322
+ reader.releaseLock();
323
+ } catch {
324
+ // ignore
325
+ }
326
+ }
327
+ }
328
+
329
+ function extract_error_message(payload: unknown): string {
330
+ if (!payload || typeof payload !== "object") return "";
331
+ if ("error" in payload && typeof payload.error === "string") {
332
+ return payload.error;
333
+ }
334
+ if ("message" in payload && typeof payload.message === "string") {
335
+ return payload.message;
336
+ }
337
+ return "";
338
+ }
339
+
340
+ function is_sdk_events_ready_frame(value: unknown): value is SdkEventsReadyFrame {
341
+ return (
342
+ typeof value === "object" &&
343
+ value !== null &&
344
+ "type" in value &&
345
+ (value as { type?: unknown }).type === "sdk-events-ready"
346
+ );
347
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * RemoteAgent RPC transport。
3
+ *
4
+ * 关键点(中文)
5
+ * - 只把 RemoteAgent 的 session actor 方法映射到 RpcClient。
6
+ * - 长连接生命周期由 RpcClient 管理。
7
+ */
8
+
9
+ import type {
10
+ AgentCreateSessionInput,
11
+ AgentListSessionsInput,
12
+ AgentSessionForkInput,
13
+ AgentSessionHistoryInput,
14
+ AgentSessionHistoryPage,
15
+ AgentSessionInfo,
16
+ AgentSessionSummaryPage,
17
+ AgentSessionSystemSnapshot,
18
+ } from "@/types/agent/AgentTypes.js";
19
+ import type { AgentSessionEvent } from "@/types/sdk/AgentSessionEvent.js";
20
+ import type { AgentSessionPromptInput } from "@/types/sdk/AgentSessionPrompt.js";
21
+ import { RpcClient, parse_rpc_url } from "@/rpc/Client.js";
22
+ import type {
23
+ RemoteAgentTransport,
24
+ TransportSubscription,
25
+ } from "@/agent/remote/RemoteTransport.js";
26
+
27
+ /**
28
+ * 本机 RPC transport。
29
+ */
30
+ export class RpcRemoteAgentTransport implements RemoteAgentTransport {
31
+ private readonly client: RpcClient;
32
+
33
+ constructor(url: string) {
34
+ this.client = new RpcClient(parse_rpc_url(url));
35
+ }
36
+
37
+ async create_session(input?: AgentCreateSessionInput): Promise<AgentSessionInfo> {
38
+ return await this.client.create_session(input);
39
+ }
40
+
41
+ async get_info(session_id: string): Promise<AgentSessionInfo> {
42
+ return await this.client.get_session(session_id);
43
+ }
44
+
45
+ async prompt(
46
+ session_id: string,
47
+ input: AgentSessionPromptInput,
48
+ ): Promise<{ id: string }> {
49
+ return await this.client.prompt_session({
50
+ session_id,
51
+ input,
52
+ });
53
+ }
54
+
55
+ async subscribe(params: {
56
+ session_id: string;
57
+ on_ready: () => void;
58
+ on_event: (event: AgentSessionEvent) => void;
59
+ }): Promise<TransportSubscription> {
60
+ const subscription = await this.client.subscribe_session({
61
+ session_id: params.session_id,
62
+ on_ready: params.on_ready,
63
+ on_event: params.on_event,
64
+ });
65
+ return {
66
+ close: async () => {
67
+ await subscription.unsubscribe();
68
+ },
69
+ };
70
+ }
71
+
72
+ async history(
73
+ session_id: string,
74
+ input?: AgentSessionHistoryInput,
75
+ ): Promise<AgentSessionHistoryPage> {
76
+ return await this.client.get_session_history({
77
+ session_id,
78
+ input,
79
+ });
80
+ }
81
+
82
+ async system(session_id: string): Promise<AgentSessionSystemSnapshot> {
83
+ return await this.client.get_session_system(session_id);
84
+ }
85
+
86
+ async fork(
87
+ session_id: string,
88
+ input?: AgentSessionForkInput | string,
89
+ ): Promise<AgentSessionInfo> {
90
+ const message_id =
91
+ typeof input === "string"
92
+ ? String(input || "").trim() || undefined
93
+ : String(input?.messageId || "").trim() || undefined;
94
+ return await this.client.fork_session({
95
+ session_id,
96
+ ...(message_id ? { message_id } : {}),
97
+ });
98
+ }
99
+
100
+ async list_sessions(input?: AgentListSessionsInput): Promise<AgentSessionSummaryPage> {
101
+ return await this.client.list_sessions(input);
102
+ }
103
+
104
+ async close(): Promise<void> {
105
+ await this.client.close();
106
+ }
107
+ }
@@ -13,7 +13,7 @@ import type { SessionHistoryComposer } from "@executor/composer/history/SessionH
13
13
  import type { SessionHistoryStore } from "@/executor/store/history/SessionHistoryStore.js";
14
14
  import { withSessionRunScope } from "@executor/SessionRunScope.js";
15
15
  import type { SessionRunScope } from "@executor/SessionRunScope.js";
16
- import { buildSessionStepEventMessages } from "@executor/messages/SessionStepEventMapper.js";
16
+ import { buildSessionStepParts } from "@executor/messages/SessionStepEventMapper.js";
17
17
  import { JsonlSessionCompactionComposer } from "@executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.js";
18
18
  import { LocalSessionContextComposer } from "@executor/composer/context/LocalSessionContextComposer.js";
19
19
  import type { SessionCompactionComposer } from "@executor/composer/compaction/SessionCompactionComposer.js";
@@ -55,6 +55,7 @@ import type {
55
55
  SessionRunInput,
56
56
  SessionRunResult,
57
57
  } from "@/executor/types/SessionRun.js";
58
+ import { generateId } from "@/utils/Id.js";
58
59
 
59
60
  /**
60
61
  * 可压缩错误的最大重试次数。
@@ -226,6 +227,56 @@ export class Executor implements SessionExecutor {
226
227
  await this.historyWriter.appendAssistantMessage(params);
227
228
  }
228
229
 
230
+ /**
231
+ * 把 step/tool 过程增量写入当前运行中的 assistant 快照。
232
+ */
233
+ private async appendAssistantStepPartsToInflight(
234
+ parts: SessionMessageV1["parts"],
235
+ ): Promise<void> {
236
+ const normalized_parts = Array.isArray(parts)
237
+ ? parts.filter((part) => part && typeof part === "object")
238
+ : [];
239
+ if (normalized_parts.length === 0) return;
240
+
241
+ const current_inflight = await this.historyStore.readInflight();
242
+ const next_message: SessionMessageV1 = current_inflight
243
+ ? {
244
+ ...current_inflight,
245
+ metadata: {
246
+ ...(current_inflight.metadata || {
247
+ v: 1 as const,
248
+ ts: Date.now(),
249
+ sessionId: this.sessionId,
250
+ }),
251
+ ts: Date.now(),
252
+ sessionId: this.sessionId,
253
+ source: "egress",
254
+ kind: "normal",
255
+ },
256
+ parts: [
257
+ ...(Array.isArray(current_inflight.parts)
258
+ ? current_inflight.parts
259
+ : []),
260
+ ...normalized_parts,
261
+ ],
262
+ }
263
+ : {
264
+ id: `a:${this.sessionId}:${generateId()}`,
265
+ role: "assistant",
266
+ metadata: {
267
+ v: 1,
268
+ ts: Date.now(),
269
+ sessionId: this.sessionId,
270
+ source: "egress",
271
+ kind: "normal",
272
+ },
273
+ parts: normalized_parts,
274
+ };
275
+
276
+ await this.historyStore.writeInflight(next_message);
277
+ await this.afterSessionUpdatedAsync();
278
+ }
279
+
229
280
  /**
230
281
  * 运行当前 session 的一次请求。
231
282
  *
@@ -256,7 +307,6 @@ export class Executor implements SessionExecutor {
256
307
  ? { onUiMessageChunkCallback: params.onUiMessageChunkCallback }
257
308
  : {}),
258
309
  };
259
- let persistedAssistantStepCount = 0;
260
310
  const providedOnAssistantStepCallback =
261
311
  sessionRunScope.onAssistantStepCallback;
262
312
 
@@ -266,20 +316,14 @@ export class Executor implements SessionExecutor {
266
316
  visibility?: "visible" | "internal";
267
317
  stepResult?: unknown;
268
318
  }): Promise<void> => {
269
- const stepMessages = buildSessionStepEventMessages({
270
- sessionId: this.sessionId,
319
+ const step_parts = buildSessionStepParts({
271
320
  stepIndex: step.stepIndex,
272
321
  stepResult: step.stepResult,
273
322
  text: step.text,
274
323
  visibility: step.visibility,
275
324
  });
276
- if (stepMessages.length > 0) {
277
- for (const stepMessage of stepMessages) {
278
- await this.appendAssistantMessage({
279
- message: stepMessage,
280
- });
281
- persistedAssistantStepCount += 1;
282
- }
325
+ if (step_parts.length > 0) {
326
+ await this.appendAssistantStepPartsToInflight(step_parts);
283
327
  }
284
328
 
285
329
  if (typeof providedOnAssistantStepCallback === "function") {
@@ -298,32 +342,7 @@ export class Executor implements SessionExecutor {
298
342
  },
299
343
  () => this.runWithRetry({ query }),
300
344
  );
301
- if (persistedAssistantStepCount <= 0) return result;
302
-
303
- return {
304
- ...result,
305
- assistantMessage: {
306
- ...result.assistantMessage,
307
- metadata: {
308
- ...(result.assistantMessage.metadata || {
309
- v: 1 as const,
310
- ts: Date.now(),
311
- sessionId: this.sessionId,
312
- }),
313
- extra: {
314
- ...(
315
- result.assistantMessage.metadata?.extra &&
316
- typeof result.assistantMessage.metadata.extra === "object" &&
317
- !Array.isArray(result.assistantMessage.metadata.extra)
318
- ? result.assistantMessage.metadata.extra
319
- : {}
320
- ),
321
- assistantStepMessagesPersisted: true,
322
- assistantStepCount: persistedAssistantStepCount,
323
- },
324
- },
325
- },
326
- };
345
+ return result;
327
346
  } finally {
328
347
  this.resetRunState();
329
348
  this.executing = false;
@@ -104,7 +104,7 @@ export class SessionHistoryWriter {
104
104
  try {
105
105
  const historyStore = this.getHistoryStore();
106
106
  if (params.message && typeof params.message === "object") {
107
- await historyStore.append(params.message);
107
+ await historyStore.finalizeInflight(params.message);
108
108
  void this.afterSessionUpdatedAsync();
109
109
  return;
110
110
  }
@@ -112,7 +112,7 @@ export class SessionHistoryWriter {
112
112
  const fallbackText = String(params.fallbackText || "").trim();
113
113
  if (!fallbackText) return;
114
114
 
115
- await historyStore.append(
115
+ await historyStore.finalizeInflight(
116
116
  historyStore.assistantText({
117
117
  text: fallbackText,
118
118
  metadata: {
@@ -4,14 +4,11 @@
4
4
  * 关键点(中文)
5
5
  * - 负责收敛“写完整 assistant message / 写 fallback 文本 / 完全跳过”三种分支。
6
6
  * - 避免 SDK、HTTP execute、control execute、chat queue 各自复制一套判断。
7
- * - 一旦 step 消息已经单独持久化,最终 merged assistant 必须跳过,不能再补一条 fallback。
7
+ * - 运行中 step/tool 的持久化由 inflight 快照承担;run 结束时只关心最终 assistant 如何收口。
8
8
  */
9
9
 
10
10
  import type { SessionMessageV1 } from "@/executor/types/SessionMessages.js";
11
- import {
12
- hasPersistedAssistantSteps,
13
- resolveAssistantMessageForPersistence,
14
- } from "@/executor/messages/UserVisibleText.js";
11
+ import { resolveAssistantMessageForPersistence } from "@/executor/messages/UserVisibleText.js";
15
12
 
16
13
  /**
17
14
  * assistant 写入端口。
@@ -48,8 +45,8 @@ export interface PersistAssistantResultParams {
48
45
  * 可选兜底文本。
49
46
  *
50
47
  * 关键点(中文)
51
- * - 仅在没有完整 assistant message 且未发生 step 持久化时才允许写入。
52
- * - step 已单独落盘,这里必须被忽略,避免重复 assistant。
48
+ * - 仅在没有完整 assistant message 时才允许写入。
49
+ * - inflight 快照的正式收口由 history store 负责,这里不再处理旧的 step 独立落盘分支。
53
50
  */
54
51
  fallbackText?: string;
55
52
  }
@@ -83,11 +80,6 @@ export function buildAssistantResultPersistencePayload(
83
80
  };
84
81
  }
85
82
 
86
- // 关键点(中文):step 已经单独落盘时,最终 merged assistant 必须完全跳过。
87
- if (hasPersistedAssistantSteps(params.assistantMessage)) {
88
- return null;
89
- }
90
-
91
83
  const fallbackText = normalizeFallbackText(params.fallbackText);
92
84
  if (!fallbackText) return null;
93
85
  return {