@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
@@ -12,7 +12,7 @@ import {
12
12
  } from "@/session/messages/SessionMessageText.js";
13
13
  import type { SessionMessage } from "@downcity/type";
14
14
 
15
- function extract_assistant_tool_summary(message: Extract<SessionMessage, { type: "assistant" }>): string {
15
+ function extract_assistant_tool_summary(message: Extract<SessionMessage, { role: "agent" }>): string {
16
16
  const tool_names = new Set<string>();
17
17
  for (const part of message.parts) {
18
18
  if (part.type !== "tool") continue;
@@ -30,16 +30,33 @@ function extract_assistant_tool_summary(message: Extract<SessionMessage, { type:
30
30
  export function resolve_session_message_preview(
31
31
  message: SessionMessage,
32
32
  ): string {
33
- if (message.type === "action") {
34
- return message.description
35
- ? `${message.title}\n${message.description}`
36
- : message.title;
37
- }
38
- if (message.type === "error") return message.message;
39
33
  const plain_text = extract_session_message_text(message);
40
34
  if (plain_text) return plain_text;
41
- if (message.type !== "assistant") return "";
35
+ if (message.role !== "agent") return "";
42
36
 
43
37
  const user_visible = resolve_session_assistant_visible_text(message).trim();
44
- return user_visible || extract_assistant_tool_summary(message);
38
+ if (user_visible) return user_visible;
39
+ for (const part of message.parts) {
40
+ switch (part.type) {
41
+ case "action":
42
+ return part.description ? `${part.title}\n${part.description}` : part.title;
43
+ case "error":
44
+ return part.message;
45
+ case "text":
46
+ case "reasoning":
47
+ case "tool":
48
+ case "interaction":
49
+ case "file":
50
+ case "data":
51
+ break;
52
+ default:
53
+ assert_never(part);
54
+ }
55
+ }
56
+ return extract_assistant_tool_summary(message);
57
+ }
58
+
59
+ /** canonical Agent Part 增加成员时强制预览投影显式处理。 */
60
+ function assert_never(value: never): never {
61
+ throw new Error(`Unsupported preview Session Part: ${String((value as { type?: unknown }).type)}`);
45
62
  }
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Session Turn 结果收口。
3
+ *
4
+ * 本模块统一结果映射、Turn Mutation、committed Hook 与 Context 释放顺序。它不消费
5
+ * Queue,也不持有 Active Turn 引用或 Handle;这些调度状态仍由 SessionLoop 收口。
6
+ */
7
+
8
+ import { nanoid } from "nanoid";
9
+ import type { JsonValue, SessionMessage } from "@downcity/type";
10
+ import type { AgentSessionTurnResult } from "@/types/sdk/AgentSessionTurn.js";
11
+ import type { SessionTurnExecutionResult } from "@/types/session/SessionExecution.js";
12
+ import type { ActiveSessionTurnState } from "@/types/session/SessionLoop.js";
13
+ import type { SessionTurnCompletionOptions } from "@/types/session/SessionTurnCompletion.js";
14
+ import type { SessionTurnCommittedHookValue } from "@downcity/type";
15
+ import { SESSION_HOOK_POINTS } from "@/session/SessionHookPoints.js";
16
+
17
+ /** 使用 Executor 结果完成当前 Turn。 */
18
+ export async function complete_session_turn(
19
+ options: SessionTurnCompletionOptions,
20
+ active_turn: ActiveSessionTurnState,
21
+ result: SessionTurnExecutionResult,
22
+ ): Promise<AgentSessionTurnResult> {
23
+ const stopped = active_turn.turn_context?.lifecycle.abort_signal.aborted === true;
24
+ const final_result: AgentSessionTurnResult = {
25
+ turn_id: active_turn.turn_id,
26
+ text: result.text,
27
+ success: stopped ? false : result.success,
28
+ ...(stopped
29
+ ? { error: options.stopped_message }
30
+ : result.error ? { error: result.error } : {}),
31
+ };
32
+ active_turn.result = final_result;
33
+ options.events.publish({
34
+ mutation_id: nanoid(),
35
+ variant: "turn",
36
+ type: "finish",
37
+ session_id: options.session_id,
38
+ turn_id: active_turn.turn_id,
39
+ status: stopped ? "stopped" : final_result.success ? "completed" : "failed",
40
+ created_at: Date.now(),
41
+ text: final_result.text,
42
+ ...(final_result.error ? { error: final_result.error } : {}),
43
+ });
44
+ await notify_turn_committed(
45
+ options,
46
+ active_turn,
47
+ stopped ? "stopped" : final_result.success ? "completed" : "failed",
48
+ );
49
+ await dispose_turn_context(options, active_turn);
50
+ return final_result;
51
+ }
52
+
53
+ /** 使用稳定失败结果结束当前 Turn。 */
54
+ export async function fail_session_turn(
55
+ options: SessionTurnCompletionOptions,
56
+ active_turn: ActiveSessionTurnState,
57
+ error: unknown,
58
+ ): Promise<AgentSessionTurnResult> {
59
+ if (active_turn.result) return active_turn.result;
60
+ const stopped = active_turn.turn_context?.lifecycle.abort_signal.aborted === true;
61
+ const message = stopped
62
+ ? options.stopped_message
63
+ : error instanceof Error ? error.message : String(error);
64
+ const final_result: AgentSessionTurnResult = {
65
+ turn_id: active_turn.turn_id,
66
+ text: "",
67
+ success: false,
68
+ error: message,
69
+ };
70
+ active_turn.result = final_result;
71
+ if (message !== options.stopped_message) {
72
+ try {
73
+ await options.messages.append_error_part({
74
+ scope: "turn",
75
+ turn_id: active_turn.turn_id,
76
+ code: "turn_execution_failed",
77
+ message,
78
+ recoverable: true,
79
+ });
80
+ } catch {
81
+ // Error Part 兜底写入失败不能阻止 Turn Handle 收口。
82
+ }
83
+ }
84
+ options.events.publish({
85
+ mutation_id: nanoid(),
86
+ variant: "turn",
87
+ type: "finish",
88
+ session_id: options.session_id,
89
+ turn_id: active_turn.turn_id,
90
+ status: stopped ? "stopped" : "failed",
91
+ created_at: Date.now(),
92
+ text: "",
93
+ error: message,
94
+ });
95
+ await notify_turn_committed(options, active_turn, stopped ? "stopped" : "failed");
96
+ await dispose_turn_context(options, active_turn);
97
+ return final_result;
98
+ }
99
+
100
+ /** 在释放当前 Hook lease 前触发 Turn committed effect。 */
101
+ async function notify_turn_committed(
102
+ options: SessionTurnCompletionOptions,
103
+ active_turn: ActiveSessionTurnState,
104
+ status: SessionTurnCommittedHookValue["status"],
105
+ ): Promise<void> {
106
+ const hooks = active_turn.turn_context?.step.hooks;
107
+ if (!hooks) return;
108
+ try {
109
+ const messages = (await options.messages.list_history_messages())
110
+ .filter((message) => message.turn_id === active_turn.turn_id)
111
+ .map((message) => structuredClone(message));
112
+ const value: SessionTurnCommittedHookValue = {
113
+ session_id: options.session_id,
114
+ turn_id: active_turn.turn_id,
115
+ status,
116
+ messages: messages as SessionMessage[],
117
+ };
118
+ await hooks.effect(
119
+ SESSION_HOOK_POINTS.turn_committed,
120
+ value as unknown as JsonValue,
121
+ );
122
+ } catch (error) {
123
+ await log_turn_warning(options, active_turn, "session plugin effect failed", error, {
124
+ point_name: SESSION_HOOK_POINTS.turn_committed,
125
+ });
126
+ }
127
+ }
128
+
129
+ /** 尽力释放当前 Turn 唯一拥有的 Context。 */
130
+ async function dispose_turn_context(
131
+ options: SessionTurnCompletionOptions,
132
+ active_turn: ActiveSessionTurnState,
133
+ ): Promise<void> {
134
+ try {
135
+ await active_turn.turn_context?.lifecycle.dispose();
136
+ } catch (error) {
137
+ await log_turn_warning(options, active_turn, "turn context disposal failed", error);
138
+ }
139
+ }
140
+
141
+ /** Turn 已经确定结果后使用的 best-effort 日志入口。 */
142
+ async function log_turn_warning(
143
+ options: SessionTurnCompletionOptions,
144
+ active_turn: ActiveSessionTurnState,
145
+ message: string,
146
+ error: unknown,
147
+ detail: Record<string, string> = {},
148
+ ): Promise<void> {
149
+ try {
150
+ await options.logger.log("warn", `[agent] ${message}`, {
151
+ session_id: options.session_id,
152
+ turn_id: active_turn.turn_id,
153
+ ...detail,
154
+ error: error instanceof Error ? error.message : String(error),
155
+ });
156
+ } catch {
157
+ // Turn 结果已经确定,日志失败不能阻止 Handle 收口。
158
+ }
159
+ }
@@ -9,7 +9,7 @@
9
9
 
10
10
  import type { RuntimeToolEffect } from "@downcity/type";
11
11
  import type { SessionUserMessage } from "@downcity/type";
12
- import type { SessionAssistantResultPart } from "@downcity/type";
12
+ import type { SessionAgentContent } from "@downcity/type";
13
13
  import type {
14
14
  SessionTurnContext,
15
15
  SessionTurnContextInit,
@@ -51,9 +51,8 @@ class DefaultSessionTurnContext implements SessionTurnContext {
51
51
  private plugin_context_blocks_snapshot: readonly SessionHookContextBlock[] = Object.freeze([]);
52
52
  /** 并发或重复解析时复用的唯一 Promise。 */
53
53
  private plugin_context_blocks_promise?: Promise<readonly SessionHookContextBlock[]>;
54
- private injected_user_messages: SessionUserMessage[] = [];
55
- private deferred_messages: SessionUserMessage[] = [];
56
- private pending_assistant_parts: SessionAssistantResultPart[] = [];
54
+ private observed_user_messages: SessionUserMessage[] = [];
55
+ private pending_assistant_parts: SessionAgentContent[] = [];
57
56
  private turn_effects: RuntimeToolEffect[] = [];
58
57
 
59
58
  readonly lifecycle: SessionTurnContext["lifecycle"];
@@ -146,27 +145,27 @@ class DefaultSessionTurnContext implements SessionTurnContext {
146
145
  });
147
146
 
148
147
  this.input = Object.freeze({
149
- checkpoint: async () => {
150
- const injected = context.injected_user_messages;
151
- context.injected_user_messages = [];
152
- let queued: SessionUserMessage[] = [];
153
- try {
154
- queued = (await context.init.merge_step_input?.()) || [];
155
- } catch {
156
- queued = [];
148
+ observe_user_message: (message) => {
149
+ if (message.turn_id !== context.session.turn_id) {
150
+ throw new Error(`Observed User Message belongs to another Turn: ${message.message_id}`);
157
151
  }
158
- return [...injected, ...queued];
152
+ context.observed_user_messages.push(structuredClone(message));
159
153
  },
160
- has_pending: () => context.init.has_pending_step_input?.() === true,
161
- inject_user_message: (message) => {
162
- context.injected_user_messages.push(message);
154
+ user_messages: () => Object.freeze(
155
+ context.observed_user_messages.map((message) => structuredClone(message)),
156
+ ),
157
+ checkpoint: async () => {
158
+ await context.init.commit_step_input?.();
163
159
  },
164
- defer_user_message: (message) => {
165
- context.deferred_messages.push(message);
160
+ has_pending: () => context.init.has_pending_step_input?.() === true,
161
+ append_internal: async (parts) => {
162
+ if (!context.init.append_internal_user_message) {
163
+ throw new Error("SessionTurnContext cannot persist internal User input");
164
+ }
165
+ return await context.init.append_internal_user_message(
166
+ parts.map((part) => structuredClone(part)),
167
+ );
166
168
  },
167
- deferred_user_messages: () => Object.freeze([...context.deferred_messages]),
168
- consume_history_reload: () =>
169
- context.init.consume_history_reload?.() === true,
170
169
  });
171
170
 
172
171
  this.output = Object.freeze({
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Session Turn 文件修改观测。
3
+ *
4
+ * 本模块把 Tool effects 投影为实时摘要和最终 canonical data part。所有失败都只记录
5
+ * warning,不得反向改变 Turn 结果。
6
+ */
7
+
8
+ import { nanoid } from "nanoid";
9
+ import {
10
+ build_session_turn_file_diff,
11
+ build_session_turn_file_diff_summary,
12
+ } from "@/session/messages/SessionTurnFileDiffBuilder.js";
13
+ import { SESSION_TURN_FILE_DIFF_DATA_TYPE } from "@/session/messages/SessionTurnFileDiffData.js";
14
+ import type {
15
+ AppendSessionTurnFileDiffInput,
16
+ PublishSessionTurnFileDiffInput,
17
+ } from "@/types/session/SessionTurnFileDiff.js";
18
+ import type { Logger } from "@/utils/logger/Logger.js";
19
+
20
+ /** 把当前 Turn 成功的结构化文件修改写入 canonical Assistant data part。 */
21
+ export async function append_session_turn_file_diff(
22
+ input: AppendSessionTurnFileDiffInput,
23
+ ): Promise<void> {
24
+ try {
25
+ const file_diff = build_session_turn_file_diff(
26
+ input.workspace_path,
27
+ input.turn_context.effects.snapshot(),
28
+ );
29
+ if (!file_diff) return;
30
+ await input.assistant_output.append_result_parts([{
31
+ type: "data",
32
+ data_type: SESSION_TURN_FILE_DIFF_DATA_TYPE,
33
+ data_id: `turn-file-diff:${input.turn_id}`,
34
+ data: {
35
+ files: file_diff.files.map((file) => ({
36
+ file: file.file,
37
+ status: file.status,
38
+ additions: file.additions,
39
+ deletions: file.deletions,
40
+ patch: file.patch,
41
+ })),
42
+ additions: file_diff.additions,
43
+ deletions: file_diff.deletions,
44
+ },
45
+ }]);
46
+ } catch (error) {
47
+ await log_file_diff_warning(
48
+ input.logger,
49
+ input.session_id,
50
+ input.turn_id,
51
+ "failed to persist structured file edits",
52
+ error,
53
+ );
54
+ }
55
+ }
56
+
57
+ /** 发布当前 Turn 的实时文件修改摘要。 */
58
+ export function publish_session_turn_file_diff(
59
+ input: PublishSessionTurnFileDiffInput,
60
+ ): void {
61
+ try {
62
+ const summary = build_session_turn_file_diff_summary(
63
+ input.workspace_path,
64
+ input.effects,
65
+ );
66
+ if (summary.files_count === 0) return;
67
+ input.publish({
68
+ mutation_id: nanoid(),
69
+ variant: "file_diff",
70
+ session_id: input.session_id,
71
+ turn_id: input.turn_id,
72
+ created_at: Date.now(),
73
+ files_count: summary.files_count,
74
+ additions: summary.additions,
75
+ deletions: summary.deletions,
76
+ });
77
+ } catch (error) {
78
+ void log_file_diff_warning(
79
+ input.logger,
80
+ input.session_id,
81
+ input.turn_id,
82
+ "failed to publish live file edit summary",
83
+ error,
84
+ );
85
+ }
86
+ }
87
+
88
+ /** 文件修改观测失败使用的 best-effort 日志入口。 */
89
+ async function log_file_diff_warning(
90
+ logger: Logger,
91
+ session_id: string,
92
+ turn_id: string,
93
+ message: string,
94
+ error: unknown,
95
+ ): Promise<void> {
96
+ try {
97
+ await logger.log("warn", `[agent] ${message}`, {
98
+ session_id,
99
+ turn_id,
100
+ error: error instanceof Error ? error.message : String(error),
101
+ });
102
+ } catch {
103
+ // 文件编辑观测失败不影响 canonical 对话执行。
104
+ }
105
+ }
@@ -1,190 +1,41 @@
1
1
  /**
2
- * LocalSessionDataStore:Agent 内单个 Session 的 JSONL 持久化视图。
2
+ * 本地 Agent Session 的 SQLite Storage。
3
3
  *
4
- * 职责说明(中文)
5
- * - 集中创建 Message Store,并封装 Metadata 与 Instruction 的物理路径。
6
- * - Session 领域只持有本对象,不再自行拼接任何存储路径。
4
+ * 本类只负责把 Agent 私有目录、数据库位置和附件目录装配给通用 SQLite 实现;
5
+ * Session 领域不在这里拼接任何物理路径。
7
6
  */
8
7
 
9
- import { isDeepStrictEqual } from "node:util";
10
- import { JsonlSessionMessageStore } from "@/session/storage/JsonlSessionMessageStore.js";
8
+ import { LocalSessionAttachmentStore } from "@/session/storage/LocalSessionAttachmentStore.js";
11
9
  import {
12
- get_agent_session_instruction_path,
13
- get_agent_session_meta_path,
14
- get_agent_session_assistant_message_path,
15
- get_agent_session_active_messages_path,
16
10
  get_agent_session_attachments_path,
11
+ get_agent_session_database_path,
17
12
  } from "@/session/storage/LocalStorePaths.js";
18
- import { normalize_session_metadata } from "@/session/storage/Metadata.js";
19
- import type { SessionHistoryMeta } from "@/executor/types/SessionHistoryMeta.js";
20
- import type { SessionDataStore } from "@/types/store/SessionDataStore.js";
21
- import type { FileSystem } from "@downcity/type";
13
+ import { SqliteSessionStorage } from "@/session/storage/SqliteSessionStorage.js";
22
14
  import type { LocalSessionDataStoreOptions } from "@/types/store/LocalStore.js";
23
- import { LocalSessionAttachmentStore } from "@/session/storage/LocalSessionAttachmentStore.js";
24
- import type { SessionOrigin } from "@downcity/type";
25
-
26
- /** 本地 Session Store。 */
27
- export class LocalSessionDataStore implements SessionDataStore {
28
- /** 当前 Session 的稳定标识。 */
29
- readonly session_id: string;
30
-
31
- /** 当前 Session 的 JSONL Message Store。 */
32
- readonly messages: JsonlSessionMessageStore;
33
-
34
- /** 当前 Session 的附件持久化能力。 */
35
- readonly attachments: LocalSessionAttachmentStore;
36
-
37
- /** 当前 Session 的创建来源与物理存储分区。 */
38
- readonly origin: SessionOrigin;
39
-
40
- /** 当前 Agent 内部数据文件能力。 */
41
- private readonly files: FileSystem;
42
-
43
- /** 当前 Agent 的稳定标识。 */
44
- private readonly agent_id: string;
45
-
46
- /** 当前 Workspace 的稳定标识。 */
47
- private readonly workspace_id?: string;
48
-
49
- /** 当前 Agent 内部数据根路径。 */
50
- private readonly storage_root_path: string;
51
15
 
16
+ /** Agent 私有 Session 的默认 SQLite Storage。 */
17
+ export class LocalSessionDataStore extends SqliteSessionStorage {
52
18
  constructor(options: LocalSessionDataStoreOptions) {
53
- this.files = options.files;
54
- this.agent_id = options.agent_id;
55
- this.workspace_id = options.workspace_id;
56
- this.storage_root_path = options.storage_root_path;
57
- this.session_id = options.session_id;
58
- this.origin = options.origin;
59
- this.messages = new JsonlSessionMessageStore({
60
- files: this.files,
61
- session_id: this.session_id,
62
- file_path: get_agent_session_active_messages_path(
63
- this.storage_root_path,
64
- this.origin.type,
65
- this.session_id,
66
- ),
67
- assistant_message_file_path: get_agent_session_assistant_message_path(
68
- this.storage_root_path,
69
- this.origin.type,
70
- this.session_id,
19
+ super({
20
+ session_id: options.session_id,
21
+ agent_id: options.agent_id,
22
+ ...(options.workspace_id ? { workspace_id: options.workspace_id } : {}),
23
+ origin: options.origin,
24
+ database_path: get_agent_session_database_path(
25
+ options.storage_root_path,
26
+ options.origin.type,
27
+ options.session_id,
71
28
  ),
29
+ database_location: options.database_location,
30
+ files: options.files,
31
+ attachments: new LocalSessionAttachmentStore({
32
+ files: options.files,
33
+ attachments_dir_path: get_agent_session_attachments_path(
34
+ options.storage_root_path,
35
+ options.origin.type,
36
+ options.session_id,
37
+ ),
38
+ }),
72
39
  });
73
- this.attachments = new LocalSessionAttachmentStore({
74
- files: this.files,
75
- attachments_dir_path: get_agent_session_attachments_path(
76
- this.storage_root_path,
77
- this.origin.type,
78
- this.session_id,
79
- ),
80
- });
81
- }
82
-
83
- /** 读取规范化 Session Metadata。 */
84
- async read_metadata(): Promise<SessionHistoryMeta> {
85
- try {
86
- const raw = JSON.parse(
87
- (await this.files.read_file(this.metadata_path())).toString("utf8"),
88
- ) as Partial<SessionHistoryMeta>;
89
- const metadata = normalize_session_metadata(
90
- raw,
91
- this.session_id,
92
- this.agent_id,
93
- this.origin,
94
- this.workspace_id,
95
- );
96
- if (raw.agent_id !== this.agent_id) {
97
- throw new Error(
98
- `Session "${this.session_id}" belongs to another Agent`,
99
- );
100
- }
101
- return metadata;
102
- } catch {
103
- if (await this.files.path_exists(this.metadata_path())) {
104
- throw new Error(
105
- `Invalid Session ownership metadata: ${this.session_id}`,
106
- );
107
- }
108
- return normalize_session_metadata(
109
- {},
110
- this.session_id,
111
- this.agent_id,
112
- this.origin,
113
- this.workspace_id,
114
- );
115
- }
116
- }
117
-
118
- /** 写入完整 Session Metadata。 */
119
- async write_metadata(metadata: SessionHistoryMeta): Promise<void> {
120
- const normalized = normalize_session_metadata(
121
- metadata,
122
- this.session_id,
123
- this.agent_id,
124
- this.origin,
125
- this.workspace_id,
126
- );
127
- if (!isDeepStrictEqual(normalized.origin, this.origin)) {
128
- throw new Error(`Session "${this.session_id}" origin is immutable`);
129
- }
130
- const metadata_path = this.metadata_path();
131
- await this.files.with_file_lock(`${metadata_path}.lock`, async () => {
132
- if (await this.files.path_exists(metadata_path)) {
133
- const existing = JSON.parse(
134
- (await this.files.read_file(metadata_path)).toString("utf8"),
135
- ) as Partial<SessionHistoryMeta>;
136
- if (existing.session_id !== this.session_id || existing.agent_id !== this.agent_id) {
137
- throw new Error(
138
- `Session "${this.session_id}" belongs to another Agent`,
139
- );
140
- }
141
- if (!isDeepStrictEqual(existing.origin, normalized.origin)) {
142
- throw new Error(`Session "${this.session_id}" origin is immutable`);
143
- }
144
- }
145
- await this.files.write_file_atomically(
146
- metadata_path,
147
- `${JSON.stringify(normalized, null, 2)}\n`,
148
- );
149
- });
150
- }
151
-
152
- /** 判断显式 system 快照是否存在。 */
153
- async has_instruction(): Promise<boolean> {
154
- return await this.files.path_exists(this.instruction_path());
155
- }
156
-
157
- /** 读取显式 system 快照。 */
158
- async read_instruction(): Promise<string | null> {
159
- if (!(await this.has_instruction())) return null;
160
- return (await this.files.read_file(this.instruction_path())).toString("utf8");
161
- }
162
-
163
- /** 写入显式 system 快照。 */
164
- async write_instruction(instruction: string): Promise<void> {
165
- const instruction_path = get_agent_session_instruction_path(
166
- this.storage_root_path,
167
- this.origin.type,
168
- this.session_id,
169
- );
170
- await this.files.write_file_atomically(instruction_path, instruction);
171
- }
172
-
173
- /** 返回当前 Session instruction.md 的 Agent Storage 路径。 */
174
- private instruction_path(): string {
175
- return get_agent_session_instruction_path(
176
- this.storage_root_path,
177
- this.origin.type,
178
- this.session_id,
179
- );
180
- }
181
-
182
- /** 返回当前 Session meta.json 的 Agent Storage 路径。 */
183
- private metadata_path(): string {
184
- return get_agent_session_meta_path(
185
- this.storage_root_path,
186
- this.origin.type,
187
- this.session_id,
188
- );
189
40
  }
190
41
  }