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
@@ -7,11 +7,7 @@
7
7
  * `age-encryption` is an optional peer — loaded only when this driver runs.
8
8
  */
9
9
 
10
- import type {
11
- VaultBag,
12
- VaultDriver,
13
- VaultOpenOptions,
14
- } from "./vault-types.ts";
10
+ import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
15
11
 
16
12
  /** Minimal Typage surface used by this driver. */
17
13
  type AgeModule = typeof import("age-encryption");
@@ -23,9 +19,7 @@ async function loadAge(): Promise<AgeModule> {
23
19
  try {
24
20
  return await import("age-encryption");
25
21
  } catch {
26
- throw new Error(
27
- "sops vault: install optional peer `age-encryption` (bun add age-encryption)",
28
- );
22
+ throw new Error("sops vault: install optional peer `age-encryption` (bun add age-encryption)");
29
23
  }
30
24
  }
31
25
 
@@ -49,9 +43,8 @@ const ENC_RE =
49
43
  */
50
44
  function b64(input: string): Uint8Array {
51
45
  const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
52
- const pad = normalized.length % 4 === 0
53
- ? normalized
54
- : normalized + "=".repeat(4 - (normalized.length % 4));
46
+ const pad =
47
+ normalized.length % 4 === 0 ? normalized : normalized + "=".repeat(4 - (normalized.length % 4));
55
48
  const bin = atob(pad);
56
49
  const out = new Uint8Array(bin.length);
57
50
  for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
@@ -84,10 +77,7 @@ function asBufferSource(bytes: Uint8Array): Uint8Array<ArrayBuffer> {
84
77
  * @param enc - `ENC[AES256_GCM,…]` string
85
78
  * @param dataKey - 32-byte SOPS data key
86
79
  */
87
- async function decryptValue(
88
- enc: string,
89
- dataKey: Uint8Array,
90
- ): Promise<string> {
80
+ async function decryptValue(enc: string, dataKey: Uint8Array): Promise<string> {
91
81
  const m = ENC_RE.exec(enc);
92
82
  const dataB64 = m?.groups?.data;
93
83
  const ivB64 = m?.groups?.iv;
@@ -108,11 +98,7 @@ async function decryptValue(
108
98
  const cipher = new Uint8Array(data.length + tag.length);
109
99
  cipher.set(data, 0);
110
100
  cipher.set(tag, data.length);
111
- const plain = await crypto.subtle.decrypt(
112
- { name: "AES-GCM", iv },
113
- key,
114
- asBufferSource(cipher),
115
- );
101
+ const plain = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, asBufferSource(cipher));
116
102
  return new TextDecoder().decode(plain);
117
103
  }
118
104
 
@@ -122,10 +108,7 @@ async function decryptValue(
122
108
  * @param identity - `AGE-SECRET-KEY-…`
123
109
  * @param encBlock - Armored age ciphertext from `sops.age[].enc`
124
110
  */
125
- async function decryptDataKey(
126
- identity: string,
127
- encBlock: string,
128
- ): Promise<Uint8Array> {
111
+ async function decryptDataKey(identity: string, encBlock: string): Promise<Uint8Array> {
129
112
  const age = await loadAge();
130
113
  const d = new age.Decrypter();
131
114
  d.addIdentity(identity.trim());
@@ -163,10 +146,7 @@ function parseSopsJson(text: string): {
163
146
  * @param plaintext - Cleartext
164
147
  * @param dataKey - 32-byte key
165
148
  */
166
- export async function sopsEncryptValue(
167
- plaintext: string,
168
- dataKey: Uint8Array,
169
- ): Promise<string> {
149
+ export async function sopsEncryptValue(plaintext: string, dataKey: Uint8Array): Promise<string> {
170
150
  const iv = crypto.getRandomValues(new Uint8Array(12));
171
151
  const key = await crypto.subtle.importKey(
172
152
  "raw",
@@ -176,11 +156,7 @@ export async function sopsEncryptValue(
176
156
  ["encrypt"],
177
157
  );
178
158
  const cipher = new Uint8Array(
179
- await crypto.subtle.encrypt(
180
- { name: "AES-GCM", iv },
181
- key,
182
- new TextEncoder().encode(plaintext),
183
- ),
159
+ await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, new TextEncoder().encode(plaintext)),
184
160
  );
185
161
  const tag = cipher.slice(cipher.length - 16);
186
162
  const data = cipher.slice(0, cipher.length - 16);
@@ -205,8 +181,7 @@ export async function buildSopsFixture(
205
181
  const e = new age.Encrypter();
206
182
  e.addRecipient(recipient);
207
183
  const encKey = await e.encrypt(key);
208
- const encBytes =
209
- typeof encKey === "string" ? new TextEncoder().encode(encKey) : encKey;
184
+ const encBytes = typeof encKey === "string" ? new TextEncoder().encode(encKey) : encKey;
210
185
  const encArmored = age.armor.encode(encBytes);
211
186
  const out: Record<string, unknown> = {};
212
187
  for (const [name, value] of Object.entries(secrets)) {
@@ -6,13 +6,7 @@
6
6
  */
7
7
 
8
8
  /** Protocol ids for vault drivers. */
9
- export type VaultDriverId =
10
- | "sops"
11
- | "env"
12
- | "openbao"
13
- | "infisical"
14
- | "managed"
15
- | "memory";
9
+ export type VaultDriverId = "sops" | "env" | "openbao" | "infisical" | "managed" | "memory";
16
10
 
17
11
  /** Options when opening a vault backend. */
18
12
  export interface VaultOpenOptions {
@@ -145,13 +145,9 @@ export const ai: AiNamespace = {
145
145
  kind: "prompt",
146
146
  name: promptName,
147
147
  model: name,
148
- ...(promptOpts.version !== undefined
149
- ? { version: promptOpts.version }
150
- : {}),
148
+ ...(promptOpts.version !== undefined ? { version: promptOpts.version } : {}),
151
149
  ...(promptOpts.evals !== undefined ? { evals: promptOpts.evals } : {}),
152
- ...(promptOpts.budget !== undefined
153
- ? { budget: promptOpts.budget }
154
- : {}),
150
+ ...(promptOpts.budget !== undefined ? { budget: promptOpts.budget } : {}),
155
151
  ...(promptOpts.in !== undefined ? { in: promptOpts.in } : {}),
156
152
  ...(promptOpts.out !== undefined ? { out: promptOpts.out } : {}),
157
153
  };
@@ -167,14 +163,8 @@ export const ai: AiNamespace = {
167
163
  * @param options - Model + destination index
168
164
  */
169
165
  embed(name: string, options: AiEmbedOptions = {}): AiEmbedDecl {
170
- const model =
171
- typeof options.model === "string"
172
- ? options.model
173
- : options.model?.name;
174
- const into =
175
- typeof options.into === "string"
176
- ? options.into
177
- : options.into?.name;
166
+ const model = typeof options.model === "string" ? options.model : options.model?.name;
167
+ const into = typeof options.into === "string" ? options.into : options.into?.name;
178
168
  return {
179
169
  kind: "embed",
180
170
  name,
@@ -52,12 +52,8 @@ export interface RunPromptEvalsOptions {
52
52
  *
53
53
  * @param options - Cases + ask fn
54
54
  */
55
- export async function runPromptEvals(
56
- options: RunPromptEvalsOptions,
57
- ): Promise<EvalSuiteResult> {
58
- const equals =
59
- options.equals ??
60
- ((a, b) => JSON.stringify(a) === JSON.stringify(b));
55
+ export async function runPromptEvals(options: RunPromptEvalsOptions): Promise<EvalSuiteResult> {
56
+ const equals = options.equals ?? ((a, b) => JSON.stringify(a) === JSON.stringify(b));
61
57
  const results: EvalCaseResult[] = [];
62
58
 
63
59
  for (let i = 0; i < options.cases.length; i++) {
@@ -55,9 +55,7 @@ export class AiPiiBuildError extends Error {
55
55
  *
56
56
  * @param tags - Classification value
57
57
  */
58
- function isPiiTags(
59
- tags: ColumnClassification | string | readonly string[] | undefined,
60
- ): boolean {
58
+ function isPiiTags(tags: ColumnClassification | string | readonly string[] | undefined): boolean {
61
59
  if (!tags) return false;
62
60
  if (typeof tags === "string") return tags === "pii";
63
61
  if (Array.isArray(tags)) return tags.includes("pii");
@@ -6,19 +6,11 @@
6
6
  * Agent denials are recorded on the denial ledger — not errors.
7
7
  */
8
8
 
9
- import type {
10
- AiDriver,
11
- AiModelClient,
12
- } from "../../drivers/ai-types.ts";
9
+ import type { AiDriver, AiModelClient } from "../../drivers/ai-types.ts";
13
10
  import type { IndexStore } from "../../drivers/types.ts";
14
11
  import type { GatePolicyContext } from "../gate/declare.ts";
15
12
  import type { GateRuntime } from "../gate/runtime.ts";
16
- import type {
17
- AiAgentDecl,
18
- AiEmbedDecl,
19
- AiModelDecl,
20
- AiPromptDecl,
21
- } from "./declare.ts";
13
+ import type { AiAgentDecl, AiEmbedDecl, AiModelDecl, AiPromptDecl } from "./declare.ts";
22
14
  import {
23
15
  AiSchemaValidationError,
24
16
  coerceModelObject,
@@ -37,14 +29,7 @@ export interface AgentDenial {
37
29
 
38
30
  /** Effect on a tool flow — same vocabulary as Flows / Traces. */
39
31
  export interface AgentToolEffect {
40
- readonly kind:
41
- | "read"
42
- | "write"
43
- | "emit"
44
- | "send"
45
- | "ask"
46
- | "secret"
47
- | "call";
32
+ readonly kind: "read" | "write" | "emit" | "send" | "ask" | "secret" | "call";
48
33
  readonly resource: string;
49
34
  }
50
35
 
@@ -122,10 +107,7 @@ export interface CreateAiRuntimeOptions {
122
107
  * @param name - Flow name
123
108
  * @param input - Tool input
124
109
  */
125
- readonly callFlow?: (
126
- name: string,
127
- input: unknown,
128
- ) => Promise<unknown>;
110
+ readonly callFlow?: (name: string, input: unknown) => Promise<unknown>;
129
111
  /**
130
112
  * Resolve gates required for a tool flow.
131
113
  *
@@ -186,11 +168,7 @@ export interface AiRuntime {
186
168
  * @param input - Prompt input
187
169
  * @param opts - via / allowPii
188
170
  */
189
- ask(
190
- prompt: string,
191
- input?: unknown,
192
- opts?: AiAskOptions,
193
- ): Promise<Record<string, unknown>>;
171
+ ask(prompt: string, input?: unknown, opts?: AiAskOptions): Promise<Record<string, unknown>>;
194
172
  /**
195
173
  * Run a bounded agent; tool calls that fail gates are denied + recorded.
196
174
  *
@@ -215,11 +193,7 @@ export interface AiRuntime {
215
193
  * @param id - Document id
216
194
  * @param text - Text to embed
217
195
  */
218
- embed(
219
- embed: string,
220
- id: string,
221
- text: string,
222
- ): Promise<void>;
196
+ embed(embed: string, id: string, text: string): Promise<void>;
223
197
  }
224
198
 
225
199
  /**
@@ -227,9 +201,7 @@ export interface AiRuntime {
227
201
  *
228
202
  * @param options - Declarations + clients + gates
229
203
  */
230
- export function createAiRuntime(
231
- options: CreateAiRuntimeOptions = {},
232
- ): AiRuntime {
204
+ export function createAiRuntime(options: CreateAiRuntimeOptions = {}): AiRuntime {
233
205
  const prompts = new Map<string, AiPromptDecl>();
234
206
  for (const p of options.prompts ?? []) prompts.set(p.name, p);
235
207
  const agents = new Map<string, AiAgentDecl>();
@@ -239,9 +211,7 @@ export function createAiRuntime(
239
211
  const models = new Map<string, AiModelDecl>();
240
212
  for (const m of options.models ?? []) models.set(m.name, m);
241
213
 
242
- const clients = new Map<string, AiModelClient>(
243
- Object.entries(options.clients ?? {}),
244
- );
214
+ const clients = new Map<string, AiModelClient>(Object.entries(options.clients ?? {}));
245
215
  const denials: AgentDenial[] = [];
246
216
  const agentRuns: AgentRunRecord[] = [];
247
217
  const journal: AiJournalEntry[] = [];
@@ -297,9 +267,7 @@ export function createAiRuntime(
297
267
  }
298
268
  }
299
269
 
300
- const via =
301
- opts?.via ??
302
- (decl.model ? [decl.model] : [...models.keys()].slice(0, 1));
270
+ const via = opts?.via ?? (decl.model ? [decl.model] : [...models.keys()].slice(0, 1));
303
271
  const attempts: AiFallbackAttempt[] = [];
304
272
  let lastError: string | undefined;
305
273
  let lastSchema: AiSchemaMismatch | undefined;
@@ -314,10 +282,7 @@ export function createAiRuntime(
314
282
  messages: [
315
283
  {
316
284
  role: "user",
317
- content:
318
- typeof input === "string"
319
- ? input
320
- : JSON.stringify(input ?? {}),
285
+ content: typeof input === "string" ? input : JSON.stringify(input ?? {}),
321
286
  },
322
287
  ],
323
288
  responseFormat: decl.out,
@@ -325,8 +290,7 @@ export function createAiRuntime(
325
290
  const attemptCost = result.usage?.cost ?? 0;
326
291
  totalCost += attemptCost;
327
292
  const latencyMs = Math.max(0, now() - attemptStart);
328
- const raw =
329
- result.raw !== undefined ? result.raw : result.text;
293
+ const raw = result.raw !== undefined ? result.raw : result.text;
330
294
 
331
295
  try {
332
296
  const output = decl.out
@@ -409,9 +373,7 @@ export function createAiRuntime(
409
373
  at: now(),
410
374
  });
411
375
  }
412
- throw new Error(
413
- `ai: all models failed for prompt "${prompt}": ${lastError}`,
414
- );
376
+ throw new Error(`ai: all models failed for prompt "${prompt}": ${lastError}`);
415
377
  },
416
378
 
417
379
  async runAgent(agent, runOpts) {
@@ -63,9 +63,7 @@ export class AiSchemaValidationError extends Error {
63
63
  *
64
64
  * @param schema - Declared `out`
65
65
  */
66
- export function isObjectSchema(
67
- schema: unknown,
68
- ): schema is {
66
+ export function isObjectSchema(schema: unknown): schema is {
69
67
  readonly properties?: Record<string, unknown>;
70
68
  readonly required?: readonly string[];
71
69
  readonly type?: string;
@@ -114,15 +112,10 @@ export function matchOutSchema(
114
112
  if (!isObjectSchema(schema)) return null;
115
113
 
116
114
  const props = (schema.properties ?? {}) as Record<string, unknown>;
117
- const required = Array.isArray(schema.required)
118
- ? [...schema.required]
119
- : Object.keys(props);
115
+ const required = Array.isArray(schema.required) ? [...schema.required] : Object.keys(props);
120
116
  const keys = new Set(Object.keys(value));
121
117
  const missing = required.filter((k) => !keys.has(k));
122
- const extra =
123
- Object.keys(props).length > 0
124
- ? [...keys].filter((k) => !(k in props))
125
- : [];
118
+ const extra = Object.keys(props).length > 0 ? [...keys].filter((k) => !(k in props)) : [];
126
119
  const typeMismatches: string[] = [];
127
120
  for (const [key, propSchema] of Object.entries(props)) {
128
121
  if (!(key in value)) continue;
@@ -140,11 +133,7 @@ export function matchOutSchema(
140
133
  }
141
134
  }
142
135
 
143
- if (
144
- missing.length === 0 &&
145
- extra.length === 0 &&
146
- typeMismatches.length === 0
147
- ) {
136
+ if (missing.length === 0 && extra.length === 0 && typeMismatches.length === 0) {
148
137
  return null;
149
138
  }
150
139
  return { missing, extra, typeMismatches };
@@ -9,11 +9,7 @@
9
9
  */
10
10
 
11
11
  import { describe, expect, test } from "bun:test";
12
- import {
13
- createMockAiDriver,
14
- memoryIndexDriver,
15
- mockAiDriver,
16
- } from "../drivers/index.ts";
12
+ import { createMockAiDriver, memoryIndexDriver, mockAiDriver } from "../drivers/index.ts";
17
13
  import { createFx } from "../kernel/fx.ts";
18
14
  import {
19
15
  ai,
@@ -43,10 +39,7 @@ describe("ai declaration", () => {
43
39
  maxSteps: 6,
44
40
  model: smart,
45
41
  });
46
- expect(agent.tools).toEqual([
47
- "bookings.getBooking",
48
- "bookings.refundBooking",
49
- ]);
42
+ expect(agent.tools).toEqual(["bookings.getBooking", "bookings.refundBooking"]);
50
43
 
51
44
  const embed = ai.embed("docs", {
52
45
  model: smart,
@@ -70,8 +63,7 @@ describe("agent gate denial is recorded", () => {
70
63
  const runtime = createAiRuntime({
71
64
  agents: [refund],
72
65
  gates,
73
- gatesForFlow: (name) =>
74
- name === "bookings.refundBooking" ? ["member"] : [],
66
+ gatesForFlow: (name) => (name === "bookings.refundBooking" ? ["member"] : []),
75
67
  callFlow: async (name) => {
76
68
  called.push(name);
77
69
  return { ok: true };
@@ -95,9 +87,7 @@ describe("agent gate denial is recorded", () => {
95
87
  const member = gate.policy("member", ({ auth }) => !!auth.verified);
96
88
  const gates = createGateRuntime({ gates: [member] });
97
89
  const runtime = createAiRuntime({
98
- agents: [
99
- ai.agent("support", { tools: ["bookings.getBooking"], maxSteps: 1 }),
100
- ],
90
+ agents: [ai.agent("support", { tools: ["bookings.getBooking"], maxSteps: 1 })],
101
91
  gates,
102
92
  gatesForFlow: () => ["member"],
103
93
  callFlow: async () => ({ booking: "B1" }),
@@ -270,10 +260,7 @@ describe("embeddings into store.index", () => {
270
260
  indexes: { kb: index },
271
261
  });
272
262
  await runtime.embed("docs", "doc-1", "hello world");
273
- const hits = await index.search(
274
- (await client.embed!({ input: "hello world" })).vectors[0]!,
275
- 1,
276
- );
263
+ const hits = await index.search((await client.embed!({ input: "hello world" })).vectors[0]!, 1);
277
264
  expect(hits[0]?.id).toBe("doc-1");
278
265
  });
279
266
  });
@@ -300,9 +287,13 @@ describe("model fallback chain", () => {
300
287
  clients: { smart: failing, fast: ok },
301
288
  });
302
289
 
303
- const out = await runtime.ask("ticket-triage", { subject: "x" }, {
304
- via: ["smart", "fast"],
305
- });
290
+ const out = await runtime.ask(
291
+ "ticket-triage",
292
+ { subject: "x" },
293
+ {
294
+ via: ["smart", "fast"],
295
+ },
296
+ );
306
297
  expect(out.urgency).toBe("low");
307
298
  const entry = runtime.journal[0]!;
308
299
  expect(entry.attempts).toHaveLength(2);
@@ -343,9 +334,7 @@ describe("schema-validation is its own class", () => {
343
334
  }
344
335
  expect(thrown).toBeInstanceOf(AiSchemaValidationError);
345
336
  expect((thrown as AiSchemaValidationError).code).toBe("AiSchemaInvalid");
346
- expect((thrown as AiSchemaValidationError).mismatch.missing).toContain(
347
- "team",
348
- );
337
+ expect((thrown as AiSchemaValidationError).mismatch.missing).toContain("team");
349
338
  expect(runtime.journal[0]!.outcome).toBe("schema_invalid");
350
339
  expect(runtime.journal[0]!.outcome).not.toBe("provider_error");
351
340
  });
@@ -41,11 +41,7 @@ export type {
41
41
  CreateAiRuntimeOptions,
42
42
  } from "./ai/runtime.ts";
43
43
 
44
- export {
45
- assertAllowPiiForAsk,
46
- AiPiiBuildError,
47
- type PiiAskCheckInput,
48
- } from "./ai/pii.ts";
44
+ export { assertAllowPiiForAsk, AiPiiBuildError, type PiiAskCheckInput } from "./ai/pii.ts";
49
45
 
50
46
  export {
51
47
  runPromptEvals,
@@ -44,15 +44,8 @@ export interface ConsentStore {
44
44
  export function createConsentStore(): ConsentStore {
45
45
  const rows: OptOut[] = [];
46
46
 
47
- function matches(
48
- subject: string,
49
- medium: ChannelMedium,
50
- ): boolean {
51
- return rows.some(
52
- (r) =>
53
- r.subject === subject &&
54
- (r.medium === "all" || r.medium === medium),
55
- );
47
+ function matches(subject: string, medium: ChannelMedium): boolean {
48
+ return rows.some((r) => r.subject === subject && (r.medium === "all" || r.medium === medium));
56
49
  }
57
50
 
58
51
  return {
@@ -60,9 +53,7 @@ export function createConsentStore(): ConsentStore {
60
53
  return matches(subject, medium);
61
54
  },
62
55
  optOut(subject, medium) {
63
- if (
64
- !rows.some((r) => r.subject === subject && r.medium === medium)
65
- ) {
56
+ if (!rows.some((r) => r.subject === subject && r.medium === medium)) {
66
57
  rows.push({ subject, medium, at: Date.now() });
67
58
  }
68
59
  },
@@ -42,10 +42,7 @@ export interface FallbackWeeklyCostDelta {
42
42
  * @param medium - Channel medium
43
43
  * @param costs - Unit cost table
44
44
  */
45
- export function costOf(
46
- medium: string,
47
- costs: MediumCosts = DEFAULT_MEDIUM_COSTS,
48
- ): number {
45
+ export function costOf(medium: string, costs: MediumCosts = DEFAULT_MEDIUM_COSTS): number {
49
46
  return costs[medium as ChannelMedium] ?? costs.any ?? 0.005;
50
47
  }
51
48
 
@@ -69,9 +66,7 @@ export function fallbackWeeklyCostDelta(
69
66
  ): FallbackWeeklyCostDelta {
70
67
  const costs = options.costs ?? DEFAULT_MEDIUM_COSTS;
71
68
  const end = options.weekEndMs ?? options.now ?? Date.now();
72
- const inWeek = receipts.filter(
73
- (r) => r.at >= options.weekStartMs && r.at <= end,
74
- );
69
+ const inWeek = receipts.filter((r) => r.at >= options.weekStartMs && r.at <= end);
75
70
  const fallbacks = inWeek.filter((r) => r.status === "fallback");
76
71
 
77
72
  let weeklyDeltaUsd = 0;
@@ -80,8 +75,7 @@ export function fallbackWeeklyCostDelta(
80
75
 
81
76
  for (const r of fallbacks) {
82
77
  const first = r.attempts[0];
83
- const winner =
84
- [...r.attempts].reverse().find((a) => a.ok) ?? r.attempts.at(-1);
78
+ const winner = [...r.attempts].reverse().find((a) => a.ok) ?? r.attempts.at(-1);
85
79
  if (!first || !winner) continue;
86
80
  const primary = mediumFromDriver(first.driverId, r.medium);
87
81
  const fb = mediumFromDriver(winner.driverId, r.medium);
@@ -118,12 +112,7 @@ function mediumFromDriver(driverId: string, receiptMedium: string): string {
118
112
  if (id.includes("push") || id.includes("fcm") || id.includes("webpush")) {
119
113
  return "push";
120
114
  }
121
- if (
122
- id.includes("smtp") ||
123
- id.includes("resend") ||
124
- id.includes("ses") ||
125
- id.includes("email")
126
- ) {
115
+ if (id.includes("smtp") || id.includes("resend") || id.includes("ses") || id.includes("email")) {
127
116
  return "email";
128
117
  }
129
118
  return receiptMedium === "any" ? "email" : receiptMedium;
@@ -104,10 +104,7 @@ export const channel: ChannelNamespace = {
104
104
  * @param name - Template id
105
105
  * @param options - Medium / locales / schema
106
106
  */
107
- template(
108
- name: string,
109
- options: ChannelTemplateOptions = {},
110
- ): ChannelTemplateDecl {
107
+ template(name: string, options: ChannelTemplateOptions = {}): ChannelTemplateDecl {
111
108
  if (!name) throw new TypeError("channel.template: name is required");
112
109
  return {
113
110
  kind: "template",
@@ -73,10 +73,7 @@ export async function verifyEmailAuth(
73
73
  };
74
74
  }
75
75
 
76
- async function safeLookup(
77
- lookup: DnsTxtLookup,
78
- name: string,
79
- ): Promise<readonly string[]> {
76
+ async function safeLookup(lookup: DnsTxtLookup, name: string): Promise<readonly string[]> {
80
77
  try {
81
78
  return await lookup(name);
82
79
  } catch {
@@ -30,13 +30,7 @@ export interface ResolveLocaleOptions {
30
30
  */
31
31
  export function isRtlLocale(locale: string): boolean {
32
32
  const base = locale.toLowerCase().split("-")[0] ?? locale;
33
- return (
34
- base === "ar" ||
35
- base === "he" ||
36
- base === "fa" ||
37
- base === "ur" ||
38
- base === "yi"
39
- );
33
+ return base === "ar" || base === "he" || base === "fa" || base === "ur" || base === "yi";
40
34
  }
41
35
 
42
36
  /**
@@ -59,9 +53,7 @@ export function parseAcceptLanguage(header: string | undefined): string | undefi
59
53
  *
60
54
  * @param options - Resolution inputs
61
55
  */
62
- export function resolveLocale(
63
- options: ResolveLocaleOptions = {},
64
- ): LocaleResolution {
56
+ export function resolveLocale(options: ResolveLocaleOptions = {}): LocaleResolution {
65
57
  const defaultLocale = options.defaultLocale ?? "en";
66
58
  const chain: LocaleChainStep[] = [];
67
59
 
@@ -38,9 +38,7 @@ export function maskEmail(email: string): string {
38
38
  const name = parts[0] ?? domain;
39
39
  const tld = parts.length > 1 ? parts.slice(1).join(".") : "";
40
40
  const domainMask =
41
- name.length <= 1
42
- ? "*"
43
- : `${name[0]!}${"*".repeat(Math.min(3, name.length - 1))}`;
41
+ name.length <= 1 ? "*" : `${name[0]!}${"*".repeat(Math.min(3, name.length - 1))}`;
44
42
  return tld ? `${localMask}@${domainMask}.${tld}` : `${localMask}@${domainMask}`;
45
43
  }
46
44
 
@@ -6,18 +6,8 @@
6
6
  * transports; OKE does not re-implement it.
7
7
  */
8
8
 
9
- export type {
10
- Attachment,
11
- MailOptions,
12
- SendResult,
13
- Transport,
14
- RetryConfig,
15
- } from "sently";
9
+ export type { Attachment, MailOptions, SendResult, Transport, RetryConfig } from "sently";
16
10
 
17
11
  export { SentlyError } from "sently/errors";
18
12
  export { RetryTransport } from "sently/transports/retry";
19
- export {
20
- FallbackTransport,
21
- FallbackError,
22
- type FallbackAttempt,
23
- } from "sently/transports/fallback";
13
+ export { FallbackTransport, FallbackError, type FallbackAttempt } from "sently/transports/fallback";
@@ -3,11 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, expect, test } from "bun:test";
6
- import {
7
- buildOutcomeRows,
8
- formatAttemptChain,
9
- VERDICT_BY_STATE,
10
- } from "./outcomes.ts";
6
+ import { buildOutcomeRows, formatAttemptChain, VERDICT_BY_STATE } from "./outcomes.ts";
11
7
 
12
8
  describe("delivery outcome taxonomy", () => {
13
9
  test("every state carries a verdict", () => {