okengine 0.11.2 → 0.12.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 (1261) hide show
  1. package/manifest.v1.schema.json +1 -1
  2. package/package.json +57 -3
  3. package/site/content/docs/ai/index.mdx +2 -2
  4. package/site/content/docs/ai/llms-txt.mdx +21 -16
  5. package/site/content/docs/ai/mcp.mdx +1 -1
  6. package/site/content/docs/ai/skills.mdx +16 -14
  7. package/site/content/docs/deployment/docker-swarm.mdx +7 -8
  8. package/site/content/docs/deployment/docker.mdx +20 -12
  9. package/site/content/docs/deployment/index.mdx +2 -2
  10. package/site/content/docs/deployment/kubernetes.mdx +2 -2
  11. package/site/content/docs/deployment/reverse-proxy.mdx +39 -21
  12. package/site/content/docs/elements/ai.mdx +25 -15
  13. package/site/content/docs/elements/channel.mdx +2 -2
  14. package/site/content/docs/elements/clock.mdx +11 -1
  15. package/site/content/docs/elements/flow.mdx +66 -16
  16. package/site/content/docs/elements/gate.mdx +47 -39
  17. package/site/content/docs/elements/signal.mdx +2 -2
  18. package/site/content/docs/elements/store.mdx +191 -48
  19. package/site/content/docs/elements/vault.mdx +126 -41
  20. package/site/content/docs/get-started/basic-usage.mdx +14 -6
  21. package/site/content/docs/get-started/installation.mdx +24 -16
  22. package/site/content/docs/plugins/cors.mdx +9 -9
  23. package/site/content/docs/plugins/csrf.mdx +1 -1
  24. package/site/content/docs/providers/cockroachdb.mdx +13 -0
  25. package/site/content/docs/providers/neon.mdx +22 -0
  26. package/site/content/docs/providers/supabase.mdx +17 -0
  27. package/site/content/docs/providers/yugabytedb.mdx +15 -0
  28. package/site/content/docs/recipes/caddy.mdx +3 -3
  29. package/site/content/docs/recipes/cockroachdb.mdx +8 -2
  30. package/site/content/docs/recipes/index.mdx +6 -1
  31. package/site/content/docs/recipes/llama-cpp.mdx +5 -6
  32. package/site/content/docs/recipes/mailpit.mdx +3 -3
  33. package/site/content/docs/recipes/meilisearch.mdx +4 -4
  34. package/site/content/docs/recipes/meta.json +1 -0
  35. package/site/content/docs/recipes/nginx.mdx +117 -0
  36. package/site/content/docs/recipes/ollama.mdx +3 -3
  37. package/site/content/docs/recipes/pgdog.mdx +1 -1
  38. package/site/content/docs/recipes/postgres.mdx +44 -8
  39. package/site/content/docs/recipes/redis.mdx +7 -2
  40. package/site/content/docs/recipes/rustfs.mdx +4 -4
  41. package/site/content/docs/recipes/sglang.mdx +2 -2
  42. package/site/content/docs/recipes/supabase-docker.mdx +24 -0
  43. package/site/content/docs/recipes/timescale.mdx +30 -6
  44. package/site/content/docs/recipes/traefik.mdx +10 -7
  45. package/site/content/docs/recipes/vllm.mdx +2 -2
  46. package/site/content/docs/recipes/yugabytedb.mdx +7 -1
  47. package/site/content/docs/reference/cli.md +67 -34
  48. package/site/content/docs/reference/client.mdx +39 -20
  49. package/site/content/docs/reference/configuration.mdx +31 -24
  50. package/site/content/docs/reference/environment-variables.mdx +23 -20
  51. package/site/content/docs/reference/errors.mdx +25 -20
  52. package/site/content/docs/reference/fx.mdx +19 -12
  53. package/site/content/docs/reference/plugins.mdx +2 -2
  54. package/site/content/docs/reference/security.md +16 -7
  55. package/src/auth/auth.test.ts +2 -2
  56. package/src/auth/bindings.ts +5 -5
  57. package/src/auth/config.ts +8 -0
  58. package/src/auth/gate-auth.test.ts +5 -5
  59. package/src/auth/index.ts +3 -0
  60. package/src/auth/operator.ts +1 -1
  61. package/src/auth/password-policy.test.ts +142 -5
  62. package/src/auth/password-policy.ts +128 -12
  63. package/src/auth/plugin.ts +2 -2
  64. package/src/cli/ai-setup/ai-setup.test.ts +1 -1
  65. package/src/cli/ai-setup/apply.ts +3 -18
  66. package/src/cli/ai-setup/index.ts +4 -4
  67. package/src/cli/ai-setup/prompts.ts +1 -1
  68. package/src/cli/ask-seed.test.ts +27 -0
  69. package/src/cli/ask-seed.ts +11 -7
  70. package/src/cli/attach-host-console.test.ts +134 -0
  71. package/src/cli/attach-host-console.ts +100 -0
  72. package/src/cli/console-cmd.test.ts +81 -0
  73. package/src/cli/console-cmd.ts +107 -0
  74. package/src/cli/db-seed.ts +14 -3
  75. package/src/cli/db.test.ts +37 -2
  76. package/src/cli/db.ts +26 -0
  77. package/src/cli/dev-app-runner.ts +6 -40
  78. package/src/cli/dev-console-vite.test.ts +86 -0
  79. package/src/cli/dev-console-vite.ts +164 -0
  80. package/src/cli/dev-schema-sync.ts +2 -2
  81. package/src/cli/dev.test.ts +78 -2
  82. package/src/cli/dev.ts +170 -56
  83. package/src/cli/docker-cli.test.ts +2 -2
  84. package/src/cli/docker.ts +1 -1
  85. package/src/cli/doctor.ts +2 -1
  86. package/src/cli/drizzle-env.test.ts +4 -9
  87. package/src/cli/drizzle-env.ts +2 -2
  88. package/src/cli/hero-meta.test.ts +37 -0
  89. package/src/cli/hero-meta.ts +30 -9
  90. package/src/cli/index.ts +5 -0
  91. package/src/cli/load-config.images.test.ts +12 -12
  92. package/src/cli/load-config.ts +1 -1
  93. package/src/cli/project-state.test.ts +6 -2
  94. package/src/cli/project-state.ts +27 -11
  95. package/src/cli/registry.ts +11 -0
  96. package/src/cli/replay.ts +7 -2
  97. package/src/cli/vault-cmd.test.ts +2 -0
  98. package/src/cli/vault-cmd.ts +7 -2
  99. package/src/client/create.test.ts +38 -2
  100. package/src/client/create.ts +16 -11
  101. package/src/client/index.ts +6 -0
  102. package/src/client/pager.test.ts +66 -0
  103. package/src/client/pager.ts +138 -0
  104. package/src/client/transport.ts +9 -6
  105. package/src/client/types.ts +58 -10
  106. package/src/compiler/aot.test.ts +12 -2
  107. package/src/compiler/effects-infer.ts +13 -4
  108. package/src/compiler/extract.test.ts +243 -5
  109. package/src/compiler/extract.ts +323 -58
  110. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +2 -2
  111. package/src/compiler/fixtures/skyport/src/gates.ts +2 -0
  112. package/src/compiler/fixtures/skyport.expected.json +4 -0
  113. package/src/config/driver-defaults.test.ts +3 -0
  114. package/src/config/driver-defaults.ts +14 -0
  115. package/src/config/index.ts +5 -0
  116. package/src/console/budget.test.ts +27 -37
  117. package/src/console/index.ts +3 -0
  118. package/src/console/password-policy.ts +89 -0
  119. package/src/console/server/app.ts +138 -12
  120. package/src/console/server/auth-rate.test.ts +3 -3
  121. package/src/console/server/auth-store.test.ts +222 -0
  122. package/src/console/server/auth-store.ts +499 -0
  123. package/src/console/server/bind.ts +2 -3
  124. package/src/console/server/channels.test.ts +1 -1
  125. package/src/console/server/claim.test.ts +60 -1
  126. package/src/console/server/claim.ts +137 -2
  127. package/src/console/server/console.test.ts +102 -6
  128. package/src/console/server/dry-run.audit.test.ts +5 -2
  129. package/src/console/server/files-catalog.test.ts +51 -0
  130. package/src/console/server/files-catalog.ts +122 -0
  131. package/src/console/server/flows-invoke.test.ts +655 -38
  132. package/src/console/server/flows.ts +907 -90
  133. package/src/console/server/gates.test.ts +59 -0
  134. package/src/console/server/gates.ts +17 -14
  135. package/src/console/server/i18n.ts +7 -4
  136. package/src/console/server/index-search.test.ts +57 -0
  137. package/src/console/server/index-search.ts +102 -0
  138. package/src/console/server/index.ts +32 -1
  139. package/src/console/server/instances.test.ts +68 -0
  140. package/src/console/server/instances.ts +58 -0
  141. package/src/console/server/invoke-user-flow.test.ts +206 -0
  142. package/src/console/server/invoke-user-flow.ts +367 -0
  143. package/src/console/server/live.test.ts +44 -1
  144. package/src/console/server/live.ts +16 -0
  145. package/src/console/server/operator-db.test.ts +5 -5
  146. package/src/console/server/operator-db.ts +2 -2
  147. package/src/console/server/panel-load.ts +1 -0
  148. package/src/console/server/plugin.ts +12 -2
  149. package/src/console/server/runs-history.test.ts +143 -0
  150. package/src/console/server/runs-ingest.test.ts +379 -0
  151. package/src/console/server/runs-ingest.ts +127 -0
  152. package/src/console/server/runs-list-nesting.test.ts +97 -0
  153. package/src/console/server/runs-pii.test.ts +69 -0
  154. package/src/console/server/runs-pii.ts +50 -4
  155. package/src/console/server/runs-query-guard.test.ts +75 -0
  156. package/src/console/server/runs-query-guard.ts +224 -0
  157. package/src/console/server/runs-query-mask.test.ts +37 -0
  158. package/src/console/server/runs-query-mask.ts +82 -0
  159. package/src/console/server/runs-query.test.ts +287 -0
  160. package/src/console/server/runs-query.ts +107 -0
  161. package/src/console/server/security-headers.ts +21 -2
  162. package/src/console/server/security.gate.test.ts +306 -3
  163. package/src/console/server/serve.ts +138 -9
  164. package/src/console/server/spa-paths.test.ts +36 -0
  165. package/src/console/server/spa-proxy.test.ts +86 -0
  166. package/src/console/server/sql-catalog.ts +572 -0
  167. package/src/console/server/sql-extension.test.ts +19 -0
  168. package/src/console/server/sql-rls.test.ts +44 -0
  169. package/src/console/server/state.ts +445 -7
  170. package/src/console/server/store-kv-stats.test.ts +178 -0
  171. package/src/console/server/store-kv-stats.ts +339 -0
  172. package/src/console/server/store-stats.test.ts +165 -0
  173. package/src/console/server/store-stats.ts +526 -0
  174. package/src/console/server/store.test.ts +930 -0
  175. package/src/console/server/store.ts +859 -76
  176. package/src/console/server/traces-replay.test.ts +212 -0
  177. package/src/console/server/vault-http.test.ts +458 -0
  178. package/src/console/server/vault-overlay.test.ts +49 -0
  179. package/src/console/server/vault-overlay.ts +99 -0
  180. package/src/console/server/vault.test.ts +75 -0
  181. package/src/console/server/vault.ts +443 -27
  182. package/src/console/ui-next/components.json +26 -0
  183. package/src/console/ui-next/dist/assets/bash-CLZ0U2zV.js +1 -0
  184. package/src/console/ui-next/dist/assets/cache-glyph-CLPBqZeb.js +1 -0
  185. package/src/console/ui-next/dist/assets/call-pii-button-bqkxMrJH.js +1 -0
  186. package/src/console/ui-next/dist/assets/collapsible-DYb0xU8C.js +1 -0
  187. package/src/console/ui-next/dist/assets/confirm-sheet-DDCRmG62.js +1 -0
  188. package/src/console/ui-next/dist/assets/dagre.esm-ZwcdTuZZ.js +1 -0
  189. package/src/console/ui-next/dist/assets/duration-tone-oiRxPVsZ.js +9 -0
  190. package/src/console/ui-next/dist/assets/explorer-empty-HjTnVQoR.js +1 -0
  191. package/src/console/ui-next/dist/assets/flows-page-C_Tas1E1.js +1 -0
  192. package/src/console/ui-next/dist/assets/github-dark-C-LZuMrd.js +1 -0
  193. package/src/console/ui-next/dist/assets/github-light-EUqPIrTm.js +1 -0
  194. package/src/console/ui-next/dist/assets/highlighted-json-CvDPvveV.js +154 -0
  195. package/src/console/ui-next/dist/assets/http-method-BJ92Z_ke.js +1 -0
  196. package/src/console/ui-next/dist/assets/index-D4Ldtj79.css +2 -0
  197. package/src/console/ui-next/dist/assets/index-DX248G39.js +66 -0
  198. package/src/console/ui-next/dist/assets/json-qhed-kSA.js +1 -0
  199. package/src/console/ui-next/dist/assets/link-DF7SZ9Ek.js +1 -0
  200. package/src/console/ui-next/dist/assets/observability-page-BwVS5Jvm.js +4 -0
  201. package/src/console/ui-next/dist/assets/preload-helper-oH4irX4C.js +1 -0
  202. package/src/console/ui-next/dist/assets/query-gate-parts-1m8m1iNp.js +2 -0
  203. package/src/console/ui-next/dist/assets/react-B1ML8gxg.js +1 -0
  204. package/src/console/ui-next/dist/assets/react-dom-Bph1y7z7.js +9 -0
  205. package/src/console/ui-next/dist/assets/replica-lag-C8_BRt2x.js +18 -0
  206. package/src/console/ui-next/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  207. package/src/console/ui-next/dist/assets/sheet-form-D-ata7jy.js +1 -0
  208. package/src/console/ui-next/dist/assets/shortcut-Cgzuv4k1.js +1 -0
  209. package/src/console/ui-next/dist/assets/shortcut-keys-DO4IsVqv.js +1 -0
  210. package/src/console/ui-next/dist/assets/skeleton-CL_X0GCj.js +1 -0
  211. package/src/console/ui-next/dist/assets/sql-BskegiFM.js +1 -0
  212. package/src/console/ui-next/dist/assets/store-page-v3LXdYpr.js +45 -0
  213. package/src/console/ui-next/dist/assets/trace-detail-sheet-D16lWQMt.js +2 -0
  214. package/src/console/ui-next/dist/assets/tsx-udAQXfEw.js +1 -0
  215. package/src/console/ui-next/dist/assets/typescript-bsJCZSQ-.js +1 -0
  216. package/src/console/ui-next/dist/assets/units-page-C5KOI7qG.js +1 -0
  217. package/src/console/ui-next/dist/assets/use-vault-list-Cl79j_ku.js +1 -0
  218. package/src/console/ui-next/dist/assets/vault-page-CSOYMHhO.js +2 -0
  219. package/src/console/ui-next/dist/assets/xyflow-D7n4g6go.js +7 -0
  220. package/src/console/ui-next/dist/assets/xyflow-DZ0Ws1xk.css +1 -0
  221. package/src/console/ui-next/dist/favicon.svg +6 -0
  222. package/src/console/ui-next/dist/index.html +56 -0
  223. package/src/console/ui-next/index.html +45 -0
  224. package/src/console/ui-next/public/favicon.svg +6 -0
  225. package/src/console/ui-next/seed-invoke-host.test.ts +47 -0
  226. package/src/console/ui-next/seed-invoke-host.ts +199 -0
  227. package/src/console/ui-next/seed-invoke-ops.test.ts +280 -0
  228. package/src/console/ui-next/seed-invoke-ops.ts +587 -0
  229. package/src/console/ui-next/src/client-session.test.ts +22 -0
  230. package/src/console/ui-next/src/client.ts +1379 -0
  231. package/src/console/ui-next/src/components/agents/agent-code.tsx +207 -0
  232. package/src/console/ui-next/src/components/agents/agent-disclosure.tsx +63 -0
  233. package/src/console/ui-next/src/components/agents/file-diff.tsx +271 -0
  234. package/src/console/ui-next/src/components/auth-card.tsx +298 -0
  235. package/src/console/ui-next/src/components/charts/animation.ts +36 -0
  236. package/src/console/ui-next/src/components/charts/area-chart-loading.tsx +115 -0
  237. package/src/console/ui-next/src/components/charts/area-chart.tsx +261 -0
  238. package/src/console/ui-next/src/components/charts/area-gradient-defs.tsx +98 -0
  239. package/src/console/ui-next/src/components/charts/area.tsx +349 -0
  240. package/src/console/ui-next/src/components/charts/chart-child-passthrough.ts +110 -0
  241. package/src/console/ui-next/src/components/charts/chart-config-context.tsx +81 -0
  242. package/src/console/ui-next/src/components/charts/chart-context.tsx +414 -0
  243. package/src/console/ui-next/src/components/charts/chart-defs.ts +61 -0
  244. package/src/console/ui-next/src/components/charts/chart-formatters.ts +26 -0
  245. package/src/console/ui-next/src/components/charts/chart-legend-hover.tsx +41 -0
  246. package/src/console/ui-next/src/components/charts/chart-loading-label.tsx +56 -0
  247. package/src/console/ui-next/src/components/charts/chart-phase.ts +52 -0
  248. package/src/console/ui-next/src/components/charts/chart-reveal-clip.tsx +87 -0
  249. package/src/console/ui-next/src/components/charts/composed-chart.tsx +333 -0
  250. package/src/console/ui-next/src/components/charts/dash-tail-stroke.tsx +75 -0
  251. package/src/console/ui-next/src/components/charts/decimate-time-series.ts +134 -0
  252. package/src/console/ui-next/src/components/charts/fade-edges.ts +52 -0
  253. package/src/console/ui-next/src/components/charts/filter-data-by-x-domain.ts +59 -0
  254. package/src/console/ui-next/src/components/charts/generate-chart-skeleton-data.ts +42 -0
  255. package/src/console/ui-next/src/components/charts/grid.tsx +299 -0
  256. package/src/console/ui-next/src/components/charts/highlight-segment-bounds.ts +68 -0
  257. package/src/console/ui-next/src/components/charts/highlight-segment.tsx +65 -0
  258. package/src/console/ui-next/src/components/charts/indicator-fade.ts +62 -0
  259. package/src/console/ui-next/src/components/charts/line-chart-loading.tsx +111 -0
  260. package/src/console/ui-next/src/components/charts/line-chart.tsx +293 -0
  261. package/src/console/ui-next/src/components/charts/line-loading-pulse.tsx +201 -0
  262. package/src/console/ui-next/src/components/charts/line-loading-timing.ts +12 -0
  263. package/src/console/ui-next/src/components/charts/line-series-terminal-marker.tsx +91 -0
  264. package/src/console/ui-next/src/components/charts/line.tsx +384 -0
  265. package/src/console/ui-next/src/components/charts/loading-sweep.tsx +452 -0
  266. package/src/console/ui-next/src/components/charts/motion-utils.ts +47 -0
  267. package/src/console/ui-next/src/components/charts/path-stroke-utils.ts +82 -0
  268. package/src/console/ui-next/src/components/charts/pattern-area.tsx +45 -0
  269. package/src/console/ui-next/src/components/charts/projection-config.ts +112 -0
  270. package/src/console/ui-next/src/components/charts/projection-line-end-marker.tsx +51 -0
  271. package/src/console/ui-next/src/components/charts/projection-line.tsx +208 -0
  272. package/src/console/ui-next/src/components/charts/projection-utils.ts +378 -0
  273. package/src/console/ui-next/src/components/charts/reference-area-config.ts +59 -0
  274. package/src/console/ui-next/src/components/charts/reference-area-geometry.ts +136 -0
  275. package/src/console/ui-next/src/components/charts/reference-area-registration-context.tsx +16 -0
  276. package/src/console/ui-next/src/components/charts/series-bar-layout.ts +60 -0
  277. package/src/console/ui-next/src/components/charts/series-bar.tsx +304 -0
  278. package/src/console/ui-next/src/components/charts/series-dash-tail-overlay.tsx +82 -0
  279. package/src/console/ui-next/src/components/charts/series-highlight-layer.tsx +49 -0
  280. package/src/console/ui-next/src/components/charts/series-hover-dim.tsx +57 -0
  281. package/src/console/ui-next/src/components/charts/series-markers.tsx +267 -0
  282. package/src/console/ui-next/src/components/charts/series-path-utils.ts +103 -0
  283. package/src/console/ui-next/src/components/charts/series-point-marker.tsx +205 -0
  284. package/src/console/ui-next/src/components/charts/static-chart-preview-context.tsx +16 -0
  285. package/src/console/ui-next/src/components/charts/time-series-chart-shell.tsx +644 -0
  286. package/src/console/ui-next/src/components/charts/tooltip/chart-tooltip.tsx +400 -0
  287. package/src/console/ui-next/src/components/charts/tooltip/date-ticker.tsx +140 -0
  288. package/src/console/ui-next/src/components/charts/tooltip/index.ts +10 -0
  289. package/src/console/ui-next/src/components/charts/tooltip/tooltip-box.tsx +227 -0
  290. package/src/console/ui-next/src/components/charts/tooltip/tooltip-content.tsx +58 -0
  291. package/src/console/ui-next/src/components/charts/tooltip/tooltip-dot.tsx +173 -0
  292. package/src/console/ui-next/src/components/charts/tooltip/tooltip-indicator.tsx +191 -0
  293. package/src/console/ui-next/src/components/charts/use-animated-series-path.ts +155 -0
  294. package/src/console/ui-next/src/components/charts/use-animated-y-domains.ts +227 -0
  295. package/src/console/ui-next/src/components/charts/use-chart-interaction.ts +343 -0
  296. package/src/console/ui-next/src/components/charts/use-chart-phase-orchestrator.ts +173 -0
  297. package/src/console/ui-next/src/components/charts/use-enter-complete.ts +28 -0
  298. package/src/console/ui-next/src/components/charts/use-grid-shimmer.ts +101 -0
  299. package/src/console/ui-next/src/components/charts/use-highlight-segment.ts +58 -0
  300. package/src/console/ui-next/src/components/charts/use-mount-progress.ts +29 -0
  301. package/src/console/ui-next/src/components/charts/use-scheduled-tooltip.ts +97 -0
  302. package/src/console/ui-next/src/components/charts/x-axis.tsx +635 -0
  303. package/src/console/ui-next/src/components/charts/y-axis-scales.ts +108 -0
  304. package/src/console/ui-next/src/components/charts/y-axis-ticks.ts +25 -0
  305. package/src/console/ui-next/src/components/charts/y-axis.tsx +151 -0
  306. package/src/console/ui-next/src/components/charts/y-domain-utils.ts +120 -0
  307. package/src/console/ui-next/src/components/console-chrome.tsx +50 -0
  308. package/src/console/ui-next/src/components/document-title.tsx +18 -0
  309. package/src/console/ui-next/src/components/explorer/copy-inline-button.tsx +57 -0
  310. package/src/console/ui-next/src/components/explorer/detail-header.tsx +82 -0
  311. package/src/console/ui-next/src/components/explorer/explorer-chrome.ts +123 -0
  312. package/src/console/ui-next/src/components/explorer/explorer-empty.tsx +67 -0
  313. package/src/console/ui-next/src/components/explorer/explorer-search.tsx +20 -0
  314. package/src/console/ui-next/src/components/explorer/explorer-start-toggle.tsx +52 -0
  315. package/src/console/ui-next/src/components/explorer/section-head.tsx +33 -0
  316. package/src/console/ui-next/src/components/explorer/tree-expand-toggle.tsx +69 -0
  317. package/src/console/ui-next/src/components/explorer/use-explorer-start-panel.ts +34 -0
  318. package/src/console/ui-next/src/components/gate-list.tsx +70 -0
  319. package/src/console/ui-next/src/components/generate-password-button.tsx +76 -0
  320. package/src/console/ui-next/src/components/highlighted-json.tsx +73 -0
  321. package/src/console/ui-next/src/components/http-method-badge.tsx +35 -0
  322. package/src/console/ui-next/src/components/mode-toggle.tsx +84 -0
  323. package/src/console/ui-next/src/components/motion/button/base.tsx +145 -0
  324. package/src/console/ui-next/src/components/motion/button/expanding-arrow.tsx +167 -0
  325. package/src/console/ui-next/src/components/motion/button/index.ts +12 -0
  326. package/src/console/ui-next/src/components/motion/button/stateful.tsx +243 -0
  327. package/src/console/ui-next/src/components/motion/checkbox.tsx +120 -0
  328. package/src/console/ui-next/src/components/motion/select.tsx +436 -0
  329. package/src/console/ui-next/src/components/motion/switch.tsx +108 -0
  330. package/src/console/ui-next/src/components/motion/table/editable-cell.tsx +98 -0
  331. package/src/console/ui-next/src/components/motion/table/index.tsx +404 -0
  332. package/src/console/ui-next/src/components/motion/table/row-handle.tsx +95 -0
  333. package/src/console/ui-next/src/components/motion/table/skeleton-rows.tsx +52 -0
  334. package/src/console/ui-next/src/components/motion/table/table-header.tsx +337 -0
  335. package/src/console/ui-next/src/components/motion/table/table-menu.tsx +130 -0
  336. package/src/console/ui-next/src/components/motion/table/types.ts +109 -0
  337. package/src/console/ui-next/src/components/motion/table/use-cell-range.ts +145 -0
  338. package/src/console/ui-next/src/components/motion/table/use-column-reorder.ts +112 -0
  339. package/src/console/ui-next/src/components/motion/table/use-column-resize.ts +83 -0
  340. package/src/console/ui-next/src/components/motion/table/use-column-sort.ts +73 -0
  341. package/src/console/ui-next/src/components/motion/table/use-row-selection.ts +70 -0
  342. package/src/console/ui-next/src/components/motion/table/utils.ts +138 -0
  343. package/src/console/ui-next/src/components/oke-logo.tsx +65 -0
  344. package/src/console/ui-next/src/components/password-input.tsx +67 -0
  345. package/src/console/ui-next/src/components/password-strength.tsx +160 -0
  346. package/src/console/ui-next/src/components/shell/app-sidebar.tsx +117 -0
  347. package/src/console/ui-next/src/components/shell/command-items.test.ts +30 -0
  348. package/src/console/ui-next/src/components/shell/command-items.ts +144 -0
  349. package/src/console/ui-next/src/components/shell/command-match.test.ts +37 -0
  350. package/src/console/ui-next/src/components/shell/command-match.ts +45 -0
  351. package/src/console/ui-next/src/components/shell/command-palette.tsx +334 -0
  352. package/src/console/ui-next/src/components/shell/nav-footer.tsx +109 -0
  353. package/src/console/ui-next/src/components/shell/section-empty.tsx +42 -0
  354. package/src/console/ui-next/src/components/shell/settings-dialog.tsx +65 -0
  355. package/src/console/ui-next/src/components/shell/shell-layout.tsx +100 -0
  356. package/src/console/ui-next/src/components/shimmering-text.tsx +87 -0
  357. package/src/console/ui-next/src/components/signal-delivery-badge.tsx +38 -0
  358. package/src/console/ui-next/src/components/theme-provider.tsx +86 -0
  359. package/src/console/ui-next/src/components/ui/alert-dialog.tsx +147 -0
  360. package/src/console/ui-next/src/components/ui/avatar.tsx +91 -0
  361. package/src/console/ui-next/src/components/ui/badge.tsx +54 -0
  362. package/src/console/ui-next/src/components/ui/breadcrumb.tsx +104 -0
  363. package/src/console/ui-next/src/components/ui/button.tsx +58 -0
  364. package/src/console/ui-next/src/components/ui/card.tsx +88 -0
  365. package/src/console/ui-next/src/components/ui/collapsible.tsx +15 -0
  366. package/src/console/ui-next/src/components/ui/confirm-sheet.tsx +149 -0
  367. package/src/console/ui-next/src/components/ui/dialog.tsx +144 -0
  368. package/src/console/ui-next/src/components/ui/dropdown-menu.tsx +265 -0
  369. package/src/console/ui-next/src/components/ui/empty.tsx +95 -0
  370. package/src/console/ui-next/src/components/ui/field.tsx +224 -0
  371. package/src/console/ui-next/src/components/ui/input.tsx +30 -0
  372. package/src/console/ui-next/src/components/ui/kbd.tsx +41 -0
  373. package/src/console/ui-next/src/components/ui/label.tsx +20 -0
  374. package/src/console/ui-next/src/components/ui/progress.tsx +66 -0
  375. package/src/console/ui-next/src/components/ui/resizable.tsx +74 -0
  376. package/src/console/ui-next/src/components/ui/select.tsx +230 -0
  377. package/src/console/ui-next/src/components/ui/separator.tsx +21 -0
  378. package/src/console/ui-next/src/components/ui/sheet-form.tsx +337 -0
  379. package/src/console/ui-next/src/components/ui/sheet.tsx +130 -0
  380. package/src/console/ui-next/src/components/ui/sidebar.tsx +691 -0
  381. package/src/console/ui-next/src/components/ui/skeleton.tsx +20 -0
  382. package/src/console/ui-next/src/components/ui/toggle-group.tsx +87 -0
  383. package/src/console/ui-next/src/components/ui/toggle.tsx +46 -0
  384. package/src/console/ui-next/src/components/ui/toolbar-tip.tsx +41 -0
  385. package/src/console/ui-next/src/components/ui/tooltip.tsx +74 -0
  386. package/src/console/ui-next/src/features/auth/auth-redirect.test.ts +119 -0
  387. package/src/console/ui-next/src/features/auth/auth-redirect.ts +153 -0
  388. package/src/console/ui-next/src/features/auth/login-form.tsx +234 -0
  389. package/src/console/ui-next/src/features/auth/logout.ts +17 -0
  390. package/src/console/ui-next/src/features/flows/data/console-live-session.test.ts +329 -0
  391. package/src/console/ui-next/src/features/flows/data/console-live-session.ts +210 -0
  392. package/src/console/ui-next/src/features/flows/data/use-console-live.ts +79 -0
  393. package/src/console/ui-next/src/features/flows/data/use-manifest.ts +23 -0
  394. package/src/console/ui-next/src/features/flows/data/use-runs.ts +24 -0
  395. package/src/console/ui-next/src/features/flows/fixture.ts +81 -0
  396. package/src/console/ui-next/src/features/flows/flows-page.tsx +227 -0
  397. package/src/console/ui-next/src/features/flows/graph/build-flow-graph.test.ts +236 -0
  398. package/src/console/ui-next/src/features/flows/graph/build-flow-graph.ts +530 -0
  399. package/src/console/ui-next/src/features/flows/graph/element-map.test.ts +443 -0
  400. package/src/console/ui-next/src/features/flows/graph/element-map.ts +1077 -0
  401. package/src/console/ui-next/src/features/flows/graph/flow-graph-nodes.tsx +486 -0
  402. package/src/console/ui-next/src/features/flows/graph/flow-graph-theme.ts +143 -0
  403. package/src/console/ui-next/src/features/flows/graph/flow-graph.tsx +268 -0
  404. package/src/console/ui-next/src/features/flows/graph/neighborhood.test.ts +64 -0
  405. package/src/console/ui-next/src/features/flows/graph/neighborhood.ts +82 -0
  406. package/src/console/ui-next/src/features/flows/graph/orchestra.test.ts +97 -0
  407. package/src/console/ui-next/src/features/flows/graph/orchestra.ts +86 -0
  408. package/src/console/ui-next/src/features/flows/graph/use-overview-orchestra.ts +95 -0
  409. package/src/console/ui-next/src/features/flows/state/flows-selection.test.ts +24 -0
  410. package/src/console/ui-next/src/features/flows/state/flows-selection.ts +92 -0
  411. package/src/console/ui-next/src/features/flows/traces/advanced-filters.tsx +222 -0
  412. package/src/console/ui-next/src/features/flows/traces/cache-glyph.tsx +42 -0
  413. package/src/console/ui-next/src/features/flows/traces/cache-icon.test.ts +27 -0
  414. package/src/console/ui-next/src/features/flows/traces/cache-icon.ts +48 -0
  415. package/src/console/ui-next/src/features/flows/traces/dimension-query.test.ts +100 -0
  416. package/src/console/ui-next/src/features/flows/traces/dimension-query.ts +325 -0
  417. package/src/console/ui-next/src/features/flows/traces/duration-tone.test.ts +71 -0
  418. package/src/console/ui-next/src/features/flows/traces/duration-tone.ts +128 -0
  419. package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +106 -0
  420. package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +193 -0
  421. package/src/console/ui-next/src/features/flows/traces/filter-runs.test.ts +98 -0
  422. package/src/console/ui-next/src/features/flows/traces/filter-runs.ts +68 -0
  423. package/src/console/ui-next/src/features/flows/traces/format-duration.test.ts +47 -0
  424. package/src/console/ui-next/src/features/flows/traces/format-duration.ts +25 -0
  425. package/src/console/ui-next/src/features/flows/traces/graph-filter.test.ts +192 -0
  426. package/src/console/ui-next/src/features/flows/traces/graph-filter.ts +175 -0
  427. package/src/console/ui-next/src/features/flows/traces/http-method.ts +134 -0
  428. package/src/console/ui-next/src/features/flows/traces/replay-playback.test.ts +101 -0
  429. package/src/console/ui-next/src/features/flows/traces/replay-playback.ts +107 -0
  430. package/src/console/ui-next/src/features/flows/traces/request-input-view.test.ts +60 -0
  431. package/src/console/ui-next/src/features/flows/traces/request-input-view.ts +108 -0
  432. package/src/console/ui-next/src/features/flows/traces/request-meta.ts +62 -0
  433. package/src/console/ui-next/src/features/flows/traces/scope-runs.test.ts +51 -0
  434. package/src/console/ui-next/src/features/flows/traces/scope-runs.ts +23 -0
  435. package/src/console/ui-next/src/features/flows/traces/trace-actions.test.ts +80 -0
  436. package/src/console/ui-next/src/features/flows/traces/trace-actions.ts +57 -0
  437. package/src/console/ui-next/src/features/flows/traces/trace-chain.test.ts +68 -0
  438. package/src/console/ui-next/src/features/flows/traces/trace-chain.ts +59 -0
  439. package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +1003 -0
  440. package/src/console/ui-next/src/features/flows/traces/trace-detail.test.ts +357 -0
  441. package/src/console/ui-next/src/features/flows/traces/trace-gates.ts +90 -0
  442. package/src/console/ui-next/src/features/flows/traces/trace-request-section.tsx +574 -0
  443. package/src/console/ui-next/src/features/flows/traces/trace-row-meta.test.ts +42 -0
  444. package/src/console/ui-next/src/features/flows/traces/trace-row-meta.ts +47 -0
  445. package/src/console/ui-next/src/features/flows/traces/trace-row.tsx +149 -0
  446. package/src/console/ui-next/src/features/flows/traces/traces-pane.tsx +289 -0
  447. package/src/console/ui-next/src/features/flows/traces/trigger-icon.test.ts +42 -0
  448. package/src/console/ui-next/src/features/flows/traces/trigger-icon.ts +53 -0
  449. package/src/console/ui-next/src/features/flows/traces/waterfall-bars.test.ts +93 -0
  450. package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +80 -0
  451. package/src/console/ui-next/src/features/flows/traces/waterfall-timeline.test.ts +121 -0
  452. package/src/console/ui-next/src/features/flows/traces/waterfall-timeline.ts +230 -0
  453. package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.test.ts +51 -0
  454. package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +20 -0
  455. package/src/console/ui-next/src/features/not-found/not-found-page.tsx +23 -0
  456. package/src/console/ui-next/src/features/observability/data/use-ai-list.ts +26 -0
  457. package/src/console/ui-next/src/features/observability/data/use-clock-list.ts +27 -0
  458. package/src/console/ui-next/src/features/observability/data/use-instances-list.ts +27 -0
  459. package/src/console/ui-next/src/features/observability/data/use-runs-query.ts +39 -0
  460. package/src/console/ui-next/src/features/observability/data/use-signals-list.ts +25 -0
  461. package/src/console/ui-next/src/features/observability/detail/ai-rail.tsx +77 -0
  462. package/src/console/ui-next/src/features/observability/detail/instance-fleet-sheet.tsx +111 -0
  463. package/src/console/ui-next/src/features/observability/detail/metrics-chart.tsx +111 -0
  464. package/src/console/ui-next/src/features/observability/detail/metrics-panel.tsx +154 -0
  465. package/src/console/ui-next/src/features/observability/explorer/error-list.tsx +139 -0
  466. package/src/console/ui-next/src/features/observability/explorer/error-row.tsx +84 -0
  467. package/src/console/ui-next/src/features/observability/explorer/health-strip.tsx +146 -0
  468. package/src/console/ui-next/src/features/observability/lib/ask-count.test.ts +47 -0
  469. package/src/console/ui-next/src/features/observability/lib/ask-count.ts +44 -0
  470. package/src/console/ui-next/src/features/observability/lib/health-cells.test.ts +243 -0
  471. package/src/console/ui-next/src/features/observability/lib/health-cells.ts +207 -0
  472. package/src/console/ui-next/src/features/observability/lib/run-fixture.ts +43 -0
  473. package/src/console/ui-next/src/features/observability/lib/time-buckets.test.ts +61 -0
  474. package/src/console/ui-next/src/features/observability/lib/time-buckets.ts +126 -0
  475. package/src/console/ui-next/src/features/observability/lib/token-count.test.ts +75 -0
  476. package/src/console/ui-next/src/features/observability/lib/token-count.ts +70 -0
  477. package/src/console/ui-next/src/features/observability/lib/top-errors.test.ts +89 -0
  478. package/src/console/ui-next/src/features/observability/lib/top-errors.ts +135 -0
  479. package/src/console/ui-next/src/features/observability/lib/window-stats.test.ts +62 -0
  480. package/src/console/ui-next/src/features/observability/lib/window-stats.ts +124 -0
  481. package/src/console/ui-next/src/features/observability/observability-page.tsx +217 -0
  482. package/src/console/ui-next/src/features/observability/query/runs-query-panel.tsx +91 -0
  483. package/src/console/ui-next/src/features/observability/state/observability-selection.test.ts +27 -0
  484. package/src/console/ui-next/src/features/observability/state/observability-selection.ts +121 -0
  485. package/src/console/ui-next/src/features/setup/auth-gate.test.ts +17 -0
  486. package/src/console/ui-next/src/features/setup/auth-gate.ts +21 -0
  487. package/src/console/ui-next/src/features/setup/claim-page.tsx +418 -0
  488. package/src/console/ui-next/src/features/store/data/use-gates.ts +26 -0
  489. package/src/console/ui-next/src/features/store/data/use-store-edit.ts +92 -0
  490. package/src/console/ui-next/src/features/store/data/use-store-files.ts +96 -0
  491. package/src/console/ui-next/src/features/store/data/use-store-kv-stats.ts +47 -0
  492. package/src/console/ui-next/src/features/store/data/use-store-query.test.ts +42 -0
  493. package/src/console/ui-next/src/features/store/data/use-store-query.ts +68 -0
  494. package/src/console/ui-next/src/features/store/data/use-store-reveal.ts +28 -0
  495. package/src/console/ui-next/src/features/store/data/use-store-sql-advise.ts +39 -0
  496. package/src/console/ui-next/src/features/store/data/use-store-sql-locks.ts +51 -0
  497. package/src/console/ui-next/src/features/store/data/use-store-sql-stats.ts +47 -0
  498. package/src/console/ui-next/src/features/store/data/use-store-sql.ts +39 -0
  499. package/src/console/ui-next/src/features/store/data/use-stores-list.ts +24 -0
  500. package/src/console/ui-next/src/features/store/detail/browse-section.tsx +692 -0
  501. package/src/console/ui-next/src/features/store/detail/json-value-sheet.tsx +470 -0
  502. package/src/console/ui-next/src/features/store/detail/resource-panel.tsx +325 -0
  503. package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +137 -0
  504. package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +225 -0
  505. package/src/console/ui-next/src/features/store/detail/touched-by-section.tsx +101 -0
  506. package/src/console/ui-next/src/features/store/explorer/store-tree.tsx +1044 -0
  507. package/src/console/ui-next/src/features/store/files/file-explorer.tsx +563 -0
  508. package/src/console/ui-next/src/features/store/files/file-kind-icon.tsx +70 -0
  509. package/src/console/ui-next/src/features/store/files/file-preview.tsx +338 -0
  510. package/src/console/ui-next/src/features/store/files/file-upload-sheet.tsx +190 -0
  511. package/src/console/ui-next/src/features/store/grid/catalog-advanced.tsx +80 -0
  512. package/src/console/ui-next/src/features/store/grid/extension-library-sheet.tsx +761 -0
  513. package/src/console/ui-next/src/features/store/grid/kv-add-sheet.tsx +165 -0
  514. package/src/console/ui-next/src/features/store/grid/pending-changes-sheet.tsx +219 -0
  515. package/src/console/ui-next/src/features/store/grid/rls-policy-sheet.tsx +875 -0
  516. package/src/console/ui-next/src/features/store/grid/sql-function-sheet.tsx +473 -0
  517. package/src/console/ui-next/src/features/store/grid/sql-index-sheet.tsx +355 -0
  518. package/src/console/ui-next/src/features/store/grid/sql-insert-sheet.tsx +177 -0
  519. package/src/console/ui-next/src/features/store/grid/sql-trigger-sheet.tsx +445 -0
  520. package/src/console/ui-next/src/features/store/grid/store-confirm-sheet.tsx +73 -0
  521. package/src/console/ui-next/src/features/store/grid/store-data-grid.tsx +1844 -0
  522. package/src/console/ui-next/src/features/store/grid/store-edit-sheet.tsx +329 -0
  523. package/src/console/ui-next/src/features/store/grid/store-grid-context-menu.tsx +111 -0
  524. package/src/console/ui-next/src/features/store/grid/store-grid-shortcuts.tsx +124 -0
  525. package/src/console/ui-next/src/features/store/lib/cell-selection.test.ts +125 -0
  526. package/src/console/ui-next/src/features/store/lib/cell-selection.ts +115 -0
  527. package/src/console/ui-next/src/features/store/lib/confirmation.test.ts +48 -0
  528. package/src/console/ui-next/src/features/store/lib/confirmation.ts +63 -0
  529. package/src/console/ui-next/src/features/store/lib/edit-history.test.ts +60 -0
  530. package/src/console/ui-next/src/features/store/lib/edit-history.ts +64 -0
  531. package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +94 -0
  532. package/src/console/ui-next/src/features/store/lib/files-body.test.ts +16 -0
  533. package/src/console/ui-next/src/features/store/lib/files-body.ts +79 -0
  534. package/src/console/ui-next/src/features/store/lib/files-meta.test.ts +75 -0
  535. package/src/console/ui-next/src/features/store/lib/files-meta.ts +259 -0
  536. package/src/console/ui-next/src/features/store/lib/files-origin.test.ts +69 -0
  537. package/src/console/ui-next/src/features/store/lib/files-origin.ts +53 -0
  538. package/src/console/ui-next/src/features/store/lib/files-tree.test.ts +123 -0
  539. package/src/console/ui-next/src/features/store/lib/files-tree.ts +233 -0
  540. package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +127 -0
  541. package/src/console/ui-next/src/features/store/lib/grid-model.ts +219 -0
  542. package/src/console/ui-next/src/features/store/lib/grid-transfer.test.ts +123 -0
  543. package/src/console/ui-next/src/features/store/lib/grid-transfer.ts +217 -0
  544. package/src/console/ui-next/src/features/store/lib/index-query.test.ts +30 -0
  545. package/src/console/ui-next/src/features/store/lib/index-query.ts +57 -0
  546. package/src/console/ui-next/src/features/store/lib/json-value.test.ts +141 -0
  547. package/src/console/ui-next/src/features/store/lib/json-value.ts +266 -0
  548. package/src/console/ui-next/src/features/store/lib/kv-format.test.ts +44 -0
  549. package/src/console/ui-next/src/features/store/lib/kv-format.ts +103 -0
  550. package/src/console/ui-next/src/features/store/lib/kv-meta.test.ts +43 -0
  551. package/src/console/ui-next/src/features/store/lib/kv-meta.ts +63 -0
  552. package/src/console/ui-next/src/features/store/lib/kv-query.test.ts +128 -0
  553. package/src/console/ui-next/src/features/store/lib/kv-query.ts +303 -0
  554. package/src/console/ui-next/src/features/store/lib/parse-resource-ref.ts +38 -0
  555. package/src/console/ui-next/src/features/store/lib/patch.test.ts +99 -0
  556. package/src/console/ui-next/src/features/store/lib/patch.ts +129 -0
  557. package/src/console/ui-next/src/features/store/lib/pending-edits.test.ts +125 -0
  558. package/src/console/ui-next/src/features/store/lib/pending-edits.ts +150 -0
  559. package/src/console/ui-next/src/features/store/lib/pending-sql.test.ts +108 -0
  560. package/src/console/ui-next/src/features/store/lib/pending-sql.ts +136 -0
  561. package/src/console/ui-next/src/features/store/lib/pg-extension-library.test.ts +117 -0
  562. package/src/console/ui-next/src/features/store/lib/pg-extension-library.ts +277 -0
  563. package/src/console/ui-next/src/features/store/lib/query-defaults.test.ts +78 -0
  564. package/src/console/ui-next/src/features/store/lib/query-defaults.ts +77 -0
  565. package/src/console/ui-next/src/features/store/lib/query-gate.test.ts +132 -0
  566. package/src/console/ui-next/src/features/store/lib/query-gate.ts +187 -0
  567. package/src/console/ui-next/src/features/store/lib/query-highlight.test.ts +103 -0
  568. package/src/console/ui-next/src/features/store/lib/query-highlight.ts +382 -0
  569. package/src/console/ui-next/src/features/store/lib/query-schema.test.ts +139 -0
  570. package/src/console/ui-next/src/features/store/lib/query-schema.ts +128 -0
  571. package/src/console/ui-next/src/features/store/lib/query-session.test.ts +91 -0
  572. package/src/console/ui-next/src/features/store/lib/query-session.ts +330 -0
  573. package/src/console/ui-next/src/features/store/lib/replica-lag.test.ts +101 -0
  574. package/src/console/ui-next/src/features/store/lib/replica-lag.ts +31 -0
  575. package/src/console/ui-next/src/features/store/lib/resource-effects.ts +12 -0
  576. package/src/console/ui-next/src/features/store/lib/rls-gate-catalog.test.ts +131 -0
  577. package/src/console/ui-next/src/features/store/lib/rls-gate-catalog.ts +274 -0
  578. package/src/console/ui-next/src/features/store/lib/rls-policy.test.ts +95 -0
  579. package/src/console/ui-next/src/features/store/lib/rls-policy.ts +290 -0
  580. package/src/console/ui-next/src/features/store/lib/rtl.test.ts +17 -0
  581. package/src/console/ui-next/src/features/store/lib/rtl.ts +15 -0
  582. package/src/console/ui-next/src/features/store/lib/schema-color.test.ts +91 -0
  583. package/src/console/ui-next/src/features/store/lib/schema-color.ts +216 -0
  584. package/src/console/ui-next/src/features/store/lib/schema-graph.test.ts +435 -0
  585. package/src/console/ui-next/src/features/store/lib/schema-graph.ts +566 -0
  586. package/src/console/ui-next/src/features/store/lib/sql-catalog.test.ts +60 -0
  587. package/src/console/ui-next/src/features/store/lib/sql-catalog.ts +98 -0
  588. package/src/console/ui-next/src/features/store/lib/sql-complete.test.ts +109 -0
  589. package/src/console/ui-next/src/features/store/lib/sql-complete.ts +385 -0
  590. package/src/console/ui-next/src/features/store/lib/sql-format.test.ts +35 -0
  591. package/src/console/ui-next/src/features/store/lib/sql-format.ts +85 -0
  592. package/src/console/ui-next/src/features/store/lib/sql-function.test.ts +141 -0
  593. package/src/console/ui-next/src/features/store/lib/sql-function.ts +195 -0
  594. package/src/console/ui-next/src/features/store/lib/sql-index.test.ts +101 -0
  595. package/src/console/ui-next/src/features/store/lib/sql-index.ts +151 -0
  596. package/src/console/ui-next/src/features/store/lib/sql-statements.test.ts +114 -0
  597. package/src/console/ui-next/src/features/store/lib/sql-statements.ts +205 -0
  598. package/src/console/ui-next/src/features/store/lib/sql-trigger.test.ts +125 -0
  599. package/src/console/ui-next/src/features/store/lib/sql-trigger.ts +210 -0
  600. package/src/console/ui-next/src/features/store/lib/store-tree.test.ts +220 -0
  601. package/src/console/ui-next/src/features/store/lib/store-tree.ts +314 -0
  602. package/src/console/ui-next/src/features/store/performance/advisor-enable.test.ts +16 -0
  603. package/src/console/ui-next/src/features/store/performance/advisor-enable.ts +26 -0
  604. package/src/console/ui-next/src/features/store/performance/kv-performance-panel.tsx +223 -0
  605. package/src/console/ui-next/src/features/store/performance/performance-panel.tsx +442 -0
  606. package/src/console/ui-next/src/features/store/query/query-complete.tsx +131 -0
  607. package/src/console/ui-next/src/features/store/query/query-console.tsx +1159 -0
  608. package/src/console/ui-next/src/features/store/query/query-editor.tsx +300 -0
  609. package/src/console/ui-next/src/features/store/query/query-gate-menu.tsx +178 -0
  610. package/src/console/ui-next/src/features/store/query/query-gate-parts.tsx +344 -0
  611. package/src/console/ui-next/src/features/store/query/query-gate-viz.tsx +166 -0
  612. package/src/console/ui-next/src/features/store/query/query-highlight-view.tsx +61 -0
  613. package/src/console/ui-next/src/features/store/query/query-results.tsx +369 -0
  614. package/src/console/ui-next/src/features/store/query/query-schema-panel.tsx +300 -0
  615. package/src/console/ui-next/src/features/store/query/sql-style-editor.tsx +73 -0
  616. package/src/console/ui-next/src/features/store/schema/schema-constraint-icon.tsx +108 -0
  617. package/src/console/ui-next/src/features/store/schema/schema-relation-edge.tsx +76 -0
  618. package/src/console/ui-next/src/features/store/schema/schema-relation-icon.tsx +84 -0
  619. package/src/console/ui-next/src/features/store/schema/schema-table-node.tsx +199 -0
  620. package/src/console/ui-next/src/features/store/schema/schema-visualizer.tsx +273 -0
  621. package/src/console/ui-next/src/features/store/state/store-selection.test.ts +38 -0
  622. package/src/console/ui-next/src/features/store/state/store-selection.ts +154 -0
  623. package/src/console/ui-next/src/features/store/store-page.tsx +180 -0
  624. package/src/console/ui-next/src/features/units/call/call-api-panel.tsx +1247 -0
  625. package/src/console/ui-next/src/features/units/call/call-identity-menu.tsx +226 -0
  626. package/src/console/ui-next/src/features/units/call/call-pii-button.tsx +60 -0
  627. package/src/console/ui-next/src/features/units/data/use-flows-invoke.ts +75 -0
  628. package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +80 -0
  629. package/src/console/ui-next/src/features/units/detail/errors-section.tsx +64 -0
  630. package/src/console/ui-next/src/features/units/detail/flow-activity-strip.tsx +119 -0
  631. package/src/console/ui-next/src/features/units/detail/flow-contract-panel.tsx +335 -0
  632. package/src/console/ui-next/src/features/units/detail/schema-fields.tsx +149 -0
  633. package/src/console/ui-next/src/features/units/detail/validation-section.tsx +66 -0
  634. package/src/console/ui-next/src/features/units/explorer/units-tree.tsx +644 -0
  635. package/src/console/ui-next/src/features/units/lib/call-invoke-as.test.ts +40 -0
  636. package/src/console/ui-next/src/features/units/lib/call-read-safe.test.ts +38 -0
  637. package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +32 -0
  638. package/src/console/ui-next/src/features/units/lib/call-timing.test.ts +28 -0
  639. package/src/console/ui-next/src/features/units/lib/call-timing.ts +34 -0
  640. package/src/console/ui-next/src/features/units/lib/contract-input.test.ts +47 -0
  641. package/src/console/ui-next/src/features/units/lib/contract-input.ts +68 -0
  642. package/src/console/ui-next/src/features/units/lib/fields-from-schema.test.ts +119 -0
  643. package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +329 -0
  644. package/src/console/ui-next/src/features/units/lib/fk-lookup.test.ts +103 -0
  645. package/src/console/ui-next/src/features/units/lib/fk-lookup.ts +175 -0
  646. package/src/console/ui-next/src/features/units/lib/flow-activity.test.ts +76 -0
  647. package/src/console/ui-next/src/features/units/lib/flow-activity.ts +68 -0
  648. package/src/console/ui-next/src/features/units/lib/flow-trigger.test.ts +63 -0
  649. package/src/console/ui-next/src/features/units/lib/flow-trigger.ts +120 -0
  650. package/src/console/ui-next/src/features/units/lib/invoke-cache.test.ts +31 -0
  651. package/src/console/ui-next/src/features/units/lib/invoke-cache.ts +22 -0
  652. package/src/console/ui-next/src/features/units/lib/invoke-response.test.ts +76 -0
  653. package/src/console/ui-next/src/features/units/lib/invoke-response.ts +70 -0
  654. package/src/console/ui-next/src/features/units/lib/path-params.test.ts +43 -0
  655. package/src/console/ui-next/src/features/units/lib/path-params.ts +75 -0
  656. package/src/console/ui-next/src/features/units/lib/resolve-clock.test.ts +106 -0
  657. package/src/console/ui-next/src/features/units/lib/resolve-clock.ts +79 -0
  658. package/src/console/ui-next/src/features/units/lib/schema-type-visual.ts +28 -0
  659. package/src/console/ui-next/src/features/units/lib/signal-delivery.test.ts +29 -0
  660. package/src/console/ui-next/src/features/units/lib/signal-delivery.ts +67 -0
  661. package/src/console/ui-next/src/features/units/lib/unit-tree.test.ts +289 -0
  662. package/src/console/ui-next/src/features/units/lib/unit-tree.ts +307 -0
  663. package/src/console/ui-next/src/features/units/lib/validate-contract.ts +103 -0
  664. package/src/console/ui-next/src/features/units/state/units-selection.ts +49 -0
  665. package/src/console/ui-next/src/features/units/units-page.tsx +120 -0
  666. package/src/console/ui-next/src/features/vault/data/use-vault-list.ts +27 -0
  667. package/src/console/ui-next/src/features/vault/detail/vault-detail.tsx +831 -0
  668. package/src/console/ui-next/src/features/vault/detail/vault-overview.tsx +71 -0
  669. package/src/console/ui-next/src/features/vault/explorer/vault-list.tsx +291 -0
  670. package/src/console/ui-next/src/features/vault/explorer/vault-posture-strip.tsx +131 -0
  671. package/src/console/ui-next/src/features/vault/explorer/vault-search.tsx +126 -0
  672. package/src/console/ui-next/src/features/vault/lib/backend.test.ts +147 -0
  673. package/src/console/ui-next/src/features/vault/lib/backend.ts +216 -0
  674. package/src/console/ui-next/src/features/vault/lib/blast-radius.ts +53 -0
  675. package/src/console/ui-next/src/features/vault/lib/confirmation.test.ts +41 -0
  676. package/src/console/ui-next/src/features/vault/lib/confirmation.ts +50 -0
  677. package/src/console/ui-next/src/features/vault/lib/contract-ops.test.ts +35 -0
  678. package/src/console/ui-next/src/features/vault/lib/contract-ops.ts +94 -0
  679. package/src/console/ui-next/src/features/vault/lib/dormant.ts +28 -0
  680. package/src/console/ui-next/src/features/vault/lib/export-safe.test.ts +25 -0
  681. package/src/console/ui-next/src/features/vault/lib/export-safe.ts +62 -0
  682. package/src/console/ui-next/src/features/vault/lib/fixture.ts +92 -0
  683. package/src/console/ui-next/src/features/vault/lib/group.test.ts +31 -0
  684. package/src/console/ui-next/src/features/vault/lib/group.ts +43 -0
  685. package/src/console/ui-next/src/features/vault/lib/posture.test.ts +137 -0
  686. package/src/console/ui-next/src/features/vault/lib/posture.ts +275 -0
  687. package/src/console/ui-next/src/features/vault/lib/progress.test.ts +36 -0
  688. package/src/console/ui-next/src/features/vault/lib/progress.ts +51 -0
  689. package/src/console/ui-next/src/features/vault/lib/search.test.ts +139 -0
  690. package/src/console/ui-next/src/features/vault/lib/search.ts +403 -0
  691. package/src/console/ui-next/src/features/vault/lib/theme.ts +14 -0
  692. package/src/console/ui-next/src/features/vault/lib/types.ts +114 -0
  693. package/src/console/ui-next/src/features/vault/lib/write-review.test.ts +139 -0
  694. package/src/console/ui-next/src/features/vault/lib/write-review.ts +115 -0
  695. package/src/console/ui-next/src/features/vault/sheets/vault-create-sheet.tsx +209 -0
  696. package/src/console/ui-next/src/features/vault/sheets/vault-master-key-sheet.tsx +87 -0
  697. package/src/console/ui-next/src/features/vault/sheets/vault-rotate-master-sheet.tsx +43 -0
  698. package/src/console/ui-next/src/features/vault/sheets/vault-security-sheet.tsx +205 -0
  699. package/src/console/ui-next/src/features/vault/sheets/vault-verify-sheet.tsx +103 -0
  700. package/src/console/ui-next/src/features/vault/sheets/vault-write-review-dialog.test.tsx +175 -0
  701. package/src/console/ui-next/src/features/vault/sheets/vault-write-review-dialog.tsx +135 -0
  702. package/src/console/ui-next/src/features/vault/sheets/vault-write-sheet.tsx +224 -0
  703. package/src/console/ui-next/src/features/vault/state/vault-selection.test.ts +20 -0
  704. package/src/console/ui-next/src/features/vault/state/vault-selection.ts +87 -0
  705. package/src/console/ui-next/src/features/vault/vault-page.tsx +439 -0
  706. package/src/console/ui-next/src/hooks/use-mobile.ts +22 -0
  707. package/src/console/ui-next/src/lib/document-meta.test.ts +43 -0
  708. package/src/console/ui-next/src/lib/document-meta.ts +34 -0
  709. package/src/console/ui-next/src/lib/ease.ts +59 -0
  710. package/src/console/ui-next/src/lib/element-icons.test.ts +38 -0
  711. package/src/console/ui-next/src/lib/element-icons.ts +75 -0
  712. package/src/console/ui-next/src/lib/highlight.test.ts +30 -0
  713. package/src/console/ui-next/src/lib/highlight.ts +39 -0
  714. package/src/console/ui-next/src/lib/hooks/use-hover-capable.ts +30 -0
  715. package/src/console/ui-next/src/lib/last-module-search.test.ts +47 -0
  716. package/src/console/ui-next/src/lib/last-module-search.ts +164 -0
  717. package/src/console/ui-next/src/lib/motion.ts +16 -0
  718. package/src/console/ui-next/src/lib/shiki.ts +42 -0
  719. package/src/console/ui-next/src/lib/shortcut-keys.tsx +47 -0
  720. package/src/console/ui-next/src/lib/shortcut.test.ts +70 -0
  721. package/src/console/ui-next/src/lib/shortcut.ts +111 -0
  722. package/src/console/ui-next/src/lib/use-console-shortcuts.ts +56 -0
  723. package/src/console/ui-next/src/lib/use-last-module-search.ts +37 -0
  724. package/src/console/ui-next/src/lib/utils.ts +15 -0
  725. package/src/console/ui-next/src/main.tsx +44 -0
  726. package/src/console/ui-next/src/router.tsx +175 -0
  727. package/src/console/ui-next/src/styles.css +384 -0
  728. package/src/console/ui-next/src/vite-env.d.ts +17 -0
  729. package/src/console/ui-next/tsconfig.json +25 -0
  730. package/src/console/ui-next/ui-next-dev-operator.test.ts +76 -0
  731. package/src/console/ui-next/ui-next-dev-operator.ts +81 -0
  732. package/src/console/ui-next/ui-next-seed-app-schema.ts +526 -0
  733. package/src/console/ui-next/ui-next-seed-manifest-surface.ts +882 -0
  734. package/src/console/ui-next/ui-next-seed-manifest.ts +635 -0
  735. package/src/console/ui-next/ui-next-seed-runs.ts +1429 -0
  736. package/src/console/ui-next/ui-next-seed-store.ts +1125 -0
  737. package/src/console/ui-next/ui-next-seed.test.ts +511 -0
  738. package/src/console/ui-next/ui-next-seed.ts +122 -0
  739. package/src/console/ui-next/vite-console-kernel-plugin.ts +195 -0
  740. package/src/console/ui-next/vite.config.ts +88 -0
  741. package/src/console/xss.gate.test.ts +21 -26
  742. package/src/docker/compose.ts +26 -7
  743. package/src/docker/derive.ts +67 -13
  744. package/src/docker/docker.test.ts +219 -27
  745. package/src/docker/helpers.ts +20 -0
  746. package/src/docker/images-config.test.ts +29 -22
  747. package/src/docker/index.ts +8 -0
  748. package/src/docker/postgres-advisor.integration.test.ts +163 -0
  749. package/src/docker/query-passthrough.integration.test.ts +212 -0
  750. package/src/docker/recipes/index.ts +13 -0
  751. package/src/docker/recipes/llama-cpp.ts +3 -3
  752. package/src/docker/recipes/nginx.ts +61 -0
  753. package/src/docker/recipes/ollama.ts +1 -1
  754. package/src/docker/recipes/postgres-advisor.ts +58 -0
  755. package/src/docker/recipes/postgres.ts +6 -2
  756. package/src/docker/recipes/sglang.ts +1 -1
  757. package/src/docker/recipes/timescale.ts +6 -2
  758. package/src/docker/recipes/traefik.ts +1 -0
  759. package/src/docker/recipes/vllm.ts +1 -1
  760. package/src/docker/stack-id.test.ts +5 -14
  761. package/src/docker/stack-id.ts +15 -35
  762. package/src/docker/stack.integration.test.ts +2 -2
  763. package/src/docker/types.ts +16 -7
  764. package/src/drivers/ai-mock.ts +41 -1
  765. package/src/drivers/ai-openai-compatible.ts +19 -1
  766. package/src/drivers/index.ts +32 -0
  767. package/src/drivers/instances-postgres.ts +154 -0
  768. package/src/drivers/meilisearch.integration.test.ts +9 -0
  769. package/src/drivers/meilisearch.test.ts +134 -6
  770. package/src/drivers/meilisearch.ts +77 -8
  771. package/src/drivers/memory.ts +384 -24
  772. package/src/drivers/pg-extensions.test.ts +50 -0
  773. package/src/drivers/pg-extensions.ts +1054 -0
  774. package/src/drivers/pg-rls.test.ts +71 -0
  775. package/src/drivers/pg-rls.ts +234 -0
  776. package/src/drivers/pgvector.ts +24 -0
  777. package/src/drivers/redis.ts +12 -0
  778. package/src/drivers/s3-ensure-bucket.test.ts +88 -0
  779. package/src/drivers/s3-ensure-bucket.ts +152 -0
  780. package/src/drivers/s3.ts +34 -2
  781. package/src/drivers/types.ts +28 -0
  782. package/src/drivers/vault-1password.test.ts +164 -0
  783. package/src/drivers/vault-1password.ts +351 -0
  784. package/src/drivers/vault-aws-secrets-manager.ts +15 -94
  785. package/src/drivers/vault-azure-key-vault.test.ts +137 -0
  786. package/src/drivers/vault-azure-key-vault.ts +243 -0
  787. package/src/drivers/vault-doppler.test.ts +133 -0
  788. package/src/drivers/vault-doppler.ts +202 -0
  789. package/src/drivers/vault-dotenv-parse.ts +32 -0
  790. package/src/drivers/vault-env.ts +1 -1
  791. package/src/drivers/vault-gcp-secret-manager.test.ts +127 -0
  792. package/src/drivers/vault-gcp-secret-manager.ts +291 -0
  793. package/src/drivers/vault-managed.test.ts +23 -26
  794. package/src/drivers/vault-managed.ts +58 -20
  795. package/src/drivers/vault-remote-bag.ts +242 -0
  796. package/src/drivers/vault-types.ts +9 -7
  797. package/src/elements/ai/runtime.ts +100 -8
  798. package/src/elements/ai/schema.test.ts +133 -0
  799. package/src/elements/ai/schema.ts +156 -11
  800. package/src/elements/ai.test.ts +53 -0
  801. package/src/elements/ai.ts +1 -0
  802. package/src/elements/clock/runtime.ts +31 -13
  803. package/src/elements/clock.test.ts +49 -0
  804. package/src/elements/gate/config.ts +18 -3
  805. package/src/elements/gate/declare.ts +25 -5
  806. package/src/elements/gate/flatten.ts +74 -0
  807. package/src/elements/gate/permissions.ts +1 -0
  808. package/src/elements/gate/runtime.ts +16 -4
  809. package/src/elements/gate.test.ts +32 -0
  810. package/src/elements/gate.ts +9 -1
  811. package/src/elements/store/cache.test.ts +79 -0
  812. package/src/elements/store/cache.ts +176 -0
  813. package/src/elements/store/classify.ts +79 -4
  814. package/src/elements/store/emit-drizzle.ts +3 -1
  815. package/src/elements/store/files-policy.test.ts +36 -1
  816. package/src/elements/store/files-policy.ts +151 -0
  817. package/src/elements/store/resource-list-docs.fixture.ts +0 -2
  818. package/src/elements/store/resource-list-docs.test.ts +3 -0
  819. package/src/elements/store/resource.test.ts +62 -2
  820. package/src/elements/store/resource.ts +279 -62
  821. package/src/elements/store/runtime.ts +53 -2
  822. package/src/elements/store/schema-decl.test.ts +49 -0
  823. package/src/elements/store/schema-decl.ts +29 -9
  824. package/src/elements/store/seed.test.ts +22 -1
  825. package/src/elements/store/seed.ts +46 -1
  826. package/src/elements/store/sql-session.ts +32 -7
  827. package/src/elements/store/table.ts +17 -1
  828. package/src/elements/store/upsert-app.test.ts +1 -1
  829. package/src/elements/store.test.ts +21 -0
  830. package/src/elements/store.ts +26 -3
  831. package/src/elements/vault/boot-chain.test.ts +108 -10
  832. package/src/elements/vault/boot-chain.ts +15 -15
  833. package/src/elements/vault/builtin-adapter.test.ts +1 -0
  834. package/src/elements/vault/builtin-adapter.ts +12 -0
  835. package/src/elements/vault/chain.ts +6 -20
  836. package/src/elements/vault/declare.ts +5 -2
  837. package/src/elements/vault/runtime.ts +47 -13
  838. package/src/elements/vault/storage.ts +35 -4
  839. package/src/elements/vault.test.ts +1 -0
  840. package/src/elements/vault.ts +2 -0
  841. package/src/full.ts +10 -0
  842. package/src/http.ts +1 -1
  843. package/src/index.ts +8 -0
  844. package/src/kernel/adopt-barrel-fresh.test.ts +1 -2
  845. package/src/kernel/app-auth.ts +8 -1
  846. package/src/kernel/app.ts +245 -25
  847. package/src/kernel/auth-resolve.ts +51 -0
  848. package/src/kernel/auto-cache.test.ts +270 -0
  849. package/src/kernel/boot-bind/ai.test.ts +34 -1
  850. package/src/kernel/boot-bind/ai.ts +15 -2
  851. package/src/kernel/boot-bind/channel.test.ts +1 -1
  852. package/src/kernel/boot-bind/channel.ts +1 -1
  853. package/src/kernel/boot-bind/clock.ts +9 -7
  854. package/src/kernel/boot-bind/gate.ts +1 -1
  855. package/src/kernel/boot-bind/honor-config.test.ts +70 -3
  856. package/src/kernel/boot-bind/instances.ts +58 -0
  857. package/src/kernel/boot-bind/journal.ts +3 -2
  858. package/src/kernel/boot-bind/runs.ts +63 -5
  859. package/src/kernel/boot-bind/signal.ts +1 -1
  860. package/src/kernel/boot-bind/store.ts +4 -4
  861. package/src/kernel/boot.test.ts +9 -9
  862. package/src/kernel/boot.ts +115 -16
  863. package/src/kernel/capability.test.ts +42 -0
  864. package/src/kernel/capability.ts +44 -2
  865. package/src/kernel/compensate.test.ts +34 -1
  866. package/src/kernel/compensate.ts +19 -0
  867. package/src/kernel/effect-timing.test.ts +16 -0
  868. package/src/kernel/effects-stamping.test.ts +3 -3
  869. package/src/kernel/effects.test.ts +15 -0
  870. package/src/kernel/effects.ts +39 -5
  871. package/src/kernel/elapsed.test.ts +26 -0
  872. package/src/kernel/elapsed.ts +23 -0
  873. package/src/kernel/errors.ts +26 -3
  874. package/src/kernel/flow.ts +5 -1
  875. package/src/kernel/fx-ask-telemetry.test.ts +114 -0
  876. package/src/kernel/fx.test.ts +143 -2
  877. package/src/kernel/fx.ts +136 -19
  878. package/src/kernel/graceful-shutdown.test.ts +20 -0
  879. package/src/kernel/graceful-shutdown.ts +9 -3
  880. package/src/kernel/horizontal-child.ts +4 -4
  881. package/src/kernel/http-query.test.ts +184 -0
  882. package/src/kernel/http-resource.ts +55 -0
  883. package/src/kernel/index.ts +43 -0
  884. package/src/kernel/instance-id.ts +23 -0
  885. package/src/kernel/instances-chaos-child.ts +73 -0
  886. package/src/kernel/instances.chaos.test.ts +238 -0
  887. package/src/kernel/instances.test.ts +85 -0
  888. package/src/kernel/instances.ts +372 -0
  889. package/src/kernel/lazy-require.ts +20 -0
  890. package/src/kernel/list-page.test.ts +194 -0
  891. package/src/kernel/list-page.ts +515 -0
  892. package/src/kernel/list-query.ts +469 -0
  893. package/src/kernel/pipeline-api-key.test.ts +266 -0
  894. package/src/kernel/pipeline.test.ts +164 -2
  895. package/src/kernel/pipeline.ts +13 -1
  896. package/src/kernel/plugin-elements.test.ts +1 -1
  897. package/src/kernel/plugin-needs.test.ts +1 -1
  898. package/src/kernel/plugin.ts +5 -5
  899. package/src/kernel/ready.test.ts +22 -2
  900. package/src/kernel/registry.ts +8 -4
  901. package/src/kernel/resource-mount.test.ts +75 -0
  902. package/src/kernel/router/index.ts +2 -0
  903. package/src/kernel/router/linear.ts +7 -0
  904. package/src/kernel/router/regexp.ts +8 -0
  905. package/src/kernel/router/smart.ts +7 -3
  906. package/src/kernel/router/trie.ts +7 -0
  907. package/src/kernel/router/types.ts +41 -1
  908. package/src/kernel/router.test.ts +27 -0
  909. package/src/kernel/router.ts +2 -0
  910. package/src/kernel/run-duration.test.ts +92 -0
  911. package/src/kernel/run-telemetry.ts +8 -2
  912. package/src/kernel/triggers.ts +95 -74
  913. package/src/manifest/sql-resource.test.ts +29 -0
  914. package/src/manifest/sql-resource.ts +20 -4
  915. package/src/manifest/types.ts +8 -3
  916. package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
  917. package/src/plugins/auth-methods.security.test.ts +3 -3
  918. package/src/plugins/auth-methods.test.ts +2 -2
  919. package/src/plugins/cors.test.ts +4 -2
  920. package/src/plugins/cors.ts +11 -2
  921. package/src/plugins/csrf.test.ts +17 -0
  922. package/src/plugins/csrf.ts +1 -1
  923. package/src/plugins/username-policy.test.ts +8 -8
  924. package/src/plugins/username.ts +1 -1
  925. package/src/release/build-lib.ts +7 -1
  926. package/src/release/limits.ts +2 -2
  927. package/src/release/measure.ts +7 -10
  928. package/src/runs/bridge-to-console.ts +99 -0
  929. package/src/runs/collect.test.ts +68 -0
  930. package/src/runs/collect.ts +29 -2
  931. package/src/runs/drivers/clickhouse.ts +4 -1
  932. package/src/runs/drivers/files.ts +138 -33
  933. package/src/runs/drivers/memory.ts +46 -7
  934. package/src/runs/drivers/postgres.ts +4 -1
  935. package/src/runs/duckdb.test.ts +33 -0
  936. package/src/runs/duckdb.ts +41 -0
  937. package/src/runs/history.ts +61 -0
  938. package/src/runs/index.ts +29 -1
  939. package/src/runs/parquet.test.ts +110 -0
  940. package/src/runs/parquet.ts +129 -8
  941. package/src/runs/retention.test.ts +24 -0
  942. package/src/runs/retention.ts +42 -0
  943. package/src/runs/runs.test.ts +101 -0
  944. package/src/runs/runtime.ts +5 -3
  945. package/src/runs/types.ts +33 -4
  946. package/src/runtime/bun.ts +61 -4
  947. package/src/runtime/dev-request-log.test.ts +4 -0
  948. package/src/runtime/dev-request-log.ts +19 -2
  949. package/src/runtime/index.ts +8 -1
  950. package/src/runtime/json-code-block.test.ts +355 -0
  951. package/src/runtime/json-code-block.ts +961 -0
  952. package/src/runtime/serve.test.ts +49 -4
  953. package/src/term.test.ts +89 -1
  954. package/src/term.ts +103 -29
  955. package/src/test/create-test-app.ts +3 -1
  956. package/src/console/ui/access/AccessA11yView.tsx +0 -222
  957. package/src/console/ui/access/a11y.test.tsx +0 -113
  958. package/src/console/ui/access/acknowledgement.test.ts +0 -10
  959. package/src/console/ui/access/acknowledgement.ts +0 -33
  960. package/src/console/ui/access/blast-radius.test.ts +0 -26
  961. package/src/console/ui/access/blast-radius.ts +0 -38
  962. package/src/console/ui/access/confirmation.test.ts +0 -34
  963. package/src/console/ui/access/confirmation.ts +0 -33
  964. package/src/console/ui/access/fixture.ts +0 -199
  965. package/src/console/ui/access/grantable.test.ts +0 -15
  966. package/src/console/ui/access/grantable.ts +0 -31
  967. package/src/console/ui/access/hygiene.test.ts +0 -12
  968. package/src/console/ui/access/hygiene.ts +0 -39
  969. package/src/console/ui/access/index.ts +0 -47
  970. package/src/console/ui/access/provenance.test.ts +0 -10
  971. package/src/console/ui/access/provenance.ts +0 -25
  972. package/src/console/ui/access/search.test.ts +0 -13
  973. package/src/console/ui/access/search.ts +0 -68
  974. package/src/console/ui/access/types.ts +0 -111
  975. package/src/console/ui/ai/AiA11yView.tsx +0 -254
  976. package/src/console/ui/ai/a11y.test.tsx +0 -96
  977. package/src/console/ui/ai/findings.ts +0 -41
  978. package/src/console/ui/ai/fixture.ts +0 -177
  979. package/src/console/ui/ai/format.ts +0 -88
  980. package/src/console/ui/ai/group.test.ts +0 -35
  981. package/src/console/ui/ai/group.ts +0 -80
  982. package/src/console/ui/ai/index.ts +0 -59
  983. package/src/console/ui/ai/promotion.test.ts +0 -72
  984. package/src/console/ui/ai/promotion.ts +0 -141
  985. package/src/console/ui/ai/search.test.ts +0 -31
  986. package/src/console/ui/ai/search.ts +0 -79
  987. package/src/console/ui/ai/types.ts +0 -132
  988. package/src/console/ui/architecture/ArchitectureA11yView.tsx +0 -142
  989. package/src/console/ui/architecture/a11y.test.tsx +0 -96
  990. package/src/console/ui/architecture/boundary.ts +0 -42
  991. package/src/console/ui/architecture/declared.ts +0 -161
  992. package/src/console/ui/architecture/fixture.ts +0 -74
  993. package/src/console/ui/architecture/index.ts +0 -56
  994. package/src/console/ui/architecture/layers.ts +0 -64
  995. package/src/console/ui/architecture/layout.ts +0 -66
  996. package/src/console/ui/architecture/pathologies.ts +0 -251
  997. package/src/console/ui/architecture/search.ts +0 -136
  998. package/src/console/ui/architecture/traffic.ts +0 -92
  999. package/src/console/ui/architecture/types.ts +0 -136
  1000. package/src/console/ui/architecture/view.test.ts +0 -153
  1001. package/src/console/ui/architecture/view.ts +0 -489
  1002. package/src/console/ui/channels/ChannelsA11yView.tsx +0 -171
  1003. package/src/console/ui/channels/a11y.test.tsx +0 -95
  1004. package/src/console/ui/channels/confirmation.test.ts +0 -34
  1005. package/src/console/ui/channels/confirmation.ts +0 -24
  1006. package/src/console/ui/channels/fallback.test.ts +0 -15
  1007. package/src/console/ui/channels/fallback.ts +0 -20
  1008. package/src/console/ui/channels/findings.ts +0 -34
  1009. package/src/console/ui/channels/fixture.ts +0 -134
  1010. package/src/console/ui/channels/group.ts +0 -25
  1011. package/src/console/ui/channels/index.ts +0 -51
  1012. package/src/console/ui/channels/locale.test.ts +0 -15
  1013. package/src/console/ui/channels/locale.ts +0 -25
  1014. package/src/console/ui/channels/mask.test.ts +0 -14
  1015. package/src/console/ui/channels/mask.ts +0 -12
  1016. package/src/console/ui/channels/search.ts +0 -49
  1017. package/src/console/ui/channels/taxonomy.test.ts +0 -17
  1018. package/src/console/ui/channels/taxonomy.ts +0 -47
  1019. package/src/console/ui/channels/types.ts +0 -118
  1020. package/src/console/ui/clock/ClockA11yView.tsx +0 -165
  1021. package/src/console/ui/clock/a11y.test.tsx +0 -96
  1022. package/src/console/ui/clock/confirmation.test.ts +0 -30
  1023. package/src/console/ui/clock/confirmation.ts +0 -31
  1024. package/src/console/ui/clock/findings.ts +0 -37
  1025. package/src/console/ui/clock/fixture.ts +0 -111
  1026. package/src/console/ui/clock/health.test.ts +0 -25
  1027. package/src/console/ui/clock/health.ts +0 -56
  1028. package/src/console/ui/clock/index.ts +0 -41
  1029. package/src/console/ui/clock/search.test.ts +0 -37
  1030. package/src/console/ui/clock/search.ts +0 -72
  1031. package/src/console/ui/clock/timeline.test.ts +0 -42
  1032. package/src/console/ui/clock/timeline.ts +0 -41
  1033. package/src/console/ui/clock/types.ts +0 -79
  1034. package/src/console/ui/clock/waiting-on.test.ts +0 -30
  1035. package/src/console/ui/clock/waiting-on.ts +0 -78
  1036. package/src/console/ui/confirmation.unify.test.ts +0 -92
  1037. package/src/console/ui/diff/DiffA11yView.tsx +0 -76
  1038. package/src/console/ui/diff/a11y.test.tsx +0 -96
  1039. package/src/console/ui/diff/fixture.ts +0 -85
  1040. package/src/console/ui/diff/group.test.ts +0 -48
  1041. package/src/console/ui/diff/group.ts +0 -91
  1042. package/src/console/ui/diff/index.ts +0 -32
  1043. package/src/console/ui/diff/search.test.ts +0 -28
  1044. package/src/console/ui/diff/search.ts +0 -63
  1045. package/src/console/ui/diff/summary.ts +0 -73
  1046. package/src/console/ui/diff/types.ts +0 -48
  1047. package/src/console/ui/display.test.ts +0 -14
  1048. package/src/console/ui/display.ts +0 -9
  1049. package/src/console/ui/dist/assets/index--Y0Uaz-m.js +0 -10
  1050. package/src/console/ui/dist/assets/panel-access-ri1X9Otj.js +0 -64
  1051. package/src/console/ui/dist/assets/panel-ai-DLHjRoJk.js +0 -1
  1052. package/src/console/ui/dist/assets/panel-architecture-DI3bQF3J.js +0 -1
  1053. package/src/console/ui/dist/assets/panel-channels-BDYWX29p.js +0 -1
  1054. package/src/console/ui/dist/assets/panel-clock-i-JpTjVB.js +0 -1
  1055. package/src/console/ui/dist/assets/panel-diff-CFuWxiXy.js +0 -1
  1056. package/src/console/ui/dist/assets/panel-flows-B8TRhcoe.js +0 -48
  1057. package/src/console/ui/dist/assets/panel-gates-CfkBgco7.js +0 -1
  1058. package/src/console/ui/dist/assets/panel-overview-CW0CQEc2.js +0 -1
  1059. package/src/console/ui/dist/assets/panel-plugins-DDJwTehL.js +0 -1
  1060. package/src/console/ui/dist/assets/panel-runs-BxuyDI3x.js +0 -1
  1061. package/src/console/ui/dist/assets/panel-signals-BXofbj7v.js +0 -1
  1062. package/src/console/ui/dist/assets/panel-store-B8mH-arU.js +0 -1
  1063. package/src/console/ui/dist/assets/panel-traces-DSA-ZWnf.js +0 -1
  1064. package/src/console/ui/dist/assets/panel-vault-BkZdJPX8.js +0 -1
  1065. package/src/console/ui/dist/assets/rolldown-runtime-B0Z9INg1.js +0 -1
  1066. package/src/console/ui/dist/assets/style-C3L349iZ.css +0 -3
  1067. package/src/console/ui/dist/favicon.svg +0 -7
  1068. package/src/console/ui/dist/index.html +0 -15
  1069. package/src/console/ui/flows/FlowsA11yView.tsx +0 -140
  1070. package/src/console/ui/flows/a11y.test.tsx +0 -99
  1071. package/src/console/ui/flows/buffer.test.ts +0 -83
  1072. package/src/console/ui/flows/buffer.ts +0 -111
  1073. package/src/console/ui/flows/confirmation.ts +0 -129
  1074. package/src/console/ui/flows/contract.test.ts +0 -85
  1075. package/src/console/ui/flows/contract.ts +0 -329
  1076. package/src/console/ui/flows/fixture.ts +0 -81
  1077. package/src/console/ui/flows/graph.test.ts +0 -93
  1078. package/src/console/ui/flows/graph.ts +0 -539
  1079. package/src/console/ui/flows/index.ts +0 -82
  1080. package/src/console/ui/flows/save-as-test.test.ts +0 -47
  1081. package/src/console/ui/flows/save-as-test.ts +0 -97
  1082. package/src/console/ui/flows/search.ts +0 -238
  1083. package/src/console/ui/flows/tiers.ts +0 -133
  1084. package/src/console/ui/gates/GatesA11yView.tsx +0 -183
  1085. package/src/console/ui/gates/a11y.test.tsx +0 -113
  1086. package/src/console/ui/gates/audit.test.ts +0 -40
  1087. package/src/console/ui/gates/audit.ts +0 -61
  1088. package/src/console/ui/gates/denial.test.ts +0 -34
  1089. package/src/console/ui/gates/denial.ts +0 -43
  1090. package/src/console/ui/gates/findings.ts +0 -17
  1091. package/src/console/ui/gates/fixture.ts +0 -193
  1092. package/src/console/ui/gates/group.test.ts +0 -30
  1093. package/src/console/ui/gates/group.ts +0 -94
  1094. package/src/console/ui/gates/index.ts +0 -39
  1095. package/src/console/ui/gates/search.test.ts +0 -49
  1096. package/src/console/ui/gates/search.ts +0 -108
  1097. package/src/console/ui/gates/types.ts +0 -124
  1098. package/src/console/ui/overview/OverviewA11yView.tsx +0 -134
  1099. package/src/console/ui/overview/a11y.test.tsx +0 -112
  1100. package/src/console/ui/overview/busiest.ts +0 -24
  1101. package/src/console/ui/overview/compose.ts +0 -121
  1102. package/src/console/ui/overview/cost.test.ts +0 -39
  1103. package/src/console/ui/overview/cost.ts +0 -134
  1104. package/src/console/ui/overview/fixture.ts +0 -156
  1105. package/src/console/ui/overview/golden.ts +0 -47
  1106. package/src/console/ui/overview/index.ts +0 -52
  1107. package/src/console/ui/overview/rank.test.ts +0 -129
  1108. package/src/console/ui/overview/rank.ts +0 -205
  1109. package/src/console/ui/overview/slo.test.ts +0 -69
  1110. package/src/console/ui/overview/slo.ts +0 -240
  1111. package/src/console/ui/overview/types.ts +0 -127
  1112. package/src/console/ui/overview/verdict.ts +0 -124
  1113. package/src/console/ui/plugins/PluginsA11yView.tsx +0 -217
  1114. package/src/console/ui/plugins/a11y.test.tsx +0 -96
  1115. package/src/console/ui/plugins/command.test.ts +0 -22
  1116. package/src/console/ui/plugins/command.ts +0 -27
  1117. package/src/console/ui/plugins/findings.ts +0 -39
  1118. package/src/console/ui/plugins/fixture.ts +0 -238
  1119. package/src/console/ui/plugins/group.test.ts +0 -36
  1120. package/src/console/ui/plugins/group.ts +0 -62
  1121. package/src/console/ui/plugins/index.ts +0 -30
  1122. package/src/console/ui/plugins/search.ts +0 -55
  1123. package/src/console/ui/plugins/types.ts +0 -118
  1124. package/src/console/ui/runs/RunsA11yView.tsx +0 -252
  1125. package/src/console/ui/runs/a11y.test.tsx +0 -96
  1126. package/src/console/ui/runs/errors.test.ts +0 -53
  1127. package/src/console/ui/runs/errors.ts +0 -88
  1128. package/src/console/ui/runs/explain.test.ts +0 -23
  1129. package/src/console/ui/runs/explain.ts +0 -28
  1130. package/src/console/ui/runs/fixture.ts +0 -189
  1131. package/src/console/ui/runs/group.test.ts +0 -24
  1132. package/src/console/ui/runs/group.ts +0 -76
  1133. package/src/console/ui/runs/histogram.test.ts +0 -22
  1134. package/src/console/ui/runs/histogram.ts +0 -82
  1135. package/src/console/ui/runs/index.ts +0 -69
  1136. package/src/console/ui/runs/project.ts +0 -118
  1137. package/src/console/ui/runs/query.test.ts +0 -48
  1138. package/src/console/ui/runs/query.ts +0 -260
  1139. package/src/console/ui/runs/search.test.ts +0 -45
  1140. package/src/console/ui/runs/search.ts +0 -143
  1141. package/src/console/ui/runs/trace-link.test.ts +0 -26
  1142. package/src/console/ui/runs/trace-link.ts +0 -87
  1143. package/src/console/ui/runs/types.ts +0 -135
  1144. package/src/console/ui/shell/App.tsx +0 -88
  1145. package/src/console/ui/shell/client.ts +0 -1642
  1146. package/src/console/ui/shell/components/oke-logo.tsx +0 -40
  1147. package/src/console/ui/shell/components/ui.tsx +0 -111
  1148. package/src/console/ui/shell/index.html +0 -13
  1149. package/src/console/ui/shell/layout/Shell.tsx +0 -92
  1150. package/src/console/ui/shell/main.tsx +0 -216
  1151. package/src/console/ui/shell/panels/Access.tsx +0 -5
  1152. package/src/console/ui/shell/panels/Ai.tsx +0 -5
  1153. package/src/console/ui/shell/panels/Architecture.tsx +0 -5
  1154. package/src/console/ui/shell/panels/Channels.tsx +0 -5
  1155. package/src/console/ui/shell/panels/Clock.tsx +0 -5
  1156. package/src/console/ui/shell/panels/Diff.tsx +0 -5
  1157. package/src/console/ui/shell/panels/Flows.tsx +0 -5
  1158. package/src/console/ui/shell/panels/Gates.tsx +0 -5
  1159. package/src/console/ui/shell/panels/Overview.tsx +0 -6
  1160. package/src/console/ui/shell/panels/Plugins.tsx +0 -5
  1161. package/src/console/ui/shell/panels/Runs.tsx +0 -5
  1162. package/src/console/ui/shell/panels/Signals.tsx +0 -5
  1163. package/src/console/ui/shell/panels/Store.tsx +0 -5
  1164. package/src/console/ui/shell/panels/Traces.tsx +0 -5
  1165. package/src/console/ui/shell/panels/Vault.tsx +0 -5
  1166. package/src/console/ui/shell/panels/access/AccessPanel.tsx +0 -749
  1167. package/src/console/ui/shell/panels/ai/AiPanel.tsx +0 -492
  1168. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +0 -329
  1169. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +0 -422
  1170. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +0 -454
  1171. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +0 -234
  1172. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +0 -284
  1173. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +0 -335
  1174. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +0 -482
  1175. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +0 -433
  1176. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +0 -398
  1177. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +0 -402
  1178. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +0 -652
  1179. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +0 -788
  1180. package/src/console/ui/shell/panels/store/StorePanel.tsx +0 -755
  1181. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +0 -478
  1182. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +0 -477
  1183. package/src/console/ui/shell/plugin/Sandbox.tsx +0 -29
  1184. package/src/console/ui/shell/public/favicon.svg +0 -7
  1185. package/src/console/ui/shell/setup/Wizard.tsx +0 -211
  1186. package/src/console/ui/shell/styles.css +0 -74
  1187. package/src/console/ui/signals/SignalsA11yView.tsx +0 -252
  1188. package/src/console/ui/signals/a11y.test.tsx +0 -96
  1189. package/src/console/ui/signals/confirmation.test.ts +0 -35
  1190. package/src/console/ui/signals/confirmation.ts +0 -59
  1191. package/src/console/ui/signals/dry-run.test.ts +0 -18
  1192. package/src/console/ui/signals/dry-run.ts +0 -34
  1193. package/src/console/ui/signals/durable.test.ts +0 -22
  1194. package/src/console/ui/signals/durable.ts +0 -39
  1195. package/src/console/ui/signals/findings.ts +0 -31
  1196. package/src/console/ui/signals/fixture.ts +0 -242
  1197. package/src/console/ui/signals/group.test.ts +0 -26
  1198. package/src/console/ui/signals/group.ts +0 -41
  1199. package/src/console/ui/signals/index.ts +0 -49
  1200. package/src/console/ui/signals/monitor.test.ts +0 -30
  1201. package/src/console/ui/signals/monitor.ts +0 -74
  1202. package/src/console/ui/signals/schema-form.test.ts +0 -23
  1203. package/src/console/ui/signals/schema-form.ts +0 -109
  1204. package/src/console/ui/signals/search.ts +0 -93
  1205. package/src/console/ui/signals/types.ts +0 -72
  1206. package/src/console/ui/store/StoreA11yView.tsx +0 -193
  1207. package/src/console/ui/store/a11y.test.tsx +0 -96
  1208. package/src/console/ui/store/cache-view.test.ts +0 -13
  1209. package/src/console/ui/store/cache-view.ts +0 -36
  1210. package/src/console/ui/store/confirmation.test.ts +0 -36
  1211. package/src/console/ui/store/confirmation.ts +0 -52
  1212. package/src/console/ui/store/dry-run.test.ts +0 -15
  1213. package/src/console/ui/store/dry-run.ts +0 -26
  1214. package/src/console/ui/store/fixture.ts +0 -167
  1215. package/src/console/ui/store/group.test.ts +0 -16
  1216. package/src/console/ui/store/group.ts +0 -38
  1217. package/src/console/ui/store/index.ts +0 -36
  1218. package/src/console/ui/store/search.ts +0 -74
  1219. package/src/console/ui/store/types.ts +0 -67
  1220. package/src/console/ui/store/will-not-fire.test.ts +0 -19
  1221. package/src/console/ui/store/will-not-fire.ts +0 -39
  1222. package/src/console/ui/traces/TracesA11yView.tsx +0 -181
  1223. package/src/console/ui/traces/a11y.test.tsx +0 -96
  1224. package/src/console/ui/traces/chain.test.ts +0 -47
  1225. package/src/console/ui/traces/chain.ts +0 -142
  1226. package/src/console/ui/traces/critical-path.test.ts +0 -22
  1227. package/src/console/ui/traces/critical-path.ts +0 -55
  1228. package/src/console/ui/traces/filter.test.ts +0 -74
  1229. package/src/console/ui/traces/filter.ts +0 -104
  1230. package/src/console/ui/traces/fixture.ts +0 -126
  1231. package/src/console/ui/traces/fold.test.ts +0 -59
  1232. package/src/console/ui/traces/fold.ts +0 -168
  1233. package/src/console/ui/traces/index.ts +0 -64
  1234. package/src/console/ui/traces/mini.ts +0 -63
  1235. package/src/console/ui/traces/replay.test.ts +0 -22
  1236. package/src/console/ui/traces/replay.ts +0 -33
  1237. package/src/console/ui/traces/sampling.test.ts +0 -26
  1238. package/src/console/ui/traces/sampling.ts +0 -63
  1239. package/src/console/ui/traces/search.ts +0 -135
  1240. package/src/console/ui/traces/tier.ts +0 -70
  1241. package/src/console/ui/traces/types.ts +0 -125
  1242. package/src/console/ui/tsconfig.json +0 -20
  1243. package/src/console/ui/vault/VaultA11yView.tsx +0 -197
  1244. package/src/console/ui/vault/a11y.test.tsx +0 -96
  1245. package/src/console/ui/vault/backend.test.ts +0 -75
  1246. package/src/console/ui/vault/backend.ts +0 -117
  1247. package/src/console/ui/vault/blast-radius.ts +0 -53
  1248. package/src/console/ui/vault/confirmation.test.ts +0 -37
  1249. package/src/console/ui/vault/confirmation.ts +0 -36
  1250. package/src/console/ui/vault/dormant.ts +0 -28
  1251. package/src/console/ui/vault/export-safe.test.ts +0 -26
  1252. package/src/console/ui/vault/export-safe.ts +0 -62
  1253. package/src/console/ui/vault/fixture.ts +0 -94
  1254. package/src/console/ui/vault/group.test.ts +0 -25
  1255. package/src/console/ui/vault/group.ts +0 -49
  1256. package/src/console/ui/vault/index.ts +0 -47
  1257. package/src/console/ui/vault/search.ts +0 -58
  1258. package/src/console/ui/vault/types.ts +0 -83
  1259. package/src/console/ui/vite.config.ts +0 -84
  1260. /package/src/console/{ui/vault → ui-next/src/features/vault/lib}/blast-radius.test.ts +0 -0
  1261. /package/src/console/{ui/vault → ui-next/src/features/vault/lib}/dormant.test.ts +0 -0
@@ -12,23 +12,40 @@ import {
12
12
  issueSession,
13
13
  PasswordPolicyError,
14
14
  scopesForRoles,
15
- userPrincipal,
16
15
  type IssuedSession,
17
16
  } from "../../auth/index.ts";
18
17
  import { DryRunWriteIsolationError } from "../../kernel/dry-run.ts";
19
18
  import { fail, flow, http, type AnyFlowDef, type Binding } from "../../kernel/index.ts";
20
19
  import type { Flow as ManifestFlow, ResourceRef } from "../../manifest/types.ts";
20
+ import { eventHasIrreversible, runReplay } from "../../cli/replay.ts";
21
+ import { createRunsRuntime } from "../../runs/runtime.ts";
21
22
  import type { WideEvent } from "../../runs/types.ts";
22
23
  import { bindHttp } from "./bind.ts";
23
24
  import { touchLoginRateLimit } from "./auth-rate.ts";
24
- import { verifyClaimCode } from "./claim.ts";
25
- import { maskWideEventForConsole, piiFieldNamesFromManifest } from "./runs-pii.ts";
25
+ import { clearClaimCodeArtifact, verifyClaimCode } from "./claim.ts";
26
+ import { maskPiiValue, maskWideEventForConsole, piiFieldNamesFromManifest } from "./runs-pii.ts";
27
+ import { ConsoleRunsQueryError, RUNS_QUERY_PII_GAP, RUNS_QUERY_TIMEOUT_MS } from "./runs-query.ts";
28
+ import { DuckQueryTimeoutError } from "../../runs/duckdb.ts";
26
29
  import { ClockResourceNotFoundError, ScheduleNotOverridableError } from "./clock.ts";
27
30
  import { createFileDiff, emitStructuralDiff } from "./structural.ts";
28
31
  import type { ConsoleState } from "./state.ts";
29
32
  import { consoleFailureMessage } from "./i18n.ts";
33
+ import { CONSOLE_PASSWORD_POLICY } from "../password-policy.ts";
30
34
  import { PUBLIC_CONSOLE_FLOWS } from "./public-flows.ts";
31
- import { tenancyDeclared } from "./store.ts";
35
+ import { resolveInvokeAs } from "./invoke-user-flow.ts";
36
+ import { isKnownConsoleSqlGate, StoreFileNotFoundError, tenancyDeclared } from "./store.ts";
37
+ import {
38
+ PG_STAT_STATEMENTS_NOT_CREATED,
39
+ PG_STAT_STATEMENTS_NOT_PRELOADED,
40
+ STORE_SQL_LOCKS_POLL_MS,
41
+ STORE_SQL_STATS_PII_GAP,
42
+ StoreSqlStatsError,
43
+ } from "./store-stats.ts";
44
+ import {
45
+ STORE_KV_STATS_SERVER_WIDE_GAP,
46
+ STORE_KV_STATS_SLOWLOG_ARGS_GAP,
47
+ StoreKvStatsError,
48
+ } from "./store-kv-stats.ts";
32
49
 
33
50
  export { PUBLIC_CONSOLE_FLOWS };
34
51
 
@@ -41,7 +58,7 @@ const ClaimIn = z.object({
41
58
  claimCode: z.string().min(1),
42
59
  email: z.string().email(),
43
60
  name: z.string().min(1),
44
- /** Matches default operator password policy (minLength 12). */
61
+ /** Matches {@link CONSOLE_PASSWORD_POLICY} (enforced again in createOperator). */
45
62
  password: z.string().min(12),
46
63
  });
47
64
 
@@ -102,18 +119,26 @@ const RunsListOut = z.object({
102
119
  replica: z.enum(["primary", "replica"]).nullable(),
103
120
  replicaLagMs: z.number().nullable(),
104
121
  cost: z.number().nullable(),
122
+ inputTokens: z.number().nullable(),
123
+ outputTokens: z.number().nullable(),
105
124
  promptVersion: z.number().nullable(),
106
125
  buildVersion: z.string().nullable(),
107
126
  startedAt: z.number(),
108
127
  endedAt: z.number(),
109
128
  durationMs: z.number(),
110
129
  error: z.string().nullable(),
130
+ /** Human message from the run ledger when present. */
131
+ errorMessage: z.string().nullable(),
111
132
  sampled: z.enum(["full", "error", "sample", "boost"]),
112
133
  effects: z.array(EffectEntryOut),
113
134
  /** `fx.log` lines — a field on the run, not a parallel stream. */
114
135
  logs: z.array(LogLineOut),
115
136
  /** All queryable dimensions for population analysis. */
116
137
  dimensions: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])),
138
+ /** Validated flow input snapshot for replay — null when absent. */
139
+ input: z.unknown().nullable(),
140
+ /** Flow return value snapshot — null when absent (failures / legacy). */
141
+ output: z.unknown().nullable(),
117
142
  }),
118
143
  ),
119
144
  });
@@ -128,6 +153,17 @@ const TracesReplayOut = z.object({
128
153
  rootId: z.string(),
129
154
  dryRun: z.boolean(),
130
155
  at: z.number(),
156
+ flow: z.string(),
157
+ });
158
+
159
+ const ReplayUnavailable = z.object({
160
+ rootId: z.string(),
161
+ reason: z.enum(["no_stored_input"]),
162
+ });
163
+
164
+ const ReplayFailed = z.object({
165
+ rootId: z.string(),
166
+ message: z.string(),
131
167
  });
132
168
 
133
169
  const SignalEndpointOut = z.object({
@@ -278,19 +314,44 @@ const IdentitiesOut = z.object({
278
314
  const InvokeIn = z.object({
279
315
  flowId: z.string().min(1),
280
316
  body: z.unknown(),
281
- asUserId: z.string().min(1),
317
+ /** Seeded identity when Invoke As → User. Omit for Operator / Public / policy. */
318
+ asUserId: z.string().min(1).optional(),
319
+ /** `public` or a policy Gate. Omit for Operator bypass. */
320
+ asGate: z.string().min(1).optional(),
321
+ /** Path params for HTTP routes with `:param` segments. */
322
+ pathParams: z.record(z.string(), z.string()).optional(),
282
323
  /** Typed confirmation phrase for irreversible production invokes. */
283
324
  confirmation: z.string().optional(),
284
325
  /** Recorded reason for irreversible production invokes. */
285
326
  reason: z.string().optional(),
327
+ /** Return classified PII in the handler response (audited). */
328
+ revealPii: z.boolean().optional(),
286
329
  });
287
330
 
288
331
  const InvokeOut = z.object({
289
332
  ok: z.literal(true),
290
333
  flowId: z.string(),
291
334
  asUserId: z.string(),
335
+ asGate: z.string().nullable().optional(),
292
336
  trigger: z.enum(["http", "signal", "clock", "internal", "durable"]),
293
337
  response: z.unknown(),
338
+ /** True when classified PII keys were redacted. */
339
+ masked: z.boolean(),
340
+ /** HTTP-ish status from the host when available (200 / 4xx). */
341
+ status: z.number().optional(),
342
+ /** Host typed failure when the target flow returned `fail(...)`. */
343
+ failure: z
344
+ .object({
345
+ code: z.string(),
346
+ data: z.unknown().optional(),
347
+ message: z.string().optional(),
348
+ })
349
+ .optional(),
350
+ runId: z.string().optional(),
351
+ /** Host telemetry cache dimension when the invoke adapter reported one. */
352
+ cache: z.enum(["hit", "miss", "none"]).optional(),
353
+ /** Handler duration from the host execute (high-res ms). */
354
+ durationMs: z.number().optional(),
294
355
  peakTier: z.enum(["none", "reads", "writes", "emits", "external", "capabilities"]),
295
356
  auditedAt: z.number(),
296
357
  });
@@ -302,6 +363,9 @@ const ClaimFailed = z.object({
302
363
  reasons: z.array(z.string()).optional(),
303
364
  });
304
365
  const AuthFailed = z.object({});
366
+ const QueryRejected = z.object({ reason: z.string() });
367
+ const QueryTimeout = z.object({ timeoutMs: z.number() });
368
+ const QueryFailed = z.object({ reason: z.string() });
305
369
  const AuthRateLimited = z.object({ reason: z.string() });
306
370
  const NotFound = z.object({ flowId: z.string() });
307
371
  const InvokeDenied = z.object({ reason: z.string() });
@@ -313,8 +377,8 @@ const ConfirmRequired = z.object({
313
377
  "EDIT",
314
378
  "DELETE",
315
379
  "PURGE",
316
- "SET",
317
380
  "ROTATE",
381
+ "ROTATE_MASTER",
318
382
  "REVOKE",
319
383
  "RUN",
320
384
  "SEND",
@@ -460,7 +524,13 @@ const ChannelSendTestOut = z.object({
460
524
  at: z.number(),
461
525
  });
462
526
 
463
- const VaultNotFound = z.object({ name: z.string() });
527
+ const VaultNotFound = z.object({
528
+ name: z.string(),
529
+ reason: z.string().optional(),
530
+ });
531
+ const VaultSealed = z.object({ reason: z.string() });
532
+ const VaultRotateBusy = z.object({ reason: z.string() });
533
+ const VaultUnsupported = z.object({ reason: z.string() });
464
534
  const ClockNotFound = z.object({ kind: z.enum(["cron", "run"]), id: z.string() });
465
535
  const ScheduleNotOverridable = z.object({ name: z.string() });
466
536
 
@@ -522,6 +592,38 @@ const ClockListOut = z.object({
522
592
  ),
523
593
  });
524
594
 
595
+ const InstanceClockLeaseOut = z.object({
596
+ name: z.string(),
597
+ leaseUntil: z.number(),
598
+ });
599
+
600
+ const InstanceJournalLeaseOut = z.object({
601
+ runId: z.string(),
602
+ flow: z.string(),
603
+ leaseUntil: z.number(),
604
+ });
605
+
606
+ const InstanceDetailOut = z.object({
607
+ id: z.string(),
608
+ startedAt: z.number(),
609
+ heartbeatAt: z.number(),
610
+ leaseExpiresAt: z.number(),
611
+ env: z.enum(["dev", "test", "prod"]),
612
+ pid: z.number().optional(),
613
+ clock: z.array(InstanceClockLeaseOut),
614
+ journal: z.array(InstanceJournalLeaseOut),
615
+ });
616
+
617
+ const InstancesListOut = z.discriminatedUnion("kind", [
618
+ z.object({ kind: z.literal("empty") }),
619
+ z.object({
620
+ kind: z.literal("fleet"),
621
+ now: z.number(),
622
+ alive: z.number(),
623
+ instances: z.array(InstanceDetailOut),
624
+ }),
625
+ ]);
626
+
525
627
  const ClockRunNowIn = z.object({
526
628
  name: z.string().min(1),
527
629
  confirmation: z.string().optional(),
@@ -567,7 +669,7 @@ const ClockWakeEarlyOut = z.object({
567
669
  });
568
670
 
569
671
  const VaultResolutionStepOut = z.object({
570
- source: z.enum(["process.env", ".env.local", ".env.docker", "driver", "dev-fallback"]),
672
+ source: z.enum(["process.env", ".env.local", "driver", "dev-fallback"]),
571
673
  present: z.boolean(),
572
674
  won: z.boolean(),
573
675
  });
@@ -588,12 +690,13 @@ const VaultRowOut = z.object({
588
690
  fingerprints: z.record(z.string(), z.string()),
589
691
  fingerprint: z.string().nullable(),
590
692
  cleartext: z.string().nullable(),
591
- winner: z.enum(["process.env", ".env.local", ".env.docker", "driver", "dev-fallback"]).nullable(),
693
+ winner: z.enum(["process.env", ".env.local", "driver", "dev-fallback"]).nullable(),
592
694
  resolution: z.array(VaultResolutionStepOut),
593
695
  readers: z.array(z.string()),
594
696
  blastRadius: VaultBlastRadiusOut,
595
697
  lastReadAt: z.number().nullable(),
596
698
  sharedFingerprintEnvs: z.array(z.string()),
699
+ origin: z.enum(["source", "console"]).optional(),
597
700
  });
598
701
 
599
702
  const VaultBuiltinStatusOut = z.object({
@@ -613,6 +716,7 @@ const VaultBackendOut = z.object({
613
716
  builtin: z.boolean(),
614
717
  status: VaultBuiltinStatusOut.nullable(),
615
718
  unavailable: z.string().nullable(),
719
+ provider: z.string().nullable(),
616
720
  });
617
721
 
618
722
  const VaultListOut = z.object({
@@ -625,9 +729,19 @@ const VaultWriteIn = z.object({
625
729
  name: z.string().min(1),
626
730
  value: z.string().min(1),
627
731
  confirmation: z.string().optional(),
628
- reason: z.string().optional(),
732
+ reason: z.string().min(3),
733
+ });
734
+
735
+ const VaultCreateIn = z.object({
736
+ name: z.string().min(1),
737
+ value: z.string().min(1),
738
+ kind: z.enum(["secret", "config"]),
739
+ description: z.string().optional(),
740
+ rotate: z.string().optional(),
629
741
  });
630
742
 
743
+ const VaultExists = z.object({ name: z.string() });
744
+
631
745
  const VaultWriteOut = z.object({
632
746
  ok: z.literal(true),
633
747
  name: z.string(),
@@ -635,6 +749,40 @@ const VaultWriteOut = z.object({
635
749
  at: z.number(),
636
750
  });
637
751
 
752
+ const VaultAuditRowOut = z.object({
753
+ id: z.string(),
754
+ seq: z.number(),
755
+ action: z.string(),
756
+ path: z.string().nullable(),
757
+ actorType: z.string(),
758
+ actorId: z.string().nullable(),
759
+ success: z.boolean(),
760
+ errorCode: z.string().nullable(),
761
+ errorMessage: z.string().nullable(),
762
+ requestId: z.string().nullable(),
763
+ createdAt: z.number(),
764
+ });
765
+
766
+ const VaultAuditVerifyOut = z.object({
767
+ ok: z.boolean(),
768
+ brokenAt: z.string().nullable(),
769
+ reason: z.enum(["link", "payload"]).nullable(),
770
+ row: VaultAuditRowOut.nullable(),
771
+ });
772
+
773
+ const VaultRotateMasterIn = z.object({
774
+ confirmation: z.string().optional(),
775
+ reason: z.string().optional(),
776
+ });
777
+
778
+ const VaultRotateMasterOut = z.object({
779
+ ok: z.literal(true),
780
+ kekVersion: z.number(),
781
+ remaining: z.number(),
782
+ masterKey: z.string().nullable(),
783
+ at: z.number(),
784
+ });
785
+
638
786
  const AiMetricOut = z.object({
639
787
  samples: z.array(z.number()),
640
788
  mean: z.number(),
@@ -1261,6 +1409,7 @@ const StoreListOut = z.object({
1261
1409
  z.object({
1262
1410
  name: z.string(),
1263
1411
  effectRef: z.string(),
1412
+ kind: z.enum(["table", "index", "function", "trigger", "extension", "policy"]).optional(),
1264
1413
  writers: z.array(z.string()),
1265
1414
  readers: z.array(z.string()),
1266
1415
  cache: z.object({
@@ -1271,6 +1420,7 @@ const StoreListOut = z.object({
1271
1420
  willNotFire: WillNotFireOut,
1272
1421
  piiColumns: z.array(z.string()),
1273
1422
  columnDescriptions: z.record(z.string(), z.string()),
1423
+ rls: z.boolean().optional(),
1274
1424
  }),
1275
1425
  ),
1276
1426
  replicaLagMs: z.number().nullable(),
@@ -1282,6 +1432,7 @@ const StoreListOut = z.object({
1282
1432
  })
1283
1433
  .nullable(),
1284
1434
  contentAddressed: z.boolean(),
1435
+ driverId: z.enum(["memory", "fs", "s3"]).optional(),
1285
1436
  warnings: z.array(
1286
1437
  z.object({
1287
1438
  code: z.string(),
@@ -1300,7 +1451,9 @@ const StoreQueryIn = z.object({
1300
1451
  prefix: z.string().optional(),
1301
1452
  limit: z.number().min(1).max(500).optional(),
1302
1453
  vector: z.array(z.number()).optional(),
1454
+ q: z.string().optional(),
1303
1455
  topK: z.number().min(1).max(100).optional(),
1456
+ revealPii: z.boolean().optional(),
1304
1457
  });
1305
1458
 
1306
1459
  const StoreQueryOut = z.object({
@@ -1311,6 +1464,9 @@ const StoreQueryOut = z.object({
1311
1464
  z.object({
1312
1465
  key: z.string(),
1313
1466
  value: z.unknown().optional(),
1467
+ ttlMs: z.number().nullable().optional(),
1468
+ sizeBytes: z.number().optional(),
1469
+ originalName: z.string().optional(),
1314
1470
  warnings: z.array(z.object({ code: z.string(), message: z.string() })).optional(),
1315
1471
  }),
1316
1472
  )
@@ -1342,6 +1498,23 @@ const StoreRevealOut = z.object({
1342
1498
  at: z.number(),
1343
1499
  });
1344
1500
 
1501
+ const StoreFileGetIn = z.object({
1502
+ ref: z.string().min(1),
1503
+ key: z.string().min(1),
1504
+ tenant: z.string().optional(),
1505
+ });
1506
+
1507
+ const StoreFileGetOut = z.object({
1508
+ key: z.string(),
1509
+ sizeBytes: z.number(),
1510
+ contentType: z.string(),
1511
+ encoding: z.enum(["utf8", "base64"]),
1512
+ body: z.string(),
1513
+ truncated: z.boolean(),
1514
+ originalName: z.string().optional(),
1515
+ warnings: z.array(z.object({ code: z.string(), message: z.string() })),
1516
+ });
1517
+
1345
1518
  const StoreEditIn = z.object({
1346
1519
  ref: z.string().min(1),
1347
1520
  child: z.string().optional(),
@@ -1402,12 +1575,158 @@ const StoreSqlIn = z.object({
1402
1575
  sql: z.string().min(1),
1403
1576
  tenant: z.string().optional(),
1404
1577
  allowWrite: z.boolean().optional(),
1578
+ revealPii: z.boolean().optional(),
1579
+ asGate: z.string().min(1).optional(),
1405
1580
  });
1406
1581
 
1407
1582
  const StoreSqlOut = z.object({
1408
1583
  rows: z.array(z.record(z.string(), z.unknown())),
1409
1584
  masked: z.boolean(),
1410
1585
  routedRole: z.enum(["primary", "replica"]),
1586
+ asGate: z.string().nullable(),
1587
+ gateApplied: z.boolean(),
1588
+ });
1589
+
1590
+ const StoreSqlStatsIn = z.object({
1591
+ ref: z.string().min(1),
1592
+ tenant: z.string().optional(),
1593
+ });
1594
+
1595
+ const StoreSqlStatsOut = z.object({
1596
+ statements: z.array(
1597
+ z.object({
1598
+ queryid: z.string().nullable(),
1599
+ query: z.string().nullable(),
1600
+ calls: z.number(),
1601
+ totalExecMs: z.number(),
1602
+ meanExecMs: z.number(),
1603
+ minExecMs: z.number(),
1604
+ maxExecMs: z.number(),
1605
+ rows: z.number(),
1606
+ sharedBlksHit: z.number(),
1607
+ sharedBlksRead: z.number(),
1608
+ cacheHitRate: z.number().nullable(),
1609
+ }),
1610
+ ),
1611
+ kpis: z.object({
1612
+ slowQueries: z.number(),
1613
+ cacheHitRate: z.number().nullable(),
1614
+ avgRowsPerCall: z.number().nullable(),
1615
+ }),
1616
+ limitation: z.literal(STORE_SQL_STATS_PII_GAP),
1617
+ rowCount: z.number(),
1618
+ truncated: z.boolean(),
1619
+ advisor: z.object({
1620
+ available: z.boolean(),
1621
+ installed: z.boolean(),
1622
+ hypopgAvailable: z.boolean(),
1623
+ }),
1624
+ });
1625
+
1626
+ const StoreSqlLocksIn = z.object({
1627
+ ref: z.string().min(1),
1628
+ tenant: z.string().optional(),
1629
+ revealPii: z.boolean().optional(),
1630
+ });
1631
+
1632
+ const StoreSqlLocksOut = z.object({
1633
+ rows: z.array(
1634
+ z.object({
1635
+ blockedPid: z.number().nullable(),
1636
+ blockedUser: z.string().nullable(),
1637
+ blockedQuery: z.string().nullable(),
1638
+ blockedAt: z.string().nullable(),
1639
+ blockingPid: z.number().nullable(),
1640
+ blockingUser: z.string().nullable(),
1641
+ blockingQuery: z.string().nullable(),
1642
+ blockingState: z.string().nullable(),
1643
+ waitEventType: z.string().nullable(),
1644
+ waitEvent: z.string().nullable(),
1645
+ }),
1646
+ ),
1647
+ masked: z.boolean(),
1648
+ limitation: z.literal(STORE_SQL_STATS_PII_GAP),
1649
+ pollingMs: z.literal(STORE_SQL_LOCKS_POLL_MS),
1650
+ });
1651
+
1652
+ const StoreSqlAdviseIn = z.object({
1653
+ ref: z.string().min(1),
1654
+ query: z.string().min(1),
1655
+ tenant: z.string().optional(),
1656
+ });
1657
+
1658
+ const StoreSqlAdviseOut = z.object({
1659
+ startupCostBefore: z.unknown(),
1660
+ startupCostAfter: z.unknown(),
1661
+ totalCostBefore: z.unknown(),
1662
+ totalCostAfter: z.unknown(),
1663
+ indexStatements: z.array(z.string()),
1664
+ errors: z.array(z.string()),
1665
+ });
1666
+
1667
+ const PgStatStatementsNotPreloaded = z.object({ reason: z.string() });
1668
+ const PgStatStatementsUnsupported = z.object({ reason: z.string() });
1669
+ const PgStatStatementsNotCreated = z.object({ reason: z.string() });
1670
+
1671
+ const StoreKvStatsIn = z.object({
1672
+ ref: z.string().min(1),
1673
+ tenant: z.string().optional(),
1674
+ revealPii: z.boolean().optional(),
1675
+ });
1676
+
1677
+ const StoreKvStatsOut = z.object({
1678
+ engine: z.enum(["redis", "memory"]),
1679
+ kpis: z.object({
1680
+ hitRate: z.number().nullable(),
1681
+ opsPerSec: z.number().nullable(),
1682
+ evictedKeys: z.number().nullable(),
1683
+ expiredKeys: z.number().nullable(),
1684
+ }),
1685
+ commands: z.array(
1686
+ z.object({
1687
+ command: z.string(),
1688
+ calls: z.number(),
1689
+ usec: z.number(),
1690
+ usecPerCall: z.number().nullable(),
1691
+ }),
1692
+ ),
1693
+ slowlog: z.array(
1694
+ z.object({
1695
+ id: z.number(),
1696
+ timestamp: z.number(),
1697
+ durationUs: z.number(),
1698
+ command: z.string(),
1699
+ args: z.array(z.string()),
1700
+ }),
1701
+ ),
1702
+ latency: z.array(
1703
+ z.object({
1704
+ event: z.string(),
1705
+ latestUs: z.number().nullable(),
1706
+ allTimeUs: z.number().nullable(),
1707
+ }),
1708
+ ),
1709
+ limitation: z.literal(STORE_KV_STATS_SERVER_WIDE_GAP),
1710
+ slowlogLimitation: z.literal(STORE_KV_STATS_SLOWLOG_ARGS_GAP),
1711
+ masked: z.boolean(),
1712
+ namespacePrefix: z.string(),
1713
+ });
1714
+
1715
+ const KvStatsUnsupported = z.object({ reason: z.string() });
1716
+
1717
+ const RunsQueryIn = z.object({
1718
+ sql: z.string().min(1),
1719
+ revealPii: z.boolean().optional(),
1720
+ });
1721
+
1722
+ const RunsQueryOut = z.object({
1723
+ rows: z.array(z.record(z.string(), z.unknown())),
1724
+ truncated: z.boolean(),
1725
+ rowCount: z.number(),
1726
+ masked: z.literal("column-keys"),
1727
+ durationMs: z.number(),
1728
+ limitation: z.literal(RUNS_QUERY_PII_GAP),
1729
+ injectedLimit: z.boolean(),
1411
1730
  });
1412
1731
 
1413
1732
  const StorePreviewIn = z.object({
@@ -1450,7 +1769,7 @@ export function createConsoleBindings(state: ConsoleState): {
1450
1769
  readonly logout: AnyFlowDef;
1451
1770
  };
1452
1771
  readonly manifest: { readonly get: AnyFlowDef };
1453
- readonly runs: { readonly list: AnyFlowDef };
1772
+ readonly runs: { readonly list: AnyFlowDef; readonly query: AnyFlowDef };
1454
1773
  readonly action: { readonly ping: AnyFlowDef };
1455
1774
  readonly structural: {
1456
1775
  readonly propose: AnyFlowDef;
@@ -1472,16 +1791,24 @@ export function createConsoleBindings(state: ConsoleState): {
1472
1791
  readonly list: AnyFlowDef;
1473
1792
  readonly query: AnyFlowDef;
1474
1793
  readonly reveal: AnyFlowDef;
1794
+ readonly object: AnyFlowDef;
1475
1795
  readonly edit: AnyFlowDef;
1476
1796
  readonly delete: AnyFlowDef;
1477
1797
  readonly purgeCache: AnyFlowDef;
1478
1798
  readonly sql: AnyFlowDef;
1479
1799
  readonly preview: AnyFlowDef;
1800
+ readonly stats: AnyFlowDef;
1801
+ readonly locks: AnyFlowDef;
1802
+ readonly advise: AnyFlowDef;
1803
+ readonly kvStats: AnyFlowDef;
1480
1804
  };
1481
1805
  readonly vault: {
1482
1806
  readonly list: AnyFlowDef;
1483
1807
  readonly set: AnyFlowDef;
1808
+ readonly create: AnyFlowDef;
1484
1809
  readonly rotate: AnyFlowDef;
1810
+ readonly rotateMaster: AnyFlowDef;
1811
+ readonly auditVerify: AnyFlowDef;
1485
1812
  };
1486
1813
  readonly ai: {
1487
1814
  readonly list: AnyFlowDef;
@@ -1513,6 +1840,9 @@ export function createConsoleBindings(state: ConsoleState): {
1513
1840
  readonly editSchedule: AnyFlowDef;
1514
1841
  readonly wakeEarly: AnyFlowDef;
1515
1842
  };
1843
+ readonly instances: {
1844
+ readonly list: AnyFlowDef;
1845
+ };
1516
1846
  readonly channel: {
1517
1847
  readonly list: AnyFlowDef;
1518
1848
  readonly preview: AnyFlowDef;
@@ -1529,6 +1859,7 @@ export function createConsoleBindings(state: ConsoleState): {
1529
1859
  const sessionLogout = createSessionLogout();
1530
1860
  const manifestGet = createManifestGet(state);
1531
1861
  const runsList = createRunsList(state);
1862
+ const runsQuery = createRunsQuery(state);
1532
1863
  const actionPing = createActionPing(state);
1533
1864
  const structuralPropose = createStructuralPropose(state);
1534
1865
  const flowsIdentities = createFlowsIdentities(state);
@@ -1541,14 +1872,22 @@ export function createConsoleBindings(state: ConsoleState): {
1541
1872
  const storeList = createStoreList(state);
1542
1873
  const storeQuery = createStoreQuery(state);
1543
1874
  const storeReveal = createStoreReveal(state);
1875
+ const storeObject = createStoreObject(state);
1544
1876
  const storeEdit = createStoreEdit(state);
1545
1877
  const storeDelete = createStoreDelete(state);
1546
1878
  const storePurgeCache = createStorePurgeCache(state);
1547
1879
  const storeSql = createStoreSql(state);
1548
1880
  const storePreview = createStorePreview(state);
1881
+ const storeStats = createStoreSqlStats(state);
1882
+ const storeLocks = createStoreSqlLocks(state);
1883
+ const storeAdvise = createStoreSqlAdvise(state);
1884
+ const storeKvStats = createStoreKvStats(state);
1549
1885
  const vaultList = createVaultList(state);
1550
1886
  const vaultSet = createVaultSet(state);
1887
+ const vaultCreate = createVaultCreate(state);
1551
1888
  const vaultRotate = createVaultRotate(state);
1889
+ const vaultRotateMaster = createVaultRotateMaster(state);
1890
+ const vaultAuditVerify = createVaultAuditVerify(state);
1552
1891
  const aiList = createAiList(state);
1553
1892
  const gatesList = createGatesList(state);
1554
1893
  const gatesSimulate = createGatesSimulate(state);
@@ -1563,6 +1902,7 @@ export function createConsoleBindings(state: ConsoleState): {
1563
1902
  const diffList = createDiffList(state);
1564
1903
  const pluginsList = createPluginsList(state);
1565
1904
  const clockList = createClockList(state);
1905
+ const instancesList = createInstancesList(state);
1566
1906
  const clockRunNow = createClockRunNow(state);
1567
1907
  const clockPause = createClockPause(state);
1568
1908
  const clockEditSchedule = createClockEditSchedule(state);
@@ -1581,6 +1921,7 @@ export function createConsoleBindings(state: ConsoleState): {
1581
1921
  bindHttp(http.post("/console/session/logout"), sessionLogout),
1582
1922
  bindHttp(http.get("/console/manifest"), manifestGet),
1583
1923
  bindHttp(http.get("/console/runs"), runsList),
1924
+ bindHttp(http.post("/console/runs/query"), runsQuery),
1584
1925
  bindHttp(http.post("/console/action/ping"), actionPing),
1585
1926
  bindHttp(http.post("/console/structural/propose"), structuralPropose),
1586
1927
  bindHttp(http.get("/console/flows/identities"), flowsIdentities),
@@ -1591,22 +1932,30 @@ export function createConsoleBindings(state: ConsoleState): {
1591
1932
  bindHttp(http.post("/console/signals/dry-run-replay"), signalsDryRunReplay),
1592
1933
  bindHttp(http.post("/console/signals/discard"), signalsDiscard),
1593
1934
  bindHttp(http.get("/console/store"), storeList),
1594
- bindHttp(http.post("/console/store/query"), storeQuery),
1935
+ bindHttp(http.query("/console/store/query"), storeQuery),
1595
1936
  bindHttp(http.post("/console/store/reveal"), storeReveal),
1937
+ bindHttp(http.post("/console/store/object"), storeObject),
1596
1938
  bindHttp(http.post("/console/store/edit"), storeEdit),
1597
1939
  bindHttp(http.post("/console/store/delete"), storeDelete),
1598
1940
  bindHttp(http.post("/console/store/purge-cache"), storePurgeCache),
1599
1941
  bindHttp(http.post("/console/store/sql"), storeSql),
1600
1942
  bindHttp(http.post("/console/store/preview"), storePreview),
1943
+ bindHttp(http.query("/console/store/sql/stats"), storeStats),
1944
+ bindHttp(http.query("/console/store/sql/locks"), storeLocks),
1945
+ bindHttp(http.query("/console/store/kv/stats"), storeKvStats),
1946
+ bindHttp(http.post("/console/store/sql/advise"), storeAdvise),
1601
1947
  bindHttp(http.get("/console/vault"), vaultList),
1602
1948
  bindHttp(http.post("/console/vault/set"), vaultSet),
1949
+ bindHttp(http.post("/console/vault/create"), vaultCreate),
1603
1950
  bindHttp(http.post("/console/vault/rotate"), vaultRotate),
1951
+ bindHttp(http.post("/console/vault/rotate-master"), vaultRotateMaster),
1952
+ bindHttp(http.get("/console/vault/audit/verify"), vaultAuditVerify),
1604
1953
  bindHttp(http.get("/console/ai"), aiList),
1605
1954
  bindHttp(http.get("/console/gates"), gatesList),
1606
- bindHttp(http.post("/console/gates/simulate"), gatesSimulate),
1607
- bindHttp(http.post("/console/gates/powers"), gatesPowers),
1955
+ bindHttp(http.query("/console/gates/simulate"), gatesSimulate),
1956
+ bindHttp(http.query("/console/gates/powers"), gatesPowers),
1608
1957
  bindHttp(http.get("/console/access"), accessList),
1609
- bindHttp(http.post("/console/access/effective"), accessEffective),
1958
+ bindHttp(http.query("/console/access/effective"), accessEffective),
1610
1959
  bindHttp(http.post("/console/access/key-blast"), accessKeyBlast),
1611
1960
  bindHttp(http.post("/console/access/keys"), accessCreateKeyFlow),
1612
1961
  bindHttp(http.post("/console/access/keys/revoke"), accessRevokeKeyFlow),
@@ -1615,12 +1964,13 @@ export function createConsoleBindings(state: ConsoleState): {
1615
1964
  bindHttp(http.get("/console/diff"), diffList),
1616
1965
  bindHttp(http.get("/console/plugins"), pluginsList),
1617
1966
  bindHttp(http.get("/console/clock"), clockList),
1967
+ bindHttp(http.get("/console/instances"), instancesList),
1618
1968
  bindHttp(http.post("/console/clock/run-now"), clockRunNow),
1619
1969
  bindHttp(http.post("/console/clock/pause"), clockPause),
1620
1970
  bindHttp(http.post("/console/clock/edit-schedule"), clockEditSchedule),
1621
1971
  bindHttp(http.post("/console/clock/wake-early"), clockWakeEarly),
1622
1972
  bindHttp(http.get("/console/channels"), channelsList),
1623
- bindHttp(http.post("/console/channels/preview"), channelPreview),
1973
+ bindHttp(http.query("/console/channels/preview"), channelPreview),
1624
1974
  bindHttp(http.post("/console/channels/verify-auth"), channelVerifyAuth),
1625
1975
  bindHttp(http.post("/console/channels/reveal"), channelReveal),
1626
1976
  bindHttp(http.post("/console/channels/send-test"), channelSendTest),
@@ -1632,7 +1982,7 @@ export function createConsoleBindings(state: ConsoleState): {
1632
1982
  setup: { status: setupStatus, claim: setupClaim },
1633
1983
  session: { login: sessionLogin, me: sessionMe, logout: sessionLogout },
1634
1984
  manifest: { get: manifestGet },
1635
- runs: { list: runsList },
1985
+ runs: { list: runsList, query: runsQuery },
1636
1986
  action: { ping: actionPing },
1637
1987
  structural: { propose: structuralPropose },
1638
1988
  flows: { identities: flowsIdentities, invoke: flowsInvoke },
@@ -1647,16 +1997,24 @@ export function createConsoleBindings(state: ConsoleState): {
1647
1997
  list: storeList,
1648
1998
  query: storeQuery,
1649
1999
  reveal: storeReveal,
2000
+ object: storeObject,
1650
2001
  edit: storeEdit,
1651
2002
  delete: storeDelete,
1652
2003
  purgeCache: storePurgeCache,
1653
2004
  sql: storeSql,
1654
2005
  preview: storePreview,
2006
+ stats: storeStats,
2007
+ locks: storeLocks,
2008
+ advise: storeAdvise,
2009
+ kvStats: storeKvStats,
1655
2010
  },
1656
2011
  vault: {
1657
2012
  list: vaultList,
1658
2013
  set: vaultSet,
2014
+ create: vaultCreate,
1659
2015
  rotate: vaultRotate,
2016
+ rotateMaster: vaultRotateMaster,
2017
+ auditVerify: vaultAuditVerify,
1660
2018
  },
1661
2019
  ai: { list: aiList },
1662
2020
  gates: {
@@ -1682,6 +2040,7 @@ export function createConsoleBindings(state: ConsoleState): {
1682
2040
  editSchedule: clockEditSchedule,
1683
2041
  wakeEarly: clockWakeEarly,
1684
2042
  },
2043
+ instances: { list: instancesList },
1685
2044
  channel: {
1686
2045
  list: channelsList,
1687
2046
  preview: channelPreview,
@@ -1726,6 +2085,7 @@ function createSetupClaim(state: ConsoleState) {
1726
2085
  email: input.email,
1727
2086
  name: input.name,
1728
2087
  password: input.password,
2088
+ passwordPolicy: CONSOLE_PASSWORD_POLICY,
1729
2089
  });
1730
2090
  } catch (err) {
1731
2091
  if (err instanceof PasswordPolicyError) {
@@ -1746,6 +2106,7 @@ function createSetupClaim(state: ConsoleState) {
1746
2106
  throw err;
1747
2107
  }
1748
2108
  await state.persistOperator(op.id);
2109
+ clearClaimCodeArtifact(state.cwd);
1749
2110
  const issued = await issueOperatorSession(state, op.id);
1750
2111
  fx.log.info("console.setup.claim", { operatorId: op.id });
1751
2112
  return sessionPayload(op.id, op.email, op.name, issued);
@@ -1819,6 +2180,50 @@ function createManifestGet(state: ConsoleState) {
1819
2180
  });
1820
2181
  }
1821
2182
 
2183
+ function createRunsQuery(state: ConsoleState) {
2184
+ return flow("console.runs.query", {
2185
+ plane: "operator",
2186
+ in: RunsQueryIn,
2187
+ out: RunsQueryOut,
2188
+ errors: { AuthFailed, QueryRejected, QueryTimeout, QueryFailed },
2189
+ do: async (input: z.infer<typeof RunsQueryIn>, fx) => {
2190
+ if (!fx.operator.id) return fail("AuthFailed", {});
2191
+ if (input.revealPii === true) {
2192
+ fx.log.info("console.runs.query.reveal", {
2193
+ operatorId: fx.operator.id,
2194
+ });
2195
+ }
2196
+ try {
2197
+ const result = await state.queryPersistedRuns({
2198
+ sql: input.sql,
2199
+ revealPii: input.revealPii === true,
2200
+ });
2201
+ fx.log.info("console.runs.query", {
2202
+ operatorId: fx.operator.id,
2203
+ revealPii: input.revealPii === true,
2204
+ rowCount: result.rowCount,
2205
+ truncated: result.truncated,
2206
+ });
2207
+ return result;
2208
+ } catch (err) {
2209
+ if (err instanceof DuckQueryTimeoutError) {
2210
+ return fail("QueryTimeout", { timeoutMs: err.timeoutMs });
2211
+ }
2212
+ if (err instanceof ConsoleRunsQueryError) {
2213
+ if (err.code === "QueryTimeout") {
2214
+ const match = /^timeout:(\d+)$/.exec(err.reason);
2215
+ return fail("QueryTimeout", {
2216
+ timeoutMs: match ? Number(match[1]) : RUNS_QUERY_TIMEOUT_MS,
2217
+ });
2218
+ }
2219
+ return fail(err.code, { reason: err.reason });
2220
+ }
2221
+ return fail("QueryFailed", { reason: err instanceof Error ? err.message : String(err) });
2222
+ }
2223
+ },
2224
+ });
2225
+ }
2226
+
1822
2227
  function createRunsList(state: ConsoleState) {
1823
2228
  return flow("console.runs.list", {
1824
2229
  plane: "operator",
@@ -1828,8 +2233,12 @@ function createRunsList(state: ConsoleState) {
1828
2233
  if (!fx.operator.id) return fail("AuthFailed", {});
1829
2234
  const all = await state.listRuns();
1830
2235
  const piiFields = piiFieldNamesFromManifest(state.manifest);
2236
+ // Drop prior list polls — they are operator chrome, not Traces rows,
2237
+ // and must never re-enter the projection (nested-output bomb).
1831
2238
  return {
1832
- runs: all.map((r) => projectRun(r, piiFields)),
2239
+ runs: all
2240
+ .filter((r) => r.flow !== "console.runs.list")
2241
+ .map((r) => projectRun(r, piiFields)),
1833
2242
  };
1834
2243
  },
1835
2244
  });
@@ -1865,12 +2274,15 @@ export function projectRun(r: WideEvent, piiFields: ReadonlySet<string> = new Se
1865
2274
  replica: r.replica ?? null,
1866
2275
  replicaLagMs: r.replicaLagMs ?? null,
1867
2276
  cost: r.cost ?? null,
2277
+ inputTokens: r.inputTokens ?? null,
2278
+ outputTokens: r.outputTokens ?? null,
1868
2279
  promptVersion: r.promptVersion ?? null,
1869
2280
  buildVersion: r.buildVersion ?? null,
1870
2281
  startedAt: r.startedAt,
1871
2282
  endedAt: r.endedAt,
1872
2283
  durationMs: r.durationMs,
1873
2284
  error: masked.error?.code ?? null,
2285
+ errorMessage: masked.error?.message ?? null,
1874
2286
  sampled: masked.error ? ("error" as const) : ("sample" as const),
1875
2287
  effects: masked.effects.map((e) => ({
1876
2288
  kind: e.kind,
@@ -1886,6 +2298,8 @@ export function projectRun(r: WideEvent, piiFields: ReadonlySet<string> = new Se
1886
2298
  at: line.at,
1887
2299
  })),
1888
2300
  dimensions,
2301
+ input: masked.input === undefined ? null : masked.input,
2302
+ output: masked.output === undefined ? null : masked.output,
1889
2303
  };
1890
2304
  }
1891
2305
 
@@ -1894,23 +2308,61 @@ function createTracesReplay(state: ConsoleState) {
1894
2308
  plane: "operator",
1895
2309
  in: TracesReplayIn,
1896
2310
  out: TracesReplayOut,
1897
- errors: { AuthFailed, NotFound },
2311
+ errors: { AuthFailed, NotFound, ReplayUnavailable, ReplayFailed },
1898
2312
  do: async (input: z.infer<typeof TracesReplayIn>, fx) => {
1899
2313
  if (!fx.operator.id) return fail("AuthFailed", {});
1900
2314
  const all = await state.listRuns();
1901
2315
  const root = all.find((r) => r.id === input.rootId);
1902
2316
  if (!root) return fail("NotFound", { flowId: input.rootId });
2317
+ if (root.input === undefined) {
2318
+ return fail("ReplayUnavailable", {
2319
+ rootId: input.rootId,
2320
+ reason: "no_stored_input" as const,
2321
+ });
2322
+ }
2323
+
2324
+ const irreversible = eventHasIrreversible(root);
2325
+ const dryRun = input.dryRun || irreversible;
2326
+
2327
+ const runs = createRunsRuntime({ driver: "memory" });
2328
+ await runs.open();
2329
+ await runs.append(root);
2330
+
2331
+ const lines: string[] = [];
2332
+ const code = await runReplay({
2333
+ requestId: input.rootId,
2334
+ cwd: state.cwd,
2335
+ dryRun: dryRun ? true : undefined,
2336
+ live: dryRun ? undefined : true,
2337
+ runs,
2338
+ write: (t) => lines.push(t),
2339
+ ...(state.replayTrace
2340
+ ? {
2341
+ executeReplay: async (_entry: string, event: WideEvent, d: boolean) =>
2342
+ state.replayTrace!({ event, dryRun: d }),
2343
+ }
2344
+ : {}),
2345
+ });
2346
+
2347
+ if (code !== 0) {
2348
+ return fail("ReplayFailed", {
2349
+ rootId: input.rootId,
2350
+ message: lines.join("").trim() || "replay failed",
2351
+ });
2352
+ }
2353
+
1903
2354
  fx.log.info("console.traces.replay", {
1904
2355
  operatorId: fx.operator.id,
1905
2356
  rootId: input.rootId,
1906
- dryRun: input.dryRun,
2357
+ dryRun,
1907
2358
  flow: root.flow,
1908
2359
  });
1909
2360
  return {
1910
2361
  ok: true as const,
1911
2362
  rootId: input.rootId,
1912
- dryRun: input.dryRun,
2363
+ dryRun,
1913
2364
  at: Date.now(),
2365
+ flow: root.flow,
1914
2366
  };
1915
2367
  },
1916
2368
  });
@@ -2166,7 +2618,7 @@ function createFlowsInvoke(state: ConsoleState) {
2166
2618
  in: InvokeIn,
2167
2619
  out: InvokeOut,
2168
2620
  errors: { AuthFailed, NotFound, InvokeDenied, ConfirmRequired },
2169
- do: (input: z.infer<typeof InvokeIn>, fx) => {
2621
+ do: async (input: z.infer<typeof InvokeIn>, fx) => {
2170
2622
  if (!fx.operator.id) return fail("AuthFailed", {});
2171
2623
  const manifest = state.manifest;
2172
2624
  const declared = manifest?.flows?.[input.flowId];
@@ -2174,19 +2626,18 @@ function createFlowsInvoke(state: ConsoleState) {
2174
2626
  return fail("NotFound", { flowId: input.flowId });
2175
2627
  }
2176
2628
 
2177
- const identity = state.identities.find((i) => i.id === input.asUserId);
2178
- if (!identity || identity.status !== "active") {
2179
- return fail("InvokeDenied", { reason: "identity not found or disabled" });
2629
+ const assumed = resolveInvokeAs(
2630
+ {
2631
+ ...(input.asUserId !== undefined ? { asUserId: input.asUserId } : {}),
2632
+ ...(input.asGate !== undefined ? { asGate: input.asGate } : {}),
2633
+ },
2634
+ state.identities,
2635
+ manifest ?? null,
2636
+ );
2637
+ if (!assumed.ok) {
2638
+ return fail("InvokeDenied", { reason: assumed.reason });
2180
2639
  }
2181
2640
 
2182
- // Operators hold no application scopes — `console:flows:invoke-as`
2183
- // (covered by session `console:*`) is the grant to assume a user principal.
2184
- const assumed = userPrincipal({
2185
- userId: identity.id,
2186
- scopes: identity.scopes,
2187
- verified: true,
2188
- });
2189
-
2190
2641
  const peakTier = peakTierOf(declared);
2191
2642
  if (peakTier === "external" && state.production) {
2192
2643
  if (input.confirmation !== "INVOKE" || (input.reason?.trim().length ?? 0) < 3) {
@@ -2197,23 +2648,71 @@ function createFlowsInvoke(state: ConsoleState) {
2197
2648
  }
2198
2649
  }
2199
2650
 
2651
+ const invoke = state.invokeUserFlow;
2652
+ if (!invoke) {
2653
+ return fail("InvokeDenied", { reason: "host invoke not configured" });
2654
+ }
2655
+
2200
2656
  const trigger = triggerKindOf(declared);
2201
- const response = stubResponse(declared, input.body);
2657
+ const host = await invoke({
2658
+ flowId: input.flowId,
2659
+ body: input.body,
2660
+ ...(input.pathParams !== undefined ? { pathParams: input.pathParams } : {}),
2661
+ principal: assumed.principal,
2662
+ operatorId: fx.operator.id,
2663
+ ...(assumed.bypassGates ? { bypassGates: true } : {}),
2664
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
2665
+ ...(input.revealPii === true ? { revealPii: true } : {}),
2666
+ });
2667
+
2668
+ const reveal = input.revealPii === true;
2669
+ const piiFields = piiFieldNamesFromManifest(manifest);
2670
+ if (reveal) {
2671
+ fx.log.info("console.flows.invoke.reveal", {
2672
+ operatorId: fx.operator.id,
2673
+ flowId: input.flowId,
2674
+ });
2675
+ }
2676
+ const response = reveal ? host.output : maskPiiValue(host.output, piiFields);
2677
+ const failure =
2678
+ host.failure === undefined
2679
+ ? undefined
2680
+ : {
2681
+ ...host.failure,
2682
+ ...(host.failure.data !== undefined
2683
+ ? {
2684
+ data: reveal ? host.failure.data : maskPiiValue(host.failure.data, piiFields),
2685
+ }
2686
+ : {}),
2687
+ };
2688
+
2202
2689
  fx.log.info("console.flows.invoke", {
2203
2690
  operatorId: fx.operator.id,
2204
2691
  flowId: input.flowId,
2205
- asUserId: assumed.userId,
2206
- scopes: [...assumed.scopes],
2692
+ asUserId: assumed.asUserId,
2693
+ asGate: assumed.asGate,
2694
+ scopes: [...assumed.principal.scopes],
2207
2695
  peakTier,
2208
2696
  reason: input.reason,
2697
+ status: host.status,
2698
+ failure: host.failure?.code,
2699
+ runId: host.runId,
2700
+ revealPii: reveal,
2209
2701
  });
2210
2702
 
2211
2703
  return {
2212
2704
  ok: true as const,
2213
2705
  flowId: input.flowId,
2214
- asUserId: input.asUserId,
2706
+ asUserId: assumed.asUserId,
2707
+ asGate: assumed.asGate,
2215
2708
  trigger,
2216
2709
  response,
2710
+ masked: !reveal,
2711
+ ...(host.status !== undefined ? { status: host.status } : {}),
2712
+ ...(failure !== undefined ? { failure } : {}),
2713
+ ...(host.runId !== undefined ? { runId: host.runId } : {}),
2714
+ ...(host.cache !== undefined ? { cache: host.cache } : {}),
2715
+ ...(host.durationMs !== undefined ? { durationMs: host.durationMs } : {}),
2217
2716
  peakTier,
2218
2717
  auditedAt: state.now(),
2219
2718
  };
@@ -2242,37 +2741,6 @@ function triggerKindOf(flow: ManifestFlow): "http" | "signal" | "clock" | "inter
2242
2741
  return "internal";
2243
2742
  }
2244
2743
 
2245
- /**
2246
- * Deterministic stub response for Console invoke — echoes the request under
2247
- * `echo` and fills required `out` string fields when declared.
2248
- *
2249
- * @param flow - Manifest flow
2250
- * @param body - Request body
2251
- */
2252
- function stubResponse(flow: ManifestFlow, body: unknown): unknown {
2253
- const out = flow.out;
2254
- if (out && typeof out === "object" && !Array.isArray(out)) {
2255
- const props = (out.properties ?? {}) as Record<string, unknown>;
2256
- const required = Array.isArray(out.required) ? (out.required as string[]) : Object.keys(props);
2257
- const result: Record<string, unknown> = { echo: body };
2258
- for (const key of required) {
2259
- if (key === "id") result.id = `inv_${hashShort(body)}`;
2260
- else if (!(key in result)) result[key] = null;
2261
- }
2262
- return result;
2263
- }
2264
- return { echo: body, ok: true };
2265
- }
2266
-
2267
- function hashShort(value: unknown): string {
2268
- const text = JSON.stringify(value) ?? "";
2269
- let h = 0;
2270
- for (let i = 0; i < text.length; i++) {
2271
- h = (h * 31 + text.charCodeAt(i)) >>> 0;
2272
- }
2273
- return h.toString(16).padStart(8, "0");
2274
- }
2275
-
2276
2744
  async function issueOperatorSession(
2277
2745
  state: ConsoleState,
2278
2746
  operatorId: string,
@@ -2347,6 +2815,14 @@ function createStoreQuery(state: ConsoleState) {
2347
2815
  if (!fx.operator.id) return fail("AuthFailed", {});
2348
2816
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
2349
2817
  if (tenantFail) return tenantFail;
2818
+ if (input.revealPii === true) {
2819
+ fx.log.info("console.store.query.reveal", {
2820
+ operatorId: fx.operator.id,
2821
+ ref: input.ref,
2822
+ child: input.child,
2823
+ tenant: input.tenant,
2824
+ });
2825
+ }
2350
2826
  return state.queryStore({
2351
2827
  ref: input.ref as ResourceRef,
2352
2828
  child: input.child,
@@ -2354,7 +2830,9 @@ function createStoreQuery(state: ConsoleState) {
2354
2830
  prefix: input.prefix,
2355
2831
  limit: input.limit,
2356
2832
  vector: input.vector,
2833
+ q: input.q,
2357
2834
  topK: input.topK,
2835
+ revealPii: input.revealPii === true,
2358
2836
  });
2359
2837
  },
2360
2838
  });
@@ -2396,6 +2874,42 @@ function createStoreReveal(state: ConsoleState) {
2396
2874
  });
2397
2875
  }
2398
2876
 
2877
+ function createStoreObject(state: ConsoleState) {
2878
+ return flow("console.store.object", {
2879
+ plane: "operator",
2880
+ in: StoreFileGetIn,
2881
+ out: StoreFileGetOut,
2882
+ errors: { AuthFailed, TenantRequired, StoreNotFound },
2883
+ do: async (input: z.infer<typeof StoreFileGetIn>, fx) => {
2884
+ if (!fx.operator.id) return fail("AuthFailed", {});
2885
+ const tenantFail = requireTenantIfDeclared(state, input.tenant);
2886
+ if (tenantFail) return tenantFail;
2887
+ try {
2888
+ const result = await state.getStoreFile({
2889
+ ref: input.ref as ResourceRef,
2890
+ key: input.key,
2891
+ tenant: input.tenant,
2892
+ });
2893
+ fx.log.info("console.store.object", {
2894
+ operatorId: fx.operator.id,
2895
+ ref: input.ref,
2896
+ key: input.key,
2897
+ sizeBytes: result.sizeBytes,
2898
+ tenant: input.tenant,
2899
+ });
2900
+ return result;
2901
+ } catch (err) {
2902
+ if (err instanceof StoreFileNotFoundError) {
2903
+ return fail("StoreNotFound", { ref: `${input.ref}:${input.key}` });
2904
+ }
2905
+ return fail("StoreNotFound", {
2906
+ ref: `${input.ref}: ${err instanceof Error ? err.message : String(err)}`,
2907
+ });
2908
+ }
2909
+ },
2910
+ });
2911
+ }
2912
+
2399
2913
  function createStoreEdit(state: ConsoleState) {
2400
2914
  return flow("console.store.edit", {
2401
2915
  plane: "operator",
@@ -2552,14 +3066,36 @@ function createStoreSql(state: ConsoleState) {
2552
3066
  const tenantFail = requireTenantIfDeclared(state, input.tenant);
2553
3067
  if (tenantFail) return tenantFail;
2554
3068
  try {
3069
+ if (input.revealPii === true) {
3070
+ fx.log.info("console.store.sql.reveal", {
3071
+ operatorId: fx.operator.id,
3072
+ ref: input.ref,
3073
+ tenant: input.tenant,
3074
+ });
3075
+ }
3076
+ if (input.asGate !== undefined && !isKnownConsoleSqlGate(state.manifest, input.asGate)) {
3077
+ return fail("StoreNotFound", { ref: `unknown gate: ${input.asGate}` });
3078
+ }
3079
+ if (input.asGate !== undefined) {
3080
+ fx.log.info("console.store.sql.asGate", {
3081
+ operatorId: fx.operator.id,
3082
+ ref: input.ref,
3083
+ gate: input.asGate,
3084
+ tenant: input.tenant,
3085
+ });
3086
+ }
2555
3087
  const result = await state.runStoreSql(input.ref as ResourceRef, input.sql, {
2556
3088
  allowWrite: input.allowWrite === true,
3089
+ revealPii: input.revealPii === true,
2557
3090
  tenant: input.tenant,
3091
+ ...(input.asGate !== undefined ? { asGate: input.asGate } : {}),
2558
3092
  });
2559
3093
  fx.log.info("console.store.sql", {
2560
3094
  operatorId: fx.operator.id,
2561
3095
  ref: input.ref,
2562
3096
  allowWrite: input.allowWrite === true,
3097
+ revealPii: input.revealPii === true,
3098
+ asGate: input.asGate ?? null,
2563
3099
  rowCount: result.rows.length,
2564
3100
  });
2565
3101
  return result;
@@ -2572,6 +3108,177 @@ function createStoreSql(state: ConsoleState) {
2572
3108
  });
2573
3109
  }
2574
3110
 
3111
+ function failStoreSqlStats(err: unknown) {
3112
+ if (err instanceof StoreSqlStatsError) {
3113
+ if (err.code === PG_STAT_STATEMENTS_NOT_PRELOADED) {
3114
+ return fail("PgStatStatementsNotPreloaded", { reason: err.message });
3115
+ }
3116
+ if (err.code === PG_STAT_STATEMENTS_NOT_CREATED) {
3117
+ return fail("PgStatStatementsNotCreated", { reason: err.message });
3118
+ }
3119
+ return fail("PgStatStatementsUnsupported", { reason: err.message });
3120
+ }
3121
+ return fail("PgStatStatementsUnsupported", {
3122
+ reason: err instanceof Error ? err.message : String(err),
3123
+ });
3124
+ }
3125
+
3126
+ function createStoreSqlStats(state: ConsoleState) {
3127
+ return flow("console.store.sql.stats", {
3128
+ plane: "operator",
3129
+ in: StoreSqlStatsIn,
3130
+ out: StoreSqlStatsOut,
3131
+ errors: {
3132
+ AuthFailed,
3133
+ TenantRequired,
3134
+ StoreNotFound,
3135
+ PgStatStatementsNotPreloaded,
3136
+ PgStatStatementsUnsupported,
3137
+ PgStatStatementsNotCreated,
3138
+ },
3139
+ do: async (input: z.infer<typeof StoreSqlStatsIn>, fx) => {
3140
+ if (!fx.operator.id) return fail("AuthFailed", {});
3141
+ const tenantFail = requireTenantIfDeclared(state, input.tenant);
3142
+ if (tenantFail) return tenantFail;
3143
+ try {
3144
+ const result = await state.queryStoreSqlStats(input.ref as ResourceRef);
3145
+ fx.log.info("console.store.sql.stats", {
3146
+ operatorId: fx.operator.id,
3147
+ ref: input.ref,
3148
+ rowCount: result.rowCount,
3149
+ });
3150
+ return result;
3151
+ } catch (err) {
3152
+ return failStoreSqlStats(err);
3153
+ }
3154
+ },
3155
+ });
3156
+ }
3157
+
3158
+ function createStoreSqlLocks(state: ConsoleState) {
3159
+ return flow("console.store.sql.locks", {
3160
+ plane: "operator",
3161
+ in: StoreSqlLocksIn,
3162
+ out: StoreSqlLocksOut,
3163
+ errors: {
3164
+ AuthFailed,
3165
+ TenantRequired,
3166
+ StoreNotFound,
3167
+ PgStatStatementsNotPreloaded,
3168
+ PgStatStatementsUnsupported,
3169
+ PgStatStatementsNotCreated,
3170
+ },
3171
+ do: async (input: z.infer<typeof StoreSqlLocksIn>, fx) => {
3172
+ if (!fx.operator.id) return fail("AuthFailed", {});
3173
+ const tenantFail = requireTenantIfDeclared(state, input.tenant);
3174
+ if (tenantFail) return tenantFail;
3175
+ if (input.revealPii === true) {
3176
+ fx.log.info("console.store.sql.stats.reveal", {
3177
+ operatorId: fx.operator.id,
3178
+ ref: input.ref,
3179
+ tenant: input.tenant,
3180
+ });
3181
+ }
3182
+ try {
3183
+ const result = await state.queryStoreSqlLocks(input.ref as ResourceRef, {
3184
+ revealPii: input.revealPii === true,
3185
+ });
3186
+ fx.log.info("console.store.sql.locks", {
3187
+ operatorId: fx.operator.id,
3188
+ ref: input.ref,
3189
+ revealPii: input.revealPii === true,
3190
+ rowCount: result.rows.length,
3191
+ });
3192
+ return result;
3193
+ } catch (err) {
3194
+ return failStoreSqlStats(err);
3195
+ }
3196
+ },
3197
+ });
3198
+ }
3199
+
3200
+ function createStoreSqlAdvise(state: ConsoleState) {
3201
+ return flow("console.store.sql.advise", {
3202
+ plane: "operator",
3203
+ in: StoreSqlAdviseIn,
3204
+ out: StoreSqlAdviseOut,
3205
+ errors: {
3206
+ AuthFailed,
3207
+ TenantRequired,
3208
+ StoreNotFound,
3209
+ PgStatStatementsNotPreloaded,
3210
+ PgStatStatementsUnsupported,
3211
+ PgStatStatementsNotCreated,
3212
+ },
3213
+ do: async (input: z.infer<typeof StoreSqlAdviseIn>, fx) => {
3214
+ if (!fx.operator.id) return fail("AuthFailed", {});
3215
+ const tenantFail = requireTenantIfDeclared(state, input.tenant);
3216
+ if (tenantFail) return tenantFail;
3217
+ try {
3218
+ const result = await state.adviseStoreSqlIndex(input.ref as ResourceRef, input.query);
3219
+ fx.log.info("console.store.sql.advise", {
3220
+ operatorId: fx.operator.id,
3221
+ ref: input.ref,
3222
+ suggestionCount: result.indexStatements.length,
3223
+ });
3224
+ return result;
3225
+ } catch (err) {
3226
+ return failStoreSqlStats(err);
3227
+ }
3228
+ },
3229
+ });
3230
+ }
3231
+
3232
+ function failStoreKvStats(err: unknown) {
3233
+ if (err instanceof StoreKvStatsError) {
3234
+ return fail("KvStatsUnsupported", { reason: err.message });
3235
+ }
3236
+ return fail("KvStatsUnsupported", {
3237
+ reason: err instanceof Error ? err.message : String(err),
3238
+ });
3239
+ }
3240
+
3241
+ function createStoreKvStats(state: ConsoleState) {
3242
+ return flow("console.store.kv.stats", {
3243
+ plane: "operator",
3244
+ in: StoreKvStatsIn,
3245
+ out: StoreKvStatsOut,
3246
+ errors: {
3247
+ AuthFailed,
3248
+ TenantRequired,
3249
+ StoreNotFound,
3250
+ KvStatsUnsupported,
3251
+ },
3252
+ do: async (input: z.infer<typeof StoreKvStatsIn>, fx) => {
3253
+ if (!fx.operator.id) return fail("AuthFailed", {});
3254
+ const tenantFail = requireTenantIfDeclared(state, input.tenant);
3255
+ if (tenantFail) return tenantFail;
3256
+ if (input.revealPii === true) {
3257
+ fx.log.info("console.store.kv.stats.reveal", {
3258
+ operatorId: fx.operator.id,
3259
+ ref: input.ref,
3260
+ tenant: input.tenant,
3261
+ });
3262
+ }
3263
+ try {
3264
+ const result = await state.queryStoreKvStats(input.ref as ResourceRef, {
3265
+ revealPii: input.revealPii === true,
3266
+ });
3267
+ fx.log.info("console.store.kv.stats", {
3268
+ operatorId: fx.operator.id,
3269
+ ref: input.ref,
3270
+ revealPii: input.revealPii === true,
3271
+ engine: result.engine,
3272
+ slowlogCount: result.slowlog.length,
3273
+ });
3274
+ return result;
3275
+ } catch (err) {
3276
+ return failStoreKvStats(err);
3277
+ }
3278
+ },
3279
+ });
3280
+ }
3281
+
2575
3282
  function createStorePreview(state: ConsoleState) {
2576
3283
  return flow("console.store.preview", {
2577
3284
  plane: "operator",
@@ -2634,25 +3341,56 @@ function createVaultList(state: ConsoleState) {
2634
3341
  });
2635
3342
  }
2636
3343
 
3344
+ function createVaultCreate(state: ConsoleState) {
3345
+ return flow("console.vault.create", {
3346
+ plane: "operator",
3347
+ in: VaultCreateIn,
3348
+ out: VaultWriteOut,
3349
+ errors: { AuthFailed, VaultExists, VaultNotFound },
3350
+ do: async (input: z.infer<typeof VaultCreateIn>, fx) => {
3351
+ if (!fx.operator.id) return fail("AuthFailed", {});
3352
+ try {
3353
+ const result = await state.createVault({
3354
+ name: input.name,
3355
+ value: input.value,
3356
+ kind: input.kind,
3357
+ ...(input.description !== undefined ? { description: input.description } : {}),
3358
+ ...(input.rotate !== undefined ? { rotate: input.rotate } : {}),
3359
+ });
3360
+ fx.log.info("console.vault.create", {
3361
+ operatorId: fx.operator.id,
3362
+ name: result.name,
3363
+ kind: input.kind,
3364
+ fingerprint: result.fingerprint,
3365
+ });
3366
+ return {
3367
+ ok: true as const,
3368
+ name: result.name,
3369
+ fingerprint: result.fingerprint,
3370
+ at: state.now(),
3371
+ };
3372
+ } catch (err) {
3373
+ const message = err instanceof Error ? err.message : String(err);
3374
+ if (message.includes("already declared")) {
3375
+ return fail("VaultExists", { name: input.name });
3376
+ }
3377
+ return fail("VaultNotFound", { name: `${input.name}: ${message}` });
3378
+ }
3379
+ },
3380
+ });
3381
+ }
3382
+
2637
3383
  function createVaultSet(state: ConsoleState) {
2638
3384
  return flow("console.vault.set", {
2639
3385
  plane: "operator",
2640
3386
  in: VaultWriteIn,
2641
3387
  out: VaultWriteOut,
2642
- errors: { AuthFailed, VaultNotFound, ConfirmRequired },
3388
+ errors: { AuthFailed, VaultNotFound },
2643
3389
  do: async (input: z.infer<typeof VaultWriteIn>, fx) => {
2644
3390
  if (!fx.operator.id) return fail("AuthFailed", {});
2645
3391
  if (!(await vaultNameKnown(state, input.name))) {
2646
3392
  return fail("VaultNotFound", { name: input.name });
2647
3393
  }
2648
- if (state.production) {
2649
- if (input.confirmation !== "SET" || !input.reason || input.reason.length < 3) {
2650
- return fail("ConfirmRequired", {
2651
- phrase: "SET" as const,
2652
- reason: "Type SET and provide a reason to write a secret in production",
2653
- });
2654
- }
2655
- }
2656
3394
  try {
2657
3395
  const result = await state.setVault({
2658
3396
  name: input.name,
@@ -2673,7 +3411,8 @@ function createVaultSet(state: ConsoleState) {
2673
3411
  };
2674
3412
  } catch (err) {
2675
3413
  return fail("VaultNotFound", {
2676
- name: `${input.name}: ${err instanceof Error ? err.message : String(err)}`,
3414
+ name: input.name,
3415
+ reason: err instanceof Error ? err.message : String(err),
2677
3416
  });
2678
3417
  }
2679
3418
  },
@@ -2685,20 +3424,12 @@ function createVaultRotate(state: ConsoleState) {
2685
3424
  plane: "operator",
2686
3425
  in: VaultWriteIn,
2687
3426
  out: VaultWriteOut,
2688
- errors: { AuthFailed, VaultNotFound, ConfirmRequired },
3427
+ errors: { AuthFailed, VaultNotFound },
2689
3428
  do: async (input: z.infer<typeof VaultWriteIn>, fx) => {
2690
3429
  if (!fx.operator.id) return fail("AuthFailed", {});
2691
3430
  if (!(await vaultNameKnown(state, input.name))) {
2692
3431
  return fail("VaultNotFound", { name: input.name });
2693
3432
  }
2694
- // Rotate always requires typed confirm (console §6 · §9.8).
2695
- if (input.confirmation !== "ROTATE" || !input.reason || input.reason.length < 3) {
2696
- return fail("ConfirmRequired", {
2697
- phrase: "ROTATE" as const,
2698
- reason:
2699
- "Type ROTATE and provide a reason — in-flight durable runs may wake holding the new key",
2700
- });
2701
- }
2702
3433
  try {
2703
3434
  const result = await state.rotateVault({
2704
3435
  name: input.name,
@@ -2718,7 +3449,8 @@ function createVaultRotate(state: ConsoleState) {
2718
3449
  };
2719
3450
  } catch (err) {
2720
3451
  return fail("VaultNotFound", {
2721
- name: `${input.name}: ${err instanceof Error ? err.message : String(err)}`,
3452
+ name: input.name,
3453
+ reason: err instanceof Error ? err.message : String(err),
2722
3454
  });
2723
3455
  }
2724
3456
  },
@@ -2731,10 +3463,83 @@ function createVaultRotate(state: ConsoleState) {
2731
3463
  * @param state - Console state
2732
3464
  * @param name - Contract name
2733
3465
  */
3466
+ function createVaultRotateMaster(state: ConsoleState) {
3467
+ return flow("console.vault.rotateMaster", {
3468
+ plane: "operator",
3469
+ in: VaultRotateMasterIn,
3470
+ out: VaultRotateMasterOut,
3471
+ errors: { AuthFailed, ConfirmRequired, VaultSealed, VaultRotateBusy, VaultUnsupported },
3472
+ do: async (input: z.infer<typeof VaultRotateMasterIn>, fx) => {
3473
+ if (!fx.operator.id) return fail("AuthFailed", {});
3474
+ if (input.confirmation !== "ROTATE_MASTER" || !input.reason || input.reason.length < 3) {
3475
+ return fail("ConfirmRequired", {
3476
+ phrase: "ROTATE_MASTER" as const,
3477
+ reason:
3478
+ "Type ROTATE_MASTER and provide a reason — both master keys stay live until remaining is 0",
3479
+ });
3480
+ }
3481
+ try {
3482
+ const result = await state.rotateMaster();
3483
+ fx.log.info("console.vault.rotateMaster", {
3484
+ operatorId: fx.operator.id,
3485
+ kekVersion: result.kekVersion,
3486
+ remaining: result.remaining,
3487
+ reason: input.reason,
3488
+ });
3489
+ return {
3490
+ ok: true as const,
3491
+ kekVersion: result.kekVersion,
3492
+ remaining: result.remaining,
3493
+ masterKey: result.masterKey,
3494
+ at: state.now(),
3495
+ };
3496
+ } catch (err) {
3497
+ return mapVaultOperatorError(err);
3498
+ }
3499
+ },
3500
+ });
3501
+ }
3502
+
3503
+ function createVaultAuditVerify(state: ConsoleState) {
3504
+ return flow("console.vault.auditVerify", {
3505
+ plane: "operator",
3506
+ out: VaultAuditVerifyOut,
3507
+ errors: { AuthFailed, VaultUnsupported },
3508
+ do: async (_input, fx) => {
3509
+ if (!fx.operator.id) return fail("AuthFailed", {});
3510
+ try {
3511
+ const result = await state.verifyVaultAudit();
3512
+ fx.log.info("console.vault.audit.verify", {
3513
+ operatorId: fx.operator.id,
3514
+ ok: result.ok,
3515
+ brokenAt: result.brokenAt,
3516
+ });
3517
+ return result;
3518
+ } catch (err) {
3519
+ return mapVaultOperatorError(err);
3520
+ }
3521
+ },
3522
+ });
3523
+ }
3524
+
3525
+ /**
3526
+ * Map Console vault errors onto typed flow failures.
3527
+ *
3528
+ * @param err - Caught error
3529
+ */
3530
+ function mapVaultOperatorError(err: unknown) {
3531
+ const code =
3532
+ err && typeof err === "object" && "code" in err ? (err as { code: string }).code : undefined;
3533
+ const reason = err instanceof Error ? err.message : String(err);
3534
+ if (code === "VaultSealed") return fail("VaultSealed", { reason });
3535
+ if (code === "VaultRotateBusy") return fail("VaultRotateBusy", { reason });
3536
+ if (code === "VaultUnsupported") return fail("VaultUnsupported", { reason });
3537
+ return fail("VaultUnsupported", { reason });
3538
+ }
3539
+
2734
3540
  async function vaultNameKnown(state: ConsoleState, name: string): Promise<boolean> {
2735
3541
  if (state.manifest?.vault?.[name]) return true;
2736
3542
  if (state.vaultRuntime?.contracts.has(name)) return true;
2737
- if (state.vaultRuntime?.names().includes(name)) return true;
2738
3543
  const listed = await state.listVault();
2739
3544
  return listed.secrets.some((s) => s.name === name);
2740
3545
  }
@@ -3159,6 +3964,18 @@ function createClockList(state: ConsoleState) {
3159
3964
  });
3160
3965
  }
3161
3966
 
3967
+ function createInstancesList(state: ConsoleState) {
3968
+ return flow("console.instances.list", {
3969
+ plane: "operator",
3970
+ out: InstancesListOut,
3971
+ errors: { AuthFailed },
3972
+ do: async (_input, fx) => {
3973
+ if (!fx.operator.id) return fail("AuthFailed", {});
3974
+ return state.listInstances();
3975
+ },
3976
+ });
3977
+ }
3978
+
3162
3979
  function createClockRunNow(state: ConsoleState) {
3163
3980
  return flow("console.clock.runNow", {
3164
3981
  plane: "operator",