@stigmer/server 3.24.0 → 3.26.0

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 (341) hide show
  1. package/dist/authorization/authorizer.d.ts +10 -4
  2. package/dist/authorization/authorizer.d.ts.map +1 -1
  3. package/dist/authorization/authorizer.js +11 -4
  4. package/dist/authorization/authorizer.js.map +1 -1
  5. package/dist/authorization/model/index.d.ts +4 -4
  6. package/dist/authorization/model/index.d.ts.map +1 -1
  7. package/dist/authorization/model/index.js +2 -0
  8. package/dist/authorization/model/index.js.map +1 -1
  9. package/dist/authorization/model/oauth_app.d.ts.map +1 -1
  10. package/dist/authorization/model/oauth_app.js +3 -2
  11. package/dist/authorization/model/oauth_app.js.map +1 -1
  12. package/dist/authorization/model/platform_client.d.ts +2 -0
  13. package/dist/authorization/model/platform_client.d.ts.map +1 -0
  14. package/dist/authorization/model/platform_client.js +31 -0
  15. package/dist/authorization/model/platform_client.js.map +1 -0
  16. package/dist/boot/compose.d.ts.map +1 -1
  17. package/dist/boot/compose.js +99 -13
  18. package/dist/boot/compose.js.map +1 -1
  19. package/dist/boot/list-indexes.d.ts +3 -0
  20. package/dist/boot/list-indexes.d.ts.map +1 -0
  21. package/dist/boot/list-indexes.js +24 -0
  22. package/dist/boot/list-indexes.js.map +1 -0
  23. package/dist/boot/route-shadowing.d.ts +25 -0
  24. package/dist/boot/route-shadowing.d.ts.map +1 -0
  25. package/dist/boot/route-shadowing.js +17 -0
  26. package/dist/boot/route-shadowing.js.map +1 -0
  27. package/dist/domain/agentexecution/controller.d.ts.map +1 -1
  28. package/dist/domain/agentexecution/controller.js +6 -8
  29. package/dist/domain/agentexecution/controller.js.map +1 -1
  30. package/dist/domain/agentexecution/list-index.d.ts +2 -0
  31. package/dist/domain/agentexecution/list-index.d.ts.map +1 -0
  32. package/dist/domain/agentexecution/list-index.js +23 -0
  33. package/dist/domain/agentexecution/list-index.js.map +1 -0
  34. package/dist/domain/agentexecution/steps.d.ts +17 -33
  35. package/dist/domain/agentexecution/steps.d.ts.map +1 -1
  36. package/dist/domain/agentexecution/steps.js +94 -95
  37. package/dist/domain/agentexecution/steps.js.map +1 -1
  38. package/dist/domain/agentexecution/usage.d.ts.map +1 -1
  39. package/dist/domain/agentexecution/usage.js +37 -14
  40. package/dist/domain/agentexecution/usage.js.map +1 -1
  41. package/dist/domain/artifact/controller.d.ts.map +1 -1
  42. package/dist/domain/artifact/controller.js +27 -15
  43. package/dist/domain/artifact/controller.js.map +1 -1
  44. package/dist/domain/artifact/list-index.d.ts +2 -0
  45. package/dist/domain/artifact/list-index.d.ts.map +1 -0
  46. package/dist/domain/artifact/list-index.js +21 -0
  47. package/dist/domain/artifact/list-index.js.map +1 -0
  48. package/dist/domain/iampolicy/membership.d.ts +6 -1
  49. package/dist/domain/iampolicy/membership.d.ts.map +1 -1
  50. package/dist/domain/iampolicy/membership.js +8 -2
  51. package/dist/domain/iampolicy/membership.js.map +1 -1
  52. package/dist/domain/identityaccount/constants.d.ts +13 -0
  53. package/dist/domain/identityaccount/constants.d.ts.map +1 -1
  54. package/dist/domain/identityaccount/constants.js +17 -0
  55. package/dist/domain/identityaccount/constants.js.map +1 -1
  56. package/dist/domain/identityaccount/controller.d.ts +3 -1
  57. package/dist/domain/identityaccount/controller.d.ts.map +1 -1
  58. package/dist/domain/identityaccount/controller.js +15 -6
  59. package/dist/domain/identityaccount/controller.js.map +1 -1
  60. package/dist/domain/identityaccount/operator.d.ts.map +1 -1
  61. package/dist/domain/identityaccount/operator.js +1 -0
  62. package/dist/domain/identityaccount/operator.js.map +1 -1
  63. package/dist/domain/identityaccount/provisioning.d.ts +18 -0
  64. package/dist/domain/identityaccount/provisioning.d.ts.map +1 -1
  65. package/dist/domain/identityaccount/provisioning.js +1 -0
  66. package/dist/domain/identityaccount/provisioning.js.map +1 -1
  67. package/dist/domain/identityaccount/resource-store.js +9 -5
  68. package/dist/domain/identityaccount/resource-store.js.map +1 -1
  69. package/dist/domain/identityaccount/steps.d.ts +11 -2
  70. package/dist/domain/identityaccount/steps.d.ts.map +1 -1
  71. package/dist/domain/identityaccount/steps.js +42 -4
  72. package/dist/domain/identityaccount/steps.js.map +1 -1
  73. package/dist/domain/identityaccount/store-contract.d.ts.map +1 -1
  74. package/dist/domain/identityaccount/store-contract.js +33 -0
  75. package/dist/domain/identityaccount/store-contract.js.map +1 -1
  76. package/dist/domain/identityaccount/store.d.ts +7 -5
  77. package/dist/domain/identityaccount/store.d.ts.map +1 -1
  78. package/dist/domain/identityaccount/store.js.map +1 -1
  79. package/dist/domain/platform/controller.d.ts +10 -0
  80. package/dist/domain/platform/controller.d.ts.map +1 -1
  81. package/dist/domain/platform/controller.js +2 -1
  82. package/dist/domain/platform/controller.js.map +1 -1
  83. package/dist/domain/platformclient/constants.d.ts +60 -0
  84. package/dist/domain/platformclient/constants.d.ts.map +1 -0
  85. package/dist/domain/platformclient/constants.js +78 -0
  86. package/dist/domain/platformclient/constants.js.map +1 -0
  87. package/dist/domain/platformclient/controller.d.ts +59 -0
  88. package/dist/domain/platformclient/controller.d.ts.map +1 -0
  89. package/dist/domain/platformclient/controller.js +191 -0
  90. package/dist/domain/platformclient/controller.js.map +1 -0
  91. package/dist/domain/platformclient/credentials.d.ts +13 -0
  92. package/dist/domain/platformclient/credentials.d.ts.map +1 -0
  93. package/dist/domain/platformclient/credentials.js +56 -0
  94. package/dist/domain/platformclient/credentials.js.map +1 -0
  95. package/dist/domain/platformclient/mint.d.ts +23 -0
  96. package/dist/domain/platformclient/mint.d.ts.map +1 -0
  97. package/dist/domain/platformclient/mint.js +254 -0
  98. package/dist/domain/platformclient/mint.js.map +1 -0
  99. package/dist/domain/platformclient/origin-guard.d.ts +9 -0
  100. package/dist/domain/platformclient/origin-guard.d.ts.map +1 -0
  101. package/dist/domain/platformclient/origin-guard.js +81 -0
  102. package/dist/domain/platformclient/origin-guard.js.map +1 -0
  103. package/dist/domain/platformclient/resource-store.d.ts +4 -0
  104. package/dist/domain/platformclient/resource-store.d.ts.map +1 -0
  105. package/dist/domain/platformclient/resource-store.js +117 -0
  106. package/dist/domain/platformclient/resource-store.js.map +1 -0
  107. package/dist/domain/platformclient/steps.d.ts +51 -0
  108. package/dist/domain/platformclient/steps.d.ts.map +1 -0
  109. package/dist/domain/platformclient/steps.js +339 -0
  110. package/dist/domain/platformclient/steps.js.map +1 -0
  111. package/dist/domain/platformclient/store-contract.d.ts +8 -0
  112. package/dist/domain/platformclient/store-contract.d.ts.map +1 -0
  113. package/dist/domain/platformclient/store-contract.js +208 -0
  114. package/dist/domain/platformclient/store-contract.js.map +1 -0
  115. package/dist/domain/platformclient/store.d.ts +58 -0
  116. package/dist/domain/platformclient/store.d.ts.map +1 -0
  117. package/dist/domain/platformclient/store.js +13 -0
  118. package/dist/domain/platformclient/store.js.map +1 -0
  119. package/dist/domain/platformclient/system-managed.d.ts +18 -0
  120. package/dist/domain/platformclient/system-managed.d.ts.map +1 -0
  121. package/dist/domain/platformclient/system-managed.js +80 -0
  122. package/dist/domain/platformclient/system-managed.js.map +1 -0
  123. package/dist/domain/platformclient/token-controller.d.ts +11 -0
  124. package/dist/domain/platformclient/token-controller.d.ts.map +1 -0
  125. package/dist/domain/platformclient/token-controller.js +32 -0
  126. package/dist/domain/platformclient/token-controller.js.map +1 -0
  127. package/dist/domain/platformclient/verifier.d.ts +10 -0
  128. package/dist/domain/platformclient/verifier.d.ts.map +1 -0
  129. package/dist/domain/platformclient/verifier.js +76 -0
  130. package/dist/domain/platformclient/verifier.js.map +1 -0
  131. package/dist/domain/session/list-index.d.ts +4 -0
  132. package/dist/domain/session/list-index.d.ts.map +1 -0
  133. package/dist/domain/session/list-index.js +26 -0
  134. package/dist/domain/session/list-index.js.map +1 -0
  135. package/dist/domain/session/steps.d.ts +7 -8
  136. package/dist/domain/session/steps.d.ts.map +1 -1
  137. package/dist/domain/session/steps.js +76 -78
  138. package/dist/domain/session/steps.js.map +1 -1
  139. package/dist/domain/workflowexecution/controller.d.ts.map +1 -1
  140. package/dist/domain/workflowexecution/controller.js +53 -55
  141. package/dist/domain/workflowexecution/controller.js.map +1 -1
  142. package/dist/domain/workflowexecution/execution-filter.d.ts +4 -0
  143. package/dist/domain/workflowexecution/execution-filter.d.ts.map +1 -1
  144. package/dist/domain/workflowexecution/execution-filter.js +11 -5
  145. package/dist/domain/workflowexecution/execution-filter.js.map +1 -1
  146. package/dist/domain/workflowexecution/get-execution-summary.d.ts.map +1 -1
  147. package/dist/domain/workflowexecution/get-execution-summary.js +23 -17
  148. package/dist/domain/workflowexecution/get-execution-summary.js.map +1 -1
  149. package/dist/domain/workflowexecution/list-index.d.ts +2 -0
  150. package/dist/domain/workflowexecution/list-index.d.ts.map +1 -0
  151. package/dist/domain/workflowexecution/list-index.js +21 -0
  152. package/dist/domain/workflowexecution/list-index.js.map +1 -0
  153. package/dist/domain/workflowexecution/list-pending-approvals.d.ts.map +1 -1
  154. package/dist/domain/workflowexecution/list-pending-approvals.js +69 -32
  155. package/dist/domain/workflowexecution/list-pending-approvals.js.map +1 -1
  156. package/dist/domain/workflowexecution/queries.d.ts +30 -4
  157. package/dist/domain/workflowexecution/queries.d.ts.map +1 -1
  158. package/dist/domain/workflowexecution/queries.js +76 -22
  159. package/dist/domain/workflowexecution/queries.js.map +1 -1
  160. package/dist/encryption/key-manager.d.ts +20 -3
  161. package/dist/encryption/key-manager.d.ts.map +1 -1
  162. package/dist/encryption/key-manager.js +64 -42
  163. package/dist/encryption/key-manager.js.map +1 -1
  164. package/dist/extensions/caller-guards.d.ts +8 -3
  165. package/dist/extensions/caller-guards.d.ts.map +1 -1
  166. package/dist/extensions/drivers.d.ts +37 -0
  167. package/dist/extensions/drivers.d.ts.map +1 -1
  168. package/dist/extensions/guest-token-minting.d.ts +26 -0
  169. package/dist/extensions/guest-token-minting.d.ts.map +1 -0
  170. package/dist/extensions/guest-token-minting.js +2 -0
  171. package/dist/extensions/guest-token-minting.js.map +1 -0
  172. package/dist/extensions/identity.d.ts +6 -4
  173. package/dist/extensions/identity.d.ts.map +1 -1
  174. package/dist/extensions/identity.js.map +1 -1
  175. package/dist/extensions/list-read-scope.d.ts +9 -12
  176. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  177. package/dist/extensions/list-read-scope.js.map +1 -1
  178. package/dist/extensions/registry.d.ts +30 -1
  179. package/dist/extensions/registry.d.ts.map +1 -1
  180. package/dist/extensions/registry.js +34 -1
  181. package/dist/extensions/registry.js.map +1 -1
  182. package/dist/index.d.ts +15 -2
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.js +6 -0
  185. package/dist/index.js.map +1 -1
  186. package/dist/pipeline/interceptors/auth.d.ts +14 -0
  187. package/dist/pipeline/interceptors/auth.d.ts.map +1 -1
  188. package/dist/pipeline/interceptors/auth.js +24 -0
  189. package/dist/pipeline/interceptors/auth.js.map +1 -1
  190. package/dist/pipeline/steps/build-update-state.d.ts +11 -1
  191. package/dist/pipeline/steps/build-update-state.d.ts.map +1 -1
  192. package/dist/pipeline/steps/build-update-state.js +5 -2
  193. package/dist/pipeline/steps/build-update-state.js.map +1 -1
  194. package/dist/pipeline/steps/list-page.d.ts +63 -0
  195. package/dist/pipeline/steps/list-page.d.ts.map +1 -0
  196. package/dist/pipeline/steps/list-page.js +187 -0
  197. package/dist/pipeline/steps/list-page.js.map +1 -0
  198. package/dist/platformtoken/envelope.d.ts +100 -0
  199. package/dist/platformtoken/envelope.d.ts.map +1 -0
  200. package/dist/platformtoken/envelope.js +184 -0
  201. package/dist/platformtoken/envelope.js.map +1 -0
  202. package/dist/platformtoken/key-ring.d.ts +85 -0
  203. package/dist/platformtoken/key-ring.d.ts.map +1 -0
  204. package/dist/platformtoken/key-ring.js +164 -0
  205. package/dist/platformtoken/key-ring.js.map +1 -0
  206. package/dist/query/activity/handler.d.ts +6 -7
  207. package/dist/query/activity/handler.d.ts.map +1 -1
  208. package/dist/query/activity/handler.js +42 -59
  209. package/dist/query/activity/handler.js.map +1 -1
  210. package/dist/store/interface.d.ts +29 -0
  211. package/dist/store/interface.d.ts.map +1 -1
  212. package/dist/store/interface.js.map +1 -1
  213. package/dist/store/list-index.d.ts +123 -0
  214. package/dist/store/list-index.d.ts.map +1 -0
  215. package/dist/store/list-index.js +277 -0
  216. package/dist/store/list-index.js.map +1 -0
  217. package/dist/store/logger.d.ts +3 -0
  218. package/dist/store/logger.d.ts.map +1 -1
  219. package/dist/store/logger.js +5 -1
  220. package/dist/store/logger.js.map +1 -1
  221. package/dist/store/postgres/migrations.d.ts +10 -6
  222. package/dist/store/postgres/migrations.d.ts.map +1 -1
  223. package/dist/store/postgres/migrations.js +64 -6
  224. package/dist/store/postgres/migrations.js.map +1 -1
  225. package/dist/store/postgres/store.d.ts +26 -5
  226. package/dist/store/postgres/store.d.ts.map +1 -1
  227. package/dist/store/postgres/store.js +377 -22
  228. package/dist/store/postgres/store.js.map +1 -1
  229. package/dist/store/sqlite/migrations.d.ts +11 -5
  230. package/dist/store/sqlite/migrations.d.ts.map +1 -1
  231. package/dist/store/sqlite/migrations.js +50 -4
  232. package/dist/store/sqlite/migrations.js.map +1 -1
  233. package/dist/store/sqlite/store.d.ts +18 -3
  234. package/dist/store/sqlite/store.d.ts.map +1 -1
  235. package/dist/store/sqlite/store.js +321 -15
  236. package/dist/store/sqlite/store.js.map +1 -1
  237. package/package.json +6 -6
  238. package/src/authorization/README.md +1 -1
  239. package/src/authorization/__tests__/authorizer.test.ts +6 -2
  240. package/src/authorization/__tests__/drivers.ts +6 -1
  241. package/src/authorization/__tests__/wire-permissions.test.ts +1 -0
  242. package/src/authorization/authorizer.ts +11 -4
  243. package/src/authorization/model/__tests__/registry.test.ts +8 -1
  244. package/src/authorization/model/index.ts +6 -4
  245. package/src/authorization/model/oauth_app.ts +3 -2
  246. package/src/authorization/model/platform_client.ts +43 -0
  247. package/src/boot/__tests__/auth-enabled-composition.test.ts +2 -1
  248. package/src/boot/__tests__/list-indexes.test.ts +65 -0
  249. package/src/boot/__tests__/route-shadowing.test.ts +67 -0
  250. package/src/boot/compose.ts +113 -18
  251. package/src/boot/list-indexes.ts +25 -0
  252. package/src/boot/route-shadowing.ts +47 -0
  253. package/src/domain/agentexecution/__tests__/agentexecution.test.ts +85 -3
  254. package/src/domain/agentexecution/controller.ts +8 -10
  255. package/src/domain/agentexecution/list-index.ts +24 -0
  256. package/src/domain/agentexecution/steps.ts +118 -115
  257. package/src/domain/agentexecution/usage.ts +38 -17
  258. package/src/domain/artifact/controller.ts +28 -18
  259. package/src/domain/artifact/list-index.ts +22 -0
  260. package/src/domain/iampolicy/__tests__/membership.test.ts +7 -0
  261. package/src/domain/iampolicy/membership.ts +8 -2
  262. package/src/domain/identityaccount/__tests__/platform-client-accounts.test.ts +124 -0
  263. package/src/domain/identityaccount/__tests__/resource-store.test.ts +1 -0
  264. package/src/domain/identityaccount/constants.ts +20 -0
  265. package/src/domain/identityaccount/controller.ts +16 -4
  266. package/src/domain/identityaccount/operator.ts +1 -0
  267. package/src/domain/identityaccount/provisioning.ts +17 -0
  268. package/src/domain/identityaccount/resource-store.ts +9 -5
  269. package/src/domain/identityaccount/steps.ts +58 -3
  270. package/src/domain/identityaccount/store-contract.ts +51 -0
  271. package/src/domain/identityaccount/store.ts +7 -5
  272. package/src/domain/platform/__tests__/platform.test.ts +7 -1
  273. package/src/domain/platform/controller.ts +12 -1
  274. package/src/domain/platformclient/__tests__/controller.test.ts +397 -0
  275. package/src/domain/platformclient/__tests__/credentials.test.ts +46 -0
  276. package/src/domain/platformclient/__tests__/mint.test.ts +415 -0
  277. package/src/domain/platformclient/__tests__/resource-store.test.ts +140 -0
  278. package/src/domain/platformclient/__tests__/system-managed.test.ts +101 -0
  279. package/src/domain/platformclient/__tests__/verifier-and-guard.test.ts +207 -0
  280. package/src/domain/platformclient/constants.ts +120 -0
  281. package/src/domain/platformclient/controller.ts +449 -0
  282. package/src/domain/platformclient/credentials.ts +68 -0
  283. package/src/domain/platformclient/mint.ts +412 -0
  284. package/src/domain/platformclient/origin-guard.ts +117 -0
  285. package/src/domain/platformclient/resource-store.ts +150 -0
  286. package/src/domain/platformclient/steps.ts +472 -0
  287. package/src/domain/platformclient/store-contract.ts +318 -0
  288. package/src/domain/platformclient/store.ts +63 -0
  289. package/src/domain/platformclient/system-managed.ts +115 -0
  290. package/src/domain/platformclient/token-controller.ts +49 -0
  291. package/src/domain/platformclient/verifier.ts +106 -0
  292. package/src/domain/session/list-index.ts +28 -0
  293. package/src/domain/session/steps.ts +108 -123
  294. package/src/domain/workflowexecution/__tests__/list-read-scope-summaries.test.ts +155 -99
  295. package/src/domain/workflowexecution/__tests__/workflowexecution.test.ts +193 -31
  296. package/src/domain/workflowexecution/controller.ts +54 -82
  297. package/src/domain/workflowexecution/execution-filter.ts +20 -7
  298. package/src/domain/workflowexecution/get-execution-summary.ts +31 -24
  299. package/src/domain/workflowexecution/list-index.ts +22 -0
  300. package/src/domain/workflowexecution/list-pending-approvals.ts +82 -25
  301. package/src/domain/workflowexecution/queries.ts +134 -23
  302. package/src/encryption/key-manager.ts +87 -44
  303. package/src/extensions/__tests__/extension-composition.test.ts +3 -2
  304. package/src/extensions/__tests__/platform-client-composed.test.ts +288 -0
  305. package/src/extensions/__tests__/registry.test.ts +4 -1
  306. package/src/extensions/__tests__/tier-truthfulness.test.ts +8 -0
  307. package/src/extensions/caller-guards.ts +8 -3
  308. package/src/extensions/drivers.ts +37 -0
  309. package/src/extensions/guest-token-minting.ts +32 -0
  310. package/src/extensions/identity.ts +6 -4
  311. package/src/extensions/list-read-scope.ts +9 -12
  312. package/src/extensions/registry.ts +77 -3
  313. package/src/index.ts +65 -1
  314. package/src/pipeline/interceptors/auth.ts +27 -0
  315. package/src/pipeline/steps/__tests__/list-page.test.ts +186 -0
  316. package/src/pipeline/steps/__tests__/references.test.ts +2 -0
  317. package/src/pipeline/steps/build-update-state.ts +5 -2
  318. package/src/pipeline/steps/list-page.ts +284 -0
  319. package/src/platformtoken/__tests__/envelope.test.ts +277 -0
  320. package/src/platformtoken/__tests__/key-ring.test.ts +205 -0
  321. package/src/platformtoken/envelope.ts +276 -0
  322. package/src/platformtoken/key-ring.ts +266 -0
  323. package/src/query/activity/handler.ts +57 -78
  324. package/src/runnerauth/__tests__/runner-subject-composed.test.ts +9 -3
  325. package/src/store/README.md +51 -32
  326. package/src/store/__tests__/list-index.measure.test.ts +293 -0
  327. package/src/store/__tests__/list-index.test.ts +328 -0
  328. package/src/store/__tests__/store-contract.ts +346 -3
  329. package/src/store/interface.ts +39 -0
  330. package/src/store/list-index.ts +465 -0
  331. package/src/store/logger.ts +8 -1
  332. package/src/store/postgres/__tests__/list-index-repair.test.ts +133 -0
  333. package/src/store/postgres/__tests__/migrations.test.ts +27 -19
  334. package/src/store/postgres/__tests__/store-contract.test.ts +50 -3
  335. package/src/store/postgres/migrations.ts +69 -7
  336. package/src/store/postgres/store.ts +485 -29
  337. package/src/store/sqlite/__tests__/migrations.test.ts +51 -7
  338. package/src/store/sqlite/__tests__/store-contract.test.ts +70 -16
  339. package/src/store/sqlite/__tests__/support.ts +12 -3
  340. package/src/store/sqlite/migrations.ts +57 -6
  341. package/src/store/sqlite/store.ts +462 -21
@@ -9,7 +9,9 @@
9
9
  * (< 6) runs nothing. v10, the chain's first row-decoding step, moves
10
10
  * every row of the seven kinds that held the retired public level to org
11
11
  * and leaves every other row's bytes as they were; a row it cannot decode
12
- * fails the step and leaves the database at v9.
12
+ * fails the step and leaves the database at v9. v11 adds the list index's
13
+ * schema only, and a Go-written row of a declared kind is derived by the
14
+ * store's reconciliation at open and read through the index.
13
15
  */
14
16
  import { mkdtempSync, rmSync } from "node:fs";
15
17
  import { tmpdir } from "node:os";
@@ -22,8 +24,13 @@ import { create, fromBinary, fromJson, toBinary } from "@bufbuild/protobuf";
22
24
  import type { DescMessage } from "@bufbuild/protobuf";
23
25
 
24
26
  import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
27
+ import { SessionSchema } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
25
28
  import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
26
29
 
30
+ import {
31
+ CONTRACT_SESSION_INDEX,
32
+ CONTRACT_STORE_OPTIONS,
33
+ } from "../../__tests__/store-contract.js";
27
34
  import { SqliteStore } from "../store.js";
28
35
  import {
29
36
  CURRENT_SCHEMA_VERSION,
@@ -93,7 +100,7 @@ describe("fresh database", () => {
93
100
  .prepare(`SELECT version FROM schema_version ORDER BY version`)
94
101
  .all() as Array<{ version: number }>;
95
102
  expect(rows.map((row) => row.version)).toEqual([
96
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
103
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
97
104
  ]);
98
105
  });
99
106
 
@@ -218,6 +225,46 @@ describe("Go-created v6 database adoption (DD-002 fixture)", () => {
218
225
  expect(hits).toEqual([{ resource_id: "acme" }]);
219
226
  });
220
227
 
228
+ it("derives the list facts of a Go-written row of a declared kind at open", async () => {
229
+ const fixture = materializeGoFixture();
230
+ cleanups.push(() => fixture.cleanup());
231
+
232
+ // A session as the Go server wrote it: four columns, no list facts.
233
+ const session = create(SessionSchema, {
234
+ metadata: { id: "ses_go", org: "acme" },
235
+ spec: { agentInstanceId: "ain_go" },
236
+ });
237
+ const before = new DatabaseSync(fixture.dbPath);
238
+ before
239
+ .prepare(
240
+ `INSERT INTO resources VALUES ('session', 'ses_go', ?, '2026-08-23 11:43:54')`,
241
+ )
242
+ .run(toBinary(SessionSchema, session));
243
+ before.close();
244
+
245
+ const store = SqliteStore.open(
246
+ fixture.dbPath,
247
+ undefined,
248
+ CONTRACT_STORE_OPTIONS,
249
+ );
250
+ cleanups.push(() => store.close());
251
+
252
+ const db = new DatabaseSync(fixture.dbPath);
253
+ cleanups.push(() => db.close());
254
+ const unproven = db
255
+ .prepare(
256
+ `SELECT count(*) AS count FROM resources WHERE list_indexed_at IS NOT updated_at`,
257
+ )
258
+ .get() as { count: number };
259
+ expect(unproven.count, "every adopted row derived or stamped at open").toBe(
260
+ 0,
261
+ );
262
+ const rows = await store.queryResources(CONTRACT_SESSION_INDEX, {
263
+ anyKey: [{ name: "agent_instance", value: "ain_go" }],
264
+ });
265
+ expect(rows.map((row) => row.id)).toEqual(["ses_go"]);
266
+ });
267
+
221
268
  it("reads a Go-marshaled resource blob through the TS driver (wire-format continuity)", async () => {
222
269
  const fixture = materializeGoFixture();
223
270
  cleanups.push(() => fixture.cleanup());
@@ -349,14 +396,11 @@ describe("rollback safety (DD-006)", () => {
349
396
  });
350
397
 
351
398
  describe("v10: the retired public level leaves every row", () => {
352
- /** A v9 database: the chain replayed, then v10's version row removed. */
399
+ /** A v9 database: the chain replayed up to the step before v10. */
353
400
  function v9Database(): { dbPath: string; db: DatabaseSync } {
354
401
  const dbPath = tempDbPath();
355
402
  const setup = new DatabaseSync(dbPath);
356
- runMigrations(setup);
357
- setup
358
- .prepare(`DELETE FROM schema_version WHERE version = ?`)
359
- .run(SCHEMA_VERSION_10);
403
+ runMigrations(setup, SCHEMA_VERSION_10 - 1);
360
404
  expect(getSchemaVersion(setup)).toBe(SCHEMA_VERSION_10 - 1);
361
405
  return { dbPath, db: setup };
362
406
  }
@@ -3,39 +3,93 @@
3
3
  * store-contract.ts) against the sqlite driver — the extraction target of
4
4
  * the Phase-1 store.test.ts/substores.test.ts interface-shaped cases (T01
5
5
  * D-4). sqlite-physical pins stay in store.test.ts; the engine-specific
6
- * search half stays in fts5.test.ts.
6
+ * search half stays in fts5.test.ts. The escape hatches ride a second
7
+ * connection: the store's own is busy being the subject.
7
8
  */
8
9
  import { DatabaseSync } from "node:sqlite";
9
10
 
10
11
  import { describe } from "vitest";
11
12
 
13
+ import type { Store } from "../../interface.js";
14
+ import { apiResourceKindName } from "../../proto-fields.js";
12
15
  import type { StoreContractFixture } from "../../__tests__/store-contract.js";
13
- import { describeStoreContract } from "../../__tests__/store-contract.js";
16
+ import {
17
+ CONTRACT_STORE_OPTIONS,
18
+ describeStoreContract,
19
+ } from "../../__tests__/store-contract.js";
20
+ import { SqliteStore } from "../store.js";
14
21
  import { tempStore } from "./support.js";
15
22
 
16
23
  describe("sqlite store contract", () => {
17
24
  describeStoreContract(async (): Promise<StoreContractFixture> => {
18
- const temp = tempStore();
25
+ const temp = tempStore(CONTRACT_STORE_OPTIONS);
26
+ const others: Store[] = [];
27
+ const withConnection = <T>(work: (db: DatabaseSync) => T): T => {
28
+ const db = new DatabaseSync(temp.dbPath);
29
+ try {
30
+ return work(db);
31
+ } finally {
32
+ db.close();
33
+ }
34
+ };
19
35
  return {
20
36
  store: temp.store,
21
37
  async forceDedupeExpiry(id, expiresAtIso) {
22
- // A second connection: the store's own is busy being the subject.
23
- const db = new DatabaseSync(temp.dbPath);
24
- db.prepare(`UPDATE signal_dedupe SET expires_at = ? WHERE id = ?`).run(
25
- expiresAtIso,
26
- id,
38
+ withConnection((db) =>
39
+ db
40
+ .prepare(`UPDATE signal_dedupe SET expires_at = ? WHERE id = ?`)
41
+ .run(expiresAtIso, id),
27
42
  );
28
- db.close();
29
43
  },
30
44
  async countPendingOAuthStates() {
31
- const db = new DatabaseSync(temp.dbPath);
32
- const row = db
33
- .prepare(`SELECT COUNT(*) AS count FROM pending_oauth_state`)
34
- .get() as { count: number };
35
- db.close();
36
- return row.count;
45
+ return withConnection(
46
+ (db) =>
47
+ (
48
+ db
49
+ .prepare(`SELECT COUNT(*) AS count FROM pending_oauth_state`)
50
+ .get() as {
51
+ count: number;
52
+ }
53
+ ).count,
54
+ );
55
+ },
56
+ async writeAsOlderBinary(kind, id, data) {
57
+ // The statement this driver ran before the list index existed.
58
+ withConnection((db) =>
59
+ db
60
+ .prepare(
61
+ `INSERT OR REPLACE INTO resources (kind, id, data, updated_at) VALUES (?, ?, ?, datetime('now'))`,
62
+ )
63
+ .run(apiResourceKindName(kind), id, data),
64
+ );
65
+ },
66
+ async countUnproven(kind, revision) {
67
+ return withConnection((db) => {
68
+ const revisionArm =
69
+ revision === undefined
70
+ ? ""
71
+ : ` OR list_index_revision IS NULL OR list_index_revision <> ${revision}`;
72
+ return (
73
+ db
74
+ .prepare(
75
+ `SELECT COUNT(*) AS count FROM resources
76
+ WHERE kind = ? AND (list_indexed_at IS NOT updated_at${revisionArm})`,
77
+ )
78
+ .get(apiResourceKindName(kind)) as { count: number }
79
+ ).count;
80
+ });
81
+ },
82
+ async openAnother(options) {
83
+ const other = SqliteStore.open(temp.dbPath, undefined, options);
84
+ others.push(other);
85
+ return other;
86
+ },
87
+ async cleanup() {
88
+ for (const other of others) {
89
+ await other.close();
90
+ }
91
+ await temp.cleanup();
37
92
  },
38
- cleanup: () => temp.cleanup(),
39
93
  };
40
94
  });
41
95
  });
@@ -9,6 +9,8 @@ import { tmpdir } from "node:os";
9
9
  import path from "node:path";
10
10
  import { DatabaseSync } from "node:sqlite";
11
11
 
12
+ import { LIST_INDEXES } from "../../../boot/list-indexes.js";
13
+ import type { StoreOpenOptions } from "../../interface.js";
12
14
  import { SqliteStore } from "../store.js";
13
15
 
14
16
  export { makeOrganization } from "../../__tests__/support.js";
@@ -19,11 +21,18 @@ export interface TempStore {
19
21
  cleanup(): Promise<void>;
20
22
  }
21
23
 
22
- /** A fresh store on a throwaway database file. */
23
- export function tempStore(): TempStore {
24
+ /**
25
+ * A fresh store on a throwaway database file, opened with the server's
26
+ * list indexes (boot/list-indexes.ts) the way the composition root opens
27
+ * one, so a lane under test reads through the index it reads in
28
+ * production. `options` replaces them for a test that declares its own.
29
+ */
30
+ export function tempStore(
31
+ options: StoreOpenOptions = { listIndexes: LIST_INDEXES },
32
+ ): TempStore {
24
33
  const dir = mkdtempSync(path.join(tmpdir(), "stigmer-store-test-"));
25
34
  const dbPath = path.join(dir, "stigmer.db");
26
- const store = SqliteStore.open(dbPath);
35
+ const store = SqliteStore.open(dbPath, undefined, options);
27
36
  return {
28
37
  store,
29
38
  dbPath,
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Versioned schema migrations — ports the inline chain in
3
3
  * backend/libs/go/store/sqlite/store.go (v1–v6, DDL character-faithful),
4
- * adds v7, the OD-3 consolidation (D2 §3), and v8, the by-resource
5
- * oauth_grant index (the channel teardown's query pattern, C3 Stage 6).
4
+ * adds v7, the OD-3 consolidation (D2 §3), v8, the by-resource
5
+ * oauth_grant index (the channel teardown's query pattern, C3 Stage 6),
6
+ * and the later steps each named at its constant below.
6
7
  *
7
8
  * Schema continuity across cutover is the design point: a database the Go
8
9
  * server created at any version migrates forward through the SAME steps Go
@@ -51,12 +52,20 @@ export const SCHEMA_VERSION_8 = 8;
51
52
  export const SCHEMA_VERSION_9 = 9;
52
53
  /** v10: every row holding the retired public visibility level moved to org. */
53
54
  export const SCHEMA_VERSION_10 = 10;
55
+ /** v11: the list index's columns, key table and indexes (DDL only). */
56
+ export const SCHEMA_VERSION_11 = 11;
54
57
 
55
58
  /** Target version for new databases. */
56
- export const CURRENT_SCHEMA_VERSION = SCHEMA_VERSION_10;
59
+ export const CURRENT_SCHEMA_VERSION = SCHEMA_VERSION_11;
57
60
 
58
- /** Applies all pending migrations in order. */
59
- export function runMigrations(db: DatabaseSync): void {
61
+ /**
62
+ * Applies every pending migration up to `targetVersion` in order — all of
63
+ * them unless a test builds the database a given step starts from.
64
+ */
65
+ export function runMigrations(
66
+ db: DatabaseSync,
67
+ targetVersion: number = CURRENT_SCHEMA_VERSION,
68
+ ): void {
60
69
  db.exec(`
61
70
  CREATE TABLE IF NOT EXISTS schema_version (
62
71
  version INTEGER PRIMARY KEY,
@@ -77,10 +86,11 @@ export function runMigrations(db: DatabaseSync): void {
77
86
  [SCHEMA_VERSION_8, migrateToV8],
78
87
  [SCHEMA_VERSION_9, migrateToV9],
79
88
  [SCHEMA_VERSION_10, migrateToV10],
89
+ [SCHEMA_VERSION_11, migrateToV11],
80
90
  ];
81
91
 
82
92
  for (const [version, migrate] of chain) {
83
- if (currentVersion < version) {
93
+ if (currentVersion < version && version <= targetVersion) {
84
94
  applyInTransaction(db, version, migrate);
85
95
  }
86
96
  }
@@ -423,3 +433,44 @@ function migrateToV10(db: DatabaseSync): void {
423
433
  }
424
434
  }
425
435
  }
436
+
437
+ /**
438
+ * v11: the list index (../list-index.ts) — schema only, the Postgres
439
+ * driver's v6 in this engine's terms (postgres/migrations.ts gives the
440
+ * reasons for every column and index). Existing rows, a Go-era database's
441
+ * included, arrive unproven and are derived by the store's reconciliation
442
+ * at open. sqlite compares text as bytes (BINARY) by default, the order
443
+ * list-index.ts merges in, so no collation is spelled here. The store now
444
+ * writes `updated_at` to the millisecond and the stamp from the same
445
+ * expression in the same statement; a writer that does not know the index
446
+ * writes `datetime('now')`, whole seconds, which can never equal a stamp.
447
+ */
448
+ function migrateToV11(db: DatabaseSync): void {
449
+ db.exec(`
450
+ ALTER TABLE resources ADD COLUMN list_org TEXT;
451
+ ALTER TABLE resources ADD COLUMN list_created_at TEXT;
452
+ ALTER TABLE resources ADD COLUMN list_index_revision INTEGER;
453
+ ALTER TABLE resources ADD COLUMN list_indexed_at TEXT;
454
+
455
+ CREATE INDEX idx_resources_list_org
456
+ ON resources (kind, list_org, list_created_at, id);
457
+ CREATE INDEX idx_resources_list_created
458
+ ON resources (kind, list_created_at, id);
459
+ CREATE INDEX idx_resources_list_revision
460
+ ON resources (kind, list_index_revision);
461
+ CREATE INDEX idx_resources_list_unproven
462
+ ON resources (kind, id) WHERE list_indexed_at IS NOT updated_at;
463
+
464
+ CREATE TABLE resource_list_keys (
465
+ kind TEXT NOT NULL,
466
+ id TEXT NOT NULL,
467
+ key TEXT NOT NULL,
468
+ value TEXT NOT NULL,
469
+ created_at TEXT NOT NULL,
470
+ PRIMARY KEY (kind, id, key)
471
+ ) WITHOUT ROWID;
472
+
473
+ CREATE INDEX idx_resource_list_keys_lookup
474
+ ON resource_list_keys (kind, key, value, created_at, id);
475
+ `);
476
+ }