okengine 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/AGENTS.md +91 -0
  2. package/README.md +327 -0
  3. package/docs/spec/complete-example.md +1188 -0
  4. package/docs/spec/console.md +739 -0
  5. package/docs/spec/four-applications.md +1188 -0
  6. package/docs/spec/unified-theory.md +489 -0
  7. package/package.json +152 -0
  8. package/spec/manifest.v1.schema.json +624 -0
  9. package/src/auth/api-keys.ts +168 -0
  10. package/src/auth/attenuation.ts +116 -0
  11. package/src/auth/auth.test.ts +273 -0
  12. package/src/auth/cross-plane.ts +98 -0
  13. package/src/auth/index.ts +112 -0
  14. package/src/auth/invites.ts +66 -0
  15. package/src/auth/invoke-as.ts +49 -0
  16. package/src/auth/operator.ts +178 -0
  17. package/src/auth/planes.ts +102 -0
  18. package/src/auth/plugin.ts +44 -0
  19. package/src/auth/roles.ts +84 -0
  20. package/src/auth/sessions.ts +418 -0
  21. package/src/auth/tables.ts +131 -0
  22. package/src/cli/args.ts +50 -0
  23. package/src/cli/branch.ts +75 -0
  24. package/src/cli/build.ts +86 -0
  25. package/src/cli/client-add.test.ts +140 -0
  26. package/src/cli/client-add.ts +164 -0
  27. package/src/cli/completion.test.ts +58 -0
  28. package/src/cli/completion.ts +296 -0
  29. package/src/cli/dev-app-runner.ts +77 -0
  30. package/src/cli/dev.test.ts +435 -0
  31. package/src/cli/dev.ts +594 -0
  32. package/src/cli/doc-drift.test.ts +146 -0
  33. package/src/cli/doc-drift.ts +397 -0
  34. package/src/cli/docker-cli.test.ts +221 -0
  35. package/src/cli/docker.ts +127 -0
  36. package/src/cli/doctor-diff-examples.ts +92 -0
  37. package/src/cli/doctor-diff.test.ts +91 -0
  38. package/src/cli/doctor-diff.ts +274 -0
  39. package/src/cli/doctor-pii.test.ts +98 -0
  40. package/src/cli/doctor-pii.ts +151 -0
  41. package/src/cli/doctor.test.ts +150 -0
  42. package/src/cli/doctor.ts +223 -0
  43. package/src/cli/eval.ts +122 -0
  44. package/src/cli/exit.ts +19 -0
  45. package/src/cli/gates-list.test.ts +47 -0
  46. package/src/cli/gates-list.ts +84 -0
  47. package/src/cli/images.ts +277 -0
  48. package/src/cli/index.ts +99 -0
  49. package/src/cli/json-out.test.ts +129 -0
  50. package/src/cli/load-config.ts +71 -0
  51. package/src/cli/mcp-from-console.ts +50 -0
  52. package/src/cli/privacy-erase.ts +73 -0
  53. package/src/cli/registry.ts +455 -0
  54. package/src/cli/safe-defaults.test.ts +92 -0
  55. package/src/cli/schema.ts +196 -0
  56. package/src/cli/stack.ts +82 -0
  57. package/src/cli/start.ts +106 -0
  58. package/src/cli/upgrade.ts +105 -0
  59. package/src/cli/vault-cmd.ts +140 -0
  60. package/src/client/budget-entry.ts +34 -0
  61. package/src/client/budget.test.ts +17 -0
  62. package/src/client/create.test.ts +159 -0
  63. package/src/client/create.ts +152 -0
  64. package/src/client/errors.ts +60 -0
  65. package/src/client/index.ts +35 -0
  66. package/src/client/notes-contract.test.ts +289 -0
  67. package/src/client/transport.test.ts +123 -0
  68. package/src/client/transport.ts +254 -0
  69. package/src/client/types.ts +282 -0
  70. package/src/compiler/aot.test.ts +248 -0
  71. package/src/compiler/aot.ts +182 -0
  72. package/src/compiler/differential.test.ts +241 -0
  73. package/src/compiler/dynamic.ts +54 -0
  74. package/src/compiler/effects-infer.ts +541 -0
  75. package/src/compiler/emit.ts +40 -0
  76. package/src/compiler/extract.test.ts +177 -0
  77. package/src/compiler/extract.ts +1368 -0
  78. package/src/compiler/fixtures/raw/raw-unannotated.ts +28 -0
  79. package/src/compiler/fixtures/skyport/oke.config.ts +24 -0
  80. package/src/compiler/fixtures/skyport/src/ai.ts +15 -0
  81. package/src/compiler/fixtures/skyport/src/app.ts +10 -0
  82. package/src/compiler/fixtures/skyport/src/channels.ts +6 -0
  83. package/src/compiler/fixtures/skyport/src/core.ts +3 -0
  84. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +57 -0
  85. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +11 -0
  86. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +14 -0
  87. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +20 -0
  88. package/src/compiler/fixtures/skyport/src/gates.ts +14 -0
  89. package/src/compiler/fixtures/skyport/src/journeys.ts +9 -0
  90. package/src/compiler/fixtures/skyport/src/schema.ts +3 -0
  91. package/src/compiler/fixtures/skyport/src/vault.ts +6 -0
  92. package/src/compiler/fixtures/skyport.expected.json +241 -0
  93. package/src/compiler/fixtures/triggers/five-triggers.ts +69 -0
  94. package/src/compiler/http-parse.ts +214 -0
  95. package/src/compiler/index.ts +67 -0
  96. package/src/compiler/response.ts +89 -0
  97. package/src/compiler/sucrose.ts +238 -0
  98. package/src/config/index.ts +167 -0
  99. package/src/console/budget.test.ts +73 -0
  100. package/src/console/index.ts +30 -0
  101. package/src/console/server/access.test.ts +370 -0
  102. package/src/console/server/access.ts +777 -0
  103. package/src/console/server/ai.test.ts +172 -0
  104. package/src/console/server/ai.ts +632 -0
  105. package/src/console/server/app.ts +294 -0
  106. package/src/console/server/auth-rate.test.ts +81 -0
  107. package/src/console/server/auth-rate.ts +72 -0
  108. package/src/console/server/bind.ts +25 -0
  109. package/src/console/server/channels.test.ts +179 -0
  110. package/src/console/server/channels.ts +469 -0
  111. package/src/console/server/claim.test.ts +66 -0
  112. package/src/console/server/claim.ts +134 -0
  113. package/src/console/server/clock.test.ts +239 -0
  114. package/src/console/server/clock.ts +390 -0
  115. package/src/console/server/console.test.ts +338 -0
  116. package/src/console/server/diff.test.ts +299 -0
  117. package/src/console/server/diff.ts +352 -0
  118. package/src/console/server/dry-run.audit.test.ts +118 -0
  119. package/src/console/server/flows-invoke.test.ts +148 -0
  120. package/src/console/server/flows.ts +3633 -0
  121. package/src/console/server/gates.test.ts +360 -0
  122. package/src/console/server/gates.ts +869 -0
  123. package/src/console/server/index.ts +141 -0
  124. package/src/console/server/live.test.ts +30 -0
  125. package/src/console/server/live.ts +109 -0
  126. package/src/console/server/plugin.ts +50 -0
  127. package/src/console/server/plugins.test.ts +131 -0
  128. package/src/console/server/plugins.ts +429 -0
  129. package/src/console/server/runs-pii.ts +98 -0
  130. package/src/console/server/security-headers.ts +97 -0
  131. package/src/console/server/security.gate.test.ts +286 -0
  132. package/src/console/server/serve.ts +319 -0
  133. package/src/console/server/signals.test.ts +88 -0
  134. package/src/console/server/signals.ts +282 -0
  135. package/src/console/server/state.ts +982 -0
  136. package/src/console/server/store.test.ts +233 -0
  137. package/src/console/server/store.ts +861 -0
  138. package/src/console/server/structural.ts +95 -0
  139. package/src/console/server/vault.test.ts +251 -0
  140. package/src/console/server/vault.ts +430 -0
  141. package/src/console/ui/access/AccessA11yView.tsx +237 -0
  142. package/src/console/ui/access/a11y.test.tsx +122 -0
  143. package/src/console/ui/access/acknowledgement.test.ts +13 -0
  144. package/src/console/ui/access/acknowledgement.ts +35 -0
  145. package/src/console/ui/access/blast-radius.test.ts +26 -0
  146. package/src/console/ui/access/blast-radius.ts +40 -0
  147. package/src/console/ui/access/confirmation.test.ts +38 -0
  148. package/src/console/ui/access/confirmation.ts +36 -0
  149. package/src/console/ui/access/fixture.ts +203 -0
  150. package/src/console/ui/access/grantable.test.ts +17 -0
  151. package/src/console/ui/access/grantable.ts +36 -0
  152. package/src/console/ui/access/hygiene.test.ts +12 -0
  153. package/src/console/ui/access/hygiene.ts +39 -0
  154. package/src/console/ui/access/index.ts +54 -0
  155. package/src/console/ui/access/provenance.test.ts +12 -0
  156. package/src/console/ui/access/provenance.ts +29 -0
  157. package/src/console/ui/access/search.test.ts +17 -0
  158. package/src/console/ui/access/search.ts +72 -0
  159. package/src/console/ui/access/types.ts +111 -0
  160. package/src/console/ui/ai/AiA11yView.tsx +265 -0
  161. package/src/console/ui/ai/a11y.test.tsx +99 -0
  162. package/src/console/ui/ai/findings.ts +41 -0
  163. package/src/console/ui/ai/fixture.ts +182 -0
  164. package/src/console/ui/ai/format.ts +90 -0
  165. package/src/console/ui/ai/group.test.ts +37 -0
  166. package/src/console/ui/ai/group.ts +88 -0
  167. package/src/console/ui/ai/index.ts +66 -0
  168. package/src/console/ui/ai/promotion.test.ts +77 -0
  169. package/src/console/ui/ai/promotion.ts +150 -0
  170. package/src/console/ui/ai/search.test.ts +40 -0
  171. package/src/console/ui/ai/search.ts +89 -0
  172. package/src/console/ui/ai/types.ts +139 -0
  173. package/src/console/ui/architecture/ArchitectureA11yView.tsx +163 -0
  174. package/src/console/ui/architecture/a11y.test.tsx +97 -0
  175. package/src/console/ui/architecture/boundary.ts +42 -0
  176. package/src/console/ui/architecture/declared.ts +165 -0
  177. package/src/console/ui/architecture/fixture.ts +74 -0
  178. package/src/console/ui/architecture/index.ts +84 -0
  179. package/src/console/ui/architecture/layers.ts +64 -0
  180. package/src/console/ui/architecture/layout.ts +68 -0
  181. package/src/console/ui/architecture/pathologies.ts +260 -0
  182. package/src/console/ui/architecture/search.ts +145 -0
  183. package/src/console/ui/architecture/traffic.ts +102 -0
  184. package/src/console/ui/architecture/types.ts +144 -0
  185. package/src/console/ui/architecture/view.test.ts +165 -0
  186. package/src/console/ui/architecture/view.ts +516 -0
  187. package/src/console/ui/channels/ChannelsA11yView.tsx +180 -0
  188. package/src/console/ui/channels/a11y.test.tsx +96 -0
  189. package/src/console/ui/channels/confirmation.test.ts +37 -0
  190. package/src/console/ui/channels/confirmation.ts +27 -0
  191. package/src/console/ui/channels/fallback.test.ts +15 -0
  192. package/src/console/ui/channels/fallback.ts +20 -0
  193. package/src/console/ui/channels/findings.ts +38 -0
  194. package/src/console/ui/channels/fixture.ts +134 -0
  195. package/src/console/ui/channels/group.ts +25 -0
  196. package/src/console/ui/channels/index.ts +57 -0
  197. package/src/console/ui/channels/locale.test.ts +17 -0
  198. package/src/console/ui/channels/locale.ts +31 -0
  199. package/src/console/ui/channels/mask.test.ts +14 -0
  200. package/src/console/ui/channels/mask.ts +12 -0
  201. package/src/console/ui/channels/search.ts +58 -0
  202. package/src/console/ui/channels/taxonomy.test.ts +17 -0
  203. package/src/console/ui/channels/taxonomy.ts +49 -0
  204. package/src/console/ui/channels/types.ts +117 -0
  205. package/src/console/ui/clock/ClockA11yView.tsx +182 -0
  206. package/src/console/ui/clock/a11y.test.tsx +99 -0
  207. package/src/console/ui/clock/confirmation.test.ts +32 -0
  208. package/src/console/ui/clock/confirmation.ts +34 -0
  209. package/src/console/ui/clock/findings.ts +40 -0
  210. package/src/console/ui/clock/fixture.ts +111 -0
  211. package/src/console/ui/clock/health.test.ts +25 -0
  212. package/src/console/ui/clock/health.ts +61 -0
  213. package/src/console/ui/clock/index.ts +49 -0
  214. package/src/console/ui/clock/search.test.ts +39 -0
  215. package/src/console/ui/clock/search.ts +76 -0
  216. package/src/console/ui/clock/timeline.test.ts +44 -0
  217. package/src/console/ui/clock/timeline.ts +41 -0
  218. package/src/console/ui/clock/types.ts +78 -0
  219. package/src/console/ui/clock/waiting-on.test.ts +34 -0
  220. package/src/console/ui/clock/waiting-on.ts +83 -0
  221. package/src/console/ui/confirmation.unify.test.ts +92 -0
  222. package/src/console/ui/diff/DiffA11yView.tsx +85 -0
  223. package/src/console/ui/diff/a11y.test.tsx +99 -0
  224. package/src/console/ui/diff/fixture.ts +85 -0
  225. package/src/console/ui/diff/group.test.ts +58 -0
  226. package/src/console/ui/diff/group.ts +97 -0
  227. package/src/console/ui/diff/index.ts +38 -0
  228. package/src/console/ui/diff/search.test.ts +32 -0
  229. package/src/console/ui/diff/search.ts +75 -0
  230. package/src/console/ui/diff/summary.ts +74 -0
  231. package/src/console/ui/diff/types.ts +48 -0
  232. package/src/console/ui/dist/assets/index-B71Yl_SS.js +10 -0
  233. package/src/console/ui/dist/assets/panel-access-Dd37LU2c.js +64 -0
  234. package/src/console/ui/dist/assets/panel-ai-CC7LR6-J.js +1 -0
  235. package/src/console/ui/dist/assets/panel-architecture-B5b3iKCz.js +1 -0
  236. package/src/console/ui/dist/assets/panel-channels-CeNjTKXp.js +1 -0
  237. package/src/console/ui/dist/assets/panel-clock-DgFTLoHV.js +1 -0
  238. package/src/console/ui/dist/assets/panel-diff-DxehccqB.js +1 -0
  239. package/src/console/ui/dist/assets/panel-flows-BtrVn-Eg.js +45 -0
  240. package/src/console/ui/dist/assets/panel-gates-Z9MKRGdH.js +1 -0
  241. package/src/console/ui/dist/assets/panel-overview-Bd48d9km.js +1 -0
  242. package/src/console/ui/dist/assets/panel-plugins-DWd0TowH.js +1 -0
  243. package/src/console/ui/dist/assets/panel-runs-BwsWqKeB.js +1 -0
  244. package/src/console/ui/dist/assets/panel-signals-9najbZY2.js +1 -0
  245. package/src/console/ui/dist/assets/panel-store-OHkP2pDp.js +1 -0
  246. package/src/console/ui/dist/assets/panel-traces-tn2JoY8U.js +1 -0
  247. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +1 -0
  248. package/src/console/ui/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
  249. package/src/console/ui/dist/assets/style-Cnl7WLya.css +3 -0
  250. package/src/console/ui/dist/index.html +14 -0
  251. package/src/console/ui/flows/FlowsA11yView.tsx +155 -0
  252. package/src/console/ui/flows/a11y.test.tsx +105 -0
  253. package/src/console/ui/flows/buffer.test.ts +91 -0
  254. package/src/console/ui/flows/buffer.ts +118 -0
  255. package/src/console/ui/flows/confirmation.ts +131 -0
  256. package/src/console/ui/flows/contract.test.ts +89 -0
  257. package/src/console/ui/flows/contract.ts +353 -0
  258. package/src/console/ui/flows/fixture.ts +81 -0
  259. package/src/console/ui/flows/graph.test.ts +101 -0
  260. package/src/console/ui/flows/graph.ts +549 -0
  261. package/src/console/ui/flows/index.ts +87 -0
  262. package/src/console/ui/flows/save-as-test.test.ts +47 -0
  263. package/src/console/ui/flows/save-as-test.ts +99 -0
  264. package/src/console/ui/flows/search.ts +255 -0
  265. package/src/console/ui/flows/tiers.ts +140 -0
  266. package/src/console/ui/gates/GatesA11yView.tsx +192 -0
  267. package/src/console/ui/gates/a11y.test.tsx +116 -0
  268. package/src/console/ui/gates/audit.test.ts +40 -0
  269. package/src/console/ui/gates/audit.ts +63 -0
  270. package/src/console/ui/gates/denial.test.ts +36 -0
  271. package/src/console/ui/gates/denial.ts +51 -0
  272. package/src/console/ui/gates/findings.ts +19 -0
  273. package/src/console/ui/gates/fixture.ts +189 -0
  274. package/src/console/ui/gates/group.test.ts +30 -0
  275. package/src/console/ui/gates/group.ts +102 -0
  276. package/src/console/ui/gates/index.ts +47 -0
  277. package/src/console/ui/gates/search.test.ts +49 -0
  278. package/src/console/ui/gates/search.ts +115 -0
  279. package/src/console/ui/gates/types.ts +121 -0
  280. package/src/console/ui/overview/OverviewA11yView.tsx +152 -0
  281. package/src/console/ui/overview/a11y.test.tsx +113 -0
  282. package/src/console/ui/overview/busiest.ts +26 -0
  283. package/src/console/ui/overview/compose.ts +133 -0
  284. package/src/console/ui/overview/cost.test.ts +39 -0
  285. package/src/console/ui/overview/cost.ts +138 -0
  286. package/src/console/ui/overview/fixture.ts +161 -0
  287. package/src/console/ui/overview/golden.ts +57 -0
  288. package/src/console/ui/overview/index.ts +59 -0
  289. package/src/console/ui/overview/rank.test.ts +136 -0
  290. package/src/console/ui/overview/rank.ts +210 -0
  291. package/src/console/ui/overview/slo.test.ts +73 -0
  292. package/src/console/ui/overview/slo.ts +229 -0
  293. package/src/console/ui/overview/types.ts +121 -0
  294. package/src/console/ui/overview/verdict.ts +131 -0
  295. package/src/console/ui/plugins/PluginsA11yView.tsx +227 -0
  296. package/src/console/ui/plugins/a11y.test.tsx +97 -0
  297. package/src/console/ui/plugins/command.test.ts +22 -0
  298. package/src/console/ui/plugins/command.ts +27 -0
  299. package/src/console/ui/plugins/findings.ts +39 -0
  300. package/src/console/ui/plugins/fixture.ts +233 -0
  301. package/src/console/ui/plugins/group.test.ts +38 -0
  302. package/src/console/ui/plugins/group.ts +67 -0
  303. package/src/console/ui/plugins/index.ts +40 -0
  304. package/src/console/ui/plugins/search.ts +67 -0
  305. package/src/console/ui/plugins/types.ts +115 -0
  306. package/src/console/ui/runs/RunsA11yView.tsx +267 -0
  307. package/src/console/ui/runs/a11y.test.tsx +99 -0
  308. package/src/console/ui/runs/explain.test.ts +23 -0
  309. package/src/console/ui/runs/explain.ts +32 -0
  310. package/src/console/ui/runs/fixture.ts +189 -0
  311. package/src/console/ui/runs/group.test.ts +24 -0
  312. package/src/console/ui/runs/group.ts +85 -0
  313. package/src/console/ui/runs/histogram.test.ts +31 -0
  314. package/src/console/ui/runs/histogram.ts +85 -0
  315. package/src/console/ui/runs/index.ts +75 -0
  316. package/src/console/ui/runs/project.ts +122 -0
  317. package/src/console/ui/runs/query.test.ts +50 -0
  318. package/src/console/ui/runs/query.ts +283 -0
  319. package/src/console/ui/runs/search.test.ts +45 -0
  320. package/src/console/ui/runs/search.ts +141 -0
  321. package/src/console/ui/runs/trace-link.test.ts +30 -0
  322. package/src/console/ui/runs/trace-link.ts +99 -0
  323. package/src/console/ui/runs/types.ts +137 -0
  324. package/src/console/ui/shell/App.tsx +56 -0
  325. package/src/console/ui/shell/client.ts +1715 -0
  326. package/src/console/ui/shell/components/ui.tsx +110 -0
  327. package/src/console/ui/shell/index.html +12 -0
  328. package/src/console/ui/shell/layout/Shell.tsx +95 -0
  329. package/src/console/ui/shell/main.tsx +281 -0
  330. package/src/console/ui/shell/panels/Access.tsx +5 -0
  331. package/src/console/ui/shell/panels/Ai.tsx +5 -0
  332. package/src/console/ui/shell/panels/Architecture.tsx +5 -0
  333. package/src/console/ui/shell/panels/Channels.tsx +5 -0
  334. package/src/console/ui/shell/panels/Clock.tsx +5 -0
  335. package/src/console/ui/shell/panels/Diff.tsx +5 -0
  336. package/src/console/ui/shell/panels/Flows.tsx +5 -0
  337. package/src/console/ui/shell/panels/Gates.tsx +5 -0
  338. package/src/console/ui/shell/panels/Overview.tsx +6 -0
  339. package/src/console/ui/shell/panels/Plugins.tsx +5 -0
  340. package/src/console/ui/shell/panels/Runs.tsx +5 -0
  341. package/src/console/ui/shell/panels/Signals.tsx +5 -0
  342. package/src/console/ui/shell/panels/Store.tsx +5 -0
  343. package/src/console/ui/shell/panels/Traces.tsx +5 -0
  344. package/src/console/ui/shell/panels/Vault.tsx +5 -0
  345. package/src/console/ui/shell/panels/access/AccessPanel.tsx +813 -0
  346. package/src/console/ui/shell/panels/ai/AiPanel.tsx +563 -0
  347. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +377 -0
  348. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +454 -0
  349. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +479 -0
  350. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +275 -0
  351. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +301 -0
  352. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +350 -0
  353. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +502 -0
  354. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +482 -0
  355. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +428 -0
  356. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +413 -0
  357. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +649 -0
  358. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +840 -0
  359. package/src/console/ui/shell/panels/store/StorePanel.tsx +787 -0
  360. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +539 -0
  361. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +449 -0
  362. package/src/console/ui/shell/plugin/Sandbox.tsx +29 -0
  363. package/src/console/ui/shell/setup/Wizard.tsx +189 -0
  364. package/src/console/ui/shell/styles.css +75 -0
  365. package/src/console/ui/signals/SignalsA11yView.tsx +276 -0
  366. package/src/console/ui/signals/a11y.test.tsx +99 -0
  367. package/src/console/ui/signals/confirmation.test.ts +39 -0
  368. package/src/console/ui/signals/confirmation.ts +63 -0
  369. package/src/console/ui/signals/dry-run.test.ts +18 -0
  370. package/src/console/ui/signals/dry-run.ts +36 -0
  371. package/src/console/ui/signals/durable.test.ts +22 -0
  372. package/src/console/ui/signals/durable.ts +41 -0
  373. package/src/console/ui/signals/findings.ts +33 -0
  374. package/src/console/ui/signals/fixture.ts +242 -0
  375. package/src/console/ui/signals/group.test.ts +32 -0
  376. package/src/console/ui/signals/group.ts +49 -0
  377. package/src/console/ui/signals/index.ts +52 -0
  378. package/src/console/ui/signals/monitor.test.ts +30 -0
  379. package/src/console/ui/signals/monitor.ts +79 -0
  380. package/src/console/ui/signals/schema-form.test.ts +34 -0
  381. package/src/console/ui/signals/schema-form.ts +112 -0
  382. package/src/console/ui/signals/search.ts +102 -0
  383. package/src/console/ui/signals/types.ts +71 -0
  384. package/src/console/ui/store/StoreA11yView.tsx +199 -0
  385. package/src/console/ui/store/a11y.test.tsx +99 -0
  386. package/src/console/ui/store/cache-view.test.ts +13 -0
  387. package/src/console/ui/store/cache-view.ts +36 -0
  388. package/src/console/ui/store/confirmation.test.ts +38 -0
  389. package/src/console/ui/store/confirmation.ts +55 -0
  390. package/src/console/ui/store/dry-run.test.ts +15 -0
  391. package/src/console/ui/store/dry-run.ts +29 -0
  392. package/src/console/ui/store/fixture.ts +163 -0
  393. package/src/console/ui/store/group.test.ts +21 -0
  394. package/src/console/ui/store/group.ts +41 -0
  395. package/src/console/ui/store/index.ts +40 -0
  396. package/src/console/ui/store/search.ts +78 -0
  397. package/src/console/ui/store/types.ts +65 -0
  398. package/src/console/ui/store/will-not-fire.test.ts +19 -0
  399. package/src/console/ui/store/will-not-fire.ts +40 -0
  400. package/src/console/ui/traces/TracesA11yView.tsx +200 -0
  401. package/src/console/ui/traces/a11y.test.tsx +97 -0
  402. package/src/console/ui/traces/chain.test.ts +61 -0
  403. package/src/console/ui/traces/chain.ts +144 -0
  404. package/src/console/ui/traces/critical-path.test.ts +24 -0
  405. package/src/console/ui/traces/critical-path.ts +59 -0
  406. package/src/console/ui/traces/filter.test.ts +78 -0
  407. package/src/console/ui/traces/filter.ts +112 -0
  408. package/src/console/ui/traces/fixture.ts +126 -0
  409. package/src/console/ui/traces/fold.test.ts +67 -0
  410. package/src/console/ui/traces/fold.ts +170 -0
  411. package/src/console/ui/traces/index.ts +64 -0
  412. package/src/console/ui/traces/mini.ts +65 -0
  413. package/src/console/ui/traces/replay.test.ts +24 -0
  414. package/src/console/ui/traces/replay.ts +35 -0
  415. package/src/console/ui/traces/sampling.test.ts +26 -0
  416. package/src/console/ui/traces/sampling.ts +66 -0
  417. package/src/console/ui/traces/search.ts +148 -0
  418. package/src/console/ui/traces/tier.ts +72 -0
  419. package/src/console/ui/traces/types.ts +125 -0
  420. package/src/console/ui/tsconfig.json +20 -0
  421. package/src/console/ui/vault/VaultA11yView.tsx +177 -0
  422. package/src/console/ui/vault/a11y.test.tsx +97 -0
  423. package/src/console/ui/vault/blast-radius.test.ts +35 -0
  424. package/src/console/ui/vault/blast-radius.ts +55 -0
  425. package/src/console/ui/vault/confirmation.test.ts +41 -0
  426. package/src/console/ui/vault/confirmation.ts +39 -0
  427. package/src/console/ui/vault/dormant.test.ts +37 -0
  428. package/src/console/ui/vault/dormant.ts +28 -0
  429. package/src/console/ui/vault/export-safe.test.ts +30 -0
  430. package/src/console/ui/vault/export-safe.ts +65 -0
  431. package/src/console/ui/vault/fixture.ts +75 -0
  432. package/src/console/ui/vault/group.test.ts +25 -0
  433. package/src/console/ui/vault/group.ts +50 -0
  434. package/src/console/ui/vault/index.ts +45 -0
  435. package/src/console/ui/vault/search.ts +62 -0
  436. package/src/console/ui/vault/types.ts +57 -0
  437. package/src/console/ui/vite.config.ts +84 -0
  438. package/src/console/xss.gate.test.ts +118 -0
  439. package/src/docker/compose.ts +226 -0
  440. package/src/docker/credentials.ts +25 -0
  441. package/src/docker/derive.ts +83 -0
  442. package/src/docker/docker.test.ts +185 -0
  443. package/src/docker/dockerfile.integration.test.ts +170 -0
  444. package/src/docker/dockerfile.ts +39 -0
  445. package/src/docker/helpers.ts +103 -0
  446. package/src/docker/index.ts +52 -0
  447. package/src/docker/pin.ts +90 -0
  448. package/src/docker/recipes/index.ts +33 -0
  449. package/src/docker/recipes/postgres.ts +18 -0
  450. package/src/docker/recipes/redis.ts +18 -0
  451. package/src/docker/stack.integration.test.ts +140 -0
  452. package/src/docker/stack.ts +62 -0
  453. package/src/docker/types.ts +134 -0
  454. package/src/drivers/ai-anthropic.ts +128 -0
  455. package/src/drivers/ai-mock.ts +82 -0
  456. package/src/drivers/ai-openai-compatible.ts +139 -0
  457. package/src/drivers/ai-providers.test.ts +163 -0
  458. package/src/drivers/ai-types.ts +83 -0
  459. package/src/drivers/bun-native-completeness.test.ts +155 -0
  460. package/src/drivers/channel-console.ts +118 -0
  461. package/src/drivers/channel-fcm.ts +96 -0
  462. package/src/drivers/channel-resend.ts +27 -0
  463. package/src/drivers/channel-smtp.ts +33 -0
  464. package/src/drivers/channel-types.ts +160 -0
  465. package/src/drivers/channel-unifonic.ts +79 -0
  466. package/src/drivers/channel-wa-cloud.ts +84 -0
  467. package/src/drivers/channel-webpush.ts +317 -0
  468. package/src/drivers/conformance.test.ts +89 -0
  469. package/src/drivers/conformance.ts +162 -0
  470. package/src/drivers/fs.ts +73 -0
  471. package/src/drivers/index.ts +194 -0
  472. package/src/drivers/kv-lua.ts +222 -0
  473. package/src/drivers/memory.ts +472 -0
  474. package/src/drivers/pgvector.ts +130 -0
  475. package/src/drivers/postgres.ts +221 -0
  476. package/src/drivers/redis.ts +254 -0
  477. package/src/drivers/s3.ts +129 -0
  478. package/src/drivers/signal-engine.ts +690 -0
  479. package/src/drivers/signal-memory.ts +27 -0
  480. package/src/drivers/signal-nats.ts +131 -0
  481. package/src/drivers/signal-postgres.ts +1089 -0
  482. package/src/drivers/signal-redis.ts +275 -0
  483. package/src/drivers/signal-types.ts +328 -0
  484. package/src/drivers/sqlite.ts +53 -0
  485. package/src/drivers/types.ts +334 -0
  486. package/src/drivers/vault-dotenv-parse.ts +56 -0
  487. package/src/drivers/vault-env.ts +101 -0
  488. package/src/drivers/vault-infisical.ts +61 -0
  489. package/src/drivers/vault-managed.ts +42 -0
  490. package/src/drivers/vault-memory.ts +38 -0
  491. package/src/drivers/vault-openbao.ts +80 -0
  492. package/src/drivers/vault-sops.ts +252 -0
  493. package/src/drivers/vault-types.ts +84 -0
  494. package/src/elements/ai/declare.ts +206 -0
  495. package/src/elements/ai/eval.ts +113 -0
  496. package/src/elements/ai/pii.ts +108 -0
  497. package/src/elements/ai/runtime.ts +540 -0
  498. package/src/elements/ai/schema.ts +194 -0
  499. package/src/elements/ai.test.ts +393 -0
  500. package/src/elements/ai.ts +56 -0
  501. package/src/elements/channel/consent.ts +81 -0
  502. package/src/elements/channel/costs.test.ts +62 -0
  503. package/src/elements/channel/costs.ts +130 -0
  504. package/src/elements/channel/declare.ts +141 -0
  505. package/src/elements/channel/email-auth.test.ts +47 -0
  506. package/src/elements/channel/email-auth.ts +109 -0
  507. package/src/elements/channel/locale.ts +97 -0
  508. package/src/elements/channel/mask.test.ts +19 -0
  509. package/src/elements/channel/mask.ts +60 -0
  510. package/src/elements/channel/mime.ts +23 -0
  511. package/src/elements/channel/outcomes.test.ts +40 -0
  512. package/src/elements/channel/outcomes.ts +126 -0
  513. package/src/elements/channel/receipts.ts +121 -0
  514. package/src/elements/channel/runtime.ts +500 -0
  515. package/src/elements/channel/suppression.ts +136 -0
  516. package/src/elements/channel.test.ts +232 -0
  517. package/src/elements/channel.ts +109 -0
  518. package/src/elements/clock/actions.ts +170 -0
  519. package/src/elements/clock/declare.ts +58 -0
  520. package/src/elements/clock/dst.ts +197 -0
  521. package/src/elements/clock/durable.ts +140 -0
  522. package/src/elements/clock/duration.ts +29 -0
  523. package/src/elements/clock/health.test.ts +103 -0
  524. package/src/elements/clock/health.ts +112 -0
  525. package/src/elements/clock/leader.ts +127 -0
  526. package/src/elements/clock/reconcile.ts +241 -0
  527. package/src/elements/clock/runtime.ts +243 -0
  528. package/src/elements/clock/schedule.ts +262 -0
  529. package/src/elements/clock/time-travel.ts +53 -0
  530. package/src/elements/clock.test.ts +365 -0
  531. package/src/elements/clock.ts +80 -0
  532. package/src/elements/gate/declare.ts +134 -0
  533. package/src/elements/gate/permissions.ts +104 -0
  534. package/src/elements/gate/runtime.ts +177 -0
  535. package/src/elements/gate/strategies.ts +388 -0
  536. package/src/elements/gate.test.ts +145 -0
  537. package/src/elements/gate.ts +41 -0
  538. package/src/elements/index.ts +169 -0
  539. package/src/elements/signal/chaos-child.ts +47 -0
  540. package/src/elements/signal/declare.ts +77 -0
  541. package/src/elements/signal/dry-run-replay.test.ts +95 -0
  542. package/src/elements/signal/dry-run-write-isolation.test.ts +94 -0
  543. package/src/elements/signal/reconcile.test.ts +23 -0
  544. package/src/elements/signal/reconcile.ts +122 -0
  545. package/src/elements/signal/runtime.ts +94 -0
  546. package/src/elements/signal.test.ts +457 -0
  547. package/src/elements/signal.ts +26 -0
  548. package/src/elements/store/cache.ts +197 -0
  549. package/src/elements/store/classify.ts +125 -0
  550. package/src/elements/store/declare.ts +200 -0
  551. package/src/elements/store/files-policy.test.ts +31 -0
  552. package/src/elements/store/files-policy.ts +70 -0
  553. package/src/elements/store/replica.ts +68 -0
  554. package/src/elements/store/runtime.ts +393 -0
  555. package/src/elements/store/sql-condition.ts +205 -0
  556. package/src/elements/store/sql-session.ts +579 -0
  557. package/src/elements/store/table.ts +282 -0
  558. package/src/elements/store.test.ts +370 -0
  559. package/src/elements/store.ts +99 -0
  560. package/src/elements/vault/declare.ts +143 -0
  561. package/src/elements/vault/fingerprint.ts +30 -0
  562. package/src/elements/vault/redact.ts +52 -0
  563. package/src/elements/vault/runtime.ts +461 -0
  564. package/src/elements/vault.test.ts +296 -0
  565. package/src/elements/vault.ts +44 -0
  566. package/src/index.ts +183 -0
  567. package/src/kernel/adopt-routes.ts +194 -0
  568. package/src/kernel/app.ts +1068 -0
  569. package/src/kernel/auth-resolve.ts +93 -0
  570. package/src/kernel/boot.test.ts +173 -0
  571. package/src/kernel/boot.ts +439 -0
  572. package/src/kernel/budget-entry.ts +55 -0
  573. package/src/kernel/budget.test.ts +19 -0
  574. package/src/kernel/call.test.ts +83 -0
  575. package/src/kernel/capability.ts +113 -0
  576. package/src/kernel/dry-run.test.ts +64 -0
  577. package/src/kernel/dry-run.ts +171 -0
  578. package/src/kernel/effects.test.ts +89 -0
  579. package/src/kernel/effects.ts +140 -0
  580. package/src/kernel/errors.registry.test.ts +39 -0
  581. package/src/kernel/errors.ts +225 -0
  582. package/src/kernel/flow.test.ts +154 -0
  583. package/src/kernel/flow.ts +290 -0
  584. package/src/kernel/fx.test.ts +245 -0
  585. package/src/kernel/fx.ts +996 -0
  586. package/src/kernel/hook-timing.test.ts +72 -0
  587. package/src/kernel/hook-timing.ts +190 -0
  588. package/src/kernel/hooks.test.ts +181 -0
  589. package/src/kernel/hooks.ts +275 -0
  590. package/src/kernel/index.ts +278 -0
  591. package/src/kernel/journal.ts +405 -0
  592. package/src/kernel/journey.ts +75 -0
  593. package/src/kernel/on.ts +74 -0
  594. package/src/kernel/pipeline.test.ts +349 -0
  595. package/src/kernel/pipeline.ts +245 -0
  596. package/src/kernel/plug.ts +82 -0
  597. package/src/kernel/plugin/capabilities.test.ts +84 -0
  598. package/src/kernel/plugin/conflicts.test.ts +106 -0
  599. package/src/kernel/plugin/decorate.test.ts +111 -0
  600. package/src/kernel/plugin/scoping.test.ts +138 -0
  601. package/src/kernel/plugin.ts +485 -0
  602. package/src/kernel/rate-limit.ts +25 -0
  603. package/src/kernel/registry.ts +398 -0
  604. package/src/kernel/router.test.ts +114 -0
  605. package/src/kernel/router.ts +556 -0
  606. package/src/kernel/routing-budget.test.ts +19 -0
  607. package/src/kernel/run-telemetry.ts +70 -0
  608. package/src/kernel/triggers.ts +324 -0
  609. package/src/kernel/unit.ts +88 -0
  610. package/src/manifest/diff.test.ts +866 -0
  611. package/src/manifest/diff.ts +1670 -0
  612. package/src/manifest/fixtures/base.manifest.json +112 -0
  613. package/src/manifest/fixtures/skyport.excerpt.json +51 -0
  614. package/src/manifest/fixtures/skyport.manifest.json +153 -0
  615. package/src/manifest/index.ts +27 -0
  616. package/src/manifest/types.ts +358 -0
  617. package/src/manifest/undeclared.test.ts +82 -0
  618. package/src/manifest/undeclared.ts +65 -0
  619. package/src/manifest/validate.test.ts +105 -0
  620. package/src/manifest/validate.ts +174 -0
  621. package/src/mcp/authorization.ts +340 -0
  622. package/src/mcp/confirmation.ts +174 -0
  623. package/src/mcp/data.ts +90 -0
  624. package/src/mcp/index.ts +80 -0
  625. package/src/mcp/injection.gate.test.ts +176 -0
  626. package/src/mcp/mcp.test.ts +348 -0
  627. package/src/mcp/protocol.ts +172 -0
  628. package/src/mcp/server.ts +283 -0
  629. package/src/mcp/session.ts +139 -0
  630. package/src/mcp/tools.ts +391 -0
  631. package/src/plugins/catalogue.test.ts +48 -0
  632. package/src/plugins/catalogue.ts +113 -0
  633. package/src/plugins/node-import-scan.test.ts +28 -0
  634. package/src/plugins/node-import-scan.ts +98 -0
  635. package/src/plugins/supply-chain.test.ts +48 -0
  636. package/src/plugins/supply-chain.ts +460 -0
  637. package/src/release/index.ts +30 -0
  638. package/src/release/limits.ts +20 -0
  639. package/src/release/measure.ts +443 -0
  640. package/src/release/publish.ts +56 -0
  641. package/src/runs/bench.test.ts +93 -0
  642. package/src/runs/collect.ts +144 -0
  643. package/src/runs/drivers/clickhouse.ts +108 -0
  644. package/src/runs/drivers/files.ts +201 -0
  645. package/src/runs/drivers/memory.ts +94 -0
  646. package/src/runs/drivers/postgres.ts +110 -0
  647. package/src/runs/duckdb.ts +99 -0
  648. package/src/runs/index.ts +82 -0
  649. package/src/runs/outlier.ts +180 -0
  650. package/src/runs/parquet.ts +210 -0
  651. package/src/runs/privacy.ts +49 -0
  652. package/src/runs/runs.test.ts +324 -0
  653. package/src/runs/runtime.ts +229 -0
  654. package/src/runs/shred.ts +243 -0
  655. package/src/runs/telemetry.ts +10 -0
  656. package/src/runs/types.ts +179 -0
  657. package/src/runtime/bun.ts +140 -0
  658. package/src/runtime/cold-start.bench.ts +20 -0
  659. package/src/runtime/index.ts +46 -0
  660. package/src/runtime/primitives.ts +242 -0
  661. package/src/runtime/security.test.ts +170 -0
  662. package/src/runtime/security.ts +168 -0
  663. package/src/runtime/serve.test.ts +223 -0
  664. package/src/runtime/types.ts +217 -0
  665. package/src/runtime/web-standard.ts +77 -0
  666. package/src/test/create-test-app.test.ts +161 -0
  667. package/src/test/create-test-app.ts +533 -0
  668. package/src/test/index.ts +21 -0
  669. package/src/test/provisions.integration.test.ts +174 -0
  670. package/src/upgrade/codemods.test.ts +58 -0
  671. package/src/upgrade/codemods.ts +83 -0
  672. package/src/validation/index.ts +23 -0
  673. package/src/validation/standard-schema.test.ts +96 -0
  674. package/src/validation/standard-schema.ts +316 -0
@@ -0,0 +1,579 @@
1
+ /**
2
+ * Driver-agnostic SQL session used by `fx.store(sqlStore)`.
3
+ *
4
+ * Thin, protocol-agnostic subset — never domain-named helpers.
5
+ * Same flow code runs against sqlite, postgres, and memory.
6
+ */
7
+
8
+ import type { ClassificationMap, SqlConnection, SqlRow } from "../../drivers/types.ts";
9
+ import { maskRows, tableFromSql } from "./classify.ts";
10
+ import {
11
+ compileWhere,
12
+ resolveSelectColumns,
13
+ type WhereMap,
14
+ } from "./sql-condition.ts";
15
+ import {
16
+ mapRowToJs,
17
+ prepareInsertRow,
18
+ resolveColumns,
19
+ resolveTableName,
20
+ type TableHandle,
21
+ } from "./table.ts";
22
+
23
+ export type { WhereMap } from "./sql-condition.ts";
24
+
25
+ /** Options for a SQL session. */
26
+ export interface SqlSessionOptions {
27
+ /** Open connection (already role-routed). */
28
+ readonly connection: SqlConnection;
29
+ /** Schema classifications enforced at the boundary. */
30
+ readonly classifications: ClassificationMap;
31
+ /** Allow cleartext PII (requires `pii:reveal`). */
32
+ readonly revealPii?: boolean;
33
+ /** Which connection was chosen — exposed for replica proofs. */
34
+ readonly routedRole: "primary" | "replica";
35
+ }
36
+
37
+ /**
38
+ * Continuations after `.where(...)` on a select — awaitable, optional `.limit`.
39
+ */
40
+ export interface SelectWhereBuilder extends PromiseLike<SqlRow[]> {
41
+ /**
42
+ * Cap the number of returned rows.
43
+ *
44
+ * @param n - Max rows
45
+ */
46
+ limit(n: number): Promise<SqlRow[]>;
47
+ }
48
+
49
+ /**
50
+ * Result of `.from(table)` — awaitable (all rows) or chain `.where(...)`.
51
+ */
52
+ export interface SelectFromBuilder extends PromiseLike<SqlRow[]> {
53
+ /**
54
+ * Filter with a plain equality map or a Drizzle SQL condition
55
+ * (`eq`, `and`, `lt`, …).
56
+ *
57
+ * @param where - Condition
58
+ */
59
+ where(where: unknown): SelectWhereBuilder;
60
+ }
61
+
62
+ /** Fluent select builder. */
63
+ export interface SelectBuilder {
64
+ /**
65
+ * Choose the source table.
66
+ *
67
+ * @param table - Table handle or Drizzle table
68
+ */
69
+ from(table: TableHandle | unknown): SelectFromBuilder;
70
+ }
71
+
72
+ /** Fluent insert builder. */
73
+ export interface InsertBuilder {
74
+ /**
75
+ * Provide row values.
76
+ *
77
+ * @param row - Row to insert
78
+ */
79
+ values(row: SqlRow): InsertValuesBuilder;
80
+ }
81
+
82
+ /**
83
+ * Continuations after `.values()`.
84
+ * Awaitable — `await insert(t).values(row)` runs {@link InsertValuesBuilder.execute}.
85
+ */
86
+ export interface InsertValuesBuilder extends PromiseLike<void> {
87
+ /** Execute and return inserted rows (masked). */
88
+ returning(): Promise<SqlRow[]>;
89
+ /** Execute without returning rows. */
90
+ execute(): Promise<void>;
91
+ }
92
+
93
+ /** Fluent delete after `delete(table)` (no id). */
94
+ export interface DeleteBuilder {
95
+ /**
96
+ * Delete rows matching a condition.
97
+ *
98
+ * @param where - Equality map or Drizzle SQL
99
+ */
100
+ where(where: unknown): Promise<number>;
101
+ }
102
+
103
+ /** Fluent update builder. */
104
+ export interface UpdateBuilder {
105
+ /**
106
+ * Columns to set.
107
+ *
108
+ * @param row - Partial row (JS keys)
109
+ */
110
+ set(row: SqlRow): UpdateSetBuilder;
111
+ }
112
+
113
+ /** Continuations after `.set(...)`. */
114
+ export interface UpdateSetBuilder {
115
+ /**
116
+ * Restrict the update.
117
+ *
118
+ * @param where - Equality map or Drizzle SQL
119
+ */
120
+ where(where: unknown): Promise<number>;
121
+ }
122
+
123
+ /**
124
+ * SQL handle returned by `fx.store(db)` for the sql facet.
125
+ *
126
+ * Generic v1 subset + Prompt 9.1 helpers. No business-named methods.
127
+ */
128
+ export interface SqlStoreHandle {
129
+ /** Resource ref (`sql:name`). */
130
+ readonly ref: `sql:${string}`;
131
+ /** Connection role actually used for this invocation. */
132
+ readonly routedRole: "primary" | "replica";
133
+ /** Underlying driver id. */
134
+ readonly driverId: SqlConnection["driverId"];
135
+ /**
136
+ * Start a select. Optional column map projects / aliases columns
137
+ * (`select({ clicks: links.clicks })`).
138
+ *
139
+ * @param columns - Optional `{ alias: drizzleColumn }` map
140
+ */
141
+ select(columns?: unknown): SelectBuilder;
142
+ /**
143
+ * Start an insert into `table`.
144
+ *
145
+ * @param table - Target table
146
+ */
147
+ insert(table: TableHandle | unknown): InsertBuilder;
148
+ /**
149
+ * Start an update on `table`.
150
+ *
151
+ * @param table - Target table
152
+ */
153
+ update(table: TableHandle | unknown): UpdateBuilder;
154
+ /**
155
+ * Find a row by primary key.
156
+ *
157
+ * @param table - Table
158
+ * @param id - Primary key value
159
+ */
160
+ findById(table: TableHandle | unknown, id: string): Promise<SqlRow | null>;
161
+ /**
162
+ * Delete by primary key, or start a fluent `.where(...)` delete.
163
+ *
164
+ * @param table - Table
165
+ * @param id - Primary key when using the two-arg form
166
+ */
167
+ delete(table: TableHandle | unknown): DeleteBuilder;
168
+ delete(table: TableHandle | unknown, id: string): Promise<boolean>;
169
+ /**
170
+ * True when at least one row matches.
171
+ *
172
+ * @param table - Table
173
+ * @param idOrWhere - Primary key string, or column equality map
174
+ */
175
+ exists(
176
+ table: TableHandle | unknown,
177
+ idOrWhere: string | WhereMap,
178
+ ): Promise<boolean>;
179
+ /**
180
+ * Atomically add `by` to `column` on the PK row.
181
+ *
182
+ * @param table - Table
183
+ * @param id - Primary key value
184
+ * @param column - Numeric column to bump
185
+ * @param by - Delta (default `1`)
186
+ */
187
+ increment(
188
+ table: TableHandle | unknown,
189
+ id: string,
190
+ column: string,
191
+ by?: number,
192
+ ): Promise<number>;
193
+ /**
194
+ * Raw SQL — PII masking still applied at the boundary.
195
+ *
196
+ * @param sql - SQL with `?` placeholders
197
+ * @param params - Bound parameters
198
+ */
199
+ raw(sql: string, params?: readonly unknown[]): Promise<SqlRow[]>;
200
+ /**
201
+ * Ensure a simple table exists (test / bootstrap helper).
202
+ *
203
+ * @param table - Table handle
204
+ */
205
+ ensureTable(table: TableHandle): Promise<void>;
206
+ }
207
+
208
+ /**
209
+ * Create a SQL store handle over a connection.
210
+ *
211
+ * @param ref - Resource ref
212
+ * @param options - Connection + classification
213
+ */
214
+ export function createSqlStoreHandle(
215
+ ref: `sql:${string}`,
216
+ options: SqlSessionOptions,
217
+ ): SqlStoreHandle {
218
+ const { connection, classifications, revealPii } = options;
219
+
220
+ function mask(rows: SqlRow[], table?: string): SqlRow[] {
221
+ return maskRows(rows, { classifications, table, revealPii });
222
+ }
223
+
224
+ async function ensureFromMeta(table: TableHandle | unknown): Promise<void> {
225
+ const cols = resolveColumns(table);
226
+ if (cols.length === 0) return;
227
+ const name = resolveTableName(table);
228
+ const pk = cols.find((c) => c.primary)?.sqlName;
229
+ const colSql = cols
230
+ .map((c) => {
231
+ const typ =
232
+ pk && c.sqlName === pk
233
+ ? `${c.sqlType} PRIMARY KEY`
234
+ : c.sqlType;
235
+ return `${quoteIdent(c.sqlName)} ${typ}`;
236
+ })
237
+ .join(", ");
238
+ await connection.exec(
239
+ `CREATE TABLE IF NOT EXISTS ${quoteIdent(name)} (${colSql})`,
240
+ );
241
+ }
242
+
243
+ function toJs(table: TableHandle | unknown, rows: SqlRow[]): SqlRow[] {
244
+ return rows.map((r) => mapRowToJs(table, r) as SqlRow);
245
+ }
246
+
247
+ function normalizeWhereMap(
248
+ table: TableHandle | unknown,
249
+ where: WhereMap,
250
+ ): WhereMap {
251
+ const cols = resolveColumns(table);
252
+ if (cols.length === 0) return where;
253
+ const out: Record<string, unknown> = {};
254
+ for (const [k, v] of Object.entries(where)) {
255
+ const col = cols.find((c) => c.key === k || c.sqlName === k);
256
+ out[col?.sqlName ?? k] = v;
257
+ }
258
+ return out;
259
+ }
260
+
261
+ function compileTableWhere(
262
+ table: TableHandle | unknown,
263
+ where: unknown,
264
+ ): ReturnType<typeof compileWhere> {
265
+ if (
266
+ where &&
267
+ typeof where === "object" &&
268
+ !Array.isArray(where) &&
269
+ !("queryChunks" in (where as object))
270
+ ) {
271
+ return compileWhere(normalizeWhereMap(table, where as WhereMap));
272
+ }
273
+ return compileWhere(where);
274
+ }
275
+
276
+ async function runSelect(
277
+ table: TableHandle | unknown,
278
+ projection: ReturnType<typeof resolveSelectColumns>,
279
+ where: unknown | undefined,
280
+ limit?: number,
281
+ ): Promise<SqlRow[]> {
282
+ await ensureFromMeta(table);
283
+ const name = resolveTableName(table);
284
+ const selectList =
285
+ projection === null
286
+ ? "*"
287
+ : projection
288
+ .map((c) =>
289
+ c.alias === c.sqlName
290
+ ? quoteIdent(c.sqlName)
291
+ : `${quoteIdent(c.sqlName)} AS ${quoteIdent(c.alias)}`,
292
+ )
293
+ .join(", ");
294
+
295
+ let sql = `SELECT ${selectList} FROM ${quoteIdent(name)}`;
296
+ const params: unknown[] = [];
297
+ if (where !== undefined) {
298
+ const compiled = compileTableWhere(table, where);
299
+ if (compiled.clause) {
300
+ sql += ` WHERE ${compiled.clause}`;
301
+ params.push(...compiled.params);
302
+ }
303
+ }
304
+ if (limit !== undefined) {
305
+ sql += ` LIMIT ${Math.max(0, Math.floor(limit))}`;
306
+ }
307
+
308
+ const rows = await connection.query(sql, params);
309
+ if (projection === null) {
310
+ return toJs(table, mask(rows, name));
311
+ }
312
+ // Projected aliases are already the returned keys.
313
+ return mask(
314
+ rows.map((r) => {
315
+ const out: SqlRow = {};
316
+ for (const c of projection) {
317
+ out[c.alias] = r[c.alias] ?? r[c.sqlName];
318
+ }
319
+ return out;
320
+ }),
321
+ name,
322
+ );
323
+ }
324
+
325
+ function selectFrom(
326
+ table: TableHandle | unknown,
327
+ columns?: unknown,
328
+ ): SelectFromBuilder {
329
+ const projection = resolveSelectColumns(columns);
330
+ const all = runSelect(table, projection, undefined);
331
+ return {
332
+ where(where) {
333
+ const filtered = runSelect(table, projection, where);
334
+ return {
335
+ limit(n) {
336
+ return runSelect(table, projection, where, n);
337
+ },
338
+ then(onfulfilled, onrejected) {
339
+ return filtered.then(onfulfilled, onrejected);
340
+ },
341
+ };
342
+ },
343
+ then(onfulfilled, onrejected) {
344
+ return all.then(onfulfilled, onrejected);
345
+ },
346
+ };
347
+ }
348
+
349
+ const handle: SqlStoreHandle = {
350
+ ref,
351
+ routedRole: options.routedRole,
352
+ driverId: connection.driverId,
353
+
354
+ select(columns?) {
355
+ return {
356
+ from(table) {
357
+ return selectFrom(table, columns);
358
+ },
359
+ };
360
+ },
361
+
362
+ insert(table): InsertBuilder {
363
+ const name = resolveTableName(table);
364
+ return {
365
+ values(row) {
366
+ const runExecute = async (): Promise<void> => {
367
+ await ensureFromMeta(table);
368
+ const prepared = prepareInsertRow(table, row);
369
+ const cols = Object.keys(prepared);
370
+ const placeholders = cols.map(() => "?").join(", ");
371
+ const colList = cols.map(quoteIdent).join(", ");
372
+ const params = cols.map((c) => prepared[c]);
373
+ const sql = `INSERT INTO ${quoteIdent(name)} (${colList}) VALUES (${placeholders})`;
374
+ await connection.exec(sql, params);
375
+ };
376
+ return {
377
+ async returning() {
378
+ await ensureFromMeta(table);
379
+ const prepared = prepareInsertRow(table, row);
380
+ const cols = Object.keys(prepared);
381
+ const placeholders = cols.map(() => "?").join(", ");
382
+ const colList = cols.map(quoteIdent).join(", ");
383
+ const params = cols.map((c) => prepared[c]);
384
+ const sql = `INSERT INTO ${quoteIdent(name)} (${colList}) VALUES (${placeholders}) RETURNING *`;
385
+ const rows = await connection.query(sql, params);
386
+ return toJs(table, mask(rows, name));
387
+ },
388
+ execute: runExecute,
389
+ then(onfulfilled, onrejected) {
390
+ return runExecute().then(onfulfilled, onrejected);
391
+ },
392
+ };
393
+ },
394
+ };
395
+ },
396
+
397
+ update(table): UpdateBuilder {
398
+ const name = resolveTableName(table);
399
+ return {
400
+ set(row) {
401
+ return {
402
+ async where(where) {
403
+ await ensureFromMeta(table);
404
+ const prepared = prepareInsertRow(table, row);
405
+ const setEntries = Object.entries(prepared);
406
+ if (setEntries.length === 0) return 0;
407
+ const setSql = setEntries
408
+ .map(([col]) => `${quoteIdent(col)} = ?`)
409
+ .join(", ");
410
+ const compiled = compileTableWhere(table, where);
411
+ if (!compiled.clause) {
412
+ throw new Error("update().set().where(): condition required");
413
+ }
414
+ const params = [
415
+ ...setEntries.map(([, v]) => v),
416
+ ...compiled.params,
417
+ ];
418
+ const result = await connection.exec(
419
+ `UPDATE ${quoteIdent(name)} SET ${setSql} WHERE ${compiled.clause}`,
420
+ params,
421
+ );
422
+ return result.changes;
423
+ },
424
+ };
425
+ },
426
+ };
427
+ },
428
+
429
+ async findById(table, idValue) {
430
+ await ensureFromMeta(table);
431
+ const name = resolveTableName(table);
432
+ const pk = resolvePkColumn(table);
433
+ const rows = await connection.query(
434
+ `SELECT * FROM ${quoteIdent(name)} WHERE ${quoteIdent(pk)} = ?`,
435
+ [idValue],
436
+ );
437
+ const masked = toJs(table, mask(rows, name));
438
+ return masked[0] ?? null;
439
+ },
440
+
441
+ delete: ((
442
+ table: TableHandle | unknown,
443
+ idValue?: string,
444
+ ): DeleteBuilder | Promise<boolean> => {
445
+ if (idValue !== undefined) {
446
+ return (async () => {
447
+ await ensureFromMeta(table);
448
+ const name = resolveTableName(table);
449
+ const pk = resolvePkColumn(table);
450
+ const result = await connection.exec(
451
+ `DELETE FROM ${quoteIdent(name)} WHERE ${quoteIdent(pk)} = ?`,
452
+ [idValue],
453
+ );
454
+ return result.changes > 0;
455
+ })();
456
+ }
457
+ const builder: DeleteBuilder = {
458
+ async where(where) {
459
+ await ensureFromMeta(table);
460
+ const name = resolveTableName(table);
461
+ const compiled = compileTableWhere(table, where);
462
+ if (!compiled.clause) {
463
+ throw new Error("delete().where(): condition required");
464
+ }
465
+ const result = await connection.exec(
466
+ `DELETE FROM ${quoteIdent(name)} WHERE ${compiled.clause}`,
467
+ compiled.params,
468
+ );
469
+ return result.changes;
470
+ },
471
+ };
472
+ return builder;
473
+ }) as SqlStoreHandle["delete"],
474
+
475
+ async exists(table, idOrWhere) {
476
+ await ensureFromMeta(table);
477
+ const name = resolveTableName(table);
478
+ const where: WhereMap =
479
+ typeof idOrWhere === "string"
480
+ ? { [resolvePkColumn(table)]: idOrWhere }
481
+ : normalizeWhereMap(table, idOrWhere);
482
+ const compiled = compileWhere(where);
483
+ if (!compiled.clause) {
484
+ throw new Error("exists() requires at least one where predicate");
485
+ }
486
+ const rows = await connection.query(
487
+ `SELECT 1 AS "ok" FROM ${quoteIdent(name)} WHERE ${compiled.clause} LIMIT 1`,
488
+ compiled.params,
489
+ );
490
+ return rows.length > 0;
491
+ },
492
+
493
+ async increment(table, idValue, column, by = 1) {
494
+ await ensureFromMeta(table);
495
+ const name = resolveTableName(table);
496
+ const pk = resolvePkColumn(table);
497
+ const cols = resolveColumns(table);
498
+ const colMeta = cols.find((c) => c.key === column || c.sqlName === column);
499
+ const sqlCol = colMeta?.sqlName ?? column;
500
+ const col = quoteIdent(sqlCol);
501
+ const rows = await connection.query(
502
+ `UPDATE ${quoteIdent(name)} SET ${col} = ${col} + ? WHERE ${quoteIdent(pk)} = ? RETURNING ${col}`,
503
+ [by, idValue],
504
+ );
505
+ const row = rows[0];
506
+ if (!row) {
507
+ throw new Error(
508
+ `increment(): no row with ${pk} ${JSON.stringify(idValue)} in ${name}`,
509
+ );
510
+ }
511
+ return asNumber(row[sqlCol], sqlCol);
512
+ },
513
+
514
+ async raw(sql, params = []) {
515
+ const table = tableFromSql(sql);
516
+ const rows = await connection.query(sql, params);
517
+ return mask(rows, table);
518
+ },
519
+
520
+ async ensureTable(table) {
521
+ const cols = Object.values(table.columns);
522
+ const pk = resolvePkColumn(table);
523
+ const colSql = cols
524
+ .map((c) => {
525
+ const typ =
526
+ c.name === pk
527
+ ? "TEXT PRIMARY KEY"
528
+ : c.name === "clicks" ||
529
+ c.name === "qty" ||
530
+ c.name === "createdAt" ||
531
+ c.name === "created_at"
532
+ ? "INTEGER"
533
+ : "TEXT";
534
+ return `${quoteIdent(c.name)} ${typ}`;
535
+ })
536
+ .join(", ");
537
+ await connection.exec(
538
+ `CREATE TABLE IF NOT EXISTS ${quoteIdent(table.name)} (${colSql})`,
539
+ );
540
+ },
541
+ };
542
+
543
+ return handle;
544
+ }
545
+
546
+ /**
547
+ * Resolve the primary-key column name for a table-like value.
548
+ *
549
+ * @param table - Table handle or Drizzle table
550
+ */
551
+ export function resolvePkColumn(table: unknown): string {
552
+ const cols = resolveColumns(table);
553
+ const primary = cols.find((c) => c.primary);
554
+ if (primary) return primary.sqlName;
555
+ if (cols.some((c) => c.sqlName === "id" || c.key === "id")) return "id";
556
+ if (cols.some((c) => c.sqlName === "code" || c.key === "code")) return "code";
557
+ if (table && typeof table === "object") {
558
+ const t = table as Record<string, unknown>;
559
+ if ("id" in t) return "id";
560
+ if ("code" in t) return "code";
561
+ }
562
+ return "id";
563
+ }
564
+
565
+ function asNumber(value: unknown, column: string): number {
566
+ if (typeof value === "number") return value;
567
+ if (typeof value === "bigint") return Number(value);
568
+ if (typeof value === "string" && value.trim() !== "" && !Number.isNaN(Number(value))) {
569
+ return Number(value);
570
+ }
571
+ throw new Error(`column ${JSON.stringify(column)} is not numeric`);
572
+ }
573
+
574
+ function quoteIdent(name: string): string {
575
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
576
+ throw new Error(`Invalid SQL identifier: ${name}`);
577
+ }
578
+ return `"${name}"`;
579
+ }