okengine 0.2.6 → 0.3.2

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 (681) hide show
  1. package/AGENTS.md +33 -30
  2. package/README.md +74 -340
  3. package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
  4. package/package.json +47 -44
  5. package/site/content/docs/ai/llms-txt.mdx +54 -0
  6. package/site/content/docs/ai/mcp.mdx +123 -0
  7. package/site/content/docs/ai/meta.json +5 -0
  8. package/site/content/docs/ai/skills.mdx +53 -0
  9. package/site/content/docs/console/access.mdx +29 -0
  10. package/site/content/docs/console/ai.mdx +35 -0
  11. package/site/content/docs/console/architecture.mdx +35 -0
  12. package/site/content/docs/console/channels.mdx +37 -0
  13. package/site/content/docs/console/clock.mdx +31 -0
  14. package/site/content/docs/console/flows.mdx +31 -0
  15. package/site/content/docs/console/gates.mdx +35 -0
  16. package/site/content/docs/console/manifest-diff.mdx +34 -0
  17. package/site/content/docs/console/meta.json +23 -0
  18. package/site/content/docs/console/overview.mdx +40 -0
  19. package/site/content/docs/console/plugins.mdx +41 -0
  20. package/site/content/docs/console/privacy.mdx +32 -0
  21. package/site/content/docs/console/runs.mdx +40 -0
  22. package/site/content/docs/console/signals.mdx +31 -0
  23. package/site/content/docs/console/store.mdx +32 -0
  24. package/site/content/docs/console/tenancy.mdx +32 -0
  25. package/site/content/docs/console/traces.mdx +34 -0
  26. package/site/content/docs/console/vault.mdx +37 -0
  27. package/site/content/docs/elements/ai.mdx +180 -0
  28. package/site/content/docs/elements/channel.mdx +167 -0
  29. package/site/content/docs/elements/clock.mdx +182 -0
  30. package/site/content/docs/elements/flow.mdx +288 -0
  31. package/site/content/docs/elements/gate.mdx +171 -0
  32. package/site/content/docs/elements/meta.json +5 -0
  33. package/site/content/docs/elements/signal.mdx +171 -0
  34. package/site/content/docs/elements/store.mdx +320 -0
  35. package/site/content/docs/elements/vault.mdx +263 -0
  36. package/site/content/docs/get-started/basic-usage.mdx +124 -0
  37. package/site/content/docs/get-started/comparison.mdx +65 -0
  38. package/site/content/docs/get-started/installation.mdx +113 -0
  39. package/site/content/docs/get-started/introduction.mdx +123 -0
  40. package/site/content/docs/get-started/meta.json +5 -0
  41. package/site/content/docs/index.mdx +63 -0
  42. package/site/content/docs/meta.json +5 -0
  43. package/site/content/docs/plugins/compression.mdx +60 -0
  44. package/site/content/docs/plugins/cors.mdx +92 -0
  45. package/site/content/docs/plugins/csrf.mdx +96 -0
  46. package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
  47. package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
  48. package/site/content/docs/plugins/meta.json +15 -0
  49. package/site/content/docs/plugins/security-headers.mdx +136 -0
  50. package/site/content/docs/reference/cli.md +101 -0
  51. package/site/content/docs/reference/configuration.mdx +159 -0
  52. package/site/content/docs/reference/environment-variables.mdx +87 -0
  53. package/site/content/docs/reference/errors.mdx +80 -0
  54. package/site/content/docs/reference/fx.mdx +117 -0
  55. package/site/content/docs/reference/meta.json +5 -0
  56. package/site/content/docs/reference/plugins.mdx +249 -0
  57. package/site/content/docs/reference/security.md +63 -0
  58. package/src/auth/api-keys.ts +2 -5
  59. package/src/auth/attenuation.ts +2 -6
  60. package/src/auth/auth.test.ts +56 -31
  61. package/src/auth/invoke-as.ts +1 -3
  62. package/src/auth/operator.ts +8 -26
  63. package/src/auth/planes.ts +2 -7
  64. package/src/auth/plugin.ts +4 -7
  65. package/src/auth/roles.ts +1 -5
  66. package/src/auth/sessions.ts +10 -39
  67. package/src/cli/args.ts +1 -5
  68. package/src/cli/ask-dev-mode.ts +40 -0
  69. package/src/cli/build.ts +1 -2
  70. package/src/cli/client-add.test.ts +8 -15
  71. package/src/cli/client-add.ts +5 -14
  72. package/src/cli/completion.test.ts +1 -5
  73. package/src/cli/completion.ts +4 -17
  74. package/src/cli/db-auto-push.test.ts +64 -0
  75. package/src/cli/db-auto-push.ts +72 -0
  76. package/src/cli/db.test.ts +189 -0
  77. package/src/cli/db.ts +456 -0
  78. package/src/cli/dev-app-runner.ts +2 -8
  79. package/src/cli/dev-db-push.test.ts +193 -0
  80. package/src/cli/dev-mode.test.ts +45 -0
  81. package/src/cli/dev-mode.ts +78 -0
  82. package/src/cli/dev-schema-sync.test.ts +66 -0
  83. package/src/cli/dev-schema-sync.ts +139 -0
  84. package/src/cli/dev.test.ts +264 -15
  85. package/src/cli/dev.ts +355 -139
  86. package/src/cli/doc-staleness.test.ts +69 -0
  87. package/src/cli/docker-cli.test.ts +27 -8
  88. package/src/cli/docker.ts +11 -3
  89. package/src/cli/doctor-diff.test.ts +1 -5
  90. package/src/cli/doctor-diff.ts +17 -46
  91. package/src/cli/doctor-pii.ts +2 -7
  92. package/src/cli/doctor.test.ts +26 -4
  93. package/src/cli/doctor.ts +35 -11
  94. package/src/cli/drizzle-env.test.ts +67 -0
  95. package/src/cli/drizzle-env.ts +78 -0
  96. package/src/cli/ensure-drizzle-config.ts +50 -0
  97. package/src/cli/eval.ts +4 -14
  98. package/src/cli/gates-list.ts +1 -4
  99. package/src/cli/hero-meta.test.ts +17 -19
  100. package/src/cli/hero-meta.ts +20 -30
  101. package/src/cli/images.ts +3 -8
  102. package/src/cli/index.ts +11 -2
  103. package/src/cli/load-config.images.test.ts +14 -14
  104. package/src/cli/load-config.ts +47 -47
  105. package/src/cli/mcp-from-console.ts +1 -4
  106. package/src/cli/mode.ts +65 -0
  107. package/src/cli/openbao-bootstrap.test.ts +147 -0
  108. package/src/cli/openbao-bootstrap.ts +280 -0
  109. package/src/cli/openbao-restart.integration.test.ts +136 -0
  110. package/src/cli/ports.test.ts +7 -14
  111. package/src/cli/ports.ts +7 -5
  112. package/src/cli/privacy-erase.ts +1 -3
  113. package/src/cli/registry.ts +75 -25
  114. package/src/cli/resolve-dev-sql-env.test.ts +48 -0
  115. package/src/cli/resolve-dev-sql-env.ts +42 -0
  116. package/src/cli/schema.ts +3 -10
  117. package/src/cli/stack.ts +8 -10
  118. package/src/cli/start.ts +4 -15
  119. package/src/cli/upgrade.ts +1 -4
  120. package/src/cli/vault-cmd.ts +63 -0
  121. package/src/client/budget-entry.ts +1 -6
  122. package/src/client/create.test.ts +6 -12
  123. package/src/client/create.ts +2 -8
  124. package/src/client/errors.ts +1 -4
  125. package/src/client/index.ts +1 -6
  126. package/src/client/notes-contract.test.ts +4 -13
  127. package/src/client/transport.ts +9 -30
  128. package/src/client/types.ts +15 -30
  129. package/src/compiler/aot.test.ts +2 -9
  130. package/src/compiler/aot.ts +1 -4
  131. package/src/compiler/differential.test.ts +3 -11
  132. package/src/compiler/dynamic.ts +1 -4
  133. package/src/compiler/effects-infer.ts +8 -34
  134. package/src/compiler/emit.ts +1 -3
  135. package/src/compiler/extract.test.ts +136 -30
  136. package/src/compiler/extract.ts +485 -157
  137. package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
  138. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  139. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  140. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  141. package/src/compiler/fixtures/skyport.expected.json +24 -83
  142. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  143. package/src/compiler/http-parse.ts +2 -9
  144. package/src/compiler/index.ts +1 -5
  145. package/src/compiler/response.ts +16 -7
  146. package/src/compiler/sucrose.ts +11 -31
  147. package/src/config/define-config.test.ts +55 -34
  148. package/src/config/index.ts +177 -46
  149. package/src/config/resolve-driver.test.ts +28 -17
  150. package/src/console/budget.test.ts +1 -4
  151. package/src/console/index.ts +1 -4
  152. package/src/console/server/access.test.ts +15 -43
  153. package/src/console/server/access.ts +19 -49
  154. package/src/console/server/ai.test.ts +3 -11
  155. package/src/console/server/ai.ts +23 -46
  156. package/src/console/server/app.ts +16 -45
  157. package/src/console/server/auth-rate.test.ts +4 -12
  158. package/src/console/server/bind.ts +1 -5
  159. package/src/console/server/channels.test.ts +2 -6
  160. package/src/console/server/channels.ts +10 -35
  161. package/src/console/server/claim.ts +2 -8
  162. package/src/console/server/clock.test.ts +2 -6
  163. package/src/console/server/clock.ts +8 -26
  164. package/src/console/server/console.test.ts +1 -3
  165. package/src/console/server/diff.test.ts +5 -17
  166. package/src/console/server/diff.ts +10 -31
  167. package/src/console/server/dry-run.audit.test.ts +2 -8
  168. package/src/console/server/flows.ts +64 -233
  169. package/src/console/server/gates.test.ts +14 -50
  170. package/src/console/server/gates.ts +13 -48
  171. package/src/console/server/index.ts +2 -9
  172. package/src/console/server/live.ts +3 -12
  173. package/src/console/server/operator-db.test.ts +4 -15
  174. package/src/console/server/operator-db.ts +13 -32
  175. package/src/console/server/plugin.ts +50 -53
  176. package/src/console/server/plugins.test.ts +2 -6
  177. package/src/console/server/plugins.ts +17 -56
  178. package/src/console/server/runs-pii.ts +2 -7
  179. package/src/console/server/security.gate.test.ts +18 -40
  180. package/src/console/server/serve.ts +10 -25
  181. package/src/console/server/signals.test.ts +1 -3
  182. package/src/console/server/signals.ts +17 -40
  183. package/src/console/server/state.ts +21 -59
  184. package/src/console/server/store.test.ts +20 -22
  185. package/src/console/server/store.ts +31 -76
  186. package/src/console/server/vault.test.ts +12 -29
  187. package/src/console/server/vault.ts +44 -66
  188. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  189. package/src/console/ui/access/a11y.test.tsx +3 -12
  190. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  191. package/src/console/ui/access/acknowledgement.ts +1 -3
  192. package/src/console/ui/access/blast-radius.ts +1 -3
  193. package/src/console/ui/access/confirmation.test.ts +1 -5
  194. package/src/console/ui/access/confirmation.ts +1 -4
  195. package/src/console/ui/access/fixture.ts +1 -5
  196. package/src/console/ui/access/grantable.test.ts +1 -3
  197. package/src/console/ui/access/grantable.ts +2 -7
  198. package/src/console/ui/access/index.ts +2 -9
  199. package/src/console/ui/access/provenance.test.ts +1 -3
  200. package/src/console/ui/access/provenance.ts +2 -6
  201. package/src/console/ui/access/search.test.ts +1 -5
  202. package/src/console/ui/access/search.ts +2 -6
  203. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  204. package/src/console/ui/ai/a11y.test.tsx +2 -5
  205. package/src/console/ui/ai/fixture.ts +2 -7
  206. package/src/console/ui/ai/format.ts +1 -3
  207. package/src/console/ui/ai/group.test.ts +1 -3
  208. package/src/console/ui/ai/group.ts +4 -12
  209. package/src/console/ui/ai/index.ts +2 -9
  210. package/src/console/ui/ai/promotion.test.ts +2 -7
  211. package/src/console/ui/ai/promotion.ts +4 -13
  212. package/src/console/ui/ai/search.test.ts +2 -11
  213. package/src/console/ui/ai/search.ts +3 -13
  214. package/src/console/ui/ai/types.ts +1 -8
  215. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  216. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  217. package/src/console/ui/architecture/declared.ts +1 -5
  218. package/src/console/ui/architecture/index.ts +7 -35
  219. package/src/console/ui/architecture/layout.ts +1 -3
  220. package/src/console/ui/architecture/pathologies.ts +10 -19
  221. package/src/console/ui/architecture/search.ts +6 -15
  222. package/src/console/ui/architecture/traffic.ts +4 -14
  223. package/src/console/ui/architecture/types.ts +2 -10
  224. package/src/console/ui/architecture/view.test.ts +7 -19
  225. package/src/console/ui/architecture/view.ts +9 -36
  226. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  227. package/src/console/ui/channels/a11y.test.tsx +1 -2
  228. package/src/console/ui/channels/confirmation.test.ts +1 -4
  229. package/src/console/ui/channels/confirmation.ts +1 -4
  230. package/src/console/ui/channels/findings.ts +1 -5
  231. package/src/console/ui/channels/index.ts +2 -8
  232. package/src/console/ui/channels/locale.test.ts +1 -3
  233. package/src/console/ui/channels/locale.ts +2 -8
  234. package/src/console/ui/channels/search.ts +4 -13
  235. package/src/console/ui/channels/taxonomy.ts +1 -3
  236. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  237. package/src/console/ui/clock/a11y.test.tsx +2 -5
  238. package/src/console/ui/clock/confirmation.test.ts +1 -3
  239. package/src/console/ui/clock/confirmation.ts +1 -4
  240. package/src/console/ui/clock/findings.ts +1 -4
  241. package/src/console/ui/clock/health.ts +2 -7
  242. package/src/console/ui/clock/index.ts +2 -10
  243. package/src/console/ui/clock/search.test.ts +1 -3
  244. package/src/console/ui/clock/search.ts +2 -6
  245. package/src/console/ui/clock/timeline.test.ts +1 -3
  246. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  247. package/src/console/ui/clock/waiting-on.ts +2 -7
  248. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  249. package/src/console/ui/diff/a11y.test.tsx +2 -5
  250. package/src/console/ui/diff/group.test.ts +3 -13
  251. package/src/console/ui/diff/group.ts +2 -8
  252. package/src/console/ui/diff/index.ts +2 -8
  253. package/src/console/ui/diff/search.test.ts +1 -5
  254. package/src/console/ui/diff/search.ts +4 -16
  255. package/src/console/ui/diff/summary.ts +1 -2
  256. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  257. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  258. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  259. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  260. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  261. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  262. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  263. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  264. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  265. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  266. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  267. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  268. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  269. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  270. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  271. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  272. package/src/console/ui/dist/index.html +1 -1
  273. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  274. package/src/console/ui/flows/a11y.test.tsx +2 -8
  275. package/src/console/ui/flows/buffer.test.ts +3 -11
  276. package/src/console/ui/flows/buffer.ts +4 -11
  277. package/src/console/ui/flows/confirmation.ts +1 -3
  278. package/src/console/ui/flows/contract.test.ts +3 -7
  279. package/src/console/ui/flows/contract.ts +12 -36
  280. package/src/console/ui/flows/graph.test.ts +3 -11
  281. package/src/console/ui/flows/graph.ts +5 -15
  282. package/src/console/ui/flows/index.ts +1 -6
  283. package/src/console/ui/flows/save-as-test.ts +1 -3
  284. package/src/console/ui/flows/search.ts +8 -25
  285. package/src/console/ui/flows/tiers.ts +2 -9
  286. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  287. package/src/console/ui/gates/a11y.test.tsx +2 -5
  288. package/src/console/ui/gates/audit.ts +1 -3
  289. package/src/console/ui/gates/denial.test.ts +1 -3
  290. package/src/console/ui/gates/denial.ts +4 -12
  291. package/src/console/ui/gates/findings.ts +1 -3
  292. package/src/console/ui/gates/group.test.ts +3 -3
  293. package/src/console/ui/gates/group.ts +3 -11
  294. package/src/console/ui/gates/index.ts +2 -10
  295. package/src/console/ui/gates/search.ts +3 -10
  296. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  297. package/src/console/ui/overview/a11y.test.tsx +1 -2
  298. package/src/console/ui/overview/busiest.ts +1 -3
  299. package/src/console/ui/overview/compose.ts +1 -13
  300. package/src/console/ui/overview/cost.ts +34 -38
  301. package/src/console/ui/overview/fixture.ts +21 -26
  302. package/src/console/ui/overview/golden.ts +4 -14
  303. package/src/console/ui/overview/index.ts +2 -9
  304. package/src/console/ui/overview/rank.test.ts +3 -10
  305. package/src/console/ui/overview/rank.ts +2 -7
  306. package/src/console/ui/overview/slo.test.ts +5 -9
  307. package/src/console/ui/overview/slo.ts +6 -23
  308. package/src/console/ui/overview/verdict.ts +3 -10
  309. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  310. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  311. package/src/console/ui/plugins/fixture.ts +2 -4
  312. package/src/console/ui/plugins/group.test.ts +1 -3
  313. package/src/console/ui/plugins/group.ts +1 -6
  314. package/src/console/ui/plugins/index.ts +3 -13
  315. package/src/console/ui/plugins/search.ts +7 -19
  316. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  317. package/src/console/ui/runs/a11y.test.tsx +2 -5
  318. package/src/console/ui/runs/explain.ts +2 -6
  319. package/src/console/ui/runs/group.ts +3 -12
  320. package/src/console/ui/runs/histogram.test.ts +2 -11
  321. package/src/console/ui/runs/histogram.ts +1 -4
  322. package/src/console/ui/runs/index.ts +4 -18
  323. package/src/console/ui/runs/project.ts +2 -6
  324. package/src/console/ui/runs/query.test.ts +1 -3
  325. package/src/console/ui/runs/query.ts +12 -35
  326. package/src/console/ui/runs/search.ts +5 -19
  327. package/src/console/ui/runs/trace-link.test.ts +2 -6
  328. package/src/console/ui/runs/trace-link.ts +4 -16
  329. package/src/console/ui/runs/types.ts +1 -3
  330. package/src/console/ui/shell/App.tsx +2 -10
  331. package/src/console/ui/shell/client.ts +22 -115
  332. package/src/console/ui/shell/components/ui.tsx +1 -4
  333. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  334. package/src/console/ui/shell/main.tsx +31 -96
  335. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  336. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  337. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  338. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  339. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  340. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  341. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  342. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  343. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  344. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  345. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  346. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  347. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  348. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  349. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  350. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  351. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  352. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  353. package/src/console/ui/shell/styles.css +1 -2
  354. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  355. package/src/console/ui/signals/a11y.test.tsx +2 -5
  356. package/src/console/ui/signals/confirmation.test.ts +1 -5
  357. package/src/console/ui/signals/confirmation.ts +2 -6
  358. package/src/console/ui/signals/dry-run.ts +1 -3
  359. package/src/console/ui/signals/durable.ts +1 -3
  360. package/src/console/ui/signals/findings.ts +1 -3
  361. package/src/console/ui/signals/group.test.ts +2 -8
  362. package/src/console/ui/signals/group.ts +2 -10
  363. package/src/console/ui/signals/index.ts +1 -4
  364. package/src/console/ui/signals/monitor.ts +2 -7
  365. package/src/console/ui/signals/schema-form.test.ts +3 -14
  366. package/src/console/ui/signals/schema-form.ts +1 -4
  367. package/src/console/ui/signals/search.ts +4 -13
  368. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  369. package/src/console/ui/store/a11y.test.tsx +2 -5
  370. package/src/console/ui/store/confirmation.test.ts +1 -3
  371. package/src/console/ui/store/confirmation.ts +1 -4
  372. package/src/console/ui/store/dry-run.ts +2 -5
  373. package/src/console/ui/store/fixture.ts +1 -2
  374. package/src/console/ui/store/group.test.ts +1 -6
  375. package/src/console/ui/store/group.ts +1 -4
  376. package/src/console/ui/store/index.ts +1 -5
  377. package/src/console/ui/store/search.ts +2 -6
  378. package/src/console/ui/store/will-not-fire.ts +1 -2
  379. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  380. package/src/console/ui/traces/a11y.test.tsx +1 -2
  381. package/src/console/ui/traces/chain.test.ts +5 -19
  382. package/src/console/ui/traces/chain.ts +1 -3
  383. package/src/console/ui/traces/critical-path.test.ts +1 -3
  384. package/src/console/ui/traces/critical-path.ts +2 -6
  385. package/src/console/ui/traces/filter.test.ts +2 -6
  386. package/src/console/ui/traces/filter.ts +5 -13
  387. package/src/console/ui/traces/fold.test.ts +4 -12
  388. package/src/console/ui/traces/fold.ts +1 -3
  389. package/src/console/ui/traces/mini.ts +1 -3
  390. package/src/console/ui/traces/replay.test.ts +1 -3
  391. package/src/console/ui/traces/replay.ts +1 -3
  392. package/src/console/ui/traces/sampling.ts +1 -4
  393. package/src/console/ui/traces/search.ts +4 -17
  394. package/src/console/ui/traces/tier.ts +1 -3
  395. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  396. package/src/console/ui/vault/a11y.test.tsx +1 -2
  397. package/src/console/ui/vault/blast-radius.ts +1 -3
  398. package/src/console/ui/vault/confirmation.test.ts +1 -5
  399. package/src/console/ui/vault/confirmation.ts +1 -4
  400. package/src/console/ui/vault/dormant.test.ts +1 -4
  401. package/src/console/ui/vault/export-safe.test.ts +1 -5
  402. package/src/console/ui/vault/export-safe.ts +1 -4
  403. package/src/console/ui/vault/fixture.ts +3 -3
  404. package/src/console/ui/vault/group.ts +1 -2
  405. package/src/console/ui/vault/index.ts +2 -10
  406. package/src/console/ui/vault/search.ts +2 -6
  407. package/src/console/ui/vault/types.ts +1 -1
  408. package/src/console/xss.gate.test.ts +1 -3
  409. package/src/docker/compose.ts +215 -27
  410. package/src/docker/derive.ts +6 -14
  411. package/src/docker/docker.test.ts +118 -15
  412. package/src/docker/dockerfile.integration.test.ts +12 -21
  413. package/src/docker/helpers.ts +5 -4
  414. package/src/docker/index.ts +9 -6
  415. package/src/docker/pin.ts +1 -9
  416. package/src/docker/recipes/index.ts +6 -6
  417. package/src/docker/recipes/mailpit.ts +22 -0
  418. package/src/docker/recipes/openbao.ts +47 -0
  419. package/src/docker/recipes/postgres.ts +17 -6
  420. package/src/docker/recipes/redis.ts +11 -2
  421. package/src/docker/recipes/rustfs.ts +32 -0
  422. package/src/docker/stack-id.test.ts +73 -5
  423. package/src/docker/stack-id.ts +124 -33
  424. package/src/docker/stack.integration.test.ts +6 -21
  425. package/src/docker/stack.ts +36 -4
  426. package/src/docker/types.ts +16 -4
  427. package/src/docs-origin.ts +4 -4
  428. package/src/drivers/ai-anthropic.ts +5 -14
  429. package/src/drivers/ai-mock.ts +2 -5
  430. package/src/drivers/ai-openai-compatible.ts +4 -10
  431. package/src/drivers/ai-providers.test.ts +6 -13
  432. package/src/drivers/bun-native-completeness.test.ts +6 -15
  433. package/src/drivers/channel-console.ts +6 -7
  434. package/src/drivers/channel-fcm.ts +20 -30
  435. package/src/drivers/channel-resend.ts +1 -3
  436. package/src/drivers/channel-smtp.ts +2 -6
  437. package/src/drivers/channel-types.ts +2 -12
  438. package/src/drivers/channel-unifonic.ts +2 -6
  439. package/src/drivers/channel-wa-cloud.ts +2 -6
  440. package/src/drivers/channel-webpush.ts +21 -60
  441. package/src/drivers/conformance.test.ts +2 -10
  442. package/src/drivers/conformance.ts +8 -21
  443. package/src/drivers/drizzle-dialect.test.ts +20 -0
  444. package/src/drivers/drizzle-dialect.ts +37 -0
  445. package/src/drivers/fs.ts +2 -8
  446. package/src/drivers/index.ts +12 -57
  447. package/src/drivers/memory.ts +287 -75
  448. package/src/drivers/pgvector.ts +7 -11
  449. package/src/drivers/postgres.ts +7 -13
  450. package/src/drivers/redis.ts +13 -37
  451. package/src/drivers/s3.ts +15 -18
  452. package/src/drivers/signal-engine.ts +12 -49
  453. package/src/drivers/signal-memory.ts +2 -8
  454. package/src/drivers/signal-nats.ts +4 -9
  455. package/src/drivers/signal-postgres.ts +62 -129
  456. package/src/drivers/signal-redis.ts +7 -21
  457. package/src/drivers/signal-types.ts +1 -4
  458. package/src/drivers/sqlite.ts +3 -12
  459. package/src/drivers/types.ts +4 -23
  460. package/src/drivers/vault-driver-removal.test.ts +55 -0
  461. package/src/drivers/vault-env.ts +2 -6
  462. package/src/drivers/vault-infisical.ts +1 -5
  463. package/src/drivers/vault-managed.ts +1 -5
  464. package/src/drivers/vault-memory.ts +1 -5
  465. package/src/drivers/vault-openbao.test.ts +97 -0
  466. package/src/drivers/vault-openbao.ts +103 -40
  467. package/src/drivers/vault-types.ts +3 -16
  468. package/src/elements/ai/declare.ts +4 -14
  469. package/src/elements/ai/eval.ts +2 -6
  470. package/src/elements/ai/pii.ts +1 -3
  471. package/src/elements/ai/runtime.ts +12 -50
  472. package/src/elements/ai/schema.ts +4 -15
  473. package/src/elements/ai.test.ts +13 -24
  474. package/src/elements/ai.ts +1 -5
  475. package/src/elements/channel/consent.ts +3 -12
  476. package/src/elements/channel/costs.ts +4 -15
  477. package/src/elements/channel/declare.ts +1 -4
  478. package/src/elements/channel/email-auth.ts +1 -4
  479. package/src/elements/channel/locale.ts +2 -10
  480. package/src/elements/channel/mask.ts +1 -3
  481. package/src/elements/channel/mime.ts +2 -12
  482. package/src/elements/channel/outcomes.test.ts +1 -5
  483. package/src/elements/channel/outcomes.ts +5 -15
  484. package/src/elements/channel/receipts.ts +2 -7
  485. package/src/elements/channel/runtime.ts +28 -74
  486. package/src/elements/channel/suppression.ts +8 -14
  487. package/src/elements/channel.test.ts +8 -31
  488. package/src/elements/channel.ts +3 -14
  489. package/src/elements/clock/actions.ts +6 -18
  490. package/src/elements/clock/declare.ts +1 -3
  491. package/src/elements/clock/dst.ts +1 -5
  492. package/src/elements/clock/durable.ts +4 -16
  493. package/src/elements/clock/health.ts +2 -7
  494. package/src/elements/clock/leader.ts +2 -9
  495. package/src/elements/clock/reconcile.ts +4 -15
  496. package/src/elements/clock/runtime.ts +2 -5
  497. package/src/elements/clock/schedule.ts +4 -20
  498. package/src/elements/clock.test.ts +2 -7
  499. package/src/elements/clock.ts +5 -23
  500. package/src/elements/gate/permissions.ts +1 -4
  501. package/src/elements/gate/runtime.ts +7 -28
  502. package/src/elements/gate.ts +1 -5
  503. package/src/elements/index.ts +9 -7
  504. package/src/elements/signal/declare.ts +2 -7
  505. package/src/elements/signal/reconcile.test.ts +1 -4
  506. package/src/elements/signal/runtime.ts +1 -3
  507. package/src/elements/signal.test.ts +3 -15
  508. package/src/elements/signal.ts +2 -8
  509. package/src/elements/store/cache.test.ts +46 -0
  510. package/src/elements/store/cache.ts +3 -11
  511. package/src/elements/store/classify.ts +5 -22
  512. package/src/elements/store/declare.ts +11 -17
  513. package/src/elements/store/domain-ddl.test.ts +86 -0
  514. package/src/elements/store/emit-drizzle.ts +363 -0
  515. package/src/elements/store/files-policy.test.ts +1 -5
  516. package/src/elements/store/files-policy.ts +4 -12
  517. package/src/elements/store/load-plugin-tables.ts +103 -0
  518. package/src/elements/store/missing-relation.test.ts +83 -0
  519. package/src/elements/store/missing-relation.ts +38 -0
  520. package/src/elements/store/replica.ts +1 -4
  521. package/src/elements/store/resource-list-docs.fixture.ts +56 -0
  522. package/src/elements/store/resource-list-docs.test.ts +79 -0
  523. package/src/elements/store/resource.test.ts +253 -0
  524. package/src/elements/store/resource.ts +786 -0
  525. package/src/elements/store/runtime.ts +25 -28
  526. package/src/elements/store/schema-decl.test.ts +227 -0
  527. package/src/elements/store/schema-decl.ts +516 -0
  528. package/src/elements/store/sql-condition.test.ts +132 -0
  529. package/src/elements/store/sql-condition.ts +293 -65
  530. package/src/elements/store/sql-session.test.ts +135 -0
  531. package/src/elements/store/sql-session.ts +241 -84
  532. package/src/elements/store/table.ts +69 -23
  533. package/src/elements/store.test.ts +17 -39
  534. package/src/elements/store.ts +53 -31
  535. package/src/elements/vault/chain.ts +34 -0
  536. package/src/elements/vault/declare.ts +22 -32
  537. package/src/elements/vault/fingerprint.ts +2 -7
  538. package/src/elements/vault/redact.ts +2 -6
  539. package/src/elements/vault/runtime.ts +19 -33
  540. package/src/elements/vault.test.ts +12 -55
  541. package/src/elements/vault.ts +9 -13
  542. package/src/index.ts +5 -2
  543. package/src/kernel/adopt-routes.ts +15 -29
  544. package/src/kernel/app.ts +92 -118
  545. package/src/kernel/auth-resolve.ts +2 -9
  546. package/src/kernel/boot-bind/ai.ts +1 -4
  547. package/src/kernel/boot-bind/channel.test.ts +60 -0
  548. package/src/kernel/boot-bind/channel.ts +61 -5
  549. package/src/kernel/boot-bind/clock.ts +2 -6
  550. package/src/kernel/boot-bind/gate.ts +2 -8
  551. package/src/kernel/boot-bind/runs.ts +1 -3
  552. package/src/kernel/boot-bind/signal.ts +3 -10
  553. package/src/kernel/boot-bind/store.test.ts +27 -18
  554. package/src/kernel/boot-bind/store.ts +93 -52
  555. package/src/kernel/boot-bind/vault.ts +2 -8
  556. package/src/kernel/boot.test.ts +4 -10
  557. package/src/kernel/boot.ts +30 -77
  558. package/src/kernel/budget.test.ts +1 -3
  559. package/src/kernel/capability.ts +3 -10
  560. package/src/kernel/dry-run.test.ts +1 -4
  561. package/src/kernel/dry-run.ts +3 -11
  562. package/src/kernel/edge.test.ts +68 -0
  563. package/src/kernel/effects.test.ts +1 -5
  564. package/src/kernel/effects.ts +4 -11
  565. package/src/kernel/errors.registry.test.ts +2 -8
  566. package/src/kernel/errors.ts +23 -32
  567. package/src/kernel/flow.test.ts +12 -25
  568. package/src/kernel/flow.ts +13 -25
  569. package/src/kernel/fx.test.ts +31 -40
  570. package/src/kernel/fx.ts +135 -90
  571. package/src/kernel/hook-timing.test.ts +3 -6
  572. package/src/kernel/hook-timing.ts +5 -14
  573. package/src/kernel/hooks.test.ts +43 -10
  574. package/src/kernel/hooks.ts +25 -12
  575. package/src/kernel/index.ts +11 -17
  576. package/src/kernel/journal.ts +7 -31
  577. package/src/kernel/on.ts +45 -9
  578. package/src/kernel/pipeline.test.ts +10 -19
  579. package/src/kernel/pipeline.ts +5 -17
  580. package/src/kernel/plug.ts +4 -11
  581. package/src/kernel/plugin/conflicts.test.ts +13 -25
  582. package/src/kernel/plugin/decorate.test.ts +8 -13
  583. package/src/kernel/plugin/scoping.test.ts +4 -11
  584. package/src/kernel/plugin.ts +81 -27
  585. package/src/kernel/registry-isolation.test.ts +74 -0
  586. package/src/kernel/registry.ts +102 -30
  587. package/src/kernel/router.test.ts +15 -13
  588. package/src/kernel/router.ts +9 -29
  589. package/src/kernel/routing-budget.test.ts +1 -3
  590. package/src/kernel/run-telemetry.ts +1 -3
  591. package/src/kernel/triggers.ts +63 -21
  592. package/src/manifest/diff.test.ts +26 -91
  593. package/src/manifest/diff.ts +95 -225
  594. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  595. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  596. package/src/manifest/index.ts +3 -10
  597. package/src/manifest/types.ts +30 -6
  598. package/src/manifest/undeclared.test.ts +4 -12
  599. package/src/manifest/undeclared.ts +1 -2
  600. package/src/manifest/validate.test.ts +2 -6
  601. package/src/manifest/validate.ts +5 -15
  602. package/src/mcp/authorization.ts +8 -27
  603. package/src/mcp/confirmation.ts +3 -10
  604. package/src/mcp/data.ts +2 -6
  605. package/src/mcp/docs-index.ts +4 -7
  606. package/src/mcp/docs-mcp.test.ts +3 -12
  607. package/src/mcp/docs-server.ts +7 -27
  608. package/src/mcp/docs-tools.ts +2 -6
  609. package/src/mcp/index.ts +1 -6
  610. package/src/mcp/injection.gate.test.ts +4 -18
  611. package/src/mcp/mcp.test.ts +18 -49
  612. package/src/mcp/protocol.ts +3 -10
  613. package/src/mcp/server.ts +11 -52
  614. package/src/mcp/session.ts +4 -14
  615. package/src/mcp/tools.ts +14 -50
  616. package/src/plugins/catalogue.test.ts +3 -7
  617. package/src/plugins/catalogue.ts +1 -3
  618. package/src/plugins/compression.test.ts +127 -0
  619. package/src/plugins/compression.ts +94 -0
  620. package/src/plugins/config-source.test.ts +204 -0
  621. package/src/plugins/config-source.ts +209 -0
  622. package/src/plugins/cors.test.ts +138 -0
  623. package/src/plugins/cors.ts +129 -0
  624. package/src/plugins/csrf.test.ts +102 -0
  625. package/src/plugins/csrf.ts +86 -0
  626. package/src/plugins/headers.ts +54 -0
  627. package/src/plugins/index.ts +26 -0
  628. package/src/plugins/ip-allowlist.test.ts +105 -0
  629. package/src/plugins/ip-allowlist.ts +76 -0
  630. package/src/plugins/maintenance-mode.test.ts +91 -0
  631. package/src/plugins/maintenance-mode.ts +85 -0
  632. package/src/plugins/node-import-scan.ts +2 -5
  633. package/src/plugins/security-headers.test.ts +243 -0
  634. package/src/plugins/security-headers.ts +255 -0
  635. package/src/plugins/supply-chain.ts +5 -17
  636. package/src/release/exports.ts +3 -8
  637. package/src/release/measure.exports.test.ts +1 -3
  638. package/src/release/measure.ts +16 -45
  639. package/src/runs/bench.test.ts +1 -3
  640. package/src/runs/collect.ts +8 -25
  641. package/src/runs/drivers/clickhouse.ts +2 -9
  642. package/src/runs/drivers/files.ts +9 -31
  643. package/src/runs/drivers/memory.ts +5 -22
  644. package/src/runs/drivers/postgres.ts +8 -20
  645. package/src/runs/duckdb.ts +2 -8
  646. package/src/runs/index.ts +3 -14
  647. package/src/runs/outlier.ts +3 -10
  648. package/src/runs/parquet.ts +8 -26
  649. package/src/runs/privacy.ts +2 -8
  650. package/src/runs/runs.test.ts +3 -9
  651. package/src/runs/runtime.ts +7 -32
  652. package/src/runs/shred.ts +10 -29
  653. package/src/runs/types.ts +1 -4
  654. package/src/runtime/bun.ts +4 -15
  655. package/src/runtime/cold-start.bench.ts +1 -3
  656. package/src/runtime/dev-request-log.test.ts +1 -4
  657. package/src/runtime/dev-request-log.ts +1 -4
  658. package/src/runtime/index.ts +1 -6
  659. package/src/runtime/primitives.ts +5 -4
  660. package/src/runtime/security.ts +3 -13
  661. package/src/runtime/serve.test.ts +4 -7
  662. package/src/runtime/types.ts +1 -4
  663. package/src/runtime/web-standard.ts +3 -15
  664. package/src/term.test.ts +4 -6
  665. package/src/term.ts +49 -98
  666. package/src/test/create-test-app.test.ts +4 -14
  667. package/src/test/create-test-app.ts +27 -33
  668. package/src/test/provisions.integration.test.ts +3 -11
  669. package/src/upgrade/codemods.test.ts +25 -6
  670. package/src/upgrade/codemods.ts +116 -3
  671. package/src/validation/standard-schema.test.ts +2 -5
  672. package/src/validation/standard-schema.ts +13 -33
  673. package/docs/spec/console.md +0 -739
  674. package/docs/spec/example.md +0 -1196
  675. package/docs/spec/four-applications.md +0 -1195
  676. package/docs/spec/unified-theory.md +0 -489
  677. package/src/cli/doc-drift.test.ts +0 -146
  678. package/src/cli/doc-drift.ts +0 -430
  679. package/src/cli/doctor-diff-examples.ts +0 -92
  680. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
  681. package/src/drivers/vault-sops.ts +0 -271
@@ -7,11 +7,7 @@ import { ai, createAiRuntime, runPromptEvals } from "../../elements/ai.ts";
7
7
  import { createMockAiDriver } from "../../drivers/ai-mock.ts";
8
8
  import { createGateRuntime, gate } from "../../elements/gate.ts";
9
9
  import type { Manifest } from "../../manifest/types.ts";
10
- import {
11
- effectsForFlowFromManifest,
12
- projectAiPanel,
13
- projectAllowPii,
14
- } from "./ai.ts";
10
+ import { effectsForFlowFromManifest, projectAiPanel, projectAllowPii } from "./ai.ts";
15
11
 
16
12
  const manifest = {
17
13
  oke: "1.0",
@@ -54,9 +50,7 @@ const manifest = {
54
50
  describe("projectAiPanel", () => {
55
51
  test("surfaces allowPii standing table from Manifest", () => {
56
52
  const rows = projectAllowPii(manifest);
57
- expect(rows.some((r) => r.flowId === "support.createTicket" && r.allowPii)).toBe(
58
- true,
59
- );
53
+ expect(rows.some((r) => r.flowId === "support.createTicket" && r.allowPii)).toBe(true);
60
54
  });
61
55
 
62
56
  test("effectsForFlowFromManifest matches trail vocabulary", () => {
@@ -147,9 +141,7 @@ describe("projectAiPanel", () => {
147
141
  aiRuntime: runtime,
148
142
  evalResults: [evals],
149
143
  });
150
- expect(okProj.prompts[0]!.manifestDiffPath).toBe(
151
- "/ai/prompts/ticket-triage/version",
152
- );
144
+ expect(okProj.prompts[0]!.manifestDiffPath).toBe("/ai/prompts/ticket-triage/version");
153
145
  expect(okProj.versions[0]!.evalScore.samples.length).toBeGreaterThan(0);
154
146
  expect(okProj.agentRuns[0]!.trail[0]!.status).toBe("denied");
155
147
  expect(okProj.agentRuns[0]!.trail[0]!.denial?.gate).toBe("member");
@@ -168,19 +168,17 @@ export function createManifestAiRuntime(
168
168
  }),
169
169
  );
170
170
  const modelByName = new Map(models.map((m) => [m.name, m]));
171
- const prompts = Object.entries(manifest?.ai?.prompts ?? {}).map(
172
- ([name, p]) => {
173
- const modelName = p.model ?? models[0]?.name ?? "mock";
174
- const handle = modelByName.get(modelName) ?? ai.model(modelName);
175
- return handle.prompt(name, {
176
- ...(p.version !== undefined ? { version: p.version } : {}),
177
- ...(p.evals !== undefined ? { evals: p.evals } : {}),
178
- ...(p.budget !== undefined ? { budget: p.budget } : {}),
179
- ...(p.in !== undefined ? { in: p.in } : {}),
180
- ...(p.out !== undefined ? { out: p.out } : {}),
181
- });
182
- },
183
- );
171
+ const prompts = Object.entries(manifest?.ai?.prompts ?? {}).map(([name, p]) => {
172
+ const modelName = p.model ?? models[0]?.name ?? "mock";
173
+ const handle = modelByName.get(modelName) ?? ai.model(modelName);
174
+ return handle.prompt(name, {
175
+ ...(p.version !== undefined ? { version: p.version } : {}),
176
+ ...(p.evals !== undefined ? { evals: p.evals } : {}),
177
+ ...(p.budget !== undefined ? { budget: p.budget } : {}),
178
+ ...(p.in !== undefined ? { in: p.in } : {}),
179
+ ...(p.out !== undefined ? { out: p.out } : {}),
180
+ });
181
+ });
184
182
  const agents = Object.entries(manifest?.ai?.agents ?? {}).map(([name, a]) =>
185
183
  ai.agent(name, {
186
184
  tools: a.tools ?? [],
@@ -200,8 +198,7 @@ export function createManifestAiRuntime(
200
198
  prompts,
201
199
  agents,
202
200
  defaultDriver: mockAiDriver,
203
- effectsForFlow: (flowName) =>
204
- effectsForFlowFromManifest(manifest, flowName),
201
+ effectsForFlow: (flowName) => effectsForFlowFromManifest(manifest, flowName),
205
202
  now: options.now,
206
203
  });
207
204
  }
@@ -355,8 +352,7 @@ export function projectAllowPii(manifest: Manifest | null): readonly AllowPiiRow
355
352
  if (!manifest?.flows) return [];
356
353
  const rows: AllowPiiRow[] = [];
357
354
  for (const [flowId, flow] of Object.entries(manifest.flows)) {
358
- const allow =
359
- flow.allowPii === true || flow.pii === "allow";
355
+ const allow = flow.allowPii === true || flow.pii === "allow";
360
356
  const asks = flow.effects?.asks ?? [];
361
357
  if (!allow && asks.length === 0) continue;
362
358
  if (!allow && flow.pii === undefined) continue;
@@ -377,9 +373,7 @@ export function projectAllowPii(manifest: Manifest | null): readonly AllowPiiRow
377
373
  });
378
374
  }
379
375
 
380
- function projectFallbackChains(
381
- journal: readonly AiJournalEntry[],
382
- ): readonly FallbackChainRow[] {
376
+ function projectFallbackChains(journal: readonly AiJournalEntry[]): readonly FallbackChainRow[] {
383
377
  const rows: FallbackChainRow[] = [];
384
378
  for (const entry of journal) {
385
379
  if (entry.attempts.length < 2) continue;
@@ -411,9 +405,7 @@ function projectFallbackChains(
411
405
  return rows.sort((a, b) => b.at - a.at);
412
406
  }
413
407
 
414
- function projectAgentRuns(
415
- runs: readonly AgentRunRecord[],
416
- ): readonly AgentRunRow[] {
408
+ function projectAgentRuns(runs: readonly AgentRunRecord[]): readonly AgentRunRow[] {
417
409
  return [...runs]
418
410
  .sort((a, b) => b.at - a.at)
419
411
  .map((r) => ({
@@ -439,10 +431,7 @@ function buildVersionMetrics(input: {
439
431
  readonly journal: readonly AiJournalEntry[];
440
432
  readonly runs: readonly WideEvent[];
441
433
  readonly evalResults: readonly EvalSuiteResult[];
442
- readonly promptMeta: Map<
443
- string,
444
- { version?: number; budget?: number | null; model?: string }
445
- >;
434
+ readonly promptMeta: Map<string, { version?: number; budget?: number | null; model?: string }>;
446
435
  readonly bucketCount: number;
447
436
  }): readonly PromptVersionMetrics[] {
448
437
  type Acc = {
@@ -480,10 +469,7 @@ function buildVersionMetrics(input: {
480
469
  };
481
470
 
482
471
  for (const entry of input.journal) {
483
- const version =
484
- entry.version ??
485
- input.promptMeta.get(entry.prompt)?.version ??
486
- 0;
472
+ const version = entry.version ?? input.promptMeta.get(entry.prompt)?.version ?? 0;
487
473
  const acc = ensure(entry.prompt, version);
488
474
  acc.costs.push(entry.cost);
489
475
  acc.latencies.push(entry.latencyMs);
@@ -528,9 +514,7 @@ function buildVersionMetrics(input: {
528
514
  const out: PromptVersionMetrics[] = [];
529
515
  for (const acc of map.values()) {
530
516
  const totalOutcomes =
531
- acc.outcomes.ok +
532
- acc.outcomes.provider_error +
533
- acc.outcomes.schema_invalid;
517
+ acc.outcomes.ok + acc.outcomes.provider_error + acc.outcomes.schema_invalid;
534
518
  out.push({
535
519
  prompt: acc.prompt,
536
520
  version: acc.version,
@@ -538,13 +522,10 @@ function buildVersionMetrics(input: {
538
522
  cost: metricBlock(acc.costs, input.bucketCount),
539
523
  latencyMs: metricBlock(acc.latencies, input.bucketCount),
540
524
  evalScore: metricBlock(acc.evals, input.bucketCount),
541
- schemaInvalidRate:
542
- totalOutcomes === 0 ? 0 : acc.outcomes.schema_invalid / totalOutcomes,
543
- providerErrorRate:
544
- totalOutcomes === 0 ? 0 : acc.outcomes.provider_error / totalOutcomes,
525
+ schemaInvalidRate: totalOutcomes === 0 ? 0 : acc.outcomes.schema_invalid / totalOutcomes,
526
+ providerErrorRate: totalOutcomes === 0 ? 0 : acc.outcomes.provider_error / totalOutcomes,
545
527
  okRate: totalOutcomes === 0 ? 0 : acc.outcomes.ok / totalOutcomes,
546
- overBudgetRate:
547
- acc.costs.length === 0 ? 0 : acc.overBudget / acc.costs.length,
528
+ overBudgetRate: acc.costs.length === 0 ? 0 : acc.overBudget / acc.costs.length,
548
529
  budgetMaxCostPerCall: acc.budget,
549
530
  outcomeCounts: acc.outcomes,
550
531
  });
@@ -590,10 +571,7 @@ export function mean(values: readonly number[]): number {
590
571
  export function percentile(sorted: readonly number[], p: number): number {
591
572
  if (sorted.length === 0) return 0;
592
573
  if (sorted.length === 1) return sorted[0]!;
593
- const idx = Math.min(
594
- sorted.length - 1,
595
- Math.max(0, Math.ceil(p * sorted.length) - 1),
596
- );
574
+ const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil(p * sorted.length) - 1));
597
575
  return sorted[idx]!;
598
576
  }
599
577
 
@@ -617,8 +595,7 @@ export function histogram(
617
595
  const buckets: AiDistributionBucket[] = [];
618
596
  for (let i = 0; i < bucketCount; i++) {
619
597
  const lo = min + i * width;
620
- const hi =
621
- i === bucketCount - 1 ? max + Number.EPSILON : min + (i + 1) * width;
598
+ const hi = i === bucketCount - 1 ? max + Number.EPSILON : min + (i + 1) * width;
622
599
  buckets.push({ min: lo, max: hi, count: 0 });
623
600
  }
624
601
  for (const v of sorted) {
@@ -45,9 +45,7 @@ export interface ConsoleAppHandle {
45
45
  *
46
46
  * @param options - Secret, cwd, Manifest seed
47
47
  */
48
- export function createConsoleApp(
49
- options: CreateConsoleAppOptions = {},
50
- ): ConsoleAppHandle {
48
+ export function createConsoleApp(options: CreateConsoleAppOptions = {}): ConsoleAppHandle {
51
49
  const state = createConsoleState(options);
52
50
  // Spec §2.5 — claim prints only while setup is open (no operators yet).
53
51
  if (!options.silentClaim && !state.setupClosed) {
@@ -58,6 +56,8 @@ export function createConsoleApp(
58
56
 
59
57
  const app = oke({
60
58
  name: options.name ?? "console",
59
+ // Isolated source — leftover host `on()` registrations never enter Console.
60
+ registry: "ignore",
61
61
  bindings,
62
62
  autoBoot: false,
63
63
  fx: { now: state.now },
@@ -132,9 +132,7 @@ export function createConsoleApp(
132
132
  *
133
133
  * @param handle - Console app handle
134
134
  */
135
- export async function bootConsoleApp(
136
- handle: ConsoleAppHandle,
137
- ): Promise<OkeApp> {
135
+ export async function bootConsoleApp(handle: ConsoleAppHandle): Promise<OkeApp> {
138
136
  await handle.app.boot({ env: "test" });
139
137
  handle.state.listRuns = async () => {
140
138
  const runs = handle.app.bootResult?.runs;
@@ -154,14 +152,7 @@ export async function bootConsoleApp(
154
152
  */
155
153
  export async function ensureConsolePanelRuntimes(
156
154
  state: ConsoleState,
157
- panel:
158
- | "signals"
159
- | "store"
160
- | "vault"
161
- | "gates"
162
- | "clock"
163
- | "ai"
164
- | "channels",
155
+ panel: "signals" | "store" | "vault" | "gates" | "clock" | "ai" | "channels",
165
156
  ): Promise<void> {
166
157
  switch (panel) {
167
158
  case "signals":
@@ -196,10 +187,7 @@ export async function ensureConsolePanelRuntimes(
196
187
  */
197
188
  export function bindManifestChannelRuntime(state: ConsoleState): void {
198
189
  if (state.channelRuntime) return;
199
- if (
200
- !state.manifest?.channels ||
201
- Object.keys(state.manifest.channels).length === 0
202
- ) {
190
+ if (!state.manifest?.channels || Object.keys(state.manifest.channels).length === 0) {
203
191
  return;
204
192
  }
205
193
  const bound = createManifestChannelRuntime(state.manifest, {
@@ -216,16 +204,11 @@ export function bindManifestChannelRuntime(state: ConsoleState): void {
216
204
  *
217
205
  * @param state - Console state
218
206
  */
219
- export async function bindManifestClockRuntime(
220
- state: ConsoleState,
221
- ): Promise<void> {
207
+ export async function bindManifestClockRuntime(state: ConsoleState): Promise<void> {
222
208
  if (state.clockRuntime) return;
223
209
  const hasClocks =
224
- (state.manifest?.clocks &&
225
- Object.keys(state.manifest.clocks).length > 0) ||
226
- Object.values(state.manifest?.flows ?? {}).some(
227
- (f) => f.trigger?.cron || f.trigger?.every,
228
- );
210
+ (state.manifest?.clocks && Object.keys(state.manifest.clocks).length > 0) ||
211
+ Object.values(state.manifest?.flows ?? {}).some((f) => f.trigger?.cron || f.trigger?.every);
229
212
  if (!hasClocks) return;
230
213
  state.clockRuntime = createManifestClockRuntime(state.manifest, {
231
214
  now: state.now,
@@ -246,22 +229,17 @@ export function bindManifestAiRuntime(state: ConsoleState): void {
246
229
  Object.keys(state.manifest.ai.agents ?? {}).length > 0 ||
247
230
  Object.keys(state.manifest.ai.models ?? {}).length > 0);
248
231
  if (!hasAi) return;
249
- bindAiRuntime(
250
- state,
251
- createManifestAiRuntime(state.manifest, { now: state.now }),
252
- );
232
+ bindAiRuntime(state, createManifestAiRuntime(state.manifest, { now: state.now }));
253
233
  }
254
234
 
255
235
  /**
256
236
  * Open a VaultRuntime from the Manifest when no host runtime is attached.
257
- * Uses the standard resolution chain (process.env → .env.local → .env.stack
237
+ * Uses the standard resolution chain (process.env → .env.local → .env.docker
258
238
  * → driver) — Console never parses dotenv itself.
259
239
  *
260
240
  * @param state - Console state
261
241
  */
262
- export async function bindManifestVaultRuntime(
263
- state: ConsoleState,
264
- ): Promise<void> {
242
+ export async function bindManifestVaultRuntime(state: ConsoleState): Promise<void> {
265
243
  if (state.vaultRuntime) return;
266
244
  if (!state.manifest?.vault || Object.keys(state.manifest.vault).length === 0) {
267
245
  return;
@@ -269,7 +247,7 @@ export async function bindManifestVaultRuntime(
269
247
  try {
270
248
  state.vaultRuntime = await createManifestVaultRuntime(state.manifest, {
271
249
  cwd: state.cwd,
272
- env: state.production ? "prod" : "dev",
250
+ env: state.production ? "prod" : "local",
273
251
  allowDevFallbacks: !state.production,
274
252
  now: state.now,
275
253
  });
@@ -285,17 +263,12 @@ export async function bindManifestVaultRuntime(
285
263
  *
286
264
  * @param state - Console state
287
265
  */
288
- export async function bindManifestStoreRuntime(
289
- state: ConsoleState,
290
- ): Promise<void> {
266
+ export async function bindManifestStoreRuntime(state: ConsoleState): Promise<void> {
291
267
  if (state.storeRuntime) return;
292
268
  if (!state.manifest?.stores || Object.keys(state.manifest.stores).length === 0) {
293
269
  return;
294
270
  }
295
- state.storeRuntime = await createManifestStoreRuntime(
296
- state.manifest,
297
- state.now,
298
- );
271
+ state.storeRuntime = await createManifestStoreRuntime(state.manifest, state.now);
299
272
  }
300
273
 
301
274
  /**
@@ -304,9 +277,7 @@ export async function bindManifestStoreRuntime(
304
277
  *
305
278
  * @param state - Console state
306
279
  */
307
- export async function bindManifestSignalBus(
308
- state: ConsoleState,
309
- ): Promise<void> {
280
+ export async function bindManifestSignalBus(state: ConsoleState): Promise<void> {
310
281
  if (state.signalBus) return;
311
282
  const declared = Object.entries(state.manifest?.signals ?? {});
312
283
  if (declared.length === 0) return;
@@ -29,9 +29,7 @@ describe("auth-rate strategy", () => {
29
29
  for (let i = 0; i < AUTH_RATE_LIMIT; i++) {
30
30
  expect(touchLoginRateLimit(bag, "Ops@Example.com", t++)).toBe("ok");
31
31
  }
32
- expect(touchLoginRateLimit(bag, "ops@example.com", t)).toBe(
33
- "rate_limited",
34
- );
32
+ expect(touchLoginRateLimit(bag, "ops@example.com", t)).toBe("rate_limited");
35
33
  expect(touchLoginRateLimit(bag, "other@example.com", t)).toBe("ok");
36
34
  });
37
35
 
@@ -59,20 +57,14 @@ describe("auth-rate strategy", () => {
59
57
  });
60
58
 
61
59
  const tMissing = performance.now();
62
- expect(
63
- await authenticateOperator(store, "missing@example.com", "password123"),
64
- ).toBeNull();
60
+ expect(await authenticateOperator(store, "missing@example.com", "password123")).toBeNull();
65
61
  const missingMs = performance.now() - tMissing;
66
62
 
67
63
  const tBad = performance.now();
68
- expect(
69
- await authenticateOperator(store, "ops@example.com", "wrong-password"),
70
- ).toBeNull();
64
+ expect(await authenticateOperator(store, "ops@example.com", "wrong-password")).toBeNull();
71
65
  const badMs = performance.now() - tBad;
72
66
 
73
- expect(
74
- await authenticateOperator(store, "ops@example.com", "password123"),
75
- ).not.toBeNull();
67
+ expect(await authenticateOperator(store, "ops@example.com", "password123")).not.toBeNull();
76
68
 
77
69
  // Both paths pay an argon2 verify — neither should be near-instant.
78
70
  expect(missingMs).toBeGreaterThan(5);
@@ -4,11 +4,7 @@
4
4
 
5
5
  import type { AnyFlowDef } from "../../kernel/flow.ts";
6
6
  import type { Binding } from "../../kernel/on.ts";
7
- import {
8
- normalizeTrigger,
9
- type HttpTrigger,
10
- type Trigger,
11
- } from "../../kernel/triggers.ts";
7
+ import { normalizeTrigger, type HttpTrigger, type Trigger } from "../../kernel/triggers.ts";
12
8
 
13
9
  /**
14
10
  * Bind an HTTP trigger to a flow without registering on the global `on` list.
@@ -73,9 +73,7 @@ describe("projectChannelsList", () => {
73
73
  expect(list.inbox[0]!.toMasked).toContain("***");
74
74
  expect(list.outcomes[0]!.state).toBe("delivered-then-complained");
75
75
  expect(list.outcomes[0]!.verdict).toBe("review");
76
- expect(list.suppression.some((s) => s.reason === "prior-bounce")).toBe(
77
- true,
78
- );
76
+ expect(list.suppression.some((s) => s.reason === "prior-bounce")).toBe(true);
79
77
  });
80
78
 
81
79
  test("fallback summary is a weekly bill line", () => {
@@ -169,9 +167,7 @@ describe("console.channel.sendTest", () => {
169
167
  expect(okBody.error).toBeNull();
170
168
  expect(okBody.data.ok).toBe(true);
171
169
  expect(okBody.data.messageId.length).toBeGreaterThan(0);
172
- expect(handle.state.channelInbox?.entries.length ?? 0).toBeGreaterThan(
173
- before,
174
- );
170
+ expect(handle.state.channelInbox?.entries.length ?? 0).toBeGreaterThan(before);
175
171
  } finally {
176
172
  await handle.app.stop();
177
173
  }
@@ -135,9 +135,7 @@ export interface ProjectChannelsOptions {
135
135
  *
136
136
  * @param options - Manifest, runtime, inbox, env
137
137
  */
138
- export function projectChannelsList(
139
- options: ProjectChannelsOptions,
140
- ): ConsoleChannelsList {
138
+ export function projectChannelsList(options: ProjectChannelsOptions): ConsoleChannelsList {
141
139
  const face: ChannelsFace = options.production ? "deliverability" : "inbox";
142
140
  const templates = projectTemplates(options.manifest);
143
141
  const receipts = options.runtime?.receipts.all() ?? [];
@@ -184,10 +182,7 @@ export function projectChannelsList(
184
182
  fallback,
185
183
  inbox: projectInbox(options.inbox?.entries ?? [], reveal),
186
184
  receipts: projectReceipts(receipts, reveal),
187
- suppression: projectSuppression(
188
- options.runtime?.suppression.list() ?? [],
189
- reveal,
190
- ),
185
+ suppression: projectSuppression(options.runtime?.suppression.list() ?? [], reveal),
191
186
  };
192
187
  }
193
188
 
@@ -215,9 +210,7 @@ export function formatFallbackSummary(delta: {
215
210
  *
216
211
  * @param manifest - Manifest snapshot
217
212
  */
218
- export function projectTemplates(
219
- manifest: Manifest | null,
220
- ): readonly ConsoleChannelTemplate[] {
213
+ export function projectTemplates(manifest: Manifest | null): readonly ConsoleChannelTemplate[] {
221
214
  return Object.entries(manifest?.channels ?? {})
222
215
  .map(([name, c]) => ({
223
216
  name,
@@ -254,18 +247,12 @@ export function previewChannelTemplate(options: {
254
247
  });
255
248
  const catalog = options.catalog ?? {};
256
249
  const byLocale = catalog[options.template];
257
- const entry =
258
- byLocale?.[resolved.locale] ??
259
- byLocale?.[defaultLocale] ??
260
- byLocale?.en;
261
- const data = options.data ?? sampleDataFromSchema(
262
- options.manifest?.channels?.[options.template]?.schema,
263
- );
250
+ const entry = byLocale?.[resolved.locale] ?? byLocale?.[defaultLocale] ?? byLocale?.en;
251
+ const data =
252
+ options.data ?? sampleDataFromSchema(options.manifest?.channels?.[options.template]?.schema);
264
253
  const interpolate = (s: string | undefined): string | null => {
265
254
  if (s === undefined) return null;
266
- return s.replace(/\{\{(\w+)\}\}/g, (_, key: string) =>
267
- String(data[key] ?? `{{${key}}}`),
268
- );
255
+ return s.replace(/\{\{(\w+)\}\}/g, (_, key: string) => String(data[key] ?? `{{${key}}}`));
269
256
  };
270
257
  return {
271
258
  template: options.template,
@@ -348,9 +335,7 @@ export async function sendChannelTest(
348
335
  locale: input.locale,
349
336
  data: input.data,
350
337
  });
351
- const receipt =
352
- runtime.receipts.byMessageId(result.messageId) ??
353
- runtime.receipts.all().at(-1);
338
+ const receipt = runtime.receipts.byMessageId(result.messageId) ?? runtime.receipts.all().at(-1);
354
339
  return {
355
340
  ok: result.ok,
356
341
  messageId: result.messageId,
@@ -451,19 +436,9 @@ function sampleDataFromSchema(schema: unknown): Record<string, unknown> {
451
436
  const data: Record<string, unknown> = {};
452
437
  for (const [key, def] of Object.entries(props)) {
453
438
  const t = (def as { type?: string }).type;
454
- data[key] =
455
- t === "number" || t === "integer"
456
- ? 1
457
- : t === "boolean"
458
- ? true
459
- : `{{${key}}}`;
439
+ data[key] = t === "number" || t === "integer" ? 1 : t === "boolean" ? true : `{{${key}}}`;
460
440
  }
461
441
  return data;
462
442
  }
463
443
 
464
- export type {
465
- DeliveryOutcomeState,
466
- DeliveryVerdict,
467
- EmailAuthResult,
468
- OutcomeRow,
469
- };
444
+ export type { DeliveryOutcomeState, DeliveryVerdict, EmailAuthResult, OutcomeRow };
@@ -6,11 +6,7 @@
6
6
  */
7
7
 
8
8
  import { formatClaimNote } from "../../term.ts";
9
- import {
10
- AUTH_RATE_LIMIT,
11
- AUTH_RATE_WINDOW_MS,
12
- touchRateLimit,
13
- } from "./auth-rate.ts";
9
+ import { AUTH_RATE_LIMIT, AUTH_RATE_WINDOW_MS, touchRateLimit } from "./auth-rate.ts";
14
10
 
15
11
  /** Claim-code lifetime (30 minutes). */
16
12
  export const CLAIM_TTL_MS = 30 * 60 * 1000;
@@ -43,9 +39,7 @@ export interface ClaimCodeState {
43
39
  export function mintClaimCode(now: () => number = Date.now): ClaimCodeState {
44
40
  const bytes = new Uint8Array(16);
45
41
  crypto.getRandomValues(bytes);
46
- const code = [...bytes]
47
- .map((b) => b.toString(16).padStart(2, "0"))
48
- .join("");
42
+ const code = [...bytes].map((b) => b.toString(16).padStart(2, "0")).join("");
49
43
  const mintedAt = now();
50
44
  return {
51
45
  code,
@@ -116,13 +116,9 @@ describe("projectClocksList", () => {
116
116
 
117
117
  expect(list.waitingOn.length).toBe(2);
118
118
  expect(list.waitingOn[0]?.label).toBe("verify-window");
119
- expect(list.waitingOnCounts.some((c) => c.label === "trial-period")).toBe(
120
- true,
121
- );
119
+ expect(list.waitingOnCounts.some((c) => c.label === "trial-period")).toBe(true);
122
120
  expect(list.timeline.some((e) => e.kind === "wake")).toBe(true);
123
- expect(list.timeline.every((e) => e.at >= now && e.at < now + 86_400_000)).toBe(
124
- true,
125
- );
121
+ expect(list.timeline.every((e) => e.at >= now && e.at < now + 86_400_000)).toBe(true);
126
122
  });
127
123
 
128
124
  test("DST ambiguity surfaces only when attached on the row", async () => {
@@ -93,9 +93,7 @@ const DAY_MS = 24 * 60 * 60 * 1000;
93
93
  *
94
94
  * @param options - Manifest, runtime, journal
95
95
  */
96
- export async function projectClocksList(
97
- options: ProjectClocksOptions,
98
- ): Promise<ConsoleClockList> {
96
+ export async function projectClocksList(options: ProjectClocksOptions): Promise<ConsoleClockList> {
99
97
  const now = (options.now ?? (() => Date.now()))();
100
98
  const until = now + DAY_MS;
101
99
 
@@ -131,10 +129,7 @@ export async function projectClocksList(
131
129
  })
132
130
  .sort((a, b) => a.name.localeCompare(b.name));
133
131
 
134
- const waitingOn = projectWaitingOn(
135
- options.journal ? await options.journal.list() : [],
136
- now,
137
- );
132
+ const waitingOn = projectWaitingOn(options.journal ? await options.journal.list() : [], now);
138
133
  const waitingOnCounts = aggregateWaitingOn(waitingOn);
139
134
 
140
135
  const timeline: ConsoleTimelineEvent[] = [];
@@ -231,10 +226,7 @@ export async function runCronNow(
231
226
  * @param runtime - Clock runtime
232
227
  * @param name - Cron name
233
228
  */
234
- export async function pauseCronNow(
235
- runtime: ClockRuntime,
236
- name: string,
237
- ): Promise<CronRow> {
229
+ export async function pauseCronNow(runtime: ClockRuntime, name: string): Promise<CronRow> {
238
230
  return pauseCron(runtime.store, name);
239
231
  }
240
232
 
@@ -274,10 +266,7 @@ export async function wakeEarlyNow(
274
266
  });
275
267
  }
276
268
 
277
- export {
278
- ClockResourceNotFoundError,
279
- ScheduleNotOverridableError,
280
- };
269
+ export { ClockResourceNotFoundError, ScheduleNotOverridableError };
281
270
 
282
271
  /**
283
272
  * Bind a ClockRuntime from Manifest clocks (memory store).
@@ -356,10 +345,7 @@ function rowsFromManifest(manifest: Manifest | null): CronRow[] {
356
345
  * @param row - Cron row
357
346
  * @param manifest - Manifest
358
347
  */
359
- export function flowIdsForCronRow(
360
- row: CronRow,
361
- manifest: Manifest | null,
362
- ): readonly string[] {
348
+ export function flowIdsForCronRow(row: CronRow, manifest: Manifest | null): readonly string[] {
363
349
  if (!manifest?.flows) return [];
364
350
  const out = new Set<string>();
365
351
  for (const [flowId, flow] of Object.entries(manifest.flows)) {
@@ -370,10 +356,8 @@ export function flowIdsForCronRow(
370
356
  flowId === row.name ||
371
357
  flowId.endsWith(`.${row.name}`) ||
372
358
  cronNameForFlow(flowId, every, cron) === row.name ||
373
- (cron &&
374
- (cron === row.effectiveCron || cron === row.declaredCron)) ||
375
- (every &&
376
- (every === row.effectiveEvery || every === row.declaredEvery))
359
+ (cron && (cron === row.effectiveCron || cron === row.declaredCron)) ||
360
+ (every && (every === row.effectiveEvery || every === row.declaredEvery))
377
361
  ) {
378
362
  out.add(flowId);
379
363
  }
@@ -381,9 +365,7 @@ export function flowIdsForCronRow(
381
365
  return [...out].sort();
382
366
  }
383
367
 
384
- function isExternal(
385
- flow: NonNullable<Manifest["flows"]>[string] | undefined,
386
- ): boolean {
368
+ function isExternal(flow: NonNullable<Manifest["flows"]>[string] | undefined): boolean {
387
369
  if (!flow?.effects) return false;
388
370
  const e = flow.effects;
389
371
  return (e.sends?.length ?? 0) > 0 || (e.asks?.length ?? 0) > 0;
@@ -153,9 +153,7 @@ describe("console kernel", () => {
153
153
  expect(names).toContain("console.action.ping");
154
154
  const pingRun = runs.find((r) => r.flow === "console.action.ping");
155
155
  expect(pingRun?.plane).toBe("operator");
156
- expect(pingRun?.logs.some((l) => l.message.includes("console.action.ping"))).toBe(
157
- true,
158
- );
156
+ expect(pingRun?.logs.some((l) => l.message.includes("console.action.ping"))).toBe(true);
159
157
  } finally {
160
158
  await handle.app.stop();
161
159
  }
@@ -17,11 +17,7 @@ import {
17
17
 
18
18
  const NOW = 1_700_000_000_000;
19
19
 
20
- function run(
21
- flow: string,
22
- startedAt: number,
23
- id = `${flow}-${startedAt}`,
24
- ): WideEvent {
20
+ function run(flow: string, startedAt: number, id = `${flow}-${startedAt}`): WideEvent {
25
21
  return {
26
22
  id,
27
23
  flow,
@@ -170,19 +166,11 @@ describe("projectManifestDiff", () => {
170
166
  });
171
167
 
172
168
  expect(projection.hasBaseline).toBe(true);
173
- expect(
174
- projection.changes.some((c) => c.category === "effect-widening"),
175
- ).toBe(true);
176
- expect(
177
- projection.changes.some((c) => c.category === "permission-widening"),
178
- ).toBe(true);
179
- expect(
180
- projection.changes.some((c) => c.category === "contract-breaking"),
181
- ).toBe(true);
169
+ expect(projection.changes.some((c) => c.category === "effect-widening")).toBe(true);
170
+ expect(projection.changes.some((c) => c.category === "permission-widening")).toBe(true);
171
+ expect(projection.changes.some((c) => c.category === "contract-breaking")).toBe(true);
182
172
 
183
- const send = projection.changes.find(
184
- (c) => c.path.includes("sends") || c.blastLine !== null,
185
- );
173
+ const send = projection.changes.find((c) => c.path.includes("sends") || c.blastLine !== null);
186
174
  expect(send?.runCountLastWeek).toBe(100);
187
175
  expect(send?.blastLine).toContain("ran 100 times last week");
188
176
  expect(send?.blastLine).toContain("sent nothing");