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,80 @@
1
+ /**
2
+ * `openbao` vault driver — HashiCorp Vault / OpenBao KV v2 HTTP API.
3
+ *
4
+ * Protocol-named; image/vendor choice lives in `images`.
5
+ */
6
+
7
+ import type {
8
+ VaultBag,
9
+ VaultDriver,
10
+ VaultOpenOptions,
11
+ } from "./vault-types.ts";
12
+
13
+ /**
14
+ * OpenBao / Vault KV driver.
15
+ *
16
+ * Expects `url` + `token` + optional `mount` (default `secret`).
17
+ * Fetches `GET {url}/v1/{mount}/data/{name}` for each requested secret
18
+ * lazily via a cached bag loaded at open when `secrets` seed keys are listed,
19
+ * or returns empty until {@link VaultBag.get} is called against a remote.
20
+ *
21
+ * For boot validation the runtime passes declared names; this driver loads
22
+ * all keys under `mount` when the LIST API is available, else uses seed names.
23
+ */
24
+ export const openbaoVaultDriver: VaultDriver = {
25
+ id: "openbao",
26
+ async open(options: VaultOpenOptions = {}): Promise<VaultBag> {
27
+ const url = options.url?.replace(/\/$/, "");
28
+ const token = options.token;
29
+ const mount = options.mount ?? "secret";
30
+ const fetchFn = options.fetch ?? globalThis.fetch;
31
+ const map = new Map<string, string>(
32
+ Object.entries(options.secrets ?? {}).filter(
33
+ (e): e is [string, string] => typeof e[1] === "string",
34
+ ),
35
+ );
36
+
37
+ if (url && token) {
38
+ // Best-effort LIST; ignore failures (permission / disabled).
39
+ try {
40
+ const listRes = await fetchFn(`${url}/v1/${mount}/metadata?list=true`, {
41
+ headers: { "X-Vault-Token": token },
42
+ });
43
+ if (listRes.ok) {
44
+ const body = (await listRes.json()) as {
45
+ data?: { keys?: string[] };
46
+ };
47
+ for (const key of body.data?.keys ?? []) {
48
+ const getRes = await fetchFn(`${url}/v1/${mount}/data/${key}`, {
49
+ headers: { "X-Vault-Token": token },
50
+ });
51
+ if (!getRes.ok) continue;
52
+ const got = (await getRes.json()) as {
53
+ data?: { data?: Record<string, unknown> };
54
+ };
55
+ const data = got.data?.data ?? {};
56
+ const value =
57
+ typeof data.value === "string"
58
+ ? data.value
59
+ : typeof data[key] === "string"
60
+ ? (data[key] as string)
61
+ : JSON.stringify(data);
62
+ map.set(key.replace(/\/$/, ""), value);
63
+ }
64
+ }
65
+ } catch {
66
+ // Remote unavailable — bag stays at seed / empty; boot validation reports gaps.
67
+ }
68
+ }
69
+
70
+ return {
71
+ driverId: "openbao",
72
+ get(name) {
73
+ return map.get(name);
74
+ },
75
+ names() {
76
+ return [...map.keys()];
77
+ },
78
+ };
79
+ },
80
+ };
@@ -0,0 +1,252 @@
1
+ /**
2
+ * `sops` vault driver — SOPS/age via Typage (`age-encryption`).
3
+ *
4
+ * Pure TypeScript, in-process. No Go `sops` / `age` binary.
5
+ * Decrypts the SOPS data key with age, then AES-256-GCM value payloads.
6
+ */
7
+
8
+ import * as age from "age-encryption";
9
+ import type {
10
+ VaultBag,
11
+ VaultDriver,
12
+ VaultOpenOptions,
13
+ } from "./vault-types.ts";
14
+
15
+ /** SOPS metadata block. */
16
+ interface SopsMeta {
17
+ readonly age?: ReadonlyArray<{
18
+ readonly recipient?: string;
19
+ readonly enc?: string;
20
+ }>;
21
+ readonly mac?: string;
22
+ }
23
+
24
+ /** Encrypted value marker: `ENC[AES256_GCM,data:…,iv:…,tag:…,type:…]`. */
25
+ const ENC_RE =
26
+ /^ENC\[AES256_GCM,data:(?<data>[^,]+),iv:(?<iv>[^,]+),tag:(?<tag>[^,]+),type:(?<type>[^\]]+)\]$/;
27
+
28
+ /**
29
+ * Decode a URL-safe / standard base64 string to bytes.
30
+ *
31
+ * @param input - Base64 text
32
+ */
33
+ function b64(input: string): Uint8Array {
34
+ const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
35
+ const pad = normalized.length % 4 === 0
36
+ ? normalized
37
+ : normalized + "=".repeat(4 - (normalized.length % 4));
38
+ const bin = atob(pad);
39
+ const out = new Uint8Array(bin.length);
40
+ for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
41
+ return out;
42
+ }
43
+
44
+ /**
45
+ * Encode bytes as standard base64.
46
+ *
47
+ * @param bytes - Input
48
+ */
49
+ function b64encode(bytes: Uint8Array): string {
50
+ let s = "";
51
+ for (const b of bytes) s += String.fromCharCode(b);
52
+ return btoa(s);
53
+ }
54
+
55
+ /**
56
+ * Copy into a fresh `Uint8Array` so Web Crypto accepts it as `BufferSource`.
57
+ *
58
+ * @param bytes - Input
59
+ */
60
+ function asBufferSource(bytes: Uint8Array): Uint8Array<ArrayBuffer> {
61
+ return new Uint8Array(bytes);
62
+ }
63
+
64
+ /**
65
+ * Decrypt a SOPS AES-256-GCM value with the data key.
66
+ *
67
+ * @param enc - `ENC[AES256_GCM,…]` string
68
+ * @param dataKey - 32-byte SOPS data key
69
+ */
70
+ async function decryptValue(
71
+ enc: string,
72
+ dataKey: Uint8Array,
73
+ ): Promise<string> {
74
+ const m = ENC_RE.exec(enc);
75
+ const dataB64 = m?.groups?.data;
76
+ const ivB64 = m?.groups?.iv;
77
+ const tagB64 = m?.groups?.tag;
78
+ if (!dataB64 || !ivB64 || !tagB64) {
79
+ throw new Error(`sops: unrecognized ciphertext: ${enc.slice(0, 32)}…`);
80
+ }
81
+ const data = b64(dataB64);
82
+ const iv = asBufferSource(b64(ivB64));
83
+ const tag = b64(tagB64);
84
+ const key = await crypto.subtle.importKey(
85
+ "raw",
86
+ asBufferSource(dataKey),
87
+ { name: "AES-GCM" },
88
+ false,
89
+ ["decrypt"],
90
+ );
91
+ const cipher = new Uint8Array(data.length + tag.length);
92
+ cipher.set(data, 0);
93
+ cipher.set(tag, data.length);
94
+ const plain = await crypto.subtle.decrypt(
95
+ { name: "AES-GCM", iv },
96
+ key,
97
+ asBufferSource(cipher),
98
+ );
99
+ return new TextDecoder().decode(plain);
100
+ }
101
+
102
+ /**
103
+ * Decrypt the SOPS data key from an age-encrypted stanza using Typage.
104
+ *
105
+ * @param identity - `AGE-SECRET-KEY-…`
106
+ * @param encBlock - Armored age ciphertext from `sops.age[].enc`
107
+ */
108
+ async function decryptDataKey(
109
+ identity: string,
110
+ encBlock: string,
111
+ ): Promise<Uint8Array> {
112
+ const d = new age.Decrypter();
113
+ d.addIdentity(identity.trim());
114
+ const trimmed = encBlock.trim();
115
+ const file: Uint8Array = trimmed.includes("BEGIN AGE ENCRYPTED FILE")
116
+ ? age.armor.decode(trimmed)
117
+ : new TextEncoder().encode(trimmed);
118
+ const bytes = await d.decrypt(file, "uint8array");
119
+ return bytes;
120
+ }
121
+
122
+ /**
123
+ * Parse a SOPS JSON document into a name→ciphertext map + metadata.
124
+ *
125
+ * @param text - File contents
126
+ */
127
+ function parseSopsJson(text: string): {
128
+ values: Record<string, string>;
129
+ meta: SopsMeta;
130
+ } {
131
+ const doc = JSON.parse(text) as Record<string, unknown>;
132
+ const meta = (doc.sops ?? {}) as SopsMeta;
133
+ const values: Record<string, string> = {};
134
+ for (const [k, v] of Object.entries(doc)) {
135
+ if (k === "sops") continue;
136
+ if (typeof v === "string") values[k] = v;
137
+ }
138
+ return { values, meta };
139
+ }
140
+
141
+ /**
142
+ * Encrypt a plaintext with AES-256-GCM into a SOPS-shaped `ENC[…]` string.
143
+ * Exported for tests that build fixtures without the Go CLI.
144
+ *
145
+ * @param plaintext - Cleartext
146
+ * @param dataKey - 32-byte key
147
+ */
148
+ export async function sopsEncryptValue(
149
+ plaintext: string,
150
+ dataKey: Uint8Array,
151
+ ): Promise<string> {
152
+ const iv = crypto.getRandomValues(new Uint8Array(12));
153
+ const key = await crypto.subtle.importKey(
154
+ "raw",
155
+ asBufferSource(dataKey),
156
+ { name: "AES-GCM" },
157
+ false,
158
+ ["encrypt"],
159
+ );
160
+ const cipher = new Uint8Array(
161
+ await crypto.subtle.encrypt(
162
+ { name: "AES-GCM", iv },
163
+ key,
164
+ new TextEncoder().encode(plaintext),
165
+ ),
166
+ );
167
+ const tag = cipher.slice(cipher.length - 16);
168
+ const data = cipher.slice(0, cipher.length - 16);
169
+ return `ENC[AES256_GCM,data:${b64encode(data)},iv:${b64encode(iv)},tag:${b64encode(tag)},type:str]`;
170
+ }
171
+
172
+ /**
173
+ * Build a minimal SOPS JSON document encrypted to an age recipient.
174
+ * Test / fixture helper — not a full `sops` replacement.
175
+ *
176
+ * @param secrets - Cleartext map
177
+ * @param recipient - `age1…` recipient
178
+ * @param dataKey - Optional 32-byte data key (random when omitted)
179
+ */
180
+ export async function buildSopsFixture(
181
+ secrets: Readonly<Record<string, string>>,
182
+ recipient: string,
183
+ dataKey?: Uint8Array,
184
+ ): Promise<{ json: string; dataKey: Uint8Array }> {
185
+ const key = dataKey ?? crypto.getRandomValues(new Uint8Array(32));
186
+ const e = new age.Encrypter();
187
+ e.addRecipient(recipient);
188
+ const encKey = await e.encrypt(key);
189
+ const encBytes =
190
+ typeof encKey === "string" ? new TextEncoder().encode(encKey) : encKey;
191
+ const encArmored = age.armor.encode(encBytes);
192
+ const out: Record<string, unknown> = {};
193
+ for (const [name, value] of Object.entries(secrets)) {
194
+ out[name] = await sopsEncryptValue(value, key);
195
+ }
196
+ out.sops = {
197
+ age: [{ recipient, enc: encArmored }],
198
+ lastmodified: new Date().toISOString(),
199
+ version: "3.8.0",
200
+ };
201
+ return { json: JSON.stringify(out, null, 2), dataKey: key };
202
+ }
203
+
204
+ /**
205
+ * SOPS/age vault driver (Typage).
206
+ */
207
+ export const sopsVaultDriver: VaultDriver = {
208
+ id: "sops",
209
+ async open(options: VaultOpenOptions = {}): Promise<VaultBag> {
210
+ let text: string | undefined;
211
+ if (typeof options.ciphertext === "string") {
212
+ text = options.ciphertext;
213
+ } else if (options.ciphertext instanceof Uint8Array) {
214
+ text = new TextDecoder().decode(options.ciphertext);
215
+ } else if (options.path) {
216
+ text = await Bun.file(options.path).text();
217
+ }
218
+ if (!text) {
219
+ throw new Error("sops vault: path or ciphertext is required");
220
+ }
221
+ if (!options.ageIdentity) {
222
+ throw new Error(
223
+ "sops vault: ageIdentity (AGE-SECRET-KEY-…) is required — Typage decrypts in-process",
224
+ );
225
+ }
226
+
227
+ const { values, meta } = parseSopsJson(text);
228
+ const stanza = meta.age?.[0]?.enc;
229
+ if (!stanza) {
230
+ throw new Error("sops vault: no age recipient stanza found");
231
+ }
232
+ const dataKey = await decryptDataKey(options.ageIdentity, stanza);
233
+ const map = new Map<string, string>();
234
+ for (const [name, enc] of Object.entries(values)) {
235
+ if (enc.startsWith("ENC[")) {
236
+ map.set(name, await decryptValue(enc, dataKey));
237
+ } else {
238
+ map.set(name, enc);
239
+ }
240
+ }
241
+
242
+ return {
243
+ driverId: "sops",
244
+ get(name) {
245
+ return map.get(name);
246
+ },
247
+ names() {
248
+ return [...map.keys()];
249
+ },
250
+ };
251
+ },
252
+ };
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Protocol-named vault driver contracts.
3
+ *
4
+ * Driver ids: `sops` · `env` · `openbao` · `infisical` · `managed` · `memory`.
5
+ * Never vendor names (`neon`, `infisical-cloud`, …) — vendor choice lives in `images`.
6
+ */
7
+
8
+ /** Protocol ids for vault drivers. */
9
+ export type VaultDriverId =
10
+ | "sops"
11
+ | "env"
12
+ | "openbao"
13
+ | "infisical"
14
+ | "managed"
15
+ | "memory";
16
+
17
+ /** Options when opening a vault backend. */
18
+ export interface VaultOpenOptions {
19
+ /**
20
+ * Path to a SOPS-encrypted file (`sops` driver) or a dotenv file (`env` driver).
21
+ * Prefer JSON / ENV formats produced by `sops -e` for SOPS.
22
+ */
23
+ readonly path?: string;
24
+ /** Inline SOPS ciphertext (tests). */
25
+ readonly ciphertext?: string | Uint8Array;
26
+ /** Age identity (`AGE-SECRET-KEY-…`) for Typage decryption. */
27
+ readonly ageIdentity?: string;
28
+ /** Env prefix filter for the `env` driver (default: none — whole `process.env`). */
29
+ readonly envPrefix?: string;
30
+ /** Injected env map for tests (defaults to `process.env`). */
31
+ readonly env?: Readonly<Record<string, string | undefined>>;
32
+ /** OpenBao / Infisical / managed base URL. */
33
+ readonly url?: string;
34
+ /** Token / API key for remote vaults. */
35
+ readonly token?: string;
36
+ /** Mount / project path for remote vaults. */
37
+ readonly mount?: string;
38
+ /** Seed map for `memory` / `managed` drivers. */
39
+ readonly secrets?: Readonly<Record<string, string>>;
40
+ /** HTTP fetch override for remote drivers (tests). */
41
+ readonly fetch?: typeof globalThis.fetch;
42
+ }
43
+
44
+ /** Resolved secret bag — names → cleartext values. Never logged. */
45
+ export interface VaultBag {
46
+ /** Protocol driver id. */
47
+ readonly driverId: VaultDriverId;
48
+ /**
49
+ * Read a secret by name.
50
+ *
51
+ * @param name - Secret contract name
52
+ */
53
+ get(name: string): string | undefined;
54
+ /** All names present in this bag. */
55
+ names(): readonly string[];
56
+ /**
57
+ * Write / overwrite a secret (mutable bags: `memory` · `managed`).
58
+ * Used for per-subject crypto-shred keys in the runs store.
59
+ *
60
+ * @param name - Secret name
61
+ * @param value - Cleartext
62
+ */
63
+ set?(name: string, value: string): void;
64
+ /**
65
+ * Delete a secret (mutable bags). Erasure deletes the key, not the bytes.
66
+ *
67
+ * @param name - Secret name
68
+ */
69
+ delete?(name: string): boolean;
70
+ /** Close remote clients when applicable. */
71
+ close?(): Promise<void>;
72
+ }
73
+
74
+ /** Vault driver factory. */
75
+ export interface VaultDriver {
76
+ /** Protocol id. */
77
+ readonly id: VaultDriverId;
78
+ /**
79
+ * Open a secret bag.
80
+ *
81
+ * @param options - Driver-specific open options
82
+ */
83
+ open(options?: VaultOpenOptions): Promise<VaultBag>;
84
+ }
@@ -0,0 +1,206 @@
1
+ /**
2
+ * AI declaration — models, versioned prompts, embeds, agents.
3
+ *
4
+ * Physics: inference · prompts · embeddings · agents.
5
+ */
6
+
7
+ /** Budget for a prompt or agent. */
8
+ export interface AiBudgetDecl {
9
+ readonly maxCostPerCall?: number;
10
+ readonly maxCostPerRun?: number;
11
+ }
12
+
13
+ /** Options for {@link ai.model}. */
14
+ export interface AiModelOptions {
15
+ readonly provider?: string;
16
+ readonly tier?: string;
17
+ readonly model?: string;
18
+ }
19
+
20
+ /** Options for {@link AiModelDecl.prompt}. */
21
+ export interface AiPromptOptions {
22
+ readonly version?: number;
23
+ readonly evals?: string;
24
+ readonly budget?: AiBudgetDecl;
25
+ readonly in?: unknown;
26
+ readonly out?: unknown;
27
+ }
28
+
29
+ /** Options for {@link ai.embed}. */
30
+ export interface AiEmbedOptions {
31
+ readonly model?: AiModelDecl | string;
32
+ readonly into?: { readonly name: string; readonly facet?: string } | string;
33
+ }
34
+
35
+ /** Options for {@link ai.agent}. */
36
+ export interface AiAgentOptions {
37
+ readonly model?: AiModelDecl | string;
38
+ readonly tools?: readonly ({ readonly name: string } | string)[];
39
+ readonly maxSteps?: number;
40
+ readonly budget?: AiBudgetDecl;
41
+ }
42
+
43
+ /** Declared model handle — can mint prompts. */
44
+ export interface AiModelDecl {
45
+ readonly kind: "model";
46
+ readonly name: string;
47
+ readonly provider?: string;
48
+ readonly tier?: string;
49
+ readonly model?: string;
50
+ /**
51
+ * Declare a versioned prompt artifact on this model.
52
+ *
53
+ * @param name - Prompt id
54
+ * @param options - Version / evals / schemas / budget
55
+ */
56
+ prompt(name: string, options?: AiPromptOptions): AiPromptDecl;
57
+ }
58
+
59
+ /** Declared versioned prompt. */
60
+ export interface AiPromptDecl {
61
+ readonly kind: "prompt";
62
+ readonly name: string;
63
+ readonly version?: number;
64
+ readonly evals?: string;
65
+ readonly budget?: AiBudgetDecl;
66
+ readonly model?: string;
67
+ readonly in?: unknown;
68
+ readonly out?: unknown;
69
+ }
70
+
71
+ /** Declared embedding pipeline into `store.index`. */
72
+ export interface AiEmbedDecl {
73
+ readonly kind: "embed";
74
+ readonly name: string;
75
+ readonly model?: string;
76
+ readonly into?: string;
77
+ }
78
+
79
+ /** Declared agent whose tools are flows. */
80
+ export interface AiAgentDecl {
81
+ readonly kind: "agent";
82
+ readonly name: string;
83
+ readonly tools: readonly string[];
84
+ readonly maxSteps?: number;
85
+ readonly model?: string;
86
+ readonly budget?: AiBudgetDecl;
87
+ }
88
+
89
+ /**
90
+ * Resolve a tool ref to a flow name.
91
+ *
92
+ * @param tool - Flow handle or string
93
+ */
94
+ function toolName(tool: { readonly name: string } | string): string {
95
+ return typeof tool === "string" ? tool : tool.name;
96
+ }
97
+
98
+ /**
99
+ * Shape of the {@link ai} element namespace.
100
+ */
101
+ export interface AiNamespace {
102
+ /**
103
+ * Declare a model binding.
104
+ *
105
+ * @param name - Logical model name (`smart`, `fast`, …)
106
+ * @param options - Provider / tier / model id
107
+ */
108
+ model(name: string, options?: AiModelOptions): AiModelDecl;
109
+ /**
110
+ * Declare an embedding pipeline into a store.index.
111
+ *
112
+ * @param name - Embed id
113
+ * @param options - Model + destination index
114
+ */
115
+ embed(name: string, options?: AiEmbedOptions): AiEmbedDecl;
116
+ /**
117
+ * Declare a bounded agent whose tools are the app's own flows.
118
+ *
119
+ * @param name - Agent id
120
+ * @param options - Tools / maxSteps / model / budget
121
+ */
122
+ agent(name: string, options?: AiAgentOptions): AiAgentDecl;
123
+ }
124
+
125
+ /**
126
+ * AI element namespace.
127
+ */
128
+ export const ai: AiNamespace = {
129
+ /**
130
+ * Declare a model binding.
131
+ *
132
+ * @param name - Logical model name (`smart`, `fast`, …)
133
+ * @param options - Provider / tier / model id
134
+ */
135
+ model(name: string, options: AiModelOptions = {}): AiModelDecl {
136
+ if (!name) throw new TypeError("ai.model: name is required");
137
+ const decl: AiModelDecl = {
138
+ kind: "model",
139
+ name,
140
+ ...(options.provider !== undefined ? { provider: options.provider } : {}),
141
+ ...(options.tier !== undefined ? { tier: options.tier } : {}),
142
+ ...(options.model !== undefined ? { model: options.model } : {}),
143
+ prompt(promptName, promptOpts = {}) {
144
+ return {
145
+ kind: "prompt",
146
+ name: promptName,
147
+ model: name,
148
+ ...(promptOpts.version !== undefined
149
+ ? { version: promptOpts.version }
150
+ : {}),
151
+ ...(promptOpts.evals !== undefined ? { evals: promptOpts.evals } : {}),
152
+ ...(promptOpts.budget !== undefined
153
+ ? { budget: promptOpts.budget }
154
+ : {}),
155
+ ...(promptOpts.in !== undefined ? { in: promptOpts.in } : {}),
156
+ ...(promptOpts.out !== undefined ? { out: promptOpts.out } : {}),
157
+ };
158
+ },
159
+ };
160
+ return decl;
161
+ },
162
+
163
+ /**
164
+ * Declare an embedding pipeline into a store.index.
165
+ *
166
+ * @param name - Embed id
167
+ * @param options - Model + destination index
168
+ */
169
+ embed(name: string, options: AiEmbedOptions = {}): AiEmbedDecl {
170
+ const model =
171
+ typeof options.model === "string"
172
+ ? options.model
173
+ : options.model?.name;
174
+ const into =
175
+ typeof options.into === "string"
176
+ ? options.into
177
+ : options.into?.name;
178
+ return {
179
+ kind: "embed",
180
+ name,
181
+ ...(model !== undefined ? { model } : {}),
182
+ ...(into !== undefined ? { into } : {}),
183
+ };
184
+ },
185
+
186
+ /**
187
+ * Declare a bounded agent whose tools are the app's own flows.
188
+ *
189
+ * @param name - Agent id
190
+ * @param options - Tools / maxSteps / model / budget
191
+ */
192
+ agent(name: string, options: AiAgentOptions = {}): AiAgentDecl {
193
+ return {
194
+ kind: "agent",
195
+ name,
196
+ tools: (options.tools ?? []).map(toolName),
197
+ ...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),
198
+ ...(options.budget !== undefined ? { budget: options.budget } : {}),
199
+ ...(typeof options.model === "string"
200
+ ? { model: options.model }
201
+ : options.model?.name !== undefined
202
+ ? { model: options.model.name }
203
+ : {}),
204
+ };
205
+ },
206
+ };