actoviq-agent-sdk 0.4.6 → 0.4.7

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 (637) hide show
  1. package/CHANGELOG.md +203 -0
  2. package/README-zh.md +54 -19
  3. package/README.md +53 -19
  4. package/SECURITY.md +26 -0
  5. package/assets/actoviq-icon.ico +0 -0
  6. package/bin/actoviq-gui.js +28 -3
  7. package/dist/src/buddy/actoviqBuddy.d.ts.map +1 -1
  8. package/dist/src/buddy/actoviqBuddy.js +3 -4
  9. package/dist/src/buddy/actoviqBuddy.js.map +1 -1
  10. package/dist/src/cli/actoviq-react.js +495 -60
  11. package/dist/src/cli/actoviq-react.js.map +1 -1
  12. package/dist/src/compat/diagnostics.d.ts +18 -0
  13. package/dist/src/compat/diagnostics.d.ts.map +1 -0
  14. package/dist/src/compat/diagnostics.js +47 -0
  15. package/dist/src/compat/diagnostics.js.map +1 -0
  16. package/dist/src/compat/index.d.ts +8 -0
  17. package/dist/src/compat/index.d.ts.map +1 -0
  18. package/dist/src/compat/index.js +6 -0
  19. package/dist/src/compat/index.js.map +1 -0
  20. package/dist/src/config/actoviqHome.d.ts +32 -0
  21. package/dist/src/config/actoviqHome.d.ts.map +1 -0
  22. package/dist/src/config/actoviqHome.js +228 -0
  23. package/dist/src/config/actoviqHome.js.map +1 -0
  24. package/dist/src/config/actoviqSettingsStore.d.ts.map +1 -1
  25. package/dist/src/config/actoviqSettingsStore.js +6 -6
  26. package/dist/src/config/actoviqSettingsStore.js.map +1 -1
  27. package/dist/src/config/agentProfiles.d.ts +77 -0
  28. package/dist/src/config/agentProfiles.d.ts.map +1 -0
  29. package/dist/src/config/agentProfiles.js +319 -0
  30. package/dist/src/config/agentProfiles.js.map +1 -0
  31. package/dist/src/config/loadDefaultActoviqSettings.d.ts.map +1 -1
  32. package/dist/src/config/loadDefaultActoviqSettings.js +2 -3
  33. package/dist/src/config/loadDefaultActoviqSettings.js.map +1 -1
  34. package/dist/src/config/projectSessionDirectory.d.ts.map +1 -1
  35. package/dist/src/config/projectSessionDirectory.js +3 -2
  36. package/dist/src/config/projectSessionDirectory.js.map +1 -1
  37. package/dist/src/config/resolveRuntimeConfig.d.ts.map +1 -1
  38. package/dist/src/config/resolveRuntimeConfig.js +13 -2
  39. package/dist/src/config/resolveRuntimeConfig.js.map +1 -1
  40. package/dist/src/core/agent-spec.d.ts +74 -0
  41. package/dist/src/core/agent-spec.d.ts.map +1 -0
  42. package/dist/src/core/agent-spec.js +2 -0
  43. package/dist/src/core/agent-spec.js.map +1 -0
  44. package/dist/src/core/errors.d.ts +42 -0
  45. package/dist/src/core/errors.d.ts.map +1 -0
  46. package/dist/src/core/errors.js +53 -0
  47. package/dist/src/core/errors.js.map +1 -0
  48. package/dist/src/core/index.d.ts +11 -0
  49. package/dist/src/core/index.d.ts.map +1 -0
  50. package/dist/src/core/index.js +4 -0
  51. package/dist/src/core/index.js.map +1 -0
  52. package/dist/src/core/items.d.ts +161 -0
  53. package/dist/src/core/items.d.ts.map +1 -0
  54. package/dist/src/core/items.js +2 -0
  55. package/dist/src/core/items.js.map +1 -0
  56. package/dist/src/core/json.d.ts +20 -0
  57. package/dist/src/core/json.d.ts.map +1 -0
  58. package/dist/src/core/json.js +80 -0
  59. package/dist/src/core/json.js.map +1 -0
  60. package/dist/src/core/model-ref.d.ts +6 -0
  61. package/dist/src/core/model-ref.d.ts.map +1 -0
  62. package/dist/src/core/model-ref.js +2 -0
  63. package/dist/src/core/model-ref.js.map +1 -0
  64. package/dist/src/core/run.d.ts +35 -0
  65. package/dist/src/core/run.d.ts.map +1 -0
  66. package/dist/src/core/run.js +2 -0
  67. package/dist/src/core/run.js.map +1 -0
  68. package/dist/src/core/usage.d.ts +32 -0
  69. package/dist/src/core/usage.d.ts.map +1 -0
  70. package/dist/src/core/usage.js +111 -0
  71. package/dist/src/core/usage.js.map +1 -0
  72. package/dist/src/errors.d.ts +19 -0
  73. package/dist/src/errors.d.ts.map +1 -1
  74. package/dist/src/errors.js +27 -0
  75. package/dist/src/errors.js.map +1 -1
  76. package/dist/src/events/index.d.ts +4 -0
  77. package/dist/src/events/index.d.ts.map +1 -0
  78. package/dist/src/events/index.js +4 -0
  79. package/dist/src/events/index.js.map +1 -0
  80. package/dist/src/events/openTelemetry.d.ts +51 -0
  81. package/dist/src/events/openTelemetry.d.ts.map +1 -0
  82. package/dist/src/events/openTelemetry.js +116 -0
  83. package/dist/src/events/openTelemetry.js.map +1 -0
  84. package/dist/src/events/processors.d.ts +14 -0
  85. package/dist/src/events/processors.d.ts.map +1 -0
  86. package/dist/src/events/processors.js +60 -0
  87. package/dist/src/events/processors.js.map +1 -0
  88. package/dist/src/events/runEvents.d.ts +66 -0
  89. package/dist/src/events/runEvents.d.ts.map +1 -0
  90. package/dist/src/events/runEvents.js +143 -0
  91. package/dist/src/events/runEvents.js.map +1 -0
  92. package/dist/src/gui/actoviqGui.d.ts +15 -0
  93. package/dist/src/gui/actoviqGui.d.ts.map +1 -1
  94. package/dist/src/gui/actoviqGui.js +18034 -1919
  95. package/dist/src/gui/actoviqGui.js.map +1 -1
  96. package/dist/src/gui/contextRailStore.d.ts +47 -0
  97. package/dist/src/gui/contextRailStore.d.ts.map +1 -0
  98. package/dist/src/gui/contextRailStore.js +163 -0
  99. package/dist/src/gui/contextRailStore.js.map +1 -0
  100. package/dist/src/gui/electronMain.js +32 -16
  101. package/dist/src/gui/electronMain.js.map +1 -1
  102. package/dist/src/gui/guiAssets.d.ts +6 -0
  103. package/dist/src/gui/guiAssets.d.ts.map +1 -0
  104. package/dist/src/gui/guiAssets.js +48 -0
  105. package/dist/src/gui/guiAssets.js.map +1 -0
  106. package/dist/src/gui/guiSyntaxHighlight.d.ts +11 -0
  107. package/dist/src/gui/guiSyntaxHighlight.d.ts.map +1 -0
  108. package/dist/src/gui/guiSyntaxHighlight.js +348 -0
  109. package/dist/src/gui/guiSyntaxHighlight.js.map +1 -0
  110. package/dist/src/gui/projectMeta.d.ts +15 -0
  111. package/dist/src/gui/projectMeta.d.ts.map +1 -0
  112. package/dist/src/gui/projectMeta.js +61 -0
  113. package/dist/src/gui/projectMeta.js.map +1 -0
  114. package/dist/src/gui/projectWorkbench.d.ts +73 -0
  115. package/dist/src/gui/projectWorkbench.d.ts.map +1 -0
  116. package/dist/src/gui/projectWorkbench.js +307 -0
  117. package/dist/src/gui/projectWorkbench.js.map +1 -0
  118. package/dist/src/gui/terminalManager.d.ts +33 -0
  119. package/dist/src/gui/terminalManager.d.ts.map +1 -0
  120. package/dist/src/gui/terminalManager.js +206 -0
  121. package/dist/src/gui/terminalManager.js.map +1 -0
  122. package/dist/src/gui/transcript/clientBundle.d.ts +6 -0
  123. package/dist/src/gui/transcript/clientBundle.d.ts.map +1 -0
  124. package/dist/src/gui/transcript/clientBundle.js +978 -0
  125. package/dist/src/gui/transcript/clientBundle.js.map +1 -0
  126. package/dist/src/gui/transcript/index.d.ts +9 -0
  127. package/dist/src/gui/transcript/index.d.ts.map +1 -0
  128. package/dist/src/gui/transcript/index.js +6 -0
  129. package/dist/src/gui/transcript/index.js.map +1 -0
  130. package/dist/src/gui/transcript/parts.d.ts +81 -0
  131. package/dist/src/gui/transcript/parts.d.ts.map +1 -0
  132. package/dist/src/gui/transcript/parts.js +476 -0
  133. package/dist/src/gui/transcript/parts.js.map +1 -0
  134. package/dist/src/gui/transcript/registry.d.ts +8 -0
  135. package/dist/src/gui/transcript/registry.d.ts.map +1 -0
  136. package/dist/src/gui/transcript/registry.js +32 -0
  137. package/dist/src/gui/transcript/registry.js.map +1 -0
  138. package/dist/src/gui/transcript/scroll.d.ts +9 -0
  139. package/dist/src/gui/transcript/scroll.d.ts.map +1 -0
  140. package/dist/src/gui/transcript/scroll.js +13 -0
  141. package/dist/src/gui/transcript/scroll.js.map +1 -0
  142. package/dist/src/gui/transcript/styles.d.ts +3 -0
  143. package/dist/src/gui/transcript/styles.d.ts.map +1 -0
  144. package/dist/src/gui/transcript/styles.js +172 -0
  145. package/dist/src/gui/transcript/styles.js.map +1 -0
  146. package/dist/src/gui/workspaceNote.d.ts +4 -0
  147. package/dist/src/gui/workspaceNote.d.ts.map +1 -0
  148. package/dist/src/gui/workspaceNote.js +21 -0
  149. package/dist/src/gui/workspaceNote.js.map +1 -0
  150. package/dist/src/gui/workspaceRegistry.d.ts +11 -0
  151. package/dist/src/gui/workspaceRegistry.d.ts.map +1 -0
  152. package/dist/src/gui/workspaceRegistry.js +114 -0
  153. package/dist/src/gui/workspaceRegistry.js.map +1 -0
  154. package/dist/src/hooks/userHooks.d.ts +29 -8
  155. package/dist/src/hooks/userHooks.d.ts.map +1 -1
  156. package/dist/src/hooks/userHooks.js +106 -34
  157. package/dist/src/hooks/userHooks.js.map +1 -1
  158. package/dist/src/index.d.ts +24 -6
  159. package/dist/src/index.d.ts.map +1 -1
  160. package/dist/src/index.js +18 -6
  161. package/dist/src/index.js.map +1 -1
  162. package/dist/src/issues/durableIssueCoordinator.d.ts +57 -0
  163. package/dist/src/issues/durableIssueCoordinator.d.ts.map +1 -0
  164. package/dist/src/issues/durableIssueCoordinator.js +128 -0
  165. package/dist/src/issues/durableIssueCoordinator.js.map +1 -0
  166. package/dist/src/issues/issueExecution.d.ts +34 -0
  167. package/dist/src/issues/issueExecution.d.ts.map +1 -0
  168. package/dist/src/issues/issueExecution.js +190 -0
  169. package/dist/src/issues/issueExecution.js.map +1 -0
  170. package/dist/src/issues/issueStore.d.ts +95 -0
  171. package/dist/src/issues/issueStore.d.ts.map +1 -0
  172. package/dist/src/issues/issueStore.js +373 -0
  173. package/dist/src/issues/issueStore.js.map +1 -0
  174. package/dist/src/manager/projectManager.d.ts +103 -0
  175. package/dist/src/manager/projectManager.d.ts.map +1 -0
  176. package/dist/src/manager/projectManager.js +547 -0
  177. package/dist/src/manager/projectManager.js.map +1 -0
  178. package/dist/src/mcp/connectionManager.d.ts +22 -2
  179. package/dist/src/mcp/connectionManager.d.ts.map +1 -1
  180. package/dist/src/mcp/connectionManager.js +153 -41
  181. package/dist/src/mcp/connectionManager.js.map +1 -1
  182. package/dist/src/mcp/mcpServerConfig.d.ts.map +1 -1
  183. package/dist/src/mcp/mcpServerConfig.js +7 -7
  184. package/dist/src/mcp/mcpServerConfig.js.map +1 -1
  185. package/dist/src/memory/actoviqMemory.js +6 -6
  186. package/dist/src/memory/actoviqMemory.js.map +1 -1
  187. package/dist/src/memory/sessionHistory.js +2 -2
  188. package/dist/src/memory/sessionHistory.js.map +1 -1
  189. package/dist/src/node/index.d.ts +5 -0
  190. package/dist/src/node/index.d.ts.map +1 -0
  191. package/dist/src/node/index.js +5 -0
  192. package/dist/src/node/index.js.map +1 -0
  193. package/dist/src/node/sqliteCheckpointAdapter.d.ts +20 -0
  194. package/dist/src/node/sqliteCheckpointAdapter.d.ts.map +1 -0
  195. package/dist/src/node/sqliteCheckpointAdapter.js +163 -0
  196. package/dist/src/node/sqliteCheckpointAdapter.js.map +1 -0
  197. package/dist/src/node/sqliteDurableChildStore.d.ts +21 -0
  198. package/dist/src/node/sqliteDurableChildStore.d.ts.map +1 -0
  199. package/dist/src/node/sqliteDurableChildStore.js +124 -0
  200. package/dist/src/node/sqliteDurableChildStore.js.map +1 -0
  201. package/dist/src/node/sqliteSessionAdapter.d.ts +28 -0
  202. package/dist/src/node/sqliteSessionAdapter.d.ts.map +1 -0
  203. package/dist/src/node/sqliteSessionAdapter.js +99 -0
  204. package/dist/src/node/sqliteSessionAdapter.js.map +1 -0
  205. package/dist/src/orchestration/agentTool.d.ts +50 -0
  206. package/dist/src/orchestration/agentTool.d.ts.map +1 -0
  207. package/dist/src/orchestration/agentTool.js +132 -0
  208. package/dist/src/orchestration/agentTool.js.map +1 -0
  209. package/dist/src/orchestration/background.d.ts +102 -0
  210. package/dist/src/orchestration/background.d.ts.map +1 -0
  211. package/dist/src/orchestration/background.js +310 -0
  212. package/dist/src/orchestration/background.js.map +1 -0
  213. package/dist/src/orchestration/childRunner.d.ts +12 -0
  214. package/dist/src/orchestration/childRunner.d.ts.map +1 -0
  215. package/dist/src/orchestration/childRunner.js +179 -0
  216. package/dist/src/orchestration/childRunner.js.map +1 -0
  217. package/dist/src/orchestration/contracts.d.ts +169 -0
  218. package/dist/src/orchestration/contracts.d.ts.map +1 -0
  219. package/dist/src/orchestration/contracts.js +11 -0
  220. package/dist/src/orchestration/contracts.js.map +1 -0
  221. package/dist/src/orchestration/handoff.d.ts +32 -0
  222. package/dist/src/orchestration/handoff.d.ts.map +1 -0
  223. package/dist/src/orchestration/handoff.js +60 -0
  224. package/dist/src/orchestration/handoff.js.map +1 -0
  225. package/dist/src/orchestration/index.d.ts +9 -0
  226. package/dist/src/orchestration/index.d.ts.map +1 -0
  227. package/dist/src/orchestration/index.js +9 -0
  228. package/dist/src/orchestration/index.js.map +1 -0
  229. package/dist/src/orchestration/presets.d.ts +51 -0
  230. package/dist/src/orchestration/presets.d.ts.map +1 -0
  231. package/dist/src/orchestration/presets.js +78 -0
  232. package/dist/src/orchestration/presets.js.map +1 -0
  233. package/dist/src/orchestration/scope.d.ts +69 -0
  234. package/dist/src/orchestration/scope.d.ts.map +1 -0
  235. package/dist/src/orchestration/scope.js +371 -0
  236. package/dist/src/orchestration/scope.js.map +1 -0
  237. package/dist/src/orchestration/workflowGraph.d.ts +73 -0
  238. package/dist/src/orchestration/workflowGraph.d.ts.map +1 -0
  239. package/dist/src/orchestration/workflowGraph.js +255 -0
  240. package/dist/src/orchestration/workflowGraph.js.map +1 -0
  241. package/dist/src/parity/actoviqCleanBridgeCompatSdk.d.ts.map +1 -1
  242. package/dist/src/parity/actoviqCleanBridgeCompatSdk.js +101 -48
  243. package/dist/src/parity/actoviqCleanBridgeCompatSdk.js.map +1 -1
  244. package/dist/src/parity/bridgeConfigs.d.ts +2 -2
  245. package/dist/src/parity/bridgeConfigs.d.ts.map +1 -1
  246. package/dist/src/parity/bridgeConfigs.js +78 -39
  247. package/dist/src/parity/bridgeConfigs.js.map +1 -1
  248. package/dist/src/parity/bridgeProviders.d.ts +9 -6
  249. package/dist/src/parity/bridgeProviders.d.ts.map +1 -1
  250. package/dist/src/parity/bridgeProviders.js +140 -26
  251. package/dist/src/parity/bridgeProviders.js.map +1 -1
  252. package/dist/src/parity/portableSessions.js +2 -2
  253. package/dist/src/parity/portableSessions.js.map +1 -1
  254. package/dist/src/profiles/index.d.ts +15 -0
  255. package/dist/src/profiles/index.d.ts.map +1 -0
  256. package/dist/src/profiles/index.js +618 -0
  257. package/dist/src/profiles/index.js.map +1 -0
  258. package/dist/src/profiles/types.d.ts +102 -0
  259. package/dist/src/profiles/types.d.ts.map +1 -0
  260. package/dist/src/profiles/types.js +9 -0
  261. package/dist/src/profiles/types.js.map +1 -0
  262. package/dist/src/provider/client.d.ts +1 -1
  263. package/dist/src/provider/client.d.ts.map +1 -1
  264. package/dist/src/provider/openai-model-api.js +1 -1
  265. package/dist/src/provider/openai-model-api.js.map +1 -1
  266. package/dist/src/providers-v2/adapter-base.d.ts +35 -0
  267. package/dist/src/providers-v2/adapter-base.d.ts.map +1 -0
  268. package/dist/src/providers-v2/adapter-base.js +115 -0
  269. package/dist/src/providers-v2/adapter-base.js.map +1 -0
  270. package/dist/src/providers-v2/anthropic.d.ts +15 -0
  271. package/dist/src/providers-v2/anthropic.d.ts.map +1 -0
  272. package/dist/src/providers-v2/anthropic.js +414 -0
  273. package/dist/src/providers-v2/anthropic.js.map +1 -0
  274. package/dist/src/providers-v2/capabilities.d.ts +33 -0
  275. package/dist/src/providers-v2/capabilities.d.ts.map +1 -0
  276. package/dist/src/providers-v2/capabilities.js +218 -0
  277. package/dist/src/providers-v2/capabilities.js.map +1 -0
  278. package/dist/src/providers-v2/index.d.ts +12 -0
  279. package/dist/src/providers-v2/index.d.ts.map +1 -0
  280. package/dist/src/providers-v2/index.js +8 -0
  281. package/dist/src/providers-v2/index.js.map +1 -0
  282. package/dist/src/providers-v2/legacy.d.ts +26 -0
  283. package/dist/src/providers-v2/legacy.d.ts.map +1 -0
  284. package/dist/src/providers-v2/legacy.js +543 -0
  285. package/dist/src/providers-v2/legacy.js.map +1 -0
  286. package/dist/src/providers-v2/mapping.d.ts +34 -0
  287. package/dist/src/providers-v2/mapping.d.ts.map +1 -0
  288. package/dist/src/providers-v2/mapping.js +194 -0
  289. package/dist/src/providers-v2/mapping.js.map +1 -0
  290. package/dist/src/providers-v2/openai-chat.d.ts +16 -0
  291. package/dist/src/providers-v2/openai-chat.d.ts.map +1 -0
  292. package/dist/src/providers-v2/openai-chat.js +318 -0
  293. package/dist/src/providers-v2/openai-chat.js.map +1 -0
  294. package/dist/src/providers-v2/openai-responses.d.ts +15 -0
  295. package/dist/src/providers-v2/openai-responses.d.ts.map +1 -0
  296. package/dist/src/providers-v2/openai-responses.js +356 -0
  297. package/dist/src/providers-v2/openai-responses.js.map +1 -0
  298. package/dist/src/providers-v2/registry.d.ts +39 -0
  299. package/dist/src/providers-v2/registry.d.ts.map +1 -0
  300. package/dist/src/providers-v2/registry.js +101 -0
  301. package/dist/src/providers-v2/registry.js.map +1 -0
  302. package/dist/src/providers-v2/stream.d.ts +14 -0
  303. package/dist/src/providers-v2/stream.d.ts.map +1 -0
  304. package/dist/src/providers-v2/stream.js +115 -0
  305. package/dist/src/providers-v2/stream.js.map +1 -0
  306. package/dist/src/providers-v2/transport.d.ts +36 -0
  307. package/dist/src/providers-v2/transport.d.ts.map +1 -0
  308. package/dist/src/providers-v2/transport.js +337 -0
  309. package/dist/src/providers-v2/transport.js.map +1 -0
  310. package/dist/src/providers-v2/types.d.ts +162 -0
  311. package/dist/src/providers-v2/types.d.ts.map +1 -0
  312. package/dist/src/providers-v2/types.js +8 -0
  313. package/dist/src/providers-v2/types.js.map +1 -0
  314. package/dist/src/router/modelRouter.d.ts.map +1 -1
  315. package/dist/src/router/modelRouter.js +2 -3
  316. package/dist/src/router/modelRouter.js.map +1 -1
  317. package/dist/src/runtime/actoviqAgents.d.ts +5 -0
  318. package/dist/src/runtime/actoviqAgents.d.ts.map +1 -1
  319. package/dist/src/runtime/actoviqAgents.js +22 -4
  320. package/dist/src/runtime/actoviqAgents.js.map +1 -1
  321. package/dist/src/runtime/actoviqBackgroundTasks.d.ts +2 -1
  322. package/dist/src/runtime/actoviqBackgroundTasks.d.ts.map +1 -1
  323. package/dist/src/runtime/actoviqBackgroundTasks.js +4 -2
  324. package/dist/src/runtime/actoviqBackgroundTasks.js.map +1 -1
  325. package/dist/src/runtime/actoviqCompact.d.ts +15 -0
  326. package/dist/src/runtime/actoviqCompact.d.ts.map +1 -1
  327. package/dist/src/runtime/actoviqCompact.js +36 -10
  328. package/dist/src/runtime/actoviqCompact.js.map +1 -1
  329. package/dist/src/runtime/actoviqModelApi.d.ts.map +1 -1
  330. package/dist/src/runtime/actoviqModelApi.js +16 -2
  331. package/dist/src/runtime/actoviqModelApi.js.map +1 -1
  332. package/dist/src/runtime/actoviqPermissions.js +5 -1
  333. package/dist/src/runtime/actoviqPermissions.js.map +1 -1
  334. package/dist/src/runtime/agentClient.d.ts +3 -0
  335. package/dist/src/runtime/agentClient.d.ts.map +1 -1
  336. package/dist/src/runtime/agentClient.js +127 -45
  337. package/dist/src/runtime/agentClient.js.map +1 -1
  338. package/dist/src/runtime/agentRuntimeDiscovery.d.ts +75 -0
  339. package/dist/src/runtime/agentRuntimeDiscovery.d.ts.map +1 -0
  340. package/dist/src/runtime/agentRuntimeDiscovery.js +311 -0
  341. package/dist/src/runtime/agentRuntimeDiscovery.js.map +1 -0
  342. package/dist/src/runtime/agentSession.d.ts +18 -0
  343. package/dist/src/runtime/agentSession.d.ts.map +1 -1
  344. package/dist/src/runtime/agentSession.js +36 -0
  345. package/dist/src/runtime/agentSession.js.map +1 -1
  346. package/dist/src/runtime/asyncQueue.d.ts +99 -8
  347. package/dist/src/runtime/asyncQueue.d.ts.map +1 -1
  348. package/dist/src/runtime/asyncQueue.js +437 -37
  349. package/dist/src/runtime/asyncQueue.js.map +1 -1
  350. package/dist/src/runtime/conversationEngine.d.ts +7 -0
  351. package/dist/src/runtime/conversationEngine.d.ts.map +1 -1
  352. package/dist/src/runtime/conversationEngine.js +278 -18
  353. package/dist/src/runtime/conversationEngine.js.map +1 -1
  354. package/dist/src/runtime/deadline.d.ts +13 -0
  355. package/dist/src/runtime/deadline.d.ts.map +1 -0
  356. package/dist/src/runtime/deadline.js +67 -0
  357. package/dist/src/runtime/deadline.js.map +1 -0
  358. package/dist/src/runtime/messageUtils.d.ts +5 -0
  359. package/dist/src/runtime/messageUtils.d.ts.map +1 -1
  360. package/dist/src/runtime/messageUtils.js +17 -0
  361. package/dist/src/runtime/messageUtils.js.map +1 -1
  362. package/dist/src/runtime/sessionTurnCoordinator.d.ts +12 -0
  363. package/dist/src/runtime/sessionTurnCoordinator.d.ts.map +1 -0
  364. package/dist/src/runtime/sessionTurnCoordinator.js +23 -0
  365. package/dist/src/runtime/sessionTurnCoordinator.js.map +1 -0
  366. package/dist/src/runtime/tools.d.ts.map +1 -1
  367. package/dist/src/runtime/tools.js +1 -0
  368. package/dist/src/runtime/tools.js.map +1 -1
  369. package/dist/src/runtime-v2/agentRuntime.d.ts +136 -0
  370. package/dist/src/runtime-v2/agentRuntime.d.ts.map +1 -0
  371. package/dist/src/runtime-v2/agentRuntime.js +1341 -0
  372. package/dist/src/runtime-v2/agentRuntime.js.map +1 -0
  373. package/dist/src/runtime-v2/index.d.ts +6 -0
  374. package/dist/src/runtime-v2/index.d.ts.map +1 -0
  375. package/dist/src/runtime-v2/index.js +6 -0
  376. package/dist/src/runtime-v2/index.js.map +1 -0
  377. package/dist/src/runtime-v2/middleware/index.d.ts +5 -0
  378. package/dist/src/runtime-v2/middleware/index.d.ts.map +1 -0
  379. package/dist/src/runtime-v2/middleware/index.js +4 -0
  380. package/dist/src/runtime-v2/middleware/index.js.map +1 -0
  381. package/dist/src/runtime-v2/middleware/pipeline.d.ts +56 -0
  382. package/dist/src/runtime-v2/middleware/pipeline.d.ts.map +1 -0
  383. package/dist/src/runtime-v2/middleware/pipeline.js +242 -0
  384. package/dist/src/runtime-v2/middleware/pipeline.js.map +1 -0
  385. package/dist/src/runtime-v2/middleware/registry.d.ts +17 -0
  386. package/dist/src/runtime-v2/middleware/registry.d.ts.map +1 -0
  387. package/dist/src/runtime-v2/middleware/registry.js +46 -0
  388. package/dist/src/runtime-v2/middleware/registry.js.map +1 -0
  389. package/dist/src/runtime-v2/middleware/stages.d.ts +25 -0
  390. package/dist/src/runtime-v2/middleware/stages.d.ts.map +1 -0
  391. package/dist/src/runtime-v2/middleware/stages.js +48 -0
  392. package/dist/src/runtime-v2/middleware/stages.js.map +1 -0
  393. package/dist/src/runtime-v2/middleware/types.d.ts +51 -0
  394. package/dist/src/runtime-v2/middleware/types.d.ts.map +1 -0
  395. package/dist/src/runtime-v2/middleware/types.js +2 -0
  396. package/dist/src/runtime-v2/middleware/types.js.map +1 -0
  397. package/dist/src/runtime-v2/services.d.ts +33 -0
  398. package/dist/src/runtime-v2/services.d.ts.map +1 -0
  399. package/dist/src/runtime-v2/services.js +92 -0
  400. package/dist/src/runtime-v2/services.js.map +1 -0
  401. package/dist/src/runtime-v2/state.d.ts +71 -0
  402. package/dist/src/runtime-v2/state.d.ts.map +1 -0
  403. package/dist/src/runtime-v2/state.js +2 -0
  404. package/dist/src/runtime-v2/state.js.map +1 -0
  405. package/dist/src/runtime-v2/tools.d.ts +124 -0
  406. package/dist/src/runtime-v2/tools.d.ts.map +1 -0
  407. package/dist/src/runtime-v2/tools.js +185 -0
  408. package/dist/src/runtime-v2/tools.js.map +1 -0
  409. package/dist/src/scheduling/durableAgentScheduler.d.ts +46 -0
  410. package/dist/src/scheduling/durableAgentScheduler.d.ts.map +1 -0
  411. package/dist/src/scheduling/durableAgentScheduler.js +97 -0
  412. package/dist/src/scheduling/durableAgentScheduler.js.map +1 -0
  413. package/dist/src/scheduling/index.d.ts +3 -0
  414. package/dist/src/scheduling/index.d.ts.map +1 -1
  415. package/dist/src/scheduling/index.js +2 -0
  416. package/dist/src/scheduling/index.js.map +1 -1
  417. package/dist/src/scheduling/taskPersistence.d.ts +9 -0
  418. package/dist/src/scheduling/taskPersistence.d.ts.map +1 -0
  419. package/dist/src/scheduling/taskPersistence.js +238 -0
  420. package/dist/src/scheduling/taskPersistence.js.map +1 -0
  421. package/dist/src/storage/atomicJsonWrite.d.ts +13 -0
  422. package/dist/src/storage/atomicJsonWrite.d.ts.map +1 -0
  423. package/dist/src/storage/atomicJsonWrite.js +40 -0
  424. package/dist/src/storage/atomicJsonWrite.js.map +1 -0
  425. package/dist/src/storage/backgroundTaskStore.d.ts.map +1 -1
  426. package/dist/src/storage/backgroundTaskStore.js +2 -6
  427. package/dist/src/storage/backgroundTaskStore.js.map +1 -1
  428. package/dist/src/storage/mailboxStore.d.ts.map +1 -1
  429. package/dist/src/storage/mailboxStore.js +2 -6
  430. package/dist/src/storage/mailboxStore.js.map +1 -1
  431. package/dist/src/storage/sessionStore.d.ts +3 -0
  432. package/dist/src/storage/sessionStore.d.ts.map +1 -1
  433. package/dist/src/storage/sessionStore.js +169 -10
  434. package/dist/src/storage/sessionStore.js.map +1 -1
  435. package/dist/src/storage/teammateStore.d.ts.map +1 -1
  436. package/dist/src/storage/teammateStore.js +2 -6
  437. package/dist/src/storage/teammateStore.js.map +1 -1
  438. package/dist/src/storage-v2/contracts.d.ts +36 -0
  439. package/dist/src/storage-v2/contracts.d.ts.map +1 -0
  440. package/dist/src/storage-v2/contracts.js +2 -0
  441. package/dist/src/storage-v2/contracts.js.map +1 -0
  442. package/dist/src/storage-v2/errors.d.ts +21 -0
  443. package/dist/src/storage-v2/errors.d.ts.map +1 -0
  444. package/dist/src/storage-v2/errors.js +44 -0
  445. package/dist/src/storage-v2/errors.js.map +1 -0
  446. package/dist/src/storage-v2/index.d.ts +8 -0
  447. package/dist/src/storage-v2/index.d.ts.map +1 -0
  448. package/dist/src/storage-v2/index.js +8 -0
  449. package/dist/src/storage-v2/index.js.map +1 -0
  450. package/dist/src/storage-v2/legacyJsonV1Items.d.ts +10 -0
  451. package/dist/src/storage-v2/legacyJsonV1Items.d.ts.map +1 -0
  452. package/dist/src/storage-v2/legacyJsonV1Items.js +153 -0
  453. package/dist/src/storage-v2/legacyJsonV1Items.js.map +1 -0
  454. package/dist/src/storage-v2/migration.d.ts +32 -0
  455. package/dist/src/storage-v2/migration.d.ts.map +1 -0
  456. package/dist/src/storage-v2/migration.js +242 -0
  457. package/dist/src/storage-v2/migration.js.map +1 -0
  458. package/dist/src/storage-v2/sqliteDriver.d.ts +24 -0
  459. package/dist/src/storage-v2/sqliteDriver.d.ts.map +1 -0
  460. package/dist/src/storage-v2/sqliteDriver.js +90 -0
  461. package/dist/src/storage-v2/sqliteDriver.js.map +1 -0
  462. package/dist/src/storage-v2/sqliteStorage.d.ts +55 -0
  463. package/dist/src/storage-v2/sqliteStorage.d.ts.map +1 -0
  464. package/dist/src/storage-v2/sqliteStorage.js +905 -0
  465. package/dist/src/storage-v2/sqliteStorage.js.map +1 -0
  466. package/dist/src/storage-v2/types.d.ts +198 -0
  467. package/dist/src/storage-v2/types.d.ts.map +1 -0
  468. package/dist/src/storage-v2/types.js +2 -0
  469. package/dist/src/storage-v2/types.js.map +1 -0
  470. package/dist/src/surfaces/index.d.ts +8 -0
  471. package/dist/src/surfaces/index.d.ts.map +1 -0
  472. package/dist/src/surfaces/index.js +8 -0
  473. package/dist/src/surfaces/index.js.map +1 -0
  474. package/dist/src/surfaces/internal.d.ts +17 -0
  475. package/dist/src/surfaces/internal.d.ts.map +1 -0
  476. package/dist/src/surfaces/internal.js +116 -0
  477. package/dist/src/surfaces/internal.js.map +1 -0
  478. package/dist/src/surfaces/legacyEventAdapter.d.ts +38 -0
  479. package/dist/src/surfaces/legacyEventAdapter.d.ts.map +1 -0
  480. package/dist/src/surfaces/legacyEventAdapter.js +373 -0
  481. package/dist/src/surfaces/legacyEventAdapter.js.map +1 -0
  482. package/dist/src/surfaces/legacySurfacePipeline.d.ts +18 -0
  483. package/dist/src/surfaces/legacySurfacePipeline.d.ts.map +1 -0
  484. package/dist/src/surfaces/legacySurfacePipeline.js +25 -0
  485. package/dist/src/surfaces/legacySurfacePipeline.js.map +1 -0
  486. package/dist/src/surfaces/redaction.d.ts +12 -0
  487. package/dist/src/surfaces/redaction.d.ts.map +1 -0
  488. package/dist/src/surfaces/redaction.js +111 -0
  489. package/dist/src/surfaces/redaction.js.map +1 -0
  490. package/dist/src/surfaces/runEventLegacyCompat.d.ts +26 -0
  491. package/dist/src/surfaces/runEventLegacyCompat.d.ts.map +1 -0
  492. package/dist/src/surfaces/runEventLegacyCompat.js +339 -0
  493. package/dist/src/surfaces/runEventLegacyCompat.js.map +1 -0
  494. package/dist/src/surfaces/runEventProjector.d.ts +44 -0
  495. package/dist/src/surfaces/runEventProjector.d.ts.map +1 -0
  496. package/dist/src/surfaces/runEventProjector.js +404 -0
  497. package/dist/src/surfaces/runEventProjector.js.map +1 -0
  498. package/dist/src/surfaces/runtimeBridgeAdapter.d.ts +30 -0
  499. package/dist/src/surfaces/runtimeBridgeAdapter.d.ts.map +1 -0
  500. package/dist/src/surfaces/runtimeBridgeAdapter.js +38 -0
  501. package/dist/src/surfaces/runtimeBridgeAdapter.js.map +1 -0
  502. package/dist/src/surfaces/types.d.ts +38 -0
  503. package/dist/src/surfaces/types.d.ts.map +1 -0
  504. package/dist/src/surfaces/types.js +2 -0
  505. package/dist/src/surfaces/types.js.map +1 -0
  506. package/dist/src/team/agentPool.d.ts +2 -0
  507. package/dist/src/team/agentPool.d.ts.map +1 -1
  508. package/dist/src/team/agentPool.js +3 -1
  509. package/dist/src/team/agentPool.js.map +1 -1
  510. package/dist/src/team/modelTeam.d.ts +25 -19
  511. package/dist/src/team/modelTeam.d.ts.map +1 -1
  512. package/dist/src/team/modelTeam.js +293 -294
  513. package/dist/src/team/modelTeam.js.map +1 -1
  514. package/dist/src/team/pricing.d.ts.map +1 -1
  515. package/dist/src/team/pricing.js +2 -1
  516. package/dist/src/team/pricing.js.map +1 -1
  517. package/dist/src/team/teamDefinitions.d.ts +28 -1
  518. package/dist/src/team/teamDefinitions.d.ts.map +1 -1
  519. package/dist/src/team/teamDefinitions.js +204 -8
  520. package/dist/src/team/teamDefinitions.js.map +1 -1
  521. package/dist/src/team/teamGraph.d.ts +191 -0
  522. package/dist/src/team/teamGraph.d.ts.map +1 -0
  523. package/dist/src/team/teamGraph.js +616 -0
  524. package/dist/src/team/teamGraph.js.map +1 -0
  525. package/dist/src/team/teamGraphLayout.d.ts +44 -0
  526. package/dist/src/team/teamGraphLayout.d.ts.map +1 -0
  527. package/dist/src/team/teamGraphLayout.js +120 -0
  528. package/dist/src/team/teamGraphLayout.js.map +1 -0
  529. package/dist/src/team/teamGraphScaffold.d.ts +76 -0
  530. package/dist/src/team/teamGraphScaffold.d.ts.map +1 -0
  531. package/dist/src/team/teamGraphScaffold.js +409 -0
  532. package/dist/src/team/teamGraphScaffold.js.map +1 -0
  533. package/dist/src/team/teamGraphV3.d.ts +28 -0
  534. package/dist/src/team/teamGraphV3.d.ts.map +1 -0
  535. package/dist/src/team/teamGraphV3.js +640 -0
  536. package/dist/src/team/teamGraphV3.js.map +1 -0
  537. package/dist/src/team/teamPreferences.d.ts +11 -0
  538. package/dist/src/team/teamPreferences.d.ts.map +1 -0
  539. package/dist/src/team/teamPreferences.js +48 -0
  540. package/dist/src/team/teamPreferences.js.map +1 -0
  541. package/dist/src/team/teamPrompts.d.ts +16 -0
  542. package/dist/src/team/teamPrompts.d.ts.map +1 -0
  543. package/dist/src/team/teamPrompts.js +44 -0
  544. package/dist/src/team/teamPrompts.js.map +1 -0
  545. package/dist/src/team/teamRunView.d.ts +78 -0
  546. package/dist/src/team/teamRunView.d.ts.map +1 -0
  547. package/dist/src/team/teamRunView.js +205 -0
  548. package/dist/src/team/teamRunView.js.map +1 -0
  549. package/dist/src/team/teamRuntime.d.ts +19 -2
  550. package/dist/src/team/teamRuntime.d.ts.map +1 -1
  551. package/dist/src/team/teamRuntime.js +13 -7
  552. package/dist/src/team/teamRuntime.js.map +1 -1
  553. package/dist/src/tools/actoviqCoreTools.d.ts +2 -1
  554. package/dist/src/tools/actoviqCoreTools.d.ts.map +1 -1
  555. package/dist/src/tools/actoviqCoreTools.js +4 -1
  556. package/dist/src/tools/actoviqCoreTools.js.map +1 -1
  557. package/dist/src/tools/actoviqShellTools.d.ts.map +1 -1
  558. package/dist/src/tools/actoviqShellTools.js +10 -0
  559. package/dist/src/tools/actoviqShellTools.js.map +1 -1
  560. package/dist/src/tools/askUserQuestion/AskUserQuestionTool.d.ts.map +1 -1
  561. package/dist/src/tools/askUserQuestion/AskUserQuestionTool.js +2 -0
  562. package/dist/src/tools/askUserQuestion/AskUserQuestionTool.js.map +1 -1
  563. package/dist/src/tools/bash/BashTool.d.ts +33 -2
  564. package/dist/src/tools/bash/BashTool.d.ts.map +1 -1
  565. package/dist/src/tools/bash/BashTool.js +140 -2
  566. package/dist/src/tools/bash/BashTool.js.map +1 -1
  567. package/dist/src/tools/bash/prompt.d.ts +1 -1
  568. package/dist/src/tools/bash/prompt.d.ts.map +1 -1
  569. package/dist/src/tools/bash/prompt.js +1 -0
  570. package/dist/src/tools/bash/prompt.js.map +1 -1
  571. package/dist/src/tools/planMode/PlanModeTools.js +2 -2
  572. package/dist/src/tools/planMode/PlanModeTools.js.map +1 -1
  573. package/dist/src/tools/todo/TodoWriteTool.d.ts +1 -1
  574. package/dist/src/tui/actoviqTui.d.ts.map +1 -1
  575. package/dist/src/tui/actoviqTui.js +522 -97
  576. package/dist/src/tui/actoviqTui.js.map +1 -1
  577. package/dist/src/tui/pluginCatalog.d.ts.map +1 -1
  578. package/dist/src/tui/pluginCatalog.js +3 -1
  579. package/dist/src/tui/pluginCatalog.js.map +1 -1
  580. package/dist/src/types.d.ts +355 -23
  581. package/dist/src/types.d.ts.map +1 -1
  582. package/dist/src/types.js.map +1 -1
  583. package/dist/src/ui/commandSurface.d.ts.map +1 -1
  584. package/dist/src/ui/commandSurface.js +23 -3
  585. package/dist/src/ui/commandSurface.js.map +1 -1
  586. package/dist/src/workflow/workflowPersistence.d.ts.map +1 -1
  587. package/dist/src/workflow/workflowPersistence.js +2 -1
  588. package/dist/src/workflow/workflowPersistence.js.map +1 -1
  589. package/dist/src/workflow/workflowScriptRuntime.d.ts +4 -0
  590. package/dist/src/workflow/workflowScriptRuntime.d.ts.map +1 -1
  591. package/dist/src/workflow/workflowScriptRuntime.js +69 -18
  592. package/dist/src/workflow/workflowScriptRuntime.js.map +1 -1
  593. package/dist/src/workflow-v2/boundary.d.ts +2 -0
  594. package/dist/src/workflow-v2/boundary.d.ts.map +1 -0
  595. package/dist/src/workflow-v2/boundary.js +45 -0
  596. package/dist/src/workflow-v2/boundary.js.map +1 -0
  597. package/dist/src/workflow-v2/capabilities.d.ts +5 -0
  598. package/dist/src/workflow-v2/capabilities.d.ts.map +1 -0
  599. package/dist/src/workflow-v2/capabilities.js +32 -0
  600. package/dist/src/workflow-v2/capabilities.js.map +1 -0
  601. package/dist/src/workflow-v2/errors.d.ts +43 -0
  602. package/dist/src/workflow-v2/errors.d.ts.map +1 -0
  603. package/dist/src/workflow-v2/errors.js +84 -0
  604. package/dist/src/workflow-v2/errors.js.map +1 -0
  605. package/dist/src/workflow-v2/index.d.ts +9 -0
  606. package/dist/src/workflow-v2/index.d.ts.map +1 -0
  607. package/dist/src/workflow-v2/index.js +6 -0
  608. package/dist/src/workflow-v2/index.js.map +1 -0
  609. package/dist/src/workflow-v2/json.d.ts +5 -0
  610. package/dist/src/workflow-v2/json.d.ts.map +1 -0
  611. package/dist/src/workflow-v2/json.js +40 -0
  612. package/dist/src/workflow-v2/json.js.map +1 -0
  613. package/dist/src/workflow-v2/limits.d.ts +15 -0
  614. package/dist/src/workflow-v2/limits.d.ts.map +1 -0
  615. package/dist/src/workflow-v2/limits.js +37 -0
  616. package/dist/src/workflow-v2/limits.js.map +1 -0
  617. package/dist/src/workflow-v2/localIsolatedProcessExecutor.d.ts +25 -0
  618. package/dist/src/workflow-v2/localIsolatedProcessExecutor.d.ts.map +1 -0
  619. package/dist/src/workflow-v2/localIsolatedProcessExecutor.js +423 -0
  620. package/dist/src/workflow-v2/localIsolatedProcessExecutor.js.map +1 -0
  621. package/dist/src/workflow-v2/localProcessChild.d.ts +2 -0
  622. package/dist/src/workflow-v2/localProcessChild.d.ts.map +1 -0
  623. package/dist/src/workflow-v2/localProcessChild.js +305 -0
  624. package/dist/src/workflow-v2/localProcessChild.js.map +1 -0
  625. package/dist/src/workflow-v2/router.d.ts +10 -0
  626. package/dist/src/workflow-v2/router.d.ts.map +1 -0
  627. package/dist/src/workflow-v2/router.js +28 -0
  628. package/dist/src/workflow-v2/router.js.map +1 -0
  629. package/dist/src/workflow-v2/trustedCompatibilityExecutor.d.ts +17 -0
  630. package/dist/src/workflow-v2/trustedCompatibilityExecutor.d.ts.map +1 -0
  631. package/dist/src/workflow-v2/trustedCompatibilityExecutor.js +159 -0
  632. package/dist/src/workflow-v2/trustedCompatibilityExecutor.js.map +1 -0
  633. package/dist/src/workflow-v2/types.d.ts +67 -0
  634. package/dist/src/workflow-v2/types.d.ts.map +1 -0
  635. package/dist/src/workflow-v2/types.js +2 -0
  636. package/dist/src/workflow-v2/types.js.map +1 -0
  637. package/package.json +96 -10
@@ -0,0 +1,905 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { StorageConflictError, StorageDataError, StorageNotFoundError, } from './errors.js';
5
+ import { JsonV1Migrator, } from './migration.js';
6
+ import { nodeSqliteDriverFactory, } from './sqliteDriver.js';
7
+ const STORAGE_SCHEMA_VERSION = 1;
8
+ export class SqliteStorageV2 {
9
+ driver;
10
+ sessions;
11
+ checkpoints;
12
+ memory;
13
+ artifacts;
14
+ jsonV1Migration;
15
+ closed = false;
16
+ constructor(driver) {
17
+ this.driver = driver;
18
+ initializeSchema(driver);
19
+ this.sessions = new SqliteSessionStore(driver);
20
+ this.checkpoints = new SqliteCheckpointStore(driver);
21
+ this.memory = new SqliteMemoryStore(driver);
22
+ this.artifacts = new SqliteArtifactStore(driver);
23
+ this.jsonV1Migration = new JsonV1Migrator(this);
24
+ }
25
+ static async open(options) {
26
+ assertNonEmpty(options.filename, 'filename');
27
+ if (options.filename !== ':memory:') {
28
+ await mkdir(path.dirname(path.resolve(options.filename)), { recursive: true });
29
+ }
30
+ const driver = await (options.driverFactory ?? nodeSqliteDriverFactory).open(options.filename);
31
+ try {
32
+ return new SqliteStorageV2(driver);
33
+ }
34
+ catch (error) {
35
+ driver.close();
36
+ throw error;
37
+ }
38
+ }
39
+ async close() {
40
+ if (this.closed)
41
+ return;
42
+ this.closed = true;
43
+ this.driver.close();
44
+ }
45
+ /** @internal Used by JsonV1Migrator before the atomic cutover. */
46
+ getJsonV1MigrationEntry(tenantId, sourceId, sourceKey) {
47
+ const row = this.driver.prepare(`
48
+ SELECT content_hash, session_id
49
+ FROM storage_v2_json_v1_migrations
50
+ WHERE tenant_id = ? AND source_id = ? AND source_key = ?
51
+ `).get(tenantId, sourceId, sourceKey);
52
+ if (!row)
53
+ return undefined;
54
+ return {
55
+ contentHash: readString(row, 'content_hash'),
56
+ sessionId: readString(row, 'session_id'),
57
+ };
58
+ }
59
+ /** @internal Applies sessions, items, and ledger entries as one transaction. */
60
+ applyJsonV1Migration(plans) {
61
+ return this.driver.transaction(() => {
62
+ const results = [];
63
+ for (const plan of plans) {
64
+ const ledger = this.getJsonV1MigrationEntry(plan.tenantId, plan.sourceId, plan.sourceKey);
65
+ if (ledger) {
66
+ if (ledger.contentHash !== plan.contentHash || ledger.sessionId !== plan.sessionId) {
67
+ throw new StorageDataError(`Previously migrated JSON v1 source changed: ${plan.sourceFile}`);
68
+ }
69
+ results.push({ sourceKey: plan.sourceKey, status: 'skipped' });
70
+ continue;
71
+ }
72
+ const existing = selectSession(this.driver, plan.tenantId, plan.sessionId);
73
+ if (existing) {
74
+ throw new StorageConflictError(sessionResource(plan.tenantId, plan.sessionId), null, existing.revision);
75
+ }
76
+ const revision = plan.items.length > 0 ? 1 : 0;
77
+ this.driver.prepare(`
78
+ INSERT INTO storage_v2_sessions (
79
+ tenant_id, session_id, revision, metadata_json,
80
+ created_at, updated_at, last_sequence
81
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)
82
+ `).run(plan.tenantId, plan.sessionId, revision, encodeJson(plan.metadata, 'migration metadata'), plan.createdAt, plan.createdAt, plan.items.length);
83
+ const insertItem = this.driver.prepare(`
84
+ INSERT INTO storage_v2_session_items (
85
+ tenant_id, session_id, sequence, item_id, kind, payload_json, created_at
86
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)
87
+ `);
88
+ plan.items.forEach((item, index) => {
89
+ insertItem.run(plan.tenantId, plan.sessionId, index + 1, item.itemId, item.kind, encodeJson(item.payload, 'migration item payload'), item.createdAt ?? plan.createdAt);
90
+ });
91
+ this.driver.prepare(`
92
+ INSERT INTO storage_v2_json_v1_migrations (
93
+ tenant_id, source_id, source_key, content_hash, session_id, migrated_at
94
+ ) VALUES (?, ?, ?, ?, ?, ?)
95
+ `).run(plan.tenantId, plan.sourceId, plan.sourceKey, plan.contentHash, plan.sessionId, nowIso());
96
+ results.push({ sourceKey: plan.sourceKey, status: 'migrated' });
97
+ }
98
+ return results;
99
+ });
100
+ }
101
+ }
102
+ export class SqliteSessionStore {
103
+ driver;
104
+ constructor(driver) {
105
+ this.driver = driver;
106
+ }
107
+ async create(request) {
108
+ validateSessionKey(request);
109
+ const metadata = request.metadata ?? {};
110
+ const metadataJson = encodeJson(metadata, 'session metadata');
111
+ const createdAt = request.createdAt ?? nowIso();
112
+ assertNonEmpty(createdAt, 'createdAt');
113
+ return this.driver.transaction(() => {
114
+ const existing = selectSession(this.driver, request.tenantId, request.sessionId);
115
+ if (existing) {
116
+ throw new StorageConflictError(sessionResource(request.tenantId, request.sessionId), null, existing.revision);
117
+ }
118
+ this.driver.prepare(`
119
+ INSERT INTO storage_v2_sessions (
120
+ tenant_id, session_id, revision, metadata_json,
121
+ created_at, updated_at, last_sequence
122
+ ) VALUES (?, ?, 0, ?, ?, ?, 0)
123
+ `).run(request.tenantId, request.sessionId, metadataJson, createdAt, createdAt);
124
+ return {
125
+ tenantId: request.tenantId,
126
+ sessionId: request.sessionId,
127
+ revision: 0,
128
+ metadata: cloneJson(metadata),
129
+ createdAt,
130
+ updatedAt: createdAt,
131
+ lastSequence: 0,
132
+ };
133
+ });
134
+ }
135
+ async get(key) {
136
+ validateSessionKey(key);
137
+ return selectSession(this.driver, key.tenantId, key.sessionId);
138
+ }
139
+ async append(request) {
140
+ validateSessionKey(request);
141
+ assertRevision(request.expectedRevision, 'expectedRevision');
142
+ if (request.items.length === 0) {
143
+ throw new StorageDataError('append requires at least one session item');
144
+ }
145
+ const itemIds = new Set();
146
+ const preparedItems = request.items.map((item) => {
147
+ assertNonEmpty(item.itemId, 'itemId');
148
+ assertNonEmpty(item.kind, 'kind');
149
+ if (itemIds.has(item.itemId)) {
150
+ throw new StorageDataError(`Duplicate itemId in append request: ${item.itemId}`);
151
+ }
152
+ itemIds.add(item.itemId);
153
+ return {
154
+ ...item,
155
+ payloadJson: encodeJson(item.payload, `session item ${item.itemId}`),
156
+ createdAt: item.createdAt ?? nowIso(),
157
+ };
158
+ });
159
+ return this.driver.transaction(() => {
160
+ const current = requireSession(this.driver, request.tenantId, request.sessionId);
161
+ assertCas(sessionResource(request.tenantId, request.sessionId), request.expectedRevision, current.revision);
162
+ const insert = this.driver.prepare(`
163
+ INSERT INTO storage_v2_session_items (
164
+ tenant_id, session_id, sequence, item_id, kind, payload_json, created_at
165
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)
166
+ `);
167
+ preparedItems.forEach((item, index) => {
168
+ insert.run(request.tenantId, request.sessionId, current.lastSequence + index + 1, item.itemId, item.kind, item.payloadJson, item.createdAt);
169
+ });
170
+ const nextRevision = current.revision + 1;
171
+ const lastSequence = current.lastSequence + preparedItems.length;
172
+ const updatedAt = request.updatedAt ?? nowIso();
173
+ const result = this.driver.prepare(`
174
+ UPDATE storage_v2_sessions
175
+ SET revision = ?, updated_at = ?, last_sequence = ?
176
+ WHERE tenant_id = ? AND session_id = ? AND revision = ?
177
+ `).run(nextRevision, updatedAt, lastSequence, request.tenantId, request.sessionId, current.revision);
178
+ if (result.changes !== 1) {
179
+ const actual = selectSession(this.driver, request.tenantId, request.sessionId)?.revision ?? null;
180
+ throw new StorageConflictError(sessionResource(request.tenantId, request.sessionId), request.expectedRevision, actual);
181
+ }
182
+ return {
183
+ ...current,
184
+ revision: nextRevision,
185
+ updatedAt,
186
+ lastSequence,
187
+ };
188
+ });
189
+ }
190
+ async load(request) {
191
+ validateSessionKey(request);
192
+ if (request.afterSequence !== undefined) {
193
+ assertSequence(request.afterSequence, 'afterSequence');
194
+ }
195
+ const limit = normalizeLimit(request.limit);
196
+ const session = requireSession(this.driver, request.tenantId, request.sessionId);
197
+ let snapshot;
198
+ if (request.afterSequence === undefined && request.useSnapshot !== false) {
199
+ const row = this.driver.prepare(`
200
+ SELECT through_sequence, session_revision, state_json, created_at
201
+ FROM storage_v2_session_snapshots
202
+ WHERE tenant_id = ? AND session_id = ?
203
+ ORDER BY through_sequence DESC
204
+ LIMIT 1
205
+ `).get(request.tenantId, request.sessionId);
206
+ if (row)
207
+ snapshot = rowToSnapshot(row);
208
+ }
209
+ const afterSequence = request.afterSequence ?? snapshot?.throughSequence ?? 0;
210
+ const rows = this.driver.prepare(`
211
+ SELECT sequence, item_id, kind, payload_json, created_at
212
+ FROM storage_v2_session_items
213
+ WHERE tenant_id = ? AND session_id = ? AND sequence > ?
214
+ ORDER BY sequence ASC
215
+ LIMIT ?
216
+ `).all(request.tenantId, request.sessionId, afterSequence, limit);
217
+ return {
218
+ session,
219
+ ...(snapshot ? { snapshot } : {}),
220
+ items: rows.map(rowToSessionItem),
221
+ };
222
+ }
223
+ async compact(request) {
224
+ validateSessionKey(request);
225
+ assertRevision(request.expectedRevision, 'expectedRevision');
226
+ assertSequence(request.throughSequence, 'throughSequence');
227
+ const stateJson = encodeJson(request.state, 'session snapshot state');
228
+ return this.driver.transaction(() => {
229
+ const current = requireSession(this.driver, request.tenantId, request.sessionId);
230
+ assertCas(sessionResource(request.tenantId, request.sessionId), request.expectedRevision, current.revision);
231
+ if (request.throughSequence > current.lastSequence) {
232
+ throw new StorageDataError(`Snapshot sequence ${request.throughSequence} exceeds session tail ${current.lastSequence}`);
233
+ }
234
+ const latest = this.driver.prepare(`
235
+ SELECT through_sequence
236
+ FROM storage_v2_session_snapshots
237
+ WHERE tenant_id = ? AND session_id = ?
238
+ ORDER BY through_sequence DESC
239
+ LIMIT 1
240
+ `).get(request.tenantId, request.sessionId);
241
+ if (latest && request.throughSequence <= readInteger(latest, 'through_sequence')) {
242
+ throw new StorageDataError('A compacted snapshot must advance throughSequence');
243
+ }
244
+ const revision = current.revision + 1;
245
+ const createdAt = request.createdAt ?? nowIso();
246
+ this.driver.prepare(`
247
+ INSERT INTO storage_v2_session_snapshots (
248
+ tenant_id, session_id, through_sequence,
249
+ session_revision, state_json, created_at
250
+ ) VALUES (?, ?, ?, ?, ?, ?)
251
+ `).run(request.tenantId, request.sessionId, request.throughSequence, revision, stateJson, createdAt);
252
+ const result = this.driver.prepare(`
253
+ UPDATE storage_v2_sessions
254
+ SET revision = ?, updated_at = ?
255
+ WHERE tenant_id = ? AND session_id = ? AND revision = ?
256
+ `).run(revision, createdAt, request.tenantId, request.sessionId, current.revision);
257
+ if (result.changes !== 1) {
258
+ throw new StorageConflictError(sessionResource(request.tenantId, request.sessionId), request.expectedRevision, selectSession(this.driver, request.tenantId, request.sessionId)?.revision ?? null);
259
+ }
260
+ return {
261
+ throughSequence: request.throughSequence,
262
+ revision,
263
+ state: cloneJson(request.state),
264
+ createdAt,
265
+ };
266
+ });
267
+ }
268
+ }
269
+ export class SqliteCheckpointStore {
270
+ driver;
271
+ constructor(driver) {
272
+ this.driver = driver;
273
+ }
274
+ async save(request) {
275
+ validateCheckpointKey(request);
276
+ assertNonEmpty(request.runId, 'runId');
277
+ if (request.sessionId !== undefined)
278
+ assertNonEmpty(request.sessionId, 'sessionId');
279
+ if (request.expectedRevision !== null) {
280
+ assertRevision(request.expectedRevision, 'expectedRevision');
281
+ }
282
+ assertNonEmpty(request.traceContext.traceId, 'traceContext.traceId');
283
+ assertNonEmpty(request.traceContext.spanId, 'traceContext.spanId');
284
+ const stateJson = encodeJson(request.state, 'checkpoint state');
285
+ const interruptionJson = request.interruption === undefined
286
+ ? null
287
+ : encodeJson(request.interruption, 'checkpoint interruption');
288
+ const pendingSideEffects = request.pendingSideEffects ?? [];
289
+ for (const effect of pendingSideEffects) {
290
+ assertNonEmpty(effect.sideEffectId, 'pendingSideEffect.sideEffectId');
291
+ assertNonEmpty(effect.kind, 'pendingSideEffect.kind');
292
+ }
293
+ const pendingJson = encodeJson(pendingSideEffects, 'checkpoint pending side effects');
294
+ const traceJson = encodeJson(request.traceContext, 'checkpoint trace context');
295
+ return this.driver.transaction(() => {
296
+ const existingRow = selectCheckpointRow(this.driver, request.tenantId, request.checkpointId);
297
+ const actualRevision = existingRow ? readInteger(existingRow, 'revision') : null;
298
+ if (request.expectedRevision !== actualRevision) {
299
+ throw new StorageConflictError(checkpointResource(request.tenantId, request.checkpointId), request.expectedRevision, actualRevision);
300
+ }
301
+ const updatedAt = request.updatedAt ?? nowIso();
302
+ if (!existingRow) {
303
+ this.driver.prepare(`
304
+ INSERT INTO storage_v2_checkpoints (
305
+ tenant_id, checkpoint_id, run_id, session_id, revision, status,
306
+ state_json, interruption_json, pending_side_effects_json,
307
+ trace_context_json, created_at, updated_at
308
+ ) VALUES (?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?)
309
+ `).run(request.tenantId, request.checkpointId, request.runId, request.sessionId ?? null, request.status, stateJson, interruptionJson, pendingJson, traceJson, updatedAt, updatedAt);
310
+ }
311
+ else {
312
+ const nextRevision = actualRevision + 1;
313
+ const result = this.driver.prepare(`
314
+ UPDATE storage_v2_checkpoints
315
+ SET run_id = ?, session_id = ?, revision = ?, status = ?, state_json = ?,
316
+ interruption_json = ?, pending_side_effects_json = ?,
317
+ trace_context_json = ?, updated_at = ?
318
+ WHERE tenant_id = ? AND checkpoint_id = ? AND revision = ?
319
+ `).run(request.runId, request.sessionId ?? null, nextRevision, request.status, stateJson, interruptionJson, pendingJson, traceJson, updatedAt, request.tenantId, request.checkpointId, actualRevision);
320
+ if (result.changes !== 1) {
321
+ throw new StorageConflictError(checkpointResource(request.tenantId, request.checkpointId), request.expectedRevision, selectCheckpointRevision(this.driver, request.tenantId, request.checkpointId));
322
+ }
323
+ }
324
+ return rowToCheckpoint(requireCheckpointRow(this.driver, request.tenantId, request.checkpointId));
325
+ });
326
+ }
327
+ async load(key) {
328
+ validateCheckpointKey(key);
329
+ const row = selectCheckpointRow(this.driver, key.tenantId, key.checkpointId);
330
+ return row ? rowToCheckpoint(row) : undefined;
331
+ }
332
+ async list(request) {
333
+ assertNonEmpty(request.tenantId, 'tenantId');
334
+ if (request.runId !== undefined)
335
+ assertNonEmpty(request.runId, 'runId');
336
+ const limit = request.limit ?? 1_000;
337
+ if (!Number.isSafeInteger(limit) || limit < 1) {
338
+ throw new RangeError('Checkpoint list limit must be a positive safe integer.');
339
+ }
340
+ const conditions = ['tenant_id = ?'];
341
+ const parameters = [request.tenantId];
342
+ if (request.runId !== undefined) {
343
+ conditions.push('run_id = ?');
344
+ parameters.push(request.runId);
345
+ }
346
+ if (request.status !== undefined) {
347
+ conditions.push('status = ?');
348
+ parameters.push(request.status);
349
+ }
350
+ parameters.push(limit);
351
+ return this.driver.prepare(`
352
+ SELECT * FROM storage_v2_checkpoints
353
+ WHERE ${conditions.join(' AND ')}
354
+ ORDER BY created_at ASC, checkpoint_id ASC
355
+ LIMIT ?
356
+ `).all(...parameters).map(rowToCheckpoint);
357
+ }
358
+ }
359
+ export class SqliteMemoryStore {
360
+ driver;
361
+ constructor(driver) {
362
+ this.driver = driver;
363
+ }
364
+ async put(request) {
365
+ validateMemoryKey(request);
366
+ assertNonEmpty(request.namespace, 'namespace');
367
+ if (request.expectedRevision !== null) {
368
+ assertRevision(request.expectedRevision, 'expectedRevision');
369
+ }
370
+ const valueJson = encodeJson(request.value, 'memory value');
371
+ const metadataJson = encodeJson(request.metadata ?? {}, 'memory metadata');
372
+ return this.driver.transaction(() => {
373
+ const existing = selectMemoryRow(this.driver, request.tenantId, request.memoryId);
374
+ const actualRevision = existing ? readInteger(existing, 'revision') : null;
375
+ if (request.expectedRevision !== actualRevision) {
376
+ throw new StorageConflictError(memoryResource(request.tenantId, request.memoryId), request.expectedRevision, actualRevision);
377
+ }
378
+ const updatedAt = request.updatedAt ?? nowIso();
379
+ if (!existing) {
380
+ this.driver.prepare(`
381
+ INSERT INTO storage_v2_memory (
382
+ tenant_id, memory_id, namespace, revision, value_json,
383
+ metadata_json, created_at, updated_at
384
+ ) VALUES (?, ?, ?, 0, ?, ?, ?, ?)
385
+ `).run(request.tenantId, request.memoryId, request.namespace, valueJson, metadataJson, updatedAt, updatedAt);
386
+ }
387
+ else {
388
+ const nextRevision = actualRevision + 1;
389
+ const result = this.driver.prepare(`
390
+ UPDATE storage_v2_memory
391
+ SET namespace = ?, revision = ?, value_json = ?, metadata_json = ?, updated_at = ?
392
+ WHERE tenant_id = ? AND memory_id = ? AND revision = ?
393
+ `).run(request.namespace, nextRevision, valueJson, metadataJson, updatedAt, request.tenantId, request.memoryId, actualRevision);
394
+ if (result.changes !== 1) {
395
+ throw new StorageConflictError(memoryResource(request.tenantId, request.memoryId), request.expectedRevision, selectMemoryRevision(this.driver, request.tenantId, request.memoryId));
396
+ }
397
+ }
398
+ return rowToMemory(requireMemoryRow(this.driver, request.tenantId, request.memoryId));
399
+ });
400
+ }
401
+ async get(key) {
402
+ validateMemoryKey(key);
403
+ const row = selectMemoryRow(this.driver, key.tenantId, key.memoryId);
404
+ return row ? rowToMemory(row) : undefined;
405
+ }
406
+ async list(request) {
407
+ assertNonEmpty(request.tenantId, 'tenantId');
408
+ const limit = normalizeLimit(request.limit);
409
+ if (request.namespace !== undefined) {
410
+ assertNonEmpty(request.namespace, 'namespace');
411
+ return this.driver.prepare(`
412
+ SELECT * FROM storage_v2_memory
413
+ WHERE tenant_id = ? AND namespace = ?
414
+ ORDER BY updated_at DESC, memory_id ASC
415
+ LIMIT ?
416
+ `).all(request.tenantId, request.namespace, limit).map(rowToMemory);
417
+ }
418
+ return this.driver.prepare(`
419
+ SELECT * FROM storage_v2_memory
420
+ WHERE tenant_id = ?
421
+ ORDER BY updated_at DESC, memory_id ASC
422
+ LIMIT ?
423
+ `).all(request.tenantId, limit).map(rowToMemory);
424
+ }
425
+ }
426
+ export class SqliteArtifactStore {
427
+ driver;
428
+ constructor(driver) {
429
+ this.driver = driver;
430
+ }
431
+ async put(request) {
432
+ validateArtifactKey(request);
433
+ assertNonEmpty(request.mediaType, 'mediaType');
434
+ if (request.expectedRevision !== null) {
435
+ assertRevision(request.expectedRevision, 'expectedRevision');
436
+ }
437
+ const data = Uint8Array.from(request.data);
438
+ const digest = createHash('sha256').update(data).digest('hex');
439
+ const metadataJson = encodeJson(request.metadata ?? {}, 'artifact metadata');
440
+ return this.driver.transaction(() => {
441
+ const existing = selectArtifactRow(this.driver, request.tenantId, request.artifactId, true);
442
+ const actualRevision = existing ? readInteger(existing, 'revision') : null;
443
+ if (request.expectedRevision !== actualRevision) {
444
+ throw new StorageConflictError(artifactResource(request.tenantId, request.artifactId), request.expectedRevision, actualRevision);
445
+ }
446
+ const updatedAt = request.updatedAt ?? nowIso();
447
+ if (!existing) {
448
+ this.driver.prepare(`
449
+ INSERT INTO storage_v2_artifacts (
450
+ tenant_id, artifact_id, revision, media_type, data, size, sha256,
451
+ metadata_json, created_at, updated_at
452
+ ) VALUES (?, ?, 0, ?, ?, ?, ?, ?, ?, ?)
453
+ `).run(request.tenantId, request.artifactId, request.mediaType, data, data.byteLength, digest, metadataJson, updatedAt, updatedAt);
454
+ }
455
+ else {
456
+ const nextRevision = actualRevision + 1;
457
+ const result = this.driver.prepare(`
458
+ UPDATE storage_v2_artifacts
459
+ SET revision = ?, media_type = ?, data = ?, size = ?, sha256 = ?,
460
+ metadata_json = ?, updated_at = ?
461
+ WHERE tenant_id = ? AND artifact_id = ? AND revision = ?
462
+ `).run(nextRevision, request.mediaType, data, data.byteLength, digest, metadataJson, updatedAt, request.tenantId, request.artifactId, actualRevision);
463
+ if (result.changes !== 1) {
464
+ throw new StorageConflictError(artifactResource(request.tenantId, request.artifactId), request.expectedRevision, selectArtifactRevision(this.driver, request.tenantId, request.artifactId));
465
+ }
466
+ }
467
+ return rowToArtifact(requireArtifactRow(this.driver, request.tenantId, request.artifactId));
468
+ });
469
+ }
470
+ async get(key) {
471
+ validateArtifactKey(key);
472
+ const row = selectArtifactRow(this.driver, key.tenantId, key.artifactId, true);
473
+ return row ? rowToArtifact(row) : undefined;
474
+ }
475
+ async list(request) {
476
+ assertNonEmpty(request.tenantId, 'tenantId');
477
+ const limit = normalizeLimit(request.limit);
478
+ return this.driver.prepare(`
479
+ SELECT tenant_id, artifact_id, revision, media_type, size, sha256,
480
+ metadata_json, created_at, updated_at
481
+ FROM storage_v2_artifacts
482
+ WHERE tenant_id = ?
483
+ ORDER BY updated_at DESC, artifact_id ASC
484
+ LIMIT ?
485
+ `).all(request.tenantId, limit).map(rowToArtifactSummary);
486
+ }
487
+ }
488
+ function initializeSchema(driver) {
489
+ driver.exec(`
490
+ PRAGMA foreign_keys = ON;
491
+ PRAGMA journal_mode = WAL;
492
+ PRAGMA busy_timeout = 5000;
493
+
494
+ CREATE TABLE IF NOT EXISTS storage_v2_schema (
495
+ singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
496
+ version INTEGER NOT NULL
497
+ );
498
+ INSERT OR IGNORE INTO storage_v2_schema (singleton, version) VALUES (1, 1);
499
+
500
+ CREATE TABLE IF NOT EXISTS storage_v2_sessions (
501
+ tenant_id TEXT NOT NULL,
502
+ session_id TEXT NOT NULL,
503
+ revision INTEGER NOT NULL CHECK (revision >= 0),
504
+ metadata_json TEXT NOT NULL,
505
+ created_at TEXT NOT NULL,
506
+ updated_at TEXT NOT NULL,
507
+ last_sequence INTEGER NOT NULL CHECK (last_sequence >= 0),
508
+ PRIMARY KEY (tenant_id, session_id)
509
+ );
510
+
511
+ CREATE TABLE IF NOT EXISTS storage_v2_session_items (
512
+ tenant_id TEXT NOT NULL,
513
+ session_id TEXT NOT NULL,
514
+ sequence INTEGER NOT NULL CHECK (sequence > 0),
515
+ item_id TEXT NOT NULL,
516
+ kind TEXT NOT NULL,
517
+ payload_json TEXT NOT NULL,
518
+ created_at TEXT NOT NULL,
519
+ PRIMARY KEY (tenant_id, session_id, sequence),
520
+ UNIQUE (tenant_id, session_id, item_id),
521
+ FOREIGN KEY (tenant_id, session_id)
522
+ REFERENCES storage_v2_sessions (tenant_id, session_id)
523
+ );
524
+ CREATE INDEX IF NOT EXISTS storage_v2_session_items_tail
525
+ ON storage_v2_session_items (tenant_id, session_id, sequence);
526
+
527
+ CREATE TABLE IF NOT EXISTS storage_v2_session_snapshots (
528
+ tenant_id TEXT NOT NULL,
529
+ session_id TEXT NOT NULL,
530
+ through_sequence INTEGER NOT NULL CHECK (through_sequence >= 0),
531
+ session_revision INTEGER NOT NULL CHECK (session_revision >= 0),
532
+ state_json TEXT NOT NULL,
533
+ created_at TEXT NOT NULL,
534
+ PRIMARY KEY (tenant_id, session_id, through_sequence),
535
+ FOREIGN KEY (tenant_id, session_id)
536
+ REFERENCES storage_v2_sessions (tenant_id, session_id)
537
+ );
538
+
539
+ CREATE TABLE IF NOT EXISTS storage_v2_checkpoints (
540
+ tenant_id TEXT NOT NULL,
541
+ checkpoint_id TEXT NOT NULL,
542
+ run_id TEXT NOT NULL,
543
+ session_id TEXT,
544
+ revision INTEGER NOT NULL CHECK (revision >= 0),
545
+ status TEXT NOT NULL,
546
+ state_json TEXT NOT NULL,
547
+ interruption_json TEXT,
548
+ pending_side_effects_json TEXT NOT NULL,
549
+ trace_context_json TEXT NOT NULL,
550
+ created_at TEXT NOT NULL,
551
+ updated_at TEXT NOT NULL,
552
+ PRIMARY KEY (tenant_id, checkpoint_id)
553
+ );
554
+
555
+ CREATE TABLE IF NOT EXISTS storage_v2_memory (
556
+ tenant_id TEXT NOT NULL,
557
+ memory_id TEXT NOT NULL,
558
+ namespace TEXT NOT NULL,
559
+ revision INTEGER NOT NULL CHECK (revision >= 0),
560
+ value_json TEXT NOT NULL,
561
+ metadata_json TEXT NOT NULL,
562
+ created_at TEXT NOT NULL,
563
+ updated_at TEXT NOT NULL,
564
+ PRIMARY KEY (tenant_id, memory_id)
565
+ );
566
+ CREATE INDEX IF NOT EXISTS storage_v2_memory_namespace
567
+ ON storage_v2_memory (tenant_id, namespace, updated_at);
568
+
569
+ CREATE TABLE IF NOT EXISTS storage_v2_artifacts (
570
+ tenant_id TEXT NOT NULL,
571
+ artifact_id TEXT NOT NULL,
572
+ revision INTEGER NOT NULL CHECK (revision >= 0),
573
+ media_type TEXT NOT NULL,
574
+ data BLOB NOT NULL,
575
+ size INTEGER NOT NULL CHECK (size >= 0),
576
+ sha256 TEXT NOT NULL,
577
+ metadata_json TEXT NOT NULL,
578
+ created_at TEXT NOT NULL,
579
+ updated_at TEXT NOT NULL,
580
+ PRIMARY KEY (tenant_id, artifact_id)
581
+ );
582
+
583
+ CREATE TABLE IF NOT EXISTS storage_v2_json_v1_migrations (
584
+ tenant_id TEXT NOT NULL,
585
+ source_id TEXT NOT NULL,
586
+ source_key TEXT NOT NULL,
587
+ content_hash TEXT NOT NULL,
588
+ session_id TEXT NOT NULL,
589
+ migrated_at TEXT NOT NULL,
590
+ PRIMARY KEY (tenant_id, source_id, source_key)
591
+ );
592
+
593
+ CREATE TRIGGER IF NOT EXISTS storage_v2_session_items_no_update
594
+ BEFORE UPDATE ON storage_v2_session_items
595
+ BEGIN
596
+ SELECT RAISE(ABORT, 'storage_v2 session items are append-only');
597
+ END;
598
+ CREATE TRIGGER IF NOT EXISTS storage_v2_session_items_no_delete
599
+ BEFORE DELETE ON storage_v2_session_items
600
+ BEGIN
601
+ SELECT RAISE(ABORT, 'storage_v2 session items are append-only');
602
+ END;
603
+ CREATE TRIGGER IF NOT EXISTS storage_v2_snapshots_no_update
604
+ BEFORE UPDATE ON storage_v2_session_snapshots
605
+ BEGIN
606
+ SELECT RAISE(ABORT, 'storage_v2 session snapshots are append-only');
607
+ END;
608
+ CREATE TRIGGER IF NOT EXISTS storage_v2_snapshots_no_delete
609
+ BEFORE DELETE ON storage_v2_session_snapshots
610
+ BEGIN
611
+ SELECT RAISE(ABORT, 'storage_v2 session snapshots are append-only');
612
+ END;
613
+ `);
614
+ const row = driver.prepare('SELECT version FROM storage_v2_schema WHERE singleton = 1').get();
615
+ const version = row ? readInteger(row, 'version') : -1;
616
+ if (version !== STORAGE_SCHEMA_VERSION) {
617
+ throw new StorageDataError(`Unsupported storage-v2 schema version ${version}`);
618
+ }
619
+ }
620
+ function selectSession(driver, tenantId, sessionId) {
621
+ const row = driver.prepare(`
622
+ SELECT tenant_id, session_id, revision, metadata_json,
623
+ created_at, updated_at, last_sequence
624
+ FROM storage_v2_sessions
625
+ WHERE tenant_id = ? AND session_id = ?
626
+ `).get(tenantId, sessionId);
627
+ return row ? rowToSession(row) : undefined;
628
+ }
629
+ function requireSession(driver, tenantId, sessionId) {
630
+ const session = selectSession(driver, tenantId, sessionId);
631
+ if (!session)
632
+ throw new StorageNotFoundError(sessionResource(tenantId, sessionId));
633
+ return session;
634
+ }
635
+ function rowToSession(row) {
636
+ return {
637
+ tenantId: readString(row, 'tenant_id'),
638
+ sessionId: readString(row, 'session_id'),
639
+ revision: readInteger(row, 'revision'),
640
+ metadata: decodeJson(readString(row, 'metadata_json'), 'session metadata'),
641
+ createdAt: readString(row, 'created_at'),
642
+ updatedAt: readString(row, 'updated_at'),
643
+ lastSequence: readInteger(row, 'last_sequence'),
644
+ };
645
+ }
646
+ function rowToSessionItem(row) {
647
+ return {
648
+ sequence: readInteger(row, 'sequence'),
649
+ itemId: readString(row, 'item_id'),
650
+ kind: readString(row, 'kind'),
651
+ payload: decodeJson(readString(row, 'payload_json'), 'session item payload'),
652
+ createdAt: readString(row, 'created_at'),
653
+ };
654
+ }
655
+ function rowToSnapshot(row) {
656
+ return {
657
+ throughSequence: readInteger(row, 'through_sequence'),
658
+ revision: readInteger(row, 'session_revision'),
659
+ state: decodeJson(readString(row, 'state_json'), 'session snapshot state'),
660
+ createdAt: readString(row, 'created_at'),
661
+ };
662
+ }
663
+ function selectCheckpointRow(driver, tenantId, checkpointId) {
664
+ return driver.prepare(`
665
+ SELECT * FROM storage_v2_checkpoints
666
+ WHERE tenant_id = ? AND checkpoint_id = ?
667
+ `).get(tenantId, checkpointId);
668
+ }
669
+ function requireCheckpointRow(driver, tenantId, checkpointId) {
670
+ const row = selectCheckpointRow(driver, tenantId, checkpointId);
671
+ if (!row)
672
+ throw new StorageNotFoundError(checkpointResource(tenantId, checkpointId));
673
+ return row;
674
+ }
675
+ function selectCheckpointRevision(driver, tenantId, checkpointId) {
676
+ const row = selectCheckpointRow(driver, tenantId, checkpointId);
677
+ return row ? readInteger(row, 'revision') : null;
678
+ }
679
+ function rowToCheckpoint(row) {
680
+ const interruptionRaw = readNullableString(row, 'interruption_json');
681
+ return {
682
+ tenantId: readString(row, 'tenant_id'),
683
+ checkpointId: readString(row, 'checkpoint_id'),
684
+ runId: readString(row, 'run_id'),
685
+ ...(readNullableString(row, 'session_id') !== undefined
686
+ ? { sessionId: readNullableString(row, 'session_id') }
687
+ : {}),
688
+ revision: readInteger(row, 'revision'),
689
+ status: readString(row, 'status'),
690
+ state: decodeJson(readString(row, 'state_json'), 'checkpoint state'),
691
+ ...(interruptionRaw !== undefined
692
+ ? { interruption: decodeJson(interruptionRaw, 'checkpoint interruption') }
693
+ : {}),
694
+ pendingSideEffects: decodeJson(readString(row, 'pending_side_effects_json'), 'checkpoint pending side effects'),
695
+ traceContext: decodeJson(readString(row, 'trace_context_json'), 'checkpoint trace context'),
696
+ createdAt: readString(row, 'created_at'),
697
+ updatedAt: readString(row, 'updated_at'),
698
+ };
699
+ }
700
+ function selectMemoryRow(driver, tenantId, memoryId) {
701
+ return driver.prepare(`
702
+ SELECT * FROM storage_v2_memory
703
+ WHERE tenant_id = ? AND memory_id = ?
704
+ `).get(tenantId, memoryId);
705
+ }
706
+ function requireMemoryRow(driver, tenantId, memoryId) {
707
+ const row = selectMemoryRow(driver, tenantId, memoryId);
708
+ if (!row)
709
+ throw new StorageNotFoundError(memoryResource(tenantId, memoryId));
710
+ return row;
711
+ }
712
+ function selectMemoryRevision(driver, tenantId, memoryId) {
713
+ const row = selectMemoryRow(driver, tenantId, memoryId);
714
+ return row ? readInteger(row, 'revision') : null;
715
+ }
716
+ function rowToMemory(row) {
717
+ return {
718
+ tenantId: readString(row, 'tenant_id'),
719
+ memoryId: readString(row, 'memory_id'),
720
+ namespace: readString(row, 'namespace'),
721
+ revision: readInteger(row, 'revision'),
722
+ value: decodeJson(readString(row, 'value_json'), 'memory value'),
723
+ metadata: decodeJson(readString(row, 'metadata_json'), 'memory metadata'),
724
+ createdAt: readString(row, 'created_at'),
725
+ updatedAt: readString(row, 'updated_at'),
726
+ };
727
+ }
728
+ function selectArtifactRow(driver, tenantId, artifactId, includeData) {
729
+ return driver.prepare(`
730
+ SELECT tenant_id, artifact_id, revision, media_type,
731
+ ${includeData ? 'data,' : ''} size, sha256, metadata_json, created_at, updated_at
732
+ FROM storage_v2_artifacts
733
+ WHERE tenant_id = ? AND artifact_id = ?
734
+ `).get(tenantId, artifactId);
735
+ }
736
+ function requireArtifactRow(driver, tenantId, artifactId) {
737
+ const row = selectArtifactRow(driver, tenantId, artifactId, true);
738
+ if (!row)
739
+ throw new StorageNotFoundError(artifactResource(tenantId, artifactId));
740
+ return row;
741
+ }
742
+ function selectArtifactRevision(driver, tenantId, artifactId) {
743
+ const row = selectArtifactRow(driver, tenantId, artifactId, false);
744
+ return row ? readInteger(row, 'revision') : null;
745
+ }
746
+ function rowToArtifactSummary(row) {
747
+ return {
748
+ tenantId: readString(row, 'tenant_id'),
749
+ artifactId: readString(row, 'artifact_id'),
750
+ revision: readInteger(row, 'revision'),
751
+ mediaType: readString(row, 'media_type'),
752
+ size: readInteger(row, 'size'),
753
+ sha256: readString(row, 'sha256'),
754
+ metadata: decodeJson(readString(row, 'metadata_json'), 'artifact metadata'),
755
+ createdAt: readString(row, 'created_at'),
756
+ updatedAt: readString(row, 'updated_at'),
757
+ };
758
+ }
759
+ function rowToArtifact(row) {
760
+ return {
761
+ ...rowToArtifactSummary(row),
762
+ data: readBytes(row, 'data'),
763
+ };
764
+ }
765
+ function validateSessionKey(key) {
766
+ assertNonEmpty(key.tenantId, 'tenantId');
767
+ assertNonEmpty(key.sessionId, 'sessionId');
768
+ }
769
+ function validateCheckpointKey(key) {
770
+ assertNonEmpty(key.tenantId, 'tenantId');
771
+ assertNonEmpty(key.checkpointId, 'checkpointId');
772
+ }
773
+ function validateMemoryKey(key) {
774
+ assertNonEmpty(key.tenantId, 'tenantId');
775
+ assertNonEmpty(key.memoryId, 'memoryId');
776
+ }
777
+ function validateArtifactKey(key) {
778
+ assertNonEmpty(key.tenantId, 'tenantId');
779
+ assertNonEmpty(key.artifactId, 'artifactId');
780
+ }
781
+ function assertNonEmpty(value, field) {
782
+ if (typeof value !== 'string' || value.length === 0) {
783
+ throw new StorageDataError(`${field} must be a non-empty string`);
784
+ }
785
+ }
786
+ function assertRevision(value, field) {
787
+ if (!Number.isSafeInteger(value) || value < 0) {
788
+ throw new StorageDataError(`${field} must be a non-negative safe integer`);
789
+ }
790
+ }
791
+ function assertSequence(value, field) {
792
+ if (!Number.isSafeInteger(value) || value < 0) {
793
+ throw new StorageDataError(`${field} must be a non-negative safe integer`);
794
+ }
795
+ }
796
+ function assertCas(resource, expected, actual) {
797
+ if (expected !== actual)
798
+ throw new StorageConflictError(resource, expected, actual);
799
+ }
800
+ function normalizeLimit(value) {
801
+ if (value === undefined)
802
+ return -1;
803
+ if (!Number.isSafeInteger(value) || value <= 0) {
804
+ throw new StorageDataError('limit must be a positive safe integer');
805
+ }
806
+ return value;
807
+ }
808
+ function encodeJson(value, label) {
809
+ assertJsonValue(value, label, new Set());
810
+ try {
811
+ return JSON.stringify(value);
812
+ }
813
+ catch (error) {
814
+ throw new StorageDataError(`${label} cannot be serialized as JSON`, { cause: error });
815
+ }
816
+ }
817
+ function decodeJson(raw, label) {
818
+ let value;
819
+ try {
820
+ value = JSON.parse(raw);
821
+ }
822
+ catch (error) {
823
+ throw new StorageDataError(`${label} contains invalid JSON`, { cause: error });
824
+ }
825
+ assertJsonValue(value, label, new Set());
826
+ return value;
827
+ }
828
+ function cloneJson(value) {
829
+ return decodeJson(encodeJson(value, 'JSON value'), 'JSON value');
830
+ }
831
+ function assertJsonValue(value, label, ancestors) {
832
+ if (value === null || typeof value === 'string' || typeof value === 'boolean')
833
+ return;
834
+ if (typeof value === 'number') {
835
+ if (!Number.isFinite(value))
836
+ throw new StorageDataError(`${label} contains a non-finite number`);
837
+ return;
838
+ }
839
+ if (typeof value !== 'object') {
840
+ throw new StorageDataError(`${label} contains a non-JSON value`);
841
+ }
842
+ if (ancestors.has(value))
843
+ throw new StorageDataError(`${label} contains a cycle`);
844
+ ancestors.add(value);
845
+ if (Array.isArray(value)) {
846
+ for (const item of value)
847
+ assertJsonValue(item, label, ancestors);
848
+ }
849
+ else {
850
+ const prototype = Object.getPrototypeOf(value);
851
+ if (prototype !== Object.prototype && prototype !== null) {
852
+ throw new StorageDataError(`${label} contains a non-plain object`);
853
+ }
854
+ for (const item of Object.values(value))
855
+ assertJsonValue(item, label, ancestors);
856
+ }
857
+ ancestors.delete(value);
858
+ }
859
+ function readString(row, field) {
860
+ const value = row[field];
861
+ if (typeof value !== 'string')
862
+ throw corruptRow(field, 'string');
863
+ return value;
864
+ }
865
+ function readNullableString(row, field) {
866
+ const value = row[field];
867
+ if (value === null || value === undefined)
868
+ return undefined;
869
+ if (typeof value !== 'string')
870
+ throw corruptRow(field, 'string or null');
871
+ return value;
872
+ }
873
+ function readInteger(row, field) {
874
+ const value = row[field];
875
+ const normalized = typeof value === 'bigint' ? Number(value) : value;
876
+ if (typeof normalized !== 'number' || !Number.isSafeInteger(normalized)) {
877
+ throw corruptRow(field, 'safe integer');
878
+ }
879
+ return normalized;
880
+ }
881
+ function readBytes(row, field) {
882
+ const value = row[field];
883
+ if (!(value instanceof Uint8Array))
884
+ throw corruptRow(field, 'BLOB');
885
+ return Uint8Array.from(value);
886
+ }
887
+ function corruptRow(field, expected) {
888
+ return new StorageDataError(`SQLite row field ${field} must be ${expected}`);
889
+ }
890
+ function sessionResource(tenantId, sessionId) {
891
+ return `session ${tenantId}/${sessionId}`;
892
+ }
893
+ function checkpointResource(tenantId, checkpointId) {
894
+ return `checkpoint ${tenantId}/${checkpointId}`;
895
+ }
896
+ function memoryResource(tenantId, memoryId) {
897
+ return `memory ${tenantId}/${memoryId}`;
898
+ }
899
+ function artifactResource(tenantId, artifactId) {
900
+ return `artifact ${tenantId}/${artifactId}`;
901
+ }
902
+ function nowIso() {
903
+ return new Date().toISOString();
904
+ }
905
+ //# sourceMappingURL=sqliteStorage.js.map