@plumbus/core 0.7.1 → 0.8.0-beta.1

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 (513) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +2 -1
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/admission/client.d.ts +9 -0
  5. package/dist/admission/client.d.ts.map +1 -0
  6. package/dist/admission/client.js +34 -0
  7. package/dist/admission/client.js.map +1 -0
  8. package/dist/admission/index.d.ts +5 -0
  9. package/dist/admission/index.d.ts.map +1 -0
  10. package/dist/admission/index.js +4 -0
  11. package/dist/admission/index.js.map +1 -0
  12. package/dist/admission/request-admission.d.ts +26 -0
  13. package/dist/admission/request-admission.d.ts.map +1 -0
  14. package/dist/admission/request-admission.js +85 -0
  15. package/dist/admission/request-admission.js.map +1 -0
  16. package/dist/admission/shared.d.ts +31 -0
  17. package/dist/admission/shared.d.ts.map +1 -0
  18. package/dist/admission/shared.js +30 -0
  19. package/dist/admission/shared.js.map +1 -0
  20. package/dist/ai/ai/provider.d.ts +5 -7
  21. package/dist/ai/ai-service.d.ts +8 -1
  22. package/dist/ai/ai-service.d.ts.map +1 -1
  23. package/dist/ai/ai-service.js +23 -13
  24. package/dist/ai/ai-service.js.map +1 -1
  25. package/dist/ai/errors/data-errors.d.ts +6 -0
  26. package/dist/ai/errors/index.d.ts +4 -1
  27. package/dist/ai/fill-prompt-template.d.ts +12 -0
  28. package/dist/ai/fill-prompt-template.d.ts.map +1 -0
  29. package/dist/ai/fill-prompt-template.js +19 -0
  30. package/dist/ai/fill-prompt-template.js.map +1 -0
  31. package/dist/ai/governed-artifacts.d.ts +49 -0
  32. package/dist/ai/governed-artifacts.d.ts.map +1 -0
  33. package/dist/ai/governed-artifacts.js +277 -0
  34. package/dist/ai/governed-artifacts.js.map +1 -0
  35. package/dist/ai/governed-budget.d.ts +17 -0
  36. package/dist/ai/governed-budget.d.ts.map +1 -0
  37. package/dist/ai/governed-budget.js +52 -0
  38. package/dist/ai/governed-budget.js.map +1 -0
  39. package/dist/ai/governed-host.d.ts +54 -0
  40. package/dist/ai/governed-host.d.ts.map +1 -0
  41. package/dist/ai/governed-host.js +8 -0
  42. package/dist/ai/governed-host.js.map +1 -0
  43. package/dist/ai/governed-invoke.d.ts +41 -0
  44. package/dist/ai/governed-invoke.d.ts.map +1 -0
  45. package/dist/ai/governed-invoke.js +102 -0
  46. package/dist/ai/governed-invoke.js.map +1 -0
  47. package/dist/ai/governed-runtime.d.ts +103 -0
  48. package/dist/ai/governed-runtime.d.ts.map +1 -0
  49. package/dist/ai/governed-runtime.js +151 -0
  50. package/dist/ai/governed-runtime.js.map +1 -0
  51. package/dist/ai/index.d.ts +12 -2
  52. package/dist/ai/index.d.ts.map +1 -1
  53. package/dist/ai/index.js +8 -2
  54. package/dist/ai/index.js.map +1 -1
  55. package/dist/ai/prompt-registry.d.ts +6 -0
  56. package/dist/ai/prompt-registry.d.ts.map +1 -1
  57. package/dist/ai/prompt-registry.js +12 -0
  58. package/dist/ai/prompt-registry.js.map +1 -1
  59. package/dist/ai/provider.d.ts +5 -7
  60. package/dist/ai/provider.d.ts.map +1 -1
  61. package/dist/ai/provider.js +29 -0
  62. package/dist/ai/provider.js.map +1 -1
  63. package/dist/ai/types/enums.d.ts +2 -0
  64. package/dist/ai/types/fields.d.ts +7 -0
  65. package/dist/ai/types/prompt.d.ts +8 -0
  66. package/dist/ai/validation.d.ts.map +1 -1
  67. package/dist/ai/validation.js +10 -1
  68. package/dist/ai/validation.js.map +1 -1
  69. package/dist/api/exposure.d.ts +14 -0
  70. package/dist/api/exposure.d.ts.map +1 -1
  71. package/dist/api/exposure.js +16 -0
  72. package/dist/api/exposure.js.map +1 -1
  73. package/dist/api/idempotency.d.ts +67 -0
  74. package/dist/api/idempotency.d.ts.map +1 -0
  75. package/dist/api/idempotency.js +176 -0
  76. package/dist/api/idempotency.js.map +1 -0
  77. package/dist/api/index.d.ts +3 -1
  78. package/dist/api/index.d.ts.map +1 -1
  79. package/dist/api/index.js +4 -2
  80. package/dist/api/index.js.map +1 -1
  81. package/dist/api/route-generator.d.ts +50 -6
  82. package/dist/api/route-generator.d.ts.map +1 -1
  83. package/dist/api/route-generator.js +254 -12
  84. package/dist/api/route-generator.js.map +1 -1
  85. package/dist/approvals/action-risk.d.ts +41 -0
  86. package/dist/approvals/action-risk.d.ts.map +1 -0
  87. package/dist/approvals/action-risk.js +56 -0
  88. package/dist/approvals/action-risk.js.map +1 -0
  89. package/dist/approvals/actors.d.ts +8 -0
  90. package/dist/approvals/actors.d.ts.map +1 -0
  91. package/dist/approvals/actors.js +26 -0
  92. package/dist/approvals/actors.js.map +1 -0
  93. package/dist/approvals/authorization.d.ts +5 -0
  94. package/dist/approvals/authorization.d.ts.map +1 -0
  95. package/dist/approvals/authorization.js +16 -0
  96. package/dist/approvals/authorization.js.map +1 -0
  97. package/dist/approvals/digest.d.ts +3 -0
  98. package/dist/approvals/digest.d.ts.map +1 -0
  99. package/dist/approvals/digest.js +21 -0
  100. package/dist/approvals/digest.js.map +1 -0
  101. package/dist/approvals/gate.d.ts +15 -0
  102. package/dist/approvals/gate.d.ts.map +1 -0
  103. package/dist/approvals/gate.js +102 -0
  104. package/dist/approvals/gate.js.map +1 -0
  105. package/dist/approvals/host-runtime.d.ts +16 -0
  106. package/dist/approvals/host-runtime.d.ts.map +1 -0
  107. package/dist/approvals/host-runtime.js +12 -0
  108. package/dist/approvals/host-runtime.js.map +1 -0
  109. package/dist/approvals/index.d.ts +19 -0
  110. package/dist/approvals/index.d.ts.map +1 -0
  111. package/dist/approvals/index.js +13 -0
  112. package/dist/approvals/index.js.map +1 -0
  113. package/dist/approvals/memory-store.d.ts +3 -0
  114. package/dist/approvals/memory-store.d.ts.map +1 -0
  115. package/dist/approvals/memory-store.js +33 -0
  116. package/dist/approvals/memory-store.js.map +1 -0
  117. package/dist/approvals/schema.d.ts +484 -0
  118. package/dist/approvals/schema.d.ts.map +1 -0
  119. package/dist/approvals/schema.js +55 -0
  120. package/dist/approvals/schema.js.map +1 -0
  121. package/dist/approvals/service.d.ts +17 -0
  122. package/dist/approvals/service.d.ts.map +1 -0
  123. package/dist/approvals/service.js +240 -0
  124. package/dist/approvals/service.js.map +1 -0
  125. package/dist/approvals/sql-store.d.ts +9 -0
  126. package/dist/approvals/sql-store.d.ts.map +1 -0
  127. package/dist/approvals/sql-store.js +179 -0
  128. package/dist/approvals/sql-store.js.map +1 -0
  129. package/dist/approvals/types.d.ts +156 -0
  130. package/dist/approvals/types.d.ts.map +1 -0
  131. package/dist/approvals/types.js +32 -0
  132. package/dist/approvals/types.js.map +1 -0
  133. package/dist/approvals/wait.d.ts +10 -0
  134. package/dist/approvals/wait.d.ts.map +1 -0
  135. package/dist/approvals/wait.js +11 -0
  136. package/dist/approvals/wait.js.map +1 -0
  137. package/dist/audit/service.d.ts.map +1 -1
  138. package/dist/audit/service.js +6 -1
  139. package/dist/audit/service.js.map +1 -1
  140. package/dist/cli/cli.d.ts.map +1 -1
  141. package/dist/cli/cli.js +2 -1
  142. package/dist/cli/cli.js.map +1 -1
  143. package/dist/cli/commands/api.d.ts +65 -0
  144. package/dist/cli/commands/api.d.ts.map +1 -1
  145. package/dist/cli/commands/api.js +79 -4
  146. package/dist/cli/commands/api.js.map +1 -1
  147. package/dist/cli/commands/compile-flows.d.ts +9 -0
  148. package/dist/cli/commands/compile-flows.d.ts.map +1 -0
  149. package/dist/cli/commands/compile-flows.js +55 -0
  150. package/dist/cli/commands/compile-flows.js.map +1 -0
  151. package/dist/cli/commands/dev.d.ts +6 -0
  152. package/dist/cli/commands/dev.d.ts.map +1 -1
  153. package/dist/cli/commands/dev.js +22 -5
  154. package/dist/cli/commands/dev.js.map +1 -1
  155. package/dist/cli/commands/e2e.d.ts +5 -0
  156. package/dist/cli/commands/e2e.d.ts.map +1 -1
  157. package/dist/cli/commands/e2e.js +42 -3
  158. package/dist/cli/commands/e2e.js.map +1 -1
  159. package/dist/cli/commands/flow.d.ts.map +1 -1
  160. package/dist/cli/commands/flow.js +12 -3
  161. package/dist/cli/commands/flow.js.map +1 -1
  162. package/dist/cli/commands/generate-openapi-from-zod.d.ts +26 -0
  163. package/dist/cli/commands/generate-openapi-from-zod.d.ts.map +1 -0
  164. package/dist/cli/commands/generate-openapi-from-zod.js +189 -0
  165. package/dist/cli/commands/generate-openapi-from-zod.js.map +1 -0
  166. package/dist/cli/commands/generate.d.ts +10 -4
  167. package/dist/cli/commands/generate.d.ts.map +1 -1
  168. package/dist/cli/commands/generate.js +27 -70
  169. package/dist/cli/commands/generate.js.map +1 -1
  170. package/dist/cli/commands/index.d.ts +1 -0
  171. package/dist/cli/commands/index.d.ts.map +1 -1
  172. package/dist/cli/commands/index.js +2 -0
  173. package/dist/cli/commands/index.js.map +1 -1
  174. package/dist/cli/commands/mcp.d.ts +5 -0
  175. package/dist/cli/commands/mcp.d.ts.map +1 -1
  176. package/dist/cli/commands/mcp.js +28 -2
  177. package/dist/cli/commands/mcp.js.map +1 -1
  178. package/dist/cli/commands/migrate.d.ts +1 -0
  179. package/dist/cli/commands/migrate.d.ts.map +1 -1
  180. package/dist/cli/commands/migrate.js +145 -34
  181. package/dist/cli/commands/migrate.js.map +1 -1
  182. package/dist/cli/commands/openapi-3-1.d.ts +34 -0
  183. package/dist/cli/commands/openapi-3-1.d.ts.map +1 -0
  184. package/dist/cli/commands/openapi-3-1.js +333 -0
  185. package/dist/cli/commands/openapi-3-1.js.map +1 -0
  186. package/dist/cli/commands/start.d.ts +5 -0
  187. package/dist/cli/commands/start.d.ts.map +1 -1
  188. package/dist/cli/commands/start.js +20 -2
  189. package/dist/cli/commands/start.js.map +1 -1
  190. package/dist/cli/commands/ui.d.ts +11 -0
  191. package/dist/cli/commands/ui.d.ts.map +1 -1
  192. package/dist/cli/commands/ui.js +105 -20
  193. package/dist/cli/commands/ui.js.map +1 -1
  194. package/dist/cli/commands/verify.d.ts.map +1 -1
  195. package/dist/cli/commands/verify.js +2 -0
  196. package/dist/cli/commands/verify.js.map +1 -1
  197. package/dist/cli/commands/worker.d.ts +5 -0
  198. package/dist/cli/commands/worker.d.ts.map +1 -1
  199. package/dist/cli/commands/worker.js +18 -2
  200. package/dist/cli/commands/worker.js.map +1 -1
  201. package/dist/cli/index.d.ts +1 -1
  202. package/dist/cli/index.d.ts.map +1 -1
  203. package/dist/cli/index.js +1 -1
  204. package/dist/cli/index.js.map +1 -1
  205. package/dist/credentials/catalog.d.ts +71 -0
  206. package/dist/credentials/catalog.d.ts.map +1 -0
  207. package/dist/credentials/catalog.js +293 -0
  208. package/dist/credentials/catalog.js.map +1 -0
  209. package/dist/credentials/index.d.ts +3 -0
  210. package/dist/credentials/index.d.ts.map +1 -0
  211. package/dist/credentials/index.js +2 -0
  212. package/dist/credentials/index.js.map +1 -0
  213. package/dist/data/drift-inspector.d.ts +1 -4
  214. package/dist/data/drift-inspector.d.ts.map +1 -1
  215. package/dist/data/drift-inspector.js +39 -5
  216. package/dist/data/drift-inspector.js.map +1 -1
  217. package/dist/data/field-encryption.d.ts +7 -0
  218. package/dist/data/field-encryption.d.ts.map +1 -1
  219. package/dist/data/field-encryption.js +35 -17
  220. package/dist/data/field-encryption.js.map +1 -1
  221. package/dist/data/framework-migration-rewriter.js +1 -1
  222. package/dist/data/framework-migration-rewriter.js.map +1 -1
  223. package/dist/data/index.d.ts +1 -1
  224. package/dist/data/index.d.ts.map +1 -1
  225. package/dist/data/index.js +1 -1
  226. package/dist/data/index.js.map +1 -1
  227. package/dist/data/mask-fields.d.ts +2 -0
  228. package/dist/data/mask-fields.d.ts.map +1 -1
  229. package/dist/data/mask-fields.js +6 -0
  230. package/dist/data/mask-fields.js.map +1 -1
  231. package/dist/data/migration.d.ts.map +1 -1
  232. package/dist/data/migration.js +25 -1
  233. package/dist/data/migration.js.map +1 -1
  234. package/dist/data/repository.d.ts.map +1 -1
  235. package/dist/data/repository.js +15 -3
  236. package/dist/data/repository.js.map +1 -1
  237. package/dist/data/schema-generator.d.ts +95 -3
  238. package/dist/data/schema-generator.d.ts.map +1 -1
  239. package/dist/data/schema-generator.js +122 -6
  240. package/dist/data/schema-generator.js.map +1 -1
  241. package/dist/define/defineCapability.d.ts +7 -0
  242. package/dist/define/defineCapability.d.ts.map +1 -1
  243. package/dist/define/defineCapability.js +15 -0
  244. package/dist/define/defineCapability.js.map +1 -1
  245. package/dist/define/defineFlow.d.ts +3 -1
  246. package/dist/define/defineFlow.d.ts.map +1 -1
  247. package/dist/define/defineFlow.js.map +1 -1
  248. package/dist/durable/apply-ddl.d.ts +13 -0
  249. package/dist/durable/apply-ddl.d.ts.map +1 -0
  250. package/dist/durable/apply-ddl.js +278 -0
  251. package/dist/durable/apply-ddl.js.map +1 -0
  252. package/dist/durable/harness.d.ts +31 -0
  253. package/dist/durable/harness.d.ts.map +1 -0
  254. package/dist/durable/harness.js +136 -0
  255. package/dist/durable/harness.js.map +1 -0
  256. package/dist/durable/index.d.ts +18 -0
  257. package/dist/durable/index.d.ts.map +1 -0
  258. package/dist/durable/index.js +16 -0
  259. package/dist/durable/index.js.map +1 -0
  260. package/dist/durable/memory-store.d.ts +48 -0
  261. package/dist/durable/memory-store.d.ts.map +1 -0
  262. package/dist/durable/memory-store.js +260 -0
  263. package/dist/durable/memory-store.js.map +1 -0
  264. package/dist/durable/migrations-path.d.ts +5 -0
  265. package/dist/durable/migrations-path.d.ts.map +1 -0
  266. package/dist/durable/migrations-path.js +8 -0
  267. package/dist/durable/migrations-path.js.map +1 -0
  268. package/dist/durable/opaque-dispatch.d.ts +7 -0
  269. package/dist/durable/opaque-dispatch.d.ts.map +1 -0
  270. package/dist/durable/opaque-dispatch.js +67 -0
  271. package/dist/durable/opaque-dispatch.js.map +1 -0
  272. package/dist/durable/persist-before-ack.d.ts +52 -0
  273. package/dist/durable/persist-before-ack.d.ts.map +1 -0
  274. package/dist/durable/persist-before-ack.js +153 -0
  275. package/dist/durable/persist-before-ack.js.map +1 -0
  276. package/dist/durable/pg-env.d.ts +9 -0
  277. package/dist/durable/pg-env.d.ts.map +1 -0
  278. package/dist/durable/pg-env.js +20 -0
  279. package/dist/durable/pg-env.js.map +1 -0
  280. package/dist/durable/postgres-persist.d.ts +33 -0
  281. package/dist/durable/postgres-persist.d.ts.map +1 -0
  282. package/dist/durable/postgres-persist.js +239 -0
  283. package/dist/durable/postgres-persist.js.map +1 -0
  284. package/dist/durable/reconciliation.d.ts +20 -0
  285. package/dist/durable/reconciliation.d.ts.map +1 -0
  286. package/dist/durable/reconciliation.js +91 -0
  287. package/dist/durable/reconciliation.js.map +1 -0
  288. package/dist/durable/schema.d.ts +1448 -0
  289. package/dist/durable/schema.d.ts.map +1 -0
  290. package/dist/durable/schema.js +138 -0
  291. package/dist/durable/schema.js.map +1 -0
  292. package/dist/durable/spine-claim.d.ts +16 -0
  293. package/dist/durable/spine-claim.d.ts.map +1 -0
  294. package/dist/durable/spine-claim.js +131 -0
  295. package/dist/durable/spine-claim.js.map +1 -0
  296. package/dist/durable/types.d.ts +153 -0
  297. package/dist/durable/types.d.ts.map +1 -0
  298. package/dist/durable/types.js +114 -0
  299. package/dist/durable/types.js.map +1 -0
  300. package/dist/errors/data-errors.d.ts +6 -0
  301. package/dist/errors/data-errors.d.ts.map +1 -1
  302. package/dist/errors/data-errors.js +9 -0
  303. package/dist/errors/data-errors.js.map +1 -1
  304. package/dist/errors/http.d.ts.map +1 -1
  305. package/dist/errors/http.js +9 -1
  306. package/dist/errors/http.js.map +1 -1
  307. package/dist/errors/index.d.ts +4 -1
  308. package/dist/errors/index.d.ts.map +1 -1
  309. package/dist/errors/index.js +11 -1
  310. package/dist/errors/index.js.map +1 -1
  311. package/dist/errors-entry.d.ts +1 -1
  312. package/dist/errors-entry.d.ts.map +1 -1
  313. package/dist/errors-entry.js +1 -1
  314. package/dist/errors-entry.js.map +1 -1
  315. package/dist/events/consumer-registry.d.ts +6 -0
  316. package/dist/events/consumer-registry.d.ts.map +1 -1
  317. package/dist/events/consumer-registry.js.map +1 -1
  318. package/dist/events/dispatcher.d.ts +19 -0
  319. package/dist/events/dispatcher.d.ts.map +1 -1
  320. package/dist/events/dispatcher.js +161 -114
  321. package/dist/events/dispatcher.js.map +1 -1
  322. package/dist/events/idempotency.d.ts +3 -2
  323. package/dist/events/idempotency.d.ts.map +1 -1
  324. package/dist/events/idempotency.js +3 -2
  325. package/dist/events/idempotency.js.map +1 -1
  326. package/dist/events/index.d.ts +2 -0
  327. package/dist/events/index.d.ts.map +1 -1
  328. package/dist/events/index.js +1 -0
  329. package/dist/events/index.js.map +1 -1
  330. package/dist/events/subscription.d.ts +29 -0
  331. package/dist/events/subscription.d.ts.map +1 -0
  332. package/dist/events/subscription.js +19 -0
  333. package/dist/events/subscription.js.map +1 -0
  334. package/dist/events/worker.d.ts +8 -1
  335. package/dist/events/worker.d.ts.map +1 -1
  336. package/dist/events/worker.js +32 -5
  337. package/dist/events/worker.js.map +1 -1
  338. package/dist/execution/capability-executor.d.ts +6 -3
  339. package/dist/execution/capability-executor.d.ts.map +1 -1
  340. package/dist/execution/capability-executor.js +34 -6
  341. package/dist/execution/capability-executor.js.map +1 -1
  342. package/dist/execution/context-deps.d.ts +2 -0
  343. package/dist/execution/context-deps.d.ts.map +1 -1
  344. package/dist/execution/context-deps.js +2 -1
  345. package/dist/execution/context-deps.js.map +1 -1
  346. package/dist/execution/context-factory.d.ts +38 -1
  347. package/dist/execution/context-factory.d.ts.map +1 -1
  348. package/dist/execution/context-factory.js +102 -4
  349. package/dist/execution/context-factory.js.map +1 -1
  350. package/dist/execution/index.d.ts +2 -2
  351. package/dist/execution/index.d.ts.map +1 -1
  352. package/dist/execution/index.js +1 -1
  353. package/dist/execution/index.js.map +1 -1
  354. package/dist/execution/transactional-outbox.d.ts +10 -0
  355. package/dist/execution/transactional-outbox.d.ts.map +1 -1
  356. package/dist/execution/transactional-outbox.js +41 -2
  357. package/dist/execution/transactional-outbox.js.map +1 -1
  358. package/dist/flows/budget.d.ts +44 -0
  359. package/dist/flows/budget.d.ts.map +1 -0
  360. package/dist/flows/budget.js +81 -0
  361. package/dist/flows/budget.js.map +1 -0
  362. package/dist/flows/compile-flow.d.ts +23 -0
  363. package/dist/flows/compile-flow.d.ts.map +1 -0
  364. package/dist/flows/compile-flow.js +176 -0
  365. package/dist/flows/compile-flow.js.map +1 -0
  366. package/dist/flows/compiled-registry.d.ts +43 -0
  367. package/dist/flows/compiled-registry.d.ts.map +1 -0
  368. package/dist/flows/compiled-registry.js +198 -0
  369. package/dist/flows/compiled-registry.js.map +1 -0
  370. package/dist/flows/dead-letter.d.ts +16 -0
  371. package/dist/flows/dead-letter.d.ts.map +1 -1
  372. package/dist/flows/dead-letter.js +67 -0
  373. package/dist/flows/dead-letter.js.map +1 -1
  374. package/dist/flows/definition-strategy.d.ts +13 -0
  375. package/dist/flows/definition-strategy.d.ts.map +1 -0
  376. package/dist/flows/definition-strategy.js +30 -0
  377. package/dist/flows/definition-strategy.js.map +1 -0
  378. package/dist/flows/engine.d.ts +38 -1
  379. package/dist/flows/engine.d.ts.map +1 -1
  380. package/dist/flows/engine.js +375 -32
  381. package/dist/flows/engine.js.map +1 -1
  382. package/dist/flows/index.d.ts +12 -4
  383. package/dist/flows/index.d.ts.map +1 -1
  384. package/dist/flows/index.js +7 -2
  385. package/dist/flows/index.js.map +1 -1
  386. package/dist/flows/scheduler.d.ts +26 -0
  387. package/dist/flows/scheduler.d.ts.map +1 -1
  388. package/dist/flows/scheduler.js +157 -37
  389. package/dist/flows/scheduler.js.map +1 -1
  390. package/dist/flows/schema.d.ts +34 -0
  391. package/dist/flows/schema.d.ts.map +1 -1
  392. package/dist/flows/schema.js +4 -0
  393. package/dist/flows/schema.js.map +1 -1
  394. package/dist/flows/step-executor.d.ts +3 -0
  395. package/dist/flows/step-executor.d.ts.map +1 -1
  396. package/dist/flows/step-executor.js +33 -0
  397. package/dist/flows/step-executor.js.map +1 -1
  398. package/dist/governance/capability-source-scan.d.ts.map +1 -1
  399. package/dist/governance/capability-source-scan.js +2 -29
  400. package/dist/governance/capability-source-scan.js.map +1 -1
  401. package/dist/governance/forbidden-path-scan.d.ts +7 -0
  402. package/dist/governance/forbidden-path-scan.d.ts.map +1 -0
  403. package/dist/governance/forbidden-path-scan.js +60 -0
  404. package/dist/governance/forbidden-path-scan.js.map +1 -0
  405. package/dist/governance/index.d.ts +2 -0
  406. package/dist/governance/index.d.ts.map +1 -1
  407. package/dist/governance/index.js +2 -0
  408. package/dist/governance/index.js.map +1 -1
  409. package/dist/governance/source-walk.d.ts +3 -0
  410. package/dist/governance/source-walk.d.ts.map +1 -0
  411. package/dist/governance/source-walk.js +33 -0
  412. package/dist/governance/source-walk.js.map +1 -0
  413. package/dist/index.d.ts +21 -12
  414. package/dist/index.d.ts.map +1 -1
  415. package/dist/index.js +22 -9
  416. package/dist/index.js.map +1 -1
  417. package/dist/runtime/bootstrap.d.ts +3 -1
  418. package/dist/runtime/bootstrap.d.ts.map +1 -1
  419. package/dist/runtime/load-extensions.d.ts.map +1 -1
  420. package/dist/runtime/load-extensions.js +11 -0
  421. package/dist/runtime/load-extensions.js.map +1 -1
  422. package/dist/runtime/register-consumers.d.ts +3 -0
  423. package/dist/runtime/register-consumers.d.ts.map +1 -1
  424. package/dist/runtime/register-consumers.js +4 -0
  425. package/dist/runtime/register-consumers.js.map +1 -1
  426. package/dist/runtime/start-worker-pool.d.ts.map +1 -1
  427. package/dist/runtime/start-worker-pool.js +1 -0
  428. package/dist/runtime/start-worker-pool.js.map +1 -1
  429. package/dist/runtime-entry.d.ts +4 -0
  430. package/dist/runtime-entry.d.ts.map +1 -0
  431. package/dist/runtime-entry.js +30 -0
  432. package/dist/runtime-entry.js.map +1 -0
  433. package/dist/server/bootstrap.d.ts +116 -8
  434. package/dist/server/bootstrap.d.ts.map +1 -1
  435. package/dist/server/bootstrap.js +139 -62
  436. package/dist/server/bootstrap.js.map +1 -1
  437. package/dist/tenancy/data-plane-connection.d.ts +108 -0
  438. package/dist/tenancy/data-plane-connection.d.ts.map +1 -0
  439. package/dist/tenancy/data-plane-connection.js +320 -0
  440. package/dist/tenancy/data-plane-connection.js.map +1 -0
  441. package/dist/tenancy/data-plane-migrate.d.ts +30 -0
  442. package/dist/tenancy/data-plane-migrate.d.ts.map +1 -0
  443. package/dist/tenancy/data-plane-migrate.js +44 -0
  444. package/dist/tenancy/data-plane-migrate.js.map +1 -0
  445. package/dist/tenancy/data-plane-provisioning.d.ts +135 -0
  446. package/dist/tenancy/data-plane-provisioning.d.ts.map +1 -0
  447. package/dist/tenancy/data-plane-provisioning.js +639 -0
  448. package/dist/tenancy/data-plane-provisioning.js.map +1 -0
  449. package/dist/tenancy/data-plane-resolver.d.ts +37 -0
  450. package/dist/tenancy/data-plane-resolver.d.ts.map +1 -0
  451. package/dist/tenancy/data-plane-resolver.js +302 -0
  452. package/dist/tenancy/data-plane-resolver.js.map +1 -0
  453. package/dist/tenancy/index.d.ts +9 -0
  454. package/dist/tenancy/index.d.ts.map +1 -0
  455. package/dist/tenancy/index.js +22 -0
  456. package/dist/tenancy/index.js.map +1 -0
  457. package/dist/tenancy/types.d.ts +117 -0
  458. package/dist/tenancy/types.d.ts.map +1 -0
  459. package/dist/tenancy/types.js +8 -0
  460. package/dist/tenancy/types.js.map +1 -0
  461. package/dist/testing/context.d.ts.map +1 -1
  462. package/dist/testing/context.js +6 -1
  463. package/dist/testing/context.js.map +1 -1
  464. package/dist/testing/crash-matrix-simulation.d.ts +51 -0
  465. package/dist/testing/crash-matrix-simulation.d.ts.map +1 -0
  466. package/dist/testing/crash-matrix-simulation.js +350 -0
  467. package/dist/testing/crash-matrix-simulation.js.map +1 -0
  468. package/dist/testing/scaffolding.d.ts.map +1 -1
  469. package/dist/testing/scaffolding.js +4 -1
  470. package/dist/testing/scaffolding.js.map +1 -1
  471. package/dist/types/capability.d.ts +16 -0
  472. package/dist/types/capability.d.ts.map +1 -1
  473. package/dist/types/capability.js.map +1 -1
  474. package/dist/types/context.d.ts +62 -0
  475. package/dist/types/context.d.ts.map +1 -1
  476. package/dist/types/enums.d.ts +2 -0
  477. package/dist/types/enums.d.ts.map +1 -1
  478. package/dist/types/enums.js +2 -0
  479. package/dist/types/enums.js.map +1 -1
  480. package/dist/types/fields.d.ts +7 -0
  481. package/dist/types/fields.d.ts.map +1 -1
  482. package/dist/types/flow.d.ts +96 -1
  483. package/dist/types/flow.d.ts.map +1 -1
  484. package/dist/types/flow.js +7 -1
  485. package/dist/types/flow.js.map +1 -1
  486. package/dist/types/index.d.ts +9 -6
  487. package/dist/types/index.d.ts.map +1 -1
  488. package/dist/types/index.js +5 -1
  489. package/dist/types/index.js.map +1 -1
  490. package/dist/types/prompt.d.ts +8 -0
  491. package/dist/types/prompt.d.ts.map +1 -1
  492. package/dist/types/prompt.js +7 -0
  493. package/dist/types/prompt.js.map +1 -1
  494. package/dist/worker/bootstrap.d.ts +100 -1
  495. package/dist/worker/bootstrap.d.ts.map +1 -1
  496. package/dist/worker/bootstrap.js +155 -14
  497. package/dist/worker/bootstrap.js.map +1 -1
  498. package/instructions/api.md +21 -0
  499. package/instructions/cli.md +15 -9
  500. package/instructions/deployment.md +27 -25
  501. package/instructions/flows.md +8 -1
  502. package/instructions/framework.md +2 -1
  503. package/instructions/mcp.md +1 -1
  504. package/instructions/peer-dependencies.md +16 -14
  505. package/instructions/prompts.md +3 -0
  506. package/instructions/security.md +4 -0
  507. package/instructions/testing.md +2 -2
  508. package/migrations/durable-tenant/0000_durable_tenant.sql +92 -0
  509. package/migrations/durable-tenant/0001_human_task.sql +45 -0
  510. package/migrations/durable-tenant/meta/_journal.json +20 -0
  511. package/migrations/spine/0000_opaque_dispatch.sql +26 -0
  512. package/migrations/spine/meta/_journal.json +13 -0
  513. package/package.json +26 -8
@@ -0,0 +1,639 @@
1
+ // ── Tenant Data-Plane Provisioning ──
2
+ // Creates and tears down the Postgres data plane that backs a single tenant:
3
+ // the database itself, an owner role (used by migrations) and a least-privilege
4
+ // runtime role (used at request time). Applications describe the data plane they
5
+ // need; the framework performs the DDL. No application should open a raw client
6
+ // or issue provisioning DDL of its own.
7
+ //
8
+ // Every step is idempotent: existing objects are detected up front and the
9
+ // duplicate-object SQLSTATEs (42P04 / 42710) are also tolerated so that two
10
+ // concurrent provisioners converge on the same outcome. `CREATE DATABASE` and
11
+ // `DROP DATABASE` are issued outside any transaction, which Postgres requires.
12
+ //
13
+ // Key exports: provisionDataPlane, dropDataPlane
14
+ import { PlumbusError } from '../errors/plumbus-error.js';
15
+ import { ErrorCode } from '../types/enums.js';
16
+ // ── Errors ──
17
+ /** An identifier supplied by a caller is not safe to use as a SQL identifier. */
18
+ export class DataPlaneNameError extends PlumbusError {
19
+ constructor(message, metadata) {
20
+ super(ErrorCode.Validation, message, metadata);
21
+ this.name = 'DataPlaneNameError';
22
+ }
23
+ }
24
+ /** A destructive operation was refused because it fell outside the caller's guard. */
25
+ export class DataPlaneGuardError extends PlumbusError {
26
+ constructor(message, metadata) {
27
+ super(ErrorCode.Forbidden, message, metadata);
28
+ this.name = 'DataPlaneGuardError';
29
+ }
30
+ }
31
+ /** A provisioning step failed; `metadata.step` names the step that failed. */
32
+ export class DataPlaneProvisioningError extends PlumbusError {
33
+ constructor(message, metadata) {
34
+ super(ErrorCode.Internal, message, metadata);
35
+ this.name = 'DataPlaneProvisioningError';
36
+ }
37
+ }
38
+ // ── Identifier safety ──
39
+ /**
40
+ * Identifiers are restricted to unquoted-lowercase form. Everything that reaches
41
+ * a SQL string is validated against this first and then double-quoted, so a
42
+ * hostile tenant name can neither terminate the identifier nor fold case.
43
+ */
44
+ const IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_]{0,62}$/;
45
+ /** `pg_` is reserved by Postgres for system roles, schemas and namespaces. */
46
+ const RESERVED_PREFIX = 'pg_';
47
+ /** Encoding / locale names are literals, not identifiers; keep them equally narrow. */
48
+ const LOCALE_PATTERN = /^[A-Za-z0-9_.@-]{1,64}$/;
49
+ const ALLOWED_TABLE_PRIVILEGES = [
50
+ 'SELECT',
51
+ 'INSERT',
52
+ 'UPDATE',
53
+ 'DELETE',
54
+ 'TRUNCATE',
55
+ 'REFERENCES',
56
+ 'TRIGGER',
57
+ ];
58
+ const DEFAULT_TABLE_PRIVILEGES = [
59
+ 'SELECT',
60
+ 'INSERT',
61
+ 'UPDATE',
62
+ 'DELETE',
63
+ ];
64
+ /** SQLSTATE 42P04 — duplicate_database. */
65
+ const DUPLICATE_DATABASE = '42P04';
66
+ /** SQLSTATE 42710 — duplicate_object (covers duplicate roles and schemas). */
67
+ const DUPLICATE_OBJECT = '42710';
68
+ /**
69
+ * Validates a caller-supplied identifier and returns it unchanged.
70
+ *
71
+ * @param extraPattern additional convention the caller requires (e.g. a tenant
72
+ * database prefix). Applied on top of the framework pattern, never instead of it.
73
+ */
74
+ export function assertSafeIdentifier(value, field, extraPattern) {
75
+ if (typeof value !== 'string' || value.length === 0) {
76
+ throw new DataPlaneNameError(`${field} must be a non-empty string`, { field });
77
+ }
78
+ if (!IDENTIFIER_PATTERN.test(value)) {
79
+ throw new DataPlaneNameError(`${field} "${value}" is not a safe SQL identifier (expected /^[a-z_][a-z0-9_]{0,62}$/)`, { field, value });
80
+ }
81
+ if (value.startsWith(RESERVED_PREFIX)) {
82
+ throw new DataPlaneNameError(`${field} "${value}" uses the reserved "pg_" prefix`, {
83
+ field,
84
+ value,
85
+ });
86
+ }
87
+ if (extraPattern && !matchesPattern(extraPattern, value)) {
88
+ throw new DataPlaneNameError(`${field} "${value}" does not match the required naming convention ${extraPattern}`, { field, value, pattern: extraPattern.source });
89
+ }
90
+ return value;
91
+ }
92
+ /**
93
+ * Tests a pattern without mutating it. A caller-supplied `/g` or `/y` regex keeps
94
+ * `lastIndex` between calls, which would make a guard pass or fail by turn order.
95
+ */
96
+ function matchesPattern(pattern, value) {
97
+ const flags = pattern.flags.replace(/[gy]/g, '');
98
+ return new RegExp(pattern.source, flags).test(value);
99
+ }
100
+ /** Double-quotes an already-validated identifier. Defence in depth, not the defence. */
101
+ export function quoteIdentifier(value) {
102
+ return `"${value.replace(/"/g, '""')}"`;
103
+ }
104
+ function assertLocaleToken(value, field) {
105
+ if (!LOCALE_PATTERN.test(value)) {
106
+ throw new DataPlaneNameError(`${field} "${value}" is not a valid ${field} token`, {
107
+ field,
108
+ value,
109
+ });
110
+ }
111
+ return value;
112
+ }
113
+ function normalizeTablePrivileges(privileges) {
114
+ if (!privileges)
115
+ return [...DEFAULT_TABLE_PRIVILEGES];
116
+ if (privileges.length === 0) {
117
+ throw new DataPlaneNameError('runtimeTablePrivileges must not be empty');
118
+ }
119
+ return privileges.map((privilege) => {
120
+ const upper = privilege.toUpperCase();
121
+ const match = ALLOWED_TABLE_PRIVILEGES.find((allowed) => allowed === upper);
122
+ if (!match) {
123
+ throw new DataPlaneNameError(`Unsupported table privilege "${privilege}"`, { privilege });
124
+ }
125
+ return match;
126
+ });
127
+ }
128
+ function isConnectionString(connection) {
129
+ return typeof connection.connectionString === 'string';
130
+ }
131
+ async function openClient(connection, options) {
132
+ const postgresModule = (await import('postgres')).default;
133
+ const shared = {
134
+ max: 1,
135
+ connect_timeout: options.connectTimeoutSeconds,
136
+ // Provisioning DDL is chatty ("role ... does not exist, skipping"); the step
137
+ // log is the record, not stderr.
138
+ onnotice: () => { },
139
+ };
140
+ if (isConnectionString(connection)) {
141
+ return postgresModule(connection.connectionString, options.database ? { ...shared, database: options.database } : shared);
142
+ }
143
+ return postgresModule({
144
+ ...shared,
145
+ host: connection.host,
146
+ port: connection.port,
147
+ database: options.database ?? connection.database,
148
+ username: connection.user,
149
+ password: connection.password,
150
+ ssl: connection.ssl,
151
+ });
152
+ }
153
+ async function closeClient(client) {
154
+ await client.end({ timeout: 5 });
155
+ }
156
+ function sqlStateOf(error) {
157
+ if (typeof error !== 'object' || error === null)
158
+ return undefined;
159
+ const code = error.code;
160
+ return typeof code === 'string' ? code : undefined;
161
+ }
162
+ /** Token swapped for the escaped password literal at execution time; what the step log keeps. */
163
+ const PASSWORD_SLOT = '__PLUMBUS_PASSWORD_LITERAL__';
164
+ async function execute(client, statement, step, target) {
165
+ try {
166
+ await client.unsafe(statement);
167
+ }
168
+ catch (error) {
169
+ throw new DataPlaneProvisioningError(`Data-plane step "${step}" failed for "${target}": ${error.message}`, { step, target, sqlState: sqlStateOf(error) });
170
+ }
171
+ }
172
+ /**
173
+ * Escapes a password on the server with `quote_literal`, so the result honours the
174
+ * connection's `standard_conforming_strings` setting instead of assuming it.
175
+ */
176
+ async function quoteLiteral(client, value) {
177
+ const rows = await client `SELECT quote_literal(${value}) AS literal`;
178
+ const literal = rows[0]?.literal;
179
+ if (typeof literal !== 'string') {
180
+ throw new DataPlaneProvisioningError('Server refused to quote a role password');
181
+ }
182
+ return literal;
183
+ }
184
+ function normalizeRole(role, field, namePattern) {
185
+ const spec = typeof role === 'string' ? { name: role } : role;
186
+ const name = assertSafeIdentifier(spec.name, field, namePattern);
187
+ if (spec.password !== undefined) {
188
+ if (typeof spec.password !== 'string' || spec.password.length === 0) {
189
+ throw new DataPlaneNameError(`${field}.password must be a non-empty string when provided`, {
190
+ field,
191
+ });
192
+ }
193
+ if (spec.password.includes('\u0000')) {
194
+ throw new DataPlaneNameError(`${field}.password must not contain a NUL character`, { field });
195
+ }
196
+ return { name, password: spec.password };
197
+ }
198
+ return { name };
199
+ }
200
+ /**
201
+ * Creates a tenant's data plane, idempotently.
202
+ *
203
+ * Performs, in order: owner and runtime roles, admin membership of the owner role
204
+ * (required to set the database owner and default privileges when the admin is not
205
+ * a superuser), `CREATE DATABASE` outside a transaction, database-level revocation
206
+ * of PUBLIC, then per-schema grants and default privileges inside the new database.
207
+ *
208
+ * Safe to re-run after a partial failure: each step reports `created` or
209
+ * `already-present`, so a caller can resume without special-casing.
210
+ */
211
+ export async function provisionDataPlane(options) {
212
+ const namePattern = options.namePattern;
213
+ const databaseName = assertSafeIdentifier(options.databaseName, 'databaseName', namePattern);
214
+ const owner = normalizeRole(options.ownerRole, 'ownerRole', namePattern);
215
+ const runtime = normalizeRole(options.runtimeRole, 'runtimeRole', namePattern);
216
+ if (owner.name === runtime.name) {
217
+ throw new DataPlaneNameError(`ownerRole and runtimeRole must differ (both "${owner.name}"); the runtime role exists to hold fewer privileges than the owner`, { ownerRole: owner.name, runtimeRole: runtime.name });
218
+ }
219
+ const extraSchemas = (options.schemas ?? []).map((schema) => assertSafeIdentifier(schema, 'schema'));
220
+ const tablePrivileges = normalizeTablePrivileges(options.runtimeTablePrivileges);
221
+ const template = options.template
222
+ ? assertSafeIdentifier(options.template, 'template')
223
+ : undefined;
224
+ const encoding = options.encoding ? assertLocaleToken(options.encoding, 'encoding') : undefined;
225
+ const locale = options.locale ? assertLocaleToken(options.locale, 'locale') : undefined;
226
+ const connectTimeoutSeconds = options.connectTimeoutSeconds ?? 10;
227
+ const steps = [];
228
+ const rolesCreated = [];
229
+ const rolesAlreadyPresent = [];
230
+ const schemasCreated = [];
231
+ const schemasAlreadyPresent = [];
232
+ let databaseCreated = false;
233
+ const admin = await openClient(options.adminConnection, { connectTimeoutSeconds });
234
+ try {
235
+ for (const role of [owner, runtime]) {
236
+ const created = await ensureRole(admin, role, steps, {
237
+ updatePassword: options.updateExistingRolePasswords === true,
238
+ });
239
+ (created ? rolesCreated : rolesAlreadyPresent).push(role.name);
240
+ }
241
+ await ensureAdminMembership(admin, owner.name, steps);
242
+ databaseCreated = await ensureDatabase(admin, databaseName, owner.name, steps, {
243
+ template,
244
+ encoding,
245
+ locale,
246
+ });
247
+ await applyDatabaseGrants(admin, databaseName, owner.name, runtime.name, steps);
248
+ }
249
+ finally {
250
+ await closeClient(admin);
251
+ }
252
+ const target = await openClient(options.adminConnection, {
253
+ database: databaseName,
254
+ connectTimeoutSeconds,
255
+ });
256
+ try {
257
+ for (const schema of ['public', ...extraSchemas]) {
258
+ if (schema !== 'public') {
259
+ const created = await ensureSchema(target, schema, owner.name, steps);
260
+ (created ? schemasCreated : schemasAlreadyPresent).push(schema);
261
+ }
262
+ await applySchemaGrants(target, schema, owner.name, runtime.name, tablePrivileges, steps);
263
+ }
264
+ }
265
+ finally {
266
+ await closeClient(target);
267
+ }
268
+ return {
269
+ databaseName,
270
+ ownerRole: owner.name,
271
+ runtimeRole: runtime.name,
272
+ databaseCreated,
273
+ rolesCreated,
274
+ rolesAlreadyPresent,
275
+ schemasCreated,
276
+ schemasAlreadyPresent,
277
+ steps,
278
+ };
279
+ }
280
+ async function roleExists(client, name) {
281
+ const rows = await client `
282
+ SELECT 1 AS one FROM pg_catalog.pg_roles WHERE rolname = ${name}
283
+ `;
284
+ return rows.length > 0;
285
+ }
286
+ async function ensureRole(client, role, steps, options) {
287
+ const quoted = quoteIdentifier(role.name);
288
+ const exists = await roleExists(client, role.name);
289
+ if (exists) {
290
+ steps.push({
291
+ step: 'create-role',
292
+ target: role.name,
293
+ outcome: 'already-present',
294
+ statement: '',
295
+ });
296
+ if (options.updatePassword && role.password !== undefined) {
297
+ const literal = await quoteLiteral(client, role.password);
298
+ await execute(client, `ALTER ROLE ${quoted} WITH LOGIN PASSWORD ${literal}`, 'alter-role-password', role.name);
299
+ steps.push({
300
+ step: 'alter-role-password',
301
+ target: role.name,
302
+ outcome: 'updated',
303
+ statement: `ALTER ROLE ${quoted} WITH LOGIN PASSWORD ${PASSWORD_SLOT}`,
304
+ });
305
+ }
306
+ return false;
307
+ }
308
+ const attributes = 'LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS';
309
+ const redacted = `CREATE ROLE ${quoted} WITH ${attributes}${role.password === undefined ? '' : ` PASSWORD ${PASSWORD_SLOT}`}`;
310
+ const literal = role.password === undefined ? undefined : await quoteLiteral(client, role.password);
311
+ // A function replacer, never a string one: `$&`, `$'` and friends inside a
312
+ // password are String.replace substitution patterns and would otherwise be
313
+ // expanded into the statement.
314
+ const statement = literal === undefined ? redacted : redacted.replace(PASSWORD_SLOT, () => literal);
315
+ try {
316
+ await client.unsafe(statement);
317
+ }
318
+ catch (error) {
319
+ // Another provisioner won the race between the existence check and the create.
320
+ if (sqlStateOf(error) === DUPLICATE_OBJECT) {
321
+ steps.push({
322
+ step: 'create-role',
323
+ target: role.name,
324
+ outcome: 'already-present',
325
+ statement: '',
326
+ });
327
+ return false;
328
+ }
329
+ throw new DataPlaneProvisioningError(`Data-plane step "create-role" failed for "${role.name}": ${error.message}`, { step: 'create-role', target: role.name, sqlState: sqlStateOf(error) });
330
+ }
331
+ steps.push({
332
+ step: 'create-role',
333
+ target: role.name,
334
+ outcome: 'created',
335
+ statement: redacted,
336
+ });
337
+ return true;
338
+ }
339
+ /**
340
+ * `CREATE DATABASE ... OWNER x`, `ALTER DEFAULT PRIVILEGES FOR ROLE x` and granting
341
+ * inside a schema owned by x all require the admin to be a member of x. Superusers
342
+ * already satisfy `pg_has_role`; a CREATEROLE admin gains membership here.
343
+ */
344
+ async function ensureAdminMembership(client, ownerRole, steps) {
345
+ const rows = await client `
346
+ SELECT pg_catalog.pg_has_role(CURRENT_USER, ${ownerRole}, 'USAGE') AS member,
347
+ CURRENT_USER::text AS admin_name,
348
+ pg_catalog.quote_ident(CURRENT_USER::text) AS admin_quoted
349
+ `;
350
+ const row = rows[0];
351
+ if (!row) {
352
+ throw new DataPlaneProvisioningError('Could not determine the admin role membership');
353
+ }
354
+ if (row.member) {
355
+ steps.push({
356
+ step: 'grant-role-membership',
357
+ target: ownerRole,
358
+ outcome: 'already-present',
359
+ statement: '',
360
+ });
361
+ return;
362
+ }
363
+ const statement = `GRANT ${quoteIdentifier(ownerRole)} TO ${row.admin_quoted}`;
364
+ await execute(client, statement, 'grant-role-membership', ownerRole);
365
+ steps.push({
366
+ step: 'grant-role-membership',
367
+ target: ownerRole,
368
+ outcome: 'applied',
369
+ statement,
370
+ });
371
+ }
372
+ async function databaseExists(client, name) {
373
+ const rows = await client `
374
+ SELECT 1 AS one FROM pg_catalog.pg_database WHERE datname = ${name}
375
+ `;
376
+ return rows.length > 0;
377
+ }
378
+ async function ensureDatabase(client, databaseName, ownerRole, steps, options) {
379
+ if (await databaseExists(client, databaseName)) {
380
+ steps.push({
381
+ step: 'create-database',
382
+ target: databaseName,
383
+ outcome: 'already-present',
384
+ statement: '',
385
+ });
386
+ return false;
387
+ }
388
+ // Postgres forbids CREATE DATABASE inside a transaction block; this client runs
389
+ // in autocommit and the statement is issued on its own.
390
+ const clauses = [`OWNER ${quoteIdentifier(ownerRole)}`];
391
+ if (options.template)
392
+ clauses.push(`TEMPLATE ${quoteIdentifier(options.template)}`);
393
+ if (options.encoding)
394
+ clauses.push(`ENCODING '${options.encoding}'`);
395
+ if (options.locale) {
396
+ clauses.push(`LC_COLLATE '${options.locale}'`, `LC_CTYPE '${options.locale}'`);
397
+ }
398
+ const statement = `CREATE DATABASE ${quoteIdentifier(databaseName)} ${clauses.join(' ')}`;
399
+ try {
400
+ await client.unsafe(statement);
401
+ }
402
+ catch (error) {
403
+ if (sqlStateOf(error) === DUPLICATE_DATABASE) {
404
+ steps.push({
405
+ step: 'create-database',
406
+ target: databaseName,
407
+ outcome: 'already-present',
408
+ statement: '',
409
+ });
410
+ return false;
411
+ }
412
+ throw new DataPlaneProvisioningError(`Data-plane step "create-database" failed for "${databaseName}": ${error.message}`, { step: 'create-database', target: databaseName, sqlState: sqlStateOf(error) });
413
+ }
414
+ steps.push({
415
+ step: 'create-database',
416
+ target: databaseName,
417
+ outcome: 'created',
418
+ statement,
419
+ });
420
+ return true;
421
+ }
422
+ async function applyDatabaseGrants(client, databaseName, ownerRole, runtimeRole, steps) {
423
+ const db = quoteIdentifier(databaseName);
424
+ const revoke = `REVOKE ALL ON DATABASE ${db} FROM PUBLIC`;
425
+ await execute(client, revoke, 'revoke-database-from-public', databaseName);
426
+ steps.push({
427
+ step: 'revoke-database-from-public',
428
+ target: databaseName,
429
+ outcome: 'applied',
430
+ statement: revoke,
431
+ });
432
+ const grantOwner = `GRANT CONNECT, TEMPORARY ON DATABASE ${db} TO ${quoteIdentifier(ownerRole)}`;
433
+ await execute(client, grantOwner, 'grant-database-connect', ownerRole);
434
+ steps.push({
435
+ step: 'grant-database-connect',
436
+ target: ownerRole,
437
+ outcome: 'applied',
438
+ statement: grantOwner,
439
+ });
440
+ const grantRuntime = `GRANT CONNECT ON DATABASE ${db} TO ${quoteIdentifier(runtimeRole)}`;
441
+ await execute(client, grantRuntime, 'grant-database-connect', runtimeRole);
442
+ steps.push({
443
+ step: 'grant-database-connect',
444
+ target: runtimeRole,
445
+ outcome: 'applied',
446
+ statement: grantRuntime,
447
+ });
448
+ }
449
+ async function ensureSchema(client, schema, ownerRole, steps) {
450
+ const rows = await client `
451
+ SELECT 1 AS one FROM pg_catalog.pg_namespace WHERE nspname = ${schema}
452
+ `;
453
+ if (rows.length > 0) {
454
+ steps.push({
455
+ step: 'create-schema',
456
+ target: schema,
457
+ outcome: 'already-present',
458
+ statement: '',
459
+ });
460
+ return false;
461
+ }
462
+ const statement = `CREATE SCHEMA ${quoteIdentifier(schema)} AUTHORIZATION ${quoteIdentifier(ownerRole)}`;
463
+ try {
464
+ await client.unsafe(statement);
465
+ }
466
+ catch (error) {
467
+ if (sqlStateOf(error) === DUPLICATE_OBJECT) {
468
+ steps.push({
469
+ step: 'create-schema',
470
+ target: schema,
471
+ outcome: 'already-present',
472
+ statement: '',
473
+ });
474
+ return false;
475
+ }
476
+ throw new DataPlaneProvisioningError(`Data-plane step "create-schema" failed for "${schema}": ${error.message}`, { step: 'create-schema', target: schema, sqlState: sqlStateOf(error) });
477
+ }
478
+ steps.push({ step: 'create-schema', target: schema, outcome: 'created', statement });
479
+ return true;
480
+ }
481
+ async function applySchemaGrants(client, schema, ownerRole, runtimeRole, tablePrivileges, steps) {
482
+ const ns = quoteIdentifier(schema);
483
+ const owner = quoteIdentifier(ownerRole);
484
+ const runtime = quoteIdentifier(runtimeRole);
485
+ const privileges = tablePrivileges.join(', ');
486
+ const statements = [
487
+ // On Postgres < 15 PUBLIC holds CREATE on `public`; on any version it holds
488
+ // USAGE. Both are removed before anything is granted back explicitly.
489
+ {
490
+ step: 'revoke-schema-from-public',
491
+ target: schema,
492
+ sql: `REVOKE ALL ON SCHEMA ${ns} FROM PUBLIC`,
493
+ },
494
+ {
495
+ step: 'grant-schema-usage',
496
+ target: ownerRole,
497
+ sql: `GRANT USAGE, CREATE ON SCHEMA ${ns} TO ${owner}`,
498
+ },
499
+ // The runtime role gets USAGE only: it may reach objects in the schema but
500
+ // may not create them. DDL stays with the owner role that migrations use.
501
+ {
502
+ step: 'grant-schema-usage',
503
+ target: runtimeRole,
504
+ sql: `GRANT USAGE ON SCHEMA ${ns} TO ${runtime}`,
505
+ },
506
+ {
507
+ step: 'grant-table-privileges',
508
+ target: runtimeRole,
509
+ sql: `GRANT ${privileges} ON ALL TABLES IN SCHEMA ${ns} TO ${runtime}`,
510
+ },
511
+ {
512
+ step: 'grant-sequence-privileges',
513
+ target: runtimeRole,
514
+ sql: `GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA ${ns} TO ${runtime}`,
515
+ },
516
+ // Objects a later migration creates as the owner are covered without re-running
517
+ // provisioning.
518
+ {
519
+ step: 'set-default-table-privileges',
520
+ target: runtimeRole,
521
+ sql: `ALTER DEFAULT PRIVILEGES FOR ROLE ${owner} IN SCHEMA ${ns} GRANT ${privileges} ON TABLES TO ${runtime}`,
522
+ },
523
+ {
524
+ step: 'set-default-sequence-privileges',
525
+ target: runtimeRole,
526
+ sql: `ALTER DEFAULT PRIVILEGES FOR ROLE ${owner} IN SCHEMA ${ns} GRANT USAGE, SELECT ON SEQUENCES TO ${runtime}`,
527
+ },
528
+ ];
529
+ for (const entry of statements) {
530
+ await execute(client, entry.sql, entry.step, entry.target);
531
+ steps.push({
532
+ step: entry.step,
533
+ target: entry.target,
534
+ outcome: 'applied',
535
+ statement: entry.sql,
536
+ });
537
+ }
538
+ }
539
+ /**
540
+ * Drops a tenant's data plane — intended for test and fixture tenants.
541
+ *
542
+ * Refuses any database or role name that does not match `allowedNamePattern`, and
543
+ * refuses to drop the database the admin connection is itself using. Idempotent:
544
+ * a second call reports `absent` rather than failing.
545
+ */
546
+ export async function dropDataPlane(options) {
547
+ if (!(options.allowedNamePattern instanceof RegExp)) {
548
+ throw new DataPlaneGuardError('allowedNamePattern is required: dropDataPlane will not drop anything without an explicit naming convention');
549
+ }
550
+ const databaseName = assertSafeIdentifier(options.databaseName, 'databaseName');
551
+ if (!matchesPattern(options.allowedNamePattern, databaseName)) {
552
+ throw new DataPlaneGuardError(`Refusing to drop database "${databaseName}": it does not match ${options.allowedNamePattern}`, { databaseName, pattern: options.allowedNamePattern.source });
553
+ }
554
+ const roles = (options.roles ?? []).map((role) => {
555
+ const name = assertSafeIdentifier(role, 'role');
556
+ if (!matchesPattern(options.allowedNamePattern, name)) {
557
+ throw new DataPlaneGuardError(`Refusing to drop role "${name}": it does not match ${options.allowedNamePattern}`, { role: name, pattern: options.allowedNamePattern.source });
558
+ }
559
+ return name;
560
+ });
561
+ const connectTimeoutSeconds = options.connectTimeoutSeconds ?? 10;
562
+ const steps = [];
563
+ const rolesDropped = [];
564
+ const rolesAbsent = [];
565
+ let databaseDropped = false;
566
+ let terminatedConnections = 0;
567
+ const admin = await openClient(options.adminConnection, { connectTimeoutSeconds });
568
+ try {
569
+ const currentRows = await admin `
570
+ SELECT current_database()::text AS current
571
+ `;
572
+ if (currentRows[0]?.current === databaseName) {
573
+ throw new DataPlaneGuardError(`Refusing to drop database "${databaseName}": it is the admin connection's own database`, { databaseName });
574
+ }
575
+ const exists = await databaseExists(admin, databaseName);
576
+ if (exists) {
577
+ if (options.terminateConnections !== false) {
578
+ const terminated = await admin `
579
+ SELECT pg_catalog.pg_terminate_backend(pid) AS ok, pid
580
+ FROM pg_catalog.pg_stat_activity
581
+ WHERE datname = ${databaseName} AND pid <> pg_catalog.pg_backend_pid()
582
+ `;
583
+ terminatedConnections = terminated.length;
584
+ steps.push({
585
+ step: 'terminate-connections',
586
+ target: databaseName,
587
+ outcome: terminatedConnections > 0 ? 'applied' : 'skipped',
588
+ statement: 'SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1',
589
+ });
590
+ }
591
+ // DROP DATABASE, like CREATE DATABASE, cannot run inside a transaction block.
592
+ const statement = `DROP DATABASE IF EXISTS ${quoteIdentifier(databaseName)}`;
593
+ await execute(admin, statement, 'drop-database', databaseName);
594
+ databaseDropped = true;
595
+ steps.push({
596
+ step: 'drop-database',
597
+ target: databaseName,
598
+ outcome: 'dropped',
599
+ statement,
600
+ });
601
+ }
602
+ else {
603
+ steps.push({
604
+ step: 'drop-database',
605
+ target: databaseName,
606
+ outcome: 'absent',
607
+ statement: '',
608
+ });
609
+ }
610
+ for (const role of roles) {
611
+ if (!(await roleExists(admin, role))) {
612
+ rolesAbsent.push(role);
613
+ steps.push({ step: 'drop-role', target: role, outcome: 'absent', statement: '' });
614
+ continue;
615
+ }
616
+ // Clears privileges the role still holds in the admin database; the tenant
617
+ // database's own objects went with the DROP DATABASE above.
618
+ const dropOwned = `DROP OWNED BY ${quoteIdentifier(role)}`;
619
+ await execute(admin, dropOwned, 'drop-owned', role);
620
+ steps.push({ step: 'drop-owned', target: role, outcome: 'applied', statement: dropOwned });
621
+ const dropRole = `DROP ROLE IF EXISTS ${quoteIdentifier(role)}`;
622
+ await execute(admin, dropRole, 'drop-role', role);
623
+ rolesDropped.push(role);
624
+ steps.push({ step: 'drop-role', target: role, outcome: 'dropped', statement: dropRole });
625
+ }
626
+ }
627
+ finally {
628
+ await closeClient(admin);
629
+ }
630
+ return {
631
+ databaseName,
632
+ databaseDropped,
633
+ rolesDropped,
634
+ rolesAbsent,
635
+ terminatedConnections,
636
+ steps,
637
+ };
638
+ }
639
+ //# sourceMappingURL=data-plane-provisioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-plane-provisioning.js","sourceRoot":"","sources":["../../src/tenancy/data-plane-provisioning.ts"],"names":[],"mappings":"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"}