@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
@@ -11,7 +11,7 @@ import type {
11
11
  AgentSessionTimelineEvent,
12
12
  } from "@/types/agent/SessionTypes.js";
13
13
  import type {
14
- SessionAssistantToolPart,
14
+ SessionAgentToolPart,
15
15
  SessionMessage,
16
16
  } from "@downcity/type";
17
17
 
@@ -53,7 +53,7 @@ function create_timeline_event(input: {
53
53
  /** 将单个 Tool Part 展开为调用与可选结果事件。 */
54
54
  function project_tool_part(
55
55
  message: SessionMessage,
56
- part: SessionAssistantToolPart,
56
+ part: SessionAgentToolPart,
57
57
  start_index: number,
58
58
  ): AgentSessionTimelineEvent[] {
59
59
  const events = [create_timeline_event({
@@ -84,52 +84,77 @@ function project_tool_part(
84
84
  export function to_session_message_timeline_events(
85
85
  message: SessionMessage,
86
86
  ): AgentSessionTimelineEvent[] {
87
- if (message.type === "action") {
88
- return [{
89
- id: `${message.message_id}:0`,
90
- role: "action",
91
- ts: message.updated_at,
92
- text: message.description
93
- ? `${message.title}\n${message.description}`
94
- : message.title,
95
- action_title: message.title,
96
- ...(message.description ? { action_description: message.description } : {}),
97
- action_state: message.status,
98
- }];
99
- }
100
- if (message.type === "error") {
101
- return [create_timeline_event({
102
- message,
103
- role: "assistant",
104
- text: message.message,
105
- index: 0,
106
- })];
107
- }
108
- if (message.type === "user") {
109
- const text = message.parts
110
- .filter((part) => part.type === "text")
111
- .map((part) => part.text.trim())
112
- .filter(Boolean)
113
- .join("\n");
87
+ if (message.role === "user") {
88
+ const text_parts: string[] = [];
89
+ for (const part of message.parts) {
90
+ switch (part.type) {
91
+ case "text":
92
+ if (part.text.trim()) text_parts.push(part.text.trim());
93
+ break;
94
+ case "context":
95
+ case "file":
96
+ case "data":
97
+ break;
98
+ default:
99
+ assert_never(part);
100
+ }
101
+ }
102
+ const text = text_parts.join("\n");
114
103
  return [create_timeline_event({ message, role: "user", text, index: 0 })];
115
104
  }
116
105
 
117
106
  const events: AgentSessionTimelineEvent[] = [];
118
107
  for (const part of [...message.parts].sort((left, right) => left.sequence - right.sequence)) {
119
- if (part.type === "text") {
120
- const text = part.text.trim();
121
- if (text) {
108
+ switch (part.type) {
109
+ case "text": {
110
+ const text = part.text.trim();
111
+ if (text) {
112
+ events.push(create_timeline_event({
113
+ message,
114
+ role: "agent",
115
+ text,
116
+ index: events.length,
117
+ }));
118
+ }
119
+ break;
120
+ }
121
+ case "action":
122
+ events.push({
123
+ id: `${message.message_id}:${events.length}`,
124
+ role: "action",
125
+ ts: message.updated_at,
126
+ text: part.description
127
+ ? `${part.title}\n${part.description}`
128
+ : part.title,
129
+ action_title: part.title,
130
+ ...(part.description ? { action_description: part.description } : {}),
131
+ action_state: part.state,
132
+ });
133
+ break;
134
+ case "error":
122
135
  events.push(create_timeline_event({
123
136
  message,
124
- role: "assistant",
125
- text,
137
+ role: "agent",
138
+ text: part.message,
126
139
  index: events.length,
127
140
  }));
128
- }
129
- continue;
141
+ break;
142
+ case "tool":
143
+ events.push(...project_tool_part(message, part, events.length));
144
+ break;
145
+ case "reasoning":
146
+ case "interaction":
147
+ case "file":
148
+ case "data":
149
+ break;
150
+ default:
151
+ assert_never(part);
130
152
  }
131
- if (part.type !== "tool") continue;
132
- events.push(...project_tool_part(message, part, events.length));
133
153
  }
134
154
  return events;
135
155
  }
156
+
157
+ /** canonical Part 联合类型新增成员时强制时间线显式处理。 */
158
+ function assert_never(value: never): never {
159
+ throw new Error(`Unsupported timeline Session Part: ${String((value as { type?: unknown }).type)}`);
160
+ }
@@ -0,0 +1,307 @@
1
+ /**
2
+ * 基于稳定 Part 游标的自适应上下文策略。
3
+ *
4
+ * Message 仍是 canonical 持久化聚合,Part 是上下文取舍与摘要边界。策略只写自己的
5
+ * checkpoint 派生表,不修改 Message;单个 Agent Message 很大时也可以在
6
+ * Message 内部形成摘要边界。
7
+ */
8
+
9
+ import type {
10
+ SessionAgentMessagePart,
11
+ SessionMessage,
12
+ SessionUserMessagePart,
13
+ } from "@downcity/type";
14
+ import { generate_id } from "@/utils/Id.js";
15
+ import { build_text_model_messages, generate_model } from "@executor/model/ModelGenerate.js";
16
+ import { session_messages_to_model_messages } from "@/executor/messages/SessionModelMessages.js";
17
+ import type { SessionContextPolicy } from "@/types/session/SessionContextPolicy.js";
18
+ import type {
19
+ AdaptivePartCheckpointRow,
20
+ StablePartCandidate,
21
+ } from "@/types/session/AdaptivePartContextPolicy.js";
22
+ import {
23
+ build_initial_session_summary_prompt,
24
+ build_updated_session_summary_prompt,
25
+ SESSION_SUMMARY_SYSTEM_PROMPT,
26
+ } from "@/session/composer/policies/SessionSummaryPrompts.js";
27
+
28
+ const POLICY_VERSION = 1;
29
+ const SUMMARY_MAX_OUTPUT_TOKENS = 4_000;
30
+ const CHECKPOINT_TABLE = "composer_adaptive_part_checkpoints";
31
+
32
+ /** 默认 Part 级上下文策略。 */
33
+ export class AdaptivePartContextPolicy implements SessionContextPolicy {
34
+ readonly name = "adaptive_part";
35
+
36
+ /** 创建当前策略独享的 checkpoint 表。 */
37
+ async initialize(input: Parameters<SessionContextPolicy["initialize"]>[0]): Promise<void> {
38
+ await input.storage.transaction((transaction) => {
39
+ transaction.execute(`
40
+ CREATE TABLE IF NOT EXISTS ${CHECKPOINT_TABLE} (
41
+ checkpoint_id TEXT PRIMARY KEY,
42
+ through_message_id TEXT NOT NULL REFERENCES messages(message_id) ON DELETE CASCADE,
43
+ through_message_sequence INTEGER NOT NULL,
44
+ through_part_sequence INTEGER NOT NULL,
45
+ summary TEXT NOT NULL,
46
+ policy_version INTEGER NOT NULL,
47
+ created_at INTEGER NOT NULL,
48
+ UNIQUE(through_message_sequence, through_part_sequence, policy_version)
49
+ )
50
+ `);
51
+ });
52
+ }
53
+
54
+ /** 返回显式摘要 system block 与 Part 边界后的 canonical 历史。 */
55
+ async resolve(input: Parameters<SessionContextPolicy["resolve"]>[0]) {
56
+ const checkpoint = await this.read_latest_checkpoint(input.storage);
57
+ const canonical = await input.storage.list_messages();
58
+ const tail = checkpoint
59
+ ? slice_messages_after_checkpoint(canonical, checkpoint)
60
+ : canonical;
61
+ return {
62
+ messages: await session_messages_to_model_messages(tail, input.project_root),
63
+ ...(checkpoint?.summary.trim()
64
+ ? {
65
+ system_blocks: [{
66
+ source: "session" as const,
67
+ name: "context-summary",
68
+ content: `<session-context-summary>\n${checkpoint.summary}\n</session-context-summary>`,
69
+ }],
70
+ }
71
+ : {}),
72
+ diagnostics: {
73
+ policy_name: this.name,
74
+ ...(canonical.at(-1)?.sequence !== undefined
75
+ ? { through_sequence: canonical.at(-1)?.sequence }
76
+ : {}),
77
+ ...(checkpoint
78
+ ? { through_part_sequence: checkpoint.through_part_sequence }
79
+ : {}),
80
+ derived: Boolean(checkpoint),
81
+ ...(checkpoint ? { derivation_id: checkpoint.checkpoint_id } : {}),
82
+ },
83
+ };
84
+ }
85
+
86
+ /** 上下文压力出现时,按体积选择较旧稳定 Part 并合并进累计摘要。 */
87
+ async recover(input: Parameters<SessionContextPolicy["recover"]>[0]): Promise<boolean> {
88
+ if (!input.model) return false;
89
+ const previous = await this.read_latest_checkpoint(input.storage);
90
+ const canonical = await input.storage.list_messages();
91
+ const candidates = collect_stable_parts(canonical, previous);
92
+ const compact_parts = select_compact_parts(candidates);
93
+ const boundary = compact_parts.at(-1);
94
+ if (!boundary) return false;
95
+ const conversation_text = compact_parts
96
+ .map(candidate_to_summary_text)
97
+ .filter(Boolean)
98
+ .join("\n");
99
+ if (!conversation_text) return false;
100
+ const prompt = previous?.summary.trim()
101
+ ? build_updated_session_summary_prompt({
102
+ previous_summary: previous.summary,
103
+ conversation_text,
104
+ })
105
+ : build_initial_session_summary_prompt({ conversation_text });
106
+ const result = await generate_model(input.model, {
107
+ messages: build_text_model_messages(SESSION_SUMMARY_SYSTEM_PROMPT, prompt),
108
+ max_output_tokens: SUMMARY_MAX_OUTPUT_TOKENS,
109
+ }, {
110
+ request_kind: "history_compaction",
111
+ on_failure: input.on_model_request_failure,
112
+ });
113
+ const summary = String(result.text || "").trim();
114
+ if (!summary) throw new Error("Context summary model returned an empty result");
115
+ const checkpoint_id = `checkpoint:${generate_id()}`;
116
+ try {
117
+ await input.storage.transaction((transaction) => {
118
+ transaction.execute(`
119
+ INSERT INTO ${CHECKPOINT_TABLE} (
120
+ checkpoint_id, through_message_id, through_message_sequence,
121
+ through_part_sequence, summary, policy_version, created_at
122
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)
123
+ `, [
124
+ checkpoint_id,
125
+ boundary.message.message_id,
126
+ boundary.message.sequence,
127
+ boundary.part.sequence,
128
+ summary,
129
+ POLICY_VERSION,
130
+ Date.now(),
131
+ ]);
132
+ });
133
+ return true;
134
+ } catch (error) {
135
+ const latest = await this.read_latest_checkpoint(input.storage);
136
+ if (latest && compare_position(latest, boundary) >= 0) return true;
137
+ throw error;
138
+ }
139
+ }
140
+
141
+ /** 读取当前版本位置最靠后的累计 checkpoint。 */
142
+ private async read_latest_checkpoint(
143
+ storage: Parameters<SessionContextPolicy["resolve"]>[0]["storage"],
144
+ ): Promise<AdaptivePartCheckpointRow | null> {
145
+ return await storage.transaction((transaction) =>
146
+ transaction.get<AdaptivePartCheckpointRow>(`
147
+ SELECT checkpoint_id, through_message_id, through_message_sequence,
148
+ through_part_sequence, summary, policy_version, created_at
149
+ FROM ${CHECKPOINT_TABLE}
150
+ WHERE policy_version = ?
151
+ ORDER BY through_message_sequence DESC, through_part_sequence DESC
152
+ LIMIT 1
153
+ `, [POLICY_VERSION])
154
+ );
155
+ }
156
+ }
157
+
158
+ /** 收集 checkpoint 后适合进入摘要的稳定 Part。 */
159
+ function collect_stable_parts(
160
+ messages: readonly SessionMessage[],
161
+ checkpoint: AdaptivePartCheckpointRow | null,
162
+ ): StablePartCandidate[] {
163
+ return messages.flatMap((message) => message.parts.flatMap((part) => {
164
+ if (checkpoint && compare_part_position(message.sequence, part.sequence, checkpoint) <= 0) {
165
+ return [];
166
+ }
167
+ if (!is_stable_summary_part(message, part)) return [];
168
+ return [{ message, part }];
169
+ }));
170
+ }
171
+
172
+ /** 判断 Part 是否稳定且值得占据累计摘要。 */
173
+ function is_stable_summary_part(
174
+ message: SessionMessage,
175
+ part: SessionUserMessagePart | SessionAgentMessagePart,
176
+ ): boolean {
177
+ switch (part.type) {
178
+ case "reasoning":
179
+ case "action":
180
+ case "interaction":
181
+ return false;
182
+ case "tool":
183
+ return part.state === "completed" || part.state === "failed";
184
+ case "text":
185
+ if (message.role === "user") return true;
186
+ return "state" in part && part.state === "done" && message.state === "done";
187
+ case "context":
188
+ case "file":
189
+ case "data":
190
+ case "error":
191
+ return true;
192
+ default:
193
+ return assert_never(part);
194
+ }
195
+ }
196
+
197
+ /** 把单个 Part 收窄为摘要模型需要的稳定事实。 */
198
+ function candidate_to_summary_text(candidate: StablePartCandidate): string {
199
+ return JSON.stringify({
200
+ role: candidate.message.role,
201
+ message_id: candidate.message.message_id,
202
+ part: summary_part(candidate.part),
203
+ });
204
+ }
205
+
206
+ /** 删除瞬时字段并保留 Tool 调用/结果原子。 */
207
+ function summary_part(
208
+ part: SessionUserMessagePart | SessionAgentMessagePart,
209
+ ): Record<string, unknown> {
210
+ switch (part.type) {
211
+ case "text":
212
+ return { type: "text", text: part.text };
213
+ case "context":
214
+ return { type: "context", tag: part.tag, context: part.context };
215
+ case "file":
216
+ return { type: "file", media_type: part.media_type, url: part.url, filename: part.filename };
217
+ case "data":
218
+ return { type: "data", data_type: part.data_type, data: part.data };
219
+ case "tool":
220
+ return {
221
+ type: "tool",
222
+ tool_name: part.tool_name,
223
+ input: part.input,
224
+ output: part.output,
225
+ error: part.error,
226
+ };
227
+ case "error":
228
+ return { type: "error", code: part.code, message: part.message };
229
+ case "reasoning":
230
+ case "action":
231
+ case "interaction":
232
+ return { type: part.type };
233
+ default:
234
+ return assert_never(part);
235
+ }
236
+ }
237
+
238
+ /**
239
+ * 选择足以释放约一半原始上下文体积的最旧 Part。
240
+ *
241
+ * 关键点(中文):Part 数量不能代表上下文压力。一个巨大 Tool/Text Part
242
+ * 可以独自占满窗口,因此使用送入摘要模型的序列化字符体积作为轻量估算,
243
+ * 并保证只有一个可用 Part 时仍能推进 checkpoint。
244
+ */
245
+ function select_compact_parts(
246
+ candidates: readonly StablePartCandidate[],
247
+ ): StablePartCandidate[] {
248
+ if (candidates.length === 0) return [];
249
+ const sizes = candidates.map((candidate) =>
250
+ Math.max(candidate_to_summary_text(candidate).length, 1)
251
+ );
252
+ const target_size = Math.ceil(
253
+ sizes.reduce((total, size) => total + size, 0) / 2,
254
+ );
255
+ let selected_size = 0;
256
+ let selected_count = 0;
257
+ while (selected_count < candidates.length && selected_size < target_size) {
258
+ selected_size += sizes[selected_count] ?? 0;
259
+ selected_count += 1;
260
+ }
261
+ return candidates.slice(0, Math.max(selected_count, 1));
262
+ }
263
+
264
+ /** 删除 checkpoint 以前的 Part;边界可以位于单个 Message 内部。 */
265
+ function slice_messages_after_checkpoint(
266
+ messages: readonly SessionMessage[],
267
+ checkpoint: AdaptivePartCheckpointRow,
268
+ ): SessionMessage[] {
269
+ return messages.flatMap((message): SessionMessage[] => {
270
+ if (message.sequence < checkpoint.through_message_sequence) return [];
271
+ if (message.sequence > checkpoint.through_message_sequence) return [message];
272
+ const parts = message.parts.filter(
273
+ (part) => part.sequence > checkpoint.through_part_sequence,
274
+ );
275
+ if (parts.length === 0) return [];
276
+ return [{ ...message, parts } as SessionMessage];
277
+ });
278
+ }
279
+
280
+ /** 比较 canonical Part 与 checkpoint 的全局线性位置。 */
281
+ function compare_part_position(
282
+ message_sequence: number,
283
+ part_sequence: number,
284
+ checkpoint: AdaptivePartCheckpointRow,
285
+ ): number {
286
+ if (message_sequence !== checkpoint.through_message_sequence) {
287
+ return message_sequence - checkpoint.through_message_sequence;
288
+ }
289
+ return part_sequence - checkpoint.through_part_sequence;
290
+ }
291
+
292
+ /** 比较 checkpoint 与候选边界。 */
293
+ function compare_position(
294
+ checkpoint: AdaptivePartCheckpointRow,
295
+ candidate: StablePartCandidate,
296
+ ): number {
297
+ return -compare_part_position(
298
+ candidate.message.sequence,
299
+ candidate.part.sequence,
300
+ checkpoint,
301
+ );
302
+ }
303
+
304
+ /** canonical Part 联合类型新增成员时强制摘要策略显式选择语义。 */
305
+ function assert_never(value: never): never {
306
+ throw new Error(`Unsupported summary Session Part: ${String((value as { type?: unknown }).type)}`);
307
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 全量历史上下文策略。
3
+ *
4
+ * 该策略没有派生状态,适用于短会话、测试或拥有足够上下文窗口的模型。
5
+ */
6
+
7
+ import { session_messages_to_model_messages } from "@/executor/messages/SessionModelMessages.js";
8
+ import type { SessionContextPolicy } from "@/types/session/SessionContextPolicy.js";
9
+
10
+ /** 直接把全部 canonical Message 转换为模型历史。 */
11
+ export class FullHistoryContextPolicy implements SessionContextPolicy {
12
+ readonly name = "full_history";
13
+
14
+ /** 全量历史策略不需要创建派生表。 */
15
+ async initialize(): Promise<void> {}
16
+
17
+ /** 按 canonical 顺序返回完整模型历史。 */
18
+ async resolve(input: Parameters<SessionContextPolicy["resolve"]>[0]) {
19
+ const messages = await input.storage.list_messages();
20
+ return {
21
+ messages: await session_messages_to_model_messages(messages, input.project_root),
22
+ diagnostics: {
23
+ policy_name: this.name,
24
+ ...(messages.at(-1)?.sequence !== undefined
25
+ ? { through_sequence: messages.at(-1)?.sequence }
26
+ : {}),
27
+ derived: false,
28
+ },
29
+ };
30
+ }
31
+
32
+ /** 没有派生状态,因此无法通过恢复改变上下文。 */
33
+ async recover(): Promise<boolean> {
34
+ return false;
35
+ }
36
+ }
@@ -0,0 +1,42 @@
1
+ /** Session 累计摘要策略使用的稳定提示词。 */
2
+
3
+ /** 上下文摘要 system prompt。 */
4
+ export const SESSION_SUMMARY_SYSTEM_PROMPT = [
5
+ "You are a context summarization assistant.",
6
+ "Read the conversation and produce only a structured checkpoint summary.",
7
+ "Do not continue the conversation or answer its questions.",
8
+ ].join("\n");
9
+
10
+ /** 构建第一次累计摘要的 prompt。 */
11
+ export function build_initial_session_summary_prompt(input: {
12
+ /** 本次需要压缩的 canonical 对话文本。 */
13
+ conversation_text: string;
14
+ }): string {
15
+ return [
16
+ input.conversation_text.trim(),
17
+ "",
18
+ "Create a concise checkpoint another model can use to continue the work.",
19
+ "Preserve exact requests, constraints, decisions, completed work, pending work, file paths, function names, and errors.",
20
+ "Use these headings: Goal, Constraints, Progress, Key Decisions, Next Steps, Critical Context.",
21
+ ].join("\n");
22
+ }
23
+
24
+ /** 构建基于旧摘要的增量累计摘要 prompt。 */
25
+ export function build_updated_session_summary_prompt(input: {
26
+ /** 上一次已经持久化的累计摘要。 */
27
+ previous_summary: string;
28
+ /** 本次新增的 canonical 对话文本。 */
29
+ conversation_text: string;
30
+ }): string {
31
+ return [
32
+ "<previous-summary>",
33
+ input.previous_summary.trim(),
34
+ "</previous-summary>",
35
+ "",
36
+ input.conversation_text.trim(),
37
+ "",
38
+ "Update the checkpoint with the new conversation.",
39
+ "Preserve still-relevant facts and exact requests, constraints, decisions, file paths, function names, and errors.",
40
+ "Use these headings: Goal, Constraints, Progress, Key Decisions, Next Steps, Critical Context.",
41
+ ].join("\n");
42
+ }
@@ -7,11 +7,11 @@
7
7
 
8
8
  import type { ModelStreamEvent } from "@downcity/type";
9
9
  import {
10
- SessionAssistantMessageWriter,
10
+ SessionAgentMessageWriter,
11
11
  SessionMessages,
12
12
  } from "@/session/SessionMessages.js";
13
- import type { SessionAssistantResultPart } from "@downcity/type";
14
- import type { SessionAssistantMessagePart } from "@downcity/type";
13
+ import type { SessionAgentContent } from "@downcity/type";
14
+ import type { SessionAgentMessagePart } from "@downcity/type";
15
15
  import type { SessionAssistantOutput } from "@/types/executor/SessionAssistantOutput.js";
16
16
  import type {
17
17
  SessionToolExecutionResult,
@@ -22,8 +22,8 @@ import type {
22
22
  export class SessionAssistantOutputAdapter implements SessionAssistantOutput {
23
23
  private readonly turn_id: string;
24
24
  private readonly messages: SessionMessages;
25
- private writer: SessionAssistantMessageWriter | null = null;
26
- private writer_task: Promise<SessionAssistantMessageWriter> | null = null;
25
+ private writer: SessionAgentMessageWriter | null = null;
26
+ private writer_task: Promise<SessionAgentMessageWriter> | null = null;
27
27
  private step_pending = false;
28
28
 
29
29
  constructor(options: {
@@ -65,7 +65,7 @@ export class SessionAssistantOutputAdapter implements SessionAssistantOutput {
65
65
  }
66
66
 
67
67
  /** 使用模型聚合出的 canonical Parts 校验当前 Step。 */
68
- async finish_step(parts: SessionAssistantMessagePart[]): Promise<void> {
68
+ async finish_step(parts: SessionAgentMessagePart[]): Promise<void> {
69
69
  await (await this.ensure_writer()).finish_step(parts);
70
70
  }
71
71
 
@@ -86,9 +86,23 @@ export class SessionAssistantOutputAdapter implements SessionAssistantOutput {
86
86
  }
87
87
 
88
88
  /** 追加 Action 产生的封闭 Assistant 内容。 */
89
- async append_result_parts(parts: readonly SessionAssistantResultPart[]): Promise<void> {
90
- if (parts.length === 0) return;
91
- await (await this.ensure_writer()).append_result_parts(parts);
89
+ async append_result_parts(parts: readonly SessionAgentContent[]): Promise<SessionAgentMessagePart[]> {
90
+ if (parts.length === 0) return [];
91
+ return await (await this.ensure_writer()).append_result_parts(parts);
92
+ }
93
+
94
+ /** 在 Turn 收口产物之前追加用户可见的 canonical Error Part。 */
95
+ async append_error(input: {
96
+ /** 错误影响范围。 */
97
+ scope: "session" | "turn";
98
+ /** 稳定错误码。 */
99
+ code: string;
100
+ /** 用户可见错误信息。 */
101
+ message: string;
102
+ /** 当前错误是否允许重试恢复。 */
103
+ recoverable: boolean;
104
+ }): Promise<void> {
105
+ await (await this.ensure_writer()).append_error(input);
92
106
  }
93
107
 
94
108
  /** 按 Turn 结果收口最后一个 canonical Message。 */
@@ -110,10 +124,10 @@ export class SessionAssistantOutputAdapter implements SessionAssistantOutput {
110
124
  }
111
125
 
112
126
  /** 惰性打开当前连续 Assistant 回复的唯一 Writer。 */
113
- private async ensure_writer(): Promise<SessionAssistantMessageWriter> {
127
+ private async ensure_writer(): Promise<SessionAgentMessageWriter> {
114
128
  if (this.writer) return this.writer;
115
129
  if (this.writer_task) return await this.writer_task;
116
- this.writer_task = this.messages.open_assistant_message({
130
+ this.writer_task = this.messages.open_agent_message({
117
131
  turn_id: this.turn_id,
118
132
  });
119
133
  try {
@@ -1,16 +1,16 @@
1
1
  /**
2
- * 单个 canonical Action Message 的生命周期写入器。
2
+ * 单个 canonical Action Part 的生命周期写入器。
3
3
  *
4
4
  * Writer 只保存目标 Message 身份与发布策略,实际状态仍由 SessionMessages
5
5
  * 持久化和接受,避免形成第二份 Action 状态。
6
6
  */
7
7
 
8
8
  import type { SessionMessages } from "@/session/SessionMessages.js";
9
- import type { CompleteSessionActionMessageInput } from "@/types/session/SessionMessages.js";
9
+ import type { CompleteSessionAgentActionPartInput } from "@/types/session/SessionMessages.js";
10
10
 
11
- /** 单个 Action Message 的生命周期 writer。 */
12
- export class SessionActionMessageWriter {
13
- /** 当前 Action Message 的稳定标识。 */
11
+ /** 单个 Action Part 的生命周期 writer。 */
12
+ export class SessionAgentActionPartWriter {
13
+ /** 当前 Action Part 所属 Agent Message 的稳定标识。 */
14
14
  readonly message_id: string;
15
15
  private readonly messages: SessionMessages;
16
16
  private readonly publish_mutation: boolean;
@@ -27,9 +27,9 @@ export class SessionActionMessageWriter {
27
27
  }
28
28
 
29
29
  /** 把 Action 更新为 completed。 */
30
- async complete(input?: CompleteSessionActionMessageInput): Promise<void> {
30
+ async complete(input?: CompleteSessionAgentActionPartInput): Promise<void> {
31
31
  if (this.closed) return;
32
- await this.messages.update_action_message(
32
+ await this.messages.update_action_part(
33
33
  this.message_id,
34
34
  "completed",
35
35
  input,
@@ -41,7 +41,7 @@ export class SessionActionMessageWriter {
41
41
  /** 把 Action 更新为 failed。 */
42
42
  async fail(error: unknown): Promise<void> {
43
43
  if (this.closed) return;
44
- await this.messages.update_action_message(
44
+ await this.messages.update_action_part(
45
45
  this.message_id,
46
46
  "failed",
47
47
  {