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,138 @@
1
+ /**
2
+ * Attachment-point scoping — proven by test, not by convention.
3
+ *
4
+ * Gate: bun test src/kernel/plugin
5
+ */
6
+
7
+ import { beforeEach, describe, expect, test } from "bun:test";
8
+ import { oke } from "../app.ts";
9
+ import { flow, resetFlowSeq } from "../flow.ts";
10
+ import { on, resetBindings } from "../on.ts";
11
+ import { plugin } from "../plugin.ts";
12
+ import { http } from "../triggers.ts";
13
+
14
+ beforeEach(() => {
15
+ resetBindings();
16
+ resetFlowSeq();
17
+ });
18
+
19
+ describe("plugin scoping — attachment point is the scope", () => {
20
+ test("unit-scoped plugin hook does not fire for another unit's flows", async () => {
21
+ const fired: string[] = [];
22
+
23
+ const ordersFlow = flow({
24
+ name: "orders.create",
25
+ unit: "orders",
26
+ do: () => {
27
+ fired.push("orders:handler");
28
+ return { ok: true };
29
+ },
30
+ });
31
+
32
+ const paymentsFlow = flow({
33
+ name: "payments.charge",
34
+ unit: "payments",
35
+ do: () => {
36
+ fired.push("payments:handler");
37
+ return { ok: true };
38
+ },
39
+ });
40
+
41
+ on(http.get("/orders"), ordersFlow);
42
+ on(http.get("/payments"), paymentsFlow);
43
+
44
+ const rateLimit = plugin("rate-limit", {
45
+ version: "1.0.0",
46
+ config: { max: 30 },
47
+ }).hook("beforeHandle", () => {
48
+ fired.push("rate-limit");
49
+ });
50
+
51
+ const app = oke({ name: "scoping" });
52
+ app.unit("orders").plug(rateLimit);
53
+
54
+ await app.fetch(new Request("http://localhost/orders"));
55
+ await app.fetch(new Request("http://localhost/payments"));
56
+
57
+ expect(fired).toEqual([
58
+ "rate-limit",
59
+ "orders:handler",
60
+ "payments:handler",
61
+ ]);
62
+ });
63
+
64
+ test("app-scoped plugin hook fires for every unit", async () => {
65
+ const fired: string[] = [];
66
+
67
+ on(
68
+ http.get("/a"),
69
+ flow({
70
+ name: "a",
71
+ unit: "alpha",
72
+ do: () => {
73
+ fired.push("a");
74
+ return {};
75
+ },
76
+ }),
77
+ );
78
+ on(
79
+ http.get("/b"),
80
+ flow({
81
+ name: "b",
82
+ unit: "beta",
83
+ do: () => {
84
+ fired.push("b");
85
+ return {};
86
+ },
87
+ }),
88
+ );
89
+
90
+ const audit = plugin("audit", { version: "1.0.0" }).hook(
91
+ "afterHandle",
92
+ () => {
93
+ fired.push("audit");
94
+ },
95
+ );
96
+
97
+ const app = oke({ name: "app-scope" }).plug(audit);
98
+
99
+ await app.fetch(new Request("http://localhost/a"));
100
+ await app.fetch(new Request("http://localhost/b"));
101
+
102
+ expect(fired).toEqual(["a", "audit", "b", "audit"]);
103
+ });
104
+
105
+ test("flow-scoped plugin hook fires only for that flow", async () => {
106
+ const fired: string[] = [];
107
+
108
+ const marked = flow({
109
+ name: "marked",
110
+ do: () => {
111
+ fired.push("marked");
112
+ return {};
113
+ },
114
+ }).plug(
115
+ plugin("mark", { version: "1.0.0" }).hook("beforeHandle", () => {
116
+ fired.push("mark-hook");
117
+ }),
118
+ );
119
+
120
+ const plain = flow({
121
+ name: "plain",
122
+ do: () => {
123
+ fired.push("plain");
124
+ return {};
125
+ },
126
+ });
127
+
128
+ on(http.get("/marked"), marked);
129
+ on(http.get("/plain"), plain);
130
+
131
+ const app = oke({ name: "flow-scope" });
132
+
133
+ await app.fetch(new Request("http://localhost/marked"));
134
+ await app.fetch(new Request("http://localhost/plain"));
135
+
136
+ expect(fired).toEqual(["mark-hook", "marked", "plain"]);
137
+ });
138
+ });
@@ -0,0 +1,485 @@
1
+ /**
2
+ * `plugin(name, { version })` — the extensibility builder.
3
+ *
4
+ * A plugin is a registration plan. Fluent methods queue contributions; at
5
+ * `.plug()` time the registry runs that plan against a builder it supplies
6
+ * and records exactly what was requested (capability capture). We never
7
+ * statically analyse plugin source to guess intent.
8
+ *
9
+ * Contributions: flows · hooks · context decorations · elements · drivers ·
10
+ * image recipes · DB schema · typed errors · client extensions · CLI
11
+ * commands · Console panels.
12
+ *
13
+ * @see docs/spec/unified-theory.md §14
14
+ * @see docs/spec/console.md §9.15
15
+ */
16
+
17
+ import type { SchemaInput } from "../validation/standard-schema.ts";
18
+ import type { AnyFlowDef, FlowErrorMap } from "./flow.ts";
19
+ import type { HookFn, HookStage } from "./hooks.ts";
20
+
21
+ /** Brand carrying accumulated decoration types through the builder. */
22
+ declare const pluginDecorations: unique symbol;
23
+
24
+ /** Identity + version for a plugin definition. */
25
+ export interface PluginIdentity {
26
+ /** Stable plugin id (Manifest key). */
27
+ readonly name: string;
28
+ /** Semver string recorded in the Manifest. */
29
+ readonly version: string;
30
+ /**
31
+ * Optional config snapshot used for identity dedup.
32
+ * Same name + same config → no-op; same name + different config → boot error.
33
+ */
34
+ readonly config?: unknown;
35
+ }
36
+
37
+ /** Options for {@link plugin}. */
38
+ export interface PluginOptions {
39
+ /** Semver string recorded in the Manifest. */
40
+ readonly version: string;
41
+ /**
42
+ * Optional config snapshot for identity dedup when the same plugin is
43
+ * plugged more than once (e.g. `rateLimit({ max: 30 })`).
44
+ */
45
+ readonly config?: unknown;
46
+ }
47
+
48
+ /** Element contribution (store, signal, …) — opaque until elements ship. */
49
+ export interface PluginElement {
50
+ /** Protocol / facet kind (e.g. `"store.sql"`). */
51
+ readonly kind: string;
52
+ /** Element name within that kind (e.g. `"audit"`). */
53
+ readonly name: string;
54
+ }
55
+
56
+ /** Console panel contribution. */
57
+ export interface ConsolePanelContribution {
58
+ /** Panel id — conflict namespace shared across plugins. */
59
+ readonly id: string;
60
+ /** Display title. */
61
+ readonly title: string;
62
+ /** ESM entry path loaded at runtime by the Console. */
63
+ readonly entry: string;
64
+ }
65
+
66
+ /** CLI command contribution. */
67
+ export interface CliContribution {
68
+ /** Command name (e.g. `"audit:export"`). */
69
+ readonly name: string;
70
+ /** Handler invoked by the CLI. */
71
+ readonly handler: (args: { readonly fx: unknown }) => unknown;
72
+ }
73
+
74
+ /** Client extension contribution. */
75
+ export interface ClientExtensionContribution {
76
+ /** Extension id. */
77
+ readonly name: string;
78
+ /** Opaque extension payload. */
79
+ readonly extension: unknown;
80
+ }
81
+
82
+ /** Image recipe contribution (role → recipe id). */
83
+ export interface ImageRecipeContribution {
84
+ /** Image role (e.g. `"store.sql"`). */
85
+ readonly role: string;
86
+ /** Recipe identifier or descriptor. */
87
+ readonly recipe: string;
88
+ }
89
+
90
+ /** Table / DB schema contribution. */
91
+ export interface TableContribution {
92
+ /** Table name — conflict namespace shared across plugins. */
93
+ readonly name: string;
94
+ /** Opaque schema descriptor. */
95
+ readonly schema?: unknown;
96
+ }
97
+
98
+ /** Driver contribution. */
99
+ export interface DriverContribution {
100
+ /** Driver id (protocol-named) — conflict namespace shared across plugins. */
101
+ readonly id: string;
102
+ /** Opaque driver implementation / factory. */
103
+ readonly implementation?: unknown;
104
+ }
105
+
106
+ /**
107
+ * Builder surface supplied at boot for capability capture.
108
+ * Method calls are the source of truth for Manifest capabilities.
109
+ */
110
+ export interface PluginApi {
111
+ /**
112
+ * Register a hook (intercept — per request).
113
+ *
114
+ * @param stage - Pipeline stage
115
+ * @param fn - Hook function
116
+ */
117
+ hook(stage: HookStage, fn: HookFn): PluginApi;
118
+ /**
119
+ * Decorate the invocation context (declare — once at boot).
120
+ *
121
+ * @param key - Decoration key
122
+ * @param value - Value visible to handlers in scope
123
+ */
124
+ decorate(key: string, value: unknown): PluginApi;
125
+ /**
126
+ * Contribute an element.
127
+ *
128
+ * @param element - Kind + name
129
+ */
130
+ element(element: PluginElement): PluginApi;
131
+ /**
132
+ * Declare a runtime dependency on another capability.
133
+ *
134
+ * @param dep - Dependency id (e.g. `"store.kv"`)
135
+ */
136
+ needs(dep: string): PluginApi;
137
+ /**
138
+ * Contribute typed errors.
139
+ *
140
+ * @param errors - Error name → schema
141
+ */
142
+ errors(errors: FlowErrorMap): PluginApi;
143
+ /**
144
+ * Contribute a Console panel.
145
+ *
146
+ * @param panel - Panel descriptor
147
+ */
148
+ consolePanel(panel: ConsolePanelContribution): PluginApi;
149
+ /**
150
+ * Contribute a CLI command.
151
+ *
152
+ * @param name - Command name
153
+ * @param handler - Command handler
154
+ */
155
+ cli(
156
+ name: string,
157
+ handler: CliContribution["handler"],
158
+ ): PluginApi;
159
+ /**
160
+ * Contribute a driver.
161
+ *
162
+ * @param id - Protocol-named driver id
163
+ * @param implementation - Driver impl
164
+ */
165
+ driver(id: string, implementation?: unknown): PluginApi;
166
+ /**
167
+ * Contribute an image recipe for a role.
168
+ *
169
+ * @param role - Image role
170
+ * @param recipe - Recipe id
171
+ */
172
+ image(role: string, recipe: string): PluginApi;
173
+ /**
174
+ * Contribute a DB table / schema fragment.
175
+ *
176
+ * @param name - Table name
177
+ * @param schema - Opaque schema
178
+ */
179
+ table(name: string, schema?: unknown): PluginApi;
180
+ /**
181
+ * Contribute a flow.
182
+ *
183
+ * @param flowDef - Flow definition
184
+ */
185
+ flow(flowDef: AnyFlowDef): PluginApi;
186
+ /**
187
+ * Contribute a typed client extension.
188
+ *
189
+ * @param name - Extension id
190
+ * @param extension - Opaque extension
191
+ */
192
+ client(name: string, extension: unknown): PluginApi;
193
+ /**
194
+ * Attach a config schema (declare shape; values live on identity.config).
195
+ *
196
+ * @param schema - Standard Schema
197
+ */
198
+ config(schema: SchemaInput): PluginApi;
199
+ }
200
+
201
+ /** Captured capability lists for the Manifest. */
202
+ export interface PluginCapabilities {
203
+ /** Plugin id. */
204
+ readonly name: string;
205
+ /** Plugin version. */
206
+ readonly version: string;
207
+ /** Boot-time declarations (schema, elements, drivers, panels, CLI, …). */
208
+ readonly declares: readonly string[];
209
+ /** Per-request intercepts (hook stages). */
210
+ readonly intercepts: readonly string[];
211
+ /** Declared dependencies from `.needs()`. */
212
+ readonly needs: readonly string[];
213
+ }
214
+
215
+ /** Snapshot of everything a registration requested. */
216
+ export interface PluginRegistration {
217
+ readonly capabilities: PluginCapabilities;
218
+ readonly hooks: Partial<Record<HookStage, HookFn[]>>;
219
+ readonly decorations: Readonly<Record<string, unknown>>;
220
+ readonly elements: readonly PluginElement[];
221
+ readonly tables: readonly TableContribution[];
222
+ readonly drivers: readonly DriverContribution[];
223
+ readonly panels: readonly ConsolePanelContribution[];
224
+ readonly cli: readonly CliContribution[];
225
+ readonly images: readonly ImageRecipeContribution[];
226
+ readonly flows: readonly AnyFlowDef[];
227
+ readonly errors: FlowErrorMap;
228
+ readonly client: readonly ClientExtensionContribution[];
229
+ readonly configSchema: SchemaInput | undefined;
230
+ }
231
+
232
+ /**
233
+ * A plugin definition — identity plus a registration function.
234
+ *
235
+ * @typeParam D - Accumulated decoration types from `.decorate()`
236
+ */
237
+ export interface PluginDef<D extends Record<string, unknown> = {}> {
238
+ readonly [pluginDecorations]?: D;
239
+ /** Plugin name. */
240
+ readonly name: string;
241
+ /** Plugin version. */
242
+ readonly version: string;
243
+ /**
244
+ * Config snapshot for identity dedup (from {@link PluginOptions.config}).
245
+ * Distinct from the fluent `.config(schema)` method.
246
+ */
247
+ readonly configSnapshot: unknown;
248
+ /**
249
+ * Registration function. The registry calls this with a builder and
250
+ * records every method invoked — that recording is the capability list.
251
+ *
252
+ * @param api - Builder supplied by the registry
253
+ */
254
+ register(api: PluginApi): void;
255
+ /**
256
+ * Queue a hook contribution.
257
+ *
258
+ * @param stage - Pipeline stage
259
+ * @param fn - Hook function
260
+ */
261
+ hook(stage: HookStage, fn: HookFn): PluginDef<D>;
262
+ /**
263
+ * Queue a context decoration. Accumulates types for `.plug()`.
264
+ *
265
+ * @param key - Decoration key
266
+ * @param value - Value
267
+ */
268
+ decorate<K extends string, V>(
269
+ key: K,
270
+ value: V,
271
+ ): PluginDef<D & { [P in K]: V }>;
272
+ /**
273
+ * Queue an element contribution.
274
+ *
275
+ * @param element - Element descriptor
276
+ */
277
+ element(element: PluginElement): PluginDef<D>;
278
+ /**
279
+ * Queue a dependency declaration.
280
+ *
281
+ * @param dep - Dependency id
282
+ */
283
+ needs(dep: string): PluginDef<D>;
284
+ /**
285
+ * Queue typed errors.
286
+ *
287
+ * @param errors - Error map
288
+ */
289
+ errors(errors: FlowErrorMap): PluginDef<D>;
290
+ /**
291
+ * Queue a Console panel.
292
+ *
293
+ * @param panel - Panel descriptor
294
+ */
295
+ consolePanel(panel: ConsolePanelContribution): PluginDef<D>;
296
+ /**
297
+ * Queue a CLI command.
298
+ *
299
+ * @param name - Command name
300
+ * @param handler - Handler
301
+ */
302
+ cli(name: string, handler: CliContribution["handler"]): PluginDef<D>;
303
+ /**
304
+ * Queue a driver.
305
+ *
306
+ * @param id - Driver id
307
+ * @param implementation - Impl
308
+ */
309
+ driver(id: string, implementation?: unknown): PluginDef<D>;
310
+ /**
311
+ * Queue an image recipe.
312
+ *
313
+ * @param role - Role
314
+ * @param recipe - Recipe id
315
+ */
316
+ image(role: string, recipe: string): PluginDef<D>;
317
+ /**
318
+ * Queue a table / schema contribution.
319
+ *
320
+ * @param name - Table name
321
+ * @param schema - Schema
322
+ */
323
+ table(name: string, schema?: unknown): PluginDef<D>;
324
+ /**
325
+ * Queue a flow contribution.
326
+ *
327
+ * @param flowDef - Flow
328
+ */
329
+ flow(flowDef: AnyFlowDef): PluginDef<D>;
330
+ /**
331
+ * Queue a client extension.
332
+ *
333
+ * @param name - Extension id
334
+ * @param extension - Payload
335
+ */
336
+ client(name: string, extension: unknown): PluginDef<D>;
337
+ /**
338
+ * Queue a config schema.
339
+ *
340
+ * @param schema - Standard Schema
341
+ */
342
+ config(schema: SchemaInput): PluginDef<D>;
343
+ }
344
+
345
+ /** Extract accumulated decoration types from a {@link PluginDef}. */
346
+ export type DecorationsOf<P> =
347
+ P extends PluginDef<infer D> ? D : Record<string, never>;
348
+
349
+ /**
350
+ * Define a plugin. Fluent methods queue a registration plan; the registry
351
+ * executes that plan at `.plug()` time for capability capture.
352
+ *
353
+ * @param name - Stable plugin id
354
+ * @param options - Version and optional config snapshot
355
+ */
356
+ export function plugin(
357
+ name: string,
358
+ options: PluginOptions,
359
+ ): PluginDef {
360
+ const steps: Array<(api: PluginApi) => void> = [];
361
+
362
+ const def: PluginDef = {
363
+ name,
364
+ version: options.version,
365
+ configSnapshot: options.config,
366
+ register(api) {
367
+ for (const step of steps) step(api);
368
+ },
369
+ hook(stage, fn) {
370
+ steps.push((api) => {
371
+ api.hook(stage, fn);
372
+ });
373
+ return def;
374
+ },
375
+ decorate(key, value) {
376
+ steps.push((api) => {
377
+ api.decorate(key, value);
378
+ });
379
+ // Decoration accumulate on the interface; runtime object is unchanged.
380
+ return def as never;
381
+ },
382
+ element(element) {
383
+ steps.push((api) => {
384
+ // Accept StoreDecl-like `{ facet, name }` from `store.sql(...)`.
385
+ const el = element as PluginElement & {
386
+ readonly facet?: string;
387
+ readonly name?: string;
388
+ };
389
+ if (el.kind && el.name) {
390
+ api.element(el);
391
+ } else if (typeof el.facet === "string" && typeof el.name === "string") {
392
+ api.element({
393
+ kind: el.facet.startsWith("store.")
394
+ ? el.facet
395
+ : `store.${el.facet}`,
396
+ name: el.name,
397
+ });
398
+ } else {
399
+ api.element(el as PluginElement);
400
+ }
401
+ });
402
+ return def;
403
+ },
404
+ needs(dep) {
405
+ steps.push((api) => {
406
+ api.needs(dep);
407
+ });
408
+ return def;
409
+ },
410
+ errors(errors) {
411
+ steps.push((api) => {
412
+ api.errors(errors);
413
+ });
414
+ return def;
415
+ },
416
+ consolePanel(panel) {
417
+ steps.push((api) => {
418
+ api.consolePanel(panel);
419
+ });
420
+ return def;
421
+ },
422
+ cli(cliName, handler) {
423
+ steps.push((api) => {
424
+ api.cli(cliName, handler);
425
+ });
426
+ return def;
427
+ },
428
+ driver(id, implementation) {
429
+ steps.push((api) => {
430
+ api.driver(id, implementation);
431
+ });
432
+ return def;
433
+ },
434
+ image(role, recipe) {
435
+ steps.push((api) => {
436
+ api.image(role, recipe);
437
+ });
438
+ return def;
439
+ },
440
+ table(tableName, schema) {
441
+ steps.push((api) => {
442
+ api.table(tableName, schema);
443
+ });
444
+ return def;
445
+ },
446
+ flow(flowDef) {
447
+ steps.push((api) => {
448
+ api.flow(flowDef);
449
+ });
450
+ return def;
451
+ },
452
+ client(clientName, extension) {
453
+ steps.push((api) => {
454
+ api.client(clientName, extension);
455
+ });
456
+ return def;
457
+ },
458
+ config(schema) {
459
+ steps.push((api) => {
460
+ api.config(schema);
461
+ });
462
+ return def;
463
+ },
464
+ };
465
+
466
+ return def;
467
+ }
468
+
469
+ /**
470
+ * Type guard for {@link PluginDef}.
471
+ *
472
+ * @param value - Unknown
473
+ */
474
+ export function isPlugin(value: unknown): value is PluginDef {
475
+ return (
476
+ typeof value === "object" &&
477
+ value !== null &&
478
+ "name" in value &&
479
+ "version" in value &&
480
+ "register" in value &&
481
+ typeof (value as PluginDef).register === "function" &&
482
+ typeof (value as PluginDef).name === "string" &&
483
+ typeof (value as PluginDef).version === "string"
484
+ );
485
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `rateLimit({ max, per })` — convenience unit/app plugin for Provisions.
3
+ */
4
+
5
+ import { plugin, type PluginDef } from "./plugin.ts";
6
+
7
+ /** Options for {@link rateLimit}. */
8
+ export interface RateLimitPluginOptions {
9
+ /** Max requests in the window. */
10
+ readonly max: number;
11
+ /** Window duration (default `"1m"`). */
12
+ readonly per?: string;
13
+ }
14
+
15
+ /**
16
+ * Create a rate-limit plugin scoped by attachment point.
17
+ *
18
+ * @param options - Max / window
19
+ */
20
+ export function rateLimit(options: RateLimitPluginOptions): PluginDef {
21
+ return plugin("rate-limit", {
22
+ version: "1.0.0",
23
+ config: { max: options.max, per: options.per ?? "1m" },
24
+ });
25
+ }