okengine 0.18.4 → 0.19.0

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 (512) hide show
  1. package/AGENTS.md +18 -10
  2. package/README.md +2 -2
  3. package/package.json +51 -50
  4. package/site/content/docs/ai/index.mdx +25 -6
  5. package/site/content/docs/ai/llms-txt.mdx +1 -1
  6. package/site/content/docs/ai/meta.json +1 -1
  7. package/site/content/docs/ai/skills.mdx +4 -1
  8. package/site/content/docs/ai/try-it.mdx +58 -0
  9. package/site/content/docs/client/auth.mdx +208 -0
  10. package/site/content/docs/client/calling.mdx +451 -0
  11. package/site/content/docs/client/index.mdx +209 -0
  12. package/site/content/docs/client/live.mdx +234 -0
  13. package/site/content/docs/client/meta.json +5 -0
  14. package/site/content/docs/client/react.mdx +249 -0
  15. package/site/content/docs/elements/ai/agents.mdx +232 -0
  16. package/site/content/docs/elements/ai/index.mdx +341 -0
  17. package/site/content/docs/elements/ai/mcp.mdx +275 -0
  18. package/site/content/docs/elements/ai/meta.json +5 -0
  19. package/site/content/docs/elements/ai/models.mdx +283 -0
  20. package/site/content/docs/elements/ai/prompts.mdx +256 -0
  21. package/site/content/docs/elements/channel/email.mdx +266 -0
  22. package/site/content/docs/elements/channel/index.mdx +344 -0
  23. package/site/content/docs/elements/channel/meta.json +5 -0
  24. package/site/content/docs/elements/channel/push.mdx +218 -0
  25. package/site/content/docs/elements/channel/receipts.mdx +206 -0
  26. package/site/content/docs/elements/channel/sms.mdx +264 -0
  27. package/site/content/docs/elements/channel/whatsapp.mdx +220 -0
  28. package/site/content/docs/elements/clock/index.mdx +300 -0
  29. package/site/content/docs/elements/clock/meta.json +5 -0
  30. package/site/content/docs/elements/clock/schedules.mdx +508 -0
  31. package/site/content/docs/elements/clock/sleep.mdx +445 -0
  32. package/site/content/docs/elements/flow/consumers.mdx +707 -0
  33. package/site/content/docs/elements/flow/http.mdx +1080 -0
  34. package/site/content/docs/elements/flow/index.mdx +618 -0
  35. package/site/content/docs/elements/flow/meta.json +5 -0
  36. package/site/content/docs/elements/flow/routing.mdx +559 -0
  37. package/site/content/docs/elements/flow/workflows.mdx +640 -0
  38. package/site/content/docs/elements/gate/auth.mdx +371 -0
  39. package/site/content/docs/elements/gate/authorization.mdx +298 -0
  40. package/site/content/docs/elements/gate/index.mdx +418 -0
  41. package/site/content/docs/elements/gate/meta.json +5 -0
  42. package/site/content/docs/elements/gate/rate-limits.mdx +365 -0
  43. package/site/content/docs/elements/gate/rls.mdx +303 -0
  44. package/site/content/docs/elements/gate/tenancy.mdx +372 -0
  45. package/site/content/docs/elements/index.mdx +52 -11
  46. package/site/content/docs/elements/signal/broadcast.mdx +517 -0
  47. package/site/content/docs/elements/signal/index.mdx +352 -0
  48. package/site/content/docs/elements/signal/live.mdx +590 -0
  49. package/site/content/docs/elements/signal/meta.json +5 -0
  50. package/site/content/docs/elements/signal/once.mdx +596 -0
  51. package/site/content/docs/elements/store/files.mdx +659 -0
  52. package/site/content/docs/elements/store/index.mdx +310 -0
  53. package/site/content/docs/elements/store/kv.mdx +629 -0
  54. package/site/content/docs/elements/store/meta.json +5 -0
  55. package/site/content/docs/elements/store/search.mdx +946 -0
  56. package/site/content/docs/elements/store/sql.mdx +937 -0
  57. package/site/content/docs/elements/vault/config.mdx +256 -0
  58. package/site/content/docs/elements/vault/index.mdx +356 -0
  59. package/site/content/docs/elements/vault/meta.json +5 -0
  60. package/site/content/docs/elements/vault/rotation.mdx +273 -0
  61. package/site/content/docs/elements/vault/secrets.mdx +285 -0
  62. package/site/content/docs/index.mdx +78 -30
  63. package/site/content/docs/meta.json +11 -8
  64. package/site/content/docs/plugins/cors.mdx +2 -1
  65. package/site/content/docs/plugins/csrf.mdx +4 -1
  66. package/site/content/docs/plugins/headers.mdx +2 -1
  67. package/site/content/docs/plugins/ip-allowlist.mdx +2 -1
  68. package/site/content/docs/plugins/magic-link.mdx +6 -0
  69. package/site/content/docs/plugins/maintenance-mode.mdx +2 -1
  70. package/site/content/docs/plugins/oauth.mdx +1 -1
  71. package/site/content/docs/plugins/otp.mdx +12 -1
  72. package/site/content/docs/plugins/passkey.mdx +39 -15
  73. package/site/content/docs/plugins/two-factor.mdx +91 -34
  74. package/site/content/docs/plugins/username.mdx +1 -1
  75. package/site/content/docs/recipes/caddy.mdx +3 -3
  76. package/site/content/docs/recipes/index.mdx +18 -28
  77. package/site/content/docs/recipes/mailpit.mdx +1 -1
  78. package/site/content/docs/recipes/meilisearch.mdx +3 -3
  79. package/site/content/docs/recipes/meta.json +1 -4
  80. package/site/content/docs/recipes/nginx.mdx +2 -2
  81. package/site/content/docs/recipes/openrouter.mdx +283 -0
  82. package/site/content/docs/recipes/pgdog.mdx +3 -3
  83. package/site/content/docs/recipes/postgres.mdx +1 -2
  84. package/site/content/docs/recipes/rustfs.mdx +2 -2
  85. package/site/content/docs/recipes/traefik.mdx +3 -3
  86. package/site/content/docs/reference/cli.mdx +231 -0
  87. package/site/content/docs/reference/configuration.mdx +30 -10
  88. package/site/content/docs/reference/environment-variables.mdx +93 -20
  89. package/site/content/docs/reference/errors.mdx +132 -29
  90. package/site/content/docs/reference/fx.mdx +137 -73
  91. package/site/content/docs/reference/index.mdx +13 -21
  92. package/site/content/docs/reference/meta.json +4 -5
  93. package/site/content/docs/reference/okid.mdx +42 -17
  94. package/site/content/docs/reference/plugins.mdx +4 -3
  95. package/site/content/docs/reference/security.mdx +197 -0
  96. package/site/content/docs/understand/meta.json +5 -0
  97. package/site/content/docs/understand/the-anatomy.mdx +132 -0
  98. package/site/content/docs/understand/the-model.mdx +32 -0
  99. package/site/content/docs/understand/the-problem.mdx +74 -0
  100. package/site/content/docs/understand/the-vocabulary.mdx +26 -0
  101. package/src/auth/api-keys.ts +2 -1
  102. package/src/auth/bindings.ts +64 -16
  103. package/src/auth/gate-auth.test.ts +6 -1
  104. package/src/auth/identity.ts +152 -5
  105. package/src/auth/index.ts +29 -0
  106. package/src/auth/invites.ts +2 -1
  107. package/src/auth/method-context.ts +41 -0
  108. package/src/auth/oauth-as/crypto.ts +2 -1
  109. package/src/auth/oauth-as/stores.ts +2 -1
  110. package/src/auth/operator.ts +2 -1
  111. package/src/auth/sessions-jwt.test.ts +77 -0
  112. package/src/auth/sessions.ts +20 -4
  113. package/src/auth/tenants.ts +3 -2
  114. package/src/auth/two-factor-challenge.test.ts +61 -0
  115. package/src/auth/two-factor-challenge.ts +284 -0
  116. package/src/auth/verification.ts +5 -0
  117. package/src/bench/REPORT.md +49 -0
  118. package/src/bench/g03-signal-once.bench.ts +1 -1
  119. package/src/bench/g10-observability-contention.bench.ts +1 -1
  120. package/src/bench/g17-hybrid-search.bench.ts +572 -0
  121. package/src/bench/load-app.ts +2 -10
  122. package/src/cli/ai-setup/ai-setup.test.ts +331 -42
  123. package/src/cli/ai-setup/apply.ts +294 -52
  124. package/src/cli/ai-setup/catalog.ts +238 -1342
  125. package/src/cli/ai-setup/index.ts +14 -99
  126. package/src/cli/ai-setup/prompts.ts +60 -443
  127. package/src/cli/ask-seed.test.ts +96 -0
  128. package/src/cli/ask-seed.ts +82 -0
  129. package/src/cli/ask-vault-gaps.test.ts +84 -0
  130. package/src/cli/ask-vault-gaps.ts +146 -0
  131. package/src/cli/build.ts +2 -2
  132. package/src/cli/client-add.test.ts +26 -1
  133. package/src/cli/client-add.ts +106 -27
  134. package/src/cli/competitor-mention-removal.test.ts +1 -1
  135. package/src/cli/db-seed.ts +2 -0
  136. package/src/cli/db.ts +150 -11
  137. package/src/cli/dev.ts +119 -211
  138. package/src/cli/docker-clean.ts +2 -2
  139. package/src/cli/docker-cli.test.ts +1 -1
  140. package/src/cli/doctor-diff.ts +4 -2
  141. package/src/cli/doctor-pii.test.ts +1 -1
  142. package/src/cli/doctor.ts +14 -1
  143. package/src/cli/hero-meta.test.ts +4 -2
  144. package/src/cli/load-config.images.test.ts +8 -10
  145. package/src/cli/load-config.ts +1 -1
  146. package/src/cli/registry.ts +22 -10
  147. package/src/cli/replay.ts +3 -1
  148. package/src/cli/start.ts +1 -1
  149. package/src/cli/tui/keys.ts +2 -3
  150. package/src/client/auth/cookies.ts +74 -0
  151. package/src/client/auth/create-auth-client.ts +636 -0
  152. package/src/client/auth/denials.ts +99 -0
  153. package/src/client/auth/session.ts +283 -0
  154. package/src/client/auth.test.ts +251 -0
  155. package/src/client/auth.ts +39 -114
  156. package/src/client/create-with-session.ts +245 -0
  157. package/src/client/create.ts +51 -5
  158. package/src/client/index.ts +11 -1
  159. package/src/client/live.ts +11 -79
  160. package/src/client/notes-contract.test.ts +5 -10
  161. package/src/client/sse.ts +137 -0
  162. package/src/client/stream.ts +147 -0
  163. package/src/client/transport.test.ts +32 -0
  164. package/src/client/transport.ts +123 -26
  165. package/src/client/types.ts +118 -14
  166. package/src/client-react/index.ts +185 -24
  167. package/src/client-react/use-live-query.ts +13 -3
  168. package/src/compiler/aot.test.ts +7 -4
  169. package/src/compiler/effects-embed.test.ts +56 -0
  170. package/src/compiler/effects-fetch.test.ts +43 -0
  171. package/src/compiler/effects-infer.ts +58 -2
  172. package/src/compiler/extract.test.ts +258 -44
  173. package/src/compiler/extract.ts +566 -48
  174. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -4
  175. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +2 -8
  176. package/src/compiler/fixtures/skyport.expected.json +4 -4
  177. package/src/compiler/fixtures/triggers/five-triggers.ts +14 -10
  178. package/src/compiler/response.ts +2 -2
  179. package/src/compiler/search-writer-isolation.test.ts +40 -0
  180. package/src/config/index.ts +11 -0
  181. package/src/console/server/app.ts +17 -23
  182. package/src/console/server/bind.ts +4 -0
  183. package/src/console/server/console.test.ts +2 -2
  184. package/src/console/server/flows-invoke.test.ts +50 -34
  185. package/src/console/server/flows.ts +436 -255
  186. package/src/console/server/runs-ingest.test.ts +6 -3
  187. package/src/console/server/serve.ts +1 -1
  188. package/src/console/server/signals.test.ts +1 -5
  189. package/src/console/server/signals.ts +8 -6
  190. package/src/console/server/state.ts +6 -1
  191. package/src/console/server/store.ts +1 -1
  192. package/src/console/ui-next/dist/assets/FileExportIcon-Ck-5od4R.js +1 -0
  193. package/src/console/ui-next/dist/assets/MoreHorizontalCircle01Icon-gMNGsE37.js +1 -0
  194. package/src/console/ui-next/dist/assets/PlusSignIcon-CwG3nxfu.js +1 -0
  195. package/src/console/ui-next/dist/assets/UnavailableIcon-D9cvHVPr.js +1 -0
  196. package/src/console/ui-next/dist/assets/UserIcon-DaE2PB5_.js +1 -0
  197. package/src/console/ui-next/dist/assets/access-page-DFeymU07.js +4 -0
  198. package/src/console/ui-next/dist/assets/agent-disclosure-U1rdfblp.js +1 -0
  199. package/src/console/ui-next/dist/assets/cache-glyph-BeFJeqBG.js +1 -0
  200. package/src/console/ui-next/dist/assets/call-pii-button-CVAONPii.js +1 -0
  201. package/src/console/ui-next/dist/assets/collapsible-D2A6NJ-3.js +1 -0
  202. package/src/console/ui-next/dist/assets/copy-inline-button-CAYD18cr.js +1 -0
  203. package/src/console/ui-next/dist/assets/dagre.esm-B1_XeuLP.js +1 -0
  204. package/src/console/ui-next/dist/assets/detail-header-DVWNjWjg.js +1 -0
  205. package/src/console/ui-next/dist/assets/dropdown-menu-4h2LOVXM.js +1 -0
  206. package/src/console/ui-next/dist/assets/duration-tone-Cgk_h5ja.js +9 -0
  207. package/src/console/ui-next/dist/assets/element-icons-BI8cJgdh.js +1 -0
  208. package/src/console/ui-next/dist/assets/explorer-empty-CJs5A-wm.js +1 -0
  209. package/src/console/ui-next/dist/assets/flows-page-Dss7941e.js +1 -0
  210. package/src/console/ui-next/dist/assets/highlighted-json-MYZQtRnw.js +154 -0
  211. package/src/console/ui-next/dist/assets/http-method-Jrh39p7A.js +1 -0
  212. package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
  213. package/src/console/ui-next/dist/assets/index-DXP2dBIF.js +63 -0
  214. package/src/console/ui-next/dist/assets/observability-page-HvolXxTI.js +4 -0
  215. package/src/console/ui-next/dist/assets/react-dom-Ddte4I-Q.js +9 -0
  216. package/src/console/ui-next/dist/assets/replica-lag-CSh2dzrb.js +18 -0
  217. package/src/console/ui-next/dist/assets/request-meta-BatF8KrK.js +1 -0
  218. package/src/console/ui-next/dist/assets/shortcut-keys-3ILd8oGn.js +1 -0
  219. package/src/console/ui-next/dist/assets/{sql-BskegiFM.js → sql-BsFa4tDR.js} +1 -1
  220. package/src/console/ui-next/dist/assets/store-page-eiKiHnNe.js +41 -0
  221. package/src/console/ui-next/dist/assets/trace-detail-sheet-CZkMeKS-.js +2 -0
  222. package/src/console/ui-next/dist/assets/tree-expand-toggle-CW8y5A2h.js +55 -0
  223. package/src/console/ui-next/dist/assets/units-page-B_RWJrEO.js +1 -0
  224. package/src/console/ui-next/dist/assets/{use-vault-list-uk4WVboC.js → use-vault-list-CT4-gajj.js} +1 -1
  225. package/src/console/ui-next/dist/assets/vault-page-CWrg-A68.js +2 -0
  226. package/src/console/ui-next/dist/assets/xyflow-CSyC6ryz.css +1 -0
  227. package/src/console/ui-next/dist/assets/xyflow-yApv7D4e.js +7 -0
  228. package/src/console/ui-next/dist/index.html +6 -13
  229. package/src/console/ui-next/seed-invoke-host.ts +21 -18
  230. package/src/console/ui-next/src/client.ts +7 -2
  231. package/src/console/ui-next/src/features/flows/graph/element-map.ts +2 -0
  232. package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +12 -2
  233. package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +4 -0
  234. package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +8 -0
  235. package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +4 -0
  236. package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +9 -3
  237. package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +7 -11
  238. package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +2 -2
  239. package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +2 -0
  240. package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +25 -1
  241. package/src/console/ui-next/src/features/store/lib/grid-model.ts +36 -1
  242. package/src/console/ui-next/src/features/store/query/query-results.tsx +3 -3
  243. package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +2 -0
  244. package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +3 -1
  245. package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +6 -0
  246. package/src/docker/ai-model-status.test.ts +1 -12
  247. package/src/docker/ai-model-status.ts +10 -38
  248. package/src/docker/compose-up.test.ts +100 -0
  249. package/src/docker/compose-up.ts +292 -0
  250. package/src/docker/compose.ts +4 -14
  251. package/src/docker/derive.ts +9 -34
  252. package/src/docker/docker.test.ts +16 -261
  253. package/src/docker/images-config.test.ts +13 -25
  254. package/src/docker/index.ts +1 -24
  255. package/src/docker/recipes/index.ts +0 -23
  256. package/src/docker/recipes/pgdog.ts +6 -4
  257. package/src/docker/stack-id.test.ts +2 -2
  258. package/src/docker/stack-id.ts +0 -1
  259. package/src/docker/types.ts +2 -2
  260. package/src/drivers/ai-anthropic.ts +10 -0
  261. package/src/drivers/ai-openai-compatible.ts +34 -7
  262. package/src/drivers/ai-providers.test.ts +0 -107
  263. package/src/drivers/ai-stream.test.ts +0 -34
  264. package/src/drivers/ai-types.ts +17 -8
  265. package/src/drivers/channel-fcm.ts +6 -1
  266. package/src/drivers/channel-msegat.ts +6 -1
  267. package/src/drivers/channel-resend.ts +5 -1
  268. package/src/drivers/channel-smtp.ts +5 -1
  269. package/src/drivers/channel-sndr.ts +10 -1
  270. package/src/drivers/channel-taqnyat-mail.ts +5 -1
  271. package/src/drivers/channel-taqnyat-whatsapp.ts +6 -1
  272. package/src/drivers/channel-taqnyat.ts +6 -1
  273. package/src/drivers/channel-types.ts +10 -0
  274. package/src/drivers/channel-unifonic.ts +6 -1
  275. package/src/drivers/channel-wa-cloud.ts +6 -1
  276. package/src/drivers/channel-webpush.ts +6 -1
  277. package/src/drivers/external.ts +33 -0
  278. package/src/drivers/index.ts +0 -10
  279. package/src/drivers/meilisearch.ts +6 -0
  280. package/src/drivers/oauth-types.ts +4 -0
  281. package/src/drivers/postgres.test.ts +74 -3
  282. package/src/drivers/postgres.ts +175 -6
  283. package/src/drivers/signal-types.ts +5 -5
  284. package/src/drivers/types.ts +7 -0
  285. package/src/drivers/vault-types.ts +5 -0
  286. package/src/elements/ai/declare.ts +17 -4
  287. package/src/elements/ai/eval.ts +1 -1
  288. package/src/elements/ai/mcp-http.ts +1 -1
  289. package/src/elements/ai/pii.ts +1 -1
  290. package/src/elements/ai/providers.test.ts +289 -0
  291. package/src/elements/ai/providers.ts +169 -0
  292. package/src/elements/ai/runtime.ts +68 -5
  293. package/src/elements/ai/schema.ts +2 -2
  294. package/src/elements/ai.test.ts +7 -7
  295. package/src/elements/ai.ts +17 -1
  296. package/src/elements/channel/runtime.ts +105 -12
  297. package/src/elements/clock/cron-fields.test.ts +144 -0
  298. package/src/elements/clock/cron-fields.ts +185 -0
  299. package/src/elements/clock/declare.ts +247 -3
  300. package/src/elements/clock.ts +21 -1
  301. package/src/elements/index.ts +15 -0
  302. package/src/elements/signal/chaos-child.ts +1 -2
  303. package/src/elements/signal/declare.ts +65 -37
  304. package/src/elements/signal/delivery-modes.test.ts +11 -31
  305. package/src/elements/signal/dry-run-replay.test.ts +1 -7
  306. package/src/elements/signal/dry-run-write-isolation.test.ts +1 -7
  307. package/src/elements/signal/key-ordering.test.ts +6 -26
  308. package/src/elements/signal/lease-reclaim.test.ts +2 -6
  309. package/src/elements/signal/optional-emit.test.ts +6 -9
  310. package/src/elements/signal/order-lifecycle.test.ts +4 -17
  311. package/src/elements/signal/orphan-messages.test.ts +4 -15
  312. package/src/elements/signal/reconcile.test.ts +2 -2
  313. package/src/elements/signal/runtime.ts +1 -1
  314. package/src/elements/signal/schema-emit.test.ts +4 -8
  315. package/src/elements/signal.test.ts +24 -49
  316. package/src/elements/signal.ts +9 -2
  317. package/src/elements/store/domain-ddl.test.ts +1 -1
  318. package/src/elements/store/live-http.test.ts +9 -4
  319. package/src/elements/store/prepare-row.test.ts +123 -0
  320. package/src/elements/store/resource.ts +43 -12
  321. package/src/elements/store/schema-decl.ts +117 -0
  322. package/src/elements/store/search-backfill.ts +205 -0
  323. package/src/elements/store/search-bind.ts +66 -0
  324. package/src/elements/store/search-bm25.ts +78 -0
  325. package/src/elements/store/search-ddl.ts +156 -0
  326. package/src/elements/store/search-embed-flow.ts +141 -0
  327. package/src/elements/store/search-errors.ts +34 -0
  328. package/src/elements/store/search-fusion.ts +112 -0
  329. package/src/elements/store/search-lsh.ts +179 -0
  330. package/src/elements/store/search-runtime.ts +300 -0
  331. package/src/elements/store/search.test.ts +144 -0
  332. package/src/elements/store/sql-session.test.ts +1 -0
  333. package/src/elements/store/sql-session.ts +83 -3
  334. package/src/elements/store/table.ts +23 -2
  335. package/src/elements/store/upsert-app.test.ts +1 -3
  336. package/src/elements/store.ts +50 -0
  337. package/src/full.ts +4 -2
  338. package/src/http.ts +4 -1
  339. package/src/i18n/catalogs/ar.ts +14 -6
  340. package/src/i18n/catalogs/en.ts +14 -6
  341. package/src/index.ts +6 -1
  342. package/src/kernel/adopt-barrel-fresh.test.ts +7 -7
  343. package/src/kernel/adopt-routes.ts +9 -1
  344. package/src/kernel/app-auth.ts +5 -0
  345. package/src/kernel/app.ts +102 -9
  346. package/src/kernel/auto-cache.test.ts +6 -12
  347. package/src/kernel/auto-registry.test.ts +3 -3
  348. package/src/kernel/boot-bind/ai.test.ts +22 -19
  349. package/src/kernel/boot-bind/ai.ts +5 -43
  350. package/src/kernel/boot-bind/clock.ts +23 -5
  351. package/src/kernel/boot-bind/honor-config.test.ts +4 -4
  352. package/src/kernel/boot.test.ts +11 -6
  353. package/src/kernel/boot.ts +66 -16
  354. package/src/kernel/boundary-contract.ts +93 -0
  355. package/src/kernel/budget.test.ts +1 -1
  356. package/src/kernel/call.ts +89 -0
  357. package/src/kernel/capability.ts +6 -0
  358. package/src/kernel/client-descriptor.ts +123 -0
  359. package/src/kernel/clock-timezone.test.ts +80 -0
  360. package/src/kernel/correlation.test.ts +1 -1
  361. package/src/kernel/dry-run.ts +11 -8
  362. package/src/kernel/effects-stamping.test.ts +42 -9
  363. package/src/kernel/effects.test.ts +4 -2
  364. package/src/kernel/effects.ts +51 -9
  365. package/src/kernel/errors-channel.ts +17 -0
  366. package/src/kernel/errors-live-resume.ts +3 -2
  367. package/src/kernel/errors-tenant.ts +7 -4
  368. package/src/kernel/errors.registry-helpers.ts +96 -0
  369. package/src/kernel/errors.registry.test.ts +139 -25
  370. package/src/kernel/errors.ts +102 -23
  371. package/src/kernel/external-effects.test.ts +196 -0
  372. package/src/kernel/flow.test.ts +13 -4
  373. package/src/kernel/flow.ts +69 -71
  374. package/src/kernel/fx-ask-telemetry.test.ts +2 -2
  375. package/src/kernel/fx-dead-letters.test.ts +3 -3
  376. package/src/kernel/fx-fetch.ts +55 -0
  377. package/src/kernel/fx-live-stream.ts +2 -2
  378. package/src/kernel/fx-live.test.ts +8 -8
  379. package/src/kernel/fx.test.ts +17 -11
  380. package/src/kernel/fx.ts +180 -57
  381. package/src/kernel/horizontal-child.ts +1 -1
  382. package/src/kernel/http-query.test.ts +3 -6
  383. package/src/kernel/index.ts +13 -3
  384. package/src/kernel/instance-id.ts +1 -1
  385. package/src/kernel/instances.test.ts +40 -0
  386. package/src/kernel/instances.ts +47 -9
  387. package/src/kernel/live-http.test.ts +6 -7
  388. package/src/kernel/live-http.ts +6 -2
  389. package/src/kernel/live-resume.test.ts +1 -1
  390. package/src/kernel/mcp-tool.test.ts +3 -3
  391. package/src/kernel/on.ts +98 -4
  392. package/src/kernel/pipeline.test.ts +12 -15
  393. package/src/kernel/plugin-elements.test.ts +1 -1
  394. package/src/kernel/stamp-http.test.ts +3 -3
  395. package/src/kernel/triggers.ts +210 -95
  396. package/src/kernel-entry.ts +0 -1
  397. package/src/manifest/diff.ts +11 -1
  398. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  399. package/src/manifest/types.ts +46 -2
  400. package/src/mcp/docs-index.ts +3 -3
  401. package/src/mcp/docs-mcp.test.ts +2 -2
  402. package/src/mcp/docs-tools.ts +1 -1
  403. package/src/okid.test.ts +56 -0
  404. package/src/okid.ts +55 -11
  405. package/src/plugins/anonymous.ts +8 -4
  406. package/src/plugins/auth/shared.ts +27 -3
  407. package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
  408. package/src/plugins/auth-methods.security.test.ts +561 -23
  409. package/src/plugins/config-source.ts +1 -1
  410. package/src/plugins/csrf.test.ts +65 -0
  411. package/src/plugins/index.ts +2 -0
  412. package/src/plugins/magic-link.ts +36 -16
  413. package/src/plugins/oauth/shared.ts +3 -1
  414. package/src/plugins/oauth.ts +22 -14
  415. package/src/plugins/otp.ts +37 -21
  416. package/src/plugins/passkey-webauthn.ts +9 -6
  417. package/src/plugins/passkey.ts +98 -26
  418. package/src/plugins/pre-account-hijack.test.ts +223 -0
  419. package/src/plugins/two-factor.ts +466 -37
  420. package/src/plugins/username.ts +19 -7
  421. package/src/release/build-lib.ts +1 -0
  422. package/src/release/limits.ts +2 -2
  423. package/src/release/measure.ts +1 -1
  424. package/src/runs/collect.test.ts +0 -2
  425. package/src/runtime/json-code-block.test.ts +250 -20
  426. package/src/runtime/json-code-block.ts +1261 -41
  427. package/src/term.test.ts +1 -1
  428. package/src/test/create-test-app.test.ts +12 -12
  429. package/src/test/live-signals.test.ts +6 -6
  430. package/src/test/provisions.integration.test.ts +10 -14
  431. package/src/test/reset-element-registries.ts +1 -1
  432. package/src/test/tenant-isolation.test.ts +12 -6
  433. package/site/content/docs/deployment/docker-swarm.mdx +0 -164
  434. package/site/content/docs/deployment/docker.mdx +0 -227
  435. package/site/content/docs/deployment/index.mdx +0 -83
  436. package/site/content/docs/deployment/kubernetes.mdx +0 -176
  437. package/site/content/docs/deployment/meta.json +0 -5
  438. package/site/content/docs/deployment/reverse-proxy.mdx +0 -234
  439. package/site/content/docs/elements/ai.mdx +0 -385
  440. package/site/content/docs/elements/channel.mdx +0 -346
  441. package/site/content/docs/elements/clock.mdx +0 -244
  442. package/site/content/docs/elements/flow.mdx +0 -420
  443. package/site/content/docs/elements/gate.mdx +0 -436
  444. package/site/content/docs/elements/signal.mdx +0 -380
  445. package/site/content/docs/elements/store.mdx +0 -1099
  446. package/site/content/docs/elements/vault.mdx +0 -405
  447. package/site/content/docs/get-started/basic-usage.mdx +0 -173
  448. package/site/content/docs/get-started/index.mdx +0 -43
  449. package/site/content/docs/get-started/installation.mdx +0 -220
  450. package/site/content/docs/get-started/introduction.mdx +0 -132
  451. package/site/content/docs/get-started/meta.json +0 -13
  452. package/site/content/docs/get-started/project-structure.mdx +0 -925
  453. package/site/content/docs/get-started/testing.mdx +0 -328
  454. package/site/content/docs/get-started/why.mdx +0 -162
  455. package/site/content/docs/recipes/llama-cpp.mdx +0 -151
  456. package/site/content/docs/recipes/ollama.mdx +0 -142
  457. package/site/content/docs/recipes/sglang.mdx +0 -105
  458. package/site/content/docs/recipes/vllm.mdx +0 -106
  459. package/site/content/docs/reference/cli.md +0 -232
  460. package/site/content/docs/reference/client.mdx +0 -469
  461. package/site/content/docs/reference/security.md +0 -74
  462. package/src/cli/ai-setup/detect-ollama.ts +0 -213
  463. package/src/cli/ai-setup/recommend.test.ts +0 -225
  464. package/src/cli/ai-setup/recommend.ts +0 -225
  465. package/src/cli/dev-controls.test.ts +0 -122
  466. package/src/cli/dev-controls.ts +0 -164
  467. package/src/cli/tui/DevLive.tsx +0 -126
  468. package/src/console/ui-next/dist/assets/access-page-De7Lc2JC.js +0 -4
  469. package/src/console/ui-next/dist/assets/agent-disclosure-BP0Y0Sux.js +0 -1
  470. package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +0 -1
  471. package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +0 -1
  472. package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +0 -1
  473. package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +0 -1
  474. package/src/console/ui-next/dist/assets/dagre.esm-ZwcdTuZZ.js +0 -1
  475. package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +0 -1
  476. package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +0 -1
  477. package/src/console/ui-next/dist/assets/duration-tone-sC3lGABz.js +0 -9
  478. package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +0 -1
  479. package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +0 -1
  480. package/src/console/ui-next/dist/assets/flows-page-RGy7VEA_.js +0 -1
  481. package/src/console/ui-next/dist/assets/highlighted-json-Awq7gYdu.js +0 -154
  482. package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +0 -1
  483. package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +0 -2
  484. package/src/console/ui-next/dist/assets/index-_rgpdVzo.js +0 -66
  485. package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
  486. package/src/console/ui-next/dist/assets/observability-page-Ds6pcnh-.js +0 -4
  487. package/src/console/ui-next/dist/assets/preload-helper-oH4irX4C.js +0 -1
  488. package/src/console/ui-next/dist/assets/react-D8E3mtu1.js +0 -1
  489. package/src/console/ui-next/dist/assets/react-dom-Bph1y7z7.js +0 -9
  490. package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +0 -18
  491. package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +0 -1
  492. package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +0 -1
  493. package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +0 -1
  494. package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +0 -1
  495. package/src/console/ui-next/dist/assets/store-page-02xOiqIK.js +0 -41
  496. package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +0 -2
  497. package/src/console/ui-next/dist/assets/tree-expand-toggle-BtyhmWb4.js +0 -55
  498. package/src/console/ui-next/dist/assets/units-page-4rHOePuE.js +0 -1
  499. package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +0 -1
  500. package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +0 -1
  501. package/src/console/ui-next/dist/assets/vault-page-DISPgxLM.js +0 -2
  502. package/src/console/ui-next/dist/assets/xyflow-D7n4g6go.js +0 -7
  503. package/src/console/ui-next/dist/assets/xyflow-DZ0Ws1xk.css +0 -1
  504. package/src/docker/ollama-pull.ts +0 -232
  505. package/src/docker/recipes/llama-cpp.ts +0 -298
  506. package/src/docker/recipes/ollama.ts +0 -44
  507. package/src/docker/recipes/sglang.ts +0 -55
  508. package/src/docker/recipes/vllm.ts +0 -44
  509. package/src/drivers/ai-ollama-tools.integration.test.ts +0 -109
  510. package/src/drivers/ai-ollama.integration.test.ts +0 -184
  511. package/src/drivers/ai-ollama.ts +0 -389
  512. package/src/drivers/ollama.ts +0 -14
@@ -92,11 +92,18 @@ const ManifestOut = z.object({
92
92
  });
93
93
 
94
94
  const EffectEntryOut = z.object({
95
- kind: z.enum(["read", "write", "emit", "send", "ask", "secret", "call"]),
95
+ kind: z.enum(["read", "write", "emit", "send", "ask", "embed", "secret", "call", "fetch"]),
96
96
  resource: z.string(),
97
97
  timestamp: z.number(),
98
98
  duration: z.number(),
99
99
  reversibility: z.enum(["none", "reversible", "deferred", "irreversible", "capability", "portal"]),
100
+ external: z
101
+ .object({
102
+ host: z.string(),
103
+ provider: z.string().optional(),
104
+ kind: z.enum(["third-party", "infrastructure"]).optional(),
105
+ })
106
+ .optional(),
100
107
  });
101
108
 
102
109
  const LogLineOut = z.object({
@@ -259,7 +266,7 @@ const SignalsReplayOut = z.object({
259
266
  ),
260
267
  wouldHaveFired: z.array(
261
268
  z.object({
262
- kind: z.enum(["send", "ask"]),
269
+ kind: z.enum(["send", "ask", "embed", "fetch"]),
263
270
  resource: z.string(),
264
271
  messageId: z.string().optional(),
265
272
  }),
@@ -893,7 +900,17 @@ const AiListOut = z.object({
893
900
  status: z.enum(["ok", "denied"]),
894
901
  effects: z.array(
895
902
  z.object({
896
- kind: z.enum(["read", "write", "emit", "send", "ask", "secret", "call"]),
903
+ kind: z.enum([
904
+ "read",
905
+ "write",
906
+ "emit",
907
+ "send",
908
+ "ask",
909
+ "embed",
910
+ "secret",
911
+ "call",
912
+ "fetch",
913
+ ]),
897
914
  resource: z.string(),
898
915
  }),
899
916
  ),
@@ -1541,7 +1558,7 @@ const StoreEditOut = z.object({
1541
1558
  willNotFire: WillNotFireOut,
1542
1559
  wouldHaveFired: z.array(
1543
1560
  z.object({
1544
- kind: z.enum(["send", "ask"]),
1561
+ kind: z.enum(["send", "ask", "embed", "fetch"]),
1545
1562
  resource: z.string(),
1546
1563
  }),
1547
1564
  ),
@@ -1754,7 +1771,7 @@ const StorePreviewOut = z.object({
1754
1771
  willNotFire: WillNotFireOut,
1755
1772
  wouldHaveFired: z.array(
1756
1773
  z.object({
1757
- kind: z.enum(["send", "ask"]),
1774
+ kind: z.enum(["send", "ask", "embed", "fetch"]),
1758
1775
  resource: z.string(),
1759
1776
  }),
1760
1777
  ),
@@ -1926,67 +1943,419 @@ export function createConsoleBindings(state: ConsoleState): {
1926
1943
  const channelSendTest = createChannelSendTest(state);
1927
1944
 
1928
1945
  const bindings: Binding[] = [
1929
- bindHttp(http.get("/console/setup/status"), setupStatus),
1930
- bindHttp(http.post("/console/setup/claim"), setupClaim),
1931
- bindHttp(http.post("/console/session/login"), sessionLogin),
1932
- bindHttp(http.get("/console/session/me"), sessionMe),
1933
- bindHttp(http.post("/console/session/logout"), sessionLogout),
1934
- bindHttp(http.get("/console/manifest"), manifestGet),
1935
- bindHttp(http.get("/console/runs"), runsList),
1936
- bindHttp(http.post("/console/runs/query"), runsQuery),
1937
- bindHttp(http.post("/console/action/ping"), actionPing),
1938
- bindHttp(http.post("/console/structural/propose"), structuralPropose),
1939
- bindHttp(http.get("/console/flows/identities"), flowsIdentities),
1940
- bindHttp(http.post("/console/flows/invoke"), flowsInvoke),
1941
- bindHttp(http.post("/console/traces/replay"), tracesReplay),
1942
- bindHttp(http.get("/console/signals"), signalsList),
1943
- bindHttp(http.post("/console/signals/replay"), signalsReplay),
1944
- bindHttp(http.post("/console/signals/dry-run-replay"), signalsDryRunReplay),
1945
- bindHttp(http.post("/console/signals/discard"), signalsDiscard),
1946
- bindHttp(http.get("/console/store"), storeList),
1947
- bindHttp(http.query("/console/store/query"), storeQuery),
1948
- bindHttp(http.post("/console/store/reveal"), storeReveal),
1949
- bindHttp(http.post("/console/store/object"), storeObject),
1950
- bindHttp(http.post("/console/store/edit"), storeEdit),
1951
- bindHttp(http.post("/console/store/delete"), storeDelete),
1952
- bindHttp(http.post("/console/store/purge-cache"), storePurgeCache),
1953
- bindHttp(http.post("/console/store/sql"), storeSql),
1954
- bindHttp(http.post("/console/store/preview"), storePreview),
1955
- bindHttp(http.query("/console/store/sql/stats"), storeStats),
1956
- bindHttp(http.query("/console/store/sql/locks"), storeLocks),
1957
- bindHttp(http.query("/console/store/kv/stats"), storeKvStats),
1958
- bindHttp(http.post("/console/store/sql/advise"), storeAdvise),
1959
- bindHttp(http.get("/console/vault"), vaultList),
1960
- bindHttp(http.post("/console/vault/set"), vaultSet),
1961
- bindHttp(http.post("/console/vault/create"), vaultCreate),
1962
- bindHttp(http.post("/console/vault/rotate"), vaultRotate),
1963
- bindHttp(http.post("/console/vault/rotate-master"), vaultRotateMaster),
1964
- bindHttp(http.get("/console/vault/audit/verify"), vaultAuditVerify),
1965
- bindHttp(http.get("/console/ai"), aiList),
1966
- bindHttp(http.get("/console/gates"), gatesList),
1967
- bindHttp(http.query("/console/gates/simulate"), gatesSimulate),
1968
- bindHttp(http.query("/console/gates/powers"), gatesPowers),
1969
- bindHttp(http.get("/console/access"), accessList),
1970
- bindHttp(http.query("/console/access/effective"), accessEffective),
1971
- bindHttp(http.post("/console/access/key-blast"), accessKeyBlast),
1972
- bindHttp(http.post("/console/access/keys"), accessCreateKeyFlow),
1973
- bindHttp(http.post("/console/access/keys/revoke"), accessRevokeKeyFlow),
1974
- bindHttp(http.post("/console/access/keys/rotate"), accessRotateKeyFlow),
1975
- bindHttp(http.post("/console/access/keys/update"), accessUpdateKeyFlow),
1976
- bindHttp(http.post("/console/access/roles/grants"), accessSetRoleGrantsFlow),
1977
- bindHttp(http.get("/console/diff"), diffList),
1978
- bindHttp(http.get("/console/plugins"), pluginsList),
1979
- bindHttp(http.get("/console/clock"), clockList),
1980
- bindHttp(http.get("/console/instances"), instancesList),
1981
- bindHttp(http.post("/console/clock/run-now"), clockRunNow),
1982
- bindHttp(http.post("/console/clock/pause"), clockPause),
1983
- bindHttp(http.post("/console/clock/edit-schedule"), clockEditSchedule),
1984
- bindHttp(http.post("/console/clock/wake-early"), clockWakeEarly),
1985
- bindHttp(http.get("/console/channels"), channelsList),
1986
- bindHttp(http.query("/console/channels/preview"), channelPreview),
1987
- bindHttp(http.post("/console/channels/verify-auth"), channelVerifyAuth),
1988
- bindHttp(http.post("/console/channels/reveal"), channelReveal),
1989
- bindHttp(http.post("/console/channels/send-test"), channelSendTest),
1946
+ bindHttp(http.get("/console/setup/status", { out: SetupStatusOut }), setupStatus),
1947
+ bindHttp(
1948
+ http.post("/console/setup/claim", {
1949
+ in: ClaimIn,
1950
+ out: SessionOut,
1951
+ errors: { SetupClosed, ClaimFailed },
1952
+ }),
1953
+ setupClaim,
1954
+ ),
1955
+ bindHttp(
1956
+ http.post("/console/session/login", {
1957
+ in: LoginIn,
1958
+ out: SessionOut,
1959
+ errors: { AuthFailed, AuthRateLimited },
1960
+ }),
1961
+ sessionLogin,
1962
+ ),
1963
+ bindHttp(http.get("/console/session/me", { out: MeOut, errors: { AuthFailed } }), sessionMe),
1964
+ bindHttp(
1965
+ http.post("/console/session/logout", { out: z.object({ ok: z.literal(true) }) }),
1966
+ sessionLogout,
1967
+ ),
1968
+ bindHttp(
1969
+ http.get("/console/manifest", { out: ManifestOut, errors: { AuthFailed } }),
1970
+ manifestGet,
1971
+ ),
1972
+ bindHttp(http.get("/console/runs", { out: RunsListOut, errors: { AuthFailed } }), runsList),
1973
+ bindHttp(
1974
+ http.post("/console/runs/query", {
1975
+ in: RunsQueryIn,
1976
+ out: RunsQueryOut,
1977
+ errors: { AuthFailed, QueryRejected, QueryTimeout, QueryFailed },
1978
+ }),
1979
+ runsQuery,
1980
+ ),
1981
+ bindHttp(
1982
+ http.post("/console/action/ping", {
1983
+ in: ActionPingIn,
1984
+ out: ActionPingOut,
1985
+ errors: { AuthFailed },
1986
+ }),
1987
+ actionPing,
1988
+ ),
1989
+ bindHttp(
1990
+ http.post("/console/structural/propose", {
1991
+ in: StructuralIn,
1992
+ out: StructuralOut,
1993
+ errors: { AuthFailed },
1994
+ }),
1995
+ structuralPropose,
1996
+ ),
1997
+ bindHttp(
1998
+ http.get("/console/flows/identities", { out: IdentitiesOut, errors: { AuthFailed } }),
1999
+ flowsIdentities,
2000
+ ),
2001
+ bindHttp(
2002
+ http.post("/console/flows/invoke", {
2003
+ in: InvokeIn,
2004
+ out: InvokeOut,
2005
+ errors: { AuthFailed, NotFound, InvokeDenied, ConfirmRequired },
2006
+ }),
2007
+ flowsInvoke,
2008
+ ),
2009
+ bindHttp(
2010
+ http.post("/console/traces/replay", {
2011
+ in: TracesReplayIn,
2012
+ out: TracesReplayOut,
2013
+ errors: { AuthFailed, NotFound, ReplayUnavailable, ReplayFailed },
2014
+ }),
2015
+ tracesReplay,
2016
+ ),
2017
+ bindHttp(
2018
+ http.get("/console/signals", { out: SignalsListOut, errors: { AuthFailed } }),
2019
+ signalsList,
2020
+ ),
2021
+ bindHttp(
2022
+ http.post("/console/signals/replay", {
2023
+ in: SignalsReplayIn,
2024
+ out: SignalsReplayOut,
2025
+ errors: { AuthFailed, SignalNotFound, ConfirmRequired },
2026
+ }),
2027
+ signalsReplay,
2028
+ ),
2029
+ bindHttp(
2030
+ http.post("/console/signals/dry-run-replay", {
2031
+ in: SignalsReplayIn.omit({ dryRun: true }),
2032
+ out: SignalsReplayOut,
2033
+ errors: { AuthFailed, SignalNotFound, DryRunUnsafe },
2034
+ }),
2035
+ signalsDryRunReplay,
2036
+ ),
2037
+ bindHttp(
2038
+ http.post("/console/signals/discard", {
2039
+ in: SignalsDiscardIn,
2040
+ out: SignalsDiscardOut,
2041
+ errors: { AuthFailed, SignalNotFound, ConfirmRequired },
2042
+ }),
2043
+ signalsDiscard,
2044
+ ),
2045
+ bindHttp(http.get("/console/store", { out: StoreListOut, errors: { AuthFailed } }), storeList),
2046
+ bindHttp(
2047
+ http.query("/console/store/query", {
2048
+ in: StoreQueryIn,
2049
+ out: StoreQueryOut,
2050
+ errors: { AuthFailed, TenantRequired, StoreNotFound },
2051
+ }),
2052
+ storeQuery,
2053
+ ),
2054
+ bindHttp(
2055
+ http.post("/console/store/reveal", {
2056
+ in: StoreRevealIn,
2057
+ out: StoreRevealOut,
2058
+ errors: { AuthFailed, TenantRequired, StoreNotFound },
2059
+ }),
2060
+ storeReveal,
2061
+ ),
2062
+ bindHttp(
2063
+ http.post("/console/store/object", {
2064
+ in: StoreFileGetIn,
2065
+ out: StoreFileGetOut,
2066
+ errors: { AuthFailed, TenantRequired, StoreNotFound },
2067
+ }),
2068
+ storeObject,
2069
+ ),
2070
+ bindHttp(
2071
+ http.post("/console/store/edit", {
2072
+ in: StoreEditIn,
2073
+ out: StoreEditOut,
2074
+ errors: { AuthFailed, TenantRequired, ConfirmRequired, StoreNotFound },
2075
+ }),
2076
+ storeEdit,
2077
+ ),
2078
+ bindHttp(
2079
+ http.post("/console/store/delete", {
2080
+ in: StoreDeleteIn,
2081
+ out: StoreDeleteOut,
2082
+ errors: { AuthFailed, TenantRequired, ConfirmRequired },
2083
+ }),
2084
+ storeDelete,
2085
+ ),
2086
+ bindHttp(
2087
+ http.post("/console/store/purge-cache", {
2088
+ in: StorePurgeIn,
2089
+ out: StorePurgeOut,
2090
+ errors: { AuthFailed, ConfirmRequired },
2091
+ }),
2092
+ storePurgeCache,
2093
+ ),
2094
+ bindHttp(
2095
+ http.post("/console/store/sql", {
2096
+ in: StoreSqlIn,
2097
+ out: StoreSqlOut,
2098
+ errors: { AuthFailed, TenantRequired, StoreNotFound },
2099
+ }),
2100
+ storeSql,
2101
+ ),
2102
+ bindHttp(
2103
+ http.post("/console/store/preview", {
2104
+ in: StorePreviewIn,
2105
+ out: StorePreviewOut,
2106
+ errors: { AuthFailed, TenantRequired, DryRunUnsafe },
2107
+ }),
2108
+ storePreview,
2109
+ ),
2110
+ bindHttp(
2111
+ http.query("/console/store/sql/stats", {
2112
+ in: StoreSqlStatsIn,
2113
+ out: StoreSqlStatsOut,
2114
+ errors: {
2115
+ AuthFailed,
2116
+ TenantRequired,
2117
+ StoreNotFound,
2118
+ PgStatStatementsNotPreloaded,
2119
+ PgStatStatementsUnsupported,
2120
+ PgStatStatementsNotCreated,
2121
+ },
2122
+ }),
2123
+ storeStats,
2124
+ ),
2125
+ bindHttp(
2126
+ http.query("/console/store/sql/locks", {
2127
+ in: StoreSqlLocksIn,
2128
+ out: StoreSqlLocksOut,
2129
+ errors: {
2130
+ AuthFailed,
2131
+ TenantRequired,
2132
+ StoreNotFound,
2133
+ PgStatStatementsNotPreloaded,
2134
+ PgStatStatementsUnsupported,
2135
+ PgStatStatementsNotCreated,
2136
+ },
2137
+ }),
2138
+ storeLocks,
2139
+ ),
2140
+ bindHttp(
2141
+ http.query("/console/store/kv/stats", {
2142
+ in: StoreKvStatsIn,
2143
+ out: StoreKvStatsOut,
2144
+ errors: { AuthFailed, TenantRequired, StoreNotFound, KvStatsUnsupported },
2145
+ }),
2146
+ storeKvStats,
2147
+ ),
2148
+ bindHttp(
2149
+ http.post("/console/store/sql/advise", {
2150
+ in: StoreSqlAdviseIn,
2151
+ out: StoreSqlAdviseOut,
2152
+ errors: {
2153
+ AuthFailed,
2154
+ TenantRequired,
2155
+ StoreNotFound,
2156
+ PgStatStatementsNotPreloaded,
2157
+ PgStatStatementsUnsupported,
2158
+ PgStatStatementsNotCreated,
2159
+ },
2160
+ }),
2161
+ storeAdvise,
2162
+ ),
2163
+ bindHttp(http.get("/console/vault", { out: VaultListOut, errors: { AuthFailed } }), vaultList),
2164
+ bindHttp(
2165
+ http.post("/console/vault/set", {
2166
+ in: VaultWriteIn,
2167
+ out: VaultWriteOut,
2168
+ errors: { AuthFailed, VaultNotFound },
2169
+ }),
2170
+ vaultSet,
2171
+ ),
2172
+ bindHttp(
2173
+ http.post("/console/vault/create", {
2174
+ in: VaultCreateIn,
2175
+ out: VaultWriteOut,
2176
+ errors: { AuthFailed, VaultExists, VaultNotFound },
2177
+ }),
2178
+ vaultCreate,
2179
+ ),
2180
+ bindHttp(
2181
+ http.post("/console/vault/rotate", {
2182
+ in: VaultWriteIn,
2183
+ out: VaultWriteOut,
2184
+ errors: { AuthFailed, VaultNotFound },
2185
+ }),
2186
+ vaultRotate,
2187
+ ),
2188
+ bindHttp(
2189
+ http.post("/console/vault/rotate-master", {
2190
+ in: VaultRotateMasterIn,
2191
+ out: VaultRotateMasterOut,
2192
+ errors: { AuthFailed, ConfirmRequired, VaultSealed, VaultRotateBusy, VaultUnsupported },
2193
+ }),
2194
+ vaultRotateMaster,
2195
+ ),
2196
+ bindHttp(
2197
+ http.get("/console/vault/audit/verify", {
2198
+ out: VaultAuditVerifyOut,
2199
+ errors: { AuthFailed, VaultUnsupported },
2200
+ }),
2201
+ vaultAuditVerify,
2202
+ ),
2203
+ bindHttp(http.get("/console/ai", { out: AiListOut, errors: { AuthFailed } }), aiList),
2204
+ bindHttp(http.get("/console/gates", { out: GatesListOut, errors: { AuthFailed } }), gatesList),
2205
+ bindHttp(
2206
+ http.query("/console/gates/simulate", {
2207
+ in: GatesSimulateIn,
2208
+ out: GatesSimulateOut,
2209
+ errors: { AuthFailed },
2210
+ }),
2211
+ gatesSimulate,
2212
+ ),
2213
+ bindHttp(
2214
+ http.query("/console/gates/powers", {
2215
+ in: GatesPowersIn,
2216
+ out: GatesPowersOut,
2217
+ errors: { AuthFailed },
2218
+ }),
2219
+ gatesPowers,
2220
+ ),
2221
+ bindHttp(
2222
+ http.get("/console/access", { out: AccessListOut, errors: { AuthFailed } }),
2223
+ accessList,
2224
+ ),
2225
+ bindHttp(
2226
+ http.query("/console/access/effective", {
2227
+ in: AccessEffectiveIn,
2228
+ out: AccessEffectiveOut,
2229
+ errors: { AuthFailed, NotFound },
2230
+ }),
2231
+ accessEffective,
2232
+ ),
2233
+ bindHttp(
2234
+ http.post("/console/access/key-blast", {
2235
+ in: AccessKeyBlastIn,
2236
+ out: AccessKeyBlastOut,
2237
+ errors: { AuthFailed, AccessKeyNotFound },
2238
+ }),
2239
+ accessKeyBlast,
2240
+ ),
2241
+ bindHttp(
2242
+ http.post("/console/access/keys", {
2243
+ in: AccessCreateKeyIn,
2244
+ out: AccessCreateKeyOut,
2245
+ errors: { AuthFailed, AccessGrantDenied },
2246
+ }),
2247
+ accessCreateKeyFlow,
2248
+ ),
2249
+ bindHttp(
2250
+ http.post("/console/access/keys/revoke", {
2251
+ in: AccessRevokeKeyIn,
2252
+ out: AccessRevokeKeyOut,
2253
+ errors: { AuthFailed, AccessKeyNotFound, ConfirmRequired },
2254
+ }),
2255
+ accessRevokeKeyFlow,
2256
+ ),
2257
+ bindHttp(
2258
+ http.post("/console/access/keys/rotate", {
2259
+ in: AccessRotateKeyIn,
2260
+ out: AccessRotateKeyOut,
2261
+ errors: { AuthFailed, AccessKeyNotFound, ConfirmRequired },
2262
+ }),
2263
+ accessRotateKeyFlow,
2264
+ ),
2265
+ bindHttp(
2266
+ http.post("/console/access/keys/update", {
2267
+ in: AccessUpdateKeyIn,
2268
+ out: AccessUpdateKeyOut,
2269
+ errors: { AuthFailed, AccessKeyNotFound, AccessGrantDenied },
2270
+ }),
2271
+ accessUpdateKeyFlow,
2272
+ ),
2273
+ bindHttp(
2274
+ http.post("/console/access/roles/grants", {
2275
+ in: AccessSetRoleGrantsIn,
2276
+ out: AccessSetRoleGrantsOut,
2277
+ errors: { AuthFailed, AccessGrantDenied },
2278
+ }),
2279
+ accessSetRoleGrantsFlow,
2280
+ ),
2281
+ bindHttp(http.get("/console/diff", { out: DiffListOut, errors: { AuthFailed } }), diffList),
2282
+ bindHttp(
2283
+ http.get("/console/plugins", { out: PluginsListOut, errors: { AuthFailed } }),
2284
+ pluginsList,
2285
+ ),
2286
+ bindHttp(http.get("/console/clock", { out: ClockListOut, errors: { AuthFailed } }), clockList),
2287
+ bindHttp(
2288
+ http.get("/console/instances", { out: InstancesListOut, errors: { AuthFailed } }),
2289
+ instancesList,
2290
+ ),
2291
+ bindHttp(
2292
+ http.post("/console/clock/run-now", {
2293
+ in: ClockRunNowIn,
2294
+ out: ClockRunNowOut,
2295
+ errors: { AuthFailed, ClockNotFound, ConfirmRequired },
2296
+ }),
2297
+ clockRunNow,
2298
+ ),
2299
+ bindHttp(
2300
+ http.post("/console/clock/pause", {
2301
+ in: ClockPauseIn,
2302
+ out: ClockPauseOut,
2303
+ errors: { AuthFailed, ClockNotFound },
2304
+ }),
2305
+ clockPause,
2306
+ ),
2307
+ bindHttp(
2308
+ http.post("/console/clock/edit-schedule", {
2309
+ in: ClockEditIn,
2310
+ out: ClockEditOut,
2311
+ errors: { AuthFailed, ClockNotFound, ScheduleNotOverridable },
2312
+ }),
2313
+ clockEditSchedule,
2314
+ ),
2315
+ bindHttp(
2316
+ http.post("/console/clock/wake-early", {
2317
+ in: ClockWakeEarlyIn,
2318
+ out: ClockWakeEarlyOut,
2319
+ errors: { AuthFailed, ClockNotFound },
2320
+ }),
2321
+ clockWakeEarly,
2322
+ ),
2323
+ bindHttp(
2324
+ http.get("/console/channels", { out: ChannelsListOut, errors: { AuthFailed } }),
2325
+ channelsList,
2326
+ ),
2327
+ bindHttp(
2328
+ http.query("/console/channels/preview", {
2329
+ in: ChannelPreviewIn,
2330
+ out: ChannelPreviewOut,
2331
+ errors: { AuthFailed, ChannelNotFound },
2332
+ }),
2333
+ channelPreview,
2334
+ ),
2335
+ bindHttp(
2336
+ http.post("/console/channels/verify-auth", {
2337
+ in: ChannelVerifyAuthIn,
2338
+ out: ChannelVerifyAuthOut,
2339
+ errors: { AuthFailed },
2340
+ }),
2341
+ channelVerifyAuth,
2342
+ ),
2343
+ bindHttp(
2344
+ http.post("/console/channels/reveal", {
2345
+ in: ChannelRevealIn,
2346
+ out: ChannelRevealOut,
2347
+ errors: { AuthFailed, ChannelNotFound },
2348
+ }),
2349
+ channelReveal,
2350
+ ),
2351
+ bindHttp(
2352
+ http.post("/console/channels/send-test", {
2353
+ in: ChannelSendTestIn,
2354
+ out: ChannelSendTestOut,
2355
+ errors: { AuthFailed, ChannelNotFound, ConfirmRequired },
2356
+ }),
2357
+ channelSendTest,
2358
+ ),
1990
2359
  ];
1991
2360
 
1992
2361
  return {
@@ -2069,7 +2438,6 @@ export function createConsoleBindings(state: ConsoleState): {
2069
2438
  function createSetupStatus(state: ConsoleState) {
2070
2439
  return flow("console.setup.status", {
2071
2440
  plane: "operator",
2072
- out: SetupStatusOut,
2073
2441
  do: () => ({
2074
2442
  setupClosed: state.setupClosed,
2075
2443
  claimRequired: !state.setupClosed,
@@ -2080,9 +2448,6 @@ function createSetupStatus(state: ConsoleState) {
2080
2448
  function createSetupClaim(state: ConsoleState) {
2081
2449
  return flow("console.setup.claim", {
2082
2450
  plane: "operator",
2083
- in: ClaimIn,
2084
- out: SessionOut,
2085
- errors: { SetupClosed, ClaimFailed },
2086
2451
  do: async (input: z.infer<typeof ClaimIn>, fx) => {
2087
2452
  if (state.setupClosed) {
2088
2453
  const data = { reason: "first_operator_exists" };
@@ -2131,9 +2496,6 @@ function createSetupClaim(state: ConsoleState) {
2131
2496
  function createSessionLogin(state: ConsoleState) {
2132
2497
  return flow("console.session.login", {
2133
2498
  plane: "operator",
2134
- in: LoginIn,
2135
- out: SessionOut,
2136
- errors: { AuthFailed, AuthRateLimited },
2137
2499
  do: async (input: z.infer<typeof LoginIn>, fx) => {
2138
2500
  if (touchLoginRateLimit(state.loginAttempts, input.email, state.now()) === "rate_limited") {
2139
2501
  return fail("AuthRateLimited", {
@@ -2152,8 +2514,6 @@ function createSessionLogin(state: ConsoleState) {
2152
2514
  function createSessionMe(state: ConsoleState) {
2153
2515
  return flow("console.session.me", {
2154
2516
  plane: "operator",
2155
- out: MeOut,
2156
- errors: { AuthFailed },
2157
2517
  do: (_input, fx) => {
2158
2518
  const id = fx.operator.id;
2159
2519
  if (!id) return fail("AuthFailed", {});
@@ -2172,7 +2532,6 @@ function createSessionMe(state: ConsoleState) {
2172
2532
  function createSessionLogout() {
2173
2533
  return flow("console.session.logout", {
2174
2534
  plane: "operator",
2175
- out: z.object({ ok: z.literal(true) }),
2176
2535
  do: (_input, fx) => {
2177
2536
  fx.log.info("console.session.logout", {
2178
2537
  operatorId: fx.operator.id,
@@ -2185,8 +2544,6 @@ function createSessionLogout() {
2185
2544
  function createManifestGet(state: ConsoleState) {
2186
2545
  return flow("console.manifest.get", {
2187
2546
  plane: "operator",
2188
- out: ManifestOut,
2189
- errors: { AuthFailed },
2190
2547
  do: (_input, fx) => {
2191
2548
  if (!fx.operator.id) return fail("AuthFailed", {});
2192
2549
  return { manifest: state.manifest };
@@ -2197,9 +2554,6 @@ function createManifestGet(state: ConsoleState) {
2197
2554
  function createRunsQuery(state: ConsoleState) {
2198
2555
  return flow("console.runs.query", {
2199
2556
  plane: "operator",
2200
- in: RunsQueryIn,
2201
- out: RunsQueryOut,
2202
- errors: { AuthFailed, QueryRejected, QueryTimeout, QueryFailed },
2203
2557
  do: async (input: z.infer<typeof RunsQueryIn>, fx) => {
2204
2558
  if (!fx.operator.id) return fail("AuthFailed", {});
2205
2559
  if (input.revealPii === true) {
@@ -2241,8 +2595,6 @@ function createRunsQuery(state: ConsoleState) {
2241
2595
  function createRunsList(state: ConsoleState) {
2242
2596
  return flow("console.runs.list", {
2243
2597
  plane: "operator",
2244
- out: RunsListOut,
2245
- errors: { AuthFailed },
2246
2598
  do: async (_input, fx) => {
2247
2599
  if (!fx.operator.id) return fail("AuthFailed", {});
2248
2600
  const all = await state.listRuns();
@@ -2304,6 +2656,7 @@ export function projectRun(r: WideEvent, piiFields: ReadonlySet<string> = new Se
2304
2656
  timestamp: e.timestamp,
2305
2657
  duration: e.duration,
2306
2658
  reversibility: e.reversibility,
2659
+ ...(e.external !== undefined ? { external: e.external } : {}),
2307
2660
  })),
2308
2661
  logs: masked.logs.map((line) => ({
2309
2662
  level: line.level,
@@ -2320,9 +2673,6 @@ export function projectRun(r: WideEvent, piiFields: ReadonlySet<string> = new Se
2320
2673
  function createTracesReplay(state: ConsoleState) {
2321
2674
  return flow("console.traces.replay", {
2322
2675
  plane: "operator",
2323
- in: TracesReplayIn,
2324
- out: TracesReplayOut,
2325
- errors: { AuthFailed, NotFound, ReplayUnavailable, ReplayFailed },
2326
2676
  do: async (input: z.infer<typeof TracesReplayIn>, fx) => {
2327
2677
  if (!fx.operator.id) return fail("AuthFailed", {});
2328
2678
  const all = await state.listRuns();
@@ -2385,8 +2735,6 @@ function createTracesReplay(state: ConsoleState) {
2385
2735
  function createSignalsList(state: ConsoleState) {
2386
2736
  return flow("console.signals.list", {
2387
2737
  plane: "operator",
2388
- out: SignalsListOut,
2389
- errors: { AuthFailed },
2390
2738
  do: async (_input, fx) => {
2391
2739
  if (!fx.operator.id) return fail("AuthFailed", {});
2392
2740
  const signals = await state.listSignals();
@@ -2398,9 +2746,6 @@ function createSignalsList(state: ConsoleState) {
2398
2746
  function createSignalsReplay(state: ConsoleState) {
2399
2747
  return flow("console.signals.replay", {
2400
2748
  plane: "operator",
2401
- in: SignalsReplayIn,
2402
- out: SignalsReplayOut,
2403
- errors: { AuthFailed, SignalNotFound, ConfirmRequired },
2404
2749
  do: async (input: z.infer<typeof SignalsReplayIn>, fx) => {
2405
2750
  if (!fx.operator.id) return fail("AuthFailed", {});
2406
2751
  return runSignalReplay(state, fx, { ...input, dryRun: false });
@@ -2411,9 +2756,6 @@ function createSignalsReplay(state: ConsoleState) {
2411
2756
  function createSignalsDryRunReplay(state: ConsoleState) {
2412
2757
  return flow("console.signals.dryRunReplay", {
2413
2758
  plane: "operator",
2414
- in: SignalsReplayIn.omit({ dryRun: true }),
2415
- out: SignalsReplayOut,
2416
- errors: { AuthFailed, SignalNotFound, DryRunUnsafe },
2417
2759
  do: async (input: Omit<z.infer<typeof SignalsReplayIn>, "dryRun">, fx) => {
2418
2760
  if (!fx.operator.id) return fail("AuthFailed", {});
2419
2761
  return runSignalReplay(state, fx, { ...input, dryRun: true });
@@ -2424,9 +2766,6 @@ function createSignalsDryRunReplay(state: ConsoleState) {
2424
2766
  function createSignalsDiscard(state: ConsoleState) {
2425
2767
  return flow("console.signals.discard", {
2426
2768
  plane: "operator",
2427
- in: SignalsDiscardIn,
2428
- out: SignalsDiscardOut,
2429
- errors: { AuthFailed, SignalNotFound, ConfirmRequired },
2430
2769
  do: async (input: z.infer<typeof SignalsDiscardIn>, fx) => {
2431
2770
  if (!fx.operator.id) return fail("AuthFailed", {});
2432
2771
  const rows = await state.listSignals();
@@ -2566,9 +2905,6 @@ function dryRunSafety(row: {
2566
2905
  function createActionPing(state: ConsoleState) {
2567
2906
  return flow("console.action.ping", {
2568
2907
  plane: "operator",
2569
- in: ActionPingIn,
2570
- out: ActionPingOut,
2571
- errors: { AuthFailed },
2572
2908
  do: (input: z.infer<typeof ActionPingIn>, fx) => {
2573
2909
  if (!fx.operator.id) return fail("AuthFailed", {});
2574
2910
  fx.log.info("console.action.ping", {
@@ -2583,9 +2919,6 @@ function createActionPing(state: ConsoleState) {
2583
2919
  function createStructuralPropose(state: ConsoleState) {
2584
2920
  return flow("console.structural.propose", {
2585
2921
  plane: "operator",
2586
- in: StructuralIn,
2587
- out: StructuralOut,
2588
- errors: { AuthFailed },
2589
2922
  do: async (input: z.infer<typeof StructuralIn>, fx) => {
2590
2923
  if (!fx.operator.id) return fail("AuthFailed", {});
2591
2924
  const proposal = await emitStructuralDiff({
@@ -2609,8 +2942,6 @@ function createStructuralPropose(state: ConsoleState) {
2609
2942
  function createFlowsIdentities(state: ConsoleState) {
2610
2943
  return flow("console.flows.identities", {
2611
2944
  plane: "operator",
2612
- out: IdentitiesOut,
2613
- errors: { AuthFailed },
2614
2945
  do: (_input, fx) => {
2615
2946
  if (!fx.operator.id) return fail("AuthFailed", {});
2616
2947
  return {
@@ -2629,9 +2960,6 @@ function createFlowsIdentities(state: ConsoleState) {
2629
2960
  function createFlowsInvoke(state: ConsoleState) {
2630
2961
  return flow("console.flows.invoke", {
2631
2962
  plane: "operator",
2632
- in: InvokeIn,
2633
- out: InvokeOut,
2634
- errors: { AuthFailed, NotFound, InvokeDenied, ConfirmRequired },
2635
2963
  do: async (input: z.infer<typeof InvokeIn>, fx) => {
2636
2964
  if (!fx.operator.id) return fail("AuthFailed", {});
2637
2965
  const manifest = state.manifest;
@@ -2816,8 +3144,6 @@ function requireTenantIfDeclared(
2816
3144
  function createStoreList(state: ConsoleState) {
2817
3145
  return flow("console.store.list", {
2818
3146
  plane: "operator",
2819
- out: StoreListOut,
2820
- errors: { AuthFailed },
2821
3147
  do: async (_input, fx) => {
2822
3148
  if (!fx.operator.id) return fail("AuthFailed", {});
2823
3149
  return state.listStores();
@@ -2854,9 +3180,6 @@ function consoleStoreRls(
2854
3180
  function createStoreQuery(state: ConsoleState) {
2855
3181
  return flow("console.store.query", {
2856
3182
  plane: "operator",
2857
- in: StoreQueryIn,
2858
- out: StoreQueryOut,
2859
- errors: { AuthFailed, TenantRequired, StoreNotFound },
2860
3183
  do: async (input: z.infer<typeof StoreQueryIn>, fx) => {
2861
3184
  if (!fx.operator.id) return fail("AuthFailed", {});
2862
3185
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -2892,9 +3215,6 @@ function createStoreQuery(state: ConsoleState) {
2892
3215
  function createStoreReveal(state: ConsoleState) {
2893
3216
  return flow("console.store.reveal", {
2894
3217
  plane: "operator",
2895
- in: StoreRevealIn,
2896
- out: StoreRevealOut,
2897
- errors: { AuthFailed, TenantRequired, StoreNotFound },
2898
3218
  do: async (input: z.infer<typeof StoreRevealIn>, fx) => {
2899
3219
  if (!fx.operator.id) return fail("AuthFailed", {});
2900
3220
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -2928,9 +3248,6 @@ function createStoreReveal(state: ConsoleState) {
2928
3248
  function createStoreObject(state: ConsoleState) {
2929
3249
  return flow("console.store.object", {
2930
3250
  plane: "operator",
2931
- in: StoreFileGetIn,
2932
- out: StoreFileGetOut,
2933
- errors: { AuthFailed, TenantRequired, StoreNotFound },
2934
3251
  do: async (input: z.infer<typeof StoreFileGetIn>, fx) => {
2935
3252
  if (!fx.operator.id) return fail("AuthFailed", {});
2936
3253
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -2964,9 +3281,6 @@ function createStoreObject(state: ConsoleState) {
2964
3281
  function createStoreEdit(state: ConsoleState) {
2965
3282
  return flow("console.store.edit", {
2966
3283
  plane: "operator",
2967
- in: StoreEditIn,
2968
- out: StoreEditOut,
2969
- errors: { AuthFailed, TenantRequired, ConfirmRequired, StoreNotFound },
2970
3284
  do: async (input: z.infer<typeof StoreEditIn>, fx) => {
2971
3285
  if (!fx.operator.id) return fail("AuthFailed", {});
2972
3286
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -3049,9 +3363,6 @@ function createStoreEdit(state: ConsoleState) {
3049
3363
  function createStoreDelete(state: ConsoleState) {
3050
3364
  return flow("console.store.delete", {
3051
3365
  plane: "operator",
3052
- in: StoreDeleteIn,
3053
- out: StoreDeleteOut,
3054
- errors: { AuthFailed, TenantRequired, ConfirmRequired },
3055
3366
  do: async (input: z.infer<typeof StoreDeleteIn>, fx) => {
3056
3367
  if (!fx.operator.id) return fail("AuthFailed", {});
3057
3368
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -3089,9 +3400,6 @@ function createStoreDelete(state: ConsoleState) {
3089
3400
  function createStorePurgeCache(state: ConsoleState) {
3090
3401
  return flow("console.store.purgeCache", {
3091
3402
  plane: "operator",
3092
- in: StorePurgeIn,
3093
- out: StorePurgeOut,
3094
- errors: { AuthFailed, ConfirmRequired },
3095
3403
  do: async (input: z.infer<typeof StorePurgeIn>, fx) => {
3096
3404
  if (!fx.operator.id) return fail("AuthFailed", {});
3097
3405
  if (state.production) {
@@ -3121,9 +3429,6 @@ function createStorePurgeCache(state: ConsoleState) {
3121
3429
  function createStoreSql(state: ConsoleState) {
3122
3430
  return flow("console.store.sql", {
3123
3431
  plane: "operator",
3124
- in: StoreSqlIn,
3125
- out: StoreSqlOut,
3126
- errors: { AuthFailed, TenantRequired, StoreNotFound },
3127
3432
  do: async (input: z.infer<typeof StoreSqlIn>, fx) => {
3128
3433
  if (!fx.operator.id) return fail("AuthFailed", {});
3129
3434
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -3191,16 +3496,6 @@ function failStoreSqlStats(err: unknown) {
3191
3496
  function createStoreSqlStats(state: ConsoleState) {
3192
3497
  return flow("console.store.sql.stats", {
3193
3498
  plane: "operator",
3194
- in: StoreSqlStatsIn,
3195
- out: StoreSqlStatsOut,
3196
- errors: {
3197
- AuthFailed,
3198
- TenantRequired,
3199
- StoreNotFound,
3200
- PgStatStatementsNotPreloaded,
3201
- PgStatStatementsUnsupported,
3202
- PgStatStatementsNotCreated,
3203
- },
3204
3499
  do: async (input: z.infer<typeof StoreSqlStatsIn>, fx) => {
3205
3500
  if (!fx.operator.id) return fail("AuthFailed", {});
3206
3501
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -3223,16 +3518,6 @@ function createStoreSqlStats(state: ConsoleState) {
3223
3518
  function createStoreSqlLocks(state: ConsoleState) {
3224
3519
  return flow("console.store.sql.locks", {
3225
3520
  plane: "operator",
3226
- in: StoreSqlLocksIn,
3227
- out: StoreSqlLocksOut,
3228
- errors: {
3229
- AuthFailed,
3230
- TenantRequired,
3231
- StoreNotFound,
3232
- PgStatStatementsNotPreloaded,
3233
- PgStatStatementsUnsupported,
3234
- PgStatStatementsNotCreated,
3235
- },
3236
3521
  do: async (input: z.infer<typeof StoreSqlLocksIn>, fx) => {
3237
3522
  if (!fx.operator.id) return fail("AuthFailed", {});
3238
3523
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -3265,16 +3550,6 @@ function createStoreSqlLocks(state: ConsoleState) {
3265
3550
  function createStoreSqlAdvise(state: ConsoleState) {
3266
3551
  return flow("console.store.sql.advise", {
3267
3552
  plane: "operator",
3268
- in: StoreSqlAdviseIn,
3269
- out: StoreSqlAdviseOut,
3270
- errors: {
3271
- AuthFailed,
3272
- TenantRequired,
3273
- StoreNotFound,
3274
- PgStatStatementsNotPreloaded,
3275
- PgStatStatementsUnsupported,
3276
- PgStatStatementsNotCreated,
3277
- },
3278
3553
  do: async (input: z.infer<typeof StoreSqlAdviseIn>, fx) => {
3279
3554
  if (!fx.operator.id) return fail("AuthFailed", {});
3280
3555
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -3306,14 +3581,6 @@ function failStoreKvStats(err: unknown) {
3306
3581
  function createStoreKvStats(state: ConsoleState) {
3307
3582
  return flow("console.store.kv.stats", {
3308
3583
  plane: "operator",
3309
- in: StoreKvStatsIn,
3310
- out: StoreKvStatsOut,
3311
- errors: {
3312
- AuthFailed,
3313
- TenantRequired,
3314
- StoreNotFound,
3315
- KvStatsUnsupported,
3316
- },
3317
3584
  do: async (input: z.infer<typeof StoreKvStatsIn>, fx) => {
3318
3585
  if (!fx.operator.id) return fail("AuthFailed", {});
3319
3586
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -3347,9 +3614,6 @@ function createStoreKvStats(state: ConsoleState) {
3347
3614
  function createStorePreview(state: ConsoleState) {
3348
3615
  return flow("console.store.preview", {
3349
3616
  plane: "operator",
3350
- in: StorePreviewIn,
3351
- out: StorePreviewOut,
3352
- errors: { AuthFailed, TenantRequired, DryRunUnsafe },
3353
3617
  do: async (input: z.infer<typeof StorePreviewIn>, fx) => {
3354
3618
  if (!fx.operator.id) return fail("AuthFailed", {});
3355
3619
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
@@ -3397,8 +3661,6 @@ function createStorePreview(state: ConsoleState) {
3397
3661
  function createVaultList(state: ConsoleState) {
3398
3662
  return flow("console.vault.list", {
3399
3663
  plane: "operator",
3400
- out: VaultListOut,
3401
- errors: { AuthFailed },
3402
3664
  do: async (_input, fx) => {
3403
3665
  if (!fx.operator.id) return fail("AuthFailed", {});
3404
3666
  return state.listVault();
@@ -3409,9 +3671,6 @@ function createVaultList(state: ConsoleState) {
3409
3671
  function createVaultCreate(state: ConsoleState) {
3410
3672
  return flow("console.vault.create", {
3411
3673
  plane: "operator",
3412
- in: VaultCreateIn,
3413
- out: VaultWriteOut,
3414
- errors: { AuthFailed, VaultExists, VaultNotFound },
3415
3674
  do: async (input: z.infer<typeof VaultCreateIn>, fx) => {
3416
3675
  if (!fx.operator.id) return fail("AuthFailed", {});
3417
3676
  try {
@@ -3448,9 +3707,6 @@ function createVaultCreate(state: ConsoleState) {
3448
3707
  function createVaultSet(state: ConsoleState) {
3449
3708
  return flow("console.vault.set", {
3450
3709
  plane: "operator",
3451
- in: VaultWriteIn,
3452
- out: VaultWriteOut,
3453
- errors: { AuthFailed, VaultNotFound },
3454
3710
  do: async (input: z.infer<typeof VaultWriteIn>, fx) => {
3455
3711
  if (!fx.operator.id) return fail("AuthFailed", {});
3456
3712
  if (!(await vaultNameKnown(state, input.name))) {
@@ -3487,9 +3743,6 @@ function createVaultSet(state: ConsoleState) {
3487
3743
  function createVaultRotate(state: ConsoleState) {
3488
3744
  return flow("console.vault.rotate", {
3489
3745
  plane: "operator",
3490
- in: VaultWriteIn,
3491
- out: VaultWriteOut,
3492
- errors: { AuthFailed, VaultNotFound },
3493
3746
  do: async (input: z.infer<typeof VaultWriteIn>, fx) => {
3494
3747
  if (!fx.operator.id) return fail("AuthFailed", {});
3495
3748
  if (!(await vaultNameKnown(state, input.name))) {
@@ -3531,9 +3784,6 @@ function createVaultRotate(state: ConsoleState) {
3531
3784
  function createVaultRotateMaster(state: ConsoleState) {
3532
3785
  return flow("console.vault.rotateMaster", {
3533
3786
  plane: "operator",
3534
- in: VaultRotateMasterIn,
3535
- out: VaultRotateMasterOut,
3536
- errors: { AuthFailed, ConfirmRequired, VaultSealed, VaultRotateBusy, VaultUnsupported },
3537
3787
  do: async (input: z.infer<typeof VaultRotateMasterIn>, fx) => {
3538
3788
  if (!fx.operator.id) return fail("AuthFailed", {});
3539
3789
  if (input.confirmation !== "ROTATE_MASTER" || !input.reason || input.reason.length < 3) {
@@ -3568,8 +3818,6 @@ function createVaultRotateMaster(state: ConsoleState) {
3568
3818
  function createVaultAuditVerify(state: ConsoleState) {
3569
3819
  return flow("console.vault.auditVerify", {
3570
3820
  plane: "operator",
3571
- out: VaultAuditVerifyOut,
3572
- errors: { AuthFailed, VaultUnsupported },
3573
3821
  do: async (_input, fx) => {
3574
3822
  if (!fx.operator.id) return fail("AuthFailed", {});
3575
3823
  try {
@@ -3612,8 +3860,6 @@ async function vaultNameKnown(state: ConsoleState, name: string): Promise<boolea
3612
3860
  function createAiList(state: ConsoleState) {
3613
3861
  return flow("console.ai.list", {
3614
3862
  plane: "operator",
3615
- out: AiListOut,
3616
- errors: { AuthFailed },
3617
3863
  do: async (_input, fx) => {
3618
3864
  if (!fx.operator.id) return fail("AuthFailed", {});
3619
3865
  const projection = await state.listAi();
@@ -3668,8 +3914,6 @@ function createAiList(state: ConsoleState) {
3668
3914
  function createGatesList(state: ConsoleState) {
3669
3915
  return flow("console.gates.list", {
3670
3916
  plane: "operator",
3671
- out: GatesListOut,
3672
- errors: { AuthFailed },
3673
3917
  do: async (_input, fx) => {
3674
3918
  if (!fx.operator.id) return fail("AuthFailed", {});
3675
3919
  const projection = await state.listGates();
@@ -3732,8 +3976,6 @@ function createGatesList(state: ConsoleState) {
3732
3976
  function createDiffList(state: ConsoleState) {
3733
3977
  return flow("console.diff.list", {
3734
3978
  plane: "operator",
3735
- out: DiffListOut,
3736
- errors: { AuthFailed },
3737
3979
  do: async (_input, fx) => {
3738
3980
  if (!fx.operator.id) return fail("AuthFailed", {});
3739
3981
  const projection = await state.listDiff();
@@ -3764,8 +4006,6 @@ function createDiffList(state: ConsoleState) {
3764
4006
  function createPluginsList(state: ConsoleState) {
3765
4007
  return flow("console.plugin.list", {
3766
4008
  plane: "operator",
3767
- out: PluginsListOut,
3768
- errors: { AuthFailed },
3769
4009
  do: async (_input, fx) => {
3770
4010
  if (!fx.operator.id) return fail("AuthFailed", {});
3771
4011
  return state.listPlugins();
@@ -3776,9 +4016,6 @@ function createPluginsList(state: ConsoleState) {
3776
4016
  function createGatesSimulate(state: ConsoleState) {
3777
4017
  return flow("console.gates.simulate", {
3778
4018
  plane: "operator",
3779
- in: GatesSimulateIn,
3780
- out: GatesSimulateOut,
3781
- errors: { AuthFailed },
3782
4019
  do: async (input: z.infer<typeof GatesSimulateIn>, fx) => {
3783
4020
  if (!fx.operator.id) return fail("AuthFailed", {});
3784
4021
  const result = await state.simulateGates(input);
@@ -3810,9 +4047,6 @@ function createGatesSimulate(state: ConsoleState) {
3810
4047
  function createGatesPowers(state: ConsoleState) {
3811
4048
  return flow("console.gates.powers", {
3812
4049
  plane: "operator",
3813
- in: GatesPowersIn,
3814
- out: GatesPowersOut,
3815
- errors: { AuthFailed },
3816
4050
  do: async (input: z.infer<typeof GatesPowersIn>, fx) => {
3817
4051
  if (!fx.operator.id) return fail("AuthFailed", {});
3818
4052
  const result = await state.powersForPrincipal(input);
@@ -3881,8 +4115,6 @@ export function resolveAccessKeyIssuer(
3881
4115
  function createAccessList(state: ConsoleState) {
3882
4116
  return flow("console.access.list", {
3883
4117
  plane: "operator",
3884
- out: AccessListOut,
3885
- errors: { AuthFailed },
3886
4118
  do: async (_input, fx) => {
3887
4119
  if (!fx.operator.id) return fail("AuthFailed", {});
3888
4120
  return state.listAccess(actorScopesOf(state, fx.operator.id));
@@ -3893,9 +4125,6 @@ function createAccessList(state: ConsoleState) {
3893
4125
  function createAccessEffective(state: ConsoleState) {
3894
4126
  return flow("console.access.effective", {
3895
4127
  plane: "operator",
3896
- in: AccessEffectiveIn,
3897
- out: AccessEffectiveOut,
3898
- errors: { AuthFailed, NotFound },
3899
4128
  do: async (input: z.infer<typeof AccessEffectiveIn>, fx) => {
3900
4129
  if (!fx.operator.id) return fail("AuthFailed", {});
3901
4130
  const result = await state.accessEffective(input);
@@ -3918,9 +4147,6 @@ function createAccessEffective(state: ConsoleState) {
3918
4147
  function createAccessKeyBlast(state: ConsoleState) {
3919
4148
  return flow("console.access.keyBlast", {
3920
4149
  plane: "operator",
3921
- in: AccessKeyBlastIn,
3922
- out: AccessKeyBlastOut,
3923
- errors: { AuthFailed, AccessKeyNotFound },
3924
4150
  do: async (input: z.infer<typeof AccessKeyBlastIn>, fx) => {
3925
4151
  if (!fx.operator.id) return fail("AuthFailed", {});
3926
4152
  if (!state.apiKeys.keys.has(input.keyId)) {
@@ -3934,9 +4160,6 @@ function createAccessKeyBlast(state: ConsoleState) {
3934
4160
  function createAccessCreateKey(state: ConsoleState) {
3935
4161
  return flow("console.access.createKey", {
3936
4162
  plane: "operator",
3937
- in: AccessCreateKeyIn,
3938
- out: AccessCreateKeyOut,
3939
- errors: { AuthFailed, AccessGrantDenied },
3940
4163
  do: async (input: z.infer<typeof AccessCreateKeyIn>, fx) => {
3941
4164
  if (!fx.operator.id) return fail("AuthFailed", {});
3942
4165
  try {
@@ -3972,9 +4195,6 @@ function createAccessCreateKey(state: ConsoleState) {
3972
4195
  function createAccessRevokeKey(state: ConsoleState) {
3973
4196
  return flow("console.access.revokeKey", {
3974
4197
  plane: "operator",
3975
- in: AccessRevokeKeyIn,
3976
- out: AccessRevokeKeyOut,
3977
- errors: { AuthFailed, AccessKeyNotFound, ConfirmRequired },
3978
4198
  do: async (input: z.infer<typeof AccessRevokeKeyIn>, fx) => {
3979
4199
  if (!fx.operator.id) return fail("AuthFailed", {});
3980
4200
  if (input.confirmation !== "REVOKE" || (input.reason?.trim().length ?? 0) < 3) {
@@ -4002,9 +4222,6 @@ function createAccessRevokeKey(state: ConsoleState) {
4002
4222
  function createAccessRotateKey(state: ConsoleState) {
4003
4223
  return flow("console.access.rotateKey", {
4004
4224
  plane: "operator",
4005
- in: AccessRotateKeyIn,
4006
- out: AccessRotateKeyOut,
4007
- errors: { AuthFailed, AccessKeyNotFound, ConfirmRequired },
4008
4225
  do: async (input: z.infer<typeof AccessRotateKeyIn>, fx) => {
4009
4226
  if (!fx.operator.id) return fail("AuthFailed", {});
4010
4227
  if (input.confirmation !== "ROTATE" || (input.reason?.trim().length ?? 0) < 3) {
@@ -4035,9 +4252,6 @@ function createAccessRotateKey(state: ConsoleState) {
4035
4252
  function createAccessUpdateKey(state: ConsoleState) {
4036
4253
  return flow("console.access.updateKey", {
4037
4254
  plane: "operator",
4038
- in: AccessUpdateKeyIn,
4039
- out: AccessUpdateKeyOut,
4040
- errors: { AuthFailed, AccessKeyNotFound, AccessGrantDenied },
4041
4255
  do: async (input: z.infer<typeof AccessUpdateKeyIn>, fx) => {
4042
4256
  if (!fx.operator.id) return fail("AuthFailed", {});
4043
4257
  try {
@@ -4062,9 +4276,6 @@ function createAccessUpdateKey(state: ConsoleState) {
4062
4276
  function createAccessSetRoleGrants(state: ConsoleState) {
4063
4277
  return flow("console.access.setRoleGrants", {
4064
4278
  plane: "operator",
4065
- in: AccessSetRoleGrantsIn,
4066
- out: AccessSetRoleGrantsOut,
4067
- errors: { AuthFailed, AccessGrantDenied },
4068
4279
  do: async (input: z.infer<typeof AccessSetRoleGrantsIn>, fx) => {
4069
4280
  if (!fx.operator.id) return fail("AuthFailed", {});
4070
4281
  try {
@@ -4091,8 +4302,6 @@ function createAccessSetRoleGrants(state: ConsoleState) {
4091
4302
  function createClockList(state: ConsoleState) {
4092
4303
  return flow("console.clock.list", {
4093
4304
  plane: "operator",
4094
- out: ClockListOut,
4095
- errors: { AuthFailed },
4096
4305
  do: async (_input, fx) => {
4097
4306
  if (!fx.operator.id) return fail("AuthFailed", {});
4098
4307
  return state.listClocks();
@@ -4103,8 +4312,6 @@ function createClockList(state: ConsoleState) {
4103
4312
  function createInstancesList(state: ConsoleState) {
4104
4313
  return flow("console.instances.list", {
4105
4314
  plane: "operator",
4106
- out: InstancesListOut,
4107
- errors: { AuthFailed },
4108
4315
  do: async (_input, fx) => {
4109
4316
  if (!fx.operator.id) return fail("AuthFailed", {});
4110
4317
  return state.listInstances();
@@ -4115,9 +4322,6 @@ function createInstancesList(state: ConsoleState) {
4115
4322
  function createClockRunNow(state: ConsoleState) {
4116
4323
  return flow("console.clock.runNow", {
4117
4324
  plane: "operator",
4118
- in: ClockRunNowIn,
4119
- out: ClockRunNowOut,
4120
- errors: { AuthFailed, ClockNotFound, ConfirmRequired },
4121
4325
  do: async (input: z.infer<typeof ClockRunNowIn>, fx) => {
4122
4326
  if (!fx.operator.id) return fail("AuthFailed", {});
4123
4327
  const list = await state.listClocks();
@@ -4160,9 +4364,6 @@ function createClockRunNow(state: ConsoleState) {
4160
4364
  function createClockPause(state: ConsoleState) {
4161
4365
  return flow("console.clock.pause", {
4162
4366
  plane: "operator",
4163
- in: ClockPauseIn,
4164
- out: ClockPauseOut,
4165
- errors: { AuthFailed, ClockNotFound },
4166
4367
  do: async (input: z.infer<typeof ClockPauseIn>, fx) => {
4167
4368
  if (!fx.operator.id) return fail("AuthFailed", {});
4168
4369
  try {
@@ -4190,9 +4391,6 @@ function createClockPause(state: ConsoleState) {
4190
4391
  function createClockEditSchedule(state: ConsoleState) {
4191
4392
  return flow("console.clock.editSchedule", {
4192
4393
  plane: "operator",
4193
- in: ClockEditIn,
4194
- out: ClockEditOut,
4195
- errors: { AuthFailed, ClockNotFound, ScheduleNotOverridable },
4196
4394
  do: async (input: z.infer<typeof ClockEditIn>, fx) => {
4197
4395
  if (!fx.operator.id) return fail("AuthFailed", {});
4198
4396
  try {
@@ -4228,9 +4426,6 @@ function createClockEditSchedule(state: ConsoleState) {
4228
4426
  function createClockWakeEarly(state: ConsoleState) {
4229
4427
  return flow("console.clock.wakeEarly", {
4230
4428
  plane: "operator",
4231
- in: ClockWakeEarlyIn,
4232
- out: ClockWakeEarlyOut,
4233
- errors: { AuthFailed, ClockNotFound },
4234
4429
  do: async (input: z.infer<typeof ClockWakeEarlyIn>, fx) => {
4235
4430
  if (!fx.operator.id) return fail("AuthFailed", {});
4236
4431
  try {
@@ -4260,8 +4455,6 @@ function createClockWakeEarly(state: ConsoleState) {
4260
4455
  function createChannelsList(state: ConsoleState) {
4261
4456
  return flow("console.channel.list", {
4262
4457
  plane: "operator",
4263
- out: ChannelsListOut,
4264
- errors: { AuthFailed },
4265
4458
  do: async (_input, fx) => {
4266
4459
  if (!fx.operator.id) return fail("AuthFailed", {});
4267
4460
  return state.listChannels();
@@ -4272,9 +4465,6 @@ function createChannelsList(state: ConsoleState) {
4272
4465
  function createChannelPreview(state: ConsoleState) {
4273
4466
  return flow("console.channel.preview", {
4274
4467
  plane: "operator",
4275
- in: ChannelPreviewIn,
4276
- out: ChannelPreviewOut,
4277
- errors: { AuthFailed, ChannelNotFound },
4278
4468
  do: async (input: z.infer<typeof ChannelPreviewIn>, fx) => {
4279
4469
  if (!fx.operator.id) return fail("AuthFailed", {});
4280
4470
  if (
@@ -4292,9 +4482,6 @@ function createChannelPreview(state: ConsoleState) {
4292
4482
  function createChannelVerifyAuth(state: ConsoleState) {
4293
4483
  return flow("console.channel.verifyAuth", {
4294
4484
  plane: "operator",
4295
- in: ChannelVerifyAuthIn,
4296
- out: ChannelVerifyAuthOut,
4297
- errors: { AuthFailed },
4298
4485
  do: async (input: z.infer<typeof ChannelVerifyAuthIn>, fx) => {
4299
4486
  if (!fx.operator.id) return fail("AuthFailed", {});
4300
4487
  return state.verifyChannelAuth(input.from);
@@ -4305,9 +4492,6 @@ function createChannelVerifyAuth(state: ConsoleState) {
4305
4492
  function createChannelReveal(state: ConsoleState) {
4306
4493
  return flow("console.channel.reveal", {
4307
4494
  plane: "operator",
4308
- in: ChannelRevealIn,
4309
- out: ChannelRevealOut,
4310
- errors: { AuthFailed, ChannelNotFound },
4311
4495
  do: async (input: z.infer<typeof ChannelRevealIn>, fx) => {
4312
4496
  if (!fx.operator.id) return fail("AuthFailed", {});
4313
4497
  const revealed = await state.revealChannel(input.id);
@@ -4331,9 +4515,6 @@ function createChannelReveal(state: ConsoleState) {
4331
4515
  function createChannelSendTest(state: ConsoleState) {
4332
4516
  return flow("console.channel.sendTest", {
4333
4517
  plane: "operator",
4334
- in: ChannelSendTestIn,
4335
- out: ChannelSendTestOut,
4336
- errors: { AuthFailed, ChannelNotFound, ConfirmRequired },
4337
4518
  do: async (input: z.infer<typeof ChannelSendTestIn>, fx) => {
4338
4519
  if (!fx.operator.id) return fail("AuthFailed", {});
4339
4520
  if (state.production) {