@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
@@ -0,0 +1,465 @@
1
+ /**
2
+ * Session Message 聚合与 SQLite rows 之间的唯一 codec。
3
+ *
4
+ * Message envelope 与 Part 分表保存;公开领域对象仍保持 Message 聚合拥有 parts[]。
5
+ */
6
+
7
+ import type {
8
+ JsonObject,
9
+ JsonValue,
10
+ SessionAgentMessagePart,
11
+ SessionInteractionRequest,
12
+ SessionInteractionResponse,
13
+ SessionMessage,
14
+ SessionUserMessagePart,
15
+ } from "@downcity/type";
16
+
17
+ /** messages 表读取行。 */
18
+ export interface SessionMessageRow {
19
+ /** Message 稳定标识。 */
20
+ message_id: string;
21
+ /** 所属 Turn;独立 Session Action 可以为空。 */
22
+ turn_id: string | null;
23
+ /** Session 内 Message 顺序。 */
24
+ sequence: number;
25
+ /** Message 聚合版本。 */
26
+ revision: number;
27
+ /** Message 主体角色。 */
28
+ role: "user" | "agent";
29
+ /** Agent Message 写入状态;User Message 固定为空。 */
30
+ state: "streaming" | "done" | null;
31
+ /** 默认展示范围。 */
32
+ visibility: "visible" | "internal";
33
+ /** Fork 来源 Session。 */
34
+ origin_session_id: string | null;
35
+ /** Fork 来源 Message。 */
36
+ origin_message_id: string | null;
37
+ /** Fork 来源 Turn。 */
38
+ origin_turn_id: string | null;
39
+ /** 创建时间戳。 */
40
+ created_at: number;
41
+ /** 更新时间戳。 */
42
+ updated_at: number;
43
+ }
44
+
45
+ /** message_parts 表读取行。 */
46
+ export interface SessionMessagePartRow {
47
+ /** Part 稳定标识。 */
48
+ part_id: string;
49
+ /** 所属 Message。 */
50
+ message_id: string;
51
+ /** Message 内 Part 顺序。 */
52
+ sequence: number;
53
+ /** 来源模型 Step。 */
54
+ step_id: string | null;
55
+ /** Part 内容类型。 */
56
+ type: SessionUserMessagePart["type"] | SessionAgentMessagePart["type"];
57
+ /** 单个 Part 的类型专属 JSON 内容。 */
58
+ content: string;
59
+ /** 创建时间戳。 */
60
+ created_at: number;
61
+ /** 更新时间戳。 */
62
+ updated_at: number;
63
+ }
64
+
65
+ /** 把 Message 聚合拆为数据库 envelope row。 */
66
+ export function encode_session_message_row(message: SessionMessage): SessionMessageRow {
67
+ return {
68
+ message_id: message.message_id,
69
+ turn_id: message.turn_id ?? null,
70
+ sequence: message.sequence,
71
+ revision: message.revision,
72
+ role: message.role,
73
+ state: message.role === "agent" ? message.state : null,
74
+ visibility: message.visibility,
75
+ origin_session_id: message.origin?.session_id ?? null,
76
+ origin_message_id: message.origin?.message_id ?? null,
77
+ origin_turn_id: message.origin?.turn_id ?? null,
78
+ created_at: message.created_at,
79
+ updated_at: message.updated_at,
80
+ };
81
+ }
82
+
83
+ /** 把一个领域 Part 拆为独立数据库 row。 */
84
+ export function encode_session_part_row(
85
+ message: SessionMessage,
86
+ part: SessionUserMessagePart | SessionAgentMessagePart,
87
+ ): SessionMessagePartRow {
88
+ const { part_id, sequence, type, ...content } = part;
89
+ const step_id = "step_id" in content && typeof content.step_id === "string"
90
+ ? content.step_id
91
+ : null;
92
+ if ("step_id" in content) delete content.step_id;
93
+ return {
94
+ part_id,
95
+ message_id: message.message_id,
96
+ sequence,
97
+ step_id,
98
+ type,
99
+ content: JSON.stringify(content),
100
+ created_at: message.created_at,
101
+ updated_at: message.updated_at,
102
+ };
103
+ }
104
+
105
+ /** 把 envelope 与按顺序读取的 Part rows 组装为公开 Message。 */
106
+ export function decode_session_message(
107
+ row: SessionMessageRow,
108
+ part_rows: readonly SessionMessagePartRow[],
109
+ session_id: string,
110
+ ): SessionMessage {
111
+ const origin = row.origin_session_id && row.origin_message_id
112
+ ? {
113
+ session_id: row.origin_session_id,
114
+ message_id: row.origin_message_id,
115
+ ...(row.origin_turn_id ? { turn_id: row.origin_turn_id } : {}),
116
+ }
117
+ : undefined;
118
+ const parts = part_rows
119
+ .map((part_row) => decode_session_part(part_row, row.role))
120
+ .sort((left, right) => left.sequence - right.sequence);
121
+ const base = {
122
+ message_id: row.message_id,
123
+ session_id,
124
+ ...(row.turn_id ? { turn_id: row.turn_id } : {}),
125
+ sequence: row.sequence,
126
+ revision: row.revision,
127
+ visibility: row.visibility,
128
+ created_at: row.created_at,
129
+ updated_at: row.updated_at,
130
+ ...(origin ? { origin } : {}),
131
+ };
132
+ if (row.role === "user") {
133
+ const user_parts = parts.filter(is_session_user_part);
134
+ if (row.state !== null || user_parts.length !== parts.length) {
135
+ throw new Error(`Invalid persisted User Message: ${row.message_id}`);
136
+ }
137
+ return {
138
+ ...base,
139
+ role: "user",
140
+ parts: user_parts,
141
+ };
142
+ }
143
+ const agent_parts = parts.filter(is_session_agent_part);
144
+ if (!row.state || agent_parts.length !== parts.length) {
145
+ throw new Error(`Invalid persisted Agent Message: ${row.message_id}`);
146
+ }
147
+ return {
148
+ ...base,
149
+ role: "agent",
150
+ state: row.state,
151
+ parts: agent_parts,
152
+ };
153
+ }
154
+
155
+ /** 解码单个 Part 的类型专属 content。 */
156
+ function decode_session_part(
157
+ row: SessionMessagePartRow,
158
+ role: SessionMessageRow["role"],
159
+ ): SessionUserMessagePart | SessionAgentMessagePart {
160
+ const content = parse_part_content(row);
161
+ const identity = {
162
+ part_id: row.part_id,
163
+ sequence: row.sequence,
164
+ ...(row.step_id ? { step_id: row.step_id } : {}),
165
+ };
166
+ switch (row.type) {
167
+ case "text":
168
+ if (role === "user") {
169
+ if (row.step_id) throw invalid_part(row, "User text cannot have step_id");
170
+ if (content.state !== undefined) {
171
+ throw invalid_part(row, "User text cannot have streaming state");
172
+ }
173
+ return {
174
+ part_id: row.part_id,
175
+ sequence: row.sequence,
176
+ type: "text",
177
+ text: read_string(content, "text", row),
178
+ };
179
+ }
180
+ return {
181
+ ...identity,
182
+ type: "text",
183
+ text: read_string(content, "text", row),
184
+ state: read_enum(content, "state", ["streaming", "done"], row),
185
+ };
186
+ case "context":
187
+ if (row.step_id) throw invalid_part(row, "User context cannot have step_id");
188
+ return {
189
+ part_id: row.part_id,
190
+ sequence: row.sequence,
191
+ type: "context",
192
+ tag: read_string(content, "tag", row),
193
+ context: read_string(content, "context", row),
194
+ };
195
+ case "reasoning":
196
+ return {
197
+ ...identity,
198
+ type: "reasoning",
199
+ text: read_string(content, "text", row),
200
+ state: read_enum(content, "state", ["streaming", "done"], row),
201
+ ...optional_string(content, "reasoning_signature", row),
202
+ };
203
+ case "tool":
204
+ return {
205
+ ...identity,
206
+ type: "tool",
207
+ tool_call_id: read_string(content, "tool_call_id", row),
208
+ tool_name: read_string(content, "tool_name", row),
209
+ state: read_enum(
210
+ content,
211
+ "state",
212
+ ["input-streaming", "ready", "waiting-user", "running", "completed", "failed"],
213
+ row,
214
+ ),
215
+ ...optional_string(content, "input_text", row),
216
+ ...optional_json(content, "input"),
217
+ ...optional_json(content, "output"),
218
+ ...optional_string(content, "error", row),
219
+ ...optional_string(content, "title", row),
220
+ };
221
+ case "interaction":
222
+ return {
223
+ ...identity,
224
+ type: "interaction",
225
+ interaction_id: read_string(content, "interaction_id", row),
226
+ interaction_type: read_string(content, "interaction_type", row),
227
+ status: read_enum(
228
+ content,
229
+ "status",
230
+ ["pending", "resolved", "denied", "expired", "cancelled", "failed"],
231
+ row,
232
+ ),
233
+ request: decode_interaction_request(content.request, row),
234
+ ...(content.response === undefined
235
+ ? {}
236
+ : { response: decode_interaction_response(content.response, row) }),
237
+ ...optional_number(content, "resolved_at", row),
238
+ ...(content.cancel_reason === undefined
239
+ ? {}
240
+ : {
241
+ cancel_reason: read_enum(
242
+ content,
243
+ "cancel_reason",
244
+ ["turn_stopped", "session_disposed", "runtime_interrupted"],
245
+ row,
246
+ ),
247
+ }),
248
+ };
249
+ case "file":
250
+ return {
251
+ ...identity,
252
+ type: "file",
253
+ media_type: read_string(content, "media_type", row),
254
+ url: read_string(content, "url", row),
255
+ ...optional_string(content, "filename", row),
256
+ };
257
+ case "data":
258
+ return {
259
+ ...identity,
260
+ type: "data",
261
+ data_type: read_string(content, "data_type", row),
262
+ data: read_json(content, "data", row),
263
+ ...optional_string(content, "data_id", row),
264
+ };
265
+ case "action":
266
+ return {
267
+ ...identity,
268
+ type: "action",
269
+ action_id: read_string(content, "action_id", row),
270
+ action_type: read_string(content, "action_type", row),
271
+ state: read_enum(content, "state", ["running", "completed", "failed"], row),
272
+ title: read_string(content, "title", row),
273
+ ...optional_string(content, "description", row),
274
+ ...(content.data === undefined
275
+ ? {}
276
+ : { data: read_json_object(content, "data", row) }),
277
+ };
278
+ case "error":
279
+ return {
280
+ ...identity,
281
+ type: "error",
282
+ scope: read_enum(content, "scope", ["session", "turn"], row),
283
+ code: read_string(content, "code", row),
284
+ message: read_string(content, "message", row),
285
+ recoverable: read_boolean(content, "recoverable", row),
286
+ };
287
+ default:
288
+ return assert_never(row.type);
289
+ }
290
+ }
291
+
292
+ /** 判断解码结果是否符合 User Message 的封闭 Part 集合。 */
293
+ function is_session_user_part(
294
+ part: SessionUserMessagePart | SessionAgentMessagePart,
295
+ ): part is SessionUserMessagePart {
296
+ if ("step_id" in part) return false;
297
+ return part.type === "text" || part.type === "context" ||
298
+ part.type === "file" || part.type === "data";
299
+ }
300
+
301
+ /** 判断解码结果是否符合 Agent Message 的封闭 Part 集合。 */
302
+ function is_session_agent_part(
303
+ part: SessionUserMessagePart | SessionAgentMessagePart,
304
+ ): part is SessionAgentMessagePart {
305
+ return part.type !== "context" &&
306
+ (part.type !== "text" || "state" in part);
307
+ }
308
+
309
+ /** 解析单个 Part 的 JSON 对象,并拒绝数组、null 与损坏内容。 */
310
+ function parse_part_content(row: SessionMessagePartRow): Record<string, unknown> {
311
+ let value: unknown;
312
+ try {
313
+ value = JSON.parse(row.content);
314
+ } catch (error) {
315
+ throw invalid_part(row, `content is not valid JSON: ${String(error)}`);
316
+ }
317
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
318
+ throw invalid_part(row, "content must be a JSON object");
319
+ }
320
+ return value as Record<string, unknown>;
321
+ }
322
+
323
+ /** 读取必需字符串字段。 */
324
+ function read_string(
325
+ content: Record<string, unknown>,
326
+ key: string,
327
+ row: SessionMessagePartRow,
328
+ ): string {
329
+ const value = content[key];
330
+ if (typeof value !== "string") throw invalid_part(row, `${key} must be a string`);
331
+ return value;
332
+ }
333
+
334
+ /** 读取可选字符串字段,并保留原字段名。 */
335
+ function optional_string(
336
+ content: Record<string, unknown>,
337
+ key: string,
338
+ row: SessionMessagePartRow,
339
+ ): Record<string, string> {
340
+ if (content[key] === undefined) return {};
341
+ return { [key]: read_string(content, key, row) };
342
+ }
343
+
344
+ /** 读取可选有限数字字段,并保留原字段名。 */
345
+ function optional_number(
346
+ content: Record<string, unknown>,
347
+ key: string,
348
+ row: SessionMessagePartRow,
349
+ ): Record<string, number> {
350
+ if (content[key] === undefined) return {};
351
+ const value = content[key];
352
+ if (typeof value !== "number" || !Number.isFinite(value)) {
353
+ throw invalid_part(row, `${key} must be a finite number`);
354
+ }
355
+ return { [key]: value };
356
+ }
357
+
358
+ /** 读取必需布尔字段。 */
359
+ function read_boolean(
360
+ content: Record<string, unknown>,
361
+ key: string,
362
+ row: SessionMessagePartRow,
363
+ ): boolean {
364
+ const value = content[key];
365
+ if (typeof value !== "boolean") throw invalid_part(row, `${key} must be a boolean`);
366
+ return value;
367
+ }
368
+
369
+ /** 读取封闭字符串枚举字段。 */
370
+ function read_enum<const TValue extends string>(
371
+ content: Record<string, unknown>,
372
+ key: string,
373
+ values: readonly TValue[],
374
+ row: SessionMessagePartRow,
375
+ ): TValue {
376
+ const value = content[key];
377
+ if (typeof value !== "string" || !values.includes(value as TValue)) {
378
+ throw invalid_part(row, `${key} has an unsupported value`);
379
+ }
380
+ return value as TValue;
381
+ }
382
+
383
+ /** 读取必需 JSON 字段。 */
384
+ function read_json(
385
+ content: Record<string, unknown>,
386
+ key: string,
387
+ row: SessionMessagePartRow,
388
+ ): JsonValue {
389
+ if (!Object.prototype.hasOwnProperty.call(content, key)) {
390
+ throw invalid_part(row, `${key} is required`);
391
+ }
392
+ return content[key] as JsonValue;
393
+ }
394
+
395
+ /** 读取可选 JSON 字段,并保留原字段名。 */
396
+ function optional_json(
397
+ content: Record<string, unknown>,
398
+ key: string,
399
+ ): Record<string, JsonValue> {
400
+ return Object.prototype.hasOwnProperty.call(content, key)
401
+ ? { [key]: content[key] as JsonValue }
402
+ : {};
403
+ }
404
+
405
+ /** 读取必需 JSON object 字段。 */
406
+ function read_json_object(
407
+ content: Record<string, unknown>,
408
+ key: string,
409
+ row: SessionMessagePartRow,
410
+ ): JsonObject {
411
+ const value = content[key];
412
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
413
+ throw invalid_part(row, `${key} must be a JSON object`);
414
+ }
415
+ return value as JsonObject;
416
+ }
417
+
418
+ /** 校验并读取持久化 Interaction 请求。 */
419
+ function decode_interaction_request(
420
+ value: unknown,
421
+ row: SessionMessagePartRow,
422
+ ): SessionInteractionRequest {
423
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
424
+ throw invalid_part(row, "request must be a JSON object");
425
+ }
426
+ const request = value as Record<string, unknown>;
427
+ read_string(request, "interaction_id", row);
428
+ read_string(request, "turn_id", row);
429
+ read_string(request, "type", row);
430
+ read_json(request, "payload", row);
431
+ const source = read_json_object(request, "source", row);
432
+ if (!["tool", "plugin", "shell", "execution"].includes(String(source.type))) {
433
+ throw invalid_part(row, "request.source.type has an unsupported value");
434
+ }
435
+ const created_at = request.created_at;
436
+ if (typeof created_at !== "number" || !Number.isFinite(created_at)) {
437
+ throw invalid_part(row, "request.created_at must be a finite number");
438
+ }
439
+ return value as SessionInteractionRequest;
440
+ }
441
+
442
+ /** 校验并读取持久化 Interaction 响应。 */
443
+ function decode_interaction_response(
444
+ value: unknown,
445
+ row: SessionMessagePartRow,
446
+ ): SessionInteractionResponse {
447
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
448
+ throw invalid_part(row, "response must be a JSON object");
449
+ }
450
+ const response = value as Record<string, unknown>;
451
+ read_string(response, "type", row);
452
+ read_enum(response, "outcome", ["resolved", "denied"], row);
453
+ read_json(response, "payload", row);
454
+ return value as SessionInteractionResponse;
455
+ }
456
+
457
+ /** 构造带稳定 Part 身份的存储损坏错误。 */
458
+ function invalid_part(row: SessionMessagePartRow, reason: string): Error {
459
+ return new Error(`Invalid persisted Session Part ${row.part_id} (${row.type}): ${reason}`);
460
+ }
461
+
462
+ /** schema 联合类型增加成员时强制 codec 显式解码。 */
463
+ function assert_never(value: never): never {
464
+ throw new Error(`Unsupported persisted Session Part type: ${String(value)}`);
465
+ }
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Session SQLite 核心 schema。
3
+ *
4
+ * 这里只定义所有 Composer 共享的 canonical 表和持久化约束;任何摘要、索引或
5
+ * 检索表都由具体 Context Policy 在自己的 namespace 中创建。
6
+ */
7
+
8
+ /** 当前 Session SQLite schema 版本。 */
9
+ export const SESSION_STORAGE_SCHEMA_VERSION = 3;
10
+
11
+ /** 创建 Session canonical 表、索引与角色约束。 */
12
+ export const SESSION_STORAGE_SCHEMA_SQL = `
13
+ PRAGMA foreign_keys = ON;
14
+
15
+ CREATE TABLE IF NOT EXISTS session_state (
16
+ singleton_id INTEGER PRIMARY KEY CHECK (singleton_id = 1),
17
+ session_id TEXT NOT NULL UNIQUE,
18
+ agent_id TEXT NOT NULL,
19
+ workspace_id TEXT,
20
+ origin TEXT NOT NULL CHECK (json_valid(origin)),
21
+ timezone TEXT NOT NULL,
22
+ title TEXT,
23
+ model_label TEXT,
24
+ approval_mode TEXT CHECK (
25
+ approval_mode IS NULL OR approval_mode IN ('ask', 'always-allow')
26
+ ),
27
+ system_snapshot TEXT,
28
+ message_count INTEGER NOT NULL DEFAULT 0 CHECK (message_count >= 0),
29
+ preview_text TEXT,
30
+ revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
31
+ created_at INTEGER NOT NULL,
32
+ updated_at INTEGER NOT NULL
33
+ );
34
+
35
+ CREATE TABLE IF NOT EXISTS messages (
36
+ message_id TEXT PRIMARY KEY,
37
+ turn_id TEXT,
38
+ sequence INTEGER NOT NULL UNIQUE CHECK (sequence >= 1),
39
+ revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
40
+ role TEXT NOT NULL CHECK (role IN ('user', 'agent')),
41
+ state TEXT CHECK (
42
+ state IS NULL OR state IN ('streaming', 'done')
43
+ ),
44
+ visibility TEXT NOT NULL CHECK (visibility IN ('visible', 'internal')),
45
+ origin_session_id TEXT,
46
+ origin_message_id TEXT,
47
+ origin_turn_id TEXT,
48
+ created_at INTEGER NOT NULL,
49
+ updated_at INTEGER NOT NULL,
50
+ CHECK (
51
+ (role = 'user' AND state IS NULL) OR
52
+ (role = 'agent' AND state IS NOT NULL)
53
+ )
54
+ );
55
+
56
+ CREATE TABLE IF NOT EXISTS message_parts (
57
+ part_id TEXT PRIMARY KEY,
58
+ message_id TEXT NOT NULL REFERENCES messages(message_id) ON DELETE CASCADE,
59
+ sequence INTEGER NOT NULL CHECK (sequence >= 1),
60
+ step_id TEXT,
61
+ type TEXT NOT NULL CHECK (
62
+ type IN (
63
+ 'text', 'context', 'reasoning', 'tool', 'interaction',
64
+ 'file', 'data', 'action', 'error'
65
+ )
66
+ ),
67
+ content TEXT NOT NULL CHECK (json_valid(content)),
68
+ created_at INTEGER NOT NULL,
69
+ updated_at INTEGER NOT NULL,
70
+ UNIQUE(message_id, sequence)
71
+ );
72
+
73
+ CREATE INDEX IF NOT EXISTS messages_turn_sequence_index
74
+ ON messages(turn_id, sequence);
75
+
76
+ CREATE INDEX IF NOT EXISTS messages_visibility_sequence_index
77
+ ON messages(visibility, sequence);
78
+
79
+ CREATE INDEX IF NOT EXISTS message_parts_message_sequence_index
80
+ ON message_parts(message_id, sequence);
81
+
82
+ CREATE INDEX IF NOT EXISTS message_parts_step_index
83
+ ON message_parts(step_id, message_id, sequence);
84
+
85
+ CREATE INDEX IF NOT EXISTS message_parts_type_index
86
+ ON message_parts(type, message_id);
87
+
88
+ CREATE TRIGGER IF NOT EXISTS messages_role_immutable
89
+ BEFORE UPDATE OF role ON messages
90
+ WHEN OLD.role <> NEW.role
91
+ BEGIN
92
+ SELECT RAISE(ABORT, 'message role is immutable');
93
+ END;
94
+
95
+ CREATE TRIGGER IF NOT EXISTS message_parts_validate_role_insert
96
+ BEFORE INSERT ON message_parts
97
+ WHEN NOT (
98
+ (
99
+ (SELECT role FROM messages WHERE message_id = NEW.message_id) = 'user'
100
+ AND NEW.type IN ('text', 'context', 'file', 'data')
101
+ ) OR
102
+ (
103
+ (SELECT role FROM messages WHERE message_id = NEW.message_id) = 'agent'
104
+ AND NEW.type IN (
105
+ 'text', 'reasoning', 'tool', 'interaction',
106
+ 'file', 'data', 'action', 'error'
107
+ )
108
+ )
109
+ )
110
+ BEGIN
111
+ SELECT RAISE(ABORT, 'message part type is incompatible with message role');
112
+ END;
113
+
114
+ CREATE TRIGGER IF NOT EXISTS message_parts_validate_role_update
115
+ BEFORE UPDATE OF message_id, type ON message_parts
116
+ WHEN NOT (
117
+ (
118
+ (SELECT role FROM messages WHERE message_id = NEW.message_id) = 'user'
119
+ AND NEW.type IN ('text', 'context', 'file', 'data')
120
+ ) OR
121
+ (
122
+ (SELECT role FROM messages WHERE message_id = NEW.message_id) = 'agent'
123
+ AND NEW.type IN (
124
+ 'text', 'reasoning', 'tool', 'interaction',
125
+ 'file', 'data', 'action', 'error'
126
+ )
127
+ )
128
+ )
129
+ BEGIN
130
+ SELECT RAISE(ABORT, 'message part type is incompatible with message role');
131
+ END;
132
+ `;