okengine 0.2.6 → 0.2.8

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 (584) hide show
  1. package/AGENTS.md +24 -23
  2. package/README.md +52 -346
  3. package/docs/spec/console.md +165 -142
  4. package/docs/spec/example.md +490 -312
  5. package/docs/spec/four-applications.md +495 -314
  6. package/docs/spec/unified-theory.md +184 -175
  7. package/package.json +45 -37
  8. package/spec/manifest.v1.schema.json +40 -9
  9. package/src/auth/api-keys.ts +2 -5
  10. package/src/auth/attenuation.ts +2 -6
  11. package/src/auth/auth.test.ts +53 -31
  12. package/src/auth/invoke-as.ts +1 -3
  13. package/src/auth/operator.ts +8 -26
  14. package/src/auth/planes.ts +2 -7
  15. package/src/auth/plugin.ts +4 -7
  16. package/src/auth/roles.ts +1 -5
  17. package/src/auth/sessions.ts +10 -39
  18. package/src/cli/args.ts +1 -5
  19. package/src/cli/ask-dev-mode.ts +40 -0
  20. package/src/cli/build.ts +1 -2
  21. package/src/cli/client-add.test.ts +8 -15
  22. package/src/cli/client-add.ts +5 -14
  23. package/src/cli/completion.test.ts +1 -5
  24. package/src/cli/completion.ts +4 -17
  25. package/src/cli/db-auto-push.test.ts +64 -0
  26. package/src/cli/db-auto-push.ts +72 -0
  27. package/src/cli/db.test.ts +189 -0
  28. package/src/cli/db.ts +386 -0
  29. package/src/cli/dev-app-runner.ts +2 -8
  30. package/src/cli/dev-db-push.test.ts +163 -0
  31. package/src/cli/dev-mode.test.ts +45 -0
  32. package/src/cli/dev-mode.ts +78 -0
  33. package/src/cli/dev.test.ts +148 -21
  34. package/src/cli/dev.ts +208 -134
  35. package/src/cli/doc-drift.test.ts +3 -2
  36. package/src/cli/doc-drift.ts +21 -50
  37. package/src/cli/doc-staleness.test.ts +69 -0
  38. package/src/cli/docker-cli.test.ts +7 -8
  39. package/src/cli/docker.ts +1 -3
  40. package/src/cli/doctor-diff-examples.ts +1 -3
  41. package/src/cli/doctor-diff.test.ts +1 -5
  42. package/src/cli/doctor-diff.ts +17 -46
  43. package/src/cli/doctor-pii.ts +2 -7
  44. package/src/cli/doctor.test.ts +26 -4
  45. package/src/cli/doctor.ts +35 -11
  46. package/src/cli/eval.ts +4 -14
  47. package/src/cli/gates-list.ts +1 -4
  48. package/src/cli/hero-meta.test.ts +17 -19
  49. package/src/cli/hero-meta.ts +20 -30
  50. package/src/cli/images.ts +3 -8
  51. package/src/cli/index.ts +11 -2
  52. package/src/cli/load-config.images.test.ts +14 -14
  53. package/src/cli/load-config.ts +41 -47
  54. package/src/cli/mcp-from-console.ts +1 -4
  55. package/src/cli/mode.ts +45 -0
  56. package/src/cli/ports.test.ts +4 -13
  57. package/src/cli/ports.ts +1 -3
  58. package/src/cli/privacy-erase.ts +1 -3
  59. package/src/cli/registry.ts +75 -25
  60. package/src/cli/schema.ts +3 -10
  61. package/src/cli/stack.ts +2 -7
  62. package/src/cli/start.ts +4 -15
  63. package/src/cli/upgrade.ts +1 -4
  64. package/src/client/budget-entry.ts +1 -6
  65. package/src/client/create.test.ts +6 -12
  66. package/src/client/create.ts +2 -8
  67. package/src/client/errors.ts +1 -4
  68. package/src/client/index.ts +1 -6
  69. package/src/client/notes-contract.test.ts +4 -13
  70. package/src/client/transport.ts +9 -30
  71. package/src/client/types.ts +8 -29
  72. package/src/compiler/aot.test.ts +2 -9
  73. package/src/compiler/aot.ts +1 -4
  74. package/src/compiler/differential.test.ts +3 -11
  75. package/src/compiler/dynamic.ts +1 -4
  76. package/src/compiler/effects-infer.ts +8 -34
  77. package/src/compiler/emit.ts +1 -3
  78. package/src/compiler/extract.test.ts +96 -30
  79. package/src/compiler/extract.ts +362 -156
  80. package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
  81. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  82. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  83. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  84. package/src/compiler/fixtures/skyport.expected.json +24 -83
  85. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  86. package/src/compiler/http-parse.ts +2 -9
  87. package/src/compiler/index.ts +1 -5
  88. package/src/compiler/response.ts +4 -7
  89. package/src/compiler/sucrose.ts +11 -31
  90. package/src/config/define-config.test.ts +57 -34
  91. package/src/config/index.ts +181 -37
  92. package/src/config/resolve-driver.test.ts +28 -17
  93. package/src/console/budget.test.ts +1 -4
  94. package/src/console/index.ts +1 -4
  95. package/src/console/server/access.test.ts +15 -43
  96. package/src/console/server/access.ts +19 -49
  97. package/src/console/server/ai.test.ts +3 -11
  98. package/src/console/server/ai.ts +23 -46
  99. package/src/console/server/app.ts +14 -45
  100. package/src/console/server/auth-rate.test.ts +4 -12
  101. package/src/console/server/bind.ts +1 -5
  102. package/src/console/server/channels.test.ts +2 -6
  103. package/src/console/server/channels.ts +10 -35
  104. package/src/console/server/claim.ts +2 -8
  105. package/src/console/server/clock.test.ts +2 -6
  106. package/src/console/server/clock.ts +8 -26
  107. package/src/console/server/console.test.ts +1 -3
  108. package/src/console/server/diff.test.ts +5 -17
  109. package/src/console/server/diff.ts +10 -31
  110. package/src/console/server/dry-run.audit.test.ts +2 -8
  111. package/src/console/server/flows.ts +64 -233
  112. package/src/console/server/gates.test.ts +14 -50
  113. package/src/console/server/gates.ts +13 -48
  114. package/src/console/server/index.ts +2 -9
  115. package/src/console/server/live.ts +3 -12
  116. package/src/console/server/operator-db.test.ts +4 -15
  117. package/src/console/server/operator-db.ts +13 -32
  118. package/src/console/server/plugin.ts +50 -53
  119. package/src/console/server/plugins.test.ts +2 -6
  120. package/src/console/server/plugins.ts +17 -56
  121. package/src/console/server/runs-pii.ts +2 -7
  122. package/src/console/server/security.gate.test.ts +18 -40
  123. package/src/console/server/serve.ts +10 -25
  124. package/src/console/server/signals.test.ts +1 -3
  125. package/src/console/server/signals.ts +17 -40
  126. package/src/console/server/state.ts +21 -59
  127. package/src/console/server/store.test.ts +20 -22
  128. package/src/console/server/store.ts +31 -76
  129. package/src/console/server/vault.test.ts +12 -29
  130. package/src/console/server/vault.ts +23 -60
  131. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  132. package/src/console/ui/access/a11y.test.tsx +3 -12
  133. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  134. package/src/console/ui/access/acknowledgement.ts +1 -3
  135. package/src/console/ui/access/blast-radius.ts +1 -3
  136. package/src/console/ui/access/confirmation.test.ts +1 -5
  137. package/src/console/ui/access/confirmation.ts +1 -4
  138. package/src/console/ui/access/fixture.ts +1 -5
  139. package/src/console/ui/access/grantable.test.ts +1 -3
  140. package/src/console/ui/access/grantable.ts +2 -7
  141. package/src/console/ui/access/index.ts +2 -9
  142. package/src/console/ui/access/provenance.test.ts +1 -3
  143. package/src/console/ui/access/provenance.ts +2 -6
  144. package/src/console/ui/access/search.test.ts +1 -5
  145. package/src/console/ui/access/search.ts +2 -6
  146. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  147. package/src/console/ui/ai/a11y.test.tsx +2 -5
  148. package/src/console/ui/ai/fixture.ts +2 -7
  149. package/src/console/ui/ai/format.ts +1 -3
  150. package/src/console/ui/ai/group.test.ts +1 -3
  151. package/src/console/ui/ai/group.ts +4 -12
  152. package/src/console/ui/ai/index.ts +2 -9
  153. package/src/console/ui/ai/promotion.test.ts +2 -7
  154. package/src/console/ui/ai/promotion.ts +4 -13
  155. package/src/console/ui/ai/search.test.ts +2 -11
  156. package/src/console/ui/ai/search.ts +3 -13
  157. package/src/console/ui/ai/types.ts +1 -8
  158. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  159. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  160. package/src/console/ui/architecture/declared.ts +1 -5
  161. package/src/console/ui/architecture/index.ts +7 -35
  162. package/src/console/ui/architecture/layout.ts +1 -3
  163. package/src/console/ui/architecture/pathologies.ts +10 -19
  164. package/src/console/ui/architecture/search.ts +6 -15
  165. package/src/console/ui/architecture/traffic.ts +4 -14
  166. package/src/console/ui/architecture/types.ts +2 -10
  167. package/src/console/ui/architecture/view.test.ts +7 -19
  168. package/src/console/ui/architecture/view.ts +9 -36
  169. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  170. package/src/console/ui/channels/a11y.test.tsx +1 -2
  171. package/src/console/ui/channels/confirmation.test.ts +1 -4
  172. package/src/console/ui/channels/confirmation.ts +1 -4
  173. package/src/console/ui/channels/findings.ts +1 -5
  174. package/src/console/ui/channels/index.ts +2 -8
  175. package/src/console/ui/channels/locale.test.ts +1 -3
  176. package/src/console/ui/channels/locale.ts +2 -8
  177. package/src/console/ui/channels/search.ts +4 -13
  178. package/src/console/ui/channels/taxonomy.ts +1 -3
  179. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  180. package/src/console/ui/clock/a11y.test.tsx +2 -5
  181. package/src/console/ui/clock/confirmation.test.ts +1 -3
  182. package/src/console/ui/clock/confirmation.ts +1 -4
  183. package/src/console/ui/clock/findings.ts +1 -4
  184. package/src/console/ui/clock/health.ts +2 -7
  185. package/src/console/ui/clock/index.ts +2 -10
  186. package/src/console/ui/clock/search.test.ts +1 -3
  187. package/src/console/ui/clock/search.ts +2 -6
  188. package/src/console/ui/clock/timeline.test.ts +1 -3
  189. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  190. package/src/console/ui/clock/waiting-on.ts +2 -7
  191. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  192. package/src/console/ui/diff/a11y.test.tsx +2 -5
  193. package/src/console/ui/diff/group.test.ts +3 -13
  194. package/src/console/ui/diff/group.ts +2 -8
  195. package/src/console/ui/diff/index.ts +2 -8
  196. package/src/console/ui/diff/search.test.ts +1 -5
  197. package/src/console/ui/diff/search.ts +4 -16
  198. package/src/console/ui/diff/summary.ts +1 -2
  199. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  200. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  201. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  202. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  203. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  204. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  205. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  206. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  207. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  208. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  209. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  210. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  211. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  212. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  213. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  214. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  215. package/src/console/ui/dist/index.html +1 -1
  216. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  217. package/src/console/ui/flows/a11y.test.tsx +2 -8
  218. package/src/console/ui/flows/buffer.test.ts +3 -11
  219. package/src/console/ui/flows/buffer.ts +4 -11
  220. package/src/console/ui/flows/confirmation.ts +1 -3
  221. package/src/console/ui/flows/contract.test.ts +3 -7
  222. package/src/console/ui/flows/contract.ts +12 -36
  223. package/src/console/ui/flows/graph.test.ts +3 -11
  224. package/src/console/ui/flows/graph.ts +5 -15
  225. package/src/console/ui/flows/index.ts +1 -6
  226. package/src/console/ui/flows/save-as-test.ts +1 -3
  227. package/src/console/ui/flows/search.ts +8 -25
  228. package/src/console/ui/flows/tiers.ts +2 -9
  229. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  230. package/src/console/ui/gates/a11y.test.tsx +2 -5
  231. package/src/console/ui/gates/audit.ts +1 -3
  232. package/src/console/ui/gates/denial.test.ts +1 -3
  233. package/src/console/ui/gates/denial.ts +4 -12
  234. package/src/console/ui/gates/findings.ts +1 -3
  235. package/src/console/ui/gates/group.test.ts +3 -3
  236. package/src/console/ui/gates/group.ts +3 -11
  237. package/src/console/ui/gates/index.ts +2 -10
  238. package/src/console/ui/gates/search.ts +3 -10
  239. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  240. package/src/console/ui/overview/a11y.test.tsx +1 -2
  241. package/src/console/ui/overview/busiest.ts +1 -3
  242. package/src/console/ui/overview/compose.ts +1 -13
  243. package/src/console/ui/overview/cost.ts +34 -38
  244. package/src/console/ui/overview/fixture.ts +21 -26
  245. package/src/console/ui/overview/golden.ts +4 -14
  246. package/src/console/ui/overview/index.ts +2 -9
  247. package/src/console/ui/overview/rank.test.ts +3 -10
  248. package/src/console/ui/overview/rank.ts +2 -7
  249. package/src/console/ui/overview/slo.test.ts +5 -9
  250. package/src/console/ui/overview/slo.ts +6 -23
  251. package/src/console/ui/overview/verdict.ts +3 -10
  252. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  253. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  254. package/src/console/ui/plugins/fixture.ts +2 -4
  255. package/src/console/ui/plugins/group.test.ts +1 -3
  256. package/src/console/ui/plugins/group.ts +1 -6
  257. package/src/console/ui/plugins/index.ts +3 -13
  258. package/src/console/ui/plugins/search.ts +7 -19
  259. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  260. package/src/console/ui/runs/a11y.test.tsx +2 -5
  261. package/src/console/ui/runs/explain.ts +2 -6
  262. package/src/console/ui/runs/group.ts +3 -12
  263. package/src/console/ui/runs/histogram.test.ts +2 -11
  264. package/src/console/ui/runs/histogram.ts +1 -4
  265. package/src/console/ui/runs/index.ts +4 -18
  266. package/src/console/ui/runs/project.ts +2 -6
  267. package/src/console/ui/runs/query.test.ts +1 -3
  268. package/src/console/ui/runs/query.ts +12 -35
  269. package/src/console/ui/runs/search.ts +5 -19
  270. package/src/console/ui/runs/trace-link.test.ts +2 -6
  271. package/src/console/ui/runs/trace-link.ts +4 -16
  272. package/src/console/ui/runs/types.ts +1 -3
  273. package/src/console/ui/shell/App.tsx +2 -10
  274. package/src/console/ui/shell/client.ts +22 -115
  275. package/src/console/ui/shell/components/ui.tsx +1 -4
  276. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  277. package/src/console/ui/shell/main.tsx +31 -96
  278. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  279. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  280. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  281. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  282. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  283. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  284. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  285. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  286. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  287. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  288. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  289. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  290. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  291. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  292. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  293. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  294. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  295. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  296. package/src/console/ui/shell/styles.css +1 -2
  297. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  298. package/src/console/ui/signals/a11y.test.tsx +2 -5
  299. package/src/console/ui/signals/confirmation.test.ts +1 -5
  300. package/src/console/ui/signals/confirmation.ts +2 -6
  301. package/src/console/ui/signals/dry-run.ts +1 -3
  302. package/src/console/ui/signals/durable.ts +1 -3
  303. package/src/console/ui/signals/findings.ts +1 -3
  304. package/src/console/ui/signals/group.test.ts +2 -8
  305. package/src/console/ui/signals/group.ts +2 -10
  306. package/src/console/ui/signals/index.ts +1 -4
  307. package/src/console/ui/signals/monitor.ts +2 -7
  308. package/src/console/ui/signals/schema-form.test.ts +3 -14
  309. package/src/console/ui/signals/schema-form.ts +1 -4
  310. package/src/console/ui/signals/search.ts +4 -13
  311. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  312. package/src/console/ui/store/a11y.test.tsx +2 -5
  313. package/src/console/ui/store/confirmation.test.ts +1 -3
  314. package/src/console/ui/store/confirmation.ts +1 -4
  315. package/src/console/ui/store/dry-run.ts +2 -5
  316. package/src/console/ui/store/fixture.ts +1 -2
  317. package/src/console/ui/store/group.test.ts +1 -6
  318. package/src/console/ui/store/group.ts +1 -4
  319. package/src/console/ui/store/index.ts +1 -5
  320. package/src/console/ui/store/search.ts +2 -6
  321. package/src/console/ui/store/will-not-fire.ts +1 -2
  322. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  323. package/src/console/ui/traces/a11y.test.tsx +1 -2
  324. package/src/console/ui/traces/chain.test.ts +5 -19
  325. package/src/console/ui/traces/chain.ts +1 -3
  326. package/src/console/ui/traces/critical-path.test.ts +1 -3
  327. package/src/console/ui/traces/critical-path.ts +2 -6
  328. package/src/console/ui/traces/filter.test.ts +2 -6
  329. package/src/console/ui/traces/filter.ts +5 -13
  330. package/src/console/ui/traces/fold.test.ts +4 -12
  331. package/src/console/ui/traces/fold.ts +1 -3
  332. package/src/console/ui/traces/mini.ts +1 -3
  333. package/src/console/ui/traces/replay.test.ts +1 -3
  334. package/src/console/ui/traces/replay.ts +1 -3
  335. package/src/console/ui/traces/sampling.ts +1 -4
  336. package/src/console/ui/traces/search.ts +4 -17
  337. package/src/console/ui/traces/tier.ts +1 -3
  338. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  339. package/src/console/ui/vault/a11y.test.tsx +1 -2
  340. package/src/console/ui/vault/blast-radius.ts +1 -3
  341. package/src/console/ui/vault/confirmation.test.ts +1 -5
  342. package/src/console/ui/vault/confirmation.ts +1 -4
  343. package/src/console/ui/vault/dormant.test.ts +1 -4
  344. package/src/console/ui/vault/export-safe.test.ts +1 -5
  345. package/src/console/ui/vault/export-safe.ts +1 -4
  346. package/src/console/ui/vault/fixture.ts +3 -3
  347. package/src/console/ui/vault/group.ts +1 -2
  348. package/src/console/ui/vault/index.ts +2 -10
  349. package/src/console/ui/vault/search.ts +2 -6
  350. package/src/console/ui/vault/types.ts +1 -1
  351. package/src/console/xss.gate.test.ts +1 -3
  352. package/src/docker/compose.ts +112 -20
  353. package/src/docker/derive.ts +5 -19
  354. package/src/docker/docker.test.ts +15 -15
  355. package/src/docker/dockerfile.integration.test.ts +12 -21
  356. package/src/docker/helpers.ts +5 -4
  357. package/src/docker/index.ts +4 -11
  358. package/src/docker/pin.ts +1 -9
  359. package/src/docker/recipes/index.ts +5 -6
  360. package/src/docker/recipes/mailpit.ts +22 -0
  361. package/src/docker/recipes/postgres.ts +17 -6
  362. package/src/docker/recipes/redis.ts +6 -1
  363. package/src/docker/recipes/rustfs.ts +33 -0
  364. package/src/docker/stack-id.test.ts +33 -0
  365. package/src/docker/stack-id.ts +25 -13
  366. package/src/docker/stack.integration.test.ts +6 -21
  367. package/src/docker/types.ts +13 -4
  368. package/src/drivers/ai-anthropic.ts +5 -14
  369. package/src/drivers/ai-mock.ts +2 -5
  370. package/src/drivers/ai-openai-compatible.ts +4 -10
  371. package/src/drivers/ai-providers.test.ts +6 -13
  372. package/src/drivers/bun-native-completeness.test.ts +6 -15
  373. package/src/drivers/channel-console.ts +6 -7
  374. package/src/drivers/channel-fcm.ts +20 -30
  375. package/src/drivers/channel-resend.ts +1 -3
  376. package/src/drivers/channel-smtp.ts +2 -6
  377. package/src/drivers/channel-types.ts +2 -12
  378. package/src/drivers/channel-unifonic.ts +2 -6
  379. package/src/drivers/channel-wa-cloud.ts +2 -6
  380. package/src/drivers/channel-webpush.ts +21 -60
  381. package/src/drivers/conformance.test.ts +2 -10
  382. package/src/drivers/conformance.ts +8 -21
  383. package/src/drivers/fs.ts +2 -8
  384. package/src/drivers/index.ts +12 -56
  385. package/src/drivers/memory.ts +14 -41
  386. package/src/drivers/pgvector.ts +7 -11
  387. package/src/drivers/postgres.ts +7 -13
  388. package/src/drivers/redis.ts +13 -37
  389. package/src/drivers/s3.ts +5 -17
  390. package/src/drivers/signal-engine.ts +12 -49
  391. package/src/drivers/signal-memory.ts +2 -8
  392. package/src/drivers/signal-nats.ts +4 -9
  393. package/src/drivers/signal-postgres.ts +62 -129
  394. package/src/drivers/signal-redis.ts +7 -21
  395. package/src/drivers/signal-types.ts +1 -4
  396. package/src/drivers/sqlite.ts +3 -12
  397. package/src/drivers/types.ts +4 -23
  398. package/src/drivers/vault-env.ts +2 -6
  399. package/src/drivers/vault-infisical.ts +1 -5
  400. package/src/drivers/vault-managed.ts +1 -5
  401. package/src/drivers/vault-memory.ts +1 -5
  402. package/src/drivers/vault-openbao.ts +1 -5
  403. package/src/drivers/vault-sops.ts +10 -35
  404. package/src/drivers/vault-types.ts +1 -7
  405. package/src/elements/ai/declare.ts +4 -14
  406. package/src/elements/ai/eval.ts +2 -6
  407. package/src/elements/ai/pii.ts +1 -3
  408. package/src/elements/ai/runtime.ts +12 -50
  409. package/src/elements/ai/schema.ts +4 -15
  410. package/src/elements/ai.test.ts +13 -24
  411. package/src/elements/ai.ts +1 -5
  412. package/src/elements/channel/consent.ts +3 -12
  413. package/src/elements/channel/costs.ts +4 -15
  414. package/src/elements/channel/declare.ts +1 -4
  415. package/src/elements/channel/email-auth.ts +1 -4
  416. package/src/elements/channel/locale.ts +2 -10
  417. package/src/elements/channel/mask.ts +1 -3
  418. package/src/elements/channel/mime.ts +2 -12
  419. package/src/elements/channel/outcomes.test.ts +1 -5
  420. package/src/elements/channel/outcomes.ts +5 -15
  421. package/src/elements/channel/receipts.ts +2 -7
  422. package/src/elements/channel/runtime.ts +28 -74
  423. package/src/elements/channel/suppression.ts +8 -14
  424. package/src/elements/channel.test.ts +8 -31
  425. package/src/elements/channel.ts +3 -14
  426. package/src/elements/clock/actions.ts +6 -18
  427. package/src/elements/clock/declare.ts +1 -3
  428. package/src/elements/clock/dst.ts +1 -5
  429. package/src/elements/clock/durable.ts +4 -16
  430. package/src/elements/clock/health.ts +2 -7
  431. package/src/elements/clock/leader.ts +2 -9
  432. package/src/elements/clock/reconcile.ts +4 -15
  433. package/src/elements/clock/runtime.ts +2 -5
  434. package/src/elements/clock/schedule.ts +4 -20
  435. package/src/elements/clock.test.ts +2 -7
  436. package/src/elements/clock.ts +5 -23
  437. package/src/elements/gate/permissions.ts +1 -4
  438. package/src/elements/gate/runtime.ts +7 -28
  439. package/src/elements/gate.ts +1 -5
  440. package/src/elements/index.ts +9 -7
  441. package/src/elements/signal/declare.ts +2 -7
  442. package/src/elements/signal/reconcile.test.ts +1 -4
  443. package/src/elements/signal/runtime.ts +1 -3
  444. package/src/elements/signal.test.ts +3 -15
  445. package/src/elements/signal.ts +2 -8
  446. package/src/elements/store/cache.test.ts +46 -0
  447. package/src/elements/store/cache.ts +3 -11
  448. package/src/elements/store/classify.ts +5 -22
  449. package/src/elements/store/declare.ts +8 -17
  450. package/src/elements/store/domain-ddl.test.ts +86 -0
  451. package/src/elements/store/emit-drizzle.ts +363 -0
  452. package/src/elements/store/files-policy.test.ts +1 -5
  453. package/src/elements/store/files-policy.ts +4 -12
  454. package/src/elements/store/load-plugin-tables.ts +103 -0
  455. package/src/elements/store/missing-relation.test.ts +83 -0
  456. package/src/elements/store/missing-relation.ts +38 -0
  457. package/src/elements/store/replica.ts +1 -4
  458. package/src/elements/store/runtime.ts +25 -28
  459. package/src/elements/store/schema-decl.test.ts +227 -0
  460. package/src/elements/store/schema-decl.ts +516 -0
  461. package/src/elements/store/sql-condition.ts +11 -21
  462. package/src/elements/store/sql-session.test.ts +50 -0
  463. package/src/elements/store/sql-session.ts +60 -63
  464. package/src/elements/store/table.ts +35 -19
  465. package/src/elements/store.test.ts +17 -39
  466. package/src/elements/store.ts +37 -31
  467. package/src/elements/vault/chain.ts +34 -0
  468. package/src/elements/vault/declare.ts +22 -32
  469. package/src/elements/vault/fingerprint.ts +2 -7
  470. package/src/elements/vault/redact.ts +2 -6
  471. package/src/elements/vault/runtime.ts +18 -32
  472. package/src/elements/vault.test.ts +12 -28
  473. package/src/elements/vault.ts +8 -12
  474. package/src/index.ts +5 -2
  475. package/src/kernel/adopt-routes.ts +15 -29
  476. package/src/kernel/app.ts +34 -94
  477. package/src/kernel/auth-resolve.ts +2 -9
  478. package/src/kernel/boot-bind/ai.ts +1 -4
  479. package/src/kernel/boot-bind/channel.ts +2 -8
  480. package/src/kernel/boot-bind/clock.ts +2 -6
  481. package/src/kernel/boot-bind/gate.ts +2 -8
  482. package/src/kernel/boot-bind/runs.ts +1 -3
  483. package/src/kernel/boot-bind/signal.ts +3 -10
  484. package/src/kernel/boot-bind/store.test.ts +17 -17
  485. package/src/kernel/boot-bind/store.ts +44 -50
  486. package/src/kernel/boot-bind/vault.ts +2 -8
  487. package/src/kernel/boot.test.ts +4 -9
  488. package/src/kernel/boot.ts +29 -76
  489. package/src/kernel/budget.test.ts +1 -3
  490. package/src/kernel/capability.ts +3 -10
  491. package/src/kernel/dry-run.test.ts +1 -4
  492. package/src/kernel/dry-run.ts +3 -11
  493. package/src/kernel/effects.test.ts +1 -5
  494. package/src/kernel/effects.ts +4 -11
  495. package/src/kernel/errors.registry.test.ts +2 -8
  496. package/src/kernel/errors.ts +23 -32
  497. package/src/kernel/flow.test.ts +12 -25
  498. package/src/kernel/flow.ts +5 -25
  499. package/src/kernel/fx.test.ts +15 -44
  500. package/src/kernel/fx.ts +27 -79
  501. package/src/kernel/hook-timing.test.ts +3 -6
  502. package/src/kernel/hook-timing.ts +5 -14
  503. package/src/kernel/hooks.test.ts +10 -10
  504. package/src/kernel/hooks.ts +3 -12
  505. package/src/kernel/index.ts +4 -17
  506. package/src/kernel/journal.ts +7 -31
  507. package/src/kernel/on.ts +1 -6
  508. package/src/kernel/pipeline.test.ts +10 -19
  509. package/src/kernel/pipeline.ts +5 -17
  510. package/src/kernel/plug.ts +4 -11
  511. package/src/kernel/plugin/conflicts.test.ts +13 -25
  512. package/src/kernel/plugin/decorate.test.ts +8 -13
  513. package/src/kernel/plugin/scoping.test.ts +4 -11
  514. package/src/kernel/plugin.ts +48 -24
  515. package/src/kernel/registry.ts +80 -29
  516. package/src/kernel/router.test.ts +15 -13
  517. package/src/kernel/router.ts +9 -29
  518. package/src/kernel/routing-budget.test.ts +1 -3
  519. package/src/kernel/run-telemetry.ts +1 -3
  520. package/src/kernel/triggers.ts +4 -21
  521. package/src/manifest/diff.test.ts +26 -91
  522. package/src/manifest/diff.ts +95 -225
  523. package/src/manifest/index.ts +2 -9
  524. package/src/manifest/types.ts +29 -5
  525. package/src/manifest/undeclared.test.ts +4 -12
  526. package/src/manifest/undeclared.ts +1 -2
  527. package/src/manifest/validate.test.ts +2 -6
  528. package/src/manifest/validate.ts +4 -14
  529. package/src/mcp/authorization.ts +8 -27
  530. package/src/mcp/confirmation.ts +3 -10
  531. package/src/mcp/data.ts +2 -6
  532. package/src/mcp/docs-index.ts +4 -7
  533. package/src/mcp/docs-mcp.test.ts +3 -12
  534. package/src/mcp/docs-server.ts +7 -27
  535. package/src/mcp/docs-tools.ts +2 -6
  536. package/src/mcp/index.ts +1 -6
  537. package/src/mcp/injection.gate.test.ts +4 -18
  538. package/src/mcp/mcp.test.ts +18 -49
  539. package/src/mcp/protocol.ts +3 -10
  540. package/src/mcp/server.ts +11 -52
  541. package/src/mcp/session.ts +4 -14
  542. package/src/mcp/tools.ts +14 -50
  543. package/src/plugins/catalogue.test.ts +3 -7
  544. package/src/plugins/catalogue.ts +1 -3
  545. package/src/plugins/node-import-scan.ts +2 -5
  546. package/src/plugins/supply-chain.ts +5 -17
  547. package/src/release/exports.ts +3 -8
  548. package/src/release/measure.exports.test.ts +1 -3
  549. package/src/release/measure.ts +15 -43
  550. package/src/runs/bench.test.ts +1 -3
  551. package/src/runs/collect.ts +8 -25
  552. package/src/runs/drivers/clickhouse.ts +2 -9
  553. package/src/runs/drivers/files.ts +9 -31
  554. package/src/runs/drivers/memory.ts +5 -22
  555. package/src/runs/drivers/postgres.ts +8 -20
  556. package/src/runs/duckdb.ts +2 -8
  557. package/src/runs/index.ts +3 -14
  558. package/src/runs/outlier.ts +3 -10
  559. package/src/runs/parquet.ts +8 -26
  560. package/src/runs/privacy.ts +2 -8
  561. package/src/runs/runs.test.ts +3 -9
  562. package/src/runs/runtime.ts +7 -32
  563. package/src/runs/shred.ts +10 -29
  564. package/src/runs/types.ts +1 -4
  565. package/src/runtime/bun.ts +4 -15
  566. package/src/runtime/cold-start.bench.ts +1 -3
  567. package/src/runtime/dev-request-log.test.ts +1 -4
  568. package/src/runtime/dev-request-log.ts +1 -4
  569. package/src/runtime/index.ts +1 -6
  570. package/src/runtime/primitives.ts +5 -4
  571. package/src/runtime/security.ts +3 -13
  572. package/src/runtime/serve.test.ts +4 -7
  573. package/src/runtime/types.ts +1 -4
  574. package/src/runtime/web-standard.ts +3 -15
  575. package/src/term.test.ts +4 -6
  576. package/src/term.ts +49 -98
  577. package/src/test/create-test-app.test.ts +4 -14
  578. package/src/test/create-test-app.ts +13 -31
  579. package/src/test/provisions.integration.test.ts +3 -11
  580. package/src/upgrade/codemods.test.ts +25 -6
  581. package/src/upgrade/codemods.ts +116 -3
  582. package/src/validation/standard-schema.test.ts +2 -5
  583. package/src/validation/standard-schema.ts +13 -33
  584. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
@@ -68,12 +68,7 @@ export interface CronStore {
68
68
  * @param now - Current epoch-ms
69
69
  * @param leaseMs - Lease TTL
70
70
  */
71
- acquireLease(
72
- name: string,
73
- instanceId: string,
74
- now: number,
75
- leaseMs: number,
76
- ): Promise<boolean>;
71
+ acquireLease(name: string, instanceId: string, now: number, leaseMs: number): Promise<boolean>;
77
72
  }
78
73
 
79
74
  /** Result of one reconciliation pass. */
@@ -107,13 +102,9 @@ export async function reconcileClocks(
107
102
  for (const decl of declared) {
108
103
  const prev = await store.get(decl.name);
109
104
  const overrideCron =
110
- decl.overridable && prev?.overrideCron !== undefined
111
- ? prev.overrideCron
112
- : undefined;
105
+ decl.overridable && prev?.overrideCron !== undefined ? prev.overrideCron : undefined;
113
106
  const overrideEvery =
114
- decl.overridable && prev?.overrideEvery !== undefined
115
- ? prev.overrideEvery
116
- : undefined;
107
+ decl.overridable && prev?.overrideEvery !== undefined ? prev.overrideEvery : undefined;
117
108
 
118
109
  const row: CronRow = {
119
110
  name: decl.name,
@@ -179,9 +170,7 @@ export function effectiveSchedule(row: CronRow): {
179
170
  *
180
171
  * @param seed - Optional initial rows
181
172
  */
182
- export function createMemoryCronStore(
183
- seed?: readonly CronRow[],
184
- ): CronStore {
173
+ export function createMemoryCronStore(seed?: readonly CronRow[]): CronStore {
185
174
  const rows = new Map<string, CronRow>();
186
175
  for (const r of seed ?? []) {
187
176
  rows.set(r.name, structuredClone(r));
@@ -99,12 +99,9 @@ export interface ClockRuntime {
99
99
  *
100
100
  * @param options - Instance id, store, clock
101
101
  */
102
- export function createClockRuntime(
103
- options: CreateClockRuntimeOptions = {},
104
- ): ClockRuntime {
102
+ export function createClockRuntime(options: CreateClockRuntimeOptions = {}): ClockRuntime {
105
103
  const timeTravel = options.timeTravel;
106
- const now = (): number =>
107
- timeTravel ? timeTravel.now() : (options.now ?? (() => Date.now()))();
104
+ const now = (): number => (timeTravel ? timeTravel.now() : (options.now ?? (() => Date.now()))());
108
105
  const store = options.store ?? createMemoryCronStore();
109
106
  const instanceId = options.instanceId ?? crypto.randomUUID();
110
107
  const leaseMs = options.leaseMs ?? 30_000;
@@ -15,11 +15,7 @@ import { effectiveSchedule, type CronRow } from "./reconcile.ts";
15
15
  * @param from - Inclusive start epoch-ms
16
16
  * @param until - Exclusive end epoch-ms
17
17
  */
18
- export function nextOccurrences(
19
- row: CronRow,
20
- from: number,
21
- until: number,
22
- ): readonly number[] {
18
+ export function nextOccurrences(row: CronRow, from: number, until: number): readonly number[] {
23
19
  if (row.status !== "active" && row.status !== "paused") return [];
24
20
  if (until <= from) return [];
25
21
 
@@ -75,11 +71,7 @@ export function previousOccurrence(row: CronRow, at: number): number | null {
75
71
  * @param from - Exclusive lower bound (usually lastRunAt)
76
72
  * @param until - Inclusive upper bound (usually now)
77
73
  */
78
- export function countMissedOccurrences(
79
- row: CronRow,
80
- from: number,
81
- until: number,
82
- ): number {
74
+ export function countMissedOccurrences(row: CronRow, from: number, until: number): number {
83
75
  if (until <= from) return 0;
84
76
  const sched = effectiveSchedule(row);
85
77
  if (sched.every) {
@@ -129,11 +121,7 @@ function nextCronOccurrences(
129
121
  ): readonly number[] {
130
122
  const parsed = parseSimpleDaily(cron);
131
123
  if (!parsed) {
132
- if (
133
- row.nextRunAt !== undefined &&
134
- row.nextRunAt >= from &&
135
- row.nextRunAt < until
136
- ) {
124
+ if (row.nextRunAt !== undefined && row.nextRunAt >= from && row.nextRunAt < until) {
137
125
  return [row.nextRunAt];
138
126
  }
139
127
  return [];
@@ -202,11 +190,7 @@ function civilFiresOnDay(
202
190
  for (let offsetMin = -14 * 60; offsetMin <= 14 * 60; offsetMin += 15) {
203
191
  const utc = base + parsed.hour * 3_600_000 + parsed.minute * 60_000 - offsetMin * 60_000;
204
192
  const local = zonedParts(utc, timezone);
205
- if (
206
- local.date === dateStr &&
207
- local.hour === parsed.hour &&
208
- local.minute === parsed.minute
209
- ) {
193
+ if (local.date === dateStr && local.hour === parsed.hour && local.minute === parsed.minute) {
210
194
  if (parsed.dow !== undefined) {
211
195
  const localDow = zonedDow(utc, timezone);
212
196
  if (localDow !== parsed.dow) continue;
@@ -13,10 +13,7 @@ import { tmpdir } from "node:os";
13
13
  import { join } from "node:path";
14
14
 
15
15
  import { flow } from "../kernel/flow.ts";
16
- import {
17
- createFileJournalStore,
18
- createMemoryJournalStore,
19
- } from "../kernel/journal.ts";
16
+ import { createFileJournalStore, createMemoryJournalStore } from "../kernel/journal.ts";
20
17
  import {
21
18
  clock,
22
19
  createClockRuntime,
@@ -340,9 +337,7 @@ describe("DST ambiguity", () => {
340
337
  expect(detectDstAmbiguity("0 2 * * *", "UTC")).toBeNull();
341
338
 
342
339
  // Noon is outside the transition window for US zones.
343
- expect(
344
- detectDstAmbiguity("0 12 * * *", "America/New_York", Date.UTC(2026, 0, 1)),
345
- ).toBeNull();
340
+ expect(detectDstAmbiguity("0 12 * * *", "America/New_York", Date.UTC(2026, 0, 1))).toBeNull();
346
341
  });
347
342
 
348
343
  test("reconcile attaches dstAmbiguity on the store row", async () => {
@@ -15,10 +15,7 @@ export type { ClockDecl, ClockOptions } from "./clock/declare.ts";
15
15
 
16
16
  export { parseDurationMs } from "./clock/duration.ts";
17
17
 
18
- export {
19
- detectDstAmbiguity,
20
- type DstAmbiguity,
21
- } from "./clock/dst.ts";
18
+ export { detectDstAmbiguity, type DstAmbiguity } from "./clock/dst.ts";
22
19
 
23
20
  export {
24
21
  tryAcquireLease,
@@ -38,10 +35,7 @@ export {
38
35
  type ReconcileResult,
39
36
  } from "./clock/reconcile.ts";
40
37
 
41
- export {
42
- createTimeTravel,
43
- type TimeTravel,
44
- } from "./clock/time-travel.ts";
38
+ export { createTimeTravel, type TimeTravel } from "./clock/time-travel.ts";
45
39
 
46
40
  export {
47
41
  createClockRuntime,
@@ -51,23 +45,11 @@ export {
51
45
  type CronHandler,
52
46
  } from "./clock/runtime.ts";
53
47
 
54
- export {
55
- runDurable,
56
- type DurableResult,
57
- type RunDurableOptions,
58
- } from "./clock/durable.ts";
48
+ export { runDurable, type DurableResult, type RunDurableOptions } from "./clock/durable.ts";
59
49
 
60
- export {
61
- cronHealth,
62
- type CatchUpPolicy,
63
- type CronHealth,
64
- } from "./clock/health.ts";
50
+ export { cronHealth, type CatchUpPolicy, type CronHealth } from "./clock/health.ts";
65
51
 
66
- export {
67
- nextOccurrences,
68
- previousOccurrence,
69
- countMissedOccurrences,
70
- } from "./clock/schedule.ts";
52
+ export { nextOccurrences, previousOccurrence, countMissedOccurrences } from "./clock/schedule.ts";
71
53
 
72
54
  export {
73
55
  pauseCron,
@@ -81,10 +81,7 @@ function effectToAction(ref: string, op: "read" | "write"): string {
81
81
  return `store.${facet}:${op}`;
82
82
  }
83
83
 
84
- function collectEffects(
85
- manifest: Manifest,
86
- kind: "reads" | "writes",
87
- ): string[] {
84
+ function collectEffects(manifest: Manifest, kind: "reads" | "writes"): string[] {
88
85
  const out: string[] = [];
89
86
  for (const flow of Object.values(manifest.flows ?? {})) {
90
87
  const list = flow.effects?.[kind];
@@ -8,11 +8,7 @@ import { takeRate } from "./strategies.ts";
8
8
 
9
9
  /** KV surface required for rate gates. */
10
10
  export interface GateKv {
11
- eval<T = unknown>(
12
- script: string,
13
- keys: readonly string[],
14
- args?: readonly string[],
15
- ): Promise<T>;
11
+ eval<T = unknown>(script: string, keys: readonly string[], args?: readonly string[]): Promise<T>;
16
12
  }
17
13
 
18
14
  /** Options for {@link createGateRuntime}. */
@@ -45,20 +41,14 @@ export interface GateRuntime {
45
41
  * @param names - Gate names / rate ids
46
42
  * @param ctx - Policy context
47
43
  */
48
- check(
49
- names: readonly string[],
50
- ctx: GatePolicyContext,
51
- ): Promise<GateEvaluation[]>;
44
+ check(names: readonly string[], ctx: GatePolicyContext): Promise<GateEvaluation[]>;
52
45
  /**
53
46
  * Whether every gate in the chain allows.
54
47
  *
55
48
  * @param names - Gate names
56
49
  * @param ctx - Policy context
57
50
  */
58
- allow(
59
- names: readonly string[],
60
- ctx: GatePolicyContext,
61
- ): Promise<boolean>;
51
+ allow(names: readonly string[], ctx: GatePolicyContext): Promise<boolean>;
62
52
  }
63
53
 
64
54
  /**
@@ -66,19 +56,14 @@ export interface GateRuntime {
66
56
  *
67
57
  * @param options - Declarations + kv
68
58
  */
69
- export function createGateRuntime(
70
- options: CreateGateRuntimeOptions = {},
71
- ): GateRuntime {
59
+ export function createGateRuntime(options: CreateGateRuntimeOptions = {}): GateRuntime {
72
60
  const map = new Map<string, GateDecl>();
73
61
  for (const g of options.gates ?? []) {
74
62
  map.set(g.name, g);
75
63
  }
76
64
  const now = options.now ?? (() => Date.now());
77
65
 
78
- async function evaluateOne(
79
- name: string,
80
- ctx: GatePolicyContext,
81
- ): Promise<GateEvaluation> {
66
+ async function evaluateOne(name: string, ctx: GatePolicyContext): Promise<GateEvaluation> {
82
67
  const decl = map.get(name);
83
68
  if (!decl) {
84
69
  return {
@@ -100,10 +85,7 @@ export function createGateRuntime(
100
85
  return evaluateRate(decl, ctx);
101
86
  }
102
87
 
103
- async function evaluateRate(
104
- decl: RateGateDecl,
105
- ctx: GatePolicyContext,
106
- ): Promise<GateEvaluation> {
88
+ async function evaluateRate(decl: RateGateDecl, ctx: GatePolicyContext): Promise<GateEvaluation> {
107
89
  if (!options.kv) {
108
90
  return {
109
91
  name: decl.name,
@@ -157,10 +139,7 @@ export function createGateRuntime(
157
139
  };
158
140
  }
159
141
 
160
- function resolveSubject(
161
- keyBy: string | undefined,
162
- ctx: GatePolicyContext,
163
- ): string {
142
+ function resolveSubject(keyBy: string | undefined, ctx: GatePolicyContext): string {
164
143
  switch (keyBy) {
165
144
  case "user":
166
145
  return ctx.auth.userId ?? ctx.meta?.userId ?? "anon";
@@ -35,8 +35,4 @@ export {
35
35
  type TakeRateOptions,
36
36
  } from "./gate/strategies.ts";
37
37
 
38
- export {
39
- deriveModuleActions,
40
- flowIdToAction,
41
- formatGatesList,
42
- } from "./gate/permissions.ts";
38
+ export { deriveModuleActions, flowIdToAction, formatGatesList } from "./gate/permissions.ts";
@@ -12,6 +12,9 @@ export {
12
12
  id,
13
13
  now,
14
14
  defineTable,
15
+ field,
16
+ schemaTable,
17
+ schemaRelations,
15
18
  createStoreRuntime,
16
19
  createStoreCache,
17
20
  computedCacheKey,
@@ -32,6 +35,9 @@ export type {
32
35
  SqlStoreHandle,
33
36
  TableHandle,
34
37
  ColumnDef,
38
+ SchemaTableDecl,
39
+ SchemaColumnDecl,
40
+ SchemaRelationsDecl,
35
41
  } from "./store.ts";
36
42
 
37
43
  export { signal, createSignalRuntime } from "./signal.ts";
@@ -52,13 +58,7 @@ export {
52
58
  detectDstAmbiguity,
53
59
  parseDurationMs,
54
60
  } from "./clock.ts";
55
- export type {
56
- ClockDecl,
57
- ClockOptions,
58
- ClockRuntime,
59
- TimeTravel,
60
- DurableResult,
61
- } from "./clock.ts";
61
+ export type { ClockDecl, ClockOptions, ClockRuntime, TimeTravel, DurableResult } from "./clock.ts";
62
62
 
63
63
  export {
64
64
  gate,
@@ -86,6 +86,8 @@ export {
86
86
  fingerprintSecretSync,
87
87
  createSecretRedactor,
88
88
  resolveLayerSource,
89
+ COMPOSE_ENV_REL,
90
+ resolveComposeEnvPath,
89
91
  } from "./vault.ts";
90
92
  export type {
91
93
  VaultSecretDecl,
@@ -53,18 +53,13 @@ export interface SignalDecl<T = unknown> {
53
53
  * @param name - Signal name
54
54
  * @param options - Delivery physics and retry / DLQ policy
55
55
  */
56
- export function signal<T = unknown>(
57
- name: string,
58
- options: SignalOptions,
59
- ): SignalDecl<T> {
56
+ export function signal<T = unknown>(name: string, options: SignalOptions): SignalDecl<T> {
60
57
  if (
61
58
  options.delivery !== "once" &&
62
59
  options.delivery !== "broadcast" &&
63
60
  options.delivery !== "live"
64
61
  ) {
65
- throw new TypeError(
66
- `signal("${name}"): delivery is mandatory (once | broadcast | live)`,
67
- );
62
+ throw new TypeError(`signal("${name}"): delivery is mandatory (once | broadcast | live)`);
68
63
  }
69
64
  return {
70
65
  name,
@@ -1,9 +1,6 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
  import { signal } from "./declare.ts";
3
- import {
4
- createMemorySignalConfigStore,
5
- reconcileSignals,
6
- } from "./reconcile.ts";
3
+ import { createMemorySignalConfigStore, reconcileSignals } from "./reconcile.ts";
7
4
 
8
5
  describe("reconcileSignals", () => {
9
6
  test("marks a removed signal orphaned without deleting it", async () => {
@@ -52,9 +52,7 @@ export interface SignalRuntime {
52
52
  *
53
53
  * @param options - Driver and bindings
54
54
  */
55
- export function createSignalRuntime(
56
- options: CreateSignalRuntimeOptions,
57
- ): SignalRuntime {
55
+ export function createSignalRuntime(options: CreateSignalRuntimeOptions): SignalRuntime {
58
56
  const declarations = new Map<string, SignalDecl>();
59
57
  let bus: SignalBus | null = null;
60
58
 
@@ -205,9 +205,7 @@ for (const { label, driver, setup } of drivers) {
205
205
  attempt: 1,
206
206
  });
207
207
  expect(dlq[0]!.failures[0]!.message).toContain("boom-");
208
- expect(dlq[0]!.failures.map((f) => f.attempt)).toEqual(
209
- dlq[0]!.failures.map((_, i) => i + 1),
210
- );
208
+ expect(dlq[0]!.failures.map((f) => f.attempt)).toEqual(dlq[0]!.failures.map((_, i) => i + 1));
211
209
  });
212
210
  });
213
211
  }
@@ -303,12 +301,7 @@ describe("chaos — kill process mid-transaction", () => {
303
301
  const durablePath = join(dir, "bus.json");
304
302
  try {
305
303
  const child = Bun.spawn({
306
- cmd: [
307
- "bun",
308
- join(import.meta.dir, "signal/chaos-child.ts"),
309
- durablePath,
310
- "mid-txn",
311
- ],
304
+ cmd: ["bun", join(import.meta.dir, "signal/chaos-child.ts"), durablePath, "mid-txn"],
312
305
  stdout: "pipe",
313
306
  stderr: "pipe",
314
307
  });
@@ -406,12 +399,7 @@ describe("chaos — kill process mid-transaction", () => {
406
399
  const durablePath = join(dir, "bus.json");
407
400
  try {
408
401
  const child = Bun.spawn({
409
- cmd: [
410
- "bun",
411
- join(import.meta.dir, "signal/chaos-child.ts"),
412
- durablePath,
413
- "commit",
414
- ],
402
+ cmd: ["bun", join(import.meta.dir, "signal/chaos-child.ts"), durablePath, "commit"],
415
403
  stdout: "pipe",
416
404
  stderr: "pipe",
417
405
  });
@@ -10,15 +10,9 @@ export { signal } from "./signal/declare.ts";
10
10
  export type { SignalDecl, SignalOptions } from "./signal/declare.ts";
11
11
 
12
12
  export { createSignalRuntime } from "./signal/runtime.ts";
13
- export type {
14
- CreateSignalRuntimeOptions,
15
- SignalRuntime,
16
- } from "./signal/runtime.ts";
13
+ export type { CreateSignalRuntimeOptions, SignalRuntime } from "./signal/runtime.ts";
17
14
 
18
- export {
19
- reconcileSignals,
20
- createMemorySignalConfigStore,
21
- } from "./signal/reconcile.ts";
15
+ export { reconcileSignals, createMemorySignalConfigStore } from "./signal/reconcile.ts";
22
16
  export type {
23
17
  SignalConfigRow,
24
18
  SignalConfigStatus,
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Tier-1 cache exactness lock — invalidation keys off declared resources.
3
+ *
4
+ * A write invalidates a cached read only when the written resource appears
5
+ * in that read's `effects.reads`. A read that recorded only its root table
6
+ * is NOT invalidated by a write to a related table — which is exactly why
7
+ * relational `with:` is not exposed through `fx` (silent staleness hazard).
8
+ */
9
+
10
+ import { describe, expect, test } from "bun:test";
11
+ import type { Effects } from "../../manifest/types.ts";
12
+ import {
13
+ computedCacheKey,
14
+ createStoreCache,
15
+ isInvalidatedByWrite,
16
+ tier1KeysForReads,
17
+ } from "./cache.ts";
18
+
19
+ describe("tier-1 cache — exact per-resource invalidation (path b)", () => {
20
+ test("a write invalidates only reads that declared the written resource", () => {
21
+ const cache = createStoreCache();
22
+
23
+ // Root-only read — what a half-shipped `with:` expansion would record.
24
+ const rootOnly: Effects = { reads: ["sql:links"] };
25
+ const keys = tier1KeysForReads(rootOnly);
26
+ expect(keys).toEqual([computedCacheKey("sql:links")]);
27
+
28
+ cache.set({
29
+ tier: 1,
30
+ key: keys[0]!,
31
+ value: [{ id: "l1" }],
32
+ resources: ["sql:links"],
33
+ expiresAt: null,
34
+ });
35
+
36
+ // A write to the related table does not invalidate the root-only read.
37
+ expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:daily"] })).toBe(false);
38
+ expect(cache.invalidateFromEffects({ writes: ["sql:daily"] }).keys).toEqual([]);
39
+ expect(cache.get(keys[0]!)).toBeDefined();
40
+
41
+ // Exact match on the declared resource still invalidates.
42
+ expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:links"] })).toBe(true);
43
+ expect(cache.invalidateFromEffects({ writes: ["sql:links"] }).keys).toEqual(keys);
44
+ expect(cache.get(keys[0]!)).toBeUndefined();
45
+ });
46
+ });
@@ -38,10 +38,7 @@ export interface InvalidationEvent {
38
38
  * @param resource - Store resource ref
39
39
  * @param dims - Optional dimension suffixes (e.g. `userId`)
40
40
  */
41
- export function computedCacheKey(
42
- resource: ResourceRef,
43
- dims?: readonly string[],
44
- ): string {
41
+ export function computedCacheKey(resource: ResourceRef, dims?: readonly string[]): string {
45
42
  if (!dims || dims.length === 0) return `computed:${resource}`;
46
43
  return `computed:${resource}/${dims.join("/")}`;
47
44
  }
@@ -57,9 +54,7 @@ export function tier1KeysForReads(
57
54
  dimsByResource?: Readonly<Record<string, readonly string[]>>,
58
55
  ): string[] {
59
56
  const reads = effects.reads ?? [];
60
- return reads.map((resource) =>
61
- computedCacheKey(resource, dimsByResource?.[resource]),
62
- );
57
+ return reads.map((resource) => computedCacheKey(resource, dimsByResource?.[resource]));
63
58
  }
64
59
 
65
60
  /**
@@ -79,10 +74,7 @@ export function resourcesTouchedByWrites(effects: Effects): ResourceRef[] {
79
74
  * @param key - Tier-1 cache key (`computed:…`)
80
75
  * @param writeEffects - Effects of the writing flow
81
76
  */
82
- export function isInvalidatedByWrite(
83
- key: string,
84
- writeEffects: Effects,
85
- ): boolean {
77
+ export function isInvalidatedByWrite(key: string, writeEffects: Effects): boolean {
86
78
  if (!key.startsWith("computed:")) return false;
87
79
  const body = key.slice("computed:".length);
88
80
  const resource = body.split("/")[0] ?? "";
@@ -4,11 +4,7 @@
4
4
  */
5
5
 
6
6
  import type { ColumnClassification } from "../../manifest/types.ts";
7
- import {
8
- classificationKey,
9
- type ClassificationMap,
10
- type SqlRow,
11
- } from "../../drivers/types.ts";
7
+ import { classificationKey, type ClassificationMap, type SqlRow } from "../../drivers/types.ts";
12
8
 
13
9
  /** Default mask token for PII columns when reveal is denied. */
14
10
  export const PII_MASK = "[redacted]";
@@ -21,9 +17,7 @@ export const PII_MASK = "[redacted]";
21
17
  *
22
18
  * @param classification - Tags to attach
23
19
  */
24
- export function classify(
25
- classification: ColumnClassification,
26
- ): ColumnClassification {
20
+ export function classify(classification: ColumnClassification): ColumnClassification {
27
21
  return { ...classification };
28
22
  }
29
23
 
@@ -33,9 +27,7 @@ export function classify(
33
27
  * @param tables - Per-table column classifications
34
28
  */
35
29
  export function buildClassificationMap(
36
- tables: Readonly<
37
- Record<string, Readonly<Record<string, ColumnClassification>>>
38
- >,
30
+ tables: Readonly<Record<string, Readonly<Record<string, ColumnClassification>>>>,
39
31
  ): ClassificationMap {
40
32
  const map = new Map<string, ColumnClassification>();
41
33
  for (const [table, cols] of Object.entries(tables)) {
@@ -90,10 +82,7 @@ export interface MaskRowsOptions {
90
82
  * @param rows - Raw driver rows
91
83
  * @param options - Classification + reveal policy
92
84
  */
93
- export function maskRows(
94
- rows: readonly SqlRow[],
95
- options: MaskRowsOptions,
96
- ): SqlRow[] {
85
+ export function maskRows(rows: readonly SqlRow[], options: MaskRowsOptions): SqlRow[] {
97
86
  if (options.revealPii || options.classifications.size === 0) {
98
87
  return rows.map((r) => ({ ...r }));
99
88
  }
@@ -101,13 +90,7 @@ export function maskRows(
101
90
  return rows.map((row) => {
102
91
  const out: SqlRow = {};
103
92
  for (const [column, value] of Object.entries(row)) {
104
- out[column] = isPiiColumn(
105
- options.classifications,
106
- options.table,
107
- column,
108
- )
109
- ? mask
110
- : value;
93
+ out[column] = isPiiColumn(options.classifications, options.table, column) ? mask : value;
111
94
  }
112
95
  return out;
113
96
  });
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import type { ColumnClassification, ResourceRef, StoreFacet } from "../../manifest/types.ts";
8
+ import { schema } from "./schema-decl.ts";
8
9
  import { resolveTableName, type TableHandle } from "./table.ts";
9
10
 
10
11
  /** CDC trigger shape (mirrors kernel `CdcTrigger` without importing it). */
@@ -47,9 +48,7 @@ export interface SqlStoreOptions {
47
48
  * Explicit classifications: `table → column → tags`.
48
49
  * Merged with schema-derived tags; wins on conflict for the same column.
49
50
  */
50
- readonly classify?: Readonly<
51
- Record<string, Readonly<Record<string, ColumnClassification>>>
52
- >;
51
+ readonly classify?: Readonly<Record<string, Readonly<Record<string, ColumnClassification>>>>;
53
52
  }
54
53
 
55
54
  /** SQL store declaration. */
@@ -106,11 +105,7 @@ export interface IndexStoreDecl extends StoreDeclBase {
106
105
  }
107
106
 
108
107
  /** Any store declaration. */
109
- export type StoreDecl =
110
- | SqlStoreDecl
111
- | KvStoreDecl
112
- | FilesStoreDecl
113
- | IndexStoreDecl;
108
+ export type StoreDecl = SqlStoreDecl | KvStoreDecl | FilesStoreDecl | IndexStoreDecl;
114
109
 
115
110
  /**
116
111
  * Declare a SQL store.
@@ -161,10 +156,7 @@ export function kv(name: string, options: KvStoreOptions = {}): KvStoreDecl {
161
156
  * @param name - Bucket name
162
157
  * @param options - Options
163
158
  */
164
- export function files(
165
- name: string,
166
- options: FilesStoreOptions = {},
167
- ): FilesStoreDecl {
159
+ export function files(name: string, options: FilesStoreOptions = {}): FilesStoreDecl {
168
160
  return {
169
161
  facet: "files",
170
162
  name,
@@ -179,10 +171,7 @@ export function files(
179
171
  * @param name - Index name
180
172
  * @param options - Dimensions
181
173
  */
182
- export function index(
183
- name: string,
184
- options: IndexStoreOptions = {},
185
- ): IndexStoreDecl {
174
+ export function index(name: string, options: IndexStoreOptions = {}): IndexStoreDecl {
186
175
  return {
187
176
  facet: "index",
188
177
  name,
@@ -191,10 +180,12 @@ export function index(
191
180
  };
192
181
  }
193
182
 
194
- /** Public `store` element — four facets. */
183
+ /** Public `store` element — four facets + abstract schema declare. */
195
184
  export const store = {
196
185
  sql,
197
186
  kv,
198
187
  files,
199
188
  index,
189
+ /** ORM-agnostic table declarations (`store.schema.table`). */
190
+ schema,
200
191
  } as const;