okengine 0.1.4

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 (674) hide show
  1. package/AGENTS.md +91 -0
  2. package/README.md +327 -0
  3. package/docs/spec/complete-example.md +1188 -0
  4. package/docs/spec/console.md +739 -0
  5. package/docs/spec/four-applications.md +1188 -0
  6. package/docs/spec/unified-theory.md +489 -0
  7. package/package.json +152 -0
  8. package/spec/manifest.v1.schema.json +624 -0
  9. package/src/auth/api-keys.ts +168 -0
  10. package/src/auth/attenuation.ts +116 -0
  11. package/src/auth/auth.test.ts +273 -0
  12. package/src/auth/cross-plane.ts +98 -0
  13. package/src/auth/index.ts +112 -0
  14. package/src/auth/invites.ts +66 -0
  15. package/src/auth/invoke-as.ts +49 -0
  16. package/src/auth/operator.ts +178 -0
  17. package/src/auth/planes.ts +102 -0
  18. package/src/auth/plugin.ts +44 -0
  19. package/src/auth/roles.ts +84 -0
  20. package/src/auth/sessions.ts +418 -0
  21. package/src/auth/tables.ts +131 -0
  22. package/src/cli/args.ts +50 -0
  23. package/src/cli/branch.ts +75 -0
  24. package/src/cli/build.ts +86 -0
  25. package/src/cli/client-add.test.ts +140 -0
  26. package/src/cli/client-add.ts +164 -0
  27. package/src/cli/completion.test.ts +58 -0
  28. package/src/cli/completion.ts +296 -0
  29. package/src/cli/dev-app-runner.ts +77 -0
  30. package/src/cli/dev.test.ts +435 -0
  31. package/src/cli/dev.ts +594 -0
  32. package/src/cli/doc-drift.test.ts +146 -0
  33. package/src/cli/doc-drift.ts +397 -0
  34. package/src/cli/docker-cli.test.ts +221 -0
  35. package/src/cli/docker.ts +127 -0
  36. package/src/cli/doctor-diff-examples.ts +92 -0
  37. package/src/cli/doctor-diff.test.ts +91 -0
  38. package/src/cli/doctor-diff.ts +274 -0
  39. package/src/cli/doctor-pii.test.ts +98 -0
  40. package/src/cli/doctor-pii.ts +151 -0
  41. package/src/cli/doctor.test.ts +150 -0
  42. package/src/cli/doctor.ts +223 -0
  43. package/src/cli/eval.ts +122 -0
  44. package/src/cli/exit.ts +19 -0
  45. package/src/cli/gates-list.test.ts +47 -0
  46. package/src/cli/gates-list.ts +84 -0
  47. package/src/cli/images.ts +277 -0
  48. package/src/cli/index.ts +99 -0
  49. package/src/cli/json-out.test.ts +129 -0
  50. package/src/cli/load-config.ts +71 -0
  51. package/src/cli/mcp-from-console.ts +50 -0
  52. package/src/cli/privacy-erase.ts +73 -0
  53. package/src/cli/registry.ts +455 -0
  54. package/src/cli/safe-defaults.test.ts +92 -0
  55. package/src/cli/schema.ts +196 -0
  56. package/src/cli/stack.ts +82 -0
  57. package/src/cli/start.ts +106 -0
  58. package/src/cli/upgrade.ts +105 -0
  59. package/src/cli/vault-cmd.ts +140 -0
  60. package/src/client/budget-entry.ts +34 -0
  61. package/src/client/budget.test.ts +17 -0
  62. package/src/client/create.test.ts +159 -0
  63. package/src/client/create.ts +152 -0
  64. package/src/client/errors.ts +60 -0
  65. package/src/client/index.ts +35 -0
  66. package/src/client/notes-contract.test.ts +289 -0
  67. package/src/client/transport.test.ts +123 -0
  68. package/src/client/transport.ts +254 -0
  69. package/src/client/types.ts +282 -0
  70. package/src/compiler/aot.test.ts +248 -0
  71. package/src/compiler/aot.ts +182 -0
  72. package/src/compiler/differential.test.ts +241 -0
  73. package/src/compiler/dynamic.ts +54 -0
  74. package/src/compiler/effects-infer.ts +541 -0
  75. package/src/compiler/emit.ts +40 -0
  76. package/src/compiler/extract.test.ts +177 -0
  77. package/src/compiler/extract.ts +1368 -0
  78. package/src/compiler/fixtures/raw/raw-unannotated.ts +28 -0
  79. package/src/compiler/fixtures/skyport/oke.config.ts +24 -0
  80. package/src/compiler/fixtures/skyport/src/ai.ts +15 -0
  81. package/src/compiler/fixtures/skyport/src/app.ts +10 -0
  82. package/src/compiler/fixtures/skyport/src/channels.ts +6 -0
  83. package/src/compiler/fixtures/skyport/src/core.ts +3 -0
  84. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +57 -0
  85. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +11 -0
  86. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +14 -0
  87. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +20 -0
  88. package/src/compiler/fixtures/skyport/src/gates.ts +14 -0
  89. package/src/compiler/fixtures/skyport/src/journeys.ts +9 -0
  90. package/src/compiler/fixtures/skyport/src/schema.ts +3 -0
  91. package/src/compiler/fixtures/skyport/src/vault.ts +6 -0
  92. package/src/compiler/fixtures/skyport.expected.json +241 -0
  93. package/src/compiler/fixtures/triggers/five-triggers.ts +69 -0
  94. package/src/compiler/http-parse.ts +214 -0
  95. package/src/compiler/index.ts +67 -0
  96. package/src/compiler/response.ts +89 -0
  97. package/src/compiler/sucrose.ts +238 -0
  98. package/src/config/index.ts +167 -0
  99. package/src/console/budget.test.ts +73 -0
  100. package/src/console/index.ts +30 -0
  101. package/src/console/server/access.test.ts +370 -0
  102. package/src/console/server/access.ts +777 -0
  103. package/src/console/server/ai.test.ts +172 -0
  104. package/src/console/server/ai.ts +632 -0
  105. package/src/console/server/app.ts +294 -0
  106. package/src/console/server/auth-rate.test.ts +81 -0
  107. package/src/console/server/auth-rate.ts +72 -0
  108. package/src/console/server/bind.ts +25 -0
  109. package/src/console/server/channels.test.ts +179 -0
  110. package/src/console/server/channels.ts +469 -0
  111. package/src/console/server/claim.test.ts +66 -0
  112. package/src/console/server/claim.ts +134 -0
  113. package/src/console/server/clock.test.ts +239 -0
  114. package/src/console/server/clock.ts +390 -0
  115. package/src/console/server/console.test.ts +338 -0
  116. package/src/console/server/diff.test.ts +299 -0
  117. package/src/console/server/diff.ts +352 -0
  118. package/src/console/server/dry-run.audit.test.ts +118 -0
  119. package/src/console/server/flows-invoke.test.ts +148 -0
  120. package/src/console/server/flows.ts +3633 -0
  121. package/src/console/server/gates.test.ts +360 -0
  122. package/src/console/server/gates.ts +869 -0
  123. package/src/console/server/index.ts +141 -0
  124. package/src/console/server/live.test.ts +30 -0
  125. package/src/console/server/live.ts +109 -0
  126. package/src/console/server/plugin.ts +50 -0
  127. package/src/console/server/plugins.test.ts +131 -0
  128. package/src/console/server/plugins.ts +429 -0
  129. package/src/console/server/runs-pii.ts +98 -0
  130. package/src/console/server/security-headers.ts +97 -0
  131. package/src/console/server/security.gate.test.ts +286 -0
  132. package/src/console/server/serve.ts +319 -0
  133. package/src/console/server/signals.test.ts +88 -0
  134. package/src/console/server/signals.ts +282 -0
  135. package/src/console/server/state.ts +982 -0
  136. package/src/console/server/store.test.ts +233 -0
  137. package/src/console/server/store.ts +861 -0
  138. package/src/console/server/structural.ts +95 -0
  139. package/src/console/server/vault.test.ts +251 -0
  140. package/src/console/server/vault.ts +430 -0
  141. package/src/console/ui/access/AccessA11yView.tsx +237 -0
  142. package/src/console/ui/access/a11y.test.tsx +122 -0
  143. package/src/console/ui/access/acknowledgement.test.ts +13 -0
  144. package/src/console/ui/access/acknowledgement.ts +35 -0
  145. package/src/console/ui/access/blast-radius.test.ts +26 -0
  146. package/src/console/ui/access/blast-radius.ts +40 -0
  147. package/src/console/ui/access/confirmation.test.ts +38 -0
  148. package/src/console/ui/access/confirmation.ts +36 -0
  149. package/src/console/ui/access/fixture.ts +203 -0
  150. package/src/console/ui/access/grantable.test.ts +17 -0
  151. package/src/console/ui/access/grantable.ts +36 -0
  152. package/src/console/ui/access/hygiene.test.ts +12 -0
  153. package/src/console/ui/access/hygiene.ts +39 -0
  154. package/src/console/ui/access/index.ts +54 -0
  155. package/src/console/ui/access/provenance.test.ts +12 -0
  156. package/src/console/ui/access/provenance.ts +29 -0
  157. package/src/console/ui/access/search.test.ts +17 -0
  158. package/src/console/ui/access/search.ts +72 -0
  159. package/src/console/ui/access/types.ts +111 -0
  160. package/src/console/ui/ai/AiA11yView.tsx +265 -0
  161. package/src/console/ui/ai/a11y.test.tsx +99 -0
  162. package/src/console/ui/ai/findings.ts +41 -0
  163. package/src/console/ui/ai/fixture.ts +182 -0
  164. package/src/console/ui/ai/format.ts +90 -0
  165. package/src/console/ui/ai/group.test.ts +37 -0
  166. package/src/console/ui/ai/group.ts +88 -0
  167. package/src/console/ui/ai/index.ts +66 -0
  168. package/src/console/ui/ai/promotion.test.ts +77 -0
  169. package/src/console/ui/ai/promotion.ts +150 -0
  170. package/src/console/ui/ai/search.test.ts +40 -0
  171. package/src/console/ui/ai/search.ts +89 -0
  172. package/src/console/ui/ai/types.ts +139 -0
  173. package/src/console/ui/architecture/ArchitectureA11yView.tsx +163 -0
  174. package/src/console/ui/architecture/a11y.test.tsx +97 -0
  175. package/src/console/ui/architecture/boundary.ts +42 -0
  176. package/src/console/ui/architecture/declared.ts +165 -0
  177. package/src/console/ui/architecture/fixture.ts +74 -0
  178. package/src/console/ui/architecture/index.ts +84 -0
  179. package/src/console/ui/architecture/layers.ts +64 -0
  180. package/src/console/ui/architecture/layout.ts +68 -0
  181. package/src/console/ui/architecture/pathologies.ts +260 -0
  182. package/src/console/ui/architecture/search.ts +145 -0
  183. package/src/console/ui/architecture/traffic.ts +102 -0
  184. package/src/console/ui/architecture/types.ts +144 -0
  185. package/src/console/ui/architecture/view.test.ts +165 -0
  186. package/src/console/ui/architecture/view.ts +516 -0
  187. package/src/console/ui/channels/ChannelsA11yView.tsx +180 -0
  188. package/src/console/ui/channels/a11y.test.tsx +96 -0
  189. package/src/console/ui/channels/confirmation.test.ts +37 -0
  190. package/src/console/ui/channels/confirmation.ts +27 -0
  191. package/src/console/ui/channels/fallback.test.ts +15 -0
  192. package/src/console/ui/channels/fallback.ts +20 -0
  193. package/src/console/ui/channels/findings.ts +38 -0
  194. package/src/console/ui/channels/fixture.ts +134 -0
  195. package/src/console/ui/channels/group.ts +25 -0
  196. package/src/console/ui/channels/index.ts +57 -0
  197. package/src/console/ui/channels/locale.test.ts +17 -0
  198. package/src/console/ui/channels/locale.ts +31 -0
  199. package/src/console/ui/channels/mask.test.ts +14 -0
  200. package/src/console/ui/channels/mask.ts +12 -0
  201. package/src/console/ui/channels/search.ts +58 -0
  202. package/src/console/ui/channels/taxonomy.test.ts +17 -0
  203. package/src/console/ui/channels/taxonomy.ts +49 -0
  204. package/src/console/ui/channels/types.ts +117 -0
  205. package/src/console/ui/clock/ClockA11yView.tsx +182 -0
  206. package/src/console/ui/clock/a11y.test.tsx +99 -0
  207. package/src/console/ui/clock/confirmation.test.ts +32 -0
  208. package/src/console/ui/clock/confirmation.ts +34 -0
  209. package/src/console/ui/clock/findings.ts +40 -0
  210. package/src/console/ui/clock/fixture.ts +111 -0
  211. package/src/console/ui/clock/health.test.ts +25 -0
  212. package/src/console/ui/clock/health.ts +61 -0
  213. package/src/console/ui/clock/index.ts +49 -0
  214. package/src/console/ui/clock/search.test.ts +39 -0
  215. package/src/console/ui/clock/search.ts +76 -0
  216. package/src/console/ui/clock/timeline.test.ts +44 -0
  217. package/src/console/ui/clock/timeline.ts +41 -0
  218. package/src/console/ui/clock/types.ts +78 -0
  219. package/src/console/ui/clock/waiting-on.test.ts +34 -0
  220. package/src/console/ui/clock/waiting-on.ts +83 -0
  221. package/src/console/ui/confirmation.unify.test.ts +92 -0
  222. package/src/console/ui/diff/DiffA11yView.tsx +85 -0
  223. package/src/console/ui/diff/a11y.test.tsx +99 -0
  224. package/src/console/ui/diff/fixture.ts +85 -0
  225. package/src/console/ui/diff/group.test.ts +58 -0
  226. package/src/console/ui/diff/group.ts +97 -0
  227. package/src/console/ui/diff/index.ts +38 -0
  228. package/src/console/ui/diff/search.test.ts +32 -0
  229. package/src/console/ui/diff/search.ts +75 -0
  230. package/src/console/ui/diff/summary.ts +74 -0
  231. package/src/console/ui/diff/types.ts +48 -0
  232. package/src/console/ui/dist/assets/index-B71Yl_SS.js +10 -0
  233. package/src/console/ui/dist/assets/panel-access-Dd37LU2c.js +64 -0
  234. package/src/console/ui/dist/assets/panel-ai-CC7LR6-J.js +1 -0
  235. package/src/console/ui/dist/assets/panel-architecture-B5b3iKCz.js +1 -0
  236. package/src/console/ui/dist/assets/panel-channels-CeNjTKXp.js +1 -0
  237. package/src/console/ui/dist/assets/panel-clock-DgFTLoHV.js +1 -0
  238. package/src/console/ui/dist/assets/panel-diff-DxehccqB.js +1 -0
  239. package/src/console/ui/dist/assets/panel-flows-BtrVn-Eg.js +45 -0
  240. package/src/console/ui/dist/assets/panel-gates-Z9MKRGdH.js +1 -0
  241. package/src/console/ui/dist/assets/panel-overview-Bd48d9km.js +1 -0
  242. package/src/console/ui/dist/assets/panel-plugins-DWd0TowH.js +1 -0
  243. package/src/console/ui/dist/assets/panel-runs-BwsWqKeB.js +1 -0
  244. package/src/console/ui/dist/assets/panel-signals-9najbZY2.js +1 -0
  245. package/src/console/ui/dist/assets/panel-store-OHkP2pDp.js +1 -0
  246. package/src/console/ui/dist/assets/panel-traces-tn2JoY8U.js +1 -0
  247. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +1 -0
  248. package/src/console/ui/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
  249. package/src/console/ui/dist/assets/style-Cnl7WLya.css +3 -0
  250. package/src/console/ui/dist/index.html +14 -0
  251. package/src/console/ui/flows/FlowsA11yView.tsx +155 -0
  252. package/src/console/ui/flows/a11y.test.tsx +105 -0
  253. package/src/console/ui/flows/buffer.test.ts +91 -0
  254. package/src/console/ui/flows/buffer.ts +118 -0
  255. package/src/console/ui/flows/confirmation.ts +131 -0
  256. package/src/console/ui/flows/contract.test.ts +89 -0
  257. package/src/console/ui/flows/contract.ts +353 -0
  258. package/src/console/ui/flows/fixture.ts +81 -0
  259. package/src/console/ui/flows/graph.test.ts +101 -0
  260. package/src/console/ui/flows/graph.ts +549 -0
  261. package/src/console/ui/flows/index.ts +87 -0
  262. package/src/console/ui/flows/save-as-test.test.ts +47 -0
  263. package/src/console/ui/flows/save-as-test.ts +99 -0
  264. package/src/console/ui/flows/search.ts +255 -0
  265. package/src/console/ui/flows/tiers.ts +140 -0
  266. package/src/console/ui/gates/GatesA11yView.tsx +192 -0
  267. package/src/console/ui/gates/a11y.test.tsx +116 -0
  268. package/src/console/ui/gates/audit.test.ts +40 -0
  269. package/src/console/ui/gates/audit.ts +63 -0
  270. package/src/console/ui/gates/denial.test.ts +36 -0
  271. package/src/console/ui/gates/denial.ts +51 -0
  272. package/src/console/ui/gates/findings.ts +19 -0
  273. package/src/console/ui/gates/fixture.ts +189 -0
  274. package/src/console/ui/gates/group.test.ts +30 -0
  275. package/src/console/ui/gates/group.ts +102 -0
  276. package/src/console/ui/gates/index.ts +47 -0
  277. package/src/console/ui/gates/search.test.ts +49 -0
  278. package/src/console/ui/gates/search.ts +115 -0
  279. package/src/console/ui/gates/types.ts +121 -0
  280. package/src/console/ui/overview/OverviewA11yView.tsx +152 -0
  281. package/src/console/ui/overview/a11y.test.tsx +113 -0
  282. package/src/console/ui/overview/busiest.ts +26 -0
  283. package/src/console/ui/overview/compose.ts +133 -0
  284. package/src/console/ui/overview/cost.test.ts +39 -0
  285. package/src/console/ui/overview/cost.ts +138 -0
  286. package/src/console/ui/overview/fixture.ts +161 -0
  287. package/src/console/ui/overview/golden.ts +57 -0
  288. package/src/console/ui/overview/index.ts +59 -0
  289. package/src/console/ui/overview/rank.test.ts +136 -0
  290. package/src/console/ui/overview/rank.ts +210 -0
  291. package/src/console/ui/overview/slo.test.ts +73 -0
  292. package/src/console/ui/overview/slo.ts +229 -0
  293. package/src/console/ui/overview/types.ts +121 -0
  294. package/src/console/ui/overview/verdict.ts +131 -0
  295. package/src/console/ui/plugins/PluginsA11yView.tsx +227 -0
  296. package/src/console/ui/plugins/a11y.test.tsx +97 -0
  297. package/src/console/ui/plugins/command.test.ts +22 -0
  298. package/src/console/ui/plugins/command.ts +27 -0
  299. package/src/console/ui/plugins/findings.ts +39 -0
  300. package/src/console/ui/plugins/fixture.ts +233 -0
  301. package/src/console/ui/plugins/group.test.ts +38 -0
  302. package/src/console/ui/plugins/group.ts +67 -0
  303. package/src/console/ui/plugins/index.ts +40 -0
  304. package/src/console/ui/plugins/search.ts +67 -0
  305. package/src/console/ui/plugins/types.ts +115 -0
  306. package/src/console/ui/runs/RunsA11yView.tsx +267 -0
  307. package/src/console/ui/runs/a11y.test.tsx +99 -0
  308. package/src/console/ui/runs/explain.test.ts +23 -0
  309. package/src/console/ui/runs/explain.ts +32 -0
  310. package/src/console/ui/runs/fixture.ts +189 -0
  311. package/src/console/ui/runs/group.test.ts +24 -0
  312. package/src/console/ui/runs/group.ts +85 -0
  313. package/src/console/ui/runs/histogram.test.ts +31 -0
  314. package/src/console/ui/runs/histogram.ts +85 -0
  315. package/src/console/ui/runs/index.ts +75 -0
  316. package/src/console/ui/runs/project.ts +122 -0
  317. package/src/console/ui/runs/query.test.ts +50 -0
  318. package/src/console/ui/runs/query.ts +283 -0
  319. package/src/console/ui/runs/search.test.ts +45 -0
  320. package/src/console/ui/runs/search.ts +141 -0
  321. package/src/console/ui/runs/trace-link.test.ts +30 -0
  322. package/src/console/ui/runs/trace-link.ts +99 -0
  323. package/src/console/ui/runs/types.ts +137 -0
  324. package/src/console/ui/shell/App.tsx +56 -0
  325. package/src/console/ui/shell/client.ts +1715 -0
  326. package/src/console/ui/shell/components/ui.tsx +110 -0
  327. package/src/console/ui/shell/index.html +12 -0
  328. package/src/console/ui/shell/layout/Shell.tsx +95 -0
  329. package/src/console/ui/shell/main.tsx +281 -0
  330. package/src/console/ui/shell/panels/Access.tsx +5 -0
  331. package/src/console/ui/shell/panels/Ai.tsx +5 -0
  332. package/src/console/ui/shell/panels/Architecture.tsx +5 -0
  333. package/src/console/ui/shell/panels/Channels.tsx +5 -0
  334. package/src/console/ui/shell/panels/Clock.tsx +5 -0
  335. package/src/console/ui/shell/panels/Diff.tsx +5 -0
  336. package/src/console/ui/shell/panels/Flows.tsx +5 -0
  337. package/src/console/ui/shell/panels/Gates.tsx +5 -0
  338. package/src/console/ui/shell/panels/Overview.tsx +6 -0
  339. package/src/console/ui/shell/panels/Plugins.tsx +5 -0
  340. package/src/console/ui/shell/panels/Runs.tsx +5 -0
  341. package/src/console/ui/shell/panels/Signals.tsx +5 -0
  342. package/src/console/ui/shell/panels/Store.tsx +5 -0
  343. package/src/console/ui/shell/panels/Traces.tsx +5 -0
  344. package/src/console/ui/shell/panels/Vault.tsx +5 -0
  345. package/src/console/ui/shell/panels/access/AccessPanel.tsx +813 -0
  346. package/src/console/ui/shell/panels/ai/AiPanel.tsx +563 -0
  347. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +377 -0
  348. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +454 -0
  349. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +479 -0
  350. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +275 -0
  351. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +301 -0
  352. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +350 -0
  353. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +502 -0
  354. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +482 -0
  355. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +428 -0
  356. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +413 -0
  357. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +649 -0
  358. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +840 -0
  359. package/src/console/ui/shell/panels/store/StorePanel.tsx +787 -0
  360. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +539 -0
  361. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +449 -0
  362. package/src/console/ui/shell/plugin/Sandbox.tsx +29 -0
  363. package/src/console/ui/shell/setup/Wizard.tsx +189 -0
  364. package/src/console/ui/shell/styles.css +75 -0
  365. package/src/console/ui/signals/SignalsA11yView.tsx +276 -0
  366. package/src/console/ui/signals/a11y.test.tsx +99 -0
  367. package/src/console/ui/signals/confirmation.test.ts +39 -0
  368. package/src/console/ui/signals/confirmation.ts +63 -0
  369. package/src/console/ui/signals/dry-run.test.ts +18 -0
  370. package/src/console/ui/signals/dry-run.ts +36 -0
  371. package/src/console/ui/signals/durable.test.ts +22 -0
  372. package/src/console/ui/signals/durable.ts +41 -0
  373. package/src/console/ui/signals/findings.ts +33 -0
  374. package/src/console/ui/signals/fixture.ts +242 -0
  375. package/src/console/ui/signals/group.test.ts +32 -0
  376. package/src/console/ui/signals/group.ts +49 -0
  377. package/src/console/ui/signals/index.ts +52 -0
  378. package/src/console/ui/signals/monitor.test.ts +30 -0
  379. package/src/console/ui/signals/monitor.ts +79 -0
  380. package/src/console/ui/signals/schema-form.test.ts +34 -0
  381. package/src/console/ui/signals/schema-form.ts +112 -0
  382. package/src/console/ui/signals/search.ts +102 -0
  383. package/src/console/ui/signals/types.ts +71 -0
  384. package/src/console/ui/store/StoreA11yView.tsx +199 -0
  385. package/src/console/ui/store/a11y.test.tsx +99 -0
  386. package/src/console/ui/store/cache-view.test.ts +13 -0
  387. package/src/console/ui/store/cache-view.ts +36 -0
  388. package/src/console/ui/store/confirmation.test.ts +38 -0
  389. package/src/console/ui/store/confirmation.ts +55 -0
  390. package/src/console/ui/store/dry-run.test.ts +15 -0
  391. package/src/console/ui/store/dry-run.ts +29 -0
  392. package/src/console/ui/store/fixture.ts +163 -0
  393. package/src/console/ui/store/group.test.ts +21 -0
  394. package/src/console/ui/store/group.ts +41 -0
  395. package/src/console/ui/store/index.ts +40 -0
  396. package/src/console/ui/store/search.ts +78 -0
  397. package/src/console/ui/store/types.ts +65 -0
  398. package/src/console/ui/store/will-not-fire.test.ts +19 -0
  399. package/src/console/ui/store/will-not-fire.ts +40 -0
  400. package/src/console/ui/traces/TracesA11yView.tsx +200 -0
  401. package/src/console/ui/traces/a11y.test.tsx +97 -0
  402. package/src/console/ui/traces/chain.test.ts +61 -0
  403. package/src/console/ui/traces/chain.ts +144 -0
  404. package/src/console/ui/traces/critical-path.test.ts +24 -0
  405. package/src/console/ui/traces/critical-path.ts +59 -0
  406. package/src/console/ui/traces/filter.test.ts +78 -0
  407. package/src/console/ui/traces/filter.ts +112 -0
  408. package/src/console/ui/traces/fixture.ts +126 -0
  409. package/src/console/ui/traces/fold.test.ts +67 -0
  410. package/src/console/ui/traces/fold.ts +170 -0
  411. package/src/console/ui/traces/index.ts +64 -0
  412. package/src/console/ui/traces/mini.ts +65 -0
  413. package/src/console/ui/traces/replay.test.ts +24 -0
  414. package/src/console/ui/traces/replay.ts +35 -0
  415. package/src/console/ui/traces/sampling.test.ts +26 -0
  416. package/src/console/ui/traces/sampling.ts +66 -0
  417. package/src/console/ui/traces/search.ts +148 -0
  418. package/src/console/ui/traces/tier.ts +72 -0
  419. package/src/console/ui/traces/types.ts +125 -0
  420. package/src/console/ui/tsconfig.json +20 -0
  421. package/src/console/ui/vault/VaultA11yView.tsx +177 -0
  422. package/src/console/ui/vault/a11y.test.tsx +97 -0
  423. package/src/console/ui/vault/blast-radius.test.ts +35 -0
  424. package/src/console/ui/vault/blast-radius.ts +55 -0
  425. package/src/console/ui/vault/confirmation.test.ts +41 -0
  426. package/src/console/ui/vault/confirmation.ts +39 -0
  427. package/src/console/ui/vault/dormant.test.ts +37 -0
  428. package/src/console/ui/vault/dormant.ts +28 -0
  429. package/src/console/ui/vault/export-safe.test.ts +30 -0
  430. package/src/console/ui/vault/export-safe.ts +65 -0
  431. package/src/console/ui/vault/fixture.ts +75 -0
  432. package/src/console/ui/vault/group.test.ts +25 -0
  433. package/src/console/ui/vault/group.ts +50 -0
  434. package/src/console/ui/vault/index.ts +45 -0
  435. package/src/console/ui/vault/search.ts +62 -0
  436. package/src/console/ui/vault/types.ts +57 -0
  437. package/src/console/ui/vite.config.ts +84 -0
  438. package/src/console/xss.gate.test.ts +118 -0
  439. package/src/docker/compose.ts +226 -0
  440. package/src/docker/credentials.ts +25 -0
  441. package/src/docker/derive.ts +83 -0
  442. package/src/docker/docker.test.ts +185 -0
  443. package/src/docker/dockerfile.integration.test.ts +170 -0
  444. package/src/docker/dockerfile.ts +39 -0
  445. package/src/docker/helpers.ts +103 -0
  446. package/src/docker/index.ts +52 -0
  447. package/src/docker/pin.ts +90 -0
  448. package/src/docker/recipes/index.ts +33 -0
  449. package/src/docker/recipes/postgres.ts +18 -0
  450. package/src/docker/recipes/redis.ts +18 -0
  451. package/src/docker/stack.integration.test.ts +140 -0
  452. package/src/docker/stack.ts +62 -0
  453. package/src/docker/types.ts +134 -0
  454. package/src/drivers/ai-anthropic.ts +128 -0
  455. package/src/drivers/ai-mock.ts +82 -0
  456. package/src/drivers/ai-openai-compatible.ts +139 -0
  457. package/src/drivers/ai-providers.test.ts +163 -0
  458. package/src/drivers/ai-types.ts +83 -0
  459. package/src/drivers/bun-native-completeness.test.ts +155 -0
  460. package/src/drivers/channel-console.ts +118 -0
  461. package/src/drivers/channel-fcm.ts +96 -0
  462. package/src/drivers/channel-resend.ts +27 -0
  463. package/src/drivers/channel-smtp.ts +33 -0
  464. package/src/drivers/channel-types.ts +160 -0
  465. package/src/drivers/channel-unifonic.ts +79 -0
  466. package/src/drivers/channel-wa-cloud.ts +84 -0
  467. package/src/drivers/channel-webpush.ts +317 -0
  468. package/src/drivers/conformance.test.ts +89 -0
  469. package/src/drivers/conformance.ts +162 -0
  470. package/src/drivers/fs.ts +73 -0
  471. package/src/drivers/index.ts +194 -0
  472. package/src/drivers/kv-lua.ts +222 -0
  473. package/src/drivers/memory.ts +472 -0
  474. package/src/drivers/pgvector.ts +130 -0
  475. package/src/drivers/postgres.ts +221 -0
  476. package/src/drivers/redis.ts +254 -0
  477. package/src/drivers/s3.ts +129 -0
  478. package/src/drivers/signal-engine.ts +690 -0
  479. package/src/drivers/signal-memory.ts +27 -0
  480. package/src/drivers/signal-nats.ts +131 -0
  481. package/src/drivers/signal-postgres.ts +1089 -0
  482. package/src/drivers/signal-redis.ts +275 -0
  483. package/src/drivers/signal-types.ts +328 -0
  484. package/src/drivers/sqlite.ts +53 -0
  485. package/src/drivers/types.ts +334 -0
  486. package/src/drivers/vault-dotenv-parse.ts +56 -0
  487. package/src/drivers/vault-env.ts +101 -0
  488. package/src/drivers/vault-infisical.ts +61 -0
  489. package/src/drivers/vault-managed.ts +42 -0
  490. package/src/drivers/vault-memory.ts +38 -0
  491. package/src/drivers/vault-openbao.ts +80 -0
  492. package/src/drivers/vault-sops.ts +252 -0
  493. package/src/drivers/vault-types.ts +84 -0
  494. package/src/elements/ai/declare.ts +206 -0
  495. package/src/elements/ai/eval.ts +113 -0
  496. package/src/elements/ai/pii.ts +108 -0
  497. package/src/elements/ai/runtime.ts +540 -0
  498. package/src/elements/ai/schema.ts +194 -0
  499. package/src/elements/ai.test.ts +393 -0
  500. package/src/elements/ai.ts +56 -0
  501. package/src/elements/channel/consent.ts +81 -0
  502. package/src/elements/channel/costs.test.ts +62 -0
  503. package/src/elements/channel/costs.ts +130 -0
  504. package/src/elements/channel/declare.ts +141 -0
  505. package/src/elements/channel/email-auth.test.ts +47 -0
  506. package/src/elements/channel/email-auth.ts +109 -0
  507. package/src/elements/channel/locale.ts +97 -0
  508. package/src/elements/channel/mask.test.ts +19 -0
  509. package/src/elements/channel/mask.ts +60 -0
  510. package/src/elements/channel/mime.ts +23 -0
  511. package/src/elements/channel/outcomes.test.ts +40 -0
  512. package/src/elements/channel/outcomes.ts +126 -0
  513. package/src/elements/channel/receipts.ts +121 -0
  514. package/src/elements/channel/runtime.ts +500 -0
  515. package/src/elements/channel/suppression.ts +136 -0
  516. package/src/elements/channel.test.ts +232 -0
  517. package/src/elements/channel.ts +109 -0
  518. package/src/elements/clock/actions.ts +170 -0
  519. package/src/elements/clock/declare.ts +58 -0
  520. package/src/elements/clock/dst.ts +197 -0
  521. package/src/elements/clock/durable.ts +140 -0
  522. package/src/elements/clock/duration.ts +29 -0
  523. package/src/elements/clock/health.test.ts +103 -0
  524. package/src/elements/clock/health.ts +112 -0
  525. package/src/elements/clock/leader.ts +127 -0
  526. package/src/elements/clock/reconcile.ts +241 -0
  527. package/src/elements/clock/runtime.ts +243 -0
  528. package/src/elements/clock/schedule.ts +262 -0
  529. package/src/elements/clock/time-travel.ts +53 -0
  530. package/src/elements/clock.test.ts +365 -0
  531. package/src/elements/clock.ts +80 -0
  532. package/src/elements/gate/declare.ts +134 -0
  533. package/src/elements/gate/permissions.ts +104 -0
  534. package/src/elements/gate/runtime.ts +177 -0
  535. package/src/elements/gate/strategies.ts +388 -0
  536. package/src/elements/gate.test.ts +145 -0
  537. package/src/elements/gate.ts +41 -0
  538. package/src/elements/index.ts +169 -0
  539. package/src/elements/signal/chaos-child.ts +47 -0
  540. package/src/elements/signal/declare.ts +77 -0
  541. package/src/elements/signal/dry-run-replay.test.ts +95 -0
  542. package/src/elements/signal/dry-run-write-isolation.test.ts +94 -0
  543. package/src/elements/signal/reconcile.test.ts +23 -0
  544. package/src/elements/signal/reconcile.ts +122 -0
  545. package/src/elements/signal/runtime.ts +94 -0
  546. package/src/elements/signal.test.ts +457 -0
  547. package/src/elements/signal.ts +26 -0
  548. package/src/elements/store/cache.ts +197 -0
  549. package/src/elements/store/classify.ts +125 -0
  550. package/src/elements/store/declare.ts +200 -0
  551. package/src/elements/store/files-policy.test.ts +31 -0
  552. package/src/elements/store/files-policy.ts +70 -0
  553. package/src/elements/store/replica.ts +68 -0
  554. package/src/elements/store/runtime.ts +393 -0
  555. package/src/elements/store/sql-condition.ts +205 -0
  556. package/src/elements/store/sql-session.ts +579 -0
  557. package/src/elements/store/table.ts +282 -0
  558. package/src/elements/store.test.ts +370 -0
  559. package/src/elements/store.ts +99 -0
  560. package/src/elements/vault/declare.ts +143 -0
  561. package/src/elements/vault/fingerprint.ts +30 -0
  562. package/src/elements/vault/redact.ts +52 -0
  563. package/src/elements/vault/runtime.ts +461 -0
  564. package/src/elements/vault.test.ts +296 -0
  565. package/src/elements/vault.ts +44 -0
  566. package/src/index.ts +183 -0
  567. package/src/kernel/adopt-routes.ts +194 -0
  568. package/src/kernel/app.ts +1068 -0
  569. package/src/kernel/auth-resolve.ts +93 -0
  570. package/src/kernel/boot.test.ts +173 -0
  571. package/src/kernel/boot.ts +439 -0
  572. package/src/kernel/budget-entry.ts +55 -0
  573. package/src/kernel/budget.test.ts +19 -0
  574. package/src/kernel/call.test.ts +83 -0
  575. package/src/kernel/capability.ts +113 -0
  576. package/src/kernel/dry-run.test.ts +64 -0
  577. package/src/kernel/dry-run.ts +171 -0
  578. package/src/kernel/effects.test.ts +89 -0
  579. package/src/kernel/effects.ts +140 -0
  580. package/src/kernel/errors.registry.test.ts +39 -0
  581. package/src/kernel/errors.ts +225 -0
  582. package/src/kernel/flow.test.ts +154 -0
  583. package/src/kernel/flow.ts +290 -0
  584. package/src/kernel/fx.test.ts +245 -0
  585. package/src/kernel/fx.ts +996 -0
  586. package/src/kernel/hook-timing.test.ts +72 -0
  587. package/src/kernel/hook-timing.ts +190 -0
  588. package/src/kernel/hooks.test.ts +181 -0
  589. package/src/kernel/hooks.ts +275 -0
  590. package/src/kernel/index.ts +278 -0
  591. package/src/kernel/journal.ts +405 -0
  592. package/src/kernel/journey.ts +75 -0
  593. package/src/kernel/on.ts +74 -0
  594. package/src/kernel/pipeline.test.ts +349 -0
  595. package/src/kernel/pipeline.ts +245 -0
  596. package/src/kernel/plug.ts +82 -0
  597. package/src/kernel/plugin/capabilities.test.ts +84 -0
  598. package/src/kernel/plugin/conflicts.test.ts +106 -0
  599. package/src/kernel/plugin/decorate.test.ts +111 -0
  600. package/src/kernel/plugin/scoping.test.ts +138 -0
  601. package/src/kernel/plugin.ts +485 -0
  602. package/src/kernel/rate-limit.ts +25 -0
  603. package/src/kernel/registry.ts +398 -0
  604. package/src/kernel/router.test.ts +114 -0
  605. package/src/kernel/router.ts +556 -0
  606. package/src/kernel/routing-budget.test.ts +19 -0
  607. package/src/kernel/run-telemetry.ts +70 -0
  608. package/src/kernel/triggers.ts +324 -0
  609. package/src/kernel/unit.ts +88 -0
  610. package/src/manifest/diff.test.ts +866 -0
  611. package/src/manifest/diff.ts +1670 -0
  612. package/src/manifest/fixtures/base.manifest.json +112 -0
  613. package/src/manifest/fixtures/skyport.excerpt.json +51 -0
  614. package/src/manifest/fixtures/skyport.manifest.json +153 -0
  615. package/src/manifest/index.ts +27 -0
  616. package/src/manifest/types.ts +358 -0
  617. package/src/manifest/undeclared.test.ts +82 -0
  618. package/src/manifest/undeclared.ts +65 -0
  619. package/src/manifest/validate.test.ts +105 -0
  620. package/src/manifest/validate.ts +174 -0
  621. package/src/mcp/authorization.ts +340 -0
  622. package/src/mcp/confirmation.ts +174 -0
  623. package/src/mcp/data.ts +90 -0
  624. package/src/mcp/index.ts +80 -0
  625. package/src/mcp/injection.gate.test.ts +176 -0
  626. package/src/mcp/mcp.test.ts +348 -0
  627. package/src/mcp/protocol.ts +172 -0
  628. package/src/mcp/server.ts +283 -0
  629. package/src/mcp/session.ts +139 -0
  630. package/src/mcp/tools.ts +391 -0
  631. package/src/plugins/catalogue.test.ts +48 -0
  632. package/src/plugins/catalogue.ts +113 -0
  633. package/src/plugins/node-import-scan.test.ts +28 -0
  634. package/src/plugins/node-import-scan.ts +98 -0
  635. package/src/plugins/supply-chain.test.ts +48 -0
  636. package/src/plugins/supply-chain.ts +460 -0
  637. package/src/release/index.ts +30 -0
  638. package/src/release/limits.ts +20 -0
  639. package/src/release/measure.ts +443 -0
  640. package/src/release/publish.ts +56 -0
  641. package/src/runs/bench.test.ts +93 -0
  642. package/src/runs/collect.ts +144 -0
  643. package/src/runs/drivers/clickhouse.ts +108 -0
  644. package/src/runs/drivers/files.ts +201 -0
  645. package/src/runs/drivers/memory.ts +94 -0
  646. package/src/runs/drivers/postgres.ts +110 -0
  647. package/src/runs/duckdb.ts +99 -0
  648. package/src/runs/index.ts +82 -0
  649. package/src/runs/outlier.ts +180 -0
  650. package/src/runs/parquet.ts +210 -0
  651. package/src/runs/privacy.ts +49 -0
  652. package/src/runs/runs.test.ts +324 -0
  653. package/src/runs/runtime.ts +229 -0
  654. package/src/runs/shred.ts +243 -0
  655. package/src/runs/telemetry.ts +10 -0
  656. package/src/runs/types.ts +179 -0
  657. package/src/runtime/bun.ts +140 -0
  658. package/src/runtime/cold-start.bench.ts +20 -0
  659. package/src/runtime/index.ts +46 -0
  660. package/src/runtime/primitives.ts +242 -0
  661. package/src/runtime/security.test.ts +170 -0
  662. package/src/runtime/security.ts +168 -0
  663. package/src/runtime/serve.test.ts +223 -0
  664. package/src/runtime/types.ts +217 -0
  665. package/src/runtime/web-standard.ts +77 -0
  666. package/src/test/create-test-app.test.ts +161 -0
  667. package/src/test/create-test-app.ts +533 -0
  668. package/src/test/index.ts +21 -0
  669. package/src/test/provisions.integration.test.ts +174 -0
  670. package/src/upgrade/codemods.test.ts +58 -0
  671. package/src/upgrade/codemods.ts +83 -0
  672. package/src/validation/index.ts +23 -0
  673. package/src/validation/standard-schema.test.ts +96 -0
  674. package/src/validation/standard-schema.ts +316 -0
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Map span effects onto the Flows effect-tier vocabulary (console §9.3).
3
+ */
4
+
5
+ import type { EffectKind } from "../../../kernel/effects.ts";
6
+ import type { UiEffectTier } from "../flows/tiers.ts";
7
+ import type { SpanTier, TraceEffect, TraceSpan } from "./types.ts";
8
+
9
+ /**
10
+ * UI tier for a single effect kind.
11
+ *
12
+ * @param kind - Kernel effect kind
13
+ */
14
+ export function tierOfKind(kind: EffectKind): UiEffectTier {
15
+ switch (kind) {
16
+ case "read":
17
+ return "reads";
18
+ case "write":
19
+ return "writes";
20
+ case "emit":
21
+ return "emits";
22
+ case "send":
23
+ case "ask":
24
+ return "external";
25
+ case "secret":
26
+ return "capabilities";
27
+ case "call":
28
+ return "reads";
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Highest (most severe) effect tier on a span.
34
+ *
35
+ * @param effects - Span effects
36
+ */
37
+ export function peakSpanTier(
38
+ effects: readonly TraceEffect[],
39
+ ): SpanTier {
40
+ let peak: SpanTier = "none";
41
+ for (const e of effects) {
42
+ const t = tierOfKind(e.kind);
43
+ if (rank(t) > rank(peak)) peak = t;
44
+ }
45
+ return peak;
46
+ }
47
+
48
+ /**
49
+ * Whether any span in the set has an irreversible (external) effect.
50
+ *
51
+ * @param spans - Spans in the trace
52
+ */
53
+ export function traceHasExternal(spans: readonly TraceSpan[]): boolean {
54
+ return spans.some((s) => peakSpanTier(s.effects) === "external");
55
+ }
56
+
57
+ function rank(tier: SpanTier): number {
58
+ switch (tier) {
59
+ case "external":
60
+ return 5;
61
+ case "capabilities":
62
+ return 4;
63
+ case "emits":
64
+ return 3;
65
+ case "writes":
66
+ return 2;
67
+ case "reads":
68
+ return 1;
69
+ case "none":
70
+ return 0;
71
+ }
72
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Trace panel domain types (console §9.3 · §9.11).
3
+ *
4
+ * One flow execution = one wide event = one span. A trace is a causal chain
5
+ * of runs joined across async boundaries via {@link TraceSpan.parentId}.
6
+ */
7
+
8
+ import type { EffectKind, ReversibilityTier } from "../../../kernel/effects.ts";
9
+ import type { UiEffectTier } from "../flows/tiers.ts";
10
+
11
+ /** One recorded effect on a span (subset of the ledger entry). */
12
+ export interface TraceEffect {
13
+ /** Effect kind. */
14
+ readonly kind: EffectKind;
15
+ /** Resource / signal / template / prompt / secret / flow ref. */
16
+ readonly resource: string;
17
+ /** Epoch-ms when the call started. */
18
+ readonly timestamp: number;
19
+ /** Wall duration in milliseconds. */
20
+ readonly duration: number;
21
+ /** Reversibility tier. */
22
+ readonly reversibility: ReversibilityTier;
23
+ }
24
+
25
+ /** Why a run appears in the sampled list (console §9.3). */
26
+ export type SampleReason = "full" | "error" | "sample" | "boost";
27
+
28
+ /**
29
+ * One span in a trace — the UI projection of a wide event.
30
+ */
31
+ export interface TraceSpan {
32
+ /** Run id (= span id). */
33
+ readonly id: string;
34
+ /** Parent run id when caused by another execution. */
35
+ readonly parentId?: string;
36
+ /** Flow name. */
37
+ readonly flow: string;
38
+ /** Optional unit scope. */
39
+ readonly unit?: string;
40
+ /** Trigger kind. */
41
+ readonly trigger: string;
42
+ /** Epoch-ms start. */
43
+ readonly startedAt: number;
44
+ /** Epoch-ms end. */
45
+ readonly endedAt: number;
46
+ /** Wall duration in milliseconds. */
47
+ readonly durationMs: number;
48
+ /** Typed error code when the flow failed. */
49
+ readonly errorCode?: string | null;
50
+ /** Effect ledger snapshot. */
51
+ readonly effects: readonly TraceEffect[];
52
+ /** AI cost accrued during the run. */
53
+ readonly cost?: number;
54
+ /** Sampling classification for honest list labelling. */
55
+ readonly sampled: SampleReason;
56
+ }
57
+
58
+ /** Peak UI effect tier for a span (drives waterfall colour). */
59
+ export type SpanTier = UiEffectTier | "none";
60
+
61
+ /** One bar in a list-row mini-waterfall. */
62
+ export interface MiniBar {
63
+ /** Relative start 0..1. */
64
+ readonly start: number;
65
+ /** Relative width 0..1. */
66
+ readonly width: number;
67
+ /** Effect tier colour key. */
68
+ readonly tier: SpanTier;
69
+ /** True when this bar is the failing effect. */
70
+ readonly failed?: boolean;
71
+ }
72
+
73
+ /** Filter by declared effect (console §9.3 — the filter no one else can offer). */
74
+ export type EffectFilter =
75
+ | { readonly kind: "wrote"; readonly resource: string }
76
+ | { readonly kind: "asked" }
77
+ | { readonly kind: "sent"; readonly resource?: string }
78
+ | { readonly kind: "secret"; readonly resource?: string }
79
+ | { readonly kind: "cost"; readonly min: number };
80
+
81
+ /** Work interval on a absolute timeline (before folding). */
82
+ export interface WorkInterval {
83
+ /** Stable id for the segment. */
84
+ readonly id: string;
85
+ /** Display label. */
86
+ readonly label: string;
87
+ /** Absolute start (ms, same epoch as spans). */
88
+ readonly startMs: number;
89
+ /** Absolute end. */
90
+ readonly endMs: number;
91
+ /** Peak effect tier. */
92
+ readonly tier: SpanTier;
93
+ /** Span this interval belongs to. */
94
+ readonly spanId: string;
95
+ /** True when this interval carries the typed failure. */
96
+ readonly failed?: boolean;
97
+ }
98
+
99
+ /** Folded-time timeline segment after collapse. */
100
+ export type TimelineSegment =
101
+ | {
102
+ readonly kind: "work";
103
+ readonly id: string;
104
+ readonly label: string;
105
+ readonly startMs: number;
106
+ readonly endMs: number;
107
+ readonly durationMs: number;
108
+ readonly tier: SpanTier;
109
+ readonly spanId: string;
110
+ readonly critical: boolean;
111
+ readonly failed: boolean;
112
+ /** Display width weight (proportional to real work). */
113
+ readonly displayMs: number;
114
+ }
115
+ | {
116
+ readonly kind: "fold";
117
+ readonly id: string;
118
+ readonly startMs: number;
119
+ readonly endMs: number;
120
+ readonly durationMs: number;
121
+ readonly label: string;
122
+ readonly expanded: boolean;
123
+ /** Collapsed folds use a fixed weight; expanded use full duration. */
124
+ readonly displayMs: number;
125
+ };
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "lib": ["ESNext", "DOM", "DOM.Iterable"],
4
+ "target": "ESNext",
5
+ "module": "ESNext",
6
+ "moduleDetection": "force",
7
+ "jsx": "react-jsx",
8
+ "types": ["vite/client", "bun"],
9
+ "moduleResolution": "bundler",
10
+ "allowImportingTsExtensions": true,
11
+ "verbatimModuleSyntax": true,
12
+ "noEmit": true,
13
+ "strict": true,
14
+ "skipLibCheck": true,
15
+ "noUncheckedIndexedAccess": true,
16
+ "noUnusedLocals": true,
17
+ "noUnusedParameters": true
18
+ },
19
+ "include": ["./**/*.ts", "./**/*.tsx"]
20
+ }
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Static Vault markup for the axe gate — same landmarks as the live panel.
3
+ */
4
+
5
+ import { formatBlastRadius } from "./blast-radius.ts";
6
+ import { VAULT_LIST_FIXTURE } from "./fixture.ts";
7
+ import { groupByKind } from "./group.ts";
8
+
9
+ /** Props for {@link VaultA11yView}. */
10
+ export interface VaultA11yViewProps {
11
+ /** Optional contract name to open. */
12
+ readonly openName?: string;
13
+ }
14
+
15
+ /**
16
+ * Accessible Vault list + detail for CI.
17
+ *
18
+ * @param props - Open contract
19
+ */
20
+ export function VaultA11yView(props: VaultA11yViewProps) {
21
+ const groups = groupByKind(VAULT_LIST_FIXTURE.secrets);
22
+ const openName = props.openName ?? "STRIPE_KEY";
23
+ const open = VAULT_LIST_FIXTURE.secrets.find((s) => s.name === openName);
24
+ const blast = open ? formatBlastRadius(open.blastRadius) : null;
25
+ const env = VAULT_LIST_FIXTURE.env;
26
+
27
+ return (
28
+ <div className="vault-a11y">
29
+ <a href="#vault-main">Skip to main content</a>
30
+ <header>
31
+ <h1>Vault</h1>
32
+ <p>Contracts, fingerprints, resolution — never secret values</p>
33
+ <p role="status">Environment {env}</p>
34
+ <label>
35
+ Filter vault
36
+ <input aria-label="Filter vault" defaultValue="" />
37
+ </label>
38
+ </header>
39
+ <main id="vault-main">
40
+ <section aria-label="Vault list">
41
+ <h2>Contracts</h2>
42
+ {groups.map((group) => (
43
+ <section key={group.kind} aria-label={group.label}>
44
+ <h3>{group.label}</h3>
45
+ <ul>
46
+ {group.secrets.map((s) => (
47
+ <li key={s.name}>
48
+ <button
49
+ type="button"
50
+ aria-pressed={s.name === openName}
51
+ style={{ minHeight: 32, width: "100%" }}
52
+ >
53
+ <span>{s.name}</span>
54
+ {s.sensitive && s.fingerprint ? (
55
+ <span> {s.fingerprint}</span>
56
+ ) : null}
57
+ {!s.sensitive && s.cleartext ? (
58
+ <span> {s.cleartext}</span>
59
+ ) : null}
60
+ {s.blastRadius.count > 0 ? (
61
+ <span role="status">
62
+ {" "}
63
+ blast {s.blastRadius.count}
64
+ </span>
65
+ ) : null}
66
+ {s.sharedFingerprintEnvs.length > 0 ? (
67
+ <span role="status"> shared fingerprint</span>
68
+ ) : null}
69
+ </button>
70
+ </li>
71
+ ))}
72
+ </ul>
73
+ </section>
74
+ ))}
75
+ </section>
76
+
77
+ {open ? (
78
+ <section aria-label="Vault detail" aria-live="polite">
79
+ <h2>{open.name}</h2>
80
+ {open.description ? <p>{open.description}</p> : null}
81
+ <p role="status">
82
+ {open.sensitive
83
+ ? `Fingerprint (${env}): ${open.fingerprint ?? "unset"}`
84
+ : `Value: ${open.cleartext ?? "unset"}`}
85
+ </p>
86
+
87
+ <section aria-label="Fingerprints by environment">
88
+ <h3>Fingerprints</h3>
89
+ {open.sensitive ? (
90
+ <ul>
91
+ {Object.entries(open.fingerprints).map(([e, fp]) => (
92
+ <li key={e}>
93
+ {e}: {fp}
94
+ {open.sharedFingerprintEnvs.includes(e) ? (
95
+ <span role="status"> (matches {env})</span>
96
+ ) : null}
97
+ </li>
98
+ ))}
99
+ </ul>
100
+ ) : (
101
+ <p>Config is shown in the clear — not fingerprinted.</p>
102
+ )}
103
+ </section>
104
+
105
+ <section aria-label="Resolution chain">
106
+ <h3>Resolution chain</h3>
107
+ <ol>
108
+ {open.resolution.map((step) => (
109
+ <li key={step.source}>
110
+ {step.source}
111
+ {step.won
112
+ ? " — won"
113
+ : step.present
114
+ ? " — present (lost)"
115
+ : " — absent"}
116
+ </li>
117
+ ))}
118
+ </ol>
119
+ <p role="status">Winner: {open.winner ?? "none"}</p>
120
+ </section>
121
+
122
+ <section aria-label="Readers">
123
+ <h3>Readers</h3>
124
+ <p>
125
+ Flows that declare fx.vault({open.name}):{" "}
126
+ {open.readers.join(", ") || "none"}
127
+ </p>
128
+ </section>
129
+
130
+ <section aria-label="Rotation blast radius">
131
+ <h3>Rotation blast radius</h3>
132
+ {blast ? (
133
+ <>
134
+ <p role={blast.warn ? "alert" : "status"}>{blast.summary}</p>
135
+ {blast.detail ? <p>{blast.detail}</p> : null}
136
+ </>
137
+ ) : null}
138
+ </section>
139
+
140
+ <section aria-label="Last read">
141
+ <h3>Last read</h3>
142
+ <p role="status">
143
+ {open.lastReadAt != null
144
+ ? new Date(open.lastReadAt).toISOString()
145
+ : "Never read — possible dead secret"}
146
+ </p>
147
+ </section>
148
+
149
+ <section aria-label="Set or rotate">
150
+ <h3>Set / rotate</h3>
151
+ <p>Write-only — values are never revealed after submit.</p>
152
+ <label>
153
+ New value
154
+ <input
155
+ aria-label="New vault value"
156
+ type="password"
157
+ autoComplete="off"
158
+ defaultValue=""
159
+ />
160
+ </label>
161
+ <label>
162
+ Confirmation
163
+ <input aria-label="Confirmation phrase" defaultValue="" />
164
+ </label>
165
+ <label>
166
+ Reason
167
+ <input aria-label="Reason for vault write" defaultValue="" />
168
+ </label>
169
+ <button type="button">Set</button>
170
+ <button type="button">Rotate</button>
171
+ </section>
172
+ </section>
173
+ ) : null}
174
+ </main>
175
+ </div>
176
+ );
177
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Accessibility gate — axe reports zero violations at WCAG 2.2 AA
3
+ * (console §7.5 · §9.8).
4
+ */
5
+
6
+ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
7
+ import axe from "axe-core";
8
+ import { Window } from "happy-dom";
9
+ import { createRoot, type Root } from "react-dom/client";
10
+ import { act } from "react";
11
+ import { VaultA11yView } from "./VaultA11yView.tsx";
12
+
13
+ describe("Vault panel accessibility", () => {
14
+ let window: Window;
15
+ let root: Root;
16
+ let container: HTMLElement;
17
+
18
+ beforeEach(() => {
19
+ (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
20
+ true;
21
+ window = new Window({ url: "http://console.test/vault" });
22
+ Object.defineProperty(globalThis, "window", {
23
+ value: window,
24
+ configurable: true,
25
+ writable: true,
26
+ });
27
+ Object.defineProperty(globalThis, "document", {
28
+ value: window.document,
29
+ configurable: true,
30
+ writable: true,
31
+ });
32
+ Object.defineProperty(globalThis, "HTMLElement", {
33
+ value: window.HTMLElement,
34
+ configurable: true,
35
+ writable: true,
36
+ });
37
+ Object.defineProperty(globalThis, "Node", {
38
+ value: window.Node,
39
+ configurable: true,
40
+ writable: true,
41
+ });
42
+ Object.defineProperty(globalThis, "navigator", {
43
+ value: window.navigator,
44
+ configurable: true,
45
+ writable: true,
46
+ });
47
+ Object.defineProperty(globalThis, "getComputedStyle", {
48
+ value: window.getComputedStyle.bind(window),
49
+ configurable: true,
50
+ writable: true,
51
+ });
52
+ Object.defineProperty(globalThis, "requestAnimationFrame", {
53
+ value: (cb: FrameRequestCallback) => window.setTimeout(cb, 0),
54
+ configurable: true,
55
+ writable: true,
56
+ });
57
+
58
+ container = document.createElement("div");
59
+ document.body.appendChild(container);
60
+ root = createRoot(container);
61
+ });
62
+
63
+ afterEach(() => {
64
+ act(() => {
65
+ root.unmount();
66
+ });
67
+ container.remove();
68
+ window.close();
69
+ });
70
+
71
+ test("axe reports zero violations at WCAG 2.2 AA", async () => {
72
+ await act(async () => {
73
+ root.render(<VaultA11yView openName="STRIPE_KEY" />);
74
+ });
75
+
76
+ await new Promise((r) => setTimeout(r, 10));
77
+
78
+ const results = await axe.run(container, {
79
+ runOnly: {
80
+ type: "tag",
81
+ values: ["wcag2a", "wcag2aa", "wcag22aa"],
82
+ },
83
+ });
84
+
85
+ if (results.violations.length > 0) {
86
+ const summary = results.violations
87
+ .map(
88
+ (v) =>
89
+ `${v.id}: ${v.help} (${v.nodes.length} nodes) — ${v.nodes.map((n) => n.html).join("; ")}`,
90
+ )
91
+ .join("\n");
92
+ console.error(summary);
93
+ }
94
+
95
+ expect(results.violations).toEqual([]);
96
+ });
97
+ });
@@ -0,0 +1,35 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { formatBlastRadius, formatDuration } from "./blast-radius.ts";
3
+
4
+ describe("formatBlastRadius", () => {
5
+ test("empty", () => {
6
+ const line = formatBlastRadius({
7
+ count: 0,
8
+ longestWakeAt: null,
9
+ longestOutstandingMs: null,
10
+ runIds: [],
11
+ });
12
+ expect(line.warn).toBe(false);
13
+ expect(line.summary).toContain("No in-flight");
14
+ });
15
+
16
+ test("warns with count and duration", () => {
17
+ const line = formatBlastRadius({
18
+ count: 3,
19
+ longestWakeAt: 1,
20
+ longestOutstandingMs: 3_600_000,
21
+ runIds: ["a", "b", "c"],
22
+ });
23
+ expect(line.warn).toBe(true);
24
+ expect(line.summary).toContain("3");
25
+ expect(line.detail).toContain("1h");
26
+ });
27
+ });
28
+
29
+ describe("formatDuration", () => {
30
+ test("units", () => {
31
+ expect(formatDuration(500)).toBe("500ms");
32
+ expect(formatDuration(5_000)).toBe("5s");
33
+ expect(formatDuration(120_000)).toBe("2m");
34
+ });
35
+ });
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Format journal-queried rotation blast radius for the Vault panel.
3
+ */
4
+
5
+ import type { VaultBlastRadius } from "./types.ts";
6
+
7
+ /** Human-readable blast-radius line. */
8
+ export interface BlastRadiusLine {
9
+ readonly summary: string;
10
+ readonly detail: string | null;
11
+ readonly warn: boolean;
12
+ }
13
+
14
+ /**
15
+ * Format blast radius for display.
16
+ *
17
+ * @param blast - Queried radius
18
+ */
19
+ export function formatBlastRadius(blast: VaultBlastRadius): BlastRadiusLine {
20
+ if (blast.count === 0) {
21
+ return {
22
+ summary: "No in-flight durable runs hold this secret",
23
+ detail: null,
24
+ warn: false,
25
+ };
26
+ }
27
+ const remaining =
28
+ blast.longestOutstandingMs != null
29
+ ? formatDuration(blast.longestOutstandingMs)
30
+ : null;
31
+ return {
32
+ summary: `${blast.count} in-flight durable run(s) will wake holding a new key`,
33
+ detail: remaining
34
+ ? `Longest outstanding wake in ${remaining}`
35
+ : blast.longestWakeAt != null
36
+ ? `Longest wake at ${new Date(blast.longestWakeAt).toISOString()}`
37
+ : null,
38
+ warn: true,
39
+ };
40
+ }
41
+
42
+ /**
43
+ * @param ms - Duration
44
+ */
45
+ export function formatDuration(ms: number): string {
46
+ if (ms < 1_000) return `${ms}ms`;
47
+ const sec = Math.floor(ms / 1_000);
48
+ if (sec < 60) return `${sec}s`;
49
+ const min = Math.floor(sec / 60);
50
+ if (min < 60) return `${min}m`;
51
+ const hr = Math.floor(min / 60);
52
+ if (hr < 48) return `${hr}h`;
53
+ const days = Math.floor(hr / 24);
54
+ return `${days}d`;
55
+ }
@@ -0,0 +1,41 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import {
3
+ rotateConfirmation,
4
+ setConfirmation,
5
+ validateTypedConfirm,
6
+ } from "./confirmation.ts";
7
+
8
+ describe("vault confirmation", () => {
9
+ test("set requires typed confirm in production", () => {
10
+ expect(setConfirmation({ production: true })).toEqual({
11
+ kind: "typed",
12
+ phrase: "SET",
13
+ requireReason: true,
14
+ });
15
+ });
16
+
17
+ test("rotate always requires typed confirm", () => {
18
+ expect(rotateConfirmation({ production: false })).toEqual({
19
+ kind: "typed",
20
+ phrase: "ROTATE",
21
+ requireReason: true,
22
+ });
23
+ });
24
+
25
+ test("validateTypedConfirm", () => {
26
+ expect(
27
+ validateTypedConfirm({
28
+ typed: "ROTATE",
29
+ reason: "key compromise",
30
+ phrase: "ROTATE",
31
+ }),
32
+ ).toBeNull();
33
+ expect(
34
+ validateTypedConfirm({
35
+ typed: "nope",
36
+ reason: "x",
37
+ phrase: "ROTATE",
38
+ }),
39
+ ).not.toBeNull();
40
+ });
41
+ });
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Typed confirmation for vault set / rotate (console §6 · §9.8).
3
+ *
4
+ * There is no preview affordance for Vault — set and rotate are real writes.
5
+ */
6
+
7
+ import {
8
+ type ConfirmationPattern,
9
+ validateTypedConfirm,
10
+ } from "../flows/confirmation.ts";
11
+
12
+ export { validateTypedConfirm };
13
+ export type { ConfirmationPattern };
14
+
15
+ /**
16
+ * Confirmation for setting a vault value.
17
+ *
18
+ * @param options - Environment
19
+ */
20
+ export function setConfirmation(
21
+ options: { readonly production: boolean } = { production: true },
22
+ ): ConfirmationPattern {
23
+ if (options.production) {
24
+ return { kind: "typed", phrase: "SET", requireReason: true };
25
+ }
26
+ // Dev still records a reason-less write; no typed phrase required.
27
+ return { kind: "undo", windowMs: 15_000 };
28
+ }
29
+
30
+ /**
31
+ * Confirmation for rotating a vault value — always typed (blast radius).
32
+ *
33
+ * @param _options - Reserved for environment flags
34
+ */
35
+ export function rotateConfirmation(
36
+ _options: { readonly production: boolean } = { production: true },
37
+ ): ConfirmationPattern {
38
+ return { kind: "typed", phrase: "ROTATE", requireReason: true };
39
+ }