@plumbus/core 0.7.1 → 0.8.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/CHANGELOG.md +39 -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/cli/cli.d.ts.map +1 -1
  138. package/dist/cli/cli.js +2 -1
  139. package/dist/cli/cli.js.map +1 -1
  140. package/dist/cli/commands/api.d.ts +65 -0
  141. package/dist/cli/commands/api.d.ts.map +1 -1
  142. package/dist/cli/commands/api.js +79 -4
  143. package/dist/cli/commands/api.js.map +1 -1
  144. package/dist/cli/commands/compile-flows.d.ts +9 -0
  145. package/dist/cli/commands/compile-flows.d.ts.map +1 -0
  146. package/dist/cli/commands/compile-flows.js +55 -0
  147. package/dist/cli/commands/compile-flows.js.map +1 -0
  148. package/dist/cli/commands/dev.d.ts +6 -0
  149. package/dist/cli/commands/dev.d.ts.map +1 -1
  150. package/dist/cli/commands/dev.js +22 -5
  151. package/dist/cli/commands/dev.js.map +1 -1
  152. package/dist/cli/commands/e2e.d.ts +5 -0
  153. package/dist/cli/commands/e2e.d.ts.map +1 -1
  154. package/dist/cli/commands/e2e.js +42 -3
  155. package/dist/cli/commands/e2e.js.map +1 -1
  156. package/dist/cli/commands/flow.d.ts.map +1 -1
  157. package/dist/cli/commands/flow.js +12 -3
  158. package/dist/cli/commands/flow.js.map +1 -1
  159. package/dist/cli/commands/generate-openapi-from-zod.d.ts +26 -0
  160. package/dist/cli/commands/generate-openapi-from-zod.d.ts.map +1 -0
  161. package/dist/cli/commands/generate-openapi-from-zod.js +189 -0
  162. package/dist/cli/commands/generate-openapi-from-zod.js.map +1 -0
  163. package/dist/cli/commands/generate.d.ts +10 -4
  164. package/dist/cli/commands/generate.d.ts.map +1 -1
  165. package/dist/cli/commands/generate.js +27 -70
  166. package/dist/cli/commands/generate.js.map +1 -1
  167. package/dist/cli/commands/index.d.ts +1 -0
  168. package/dist/cli/commands/index.d.ts.map +1 -1
  169. package/dist/cli/commands/index.js +2 -0
  170. package/dist/cli/commands/index.js.map +1 -1
  171. package/dist/cli/commands/mcp.d.ts +5 -0
  172. package/dist/cli/commands/mcp.d.ts.map +1 -1
  173. package/dist/cli/commands/mcp.js +28 -2
  174. package/dist/cli/commands/mcp.js.map +1 -1
  175. package/dist/cli/commands/migrate.d.ts +1 -0
  176. package/dist/cli/commands/migrate.d.ts.map +1 -1
  177. package/dist/cli/commands/migrate.js +145 -34
  178. package/dist/cli/commands/migrate.js.map +1 -1
  179. package/dist/cli/commands/openapi-3-1.d.ts +34 -0
  180. package/dist/cli/commands/openapi-3-1.d.ts.map +1 -0
  181. package/dist/cli/commands/openapi-3-1.js +333 -0
  182. package/dist/cli/commands/openapi-3-1.js.map +1 -0
  183. package/dist/cli/commands/start.d.ts +5 -0
  184. package/dist/cli/commands/start.d.ts.map +1 -1
  185. package/dist/cli/commands/start.js +20 -2
  186. package/dist/cli/commands/start.js.map +1 -1
  187. package/dist/cli/commands/ui.d.ts +11 -0
  188. package/dist/cli/commands/ui.d.ts.map +1 -1
  189. package/dist/cli/commands/ui.js +105 -20
  190. package/dist/cli/commands/ui.js.map +1 -1
  191. package/dist/cli/commands/verify.d.ts.map +1 -1
  192. package/dist/cli/commands/verify.js +2 -0
  193. package/dist/cli/commands/verify.js.map +1 -1
  194. package/dist/cli/commands/worker.d.ts +5 -0
  195. package/dist/cli/commands/worker.d.ts.map +1 -1
  196. package/dist/cli/commands/worker.js +18 -2
  197. package/dist/cli/commands/worker.js.map +1 -1
  198. package/dist/cli/index.d.ts +1 -1
  199. package/dist/cli/index.d.ts.map +1 -1
  200. package/dist/cli/index.js +1 -1
  201. package/dist/cli/index.js.map +1 -1
  202. package/dist/credentials/catalog.d.ts +71 -0
  203. package/dist/credentials/catalog.d.ts.map +1 -0
  204. package/dist/credentials/catalog.js +293 -0
  205. package/dist/credentials/catalog.js.map +1 -0
  206. package/dist/credentials/index.d.ts +3 -0
  207. package/dist/credentials/index.d.ts.map +1 -0
  208. package/dist/credentials/index.js +2 -0
  209. package/dist/credentials/index.js.map +1 -0
  210. package/dist/data/drift-inspector.d.ts +1 -4
  211. package/dist/data/drift-inspector.d.ts.map +1 -1
  212. package/dist/data/drift-inspector.js +39 -5
  213. package/dist/data/drift-inspector.js.map +1 -1
  214. package/dist/data/field-encryption.d.ts +7 -0
  215. package/dist/data/field-encryption.d.ts.map +1 -1
  216. package/dist/data/field-encryption.js +35 -17
  217. package/dist/data/field-encryption.js.map +1 -1
  218. package/dist/data/framework-migration-rewriter.js +1 -1
  219. package/dist/data/framework-migration-rewriter.js.map +1 -1
  220. package/dist/data/index.d.ts +1 -1
  221. package/dist/data/index.d.ts.map +1 -1
  222. package/dist/data/index.js +1 -1
  223. package/dist/data/index.js.map +1 -1
  224. package/dist/data/mask-fields.d.ts +2 -0
  225. package/dist/data/mask-fields.d.ts.map +1 -1
  226. package/dist/data/mask-fields.js +6 -0
  227. package/dist/data/mask-fields.js.map +1 -1
  228. package/dist/data/migration.d.ts.map +1 -1
  229. package/dist/data/migration.js +25 -1
  230. package/dist/data/migration.js.map +1 -1
  231. package/dist/data/repository.d.ts.map +1 -1
  232. package/dist/data/repository.js +15 -3
  233. package/dist/data/repository.js.map +1 -1
  234. package/dist/data/schema-generator.d.ts +95 -3
  235. package/dist/data/schema-generator.d.ts.map +1 -1
  236. package/dist/data/schema-generator.js +122 -6
  237. package/dist/data/schema-generator.js.map +1 -1
  238. package/dist/define/defineCapability.d.ts +7 -0
  239. package/dist/define/defineCapability.d.ts.map +1 -1
  240. package/dist/define/defineCapability.js +15 -0
  241. package/dist/define/defineCapability.js.map +1 -1
  242. package/dist/define/defineFlow.d.ts +3 -1
  243. package/dist/define/defineFlow.d.ts.map +1 -1
  244. package/dist/define/defineFlow.js.map +1 -1
  245. package/dist/durable/apply-ddl.d.ts +13 -0
  246. package/dist/durable/apply-ddl.d.ts.map +1 -0
  247. package/dist/durable/apply-ddl.js +278 -0
  248. package/dist/durable/apply-ddl.js.map +1 -0
  249. package/dist/durable/harness.d.ts +31 -0
  250. package/dist/durable/harness.d.ts.map +1 -0
  251. package/dist/durable/harness.js +136 -0
  252. package/dist/durable/harness.js.map +1 -0
  253. package/dist/durable/index.d.ts +18 -0
  254. package/dist/durable/index.d.ts.map +1 -0
  255. package/dist/durable/index.js +16 -0
  256. package/dist/durable/index.js.map +1 -0
  257. package/dist/durable/memory-store.d.ts +48 -0
  258. package/dist/durable/memory-store.d.ts.map +1 -0
  259. package/dist/durable/memory-store.js +260 -0
  260. package/dist/durable/memory-store.js.map +1 -0
  261. package/dist/durable/migrations-path.d.ts +5 -0
  262. package/dist/durable/migrations-path.d.ts.map +1 -0
  263. package/dist/durable/migrations-path.js +8 -0
  264. package/dist/durable/migrations-path.js.map +1 -0
  265. package/dist/durable/opaque-dispatch.d.ts +7 -0
  266. package/dist/durable/opaque-dispatch.d.ts.map +1 -0
  267. package/dist/durable/opaque-dispatch.js +67 -0
  268. package/dist/durable/opaque-dispatch.js.map +1 -0
  269. package/dist/durable/persist-before-ack.d.ts +52 -0
  270. package/dist/durable/persist-before-ack.d.ts.map +1 -0
  271. package/dist/durable/persist-before-ack.js +153 -0
  272. package/dist/durable/persist-before-ack.js.map +1 -0
  273. package/dist/durable/pg-env.d.ts +9 -0
  274. package/dist/durable/pg-env.d.ts.map +1 -0
  275. package/dist/durable/pg-env.js +20 -0
  276. package/dist/durable/pg-env.js.map +1 -0
  277. package/dist/durable/postgres-persist.d.ts +33 -0
  278. package/dist/durable/postgres-persist.d.ts.map +1 -0
  279. package/dist/durable/postgres-persist.js +239 -0
  280. package/dist/durable/postgres-persist.js.map +1 -0
  281. package/dist/durable/reconciliation.d.ts +20 -0
  282. package/dist/durable/reconciliation.d.ts.map +1 -0
  283. package/dist/durable/reconciliation.js +91 -0
  284. package/dist/durable/reconciliation.js.map +1 -0
  285. package/dist/durable/schema.d.ts +1448 -0
  286. package/dist/durable/schema.d.ts.map +1 -0
  287. package/dist/durable/schema.js +138 -0
  288. package/dist/durable/schema.js.map +1 -0
  289. package/dist/durable/spine-claim.d.ts +16 -0
  290. package/dist/durable/spine-claim.d.ts.map +1 -0
  291. package/dist/durable/spine-claim.js +131 -0
  292. package/dist/durable/spine-claim.js.map +1 -0
  293. package/dist/durable/types.d.ts +153 -0
  294. package/dist/durable/types.d.ts.map +1 -0
  295. package/dist/durable/types.js +114 -0
  296. package/dist/durable/types.js.map +1 -0
  297. package/dist/errors/data-errors.d.ts +6 -0
  298. package/dist/errors/data-errors.d.ts.map +1 -1
  299. package/dist/errors/data-errors.js +9 -0
  300. package/dist/errors/data-errors.js.map +1 -1
  301. package/dist/errors/index.d.ts +4 -1
  302. package/dist/errors/index.d.ts.map +1 -1
  303. package/dist/errors/index.js +11 -1
  304. package/dist/errors/index.js.map +1 -1
  305. package/dist/errors-entry.d.ts +1 -1
  306. package/dist/errors-entry.d.ts.map +1 -1
  307. package/dist/errors-entry.js +1 -1
  308. package/dist/errors-entry.js.map +1 -1
  309. package/dist/events/consumer-registry.d.ts +6 -0
  310. package/dist/events/consumer-registry.d.ts.map +1 -1
  311. package/dist/events/consumer-registry.js.map +1 -1
  312. package/dist/events/dispatcher.d.ts +19 -0
  313. package/dist/events/dispatcher.d.ts.map +1 -1
  314. package/dist/events/dispatcher.js +161 -114
  315. package/dist/events/dispatcher.js.map +1 -1
  316. package/dist/events/idempotency.d.ts +3 -2
  317. package/dist/events/idempotency.d.ts.map +1 -1
  318. package/dist/events/idempotency.js +3 -2
  319. package/dist/events/idempotency.js.map +1 -1
  320. package/dist/events/index.d.ts +2 -0
  321. package/dist/events/index.d.ts.map +1 -1
  322. package/dist/events/index.js +1 -0
  323. package/dist/events/index.js.map +1 -1
  324. package/dist/events/subscription.d.ts +29 -0
  325. package/dist/events/subscription.d.ts.map +1 -0
  326. package/dist/events/subscription.js +19 -0
  327. package/dist/events/subscription.js.map +1 -0
  328. package/dist/events/worker.d.ts +8 -1
  329. package/dist/events/worker.d.ts.map +1 -1
  330. package/dist/events/worker.js +32 -5
  331. package/dist/events/worker.js.map +1 -1
  332. package/dist/execution/capability-executor.d.ts +6 -3
  333. package/dist/execution/capability-executor.d.ts.map +1 -1
  334. package/dist/execution/capability-executor.js +34 -6
  335. package/dist/execution/capability-executor.js.map +1 -1
  336. package/dist/execution/context-deps.d.ts +2 -0
  337. package/dist/execution/context-deps.d.ts.map +1 -1
  338. package/dist/execution/context-deps.js +2 -1
  339. package/dist/execution/context-deps.js.map +1 -1
  340. package/dist/execution/context-factory.d.ts +38 -1
  341. package/dist/execution/context-factory.d.ts.map +1 -1
  342. package/dist/execution/context-factory.js +102 -4
  343. package/dist/execution/context-factory.js.map +1 -1
  344. package/dist/execution/index.d.ts +2 -2
  345. package/dist/execution/index.d.ts.map +1 -1
  346. package/dist/execution/index.js +1 -1
  347. package/dist/execution/index.js.map +1 -1
  348. package/dist/execution/transactional-outbox.d.ts +10 -0
  349. package/dist/execution/transactional-outbox.d.ts.map +1 -1
  350. package/dist/execution/transactional-outbox.js +41 -2
  351. package/dist/execution/transactional-outbox.js.map +1 -1
  352. package/dist/flows/budget.d.ts +44 -0
  353. package/dist/flows/budget.d.ts.map +1 -0
  354. package/dist/flows/budget.js +81 -0
  355. package/dist/flows/budget.js.map +1 -0
  356. package/dist/flows/compile-flow.d.ts +23 -0
  357. package/dist/flows/compile-flow.d.ts.map +1 -0
  358. package/dist/flows/compile-flow.js +176 -0
  359. package/dist/flows/compile-flow.js.map +1 -0
  360. package/dist/flows/compiled-registry.d.ts +43 -0
  361. package/dist/flows/compiled-registry.d.ts.map +1 -0
  362. package/dist/flows/compiled-registry.js +198 -0
  363. package/dist/flows/compiled-registry.js.map +1 -0
  364. package/dist/flows/dead-letter.d.ts +16 -0
  365. package/dist/flows/dead-letter.d.ts.map +1 -1
  366. package/dist/flows/dead-letter.js +67 -0
  367. package/dist/flows/dead-letter.js.map +1 -1
  368. package/dist/flows/definition-strategy.d.ts +13 -0
  369. package/dist/flows/definition-strategy.d.ts.map +1 -0
  370. package/dist/flows/definition-strategy.js +30 -0
  371. package/dist/flows/definition-strategy.js.map +1 -0
  372. package/dist/flows/engine.d.ts +38 -1
  373. package/dist/flows/engine.d.ts.map +1 -1
  374. package/dist/flows/engine.js +375 -32
  375. package/dist/flows/engine.js.map +1 -1
  376. package/dist/flows/index.d.ts +12 -4
  377. package/dist/flows/index.d.ts.map +1 -1
  378. package/dist/flows/index.js +7 -2
  379. package/dist/flows/index.js.map +1 -1
  380. package/dist/flows/scheduler.d.ts +26 -0
  381. package/dist/flows/scheduler.d.ts.map +1 -1
  382. package/dist/flows/scheduler.js +157 -37
  383. package/dist/flows/scheduler.js.map +1 -1
  384. package/dist/flows/schema.d.ts +34 -0
  385. package/dist/flows/schema.d.ts.map +1 -1
  386. package/dist/flows/schema.js +4 -0
  387. package/dist/flows/schema.js.map +1 -1
  388. package/dist/flows/step-executor.d.ts +3 -0
  389. package/dist/flows/step-executor.d.ts.map +1 -1
  390. package/dist/flows/step-executor.js +33 -0
  391. package/dist/flows/step-executor.js.map +1 -1
  392. package/dist/governance/capability-source-scan.d.ts.map +1 -1
  393. package/dist/governance/capability-source-scan.js +2 -29
  394. package/dist/governance/capability-source-scan.js.map +1 -1
  395. package/dist/governance/forbidden-path-scan.d.ts +7 -0
  396. package/dist/governance/forbidden-path-scan.d.ts.map +1 -0
  397. package/dist/governance/forbidden-path-scan.js +60 -0
  398. package/dist/governance/forbidden-path-scan.js.map +1 -0
  399. package/dist/governance/index.d.ts +2 -0
  400. package/dist/governance/index.d.ts.map +1 -1
  401. package/dist/governance/index.js +2 -0
  402. package/dist/governance/index.js.map +1 -1
  403. package/dist/governance/source-walk.d.ts +3 -0
  404. package/dist/governance/source-walk.d.ts.map +1 -0
  405. package/dist/governance/source-walk.js +33 -0
  406. package/dist/governance/source-walk.js.map +1 -0
  407. package/dist/index.d.ts +21 -12
  408. package/dist/index.d.ts.map +1 -1
  409. package/dist/index.js +22 -9
  410. package/dist/index.js.map +1 -1
  411. package/dist/runtime/bootstrap.d.ts +3 -1
  412. package/dist/runtime/bootstrap.d.ts.map +1 -1
  413. package/dist/runtime/load-extensions.d.ts.map +1 -1
  414. package/dist/runtime/load-extensions.js +11 -0
  415. package/dist/runtime/load-extensions.js.map +1 -1
  416. package/dist/runtime/register-consumers.d.ts +3 -0
  417. package/dist/runtime/register-consumers.d.ts.map +1 -1
  418. package/dist/runtime/register-consumers.js +4 -0
  419. package/dist/runtime/register-consumers.js.map +1 -1
  420. package/dist/runtime/start-worker-pool.d.ts.map +1 -1
  421. package/dist/runtime/start-worker-pool.js +1 -0
  422. package/dist/runtime/start-worker-pool.js.map +1 -1
  423. package/dist/runtime-entry.d.ts +4 -0
  424. package/dist/runtime-entry.d.ts.map +1 -0
  425. package/dist/runtime-entry.js +30 -0
  426. package/dist/runtime-entry.js.map +1 -0
  427. package/dist/server/bootstrap.d.ts +116 -8
  428. package/dist/server/bootstrap.d.ts.map +1 -1
  429. package/dist/server/bootstrap.js +139 -62
  430. package/dist/server/bootstrap.js.map +1 -1
  431. package/dist/tenancy/data-plane-connection.d.ts +108 -0
  432. package/dist/tenancy/data-plane-connection.d.ts.map +1 -0
  433. package/dist/tenancy/data-plane-connection.js +320 -0
  434. package/dist/tenancy/data-plane-connection.js.map +1 -0
  435. package/dist/tenancy/data-plane-migrate.d.ts +30 -0
  436. package/dist/tenancy/data-plane-migrate.d.ts.map +1 -0
  437. package/dist/tenancy/data-plane-migrate.js +44 -0
  438. package/dist/tenancy/data-plane-migrate.js.map +1 -0
  439. package/dist/tenancy/data-plane-provisioning.d.ts +135 -0
  440. package/dist/tenancy/data-plane-provisioning.d.ts.map +1 -0
  441. package/dist/tenancy/data-plane-provisioning.js +639 -0
  442. package/dist/tenancy/data-plane-provisioning.js.map +1 -0
  443. package/dist/tenancy/data-plane-resolver.d.ts +37 -0
  444. package/dist/tenancy/data-plane-resolver.d.ts.map +1 -0
  445. package/dist/tenancy/data-plane-resolver.js +302 -0
  446. package/dist/tenancy/data-plane-resolver.js.map +1 -0
  447. package/dist/tenancy/index.d.ts +9 -0
  448. package/dist/tenancy/index.d.ts.map +1 -0
  449. package/dist/tenancy/index.js +22 -0
  450. package/dist/tenancy/index.js.map +1 -0
  451. package/dist/tenancy/types.d.ts +117 -0
  452. package/dist/tenancy/types.d.ts.map +1 -0
  453. package/dist/tenancy/types.js +8 -0
  454. package/dist/tenancy/types.js.map +1 -0
  455. package/dist/testing/context.d.ts.map +1 -1
  456. package/dist/testing/context.js +6 -1
  457. package/dist/testing/context.js.map +1 -1
  458. package/dist/testing/crash-matrix-simulation.d.ts +51 -0
  459. package/dist/testing/crash-matrix-simulation.d.ts.map +1 -0
  460. package/dist/testing/crash-matrix-simulation.js +350 -0
  461. package/dist/testing/crash-matrix-simulation.js.map +1 -0
  462. package/dist/testing/scaffolding.d.ts.map +1 -1
  463. package/dist/testing/scaffolding.js +4 -1
  464. package/dist/testing/scaffolding.js.map +1 -1
  465. package/dist/types/capability.d.ts +16 -0
  466. package/dist/types/capability.d.ts.map +1 -1
  467. package/dist/types/capability.js.map +1 -1
  468. package/dist/types/context.d.ts +62 -0
  469. package/dist/types/context.d.ts.map +1 -1
  470. package/dist/types/enums.d.ts +2 -0
  471. package/dist/types/enums.d.ts.map +1 -1
  472. package/dist/types/enums.js +2 -0
  473. package/dist/types/enums.js.map +1 -1
  474. package/dist/types/fields.d.ts +7 -0
  475. package/dist/types/fields.d.ts.map +1 -1
  476. package/dist/types/flow.d.ts +96 -1
  477. package/dist/types/flow.d.ts.map +1 -1
  478. package/dist/types/flow.js +7 -1
  479. package/dist/types/flow.js.map +1 -1
  480. package/dist/types/index.d.ts +9 -6
  481. package/dist/types/index.d.ts.map +1 -1
  482. package/dist/types/index.js +5 -1
  483. package/dist/types/index.js.map +1 -1
  484. package/dist/types/prompt.d.ts +8 -0
  485. package/dist/types/prompt.d.ts.map +1 -1
  486. package/dist/types/prompt.js +7 -0
  487. package/dist/types/prompt.js.map +1 -1
  488. package/dist/worker/bootstrap.d.ts +100 -1
  489. package/dist/worker/bootstrap.d.ts.map +1 -1
  490. package/dist/worker/bootstrap.js +155 -14
  491. package/dist/worker/bootstrap.js.map +1 -1
  492. package/instructions/api.md +21 -0
  493. package/instructions/cli.md +15 -9
  494. package/instructions/deployment.md +27 -25
  495. package/instructions/flows.md +8 -1
  496. package/instructions/framework.md +2 -1
  497. package/instructions/mcp.md +1 -1
  498. package/instructions/peer-dependencies.md +16 -14
  499. package/instructions/prompts.md +3 -0
  500. package/instructions/security.md +4 -0
  501. package/instructions/testing.md +2 -2
  502. package/migrations/durable-tenant/0000_durable_tenant.sql +92 -0
  503. package/migrations/durable-tenant/0001_human_task.sql +45 -0
  504. package/migrations/durable-tenant/meta/_journal.json +20 -0
  505. package/migrations/spine/0000_opaque_dispatch.sql +26 -0
  506. package/migrations/spine/meta/_journal.json +13 -0
  507. package/package.json +26 -8
@@ -1,7 +1,7 @@
1
1
  import type { ErrorService } from '../types/errors.js';
2
2
  import { PlumbusError } from './plumbus-error.js';
3
3
  export { PlumbusError } from './plumbus-error.js';
4
- export { AISecurityBlockedError, AIBudgetExceededError, DataForbiddenError, DataInternalError, DataValidationError, EncryptionConfigError, EncryptionPayloadError, } from './data-errors.js';
4
+ export { AISecurityBlockedError, AIBudgetExceededError, GovernedAiBlockedError, type GovernedAiBlockedCode, DataForbiddenError, DataInternalError, DataValidationError, EncryptionConfigError, EncryptionPayloadError, } from './data-errors.js';
5
5
  export declare class LeaseLostError extends PlumbusError {
6
6
  constructor(message: string, metadata?: Record<string, unknown>);
7
7
  }
@@ -11,6 +11,9 @@ export declare class LeaseLostError extends PlumbusError {
11
11
  * HTTP/AI calls (the DOM `fetch` maps abort to a `DOMException('AbortError')`
12
12
  * — the reason is available via `signal.reason`).
13
13
  */
14
+ export declare class BudgetExhaustedError extends PlumbusError {
15
+ constructor(executionId: string, metadata?: Record<string, unknown>);
16
+ }
14
17
  export declare class FlowCancelledError extends PlumbusError {
15
18
  constructor(executionId: string, metadata?: Record<string, unknown>);
16
19
  }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Top-level `{{key}}` fill for prompt templates.
3
+ *
4
+ * Walks the original template once. Inserted values are literal: `$`, `$'`,
5
+ * `` $` ``, `$&`, `$1`, and `{{otherKey}}` inside a value are not treated as
6
+ * JavaScript replacement patterns or as further placeholders.
7
+ */
8
+ export declare function fillPromptTemplate(template: string, input: Record<string, unknown>): {
9
+ text: string;
10
+ substitutedKeys: Set<string>;
11
+ };
12
+ //# sourceMappingURL=fill-prompt-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill-prompt-template.d.ts","sourceRoot":"","sources":["../../src/ai/fill-prompt-template.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAUhD"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Top-level `{{key}}` fill for prompt templates.
3
+ *
4
+ * Walks the original template once. Inserted values are literal: `$`, `$'`,
5
+ * `` $` ``, `$&`, `$1`, and `{{otherKey}}` inside a value are not treated as
6
+ * JavaScript replacement patterns or as further placeholders.
7
+ */
8
+ export function fillPromptTemplate(template, input) {
9
+ const substitutedKeys = new Set();
10
+ const text = template.replace(/\{\{([^{}]+)\}\}/g, (full, key) => {
11
+ if (!Object.hasOwn(input, key)) {
12
+ return full;
13
+ }
14
+ substitutedKeys.add(key);
15
+ return String(input[key]);
16
+ });
17
+ return { text, substitutedKeys };
18
+ }
19
+ //# sourceMappingURL=fill-prompt-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill-prompt-template.js","sourceRoot":"","sources":["../../src/ai/fill-prompt-template.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,KAA8B;IAE9B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,GAAW,EAAE,EAAE;QACvE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,49 @@
1
+ export type GovernedArtifactKind = 'prompt' | 'policy';
2
+ export interface GovernedArtifact {
3
+ kind: GovernedArtifactKind;
4
+ id: string;
5
+ body: string;
6
+ metadata?: Record<string, string | number | boolean>;
7
+ }
8
+ export interface PublishedGovernedArtifact extends GovernedArtifact {
9
+ digest: string;
10
+ publishedAt: string;
11
+ }
12
+ export interface GovernedArtifactStore {
13
+ publish(artifact: GovernedArtifact): PublishedGovernedArtifact;
14
+ get(digest: string): PublishedGovernedArtifact | undefined;
15
+ }
16
+ export interface FilesystemGovernedArtifactStoreConfig {
17
+ /** Host-owned directory. Created if missing. */
18
+ directory: string;
19
+ }
20
+ /** Project-relative default used by `createServer` when no store is passed. */
21
+ export declare const DEFAULT_GOVERNED_ARTIFACTS_DIRECTORY = ".plumbus/governed-artifacts";
22
+ export interface ResolveGovernedArtifactStoreOptions {
23
+ artifacts?: GovernedArtifactStore;
24
+ artifactsDirectory?: string;
25
+ cwd?: string;
26
+ }
27
+ export declare class GovernedArtifactConflictError extends Error {
28
+ constructor(message: string);
29
+ }
30
+ /** SHA-256 of the canonical artifact. The address is the content. */
31
+ export declare function digestGovernedArtifact(artifact: GovernedArtifact): string;
32
+ /**
33
+ * In-memory digest-addressed store. Republishing the same bytes is idempotent.
34
+ * A later publish of the same kind+id with different bytes is refused.
35
+ */
36
+ export declare function createMemoryGovernedArtifactStore(): GovernedArtifactStore;
37
+ /**
38
+ * Digest-addressed store on a host-owned directory. Same immutability rules as
39
+ * the in-memory store. A new process pointed at the same directory sees prior
40
+ * publishes. Error messages never include artifact bodies.
41
+ */
42
+ export declare function createFilesystemGovernedArtifactStore(config: FilesystemGovernedArtifactStoreConfig): GovernedArtifactStore;
43
+ /**
44
+ * Prefer an explicit store. Else open `artifactsDirectory` (created if missing).
45
+ * Else open `{cwd}/.plumbus/governed-artifacts` when that directory already exists.
46
+ * Omitted and no default directory: existing hosts boot unchanged.
47
+ */
48
+ export declare function resolveGovernedArtifactStore(options?: ResolveGovernedArtifactStoreOptions): GovernedArtifactStore | undefined;
49
+ //# sourceMappingURL=governed-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-artifacts.d.ts","sourceRoot":"","sources":["../../src/ai/governed-artifacts.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,GAAG,yBAAyB,CAAC;IAC/D,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;CAC5D;AAED,MAAM,WAAW,qCAAqC;IACpD,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+EAA+E;AAC/E,eAAO,MAAM,oCAAoC,gCAAgC,CAAC;AAElF,MAAM,WAAW,mCAAmC;IAClD,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,OAAO,EAAE,MAAM;CAI5B;AAaD,qEAAqE;AACrE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAEzE;AAyGD;;;GAGG;AACH,wBAAgB,iCAAiC,IAAI,qBAAqB,CAiCzE;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,qCAAqC,GAC5C,qBAAqB,CA4FvB;AAaD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,mCAAwC,GAChD,qBAAqB,GAAG,SAAS,CAenC"}
@@ -0,0 +1,277 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { digestApprovalInput } from '../approvals/digest.js';
5
+ /** Project-relative default used by `createServer` when no store is passed. */
6
+ export const DEFAULT_GOVERNED_ARTIFACTS_DIRECTORY = '.plumbus/governed-artifacts';
7
+ export class GovernedArtifactConflictError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'GovernedArtifactConflictError';
11
+ }
12
+ }
13
+ const DIGEST_PATTERN = /^[0-9a-f]{64}$/;
14
+ function canonicalArtifact(artifact) {
15
+ return {
16
+ kind: artifact.kind,
17
+ id: artifact.id,
18
+ body: artifact.body,
19
+ metadata: artifact.metadata ?? {},
20
+ };
21
+ }
22
+ /** SHA-256 of the canonical artifact. The address is the content. */
23
+ export function digestGovernedArtifact(artifact) {
24
+ return digestApprovalInput(canonicalArtifact(artifact));
25
+ }
26
+ function artifactKey(kind, id) {
27
+ return `${kind}:${id}`;
28
+ }
29
+ function immutableConflict(key) {
30
+ throw new GovernedArtifactConflictError(`Artifact "${key}" is immutable; publish a new id instead of changing the body`);
31
+ }
32
+ function preparePublish(artifact) {
33
+ const kind = artifact.kind;
34
+ const id = artifact.id.trim();
35
+ const body = artifact.body;
36
+ if (kind !== 'prompt' && kind !== 'policy') {
37
+ throw new GovernedArtifactConflictError('Artifact kind must be prompt or policy');
38
+ }
39
+ if (!id) {
40
+ throw new GovernedArtifactConflictError('Artifact id is required');
41
+ }
42
+ if (typeof body !== 'string' || body.trim() === '') {
43
+ throw new GovernedArtifactConflictError('Artifact body is required');
44
+ }
45
+ const normalized = {
46
+ kind,
47
+ id,
48
+ body,
49
+ ...(artifact.metadata ? { metadata: artifact.metadata } : {}),
50
+ };
51
+ return {
52
+ normalized,
53
+ digest: digestGovernedArtifact(normalized),
54
+ key: artifactKey(kind, id),
55
+ };
56
+ }
57
+ function errorCode(err) {
58
+ if (err && typeof err === 'object' && 'code' in err && typeof err.code === 'string') {
59
+ return err.code;
60
+ }
61
+ return undefined;
62
+ }
63
+ function keyObjectName(key) {
64
+ return createHash('sha256').update(key).digest('hex');
65
+ }
66
+ function isPublishedArtifact(value) {
67
+ if (!value || typeof value !== 'object')
68
+ return false;
69
+ const record = value;
70
+ if (record.kind !== 'prompt' && record.kind !== 'policy')
71
+ return false;
72
+ if (typeof record.id !== 'string' || typeof record.body !== 'string')
73
+ return false;
74
+ if (typeof record.digest !== 'string' || typeof record.publishedAt !== 'string')
75
+ return false;
76
+ if (record.metadata !== undefined) {
77
+ if (!record.metadata || typeof record.metadata !== 'object' || Array.isArray(record.metadata)) {
78
+ return false;
79
+ }
80
+ }
81
+ return true;
82
+ }
83
+ function assertStoredDigest(published, expectedDigest) {
84
+ if (published.digest !== expectedDigest) {
85
+ throw new GovernedArtifactConflictError('Stored artifact digest does not match its address');
86
+ }
87
+ const computed = digestGovernedArtifact({
88
+ kind: published.kind,
89
+ id: published.id,
90
+ body: published.body,
91
+ ...(published.metadata ? { metadata: published.metadata } : {}),
92
+ });
93
+ if (computed !== expectedDigest) {
94
+ throw new GovernedArtifactConflictError('Stored artifact bytes do not match their digest');
95
+ }
96
+ }
97
+ function readJsonFile(filePath) {
98
+ try {
99
+ return JSON.parse(readFileSync(filePath, 'utf-8'));
100
+ }
101
+ catch (err) {
102
+ if (errorCode(err) === 'ENOENT')
103
+ return undefined;
104
+ if (err instanceof SyntaxError) {
105
+ throw new GovernedArtifactConflictError('Stored artifact is not valid JSON');
106
+ }
107
+ throw err;
108
+ }
109
+ }
110
+ function writeJsonExclusive(filePath, value) {
111
+ try {
112
+ writeFileSync(filePath, `${JSON.stringify(value)}\n`, { encoding: 'utf-8', flag: 'wx' });
113
+ return 'created';
114
+ }
115
+ catch (err) {
116
+ if (errorCode(err) === 'EEXIST')
117
+ return 'exists';
118
+ throw err;
119
+ }
120
+ }
121
+ /**
122
+ * In-memory digest-addressed store. Republishing the same bytes is idempotent.
123
+ * A later publish of the same kind+id with different bytes is refused.
124
+ */
125
+ export function createMemoryGovernedArtifactStore() {
126
+ const byDigest = new Map();
127
+ const digestByKey = new Map();
128
+ return {
129
+ publish(artifact) {
130
+ const { normalized, digest, key } = preparePublish(artifact);
131
+ const existing = byDigest.get(digest);
132
+ if (existing) {
133
+ return existing;
134
+ }
135
+ const priorDigest = digestByKey.get(key);
136
+ if (priorDigest && priorDigest !== digest) {
137
+ immutableConflict(key);
138
+ }
139
+ const published = {
140
+ ...normalized,
141
+ digest,
142
+ publishedAt: new Date().toISOString(),
143
+ };
144
+ byDigest.set(digest, published);
145
+ digestByKey.set(key, digest);
146
+ return published;
147
+ },
148
+ get(digest) {
149
+ const trimmed = digest.trim();
150
+ if (!trimmed)
151
+ return undefined;
152
+ return byDigest.get(trimmed);
153
+ },
154
+ };
155
+ }
156
+ /**
157
+ * Digest-addressed store on a host-owned directory. Same immutability rules as
158
+ * the in-memory store. A new process pointed at the same directory sees prior
159
+ * publishes. Error messages never include artifact bodies.
160
+ */
161
+ export function createFilesystemGovernedArtifactStore(config) {
162
+ const directory = config.directory.trim();
163
+ if (!directory) {
164
+ throw new Error('Filesystem governed artifact store requires a directory');
165
+ }
166
+ const root = resolve(directory);
167
+ const artifactsDir = join(root, 'artifacts');
168
+ const keysDir = join(root, 'keys');
169
+ mkdirSync(artifactsDir, { recursive: true });
170
+ mkdirSync(keysDir, { recursive: true });
171
+ function artifactPath(digest) {
172
+ return join(artifactsDir, `${digest}.json`);
173
+ }
174
+ function keyPath(key) {
175
+ return join(keysDir, `${keyObjectName(key)}.json`);
176
+ }
177
+ function readPublished(digest) {
178
+ if (!DIGEST_PATTERN.test(digest))
179
+ return undefined;
180
+ const parsed = readJsonFile(artifactPath(digest));
181
+ if (parsed === undefined)
182
+ return undefined;
183
+ if (!isPublishedArtifact(parsed)) {
184
+ throw new GovernedArtifactConflictError('Stored artifact is missing required fields');
185
+ }
186
+ assertStoredDigest(parsed, digest);
187
+ return parsed;
188
+ }
189
+ function readKeyDigest(key) {
190
+ const parsed = readJsonFile(keyPath(key));
191
+ if (parsed === undefined)
192
+ return undefined;
193
+ if (!parsed || typeof parsed !== 'object') {
194
+ throw new GovernedArtifactConflictError('Stored artifact key is invalid');
195
+ }
196
+ const record = parsed;
197
+ if (record.key !== key || typeof record.digest !== 'string') {
198
+ throw new GovernedArtifactConflictError('Stored artifact key does not match its address');
199
+ }
200
+ if (!DIGEST_PATTERN.test(record.digest)) {
201
+ throw new GovernedArtifactConflictError('Stored artifact key digest is invalid');
202
+ }
203
+ return record.digest;
204
+ }
205
+ return {
206
+ publish(artifact) {
207
+ const { normalized, digest, key } = preparePublish(artifact);
208
+ const existing = readPublished(digest);
209
+ if (existing) {
210
+ return existing;
211
+ }
212
+ const priorDigest = readKeyDigest(key);
213
+ if (priorDigest && priorDigest !== digest) {
214
+ immutableConflict(key);
215
+ }
216
+ const published = {
217
+ ...normalized,
218
+ digest,
219
+ publishedAt: new Date().toISOString(),
220
+ };
221
+ const digestWrite = writeJsonExclusive(artifactPath(digest), published);
222
+ if (digestWrite === 'exists') {
223
+ const raced = readPublished(digest);
224
+ if (raced)
225
+ return raced;
226
+ throw new GovernedArtifactConflictError('Stored artifact digest does not match its address');
227
+ }
228
+ const keyWrite = writeJsonExclusive(keyPath(key), { key, digest });
229
+ if (keyWrite === 'exists') {
230
+ const racedDigest = readKeyDigest(key);
231
+ if (racedDigest && racedDigest !== digest) {
232
+ immutableConflict(key);
233
+ }
234
+ }
235
+ return published;
236
+ },
237
+ get(digest) {
238
+ const trimmed = digest.trim();
239
+ if (!trimmed)
240
+ return undefined;
241
+ return readPublished(trimmed);
242
+ },
243
+ };
244
+ }
245
+ function directoryExists(path) {
246
+ try {
247
+ return existsSync(path) && statSync(path).isDirectory();
248
+ }
249
+ catch (err) {
250
+ const code = err && typeof err === 'object' && 'code' in err ? err.code : undefined;
251
+ if (code === 'ENOENT')
252
+ return false;
253
+ throw err;
254
+ }
255
+ }
256
+ /**
257
+ * Prefer an explicit store. Else open `artifactsDirectory` (created if missing).
258
+ * Else open `{cwd}/.plumbus/governed-artifacts` when that directory already exists.
259
+ * Omitted and no default directory: existing hosts boot unchanged.
260
+ */
261
+ export function resolveGovernedArtifactStore(options = {}) {
262
+ if (options.artifacts)
263
+ return options.artifacts;
264
+ if (options.artifactsDirectory !== undefined) {
265
+ const directory = options.artifactsDirectory.trim();
266
+ if (!directory) {
267
+ throw new Error('Governed artifact directory is required');
268
+ }
269
+ return createFilesystemGovernedArtifactStore({ directory });
270
+ }
271
+ const cwd = options.cwd ?? process.cwd();
272
+ const directory = join(cwd, DEFAULT_GOVERNED_ARTIFACTS_DIRECTORY);
273
+ if (!directoryExists(directory))
274
+ return undefined;
275
+ return createFilesystemGovernedArtifactStore({ directory });
276
+ }
277
+ //# sourceMappingURL=governed-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-artifacts.js","sourceRoot":"","sources":["../../src/ai/governed-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AA0B7D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,oCAAoC,GAAG,6BAA6B,CAAC;AAQlF,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAExC,SAAS,iBAAiB,CAAC,QAA0B;IACnD,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE;KAClC,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,sBAAsB,CAAC,QAA0B;IAC/D,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,IAA0B,EAAE,EAAU;IACzD,OAAO,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,IAAI,6BAA6B,CACrC,aAAa,GAAG,+DAA+D,CAChF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,QAA0B;IAKhD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,IAAI,6BAA6B,CAAC,wCAAwC,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,6BAA6B,CAAC,yBAAyB,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,6BAA6B,CAAC,2BAA2B,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,UAAU,GAAqB;QACnC,IAAI;QACJ,EAAE;QACF,IAAI;QACJ,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC;IACF,OAAO;QACL,UAAU;QACV,MAAM,EAAE,sBAAsB,CAAC,UAAU,CAAC;QAC1C,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpF,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvE,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9F,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9F,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAoC,EAAE,cAAsB;IACtF,IAAI,SAAS,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACxC,MAAM,IAAI,6BAA6B,CAAC,mDAAmD,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,QAAQ,GAAG,sBAAsB,CAAC;QACtC,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC,CAAC;IACH,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QAChC,MAAM,IAAI,6BAA6B,CAAC,iDAAiD,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAClD,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,6BAA6B,CAAC,mCAAmC,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,KAAc;IAC1D,IAAI,CAAC;QACH,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACjD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC;IAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC9D,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9C,OAAO;QACL,OAAO,CAAC,QAAQ;YACd,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,WAAW,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;gBAC1C,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAED,MAAM,SAAS,GAA8B;gBAC3C,GAAG,UAAU;gBACb,MAAM;gBACN,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YACF,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAChC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,GAAG,CAAC,MAAM;YACR,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;YAC/B,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qCAAqC,CACnD,MAA6C;IAE7C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,SAAS,YAAY,CAAC,MAAc;QAClC,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,SAAS,OAAO,CAAC,GAAW;QAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,SAAS,aAAa,CAAC,MAAc;QACnC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAC;QACnD,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,6BAA6B,CAAC,4CAA4C,CAAC,CAAC;QACxF,CAAC;QACD,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,aAAa,CAAC,GAAW;QAChC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,6BAA6B,CAAC,gCAAgC,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,MAAM,GAAG,MAA6C,CAAC;QAC7D,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5D,MAAM,IAAI,6BAA6B,CAAC,gDAAgD,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,6BAA6B,CAAC,uCAAuC,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,OAAO;QACL,OAAO,CAAC,QAAQ;YACd,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,WAAW,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;gBAC1C,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAED,MAAM,SAAS,GAA8B;gBAC3C,GAAG,UAAU;gBACb,MAAM;gBACN,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;YACxE,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;gBACpC,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;gBACxB,MAAM,IAAI,6BAA6B,CACrC,mDAAmD,CACpD,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YACnE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;gBACvC,IAAI,WAAW,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;oBAC1C,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,GAAG,CAAC,MAAM;YACR,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;YAC/B,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GACR,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,CAAE,GAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAChG,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,UAA+C,EAAE;IAEjD,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,SAAS,CAAC;IAEhD,IAAI,OAAO,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,qCAAqC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,oCAAoC,CAAC,CAAC;IAClE,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,OAAO,qCAAqC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { BudgetCheckResult, BudgetConfig, CostTracker } from './cost-tracker.js';
2
+ export interface GovernedBudgetInput {
3
+ tracker?: CostTracker;
4
+ budget?: BudgetConfig;
5
+ tenantId?: string;
6
+ estimatedTokens?: number;
7
+ estimatedCostUsd?: number;
8
+ }
9
+ /**
10
+ * Fail-closed budget check for governed model calls.
11
+ *
12
+ * The existing cost tracker allows a call when dollar cost is unknown.
13
+ * Governed AI does the opposite: missing limits, missing estimates, or
14
+ * unavailable cost data refuse the call.
15
+ */
16
+ export declare function checkGovernedBudget(input: GovernedBudgetInput): BudgetCheckResult;
17
+ //# sourceMappingURL=governed-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-budget.d.ts","sourceRoot":"","sources":["../../src/ai/governed-budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEtF,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAUD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,GAAG,iBAAiB,CAiDjF"}
@@ -0,0 +1,52 @@
1
+ function hasDeclaredLimit(budget) {
2
+ return (budget.maxTokensPerRequest != null ||
3
+ budget.dailyCostLimit != null ||
4
+ budget.perTenantDailyLimit != null);
5
+ }
6
+ /**
7
+ * Fail-closed budget check for governed model calls.
8
+ *
9
+ * The existing cost tracker allows a call when dollar cost is unknown.
10
+ * Governed AI does the opposite: missing limits, missing estimates, or
11
+ * unavailable cost data refuse the call.
12
+ */
13
+ export function checkGovernedBudget(input) {
14
+ if (!input.budget || !hasDeclaredLimit(input.budget)) {
15
+ return { allowed: false, reason: 'Governed AI requires a declared budget limit' };
16
+ }
17
+ if (input.budget.maxTokensPerRequest != null && input.estimatedTokens == null) {
18
+ return { allowed: false, reason: 'Token budget cannot be checked without an estimate' };
19
+ }
20
+ if ((input.budget.dailyCostLimit != null || input.budget.perTenantDailyLimit != null) &&
21
+ input.estimatedCostUsd == null) {
22
+ return { allowed: false, reason: 'Dollar budget cannot be checked without a cost estimate' };
23
+ }
24
+ if ((input.budget.dailyCostLimit != null || input.budget.perTenantDailyLimit != null) &&
25
+ !input.tracker) {
26
+ return { allowed: false, reason: 'Dollar budget cannot be checked without a cost ledger' };
27
+ }
28
+ if (!input.tracker) {
29
+ if (input.budget.maxTokensPerRequest != null &&
30
+ input.estimatedTokens != null &&
31
+ input.estimatedTokens > input.budget.maxTokensPerRequest) {
32
+ return {
33
+ allowed: false,
34
+ reason: `Estimated tokens (${input.estimatedTokens}) exceeds per-request limit (${input.budget.maxTokensPerRequest})`,
35
+ };
36
+ }
37
+ return { allowed: true };
38
+ }
39
+ const result = input.tracker.checkBudget({
40
+ tenantId: input.tenantId,
41
+ estimatedTokens: input.estimatedTokens,
42
+ estimatedCostUsd: input.estimatedCostUsd,
43
+ });
44
+ if (!result.allowed) {
45
+ return result;
46
+ }
47
+ if (result.reason?.includes('Cost data unavailable')) {
48
+ return { allowed: false, reason: result.reason };
49
+ }
50
+ return result;
51
+ }
52
+ //# sourceMappingURL=governed-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-budget.js","sourceRoot":"","sources":["../../src/ai/governed-budget.ts"],"names":[],"mappings":"AAUA,SAAS,gBAAgB,CAAC,MAAoB;IAC5C,OAAO,CACL,MAAM,CAAC,mBAAmB,IAAI,IAAI;QAClC,MAAM,CAAC,cAAc,IAAI,IAAI;QAC7B,MAAM,CAAC,mBAAmB,IAAI,IAAI,CACnC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA0B;IAC5D,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,8CAA8C,EAAE,CAAC;IACpF,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,CAAC,mBAAmB,IAAI,IAAI,IAAI,KAAK,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC;QAC9E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,oDAAoD,EAAE,CAAC;IAC1F,CAAC;IAED,IACE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,mBAAmB,IAAI,IAAI,CAAC;QACjF,KAAK,CAAC,gBAAgB,IAAI,IAAI,EAC9B,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,yDAAyD,EAAE,CAAC;IAC/F,CAAC;IAED,IACE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,mBAAmB,IAAI,IAAI,CAAC;QACjF,CAAC,KAAK,CAAC,OAAO,EACd,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,uDAAuD,EAAE,CAAC;IAC7F,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,IACE,KAAK,CAAC,MAAM,CAAC,mBAAmB,IAAI,IAAI;YACxC,KAAK,CAAC,eAAe,IAAI,IAAI;YAC7B,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,mBAAmB,EACxD,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,qBAAqB,KAAK,CAAC,eAAe,gCAAgC,KAAK,CAAC,MAAM,CAAC,mBAAmB,GAAG;aACtH,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QACvC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;KACzC,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Host-provided model for governed AI.
3
+ *
4
+ * The host owns credentials, transport, and which models exist. The framework
5
+ * never falls back to an unregistered provider or model.
6
+ */
7
+ export interface GovernedModelPin {
8
+ providerId: string;
9
+ modelId: string;
10
+ /** Digest of a published prompt artifact. */
11
+ promptDigest: string;
12
+ /** Digest of a published policy artifact. */
13
+ policyDigest: string;
14
+ }
15
+ export interface GovernedModelRequest {
16
+ prompt: string;
17
+ system?: string;
18
+ input?: unknown;
19
+ }
20
+ export interface GovernedModelUsage {
21
+ inputTokens?: number;
22
+ outputTokens?: number;
23
+ totalTokens?: number;
24
+ }
25
+ export interface GovernedModelResult {
26
+ text: string;
27
+ usage?: GovernedModelUsage;
28
+ costUsd?: number | null;
29
+ }
30
+ export interface GovernedModel {
31
+ readonly providerId: string;
32
+ readonly modelId: string;
33
+ complete(request: GovernedModelRequest): Promise<GovernedModelResult>;
34
+ }
35
+ export interface GovernedBudgetCheckInput {
36
+ tenantId?: string;
37
+ estimatedTokens?: number;
38
+ estimatedCostUsd?: number;
39
+ pin: GovernedModelPin;
40
+ }
41
+ export interface GovernedBudgetCheckResult {
42
+ allowed: boolean;
43
+ reason?: string;
44
+ }
45
+ export interface GovernedAiHost {
46
+ /** Look up the host model for this pin. `undefined` fails closed — no fallback. */
47
+ resolveModel(pin: GovernedModelPin): Promise<GovernedModel | undefined>;
48
+ /**
49
+ * Host budget authority. Omitted, unknown, or refused spend fails closed;
50
+ * the framework will not call the model.
51
+ */
52
+ checkBudget(input: GovernedBudgetCheckInput): Promise<GovernedBudgetCheckResult>;
53
+ }
54
+ //# sourceMappingURL=governed-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-host.d.ts","sourceRoot":"","sources":["../../src/ai/governed-host.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,gBAAgB,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IACxE;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAClF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Host-provided model for governed AI.
3
+ *
4
+ * The host owns credentials, transport, and which models exist. The framework
5
+ * never falls back to an unregistered provider or model.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=governed-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-host.js","sourceRoot":"","sources":["../../src/ai/governed-host.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,41 @@
1
+ import { type ApprovalService } from '../approvals/types.js';
2
+ import type { GovernedArtifactStore, PublishedGovernedArtifact } from './governed-artifacts.js';
3
+ import type { GovernedAiHost, GovernedModelPin, GovernedModelResult } from './governed-host.js';
4
+ export interface GovernedInvokeInput {
5
+ capabilityId: string;
6
+ definitionVersion: string;
7
+ input: unknown;
8
+ pin: GovernedModelPin;
9
+ prompt: string;
10
+ estimatedTokens?: number;
11
+ estimatedCostUsd?: number;
12
+ }
13
+ export interface GovernedInvokeDeps {
14
+ host: GovernedAiHost;
15
+ approvals: ApprovalService;
16
+ artifacts: GovernedArtifactStore;
17
+ now?: () => Date;
18
+ tenantId?: string;
19
+ recordSpend?: (entry: {
20
+ pin: GovernedModelPin;
21
+ result?: GovernedModelResult;
22
+ error?: string;
23
+ }) => void | Promise<void>;
24
+ }
25
+ export interface GovernedInvokeSuccess {
26
+ text: string;
27
+ usage?: GovernedModelResult['usage'];
28
+ costUsd?: number | null;
29
+ pin: GovernedModelPin;
30
+ approvalRequestId: string;
31
+ prompt: PublishedGovernedArtifact;
32
+ policy: PublishedGovernedArtifact;
33
+ }
34
+ /** Input digest subject so review binds the call input and the exact pin. */
35
+ export declare function governedReviewSubject(input: unknown, pin: GovernedModelPin): unknown;
36
+ /**
37
+ * Call a host-provided model only after pin, human review, and budget all pass.
38
+ * Any failure throws {@link GovernedAiBlockedError} and does not call the model.
39
+ */
40
+ export declare function invokeGovernedAi(deps: GovernedInvokeDeps, input: GovernedInvokeInput): Promise<GovernedInvokeSuccess>;
41
+ //# sourceMappingURL=governed-invoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-invoke.d.ts","sourceRoot":"","sources":["../../src/ai/governed-invoke.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEnF,OAAO,KAAK,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEhG,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,gBAAgB,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,eAAe,CAAC;IAC3B,SAAS,EAAE,qBAAqB,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QACpB,GAAG,EAAE,gBAAgB,CAAC;QACtB,MAAM,CAAC,EAAE,mBAAmB,CAAC;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,gBAAgB,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,yBAAyB,CAAC;IAClC,MAAM,EAAE,yBAAyB,CAAC;CACnC;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAEpF;AA+CD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,kBAAkB,EACxB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,qBAAqB,CAAC,CA8FhC"}