@downcity/agent 1.1.430 → 1.1.438

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
@@ -6,13 +6,13 @@
6
6
  * 从最新快照严格递增。
7
7
  */
8
8
  import { generate_id } from "../utils/Id.js";
9
- import { SessionAssistantMessageWriter } from "../session/messages/SessionAssistantMessageWriter.js";
10
- import { SessionAssistantMessageState } from "../session/messages/SessionAssistantMessageState.js";
11
- import { SessionActionMessageWriter } from "../session/messages/SessionActionMessageWriter.js";
9
+ import { SessionAgentMessageWriter } from "../session/messages/SessionAgentMessageWriter.js";
10
+ import { SessionAgentMessageState } from "../session/messages/SessionAgentMessageState.js";
11
+ import { SessionAgentActionPartWriter } from "../session/messages/SessionAgentActionPartWriter.js";
12
12
  import { has_assistant_result_content, normalize_canonical_session_user_parts, normalize_session_user_parts, } from "../session/messages/SessionUserMessage.js";
13
13
  import { persist_user_prompt_file_parts } from "../executor/messages/SessionAttachmentMapper.js";
14
- export { SessionAssistantMessageWriter } from "../session/messages/SessionAssistantMessageWriter.js";
15
- export { SessionActionMessageWriter } from "../session/messages/SessionActionMessageWriter.js";
14
+ export { SessionAgentMessageWriter } from "../session/messages/SessionAgentMessageWriter.js";
15
+ export { SessionAgentActionPartWriter } from "../session/messages/SessionAgentActionPartWriter.js";
16
16
  export { normalize_session_user_parts } from "../session/messages/SessionUserMessage.js";
17
17
  /** 唯一 Session Message 写入服务。 */
18
18
  export class SessionMessages {
@@ -22,8 +22,9 @@ export class SessionMessages {
22
22
  publish;
23
23
  messages_by_id = new Map();
24
24
  /** Assistant 草稿与 Interaction 的串行状态转换器。 */
25
- assistant_state;
26
- initialized = false;
25
+ agent_state;
26
+ /** 当前 Message 恢复事务;并发初始化共享同一个 Promise。 */
27
+ initialize_promise = null;
27
28
  constructor(options) {
28
29
  this.session_id = String(options.session_id || "").trim();
29
30
  this.store = options.store;
@@ -31,44 +32,102 @@ export class SessionMessages {
31
32
  this.publish = options.publish;
32
33
  if (!this.session_id)
33
34
  throw new Error("SessionMessages requires session_id");
34
- this.assistant_state = new SessionAssistantMessageState({
35
+ this.agent_state = new SessionAgentMessageState({
35
36
  session_id: this.session_id,
36
37
  store: this.store,
37
38
  list_messages: () => this.messages_by_id.values(),
38
39
  accept_message: (message, publish_mutation) => this.accept_message(message, publish_mutation),
39
- accept_mutation: (mutation, message) => this.accept_mutation(mutation, message),
40
+ project_mutation: (mutation, message) => this.accept_mutation(mutation, message),
40
41
  });
41
42
  }
42
43
  /** 恢复已有 Message,并收口进程中断遗留的运行状态。 */
43
44
  async initialize() {
44
- if (this.initialized)
45
- return;
46
- await this.store.initialize();
47
- for (const message of await this.store.list_messages()) {
48
- this.messages_by_id.set(message.message_id, message);
45
+ if (!this.initialize_promise) {
46
+ this.initialize_promise = this.restore_messages();
49
47
  }
50
- this.initialized = true;
51
- const unfinished = [...this.messages_by_id.values()];
52
- for (const message of unfinished) {
53
- if (message.type === "assistant" && message.status === "streaming") {
54
- await this.complete_assistant_message(message.message_id, "stopped");
55
- }
56
- if (message.type === "action" && message.status === "running") {
57
- await this.update_action_message(message.message_id, "failed", {
58
- description: message.description || "Action interrupted before completion.",
59
- });
48
+ const initialize_promise = this.initialize_promise;
49
+ try {
50
+ await initialize_promise;
51
+ }
52
+ catch (error) {
53
+ if (this.initialize_promise === initialize_promise) {
54
+ this.initialize_promise = null;
60
55
  }
56
+ throw error;
57
+ }
58
+ }
59
+ /** 只恢复非终态 Message,并由领域层统一收口进程中断状态。 */
60
+ async restore_messages() {
61
+ await this.store.initialize();
62
+ const persisted_messages = await this.store.list_recoverable_agent_messages();
63
+ this.messages_by_id.clear();
64
+ for (const message of persisted_messages) {
65
+ this.remember_message(message);
66
+ const updated_at = Date.now();
67
+ const recovered = {
68
+ ...message,
69
+ state: "done",
70
+ revision: message.revision + 1,
71
+ updated_at,
72
+ parts: [...message.parts.map((part) => {
73
+ if (part.type === "action" && part.state === "running") {
74
+ return {
75
+ ...part,
76
+ state: "failed",
77
+ description: part.description || "Action interrupted before completion.",
78
+ };
79
+ }
80
+ if (part.type === "interaction" && part.status === "pending") {
81
+ return {
82
+ ...part,
83
+ status: "cancelled",
84
+ cancel_reason: "runtime_interrupted",
85
+ resolved_at: updated_at,
86
+ };
87
+ }
88
+ if (part.type === "tool" &&
89
+ part.state !== "completed" &&
90
+ part.state !== "failed") {
91
+ return {
92
+ ...part,
93
+ state: "failed",
94
+ error: "Tool interrupted before completion.",
95
+ };
96
+ }
97
+ if ((part.type === "text" || part.type === "reasoning") &&
98
+ part.state === "streaming") {
99
+ return { ...part, state: "done" };
100
+ }
101
+ return part;
102
+ }), {
103
+ part_id: `error:${generate_id()}`,
104
+ sequence: message.parts.reduce((sequence, part) => Math.max(sequence, part.sequence + 1), 1),
105
+ type: "error",
106
+ scope: message.turn_id ? "turn" : "session",
107
+ code: "runtime_interrupted",
108
+ message: "Agent execution was interrupted before completion.",
109
+ recoverable: true,
110
+ }],
111
+ };
112
+ const changed_parts = resolve_changed_agent_parts(message, recovered);
113
+ await this.store.update_message({
114
+ message: recovered,
115
+ expected_revision: message.revision,
116
+ changed_parts,
117
+ });
118
+ this.accept_message(recovered, false);
61
119
  }
62
120
  }
63
121
  /** 同步读取当前内存 Message。 */
64
122
  get_message(message_id) {
65
123
  return this.messages_by_id.get(message_id);
66
124
  }
67
- /** 追加普通 prompt 或 steering User Message。 */
125
+ /** 追加一条 canonical User Message。 */
68
126
  async append_user_message(input) {
127
+ const message_id = String(input.message_id || "").trim() ||
128
+ `user:${this.session_id}:${generate_id()}`;
69
129
  const message = await this.create_message((sequence, created_at) => ({
70
- message_id: String(input.message_id || "").trim() ||
71
- `user:${this.session_id}:${generate_id()}`,
130
+ message_id,
72
131
  session_id: this.session_id,
73
132
  turn_id: input.turn_id,
74
133
  sequence,
@@ -76,17 +135,19 @@ export class SessionMessages {
76
135
  visibility: input.visibility || "visible",
77
136
  created_at,
78
137
  updated_at: created_at,
79
- type: "user",
80
- input_type: input.input_type,
81
- parts: normalize_canonical_session_user_parts(input.parts),
138
+ role: "user",
139
+ parts: normalize_canonical_session_user_parts(input.parts).map((part) => ({
140
+ ...part,
141
+ part_id: `${message_id}:part:${String(part.sequence)}`,
142
+ })),
82
143
  }));
83
144
  return message;
84
145
  }
85
146
  /** 创建可持续接收 chunk 的 Assistant Message。 */
86
- async open_assistant_message(input) {
147
+ async open_agent_message(input) {
87
148
  const message = (await this.create_message((sequence, created_at) => ({
88
149
  message_id: String(input.message_id || "").trim() ||
89
- `assistant:${this.session_id}:${generate_id()}`,
150
+ `agent:${this.session_id}:${generate_id()}`,
90
151
  session_id: this.session_id,
91
152
  turn_id: input.turn_id,
92
153
  sequence,
@@ -94,31 +155,27 @@ export class SessionMessages {
94
155
  visibility: input.visibility || "visible",
95
156
  created_at,
96
157
  updated_at: created_at,
97
- type: "assistant",
98
- kind: input.kind || "normal",
99
- status: "streaming",
158
+ role: "agent",
159
+ state: "streaming",
100
160
  parts: [],
101
- ...(input.summary_through_message_id
102
- ? { summary_through_message_id: input.summary_through_message_id }
103
- : {}),
104
161
  }), true));
105
- return new SessionAssistantMessageWriter(this, message.message_id);
162
+ return new SessionAgentMessageWriter(this, message.message_id);
106
163
  }
107
164
  /** 直接写入一条已完成 Assistant Message。 */
108
- async append_completed_assistant_message(input) {
165
+ async append_completed_agent_message(input) {
109
166
  const turn_id = input.turn_id || `external:${this.session_id}:${generate_id()}`;
110
- const writer = await this.open_assistant_message({
167
+ const writer = await this.open_agent_message({
111
168
  turn_id,
112
- kind: input.kind || "normal",
113
169
  visibility: input.visibility || "visible",
114
- ...(input.summary_through_message_id
115
- ? { summary_through_message_id: input.summary_through_message_id }
116
- : {}),
117
170
  });
118
171
  for (const part of input.parts)
119
172
  await writer.upsert_part(part);
120
173
  await writer.complete();
121
- return this.get_message(writer.message_id);
174
+ const message = await this.store.read_message(writer.message_id);
175
+ if (!message || message.role !== "agent") {
176
+ throw new Error(`Completed Agent Message not found: ${writer.message_id}`);
177
+ }
178
+ return message;
122
179
  }
123
180
  /** 把公开 Session API 的 User 输入转换为 canonical Message 并持久化。 */
124
181
  async append_external_user_message(input) {
@@ -131,20 +188,19 @@ export class SessionMessages {
131
188
  return false;
132
189
  await this.append_user_message({
133
190
  turn_id: `external:${this.session_id}:${Date.now()}`,
134
- input_type: "prompt",
135
191
  parts,
136
192
  });
137
193
  return true;
138
194
  }
139
195
  /** 把公开 Session API 的 Assistant 输入转换为 canonical Message 并持久化。 */
140
- async append_external_assistant_message(input) {
196
+ async append_external_agent_message(input) {
141
197
  const parts = input.parts || [{
142
198
  type: "text",
143
199
  text: String(input.text || "").trim(),
144
200
  }];
145
201
  if (!has_assistant_result_content(parts))
146
202
  return false;
147
- const writer = await this.open_assistant_message({
203
+ const writer = await this.open_agent_message({
148
204
  turn_id: `external:${this.session_id}:${Date.now()}`,
149
205
  });
150
206
  await writer.append_result_parts(parts);
@@ -159,31 +215,22 @@ export class SessionMessages {
159
215
  : await persist_user_prompt_file_parts(Array.isArray(query) ? query : [], this.attachment_store);
160
216
  const canonical = await this.append_user_message({
161
217
  turn_id: input.turn_id,
162
- input_type: input.input_type,
163
218
  parts: normalize_session_user_parts(ui_parts),
219
+ ...(input.message_id ? { message_id: input.message_id } : {}),
164
220
  });
165
221
  return canonical;
166
222
  }
167
- /** 持久化 Executor 在本轮延迟产生的 User Message。 */
168
- async append_deferred_user_messages(deferred_messages) {
169
- const messages = Array.isArray(deferred_messages)
170
- ? deferred_messages
171
- : [];
172
- for (const message of messages) {
173
- await this.append_user_message({
174
- turn_id: message.turn_id || `deferred:${this.session_id}:${Date.now()}`,
175
- input_type: "steer",
176
- parts: structuredClone(message.parts),
177
- });
178
- }
179
- return messages.length;
223
+ /** 读取指定 Turn 最近一条 canonical Agent Message。 */
224
+ async read_latest_agent_message(turn_id) {
225
+ return await this.store.read_latest_agent_message(turn_id);
180
226
  }
181
- /** 按稳定 Action ID 创建或更新 canonical Action Message。 */
227
+ /** 按稳定 Action ID 创建或更新只包含 Action Part 的 Agent Message。 */
182
228
  async persist_action(event, options) {
183
229
  const publish_mutation = options?.publish_mutation !== false;
184
- const existing = this.get_message(event.action_id);
230
+ const existing = this.get_message(event.action_id) ||
231
+ await this.store.read_message(event.action_id) || undefined;
185
232
  if (!existing) {
186
- const writer = await this.open_action_message({
233
+ const writer = await this.open_action_part({
187
234
  message_id: event.action_id,
188
235
  turn_id: event.turn_id,
189
236
  action_type: event.action_type,
@@ -198,18 +245,19 @@ export class SessionMessages {
198
245
  }
199
246
  return;
200
247
  }
201
- if (existing.type === "action" && event.status !== "running") {
202
- await this.update_action_message(event.action_id, event.status, {
248
+ if (existing.role === "agent" && event.status !== "running") {
249
+ await this.update_action_part(event.action_id, event.status, {
203
250
  title: event.title,
204
251
  description: event.description,
205
252
  }, { publish_mutation });
206
253
  }
207
254
  }
208
- /** 创建 running Action Message。 */
209
- async open_action_message(input) {
255
+ /** 创建只包含 running Action Part 的 Agent Message。 */
256
+ async open_action_part(input) {
257
+ const message_id = String(input.message_id || "").trim() ||
258
+ `agent-action:${this.session_id}:${generate_id()}`;
210
259
  const message = (await this.create_message((sequence, created_at) => ({
211
- message_id: String(input.message_id || "").trim() ||
212
- `action:${this.session_id}:${generate_id()}`,
260
+ message_id,
213
261
  session_id: this.session_id,
214
262
  ...(input.turn_id ? { turn_id: input.turn_id } : {}),
215
263
  sequence,
@@ -217,39 +265,105 @@ export class SessionMessages {
217
265
  visibility: "visible",
218
266
  created_at,
219
267
  updated_at: created_at,
220
- type: "action",
221
- action_type: input.action_type,
222
- status: "running",
223
- title: input.title,
224
- ...(input.description ? { description: input.description } : {}),
225
- ...(input.data ? { data: structuredClone(input.data) } : {}),
268
+ role: "agent",
269
+ state: "streaming",
270
+ parts: [{
271
+ part_id: `action-part:${message_id}`,
272
+ sequence: 1,
273
+ type: "action",
274
+ action_id: message_id,
275
+ action_type: input.action_type,
276
+ state: "running",
277
+ title: input.title,
278
+ ...(input.description ? { description: input.description } : {}),
279
+ ...(input.data ? { data: structuredClone(input.data) } : {}),
280
+ }],
226
281
  }), false, input.publish_mutation !== false));
227
- return new SessionActionMessageWriter(this, message.message_id, input.publish_mutation !== false);
282
+ return new SessionAgentActionPartWriter(this, message.message_id, input.publish_mutation !== false);
228
283
  }
229
284
  /** 更新 Action 状态,同时保持 message_id 与 sequence 不变。 */
230
- async update_action_message(message_id, status, changes, options) {
231
- const message = await this.store.append_message((state) => {
232
- const current = require_message(state.messages, message_id, "action");
233
- const created_at = Date.now();
234
- return {
235
- ...current,
236
- status,
237
- ...(changes?.title ? { title: changes.title } : {}),
238
- ...(changes?.description !== undefined
239
- ? { description: changes.description }
240
- : {}),
241
- ...(changes?.data ? { data: structuredClone(changes.data) } : {}),
242
- revision: current.revision + 1,
243
- updated_at: created_at,
244
- };
285
+ async update_action_part(message_id, status, changes, options) {
286
+ const current_message = require_message([
287
+ this.get_message(message_id) || await this.store.read_message(message_id),
288
+ ].filter((message) => Boolean(message)), message_id, "agent");
289
+ const action = current_message.parts.find((part) => part.type === "action");
290
+ if (!action)
291
+ throw new Error(`Session Action Part not found: ${message_id}`);
292
+ const next_action = {
293
+ ...action,
294
+ state: status,
295
+ ...(changes?.title ? { title: changes.title } : {}),
296
+ ...(changes?.description !== undefined
297
+ ? { description: changes.description }
298
+ : {}),
299
+ ...(changes?.data ? { data: structuredClone(changes.data) } : {}),
300
+ };
301
+ const message = {
302
+ ...current_message,
303
+ state: status === "running" ? "streaming" : "done",
304
+ parts: current_message.parts.map((part) => part.part_id === action.part_id ? next_action : part),
305
+ revision: current_message.revision + 1,
306
+ updated_at: Date.now(),
307
+ };
308
+ await this.store.update_message({
309
+ message,
310
+ expected_revision: current_message.revision,
311
+ changed_parts: [next_action],
245
312
  });
246
313
  this.accept_message(message, options?.publish_mutation !== false);
247
314
  return message;
248
315
  }
249
- /** 创建用户可见 Error Message。 */
250
- async append_error_message(input) {
316
+ /**
317
+ * Error Part 追加到当前 Turn 最后一个 Agent Message。
318
+ *
319
+ * 同一错误码已经存在时保持幂等;只有当前 Turn 从未产生 Agent Message 时,才创建
320
+ * 一个仅含 Error 的失败 Message。这样错误与已经产生的 Text、Tool 和 Diff 始终
321
+ * 共享同一 Message,并由 Part sequence 表达真实顺序。
322
+ */
323
+ async append_error_part(input) {
324
+ await this.ensure_initialized();
325
+ const target = await this.store.read_latest_agent_message(input.turn_id);
326
+ const existing_error = target?.parts.find((part) => part.type === "error" && part.code === input.code);
327
+ if (target && existing_error) {
328
+ return target;
329
+ }
330
+ const error_part = {
331
+ part_id: `error:${generate_id()}`,
332
+ sequence: target
333
+ ? target.parts.reduce((sequence, part) => Math.max(sequence, part.sequence + 1), 1)
334
+ : 1,
335
+ type: "error",
336
+ scope: input.scope,
337
+ code: input.code,
338
+ message: input.message,
339
+ recoverable: input.recoverable,
340
+ };
341
+ if (target?.state === "streaming") {
342
+ this.remember_message(target);
343
+ await this.agent_state.commit_parts(target.message_id, [error_part]);
344
+ const updated = await this.store.read_message(target.message_id);
345
+ if (!updated || updated.role !== "agent") {
346
+ throw new Error(`Agent Message not found after Error Part commit: ${target.message_id}`);
347
+ }
348
+ return updated;
349
+ }
350
+ if (target) {
351
+ const message = {
352
+ ...target,
353
+ revision: target.revision + 1,
354
+ updated_at: Date.now(),
355
+ parts: [...target.parts, error_part].sort((left, right) => left.sequence - right.sequence),
356
+ };
357
+ await this.store.update_message({
358
+ message,
359
+ expected_revision: target.revision,
360
+ changed_parts: [error_part],
361
+ });
362
+ this.accept_message(message);
363
+ return message;
364
+ }
251
365
  return (await this.create_message((sequence, created_at) => ({
252
- message_id: `error:${this.session_id}:${generate_id()}`,
366
+ message_id: `agent:${this.session_id}:${generate_id()}`,
253
367
  session_id: this.session_id,
254
368
  ...(input.turn_id ? { turn_id: input.turn_id } : {}),
255
369
  sequence,
@@ -257,80 +371,50 @@ export class SessionMessages {
257
371
  visibility: "visible",
258
372
  created_at,
259
373
  updated_at: created_at,
260
- type: "error",
261
- scope: input.scope,
262
- code: input.code,
263
- message: input.message,
264
- recoverable: input.recoverable,
374
+ role: "agent",
375
+ state: "done",
376
+ parts: [error_part],
265
377
  })));
266
378
  }
267
- /** 读取 Active 或指定边界之前最近的完整 Segment。 */
379
+ /** Message sequence 返回一页完整 Message 聚合。 */
268
380
  async list_messages(input) {
269
381
  await this.ensure_initialized();
270
- const requests_segment = input?.before_sequence !== undefined;
271
382
  const before_sequence = input?.before_sequence;
272
- if (requests_segment &&
383
+ if (before_sequence !== undefined &&
273
384
  (!Number.isInteger(before_sequence) || Number(before_sequence) <= 0)) {
274
385
  throw new Error("before_sequence must be a positive integer");
275
386
  }
276
- const segment = requests_segment
277
- ? await this.store.read_segment_before(Number(before_sequence))
278
- : null;
279
- const source = requests_segment ? "segment" : "active";
280
- const messages = requests_segment
281
- ? segment?.messages || []
282
- : [...this.messages_by_id.values()].sort(compare_message_sequence);
387
+ const limit = Math.min(Math.max(input?.limit ?? 50, 1), 200);
388
+ const page = await this.store.list_message_page({
389
+ ...(before_sequence !== undefined ? { before_sequence } : {}),
390
+ limit: limit + 1,
391
+ include_internal: input?.include_internal === true,
392
+ });
393
+ const has_more = page.length > limit;
394
+ const messages = has_more ? page.slice(1) : page;
283
395
  const start_sequence = messages[0]?.sequence;
284
396
  const end_sequence = messages.at(-1)?.sequence;
285
- const history_boundary = source === "segment"
286
- ? segment?.range.start_sequence
287
- : await this.store.active_before_sequence(messages);
288
- const has_more = history_boundary !== undefined &&
289
- await this.store.has_segment_before(history_boundary);
290
- const stats = await this.store.stats();
291
- const items = messages
292
- .filter((message) => input?.include_internal === true || message.visibility === "visible")
293
- .map((message) => structuredClone(message));
397
+ const stats = await this.store.message_stats();
294
398
  return {
295
- items,
399
+ items: messages.map((message) => structuredClone(message)),
296
400
  total: stats.message_count,
297
- source,
298
401
  ...(start_sequence !== undefined ? { start_sequence } : {}),
299
402
  ...(end_sequence !== undefined ? { end_sequence } : {}),
300
- ...(has_more && history_boundary !== undefined
301
- ? { next_before_sequence: history_boundary }
403
+ ...(has_more && start_sequence !== undefined
404
+ ? { next_before_sequence: start_sequence }
302
405
  : {}),
303
406
  has_more,
304
407
  };
305
408
  }
306
- /** 读取最新累计 Summary 与全部 Active Message,供模型上下文使用。 */
307
- async context_snapshot() {
308
- await this.ensure_initialized();
309
- return {
310
- summary: await this.store.read_latest_summary(),
311
- messages: [...this.messages_by_id.values()]
312
- .sort(compare_message_sequence)
313
- .map((message) => structuredClone(message)),
314
- };
315
- }
316
409
  /** 读取全部真实历史,供 Fork 等明确的全量复制操作使用。 */
317
410
  async list_history_messages() {
318
411
  await this.ensure_initialized();
319
- return await this.store.list_history_messages();
412
+ return await this.store.list_messages();
320
413
  }
321
414
  /** 读取当前 Session 的存储统计。 */
322
415
  async storage_stats() {
323
416
  await this.ensure_initialized();
324
- return await this.store.stats();
325
- }
326
- /** 把 Active 前缀和累计 Summary 提交为不可变 Segment。 */
327
- async compact_active(input) {
328
- await this.ensure_initialized();
329
- const result = await this.store.compact_active(input);
330
- this.messages_by_id.clear();
331
- for (const message of result.active_messages) {
332
- this.messages_by_id.set(message.message_id, structuredClone(message));
333
- }
417
+ return await this.store.message_stats();
334
418
  }
335
419
  /** 向当前 Session 导入 fork 来源 Message,并重新分配全部身份和顺序。 */
336
420
  async import_messages(messages) {
@@ -340,7 +424,7 @@ export class SessionMessages {
340
424
  const turn_id = source.turn_id
341
425
  ? resolve_import_id(turn_ids, source.turn_id, "turn")
342
426
  : undefined;
343
- const message_id = resolve_import_id(message_ids, source.message_id, source.type);
427
+ const message_id = resolve_import_id(message_ids, source.message_id, source.role);
344
428
  await this.create_message((sequence, created_at) => ({
345
429
  ...structuredClone(source),
346
430
  message_id,
@@ -358,68 +442,75 @@ export class SessionMessages {
358
442
  }));
359
443
  }
360
444
  }
361
- /** @internal 写入 Assistant 原始文本 delta。 */
362
- async append_assistant_delta(message_id, part_id, type, delta) {
363
- await this.assistant_state.append_delta(message_id, part_id, type, delta);
445
+ /** @internal 只向运行投影追加 Agent 文本 delta。 */
446
+ project_agent_delta(message_id, part_id, type, delta) {
447
+ this.agent_state.project_delta(message_id, part_id, type, delta);
364
448
  }
365
- /** @internal 写入 Assistant Tool 输入原始 delta。 */
366
- async append_assistant_tool_input_delta(message_id, part_id, tool_call_id, delta) {
367
- await this.assistant_state.append_tool_input_delta(message_id, part_id, tool_call_id, delta);
449
+ /** @internal 只向运行投影追加 Agent Tool 输入 delta。 */
450
+ project_agent_tool_input_delta(message_id, part_id, tool_call_id, delta) {
451
+ this.agent_state.project_delta(message_id, part_id, "tool_input", delta, tool_call_id);
368
452
  }
369
- /** @internal 写入 Assistant 完整 part。 */
370
- async update_assistant_part(message_id, part) {
371
- await this.assistant_state.update_part(message_id, part);
453
+ /** @internal 只向运行投影写入 Agent 完整 Part。 */
454
+ project_agent_part(message_id, part) {
455
+ this.agent_state.project_part(message_id, part);
456
+ }
457
+ /** @internal 原子提交当前运行投影。 */
458
+ async checkpoint_agent_message(message_id) {
459
+ await this.agent_state.checkpoint(message_id);
460
+ }
461
+ /** @internal 原子提交一组非流式 Agent Parts。 */
462
+ async commit_agent_parts(message_id, parts) {
463
+ await this.agent_state.commit_parts(message_id, parts);
464
+ }
465
+ /** @internal 丢弃未提交的当前 Step 投影。 */
466
+ async rollback_agent_projection(message_id) {
467
+ await this.agent_state.rollback_projection(message_id);
372
468
  }
373
469
  /** @internal 原子提交当前 Assistant step 的 metadata 快照。 */
374
- async commit_assistant_step(message_id, parts) {
375
- await this.assistant_state.commit_step(message_id, parts);
470
+ async commit_agent_step(message_id, parts) {
471
+ await this.agent_state.commit_step(message_id, parts);
376
472
  }
377
473
  /** @internal 收口 Assistant Message。 */
378
- async complete_assistant_message(message_id, status, error) {
379
- await this.assistant_state.complete(message_id, status, error);
474
+ async complete_agent_message(message_id, status, error) {
475
+ await this.agent_state.complete(message_id, status, error);
380
476
  }
381
477
  async create_message(factory, draft = false, publish_mutation = true) {
382
478
  await this.ensure_initialized();
383
- if (draft) {
384
- const message = await this.store.create_assistant_message((state) => {
385
- const candidate = factory(state.message_sequence, Date.now());
386
- if (candidate.type !== "assistant" || candidate.status !== "streaming") {
387
- throw new Error("Draft Message must be a streaming Assistant");
388
- }
389
- return candidate;
390
- });
391
- this.accept_message(message, publish_mutation);
392
- return message;
393
- }
394
- const message = await this.store.append_message((state) => factory(state.message_sequence, Date.now()));
479
+ const message = await this.store.create_message((state) => {
480
+ const candidate = factory(state.message_sequence, Date.now());
481
+ if (draft && (candidate.role !== "agent" || candidate.state !== "streaming")) {
482
+ throw new Error("Draft Message must be a streaming Agent Message");
483
+ }
484
+ return candidate;
485
+ });
395
486
  this.accept_message(message, publish_mutation);
396
487
  return message;
397
488
  }
398
489
  /** 读取当前流式 Assistant 中的指定 Tool Part。 */
399
490
  find_streaming_tool(tool_call_id) {
400
- return this.assistant_state.find_streaming_tool(tool_call_id);
491
+ return this.agent_state.find_streaming_tool(tool_call_id);
401
492
  }
402
493
  /** 返回当前 Session 中全部等待用户响应的 canonical Interaction。 */
403
494
  list_pending_interactions() {
404
- return this.assistant_state.list_pending_interactions();
495
+ return this.agent_state.list_pending_interactions();
405
496
  }
406
497
  /** 原子创建 Interaction,并把关联 Tool 转为 waiting-user。 */
407
498
  async request_interaction(request) {
408
- return await this.assistant_state.request_interaction(request);
499
+ return await this.agent_state.request_interaction(request);
409
500
  }
410
501
  /** 原子保存用户响应,并按 Interaction 结果恢复或终止关联 Tool。 */
411
502
  async resolve_interaction(interaction_id, response) {
412
- return await this.assistant_state.resolve_interaction(interaction_id, response);
503
+ return await this.agent_state.resolve_interaction(interaction_id, response);
413
504
  }
414
505
  /** 原子结束未响应 Interaction,并把关联 Tool 标记为失败。 */
415
506
  async close_interaction(interaction_id, input) {
416
- return await this.assistant_state.close_interaction(interaction_id, input);
507
+ return await this.agent_state.close_interaction(interaction_id, input);
417
508
  }
418
509
  build_message_mutation(message) {
419
510
  return {
420
511
  mutation_id: generate_id(),
421
512
  variant: "message",
422
- type: message.type,
513
+ role: message.role,
423
514
  message_id: message.message_id,
424
515
  sequence: message.sequence,
425
516
  revision: message.revision,
@@ -431,24 +522,30 @@ export class SessionMessages {
431
522
  }
432
523
  accept_message(message, publish_mutation = true) {
433
524
  if (!publish_mutation) {
434
- this.messages_by_id.set(message.message_id, structuredClone(message));
525
+ this.remember_message(message);
435
526
  return;
436
527
  }
437
528
  this.accept_mutation(this.build_message_mutation(message), message);
438
529
  }
439
530
  accept_mutation(mutation, message) {
440
- this.messages_by_id.set(message.message_id, structuredClone(message));
531
+ this.remember_message(message);
441
532
  this.publish(mutation);
442
533
  }
534
+ /** 仅缓存可变的 streaming Agent Message;终态历史始终读取 SQLite。 */
535
+ remember_message(message) {
536
+ this.messages_by_id.delete(message.message_id);
537
+ if (message.role === "agent" && message.state === "streaming") {
538
+ this.messages_by_id.set(message.message_id, structuredClone(message));
539
+ }
540
+ }
443
541
  async ensure_initialized() {
444
- if (!this.initialized)
445
- await this.initialize();
542
+ await this.initialize();
446
543
  }
447
544
  }
448
- function require_message(messages, message_id, type) {
545
+ function require_message(messages, message_id, role) {
449
546
  const message = messages.find((item) => item.message_id === message_id);
450
- if (!message || message.type !== type) {
451
- throw new Error(`Session ${type} Message not found: ${message_id}`);
547
+ if (!message || message.role !== role) {
548
+ throw new Error(`Session ${role} Message not found: ${message_id}`);
452
549
  }
453
550
  return message;
454
551
  }
@@ -461,7 +558,8 @@ function resolve_import_id(map, source_id, prefix) {
461
558
  return created;
462
559
  }
463
560
  /** 按真实 Message sequence 升序排序。 */
464
- function compare_message_sequence(left, right) {
465
- return left.sequence - right.sequence;
561
+ function resolve_changed_agent_parts(current, next) {
562
+ const current_by_id = new Map(current.parts.map((part) => [part.part_id, JSON.stringify(part)]));
563
+ return next.parts.filter((part) => current_by_id.get(part.part_id) !== JSON.stringify(part));
466
564
  }
467
565
  //# sourceMappingURL=SessionMessages.js.map