@downcity/agent 1.1.430 → 1.1.437

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 (488) hide show
  1. package/README.md +13 -11
  2. package/bin/agent/Agent.d.ts +3 -3
  3. package/bin/agent/Agent.d.ts.map +1 -1
  4. package/bin/agent/Agent.js +38 -8
  5. package/bin/agent/Agent.js.map +1 -1
  6. package/bin/agent/AgentInstructions.js +2 -2
  7. package/bin/agent/AgentInstructions.js.map +1 -1
  8. package/bin/agent/AgentMemoryStorage.d.ts.map +1 -1
  9. package/bin/agent/AgentMemoryStorage.js +1 -0
  10. package/bin/agent/AgentMemoryStorage.js.map +1 -1
  11. package/bin/agent/AgentSessions.d.ts +5 -1
  12. package/bin/agent/AgentSessions.d.ts.map +1 -1
  13. package/bin/agent/AgentSessions.js +17 -9
  14. package/bin/agent/AgentSessions.js.map +1 -1
  15. package/bin/executor/Executor.d.ts +9 -27
  16. package/bin/executor/Executor.d.ts.map +1 -1
  17. package/bin/executor/Executor.js +32 -127
  18. package/bin/executor/Executor.js.map +1 -1
  19. package/bin/executor/composer/system/default/SystemPromptAssets.d.ts +0 -4
  20. package/bin/executor/composer/system/default/SystemPromptAssets.d.ts.map +1 -1
  21. package/bin/executor/composer/system/default/SystemPromptAssets.js +0 -5
  22. package/bin/executor/composer/system/default/SystemPromptAssets.js.map +1 -1
  23. package/bin/executor/core-engine/CoreEngineContextCompaction.d.ts +3 -9
  24. package/bin/executor/core-engine/CoreEngineContextCompaction.d.ts.map +1 -1
  25. package/bin/executor/core-engine/CoreEngineContextCompaction.js +4 -130
  26. package/bin/executor/core-engine/CoreEngineContextCompaction.js.map +1 -1
  27. package/bin/executor/core-engine/CoreEngineRunner.d.ts +3 -30
  28. package/bin/executor/core-engine/CoreEngineRunner.d.ts.map +1 -1
  29. package/bin/executor/core-engine/CoreEngineRunner.js +38 -194
  30. package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -1
  31. package/bin/executor/core-engine/CoreEngineSignals.d.ts +6 -6
  32. package/bin/executor/core-engine/CoreEngineSignals.d.ts.map +1 -1
  33. package/bin/executor/core-engine/CoreEngineSignals.js +1 -1
  34. package/bin/executor/core-engine/CoreEngineSignals.js.map +1 -1
  35. package/bin/executor/messages/SessionAttachmentMapper.d.ts +2 -2
  36. package/bin/executor/messages/SessionAttachmentMapper.d.ts.map +1 -1
  37. package/bin/executor/messages/SessionAttachmentMapper.js.map +1 -1
  38. package/bin/executor/messages/SessionMessageLog.d.ts +3 -3
  39. package/bin/executor/messages/SessionMessageLog.d.ts.map +1 -1
  40. package/bin/executor/messages/SessionMessageLog.js.map +1 -1
  41. package/bin/executor/messages/SessionModelMessages.d.ts +0 -3
  42. package/bin/executor/messages/SessionModelMessages.d.ts.map +1 -1
  43. package/bin/executor/messages/SessionModelMessages.js +80 -97
  44. package/bin/executor/messages/SessionModelMessages.js.map +1 -1
  45. package/bin/executor/model/ModelStepRunner.d.ts +2 -6
  46. package/bin/executor/model/ModelStepRunner.d.ts.map +1 -1
  47. package/bin/executor/model/ModelStepRunner.js +0 -28
  48. package/bin/executor/model/ModelStepRunner.js.map +1 -1
  49. package/bin/executor/services/ExecutorRecoveryPolicy.d.ts +7 -64
  50. package/bin/executor/services/ExecutorRecoveryPolicy.d.ts.map +1 -1
  51. package/bin/executor/services/ExecutorRecoveryPolicy.js +29 -45
  52. package/bin/executor/services/ExecutorRecoveryPolicy.js.map +1 -1
  53. package/bin/executor/types/SessionHistoryMeta.d.ts +1 -3
  54. package/bin/executor/types/SessionHistoryMeta.d.ts.map +1 -1
  55. package/bin/executor/types/SessionHistoryMeta.js +1 -1
  56. package/bin/index.d.ts +9 -13
  57. package/bin/index.d.ts.map +1 -1
  58. package/bin/index.js +2 -4
  59. package/bin/index.js.map +1 -1
  60. package/bin/session/DefaultSessionComposer.d.ts +13 -7
  61. package/bin/session/DefaultSessionComposer.d.ts.map +1 -1
  62. package/bin/session/DefaultSessionComposer.js +26 -21
  63. package/bin/session/DefaultSessionComposer.js.map +1 -1
  64. package/bin/session/Session.d.ts +12 -19
  65. package/bin/session/Session.d.ts.map +1 -1
  66. package/bin/session/Session.js +70 -202
  67. package/bin/session/Session.js.map +1 -1
  68. package/bin/session/SessionComposition.d.ts +0 -2
  69. package/bin/session/SessionComposition.d.ts.map +1 -1
  70. package/bin/session/SessionComposition.js +30 -54
  71. package/bin/session/SessionComposition.js.map +1 -1
  72. package/bin/session/SessionLoop.d.ts +17 -16
  73. package/bin/session/SessionLoop.d.ts.map +1 -1
  74. package/bin/session/SessionLoop.js +217 -320
  75. package/bin/session/SessionLoop.js.map +1 -1
  76. package/bin/session/SessionMessages.d.ts +52 -44
  77. package/bin/session/SessionMessages.d.ts.map +1 -1
  78. package/bin/session/SessionMessages.js +285 -187
  79. package/bin/session/SessionMessages.js.map +1 -1
  80. package/bin/session/SessionQueue.d.ts +1 -1
  81. package/bin/session/SessionQueue.d.ts.map +1 -1
  82. package/bin/session/SessionQueue.js +2 -1
  83. package/bin/session/SessionQueue.js.map +1 -1
  84. package/bin/session/SessionState.d.ts +3 -7
  85. package/bin/session/SessionState.d.ts.map +1 -1
  86. package/bin/session/SessionState.js +50 -89
  87. package/bin/session/SessionState.js.map +1 -1
  88. package/bin/session/SessionSystem.d.ts +5 -1
  89. package/bin/session/SessionSystem.d.ts.map +1 -1
  90. package/bin/session/SessionSystem.js +40 -0
  91. package/bin/session/SessionSystem.js.map +1 -1
  92. package/bin/session/SessionTitle.d.ts +3 -3
  93. package/bin/session/SessionTitle.d.ts.map +1 -1
  94. package/bin/session/SessionTitle.js +2 -2
  95. package/bin/session/browse/Browse.d.ts +32 -46
  96. package/bin/session/browse/Browse.d.ts.map +1 -1
  97. package/bin/session/browse/Browse.js +104 -360
  98. package/bin/session/browse/Browse.js.map +1 -1
  99. package/bin/session/browse/SessionMessageTimeline.d.ts.map +1 -1
  100. package/bin/session/browse/SessionMessageTimeline.js +61 -37
  101. package/bin/session/browse/SessionMessageTimeline.js.map +1 -1
  102. package/bin/session/composer/policies/AdaptivePartContextPolicy.d.ts +35 -0
  103. package/bin/session/composer/policies/AdaptivePartContextPolicy.d.ts.map +1 -0
  104. package/bin/session/composer/policies/AdaptivePartContextPolicy.js +256 -0
  105. package/bin/session/composer/policies/AdaptivePartContextPolicy.js.map +1 -0
  106. package/bin/session/composer/policies/FullHistoryContextPolicy.d.ts +24 -0
  107. package/bin/session/composer/policies/FullHistoryContextPolicy.d.ts.map +1 -0
  108. package/bin/session/composer/policies/FullHistoryContextPolicy.js +31 -0
  109. package/bin/session/composer/policies/FullHistoryContextPolicy.js.map +1 -0
  110. package/bin/session/composer/policies/SessionSummaryPrompts.d.ts +16 -0
  111. package/bin/session/composer/policies/SessionSummaryPrompts.d.ts.map +1 -0
  112. package/bin/session/composer/policies/SessionSummaryPrompts.js +32 -0
  113. package/bin/session/composer/policies/SessionSummaryPrompts.js.map +1 -0
  114. package/bin/session/execution/SessionAssistantOutputAdapter.d.ts +15 -4
  115. package/bin/session/execution/SessionAssistantOutputAdapter.d.ts.map +1 -1
  116. package/bin/session/execution/SessionAssistantOutputAdapter.js +7 -3
  117. package/bin/session/execution/SessionAssistantOutputAdapter.js.map +1 -1
  118. package/bin/session/messages/{SessionActionMessageWriter.d.ts → SessionAgentActionPartWriter.d.ts} +7 -7
  119. package/bin/session/messages/SessionAgentActionPartWriter.d.ts.map +1 -0
  120. package/bin/session/messages/{SessionActionMessageWriter.js → SessionAgentActionPartWriter.js} +7 -7
  121. package/bin/session/messages/SessionAgentActionPartWriter.js.map +1 -0
  122. package/bin/session/messages/SessionAgentContent.d.ts +10 -0
  123. package/bin/session/messages/SessionAgentContent.d.ts.map +1 -0
  124. package/bin/session/messages/SessionAgentContent.js +44 -0
  125. package/bin/session/messages/SessionAgentContent.js.map +1 -0
  126. package/bin/session/messages/SessionAgentMessageState.d.ts +50 -0
  127. package/bin/session/messages/SessionAgentMessageState.d.ts.map +1 -0
  128. package/bin/session/messages/SessionAgentMessageState.js +283 -0
  129. package/bin/session/messages/SessionAgentMessageState.js.map +1 -0
  130. package/bin/session/messages/{SessionAssistantMessageWriter.d.ts → SessionAgentMessageWriter.d.ts} +22 -8
  131. package/bin/session/messages/SessionAgentMessageWriter.d.ts.map +1 -0
  132. package/bin/session/messages/{SessionAssistantMessageWriter.js → SessionAgentMessageWriter.js} +54 -42
  133. package/bin/session/messages/SessionAgentMessageWriter.js.map +1 -0
  134. package/bin/session/messages/SessionForkMessageFiles.d.ts +11 -0
  135. package/bin/session/messages/SessionForkMessageFiles.d.ts.map +1 -1
  136. package/bin/session/messages/SessionForkMessageFiles.js +8 -2
  137. package/bin/session/messages/SessionForkMessageFiles.js.map +1 -1
  138. package/bin/session/messages/SessionMessageInteractionWriter.d.ts +6 -6
  139. package/bin/session/messages/SessionMessageInteractionWriter.d.ts.map +1 -1
  140. package/bin/session/messages/SessionMessageInteractionWriter.js +4 -4
  141. package/bin/session/messages/SessionMessageInteractionWriter.js.map +1 -1
  142. package/bin/session/messages/SessionMessageText.d.ts +3 -3
  143. package/bin/session/messages/SessionMessageText.d.ts.map +1 -1
  144. package/bin/session/messages/SessionMessageText.js +0 -2
  145. package/bin/session/messages/SessionMessageText.js.map +1 -1
  146. package/bin/session/messages/SessionTurnFileDiffData.d.ts +3 -3
  147. package/bin/session/messages/SessionTurnFileDiffData.d.ts.map +1 -1
  148. package/bin/session/messages/SessionTurnFileDiffData.js.map +1 -1
  149. package/bin/session/messages/SessionUserMessage.d.ts +3 -3
  150. package/bin/session/messages/SessionUserMessage.d.ts.map +1 -1
  151. package/bin/session/messages/SessionUserMessage.js +6 -3
  152. package/bin/session/messages/SessionUserMessage.js.map +1 -1
  153. package/bin/session/preview/SessionMessagePreview.d.ts.map +1 -1
  154. package/bin/session/preview/SessionMessagePreview.js +25 -9
  155. package/bin/session/preview/SessionMessagePreview.js.map +1 -1
  156. package/bin/session/runtime/SessionTurnCompletion.d.ts +15 -0
  157. package/bin/session/runtime/SessionTurnCompletion.d.ts.map +1 -0
  158. package/bin/session/runtime/SessionTurnCompletion.js +126 -0
  159. package/bin/session/runtime/SessionTurnCompletion.js.map +1 -0
  160. package/bin/session/runtime/SessionTurnContext.d.ts.map +1 -1
  161. package/bin/session/runtime/SessionTurnContext.js +14 -19
  162. package/bin/session/runtime/SessionTurnContext.js.map +1 -1
  163. package/bin/session/runtime/SessionTurnFileDiff.d.ts +12 -0
  164. package/bin/session/runtime/SessionTurnFileDiff.d.ts.map +1 -0
  165. package/bin/session/runtime/SessionTurnFileDiff.js +71 -0
  166. package/bin/session/runtime/SessionTurnFileDiff.js.map +1 -0
  167. package/bin/session/storage/LocalSessionDataStore.d.ts +6 -41
  168. package/bin/session/storage/LocalSessionDataStore.d.ts.map +1 -1
  169. package/bin/session/storage/LocalSessionDataStore.js +19 -101
  170. package/bin/session/storage/LocalSessionDataStore.js.map +1 -1
  171. package/bin/session/storage/LocalSessionStore.d.ts +13 -5
  172. package/bin/session/storage/LocalSessionStore.d.ts.map +1 -1
  173. package/bin/session/storage/LocalSessionStore.js +153 -30
  174. package/bin/session/storage/LocalSessionStore.js.map +1 -1
  175. package/bin/session/storage/LocalStorePaths.d.ts +4 -16
  176. package/bin/session/storage/LocalStorePaths.d.ts.map +1 -1
  177. package/bin/session/storage/LocalStorePaths.js +7 -31
  178. package/bin/session/storage/LocalStorePaths.js.map +1 -1
  179. package/bin/session/storage/Metadata.d.ts +4 -4
  180. package/bin/session/storage/Metadata.d.ts.map +1 -1
  181. package/bin/session/storage/Metadata.js +3 -11
  182. package/bin/session/storage/Metadata.js.map +1 -1
  183. package/bin/session/storage/RuntimeSessionPort.d.ts +4 -4
  184. package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
  185. package/bin/session/storage/RuntimeSessionPort.js +3 -3
  186. package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
  187. package/bin/session/storage/SessionStorageCodec.d.ts +59 -0
  188. package/bin/session/storage/SessionStorageCodec.d.ts.map +1 -0
  189. package/bin/session/storage/SessionStorageCodec.js +331 -0
  190. package/bin/session/storage/SessionStorageCodec.js.map +1 -0
  191. package/bin/session/storage/SessionStorageSchema.d.ts +11 -0
  192. package/bin/session/storage/SessionStorageSchema.d.ts.map +1 -0
  193. package/bin/session/storage/SessionStorageSchema.js +131 -0
  194. package/bin/session/storage/SessionStorageSchema.js.map +1 -0
  195. package/bin/session/storage/SqliteSessionStorage.d.ts +120 -0
  196. package/bin/session/storage/SqliteSessionStorage.d.ts.map +1 -0
  197. package/bin/session/storage/SqliteSessionStorage.js +581 -0
  198. package/bin/session/storage/SqliteSessionStorage.js.map +1 -0
  199. package/bin/tools/ask/AskQuestionsTool.d.ts.map +1 -1
  200. package/bin/tools/ask/AskQuestionsTool.js +3 -1
  201. package/bin/tools/ask/AskQuestionsTool.js.map +1 -1
  202. package/bin/types/action/ActionResult.d.ts +9 -9
  203. package/bin/types/action/ActionResult.d.ts.map +1 -1
  204. package/bin/types/action/ActionResult.js +1 -1
  205. package/bin/types/agent/AgentOptions.d.ts +10 -0
  206. package/bin/types/agent/AgentOptions.d.ts.map +1 -1
  207. package/bin/types/agent/AgentStorage.d.ts +3 -1
  208. package/bin/types/agent/AgentStorage.d.ts.map +1 -1
  209. package/bin/types/agent/SessionActor.d.ts +0 -9
  210. package/bin/types/agent/SessionActor.d.ts.map +1 -1
  211. package/bin/types/agent/SessionTypes.d.ts +5 -5
  212. package/bin/types/agent/SessionTypes.d.ts.map +1 -1
  213. package/bin/types/executor/SessionAssistantOutput.d.ts +15 -4
  214. package/bin/types/executor/SessionAssistantOutput.d.ts.map +1 -1
  215. package/bin/types/executor/SessionTurnContext.d.ts +17 -19
  216. package/bin/types/executor/SessionTurnContext.d.ts.map +1 -1
  217. package/bin/types/sdk/AgentSessionAction.d.ts +1 -1
  218. package/bin/types/sdk/AgentSessionAction.js +1 -1
  219. package/bin/types/sdk/AgentSessionPrompt.d.ts +14 -5
  220. package/bin/types/sdk/AgentSessionPrompt.d.ts.map +1 -1
  221. package/bin/types/sdk/AgentSessionPrompt.js +1 -1
  222. package/bin/types/sdk/AgentSessionPrompt.js.map +1 -1
  223. package/bin/types/session/AdaptivePartContextPolicy.d.ts +31 -0
  224. package/bin/types/session/AdaptivePartContextPolicy.d.ts.map +1 -0
  225. package/bin/types/session/AdaptivePartContextPolicy.js +7 -0
  226. package/bin/types/session/AdaptivePartContextPolicy.js.map +1 -0
  227. package/bin/types/session/{SessionAssistantMessageState.d.ts → SessionAgentMessageState.d.ts} +7 -7
  228. package/bin/types/session/SessionAgentMessageState.d.ts.map +1 -0
  229. package/bin/types/session/{SessionAssistantMessageState.js → SessionAgentMessageState.js} +1 -1
  230. package/bin/types/session/SessionAgentMessageState.js.map +1 -0
  231. package/bin/types/session/SessionCommand.d.ts +19 -7
  232. package/bin/types/session/SessionCommand.d.ts.map +1 -1
  233. package/bin/types/session/SessionComposer.d.ts +43 -43
  234. package/bin/types/session/SessionComposer.d.ts.map +1 -1
  235. package/bin/types/session/SessionComposer.js +2 -2
  236. package/bin/types/session/SessionComposition.d.ts +2 -5
  237. package/bin/types/session/SessionComposition.d.ts.map +1 -1
  238. package/bin/types/session/SessionContextPolicy.d.ts +70 -0
  239. package/bin/types/session/SessionContextPolicy.d.ts.map +1 -0
  240. package/bin/types/session/SessionContextPolicy.js +8 -0
  241. package/bin/types/session/SessionContextPolicy.js.map +1 -0
  242. package/bin/types/session/SessionExecution.d.ts +5 -32
  243. package/bin/types/session/SessionExecution.d.ts.map +1 -1
  244. package/bin/types/session/SessionLoop.d.ts +3 -5
  245. package/bin/types/session/SessionLoop.d.ts.map +1 -1
  246. package/bin/types/session/SessionMessages.d.ts +18 -28
  247. package/bin/types/session/SessionMessages.d.ts.map +1 -1
  248. package/bin/types/session/SessionOptions.d.ts +5 -5
  249. package/bin/types/session/SessionOptions.d.ts.map +1 -1
  250. package/bin/types/session/SessionPort.d.ts +8 -9
  251. package/bin/types/session/SessionPort.d.ts.map +1 -1
  252. package/bin/types/session/SessionState.d.ts +2 -5
  253. package/bin/types/session/SessionState.d.ts.map +1 -1
  254. package/bin/types/session/SessionSystem.d.ts +14 -0
  255. package/bin/types/session/SessionSystem.d.ts.map +1 -1
  256. package/bin/types/session/SessionTool.d.ts +2 -2
  257. package/bin/types/session/SessionTool.d.ts.map +1 -1
  258. package/bin/types/session/SessionTurnCompletion.d.ts +23 -0
  259. package/bin/types/session/SessionTurnCompletion.d.ts.map +1 -0
  260. package/bin/types/session/SessionTurnCompletion.js +8 -0
  261. package/bin/types/session/SessionTurnCompletion.js.map +1 -0
  262. package/bin/types/session/SessionTurnFileDiff.d.ts +42 -0
  263. package/bin/types/session/SessionTurnFileDiff.d.ts.map +1 -0
  264. package/bin/types/session/SessionTurnFileDiff.js +8 -0
  265. package/bin/types/session/SessionTurnFileDiff.js.map +1 -0
  266. package/bin/types/store/LocalStore.d.ts +6 -13
  267. package/bin/types/store/LocalStore.d.ts.map +1 -1
  268. package/bin/types/store/LocalStore.js +1 -1
  269. package/bin/types/store/SessionStorage.d.ts +103 -0
  270. package/bin/types/store/SessionStorage.d.ts.map +1 -0
  271. package/bin/types/store/SessionStorage.js +8 -0
  272. package/bin/types/store/SessionStorage.js.map +1 -0
  273. package/bin/types/store/SessionStore.d.ts +5 -3
  274. package/bin/types/store/SessionStore.d.ts.map +1 -1
  275. package/package.json +2 -2
  276. package/scripts/core-engine-context-compaction.test.mjs +96 -219
  277. package/scripts/core-engine-model-stream.test.mjs +2 -4
  278. package/scripts/executor-failure-result.test.mjs +14 -17
  279. package/scripts/session-agent-message-part-order.test.mjs +63 -0
  280. package/scripts/session-initialization.test.mjs +141 -0
  281. package/scripts/session-message-timeline.test.mjs +5 -6
  282. package/scripts/session-messages-error-part.test.mjs +175 -0
  283. package/scripts/session-messages-error.test.mjs +47 -6
  284. package/scripts/session-prompt-idempotency.test.mjs +91 -0
  285. package/scripts/session-queue.test.mjs +13 -12
  286. package/scripts/session-storage-sqlite.test.mjs +209 -0
  287. package/scripts/session-turn-context.test.mjs +21 -33
  288. package/src/agent/Agent.ts +48 -12
  289. package/src/agent/AgentInstructions.ts +2 -2
  290. package/src/agent/AgentMemoryStorage.ts +1 -0
  291. package/src/agent/AgentSessions.ts +31 -12
  292. package/src/executor/Executor.ts +47 -184
  293. package/src/executor/README.md +12 -13
  294. package/src/executor/composer/system/default/SystemPromptAssets.ts +0 -6
  295. package/src/executor/core-engine/CoreEngineContextCompaction.ts +3 -135
  296. package/src/executor/core-engine/CoreEngineRunner.ts +51 -273
  297. package/src/executor/core-engine/CoreEngineSignals.ts +9 -9
  298. package/src/executor/messages/SessionAttachmentMapper.ts +4 -4
  299. package/src/executor/messages/SessionMessageLog.ts +3 -3
  300. package/src/executor/messages/SessionModelMessages.ts +85 -103
  301. package/src/executor/model/ModelStepRunner.ts +9 -41
  302. package/src/executor/services/ExecutorRecoveryPolicy.ts +34 -127
  303. package/src/executor/types/SessionHistoryMeta.ts +1 -3
  304. package/src/index.ts +39 -47
  305. package/src/session/DefaultSessionComposer.ts +33 -30
  306. package/src/session/Session.ts +96 -227
  307. package/src/session/SessionComposition.ts +28 -65
  308. package/src/session/SessionLoop.ts +267 -370
  309. package/src/session/SessionMessages.ts +363 -242
  310. package/src/session/SessionQueue.ts +3 -2
  311. package/src/session/SessionState.ts +55 -101
  312. package/src/session/SessionSystem.ts +51 -1
  313. package/src/session/SessionTitle.ts +4 -4
  314. package/src/session/browse/Browse.ts +182 -468
  315. package/src/session/browse/SessionMessageTimeline.ts +63 -38
  316. package/src/session/composer/policies/AdaptivePartContextPolicy.ts +307 -0
  317. package/src/session/composer/policies/FullHistoryContextPolicy.ts +36 -0
  318. package/src/session/composer/policies/SessionSummaryPrompts.ts +42 -0
  319. package/src/session/execution/SessionAssistantOutputAdapter.ts +25 -11
  320. package/src/session/messages/{SessionActionMessageWriter.ts → SessionAgentActionPartWriter.ts} +8 -8
  321. package/src/session/messages/SessionAgentContent.ts +56 -0
  322. package/src/session/messages/SessionAgentMessageState.ts +378 -0
  323. package/src/session/messages/{SessionAssistantMessageWriter.ts → SessionAgentMessageWriter.ts} +89 -60
  324. package/src/session/messages/SessionForkMessageFiles.ts +25 -1
  325. package/src/session/messages/SessionMessageInteractionWriter.ts +19 -19
  326. package/src/session/messages/SessionMessageText.ts +3 -4
  327. package/src/session/messages/SessionTurnFileDiffData.ts +3 -3
  328. package/src/session/messages/SessionUserMessage.ts +10 -7
  329. package/src/session/preview/SessionMessagePreview.ts +26 -9
  330. package/src/session/runtime/SessionTurnCompletion.ts +159 -0
  331. package/src/session/runtime/SessionTurnContext.ts +20 -21
  332. package/src/session/runtime/SessionTurnFileDiff.ts +105 -0
  333. package/src/session/storage/LocalSessionDataStore.ts +27 -176
  334. package/src/session/storage/LocalSessionStore.ts +170 -38
  335. package/src/session/storage/LocalStorePaths.ts +14 -86
  336. package/src/session/storage/Metadata.ts +4 -13
  337. package/src/session/storage/RuntimeSessionPort.ts +7 -7
  338. package/src/session/storage/SessionStorageCodec.ts +465 -0
  339. package/src/session/storage/SessionStorageSchema.ts +132 -0
  340. package/src/session/storage/SqliteSessionStorage.ts +776 -0
  341. package/src/tools/ask/AskQuestionsTool.ts +3 -1
  342. package/src/types/action/ActionResult.ts +10 -10
  343. package/src/types/agent/AgentOptions.ts +11 -0
  344. package/src/types/agent/AgentStorage.ts +3 -1
  345. package/src/types/agent/SessionActor.ts +0 -10
  346. package/src/types/agent/SessionTypes.ts +5 -5
  347. package/src/types/executor/SessionAssistantOutput.ts +15 -4
  348. package/src/types/executor/SessionTurnContext.ts +25 -22
  349. package/src/types/sdk/AgentSessionAction.ts +1 -1
  350. package/src/types/sdk/AgentSessionPrompt.ts +15 -5
  351. package/src/types/session/AdaptivePartContextPolicy.ts +37 -0
  352. package/src/types/session/{SessionAssistantMessageState.ts → SessionAgentMessageState.ts} +6 -6
  353. package/src/types/session/SessionCommand.ts +21 -7
  354. package/src/types/session/SessionComposer.ts +48 -48
  355. package/src/types/session/SessionComposition.ts +2 -5
  356. package/src/types/session/SessionContextPolicy.ts +77 -0
  357. package/src/types/session/SessionExecution.ts +11 -36
  358. package/src/types/session/SessionLoop.ts +3 -8
  359. package/src/types/session/SessionMessages.ts +19 -29
  360. package/src/types/session/SessionOptions.ts +5 -5
  361. package/src/types/session/SessionPort.ts +10 -10
  362. package/src/types/session/SessionState.ts +2 -5
  363. package/src/types/session/SessionSystem.ts +19 -0
  364. package/src/types/session/SessionTool.ts +2 -2
  365. package/src/types/session/SessionTurnCompletion.ts +24 -0
  366. package/src/types/session/SessionTurnFileDiff.ts +44 -0
  367. package/src/types/store/LocalStore.ts +6 -14
  368. package/src/types/store/SessionStorage.ts +121 -0
  369. package/src/types/store/SessionStore.ts +6 -3
  370. package/tsconfig.tsbuildinfo +1 -1
  371. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.d.ts +0 -45
  372. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.d.ts.map +0 -1
  373. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.js +0 -144
  374. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.js.map +0 -1
  375. package/bin/executor/composer/system/SessionSystemComposer.d.ts +0 -23
  376. package/bin/executor/composer/system/SessionSystemComposer.d.ts.map +0 -1
  377. package/bin/executor/composer/system/SessionSystemComposer.js +0 -9
  378. package/bin/executor/composer/system/SessionSystemComposer.js.map +0 -1
  379. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts +0 -43
  380. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts.map +0 -1
  381. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.js +0 -42
  382. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.js.map +0 -1
  383. package/bin/executor/composer/system/default/PromptRenderer.d.ts +0 -35
  384. package/bin/executor/composer/system/default/PromptRenderer.d.ts.map +0 -1
  385. package/bin/executor/composer/system/default/PromptRenderer.js +0 -23
  386. package/bin/executor/composer/system/default/PromptRenderer.js.map +0 -1
  387. package/bin/executor/composer/system/default/SystemDomain.d.ts +0 -151
  388. package/bin/executor/composer/system/default/SystemDomain.d.ts.map +0 -1
  389. package/bin/executor/composer/system/default/SystemDomain.js +0 -162
  390. package/bin/executor/composer/system/default/SystemDomain.js.map +0 -1
  391. package/bin/executor/composer/system/default/assets/task.prompt.d.ts +0 -7
  392. package/bin/executor/composer/system/default/assets/task.prompt.d.ts.map +0 -1
  393. package/bin/executor/composer/system/default/assets/task.prompt.js +0 -8
  394. package/bin/executor/composer/system/default/assets/task.prompt.js.map +0 -1
  395. package/bin/executor/composer/system/default/variables/GeoContext.d.ts +0 -14
  396. package/bin/executor/composer/system/default/variables/GeoContext.d.ts.map +0 -1
  397. package/bin/executor/composer/system/default/variables/GeoContext.js +0 -150
  398. package/bin/executor/composer/system/default/variables/GeoContext.js.map +0 -1
  399. package/bin/executor/composer/system/default/variables/PromptTypes.d.ts +0 -36
  400. package/bin/executor/composer/system/default/variables/PromptTypes.d.ts.map +0 -1
  401. package/bin/executor/composer/system/default/variables/PromptTypes.js +0 -9
  402. package/bin/executor/composer/system/default/variables/PromptTypes.js.map +0 -1
  403. package/bin/executor/composer/system/default/variables/VariableReplacer.d.ts +0 -61
  404. package/bin/executor/composer/system/default/variables/VariableReplacer.d.ts.map +0 -1
  405. package/bin/executor/composer/system/default/variables/VariableReplacer.js +0 -93
  406. package/bin/executor/composer/system/default/variables/VariableReplacer.js.map +0 -1
  407. package/bin/executor/core-engine/CoreEngineMessageState.d.ts +0 -63
  408. package/bin/executor/core-engine/CoreEngineMessageState.d.ts.map +0 -1
  409. package/bin/executor/core-engine/CoreEngineMessageState.js +0 -81
  410. package/bin/executor/core-engine/CoreEngineMessageState.js.map +0 -1
  411. package/bin/session/SessionCommand.d.ts +0 -24
  412. package/bin/session/SessionCommand.d.ts.map +0 -1
  413. package/bin/session/SessionCommand.js +0 -35
  414. package/bin/session/SessionCommand.js.map +0 -1
  415. package/bin/session/messages/SessionActionMessageWriter.d.ts.map +0 -1
  416. package/bin/session/messages/SessionActionMessageWriter.js.map +0 -1
  417. package/bin/session/messages/SessionAssistantMessageState.d.ts +0 -49
  418. package/bin/session/messages/SessionAssistantMessageState.d.ts.map +0 -1
  419. package/bin/session/messages/SessionAssistantMessageState.js +0 -296
  420. package/bin/session/messages/SessionAssistantMessageState.js.map +0 -1
  421. package/bin/session/messages/SessionAssistantMessageWriter.d.ts.map +0 -1
  422. package/bin/session/messages/SessionAssistantMessageWriter.js.map +0 -1
  423. package/bin/session/messages/SessionMessageCompaction.d.ts +0 -29
  424. package/bin/session/messages/SessionMessageCompaction.d.ts.map +0 -1
  425. package/bin/session/messages/SessionMessageCompaction.js +0 -128
  426. package/bin/session/messages/SessionMessageCompaction.js.map +0 -1
  427. package/bin/session/runtime/SessionCompactOperation.d.ts +0 -29
  428. package/bin/session/runtime/SessionCompactOperation.d.ts.map +0 -1
  429. package/bin/session/runtime/SessionCompactOperation.js +0 -66
  430. package/bin/session/runtime/SessionCompactOperation.js.map +0 -1
  431. package/bin/session/runtime/SessionHistoryCompaction.d.ts +0 -22
  432. package/bin/session/runtime/SessionHistoryCompaction.d.ts.map +0 -1
  433. package/bin/session/runtime/SessionHistoryCompaction.js +0 -31
  434. package/bin/session/runtime/SessionHistoryCompaction.js.map +0 -1
  435. package/bin/session/storage/JsonlSessionMessageStore.d.ts +0 -77
  436. package/bin/session/storage/JsonlSessionMessageStore.d.ts.map +0 -1
  437. package/bin/session/storage/JsonlSessionMessageStore.js +0 -419
  438. package/bin/session/storage/JsonlSessionMessageStore.js.map +0 -1
  439. package/bin/session/storage/SessionMessageStoreFactory.d.ts +0 -12
  440. package/bin/session/storage/SessionMessageStoreFactory.d.ts.map +0 -1
  441. package/bin/session/storage/SessionMessageStoreFactory.js +0 -13
  442. package/bin/session/storage/SessionMessageStoreFactory.js.map +0 -1
  443. package/bin/types/common/Template.d.ts +0 -9
  444. package/bin/types/common/Template.d.ts.map +0 -1
  445. package/bin/types/common/Template.js +0 -9
  446. package/bin/types/common/Template.js.map +0 -1
  447. package/bin/types/sdk/AgentSessionCompact.d.ts +0 -30
  448. package/bin/types/sdk/AgentSessionCompact.d.ts.map +0 -1
  449. package/bin/types/sdk/AgentSessionCompact.js +0 -8
  450. package/bin/types/sdk/AgentSessionCompact.js.map +0 -1
  451. package/bin/types/session/SessionAssistantMessageState.d.ts.map +0 -1
  452. package/bin/types/session/SessionAssistantMessageState.js.map +0 -1
  453. package/bin/types/session/SessionSegment.d.ts +0 -57
  454. package/bin/types/session/SessionSegment.d.ts.map +0 -1
  455. package/bin/types/session/SessionSegment.js +0 -8
  456. package/bin/types/session/SessionSegment.js.map +0 -1
  457. package/bin/types/store/SessionDataStore.d.ts +0 -88
  458. package/bin/types/store/SessionDataStore.d.ts.map +0 -1
  459. package/bin/types/store/SessionDataStore.js +0 -9
  460. package/bin/types/store/SessionDataStore.js.map +0 -1
  461. package/bin/utils/Template.d.ts +0 -17
  462. package/bin/utils/Template.d.ts.map +0 -1
  463. package/bin/utils/Template.js +0 -24
  464. package/bin/utils/Template.js.map +0 -1
  465. package/scripts/session-compaction-prompts.test.mjs +0 -49
  466. package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.ts +0 -162
  467. package/src/executor/composer/system/SessionSystemComposer.ts +0 -25
  468. package/src/executor/composer/system/default/DefaultSessionSystemComposer.ts +0 -76
  469. package/src/executor/composer/system/default/PromptRenderer.ts +0 -52
  470. package/src/executor/composer/system/default/SystemDomain.ts +0 -301
  471. package/src/executor/composer/system/default/assets/task.prompt.ts +0 -9
  472. package/src/executor/composer/system/default/assets/task.prompt.ts.txt +0 -33
  473. package/src/executor/composer/system/default/variables/GeoContext.ts +0 -180
  474. package/src/executor/composer/system/default/variables/PromptTypes.ts +0 -37
  475. package/src/executor/composer/system/default/variables/VariableReplacer.ts +0 -154
  476. package/src/executor/core-engine/CoreEngineMessageState.ts +0 -117
  477. package/src/session/SessionCommand.ts +0 -42
  478. package/src/session/messages/SessionAssistantMessageState.ts +0 -392
  479. package/src/session/messages/SessionMessageCompaction.ts +0 -160
  480. package/src/session/runtime/SessionCompactOperation.ts +0 -93
  481. package/src/session/runtime/SessionHistoryCompaction.ts +0 -45
  482. package/src/session/storage/JsonlSessionMessageStore.ts +0 -513
  483. package/src/session/storage/SessionMessageStoreFactory.ts +0 -18
  484. package/src/types/common/Template.ts +0 -9
  485. package/src/types/sdk/AgentSessionCompact.ts +0 -32
  486. package/src/types/session/SessionSegment.ts +0 -62
  487. package/src/types/store/SessionDataStore.ts +0 -113
  488. package/src/utils/Template.ts +0 -28
@@ -13,35 +13,15 @@ import type {
13
13
  ModelJsonValue,
14
14
  ModelMessage,
15
15
  } from "@downcity/type";
16
- import { parse_chat_message_markup } from "@executor/messages/ChatMessageMarkup.js";
17
16
  import { render_session_user_context } from "@/session/messages/SessionUserContext.js";
18
17
  import type {
19
- SessionAssistantMessage,
20
- SessionAssistantToolPart,
18
+ SessionAgentMessage,
19
+ SessionAgentToolPart,
21
20
  SessionMessage,
22
21
  SessionUserFilePart,
23
22
  SessionUserMessage,
23
+ SessionUserMessagePart,
24
24
  } from "@downcity/type";
25
- import type { SessionContextSnapshot } from "@/types/session/SessionSegment.js";
26
-
27
- /** 把完整 Session 上下文快照转换为模型消息。 */
28
- export async function session_context_to_model_messages(
29
- snapshot: Readonly<SessionContextSnapshot>,
30
- project_root?: string,
31
- ): Promise<ModelMessage[]> {
32
- const messages = await session_messages_to_model_messages(
33
- snapshot.messages,
34
- project_root,
35
- );
36
- if (!snapshot.summary?.text.trim()) return messages;
37
- return [
38
- {
39
- role: "assistant",
40
- content: [{ type: "text", text: snapshot.summary.text }],
41
- },
42
- ...messages,
43
- ];
44
- }
45
25
 
46
26
  /** 把一组 canonical Session Message 转换为模型消息。 */
47
27
  export async function session_messages_to_model_messages(
@@ -50,9 +30,9 @@ export async function session_messages_to_model_messages(
50
30
  ): Promise<ModelMessage[]> {
51
31
  const output: ModelMessage[] = [];
52
32
  for (const message of messages) {
53
- if (message.type === "user") {
33
+ if (message.role === "user") {
54
34
  output.push(...await convert_user_message(message, project_root));
55
- } else if (message.type === "assistant") {
35
+ } else if (message.role === "agent") {
56
36
  output.push(...convert_assistant_message(message));
57
37
  }
58
38
  }
@@ -64,56 +44,94 @@ async function convert_user_message(
64
44
  message: SessionUserMessage,
65
45
  project_root?: string,
66
46
  ): Promise<ModelMessage[]> {
47
+ const converted = await convert_user_parts(message.parts, project_root);
48
+ return converted ? [converted] : [];
49
+ }
50
+
51
+ /** 将 canonical User Parts 投影为单条模型消息。 */
52
+ async function convert_user_parts(
53
+ parts: readonly SessionUserMessagePart[],
54
+ project_root?: string,
55
+ ): Promise<ModelMessage | null> {
67
56
  const content: ModelContent[] = [];
68
- const has_explicit_file = message.parts.some((part) => part.type === "file");
69
- for (const part of message.parts) {
70
- if (part.type === "text" && part.text.trim()) {
71
- content.push({ type: "text", text: part.text });
72
- } else if (part.type === "context") {
73
- content.push({
74
- type: "text",
75
- text: render_session_user_context(part.tag, part.context),
76
- });
77
- } else if (part.type === "file") {
78
- content.push(await convert_file_part(part, project_root));
57
+ for (const part of parts) {
58
+ switch (part.type) {
59
+ case "text":
60
+ if (part.text.trim()) content.push({ type: "text", text: part.text });
61
+ break;
62
+ case "context":
63
+ content.push({
64
+ type: "text",
65
+ text: render_session_user_context(part.tag, part.context),
66
+ });
67
+ break;
68
+ case "file":
69
+ content.push(await convert_file_part(part, project_root));
70
+ break;
71
+ case "data":
72
+ // Data Part 是持久化 UI 数据,不属于模型输入协议。
73
+ break;
74
+ default:
75
+ assert_never(part);
79
76
  }
80
77
  }
81
- if (!has_explicit_file) {
82
- content.push(...await read_markup_files(message, project_root));
83
- }
84
- return content.length > 0 ? [{ role: "user", content }] : [];
78
+ return content.length > 0 ? { role: "user", content } : null;
85
79
  }
86
80
 
87
- /** 把单条 canonical Assistant Message 转换为 assistant 与 tool 消息。 */
88
- function convert_assistant_message(message: SessionAssistantMessage): ModelMessage[] {
81
+ /** 把单条 canonical Agent Message 转换为模型 assistant 与 tool 消息。 */
82
+ function convert_assistant_message(message: SessionAgentMessage): ModelMessage[] {
83
+ const output: ModelMessage[] = [];
84
+ let current_step_id: string | null = null;
89
85
  const content: ModelContent[] = [];
90
86
  const tool_results: ModelContent[] = [];
91
- for (const part of message.parts) {
92
- if (part.type === "text" && part.text.trim()) {
93
- content.push({ type: "text", text: part.text });
94
- } else if (part.type === "reasoning" && part.text.trim()) {
95
- content.push({
96
- type: "reasoning",
97
- text: part.text,
98
- ...(part.reasoning_signature
99
- ? { signature: part.reasoning_signature }
100
- : {}),
101
- });
102
- } else if (part.type === "tool" && part.input !== undefined) {
103
- append_tool_content(part, content, tool_results);
87
+ const flush_step = (): void => {
88
+ if (content.length > 0) output.push({ role: "assistant", content: [...content] });
89
+ if (tool_results.length > 0) output.push({ role: "tool", content: [...tool_results] });
90
+ content.length = 0;
91
+ tool_results.length = 0;
92
+ };
93
+ for (const part of [...message.parts].sort((left, right) => left.sequence - right.sequence)) {
94
+ const part_step_id = part.step_id ?? "__unscoped__";
95
+ if (current_step_id !== null && part_step_id !== current_step_id) flush_step();
96
+ current_step_id = part_step_id;
97
+ switch (part.type) {
98
+ case "text":
99
+ if (part.text.trim()) content.push({ type: "text", text: part.text });
100
+ break;
101
+ case "reasoning":
102
+ if (part.text.trim()) {
103
+ content.push({
104
+ type: "reasoning",
105
+ text: part.text,
106
+ ...(part.reasoning_signature
107
+ ? { signature: part.reasoning_signature }
108
+ : {}),
109
+ });
110
+ }
111
+ break;
112
+ case "tool":
113
+ if (part.input !== undefined) {
114
+ append_tool_content(part, content, tool_results);
115
+ }
116
+ break;
117
+ case "interaction":
118
+ case "file":
119
+ case "data":
120
+ case "action":
121
+ case "error":
122
+ // 这些 Part 只属于运行状态或宿主展示,不进入模型历史。
123
+ break;
124
+ default:
125
+ assert_never(part);
104
126
  }
105
127
  }
106
- return [
107
- ...(content.length > 0 ? [{ role: "assistant", content } as ModelMessage] : []),
108
- ...(tool_results.length > 0
109
- ? [{ role: "tool", content: tool_results } as ModelMessage]
110
- : []),
111
- ];
128
+ flush_step();
129
+ return output;
112
130
  }
113
131
 
114
132
  /** 把 canonical Tool Part 投影为模型工具调用和可选工具结果。 */
115
133
  function append_tool_content(
116
- part: SessionAssistantToolPart,
134
+ part: SessionAgentToolPart,
117
135
  content: ModelContent[],
118
136
  tool_results: ModelContent[],
119
137
  ): void {
@@ -169,36 +187,6 @@ function build_model_file(
169
187
  };
170
188
  }
171
189
 
172
- /** 解析兼容聊天入口写入文本中的附件标记。 */
173
- async function read_markup_files(
174
- message: SessionUserMessage,
175
- project_root?: string,
176
- ): Promise<ModelFileContent[]> {
177
- const text = message.parts
178
- .filter((part) => part.type === "text")
179
- .map((part) => part.text)
180
- .join("\n");
181
- const output: ModelFileContent[] = [];
182
- for (const file of parse_chat_message_markup(text).files) {
183
- const media_type = guess_media_type(file.path);
184
- if (!media_type || (!media_type.startsWith("image/") && media_type !== "application/pdf")) {
185
- continue;
186
- }
187
- const file_path = resolve_local_file_path(file.path, project_root);
188
- if (!await fs.pathExists(file_path)) continue;
189
- output.push({
190
- type: "file",
191
- media_type,
192
- source: {
193
- type: "base64",
194
- data: (await fs.readFile(file_path)).toString("base64"),
195
- },
196
- filename: path.basename(file_path),
197
- });
198
- }
199
- return output;
200
- }
201
-
202
190
  /** 把本地文件引用限制在项目根目录内,绝对附件路径保持可读。 */
203
191
  function resolve_local_file_path(raw_path: string, project_root?: string): string {
204
192
  if (path.isAbsolute(raw_path)) return path.resolve(raw_path);
@@ -211,19 +199,13 @@ function resolve_local_file_path(raw_path: string, project_root?: string): strin
211
199
  return file_path;
212
200
  }
213
201
 
214
- /** 根据文件扩展名解析模型可用的 MIME type。 */
215
- function guess_media_type(file_path: string): string | undefined {
216
- const extension = path.extname(file_path).toLowerCase();
217
- if (extension === ".png") return "image/png";
218
- if (extension === ".jpg" || extension === ".jpeg") return "image/jpeg";
219
- if (extension === ".webp") return "image/webp";
220
- if (extension === ".gif") return "image/gif";
221
- if (extension === ".pdf") return "application/pdf";
222
- return undefined;
223
- }
224
-
225
202
  /** 将未知值限制为可传输 JSON。 */
226
203
  function to_model_json_value(value: unknown): ModelJsonValue {
227
204
  if (value === undefined) return null;
228
205
  return JSON.parse(JSON.stringify(value)) as ModelJsonValue;
229
206
  }
207
+
208
+ /** 联合类型增加成员时,强制模型投影显式选择支持或忽略。 */
209
+ function assert_never(value: never): never {
210
+ throw new Error(`Unsupported Session model part: ${String((value as { type?: unknown }).type)}`);
211
+ }
@@ -8,7 +8,6 @@
8
8
  import {
9
9
  type ModelCall,
10
10
  type ModelClient,
11
- type ModelContent,
12
11
  type ModelFinishReason,
13
12
  type ModelJsonValue,
14
13
  type ModelMessage,
@@ -22,8 +21,8 @@ import { z } from "zod";
22
21
  import type { SessionSystemMessage } from "@/executor/types/SessionPrompts.js";
23
22
  import type { SessionAssistantOutput } from "@/types/executor/SessionAssistantOutput.js";
24
23
  import type {
25
- SessionAssistantMessagePart,
26
- SessionAssistantToolPart,
24
+ SessionAgentMessagePart,
25
+ SessionAgentToolPart,
27
26
  } from "@downcity/type";
28
27
  import { consume_model_stream } from "@/executor/model/ModelStreamConsumer.js";
29
28
 
@@ -59,8 +58,6 @@ export interface ModelStepResult {
59
58
  tool_calls: ModelStepToolCall[];
60
59
  /** 当前 Step 的工具结果。 */
61
60
  tool_results: ModelStepToolResult[];
62
- /** 用于后续模型 Step 的消息。 */
63
- response: { messages: ModelMessage[] };
64
61
  /** 供诊断代码读取的内容事实。 */
65
62
  content: Array<Record<string, unknown>>;
66
63
  }
@@ -86,7 +83,7 @@ export interface RunModelStepInput {
86
83
  /** 执行一个 Downcity 模型 Step 并收敛工具结果。 */
87
84
  export async function run_model_step(input: RunModelStepInput): Promise<{
88
85
  /** 当前 Step 的 canonical Assistant Parts。 */
89
- assistant_parts: SessionAssistantMessagePart[];
86
+ assistant_parts: SessionAgentMessagePart[];
90
87
  /** 当前 Step 的运行结果。 */
91
88
  step_result: ModelStepResult;
92
89
  }> {
@@ -123,19 +120,6 @@ export async function run_model_step(input: RunModelStepInput): Promise<{
123
120
  collected.assistant_parts,
124
121
  tool_results,
125
122
  );
126
- const response_messages: ModelMessage[] = [collected.assistant_model_message];
127
- if (tool_results.length > 0) {
128
- response_messages.push({
129
- role: "tool",
130
- content: tool_results.map((result) => ({
131
- type: "tool_result",
132
- tool_call_id: result.tool_call_id,
133
- tool_name: result.tool_name,
134
- outcome: result.success ? "succeeded" : "failed",
135
- content: [{ type: "json", value: to_model_json_value(result.output) }],
136
- })),
137
- });
138
- }
139
123
  return {
140
124
  assistant_parts,
141
125
  step_result: {
@@ -144,7 +128,6 @@ export async function run_model_step(input: RunModelStepInput): Promise<{
144
128
  ...(collected.usage ? { usage: collected.usage } : {}),
145
129
  tool_calls: collected.tool_calls,
146
130
  tool_results,
147
- response: { messages: response_messages },
148
131
  content: collected.tool_calls.map((tool_call) => ({
149
132
  type: "tool-call",
150
133
  ...tool_call,
@@ -155,8 +138,7 @@ export async function run_model_step(input: RunModelStepInput): Promise<{
155
138
 
156
139
  /** 模型事件聚合器。 */
157
140
  class StepEventCollector {
158
- private readonly model_content: ModelContent[] = [];
159
- private readonly assistant_parts: SessionAssistantMessagePart[] = [];
141
+ private readonly assistant_parts: SessionAgentMessagePart[] = [];
160
142
  private readonly text_by_id = new Map<string, string>();
161
143
  private readonly reasoning_by_id = new Map<string, string>();
162
144
  private readonly tool_by_content_id = new Map<string, ModelStepToolCall>();
@@ -183,7 +165,6 @@ class StepEventCollector {
183
165
  this.text += event.delta;
184
166
  } else if (event.type === "text_finish") {
185
167
  const text = this.text_by_id.get(event.content_id) ?? "";
186
- this.model_content.push({ type: "text", text });
187
168
  this.assistant_parts.push({
188
169
  part_id: `text:${event.content_id}`,
189
170
  sequence: this.assistant_parts.length + 1,
@@ -200,11 +181,6 @@ class StepEventCollector {
200
181
  );
201
182
  } else if (event.type === "reasoning_finish") {
202
183
  const text = this.reasoning_by_id.get(event.content_id) ?? "";
203
- this.model_content.push({
204
- type: "reasoning",
205
- text,
206
- ...(event.signature ? { signature: event.signature } : {}),
207
- });
208
184
  this.assistant_parts.push({
209
185
  part_id: `reasoning:${event.content_id}`,
210
186
  sequence: this.assistant_parts.length + 1,
@@ -224,12 +200,6 @@ class StepEventCollector {
224
200
  if (tool) {
225
201
  tool.input = event.input;
226
202
  if (event.input_error) tool.input_error = event.input_error;
227
- this.model_content.push({
228
- type: "tool_call",
229
- tool_call_id: tool.tool_call_id,
230
- tool_name: tool.tool_name,
231
- input: tool.input,
232
- });
233
203
  this.assistant_parts.push({
234
204
  part_id: `tool:${tool.tool_call_id}`,
235
205
  sequence: this.assistant_parts.length + 1,
@@ -249,8 +219,7 @@ class StepEventCollector {
249
219
 
250
220
  /** 返回完整 Step 聚合结果。 */
251
221
  finish(): {
252
- assistant_parts: SessionAssistantMessagePart[];
253
- assistant_model_message: ModelMessage;
222
+ assistant_parts: SessionAgentMessagePart[];
254
223
  finish_reason: ModelFinishReason;
255
224
  usage?: ModelUsage;
256
225
  text: string;
@@ -259,7 +228,6 @@ class StepEventCollector {
259
228
  if (!this.finish_reason) throw new Error("Model stream ended without model_finish");
260
229
  return {
261
230
  assistant_parts: this.assistant_parts,
262
- assistant_model_message: { role: "assistant", content: this.model_content },
263
231
  finish_reason: this.finish_reason,
264
232
  ...(this.usage ? { usage: this.usage } : {}),
265
233
  text: this.text,
@@ -377,9 +345,9 @@ function to_model_json_value(value: unknown): ModelJsonValue {
377
345
 
378
346
  /** 把工具结果合并到 canonical Tool Parts。 */
379
347
  function append_tool_results(
380
- parts: SessionAssistantMessagePart[],
348
+ parts: SessionAgentMessagePart[],
381
349
  results: ModelStepToolResult[],
382
- ): SessionAssistantMessagePart[] {
350
+ ): SessionAgentMessagePart[] {
383
351
  if (results.length === 0) return parts;
384
352
  const result_by_id = new Map(results.map((result) => [result.tool_call_id, result]));
385
353
  return parts.map((part) => {
@@ -391,12 +359,12 @@ function append_tool_results(
391
359
  ...part,
392
360
  state: "completed",
393
361
  output: to_model_json_value(result.output),
394
- } satisfies SessionAssistantToolPart
362
+ } satisfies SessionAgentToolPart
395
363
  : {
396
364
  ...part,
397
365
  state: "failed",
398
366
  error: read_tool_error(result.output),
399
- } satisfies SessionAssistantToolPart;
367
+ } satisfies SessionAgentToolPart;
400
368
  });
401
369
  }
402
370
 
@@ -3,17 +3,12 @@
3
3
  *
4
4
  * 关键点(中文)
5
5
  * - 统一封装“压缩后重试”和“普通失败兜底”逻辑。
6
- * - Executor 只负责准备输入与调用策略,不再直接承载重试状态机。
6
+ * - Executor 提供单次 Turn 行为,本模块只决定是否恢复并重试。
7
7
  * - 不改变外部行为,只把异常分流规则集中到一个地方。
8
8
  */
9
9
 
10
- import type { ModelClient } from "@downcity/type";
11
10
  import type { Logger } from "@/utils/logger/Logger.js";
12
- import type { SessionTurnContext } from "@/types/executor/SessionTurnContext.js";
13
- import type {
14
- SessionStepExecutionInput,
15
- SessionTurnExecutionResult,
16
- } from "@/types/session/SessionExecution.js";
11
+ import type { SessionTurnExecutionResult } from "@/types/session/SessionExecution.js";
17
12
 
18
13
  /**
19
14
  * 可压缩错误的最大重试次数。
@@ -24,8 +19,8 @@ interface ExecutorRecoveryPolicyOptions {
24
19
  /** 当前 Session 稳定标识。 */
25
20
  session_id: string;
26
21
 
27
- /** 判断错误是否需要持久化压缩后重试。 */
28
- should_compact: (error: unknown) => boolean;
22
+ /** 请求 Composer 尝试推进上下文派生状态。 */
23
+ recover_context: (error: unknown) => Promise<boolean>;
29
24
 
30
25
  /**
31
26
  * 当前 session 统一日志器。
@@ -33,145 +28,64 @@ interface ExecutorRecoveryPolicyOptions {
33
28
  logger: Logger;
34
29
  }
35
30
 
36
- interface ExecutorPrepareExecutionInput {
37
- /**
38
- * 当前轮用户 query。
39
- */
40
- query: string;
41
-
42
- /**
43
- * 当前轮模型实例。
44
- */
45
- model: ModelClient;
46
-
47
- /**
48
- * 当前显式运行上下文。
49
- */
50
- turn_context: SessionTurnContext;
51
-
52
- /**
53
- * 当前压缩重试次数。
54
- */
55
- retry_count: number;
56
- }
57
-
58
- interface ExecutorExecutePreparedInput {
59
- /**
60
- * 已装配好的执行输入。
61
- */
62
- execute_input: SessionStepExecutionInput;
63
-
64
- /**
65
- * 当前轮模型实例。
66
- */
67
- model: ModelClient;
68
-
69
- /**
70
- * 当前显式运行上下文。
71
- */
72
- turn_context: SessionTurnContext;
73
- }
74
-
75
31
  interface ExecutorRecoveryInput {
76
- /**
77
- * 当前轮用户 query。
78
- */
79
- query: string;
80
-
81
- /**
82
- * 当前轮模型实例。
83
- */
84
- model: ModelClient;
85
-
86
- /**
87
- * 当前显式运行上下文。
88
- */
89
- turn_context: SessionTurnContext;
90
-
91
- /**
92
- * 运行前装配执行输入。
93
- */
94
- prepare_execute_input: (
95
- input: ExecutorPrepareExecutionInput,
96
- ) => Promise<SessionStepExecutionInput>;
97
-
98
- /**
99
- * 执行已装配好的运行输入。
100
- */
101
- execute_prepared_input: (
102
- input: ExecutorExecutePreparedInput,
103
- ) => Promise<SessionTurnExecutionResult>;
32
+ /** 按当前恢复次数执行完整 Turn。 */
33
+ execute_turn: (retry_count: number) => Promise<SessionTurnExecutionResult>;
104
34
  }
105
35
 
106
36
  /**
107
37
  * 执行恢复与重试策略服务。
108
38
  */
109
39
  export class ExecutorRecoveryPolicy {
110
- private readonly should_compact: ExecutorRecoveryPolicyOptions["should_compact"];
40
+ private readonly recover_context: ExecutorRecoveryPolicyOptions["recover_context"];
111
41
  private readonly logger: Logger;
112
- private retry_count = 0;
113
42
 
114
43
  constructor(options: ExecutorRecoveryPolicyOptions) {
115
44
  const session_id = String(options.session_id || "").trim();
116
- this.should_compact = options.should_compact;
45
+ this.recover_context = options.recover_context;
117
46
  this.logger = options.logger;
118
47
  if (!session_id) {
119
48
  throw new Error("ExecutorRecoveryPolicy requires a non-empty session_id");
120
49
  }
121
50
  }
122
51
 
123
- /**
124
- * 重置当前 Turn 执行状态。
125
- */
126
- reset_execution_state(): void {
127
- this.retry_count = 0;
128
- }
129
-
130
52
  /**
131
53
  * 执行一次带恢复策略的 Session Turn。
132
54
  */
133
55
  async execute_with_retry(
134
56
  input: ExecutorRecoveryInput,
135
57
  ): Promise<SessionTurnExecutionResult> {
136
- try {
137
- const execute_input = await input.prepare_execute_input({
138
- query: input.query,
139
- model: input.model,
140
- turn_context: input.turn_context,
141
- retry_count: this.retry_count,
142
- });
143
- return await input.execute_prepared_input({
144
- execute_input,
145
- model: input.model,
146
- turn_context: input.turn_context,
147
- });
148
- } catch (error) {
149
- if (this.should_compact(error)) {
150
- await this.logger.log("info", "[agent] compacting", {
151
- retryCount: this.retry_count,
152
- error: String(error),
153
- });
154
-
155
- if (this.retry_count < MAX_COMPACTION_RETRY_ATTEMPTS) {
156
- this.retry_count += 1;
157
- return await this.execute_with_retry(input);
58
+ let retry_count = 0;
59
+ while (true) {
60
+ try {
61
+ return await input.execute_turn(retry_count);
62
+ } catch (error) {
63
+ if (retry_count < MAX_COMPACTION_RETRY_ATTEMPTS) {
64
+ const recovered = await this.recover_context(error);
65
+ if (recovered) {
66
+ await this.logger.log("info", "[agent] compacting", {
67
+ retryCount: retry_count,
68
+ error: String(error),
69
+ });
70
+ retry_count += 1;
71
+ continue;
72
+ }
73
+ }
74
+ if (retry_count > 0) {
75
+ return this.build_failure_result({
76
+ error_text:
77
+ "Context length exceeded and retries failed. Please resend your question.",
78
+ });
158
79
  }
159
80
 
81
+ const error_text = String(error);
82
+ await this.logger.log("error", "Executor execution failed", {
83
+ error: error_text,
84
+ });
160
85
  return this.build_failure_result({
161
- error_text:
162
- "Context length exceeded and retries failed. Please resend your question.",
163
- turn_context: input.turn_context,
86
+ error_text,
164
87
  });
165
88
  }
166
-
167
- const error_text = String(error);
168
- await this.logger.log("error", "Executor execution failed", {
169
- error: error_text,
170
- });
171
- return this.build_failure_result({
172
- error_text,
173
- turn_context: input.turn_context,
174
- });
175
89
  }
176
90
  }
177
91
 
@@ -181,18 +95,11 @@ export class ExecutorRecoveryPolicy {
181
95
  */
182
96
  error_text: string;
183
97
 
184
- /**
185
- * 当前显式运行上下文。
186
- */
187
- turn_context: SessionTurnContext;
188
98
  }): SessionTurnExecutionResult {
189
99
  return {
190
100
  success: false,
191
101
  text: "",
192
102
  error: input.error_text,
193
- deferred_persisted_user_messages: [
194
- ...input.turn_context.input.deferred_user_messages(),
195
- ],
196
103
  };
197
104
  }
198
105
  }
@@ -2,7 +2,7 @@
2
2
  * SessionHistoryMeta:随 session_id 持久化的元信息。
3
3
  *
4
4
  * 关键点(中文)
5
- * - 存储位置:Agent Storage `sessions/<encodedSessionId>/meta.json`
5
+ * - 存储位置:Session SQLite `session_state`
6
6
  * - 用于保存 session 列表、详情和索引所需的轻量元信息
7
7
  */
8
8
 
@@ -35,6 +35,4 @@ export type SessionHistoryMeta = {
35
35
  message_count?: number;
36
36
  /** 当前 session 最后一条记录的用户可见摘要,用于列表预览。 */
37
37
  preview_text?: string;
38
- /** 生成当前摘要时 messages.jsonl 的字节长度,用于校验摘要是否仍然有效。 */
39
- historyBytes?: number;
40
38
  };