@flowdular/sdk 0.1.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 (883) hide show
  1. package/.ai/agents/README.md +27 -0
  2. package/.ai/agents/module-executor.md +36 -0
  3. package/.ai/agents/reviewer.md +23 -0
  4. package/.ai/agents/sandbox/agentic-engineer.md +31 -0
  5. package/.ai/agents/sandbox/backend-engineer.md +36 -0
  6. package/.ai/agents/sandbox/business-manager.md +23 -0
  7. package/.ai/agents/sandbox/frontend-engineer.md +27 -0
  8. package/.ai/agents/sandbox/ux-designer.md +23 -0
  9. package/.ai/agents/spec-author.md +29 -0
  10. package/.ai/blueprints/add-migration/README.md +5 -0
  11. package/.ai/blueprints/add-migration/allowed-paths.yaml +23 -0
  12. package/.ai/blueprints/add-migration/blueprint.json +14 -0
  13. package/.ai/blueprints/add-migration/examples/invalid/input-destructive.json +6 -0
  14. package/.ai/blueprints/add-migration/examples/invalid/plan-unnumbered-file.json +9 -0
  15. package/.ai/blueprints/add-migration/examples/valid/input.json +6 -0
  16. package/.ai/blueprints/add-migration/examples/valid/plan.json +9 -0
  17. package/.ai/blueprints/add-migration/gates.yaml +30 -0
  18. package/.ai/blueprints/add-migration/input.schema.json +23 -0
  19. package/.ai/blueprints/add-migration/plan.schema.json +54 -0
  20. package/.ai/blueprints/add-migration/required-files.yaml +18 -0
  21. package/.ai/blueprints/add-migration/spec-requirements.yaml +13 -0
  22. package/.ai/blueprints/add-migration/steps.yaml +62 -0
  23. package/.ai/blueprints/author-spec/README.md +5 -0
  24. package/.ai/blueprints/author-spec/allowed-paths.yaml +7 -0
  25. package/.ai/blueprints/author-spec/blueprint.json +14 -0
  26. package/.ai/blueprints/author-spec/examples/invalid/input-missing-outcome.json +5 -0
  27. package/.ai/blueprints/author-spec/examples/valid/input.json +6 -0
  28. package/.ai/blueprints/author-spec/gates.yaml +13 -0
  29. package/.ai/blueprints/author-spec/input.schema.json +20 -0
  30. package/.ai/blueprints/author-spec/plan.schema.json +14 -0
  31. package/.ai/blueprints/author-spec/required-files.yaml +6 -0
  32. package/.ai/blueprints/author-spec/spec-requirements.yaml +35 -0
  33. package/.ai/blueprints/author-spec/steps.yaml +28 -0
  34. package/.ai/blueprints/author-spec/templates/module.yaml +45 -0
  35. package/.ai/blueprints/bug-fix/README.md +5 -0
  36. package/.ai/blueprints/bug-fix/allowed-paths.yaml +29 -0
  37. package/.ai/blueprints/bug-fix/blueprint.json +14 -0
  38. package/.ai/blueprints/bug-fix/examples/invalid/input-no-symptom.json +4 -0
  39. package/.ai/blueprints/bug-fix/examples/invalid/plan-no-test.json +8 -0
  40. package/.ai/blueprints/bug-fix/examples/valid/input.json +6 -0
  41. package/.ai/blueprints/bug-fix/examples/valid/plan.json +8 -0
  42. package/.ai/blueprints/bug-fix/gates.yaml +30 -0
  43. package/.ai/blueprints/bug-fix/input.schema.json +25 -0
  44. package/.ai/blueprints/bug-fix/plan.schema.json +53 -0
  45. package/.ai/blueprints/bug-fix/required-files.yaml +7 -0
  46. package/.ai/blueprints/bug-fix/spec-requirements.yaml +7 -0
  47. package/.ai/blueprints/bug-fix/steps.yaml +51 -0
  48. package/.ai/blueprints/core-extend/README.md +5 -0
  49. package/.ai/blueprints/core-extend/allowed-paths.yaml +49 -0
  50. package/.ai/blueprints/core-extend/blueprint.json +14 -0
  51. package/.ai/blueprints/core-extend/examples/invalid/input-unknown-package.json +5 -0
  52. package/.ai/blueprints/core-extend/examples/invalid/plan-missing-gates.json +7 -0
  53. package/.ai/blueprints/core-extend/examples/valid/input.json +6 -0
  54. package/.ai/blueprints/core-extend/examples/valid/plan.json +10 -0
  55. package/.ai/blueprints/core-extend/gates.yaml +16 -0
  56. package/.ai/blueprints/core-extend/input.schema.json +54 -0
  57. package/.ai/blueprints/core-extend/plan.schema.json +39 -0
  58. package/.ai/blueprints/core-extend/required-files.yaml +36 -0
  59. package/.ai/blueprints/core-extend/spec-requirements.yaml +17 -0
  60. package/.ai/blueprints/core-extend/steps.yaml +54 -0
  61. package/.ai/blueprints/edit-module/README.md +9 -0
  62. package/.ai/blueprints/edit-module/allowed-paths.yaml +27 -0
  63. package/.ai/blueprints/edit-module/blueprint.json +20 -0
  64. package/.ai/blueprints/edit-module/examples/invalid/input-unknown-change.json +5 -0
  65. package/.ai/blueprints/edit-module/examples/invalid/plan-touches-platform.json +15 -0
  66. package/.ai/blueprints/edit-module/examples/valid/input.json +5 -0
  67. package/.ai/blueprints/edit-module/examples/valid/plan.json +25 -0
  68. package/.ai/blueprints/edit-module/gates.yaml +30 -0
  69. package/.ai/blueprints/edit-module/input.schema.json +31 -0
  70. package/.ai/blueprints/edit-module/plan.schema.json +65 -0
  71. package/.ai/blueprints/edit-module/required-files.yaml +80 -0
  72. package/.ai/blueprints/edit-module/spec-requirements.yaml +15 -0
  73. package/.ai/blueprints/edit-module/steps.yaml +115 -0
  74. package/.ai/blueprints/new-module/README.md +7 -0
  75. package/.ai/blueprints/new-module/allowed-paths.yaml +27 -0
  76. package/.ai/blueprints/new-module/blueprint.json +20 -0
  77. package/.ai/blueprints/new-module/examples/invalid/input-spec-outside-modules.json +4 -0
  78. package/.ai/blueprints/new-module/examples/invalid/plan-unknown-gate.json +8 -0
  79. package/.ai/blueprints/new-module/examples/valid/input.json +5 -0
  80. package/.ai/blueprints/new-module/examples/valid/plan.json +22 -0
  81. package/.ai/blueprints/new-module/gates.yaml +30 -0
  82. package/.ai/blueprints/new-module/input.schema.json +21 -0
  83. package/.ai/blueprints/new-module/plan.schema.json +58 -0
  84. package/.ai/blueprints/new-module/required-files.yaml +73 -0
  85. package/.ai/blueprints/new-module/spec-requirements.yaml +30 -0
  86. package/.ai/blueprints/new-module/steps.yaml +138 -0
  87. package/.ai/blueprints/release/README.md +5 -0
  88. package/.ai/blueprints/release/allowed-paths.yaml +19 -0
  89. package/.ai/blueprints/release/blueprint.json +14 -0
  90. package/.ai/blueprints/release/examples/invalid/input-bad-version.json +4 -0
  91. package/.ai/blueprints/release/examples/invalid/plan-bad-branch.json +7 -0
  92. package/.ai/blueprints/release/examples/valid/input.json +5 -0
  93. package/.ai/blueprints/release/examples/valid/plan.json +20 -0
  94. package/.ai/blueprints/release/gates.yaml +20 -0
  95. package/.ai/blueprints/release/input.schema.json +24 -0
  96. package/.ai/blueprints/release/plan.schema.json +46 -0
  97. package/.ai/blueprints/release/required-files.yaml +19 -0
  98. package/.ai/blueprints/release/spec-requirements.yaml +8 -0
  99. package/.ai/blueprints/release/steps.yaml +47 -0
  100. package/.ai/blueprints/security-review/README.md +5 -0
  101. package/.ai/blueprints/security-review/allowed-paths.yaml +6 -0
  102. package/.ai/blueprints/security-review/blueprint.json +14 -0
  103. package/.ai/blueprints/security-review/examples/invalid/input-unknown-kind.json +4 -0
  104. package/.ai/blueprints/security-review/examples/invalid/plan-finding-without-scenario.json +14 -0
  105. package/.ai/blueprints/security-review/examples/valid/input.json +4 -0
  106. package/.ai/blueprints/security-review/examples/valid/plan.json +19 -0
  107. package/.ai/blueprints/security-review/gates.yaml +22 -0
  108. package/.ai/blueprints/security-review/input.schema.json +20 -0
  109. package/.ai/blueprints/security-review/plan.schema.json +65 -0
  110. package/.ai/blueprints/security-review/required-files.yaml +6 -0
  111. package/.ai/blueprints/security-review/spec-requirements.yaml +9 -0
  112. package/.ai/blueprints/security-review/steps.yaml +38 -0
  113. package/.ai/policies/capabilities.yaml +164 -0
  114. package/.ai/policies/model-routing.yaml +72 -0
  115. package/.ai/policies/path-ownership.yaml +65 -0
  116. package/.ai/policies/task-budgets.yaml +37 -0
  117. package/.ai/references/catalog/LICENSE +21 -0
  118. package/.ai/references/catalog/migrations/0001_catalog_core.down.sql +2 -0
  119. package/.ai/references/catalog/migrations/0001_catalog_core.up.sql +21 -0
  120. package/.ai/references/catalog/migrations/0002_catalog_history.down.sql +3 -0
  121. package/.ai/references/catalog/migrations/0002_catalog_history.up.sql +20 -0
  122. package/.ai/references/catalog/migrations/0003_catalog_history_service_actors.down.sql +3 -0
  123. package/.ai/references/catalog/migrations/0003_catalog_history_service_actors.up.sql +36 -0
  124. package/.ai/references/catalog/migrations/0004_catalog_idempotency_ledger.down.sql +3 -0
  125. package/.ai/references/catalog/migrations/0004_catalog_idempotency_ledger.up.sql +19 -0
  126. package/.ai/references/catalog/migrations/README.md +3 -0
  127. package/.ai/references/catalog/module.json +27 -0
  128. package/.ai/references/catalog/package.json +49 -0
  129. package/.ai/references/catalog/spec/module.yaml +86 -0
  130. package/.ai/references/catalog/src/acl/permissions.ts +6 -0
  131. package/.ai/references/catalog/src/agent/tools.ts +164 -0
  132. package/.ai/references/catalog/src/api/endpoints.ts +243 -0
  133. package/.ai/references/catalog/src/client/CatalogHistoryDrawer.tsrx +123 -0
  134. package/.ai/references/catalog/src/client/CatalogItemForm.tsrx +190 -0
  135. package/.ai/references/catalog/src/client/CatalogView.tsrx +473 -0
  136. package/.ai/references/catalog/src/client/api.ts +111 -0
  137. package/.ai/references/catalog/src/client/contribution.tsrx +61 -0
  138. package/.ai/references/catalog/src/client/index.ts +18 -0
  139. package/.ai/references/catalog/src/client/navigation-copy.ts +9 -0
  140. package/.ai/references/catalog/src/client/state.ts +24 -0
  141. package/.ai/references/catalog/src/domain/types.ts +32 -0
  142. package/.ai/references/catalog/src/domain/variables.ts +111 -0
  143. package/.ai/references/catalog/src/index.ts +31 -0
  144. package/.ai/references/catalog/src/platform.ts +35 -0
  145. package/.ai/references/catalog/src/server/index.ts +4 -0
  146. package/.ai/references/catalog/src/server/runtime.ts +86 -0
  147. package/.ai/references/catalog/src/services/catalog-service.ts +306 -0
  148. package/.ai/references/catalog/src/services/database-repository.ts +440 -0
  149. package/.ai/references/catalog/src/services/index.ts +4 -0
  150. package/.ai/references/catalog/src/services/migration.ts +171 -0
  151. package/.ai/references/catalog/src/services/repository.ts +36 -0
  152. package/.ai/references/catalog/src/services/target-idempotency.ts +59 -0
  153. package/.ai/references/catalog/tests/agent-tools.test.ts +277 -0
  154. package/.ai/references/catalog/tests/endpoints.test.ts +320 -0
  155. package/.ai/references/catalog/tests/idempotency.test.ts +297 -0
  156. package/.ai/references/catalog/tests/migrations.test.ts +149 -0
  157. package/.ai/references/catalog/tests/module.test.ts +271 -0
  158. package/.ai/references/catalog/tests/support/database.ts +76 -0
  159. package/.ai/references/catalog/translations/en.json +101 -0
  160. package/.ai/references/catalog/translations/pl.json +101 -0
  161. package/.ai/references/catalog/tsconfig.json +15 -0
  162. package/.ai/references/catalog/vitest.config.ts +16 -0
  163. package/.ai/references/catalog.provenance.json +55 -0
  164. package/.ai/skills/README.md +36 -0
  165. package/.ai/skills/agent-tool-design/SKILL.md +209 -0
  166. package/.ai/skills/auth-security-review/SKILL.md +96 -0
  167. package/.ai/skills/auto-review/SKILL.md +112 -0
  168. package/.ai/skills/bug-hunt/SKILL.md +110 -0
  169. package/.ai/skills/business-agent-design/SKILL.md +188 -0
  170. package/.ai/skills/cli-extension/SKILL.md +114 -0
  171. package/.ai/skills/core-extend/SKILL.md +104 -0
  172. package/.ai/skills/database-adapter/SKILL.md +204 -0
  173. package/.ai/skills/database-adapter/references/first-run-and-matrix.md +105 -0
  174. package/.ai/skills/migration-authoring/SKILL.md +167 -0
  175. package/.ai/skills/module-new/SKILL.md +180 -0
  176. package/.ai/skills/module-update/SKILL.md +100 -0
  177. package/.ai/skills/perf-audit/SKILL.md +105 -0
  178. package/.ai/skills/release-eject-pr/SKILL.md +113 -0
  179. package/.ai/skills/spec-approval/SKILL.md +112 -0
  180. package/.ai/skills/test-hardening/SKILL.md +86 -0
  181. package/.ai/skills/translations-i18n/SKILL.md +85 -0
  182. package/.ai/skills/ux-design/SKILL.md +97 -0
  183. package/.ai/skills/variables/SKILL.md +164 -0
  184. package/.ai/skills/workflow-development/SKILL.md +199 -0
  185. package/AGENTS.md +59 -0
  186. package/LICENSE +21 -0
  187. package/README.md +24 -0
  188. package/docs/agent-contract.md +45 -0
  189. package/docs/design-system.md +217 -0
  190. package/modules/agents/migrations/0001_agents_core.down.sql +4 -0
  191. package/modules/agents/migrations/0001_agents_core.up.sql +106 -0
  192. package/modules/agents/migrations/0002_provider_connections.down.sql +1 -0
  193. package/modules/agents/migrations/0002_provider_connections.up.sql +34 -0
  194. package/modules/agents/migrations/0003_resource_audit.down.sql +1 -0
  195. package/modules/agents/migrations/0003_resource_audit.up.sql +25 -0
  196. package/modules/agents/migrations/0004_run_grants.down.sql +1 -0
  197. package/modules/agents/migrations/0004_run_grants.up.sql +19 -0
  198. package/modules/agents/migrations/0005_long_running_limits.down.sql +2 -0
  199. package/modules/agents/migrations/0005_long_running_limits.up.sql +14 -0
  200. package/modules/agents/migrations/0006_agent_skills.down.sql +3 -0
  201. package/modules/agents/migrations/0006_agent_skills.up.sql +44 -0
  202. package/modules/agents/migrations/0007_model_readiness.down.sql +1 -0
  203. package/modules/agents/migrations/0007_model_readiness.up.sql +18 -0
  204. package/modules/agents/migrations/0008_output_limits.down.sql +2 -0
  205. package/modules/agents/migrations/0008_output_limits.up.sql +8 -0
  206. package/modules/agents/migrations/0009_agent_audit_v3.down.sql +1 -0
  207. package/modules/agents/migrations/0009_agent_audit_v3.up.sql +25 -0
  208. package/modules/agents/migrations/0012_agent_run_costs.down.sql +3 -0
  209. package/modules/agents/migrations/0012_agent_run_costs.up.sql +32 -0
  210. package/modules/agents/migrations/0013_workflow_prerequisites.down.sql +3 -0
  211. package/modules/agents/migrations/0013_workflow_prerequisites.up.sql +97 -0
  212. package/modules/agents/migrations/0014_agent_action_audit.down.sql +1 -0
  213. package/modules/agents/migrations/0014_agent_action_audit.up.sql +25 -0
  214. package/modules/agents/migrations/0015_agent_run_actors.down.sql +1 -0
  215. package/modules/agents/migrations/0015_agent_run_actors.up.sql +17 -0
  216. package/modules/agents/migrations/0016_module_owned_agents.down.sql +6 -0
  217. package/modules/agents/migrations/0016_module_owned_agents.up.sql +68 -0
  218. package/modules/agents/migrations/0017_agent_authorization_subjects.down.sql +2 -0
  219. package/modules/agents/migrations/0017_agent_authorization_subjects.up.sql +18 -0
  220. package/modules/agents/migrations/0018_agent_child_tenant_isolation.down.sql +12 -0
  221. package/modules/agents/migrations/0018_agent_child_tenant_isolation.up.sql +88 -0
  222. package/modules/agents/migrations/0019_background_recovery_grants.down.sql +6 -0
  223. package/modules/agents/migrations/0019_background_recovery_grants.up.sql +17 -0
  224. package/modules/agents/migrations/0020_provider_summary_role.down.sql +2 -0
  225. package/modules/agents/migrations/0020_provider_summary_role.up.sql +17 -0
  226. package/modules/agents/migrations/0021_agents_agent_reconciliation_role.down.sql +4 -0
  227. package/modules/agents/migrations/0021_agents_agent_reconciliation_role.up.sql +7 -0
  228. package/modules/agents/migrations/README.md +39 -0
  229. package/modules/agents/module.json +38 -0
  230. package/modules/agents/package.json +56 -0
  231. package/modules/agents/spec/module.yaml +271 -0
  232. package/modules/agents/spec/procedures-compatibility.md +63 -0
  233. package/modules/agents/src/acl/permissions.ts +13 -0
  234. package/modules/agents/src/api/endpoints.ts +1122 -0
  235. package/modules/agents/src/cli/commands.json +29 -0
  236. package/modules/agents/src/cli/index.ts +162 -0
  237. package/modules/agents/src/client/AgentDashboardWidget.tsrx +32 -0
  238. package/modules/agents/src/client/AgentDefinitionForm.tsrx +362 -0
  239. package/modules/agents/src/client/AgentDefinitionList.tsrx +127 -0
  240. package/modules/agents/src/client/AgentPlaygroundView.tsrx +246 -0
  241. package/modules/agents/src/client/AgentProcedureForm.tsrx +182 -0
  242. package/modules/agents/src/client/AgentProcedureList.tsrx +118 -0
  243. package/modules/agents/src/client/AgentProceduresView.tsrx +253 -0
  244. package/modules/agents/src/client/AgentProvidersView.tsrx +248 -0
  245. package/modules/agents/src/client/AgentRunsView.tsrx +304 -0
  246. package/modules/agents/src/client/AgentUsageView.tsrx +233 -0
  247. package/modules/agents/src/client/AgentsView.tsrx +339 -0
  248. package/modules/agents/src/client/ModuleAgentBindingForm.tsrx +239 -0
  249. package/modules/agents/src/client/ModuleAgentList.tsrx +122 -0
  250. package/modules/agents/src/client/ProviderConnectionForm.tsrx +273 -0
  251. package/modules/agents/src/client/ProviderConnectionList.tsrx +229 -0
  252. package/modules/agents/src/client/ProviderModelEditor.tsrx +313 -0
  253. package/modules/agents/src/client/RunTimeline.tsrx +212 -0
  254. package/modules/agents/src/client/agents.css +349 -0
  255. package/modules/agents/src/client/api.ts +373 -0
  256. package/modules/agents/src/client/contribution.tsrx +181 -0
  257. package/modules/agents/src/client/index.ts +21 -0
  258. package/modules/agents/src/client/presentation.ts +162 -0
  259. package/modules/agents/src/client/state.ts +100 -0
  260. package/modules/agents/src/domain/context-variables.ts +58 -0
  261. package/modules/agents/src/domain/run-timeline.ts +145 -0
  262. package/modules/agents/src/domain/types.ts +481 -0
  263. package/modules/agents/src/index.ts +88 -0
  264. package/modules/agents/src/platform.ts +82 -0
  265. package/modules/agents/src/server/action-execution.ts +811 -0
  266. package/modules/agents/src/server/define-agent.ts +170 -0
  267. package/modules/agents/src/server/index.ts +67 -0
  268. package/modules/agents/src/server/run-execution.ts +231 -0
  269. package/modules/agents/src/server/run-queue.ts +96 -0
  270. package/modules/agents/src/server/runtime.ts +448 -0
  271. package/modules/agents/src/server/tools.ts +18 -0
  272. package/modules/agents/src/services/agent-service.ts +2167 -0
  273. package/modules/agents/src/services/credential-vault.ts +133 -0
  274. package/modules/agents/src/services/database-repository.ts +2786 -0
  275. package/modules/agents/src/services/index.ts +33 -0
  276. package/modules/agents/src/services/migration.ts +1152 -0
  277. package/modules/agents/src/services/module-agent-preflight.ts +76 -0
  278. package/modules/agents/src/services/outbound-policy.ts +136 -0
  279. package/modules/agents/src/services/provider-broker.ts +80 -0
  280. package/modules/agents/src/services/provider-repository.ts +589 -0
  281. package/modules/agents/src/services/provider-service.ts +968 -0
  282. package/modules/agents/src/services/repository.ts +294 -0
  283. package/modules/agents/src/services/run-grant.ts +305 -0
  284. package/modules/agents/src/services/usage-service.ts +119 -0
  285. package/modules/agents/src/services/worker.ts +442 -0
  286. package/modules/agents/src/settings.ts +244 -0
  287. package/modules/agents/translations/en.json +403 -0
  288. package/modules/agents/translations/pl.json +403 -0
  289. package/modules/auth/README.md +215 -0
  290. package/modules/auth/migrations/0001_auth_core.up.sql +108 -0
  291. package/modules/auth/migrations/0002_bundled_module_scopes.up.sql +26 -0
  292. package/modules/auth/migrations/0003_agent_core_scopes.up.sql +12 -0
  293. package/modules/auth/migrations/0004_owner_only_development_scopes.up.sql +8 -0
  294. package/modules/auth/migrations/0005_agent_provider_scopes.up.sql +13 -0
  295. package/modules/auth/migrations/0006_tenant_slug.up.sql +6 -0
  296. package/modules/auth/migrations/0007_sandbox_scopes.up.sql +13 -0
  297. package/modules/auth/migrations/0008_api_tokens.up.sql +43 -0
  298. package/modules/auth/migrations/0009_module_settings.up.sql +24 -0
  299. package/modules/auth/migrations/0010_sign_in_lockout.up.sql +11 -0
  300. package/modules/auth/migrations/0011_session_ids_and_password_reset.up.sql +7 -0
  301. package/modules/auth/migrations/0012_roles.up.sql +31 -0
  302. package/modules/auth/migrations/0013_audit.up.sql +27 -0
  303. package/modules/auth/migrations/0014_audit_actor.up.sql +4 -0
  304. package/modules/auth/migrations/0015_account_security.up.sql +81 -0
  305. package/modules/auth/module.json +26 -0
  306. package/modules/auth/package.json +61 -0
  307. package/modules/auth/spec/module.yaml +190 -0
  308. package/modules/auth/src/acl/scopes.ts +86 -0
  309. package/modules/auth/src/api/attempt-limiter.ts +42 -0
  310. package/modules/auth/src/api/client-address.ts +14 -0
  311. package/modules/auth/src/api/cookies.ts +52 -0
  312. package/modules/auth/src/api/origin.ts +40 -0
  313. package/modules/auth/src/cli/commands.json +74 -0
  314. package/modules/auth/src/cli/database.ts +51 -0
  315. package/modules/auth/src/cli/greenfield.ts +173 -0
  316. package/modules/auth/src/cli/index.ts +184 -0
  317. package/modules/auth/src/cli/provisioning.ts +211 -0
  318. package/modules/auth/src/client/AuthBackdrop.tsrx +137 -0
  319. package/modules/auth/src/client/AuthenticationCore.tsrx +630 -0
  320. package/modules/auth/src/client/PasswordChangeRequired.tsrx +145 -0
  321. package/modules/auth/src/client/PublicAuthFlows.tsrx +379 -0
  322. package/modules/auth/src/client/api.ts +464 -0
  323. package/modules/auth/src/client/audit/AuditView.tsrx +357 -0
  324. package/modules/auth/src/client/audit/api.ts +164 -0
  325. package/modules/auth/src/client/audit/audit-columns.tsrx +47 -0
  326. package/modules/auth/src/client/audit/audit-row.ts +38 -0
  327. package/modules/auth/src/client/auth.css +483 -0
  328. package/modules/auth/src/client/contribution.tsrx +100 -0
  329. package/modules/auth/src/client/index.ts +32 -0
  330. package/modules/auth/src/client/security/SecurityView.tsrx +253 -0
  331. package/modules/auth/src/client/settings/PreferencesCard.tsrx +65 -0
  332. package/modules/auth/src/client/settings/SettingsView.tsrx +212 -0
  333. package/modules/auth/src/client/settings/WorkspaceCard.tsrx +59 -0
  334. package/modules/auth/src/client/settings/api.ts +115 -0
  335. package/modules/auth/src/client/slug.ts +26 -0
  336. package/modules/auth/src/client/state.ts +115 -0
  337. package/modules/auth/src/client/tokens/ApiTokenForm.tsrx +153 -0
  338. package/modules/auth/src/client/tokens/ApiTokenSecret.tsrx +35 -0
  339. package/modules/auth/src/client/tokens/ApiTokensView.tsrx +216 -0
  340. package/modules/auth/src/client/tokens/api.ts +59 -0
  341. package/modules/auth/src/client/tokens/state.ts +26 -0
  342. package/modules/auth/src/client/tokens/token-columns.tsrx +64 -0
  343. package/modules/auth/src/client/translations.ts +23 -0
  344. package/modules/auth/src/domain/types.ts +152 -0
  345. package/modules/auth/src/index.ts +42 -0
  346. package/modules/auth/src/middleware/authentication.ts +97 -0
  347. package/modules/auth/src/platform.ts +0 -0
  348. package/modules/auth/src/server/actor.ts +12 -0
  349. package/modules/auth/src/server/audit-endpoints.ts +51 -0
  350. package/modules/auth/src/server/composition.ts +9 -0
  351. package/modules/auth/src/server/endpoints.ts +893 -0
  352. package/modules/auth/src/server/http.ts +153 -0
  353. package/modules/auth/src/server/index.ts +37 -0
  354. package/modules/auth/src/server/roles-endpoints.ts +120 -0
  355. package/modules/auth/src/server/runtime.ts +705 -0
  356. package/modules/auth/src/server/session-endpoints.ts +86 -0
  357. package/modules/auth/src/server/session-security.ts +62 -0
  358. package/modules/auth/src/server/token-endpoints.ts +106 -0
  359. package/modules/auth/src/services/auth-service-error.ts +11 -0
  360. package/modules/auth/src/services/auth-service.ts +2309 -0
  361. package/modules/auth/src/services/database-repository.ts +1825 -0
  362. package/modules/auth/src/services/mail-delivery.ts +27 -0
  363. package/modules/auth/src/services/migration.ts +591 -0
  364. package/modules/auth/src/services/password.ts +115 -0
  365. package/modules/auth/src/services/repository.ts +395 -0
  366. package/modules/auth/src/services/settings-store.ts +92 -0
  367. package/modules/auth/src/services/totp.ts +135 -0
  368. package/modules/auth/src/services/validation.ts +186 -0
  369. package/modules/auth/src/settings.ts +150 -0
  370. package/modules/auth/translations/en.json +263 -0
  371. package/modules/auth/translations/pl.json +263 -0
  372. package/modules/automations/migrations/0001_automations_core.down.sql +10 -0
  373. package/modules/automations/migrations/0001_automations_core.up.sql +76 -0
  374. package/modules/automations/migrations/0002_automations_targets.down.sql +9 -0
  375. package/modules/automations/migrations/0002_automations_targets.up.sql +37 -0
  376. package/modules/automations/migrations/0003_automations_scheduler_role.down.sql +3 -0
  377. package/modules/automations/migrations/0003_automations_scheduler_role.up.sql +19 -0
  378. package/modules/automations/migrations/0004_automations_trigger_routing_role.down.sql +3 -0
  379. package/modules/automations/migrations/0004_automations_trigger_routing_role.up.sql +18 -0
  380. package/modules/automations/migrations/README.md +3 -0
  381. package/modules/automations/module.json +31 -0
  382. package/modules/automations/package.json +55 -0
  383. package/modules/automations/spec/module.yaml +93 -0
  384. package/modules/automations/src/acl/permissions.ts +10 -0
  385. package/modules/automations/src/api/endpoints.ts +480 -0
  386. package/modules/automations/src/client/AutomationScheduleForm.tsrx +218 -0
  387. package/modules/automations/src/client/AutomationSchedulesView.tsrx +339 -0
  388. package/modules/automations/src/client/AutomationTriggerForm.tsrx +190 -0
  389. package/modules/automations/src/client/AutomationTriggersView.tsrx +329 -0
  390. package/modules/automations/src/client/api.ts +148 -0
  391. package/modules/automations/src/client/contribution.tsrx +70 -0
  392. package/modules/automations/src/client/index.ts +20 -0
  393. package/modules/automations/src/client/presentation.ts +38 -0
  394. package/modules/automations/src/client/state.ts +40 -0
  395. package/modules/automations/src/client/target-selection.ts +44 -0
  396. package/modules/automations/src/domain/cadence.ts +44 -0
  397. package/modules/automations/src/domain/types.ts +110 -0
  398. package/modules/automations/src/domain/variables.ts +178 -0
  399. package/modules/automations/src/index.ts +39 -0
  400. package/modules/automations/src/platform.ts +73 -0
  401. package/modules/automations/src/server/execution.ts +77 -0
  402. package/modules/automations/src/server/index.ts +39 -0
  403. package/modules/automations/src/server/runtime.ts +218 -0
  404. package/modules/automations/src/server/targets.ts +116 -0
  405. package/modules/automations/src/services/automations-service.ts +10 -0
  406. package/modules/automations/src/services/database-repository.ts +763 -0
  407. package/modules/automations/src/services/index.ts +5 -0
  408. package/modules/automations/src/services/migration.ts +223 -0
  409. package/modules/automations/src/services/repository.ts +119 -0
  410. package/modules/automations/src/services/schedule-service.ts +837 -0
  411. package/modules/automations/src/services/secret-vault.ts +124 -0
  412. package/modules/automations/src/services/trigger-service.ts +648 -0
  413. package/modules/automations/src/settings.ts +69 -0
  414. package/modules/automations/translations/en.json +126 -0
  415. package/modules/automations/translations/pl.json +126 -0
  416. package/modules/automations-workflows-integration/module.json +27 -0
  417. package/modules/automations-workflows-integration/package.json +48 -0
  418. package/modules/automations-workflows-integration/spec/module.yaml +93 -0
  419. package/modules/automations-workflows-integration/src/index.ts +14 -0
  420. package/modules/automations-workflows-integration/src/platform.ts +24 -0
  421. package/modules/automations-workflows-integration/src/server/adapter.ts +272 -0
  422. package/modules/automations-workflows-integration/src/server/index.ts +11 -0
  423. package/modules/automations-workflows-integration/src/server/tools.ts +0 -0
  424. package/modules/automations-workflows-integration/translations/en.json +21 -0
  425. package/modules/automations-workflows-integration/translations/pl.json +21 -0
  426. package/modules/profile/migrations/0001_profile_core.down.sql +1 -0
  427. package/modules/profile/migrations/0001_profile_core.up.sql +13 -0
  428. package/modules/profile/migrations/0002_profile_language.down.sql +1 -0
  429. package/modules/profile/migrations/0002_profile_language.up.sql +12 -0
  430. package/modules/profile/migrations/README.md +3 -0
  431. package/modules/profile/module.json +23 -0
  432. package/modules/profile/package.json +55 -0
  433. package/modules/profile/spec/module.yaml +136 -0
  434. package/modules/profile/src/acl/permissions.ts +5 -0
  435. package/modules/profile/src/api/endpoints.ts +184 -0
  436. package/modules/profile/src/client/DisplayNameCard.tsrx +59 -0
  437. package/modules/profile/src/client/LanguageCard.tsrx +89 -0
  438. package/modules/profile/src/client/PasswordCard.tsrx +79 -0
  439. package/modules/profile/src/client/ProfileView.tsrx +192 -0
  440. package/modules/profile/src/client/SessionsCard.tsrx +158 -0
  441. package/modules/profile/src/client/api.ts +134 -0
  442. package/modules/profile/src/client/contribution.tsrx +61 -0
  443. package/modules/profile/src/client/index.ts +15 -0
  444. package/modules/profile/src/client/password.ts +41 -0
  445. package/modules/profile/src/client/sessions-api.ts +52 -0
  446. package/modules/profile/src/client/state.ts +23 -0
  447. package/modules/profile/src/domain/types.ts +21 -0
  448. package/modules/profile/src/index.ts +21 -0
  449. package/modules/profile/src/platform.ts +23 -0
  450. package/modules/profile/src/server/index.ts +7 -0
  451. package/modules/profile/src/server/runtime.ts +84 -0
  452. package/modules/profile/src/services/database-repository.ts +154 -0
  453. package/modules/profile/src/services/index.ts +6 -0
  454. package/modules/profile/src/services/migration.ts +58 -0
  455. package/modules/profile/src/services/profile-service.ts +114 -0
  456. package/modules/profile/src/services/repository.ts +13 -0
  457. package/modules/profile/translations/en.json +58 -0
  458. package/modules/profile/translations/pl.json +58 -0
  459. package/modules/sandbox/migrations/0001_sandbox_core.down.sql +6 -0
  460. package/modules/sandbox/migrations/0001_sandbox_core.up.sql +70 -0
  461. package/modules/sandbox/migrations/0002_sandbox_session_lifecycle.down.sql +36 -0
  462. package/modules/sandbox/migrations/0002_sandbox_session_lifecycle.up.sql +37 -0
  463. package/modules/sandbox/migrations/README.md +7 -0
  464. package/modules/sandbox/module.json +31 -0
  465. package/modules/sandbox/package.json +56 -0
  466. package/modules/sandbox/spec/module.yaml +111 -0
  467. package/modules/sandbox/src/acl/permissions.ts +18 -0
  468. package/modules/sandbox/src/api/endpoints.ts +439 -0
  469. package/modules/sandbox/src/cli/commands.json +84 -0
  470. package/modules/sandbox/src/cli/index.ts +450 -0
  471. package/modules/sandbox/src/client/SandboxAccessView.tsrx +191 -0
  472. package/modules/sandbox/src/client/SandboxGrantForm.tsrx +134 -0
  473. package/modules/sandbox/src/client/SandboxGrantList.tsrx +83 -0
  474. package/modules/sandbox/src/client/SandboxSessionList.tsrx +56 -0
  475. package/modules/sandbox/src/client/api.ts +87 -0
  476. package/modules/sandbox/src/client/contribution.tsrx +47 -0
  477. package/modules/sandbox/src/client/index.ts +18 -0
  478. package/modules/sandbox/src/client/presentation.ts +47 -0
  479. package/modules/sandbox/src/client/state.ts +20 -0
  480. package/modules/sandbox/src/domain/types.ts +125 -0
  481. package/modules/sandbox/src/index.ts +33 -0
  482. package/modules/sandbox/src/platform.ts +28 -0
  483. package/modules/sandbox/src/server/index.ts +20 -0
  484. package/modules/sandbox/src/server/runtime.ts +119 -0
  485. package/modules/sandbox/src/services/database-repository.ts +567 -0
  486. package/modules/sandbox/src/services/directory.ts +33 -0
  487. package/modules/sandbox/src/services/index.ts +19 -0
  488. package/modules/sandbox/src/services/migration.ts +145 -0
  489. package/modules/sandbox/src/services/repository.ts +55 -0
  490. package/modules/sandbox/src/services/sandbox-service-error.ts +10 -0
  491. package/modules/sandbox/src/services/sandbox-service.ts +533 -0
  492. package/modules/sandbox/translations/en.json +77 -0
  493. package/modules/sandbox/translations/pl.json +77 -0
  494. package/modules/system/module.json +18 -0
  495. package/modules/system/package.json +56 -0
  496. package/modules/system/spec/module.yaml +104 -0
  497. package/modules/system/src/acl/permissions.ts +10 -0
  498. package/modules/system/src/client/ModuleSettingRow.tsrx +191 -0
  499. package/modules/system/src/client/ModuleSettingsSection.tsrx +155 -0
  500. package/modules/system/src/client/ModulesView.tsrx +241 -0
  501. package/modules/system/src/client/api.ts +36 -0
  502. package/modules/system/src/client/contribution.tsrx +48 -0
  503. package/modules/system/src/client/index.ts +26 -0
  504. package/modules/system/src/client/module-columns.tsrx +66 -0
  505. package/modules/system/src/client/overview-api.ts +30 -0
  506. package/modules/system/src/client/setting-copy.ts +30 -0
  507. package/modules/system/src/client/settings-api.ts +57 -0
  508. package/modules/system/src/client/state.ts +16 -0
  509. package/modules/system/src/index.ts +11 -0
  510. package/modules/system/src/platform.ts +11 -0
  511. package/modules/system/src/server/endpoints.ts +372 -0
  512. package/modules/system/src/server/index.ts +11 -0
  513. package/modules/system/src/server/module-catalog.ts +117 -0
  514. package/modules/system/translations/en.json +64 -0
  515. package/modules/system/translations/pl.json +64 -0
  516. package/modules/users/migrations/README.md +3 -0
  517. package/modules/users/module.json +27 -0
  518. package/modules/users/package.json +54 -0
  519. package/modules/users/spec/module.yaml +79 -0
  520. package/modules/users/src/acl/permissions.ts +6 -0
  521. package/modules/users/src/api/endpoints.ts +222 -0
  522. package/modules/users/src/client/InviteMemberForm.tsrx +62 -0
  523. package/modules/users/src/client/MemberDrawer.tsrx +298 -0
  524. package/modules/users/src/client/RoleForm.tsrx +140 -0
  525. package/modules/users/src/client/RolesView.tsrx +288 -0
  526. package/modules/users/src/client/UserAccountForm.tsrx +86 -0
  527. package/modules/users/src/client/UsersView.tsrx +486 -0
  528. package/modules/users/src/client/api.ts +172 -0
  529. package/modules/users/src/client/contribution.tsrx +92 -0
  530. package/modules/users/src/client/index.ts +19 -0
  531. package/modules/users/src/client/member-columns.tsrx +52 -0
  532. package/modules/users/src/client/roles-api.ts +90 -0
  533. package/modules/users/src/client/state.ts +42 -0
  534. package/modules/users/src/index.ts +27 -0
  535. package/modules/users/src/platform.ts +11 -0
  536. package/modules/users/src/services/index.ts +2 -0
  537. package/modules/users/src/services/users-service.ts +142 -0
  538. package/modules/users/translations/en.json +133 -0
  539. package/modules/users/translations/pl.json +133 -0
  540. package/modules/workflows/migrations/0001_workflows_core.down.sql +19 -0
  541. package/modules/workflows/migrations/0001_workflows_core.up.sql +228 -0
  542. package/modules/workflows/migrations/0002_workflows_authorization_subject.down.sql +1 -0
  543. package/modules/workflows/migrations/0002_workflows_authorization_subject.up.sql +9 -0
  544. package/modules/workflows/migrations/0003_workflows_worker_role.up.sql +34 -0
  545. package/modules/workflows/migrations/README.md +7 -0
  546. package/modules/workflows/module.json +31 -0
  547. package/modules/workflows/package.json +55 -0
  548. package/modules/workflows/spec/module.yaml +227 -0
  549. package/modules/workflows/src/acl/permissions.ts +10 -0
  550. package/modules/workflows/src/api/endpoints.ts +852 -0
  551. package/modules/workflows/src/client/WorkflowCanvas.tsrx +819 -0
  552. package/modules/workflows/src/client/WorkflowCreateForm.tsrx +111 -0
  553. package/modules/workflows/src/client/WorkflowEditor.tsrx +443 -0
  554. package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +169 -0
  555. package/modules/workflows/src/client/WorkflowFixtureDrawer.tsrx +206 -0
  556. package/modules/workflows/src/client/WorkflowInputForm.tsrx +125 -0
  557. package/modules/workflows/src/client/WorkflowInputSchemaEditor.tsrx +185 -0
  558. package/modules/workflows/src/client/WorkflowInspector.tsrx +471 -0
  559. package/modules/workflows/src/client/WorkflowLiveConfirmation.tsrx +67 -0
  560. package/modules/workflows/src/client/WorkflowMappingEditor.tsrx +283 -0
  561. package/modules/workflows/src/client/WorkflowNodePalette.tsrx +50 -0
  562. package/modules/workflows/src/client/WorkflowPointerField.tsrx +178 -0
  563. package/modules/workflows/src/client/WorkflowRevisionReview.tsrx +49 -0
  564. package/modules/workflows/src/client/WorkflowRunInspector.tsrx +143 -0
  565. package/modules/workflows/src/client/WorkflowTestPanel.tsrx +109 -0
  566. package/modules/workflows/src/client/WorkflowValidationPanel.tsrx +139 -0
  567. package/modules/workflows/src/client/WorkflowsView.tsrx +1060 -0
  568. package/modules/workflows/src/client/api.ts +312 -0
  569. package/modules/workflows/src/client/canvas-model.ts +472 -0
  570. package/modules/workflows/src/client/connected-node.ts +71 -0
  571. package/modules/workflows/src/client/contribution.tsrx +57 -0
  572. package/modules/workflows/src/client/create-model.ts +15 -0
  573. package/modules/workflows/src/client/draft-repair.ts +86 -0
  574. package/modules/workflows/src/client/index.ts +19 -0
  575. package/modules/workflows/src/client/input-model.ts +124 -0
  576. package/modules/workflows/src/client/mapping-model.ts +110 -0
  577. package/modules/workflows/src/client/pointer-model.ts +123 -0
  578. package/modules/workflows/src/client/presentation.ts +62 -0
  579. package/modules/workflows/src/client/run-actions.ts +19 -0
  580. package/modules/workflows/src/client/state.ts +57 -0
  581. package/modules/workflows/src/client/viewport.ts +107 -0
  582. package/modules/workflows/src/client/workflows.css +899 -0
  583. package/modules/workflows/src/domain/events.ts +399 -0
  584. package/modules/workflows/src/domain/graph.ts +1136 -0
  585. package/modules/workflows/src/domain/types.ts +563 -0
  586. package/modules/workflows/src/index.ts +27 -0
  587. package/modules/workflows/src/platform.ts +49 -0
  588. package/modules/workflows/src/server/index.ts +13 -0
  589. package/modules/workflows/src/server/runtime.ts +266 -0
  590. package/modules/workflows/src/services/cursor-codec.ts +62 -0
  591. package/modules/workflows/src/services/database-repository.ts +2407 -0
  592. package/modules/workflows/src/services/index.ts +6 -0
  593. package/modules/workflows/src/services/migration.ts +375 -0
  594. package/modules/workflows/src/services/payload-codec.ts +264 -0
  595. package/modules/workflows/src/services/repository.ts +285 -0
  596. package/modules/workflows/src/services/simulation.ts +359 -0
  597. package/modules/workflows/src/services/worker.ts +1196 -0
  598. package/modules/workflows/src/services/workflows-service.ts +1395 -0
  599. package/modules/workflows/translations/en.json +348 -0
  600. package/modules/workflows/translations/pl.json +348 -0
  601. package/modules.json +41 -0
  602. package/package.json +125 -0
  603. package/packages/ai-provider/package.json +46 -0
  604. package/packages/ai-provider/src/catalog.ts +102 -0
  605. package/packages/ai-provider/src/errors.ts +110 -0
  606. package/packages/ai-provider/src/index.ts +33 -0
  607. package/packages/ai-provider/src/model.ts +198 -0
  608. package/packages/ai-provider/src/pricing.ts +73 -0
  609. package/packages/cli-protocol/package.json +40 -0
  610. package/packages/cli-protocol/src/index.ts +113 -0
  611. package/packages/client/package.json +46 -0
  612. package/packages/client/src/ApplicationShell.tsrx +374 -0
  613. package/packages/client/src/contributions.ts +172 -0
  614. package/packages/client/src/i18n/index.ts +30 -0
  615. package/packages/client/src/i18n/locale.ts +25 -0
  616. package/packages/client/src/i18n/locales/en.json +66 -0
  617. package/packages/client/src/i18n/locales/pl.json +66 -0
  618. package/packages/client/src/i18n/runtime.ts +201 -0
  619. package/packages/client/src/i18n/translations.ts +88 -0
  620. package/packages/client/src/index.ts +55 -0
  621. package/packages/client/src/routing.ts +9 -0
  622. package/packages/client/src/shell/BrandMark.tsrx +10 -0
  623. package/packages/client/src/shell/CommandPalette.tsrx +79 -0
  624. package/packages/client/src/shell/ContributionOutlets.tsrx +31 -0
  625. package/packages/client/src/shell/DashboardView.tsrx +60 -0
  626. package/packages/client/src/shell/MobileHeader.tsrx +24 -0
  627. package/packages/client/src/shell/OrganizationSwitcher.tsrx +100 -0
  628. package/packages/client/src/shell/OverviewCharts.tsrx +167 -0
  629. package/packages/client/src/shell/PrimaryNavigation.tsrx +75 -0
  630. package/packages/client/src/shell/Sidebar.tsrx +76 -0
  631. package/packages/client/src/shell/Topbar.tsrx +44 -0
  632. package/packages/client/src/shell/UserMenu.tsrx +103 -0
  633. package/packages/client/src/shell/WorkspaceContent.tsrx +30 -0
  634. package/packages/client/src/shell/identity.ts +12 -0
  635. package/packages/client/src/shell/navigation.ts +68 -0
  636. package/packages/client/src/shell/shell.css +734 -0
  637. package/packages/client/src/shell/types.ts +29 -0
  638. package/packages/client/src/state.ts +63 -0
  639. package/packages/client/src/web.ts +39 -0
  640. package/packages/coding-agent/package.json +44 -0
  641. package/packages/coding-agent/src/drivers/byok.ts +322 -0
  642. package/packages/coding-agent/src/drivers/claude-code.ts +290 -0
  643. package/packages/coding-agent/src/drivers/codex.ts +281 -0
  644. package/packages/coding-agent/src/index.ts +56 -0
  645. package/packages/coding-agent/src/registry.ts +119 -0
  646. package/packages/coding-agent/src/roles/contract.ts +60 -0
  647. package/packages/coding-agent/src/roles/defaults.ts +134 -0
  648. package/packages/coding-agent/src/roles/handoff.ts +41 -0
  649. package/packages/coding-agent/src/roles/registry.ts +156 -0
  650. package/packages/coding-agent/src/roles/skills.ts +72 -0
  651. package/packages/coding-agent/src/roles/sync.ts +88 -0
  652. package/packages/coding-agent/src/types.ts +102 -0
  653. package/packages/coding-agent/src/workspace.ts +275 -0
  654. package/packages/contracts/package.json +38 -0
  655. package/packages/contracts/schemas/blueprint.schema.json +48 -0
  656. package/packages/contracts/schemas/cli-extension.schema.json +90 -0
  657. package/packages/contracts/schemas/module-artifact.schema.json +82 -0
  658. package/packages/contracts/schemas/module-catalog.schema.json +48 -0
  659. package/packages/contracts/schemas/module-spec.schema.json +111 -0
  660. package/packages/contracts/schemas/module.schema.json +156 -0
  661. package/packages/contracts/schemas/platform-spec.schema.json +17 -0
  662. package/packages/contracts/schemas/project.schema.json +270 -0
  663. package/packages/contracts/src/index.ts +191 -0
  664. package/packages/contracts/src/module-distribution.ts +47 -0
  665. package/packages/contracts/src/schemas.ts +18 -0
  666. package/packages/contracts/src/variables.ts +156 -0
  667. package/packages/contracts/src/web.ts +60 -0
  668. package/packages/database/package.json +43 -0
  669. package/packages/database/src/contracts.ts +399 -0
  670. package/packages/database/src/index.ts +112 -0
  671. package/packages/database/src/migrations.ts +444 -0
  672. package/packages/database/src/postgresql.ts +517 -0
  673. package/packages/database/src/provider.ts +639 -0
  674. package/packages/database/src/record-history.ts +201 -0
  675. package/packages/database/src/registry.ts +265 -0
  676. package/packages/database/src/reset.ts +87 -0
  677. package/packages/database-pglite/package.json +42 -0
  678. package/packages/database-pglite/src/driver.ts +168 -0
  679. package/packages/database-pglite/src/index.ts +2 -0
  680. package/packages/database-testing/package.json +44 -0
  681. package/packages/database-testing/src/index.ts +8 -0
  682. package/packages/database-testing/src/pglite.ts +124 -0
  683. package/packages/database-testing/src/postgres.ts +184 -0
  684. package/packages/database-testing/src/provider.ts +43 -0
  685. package/packages/database-testing/src/vitest-preset.ts +23 -0
  686. package/packages/dev-console/README.md +6 -0
  687. package/packages/dev-console/package.json +38 -0
  688. package/packages/dev-console/src/index.mjs +220 -0
  689. package/packages/harness/package.json +47 -0
  690. package/packages/harness/schemas/task-packet.schema.json +48 -0
  691. package/packages/harness/src/catalog.ts +24 -0
  692. package/packages/harness/src/errors.ts +9 -0
  693. package/packages/harness/src/index.ts +53 -0
  694. package/packages/harness/src/preamble.ts +31 -0
  695. package/packages/harness/src/runtime.ts +833 -0
  696. package/packages/harness/src/task-packet.ts +86 -0
  697. package/packages/harness/src/tool-adapters.ts +106 -0
  698. package/packages/harness/src/tool-contract.ts +242 -0
  699. package/packages/harness/src/vercel-ai-provider.ts +198 -0
  700. package/packages/kernel/package.json +44 -0
  701. package/packages/kernel/src/acl.ts +20 -0
  702. package/packages/kernel/src/actor.ts +139 -0
  703. package/packages/kernel/src/agent-registry.ts +81 -0
  704. package/packages/kernel/src/capability-registry.ts +28 -0
  705. package/packages/kernel/src/errors.ts +9 -0
  706. package/packages/kernel/src/index.ts +90 -0
  707. package/packages/kernel/src/legacy-local-state.ts +103 -0
  708. package/packages/kernel/src/module-compatibility.ts +70 -0
  709. package/packages/kernel/src/module-registry.ts +124 -0
  710. package/packages/kernel/src/module-settings.ts +403 -0
  711. package/packages/kernel/src/record-history.ts +146 -0
  712. package/packages/kernel/src/runtime-config.ts +51 -0
  713. package/packages/kernel/src/tool-registry.ts +25 -0
  714. package/packages/kernel/src/variable-registry.ts +339 -0
  715. package/packages/sandbox/README.md +691 -0
  716. package/packages/sandbox/bin/flowdular-sandbox.mjs +393 -0
  717. package/packages/sandbox/dist/client/assets/App-ClMOrpyg.js +11 -0
  718. package/packages/sandbox/dist/client/assets/PreviewHost-BHiHrfbQ.js +1 -0
  719. package/packages/sandbox/dist/client/assets/auto-buGEq6de.js +3 -0
  720. package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  721. package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  722. package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  723. package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  724. package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  725. package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  726. package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  727. package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  728. package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  729. package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  730. package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  731. package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  732. package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  733. package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  734. package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  735. package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  736. package/packages/sandbox/dist/client/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  737. package/packages/sandbox/dist/client/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  738. package/packages/sandbox/dist/client/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  739. package/packages/sandbox/dist/client/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  740. package/packages/sandbox/dist/client/assets/ibm-plex-sans-cyrillic-ext-wght-normal-d45eAU9y.woff2 +0 -0
  741. package/packages/sandbox/dist/client/assets/ibm-plex-sans-cyrillic-wght-normal-BAAhND-U.woff2 +0 -0
  742. package/packages/sandbox/dist/client/assets/ibm-plex-sans-greek-wght-normal-CmyJS8uq.woff2 +0 -0
  743. package/packages/sandbox/dist/client/assets/ibm-plex-sans-latin-ext-wght-normal-CIII54If.woff2 +0 -0
  744. package/packages/sandbox/dist/client/assets/ibm-plex-sans-latin-wght-normal-IvpUvPa2.woff2 +0 -0
  745. package/packages/sandbox/dist/client/assets/ibm-plex-sans-vietnamese-wght-normal-Dg1JeJN0.woff2 +0 -0
  746. package/packages/sandbox/dist/client/assets/index-CvwhlQ87.js +4 -0
  747. package/packages/sandbox/dist/client/assets/styles-BPWaGf55.js +3 -0
  748. package/packages/sandbox/dist/client/assets/styles-Dx1_KOag.css +1 -0
  749. package/packages/sandbox/dist/client/favicon.svg +1 -0
  750. package/packages/sandbox/dist/server/assets/auto-CVGNYyb3.js +12785 -0
  751. package/packages/sandbox/dist/server/assets/chunk-DDJLRBDX-3OUNo51g.js +4125 -0
  752. package/packages/sandbox/dist/server/assets/nodefs-DVSI7kG0.js +24 -0
  753. package/packages/sandbox/dist/server/assets/opfs-ahp-D56iokt1.js +388 -0
  754. package/packages/sandbox/dist/server/assets/token-Bvaq7Anz.js +55 -0
  755. package/packages/sandbox/dist/server/assets/token-util-BqSvdIPQ.js +3 -0
  756. package/packages/sandbox/dist/server/assets/token-util-CktFFT4z.js +494 -0
  757. package/packages/sandbox/dist/server/entry.js +91671 -0
  758. package/packages/sandbox/dist/server/favicon.svg +1 -0
  759. package/packages/sandbox/dist/server/index.html +161 -0
  760. package/packages/sandbox/index.html +159 -0
  761. package/packages/sandbox/octane.config.ts +36 -0
  762. package/packages/sandbox/package.json +83 -0
  763. package/packages/sandbox/public/favicon.svg +1 -0
  764. package/packages/sandbox/public/og.png +0 -0
  765. package/packages/sandbox/src/App.tsrx +924 -0
  766. package/packages/sandbox/src/client/ApprovalHandoff.tsrx +39 -0
  767. package/packages/sandbox/src/client/ChatPane.tsrx +694 -0
  768. package/packages/sandbox/src/client/ConnectView.tsrx +86 -0
  769. package/packages/sandbox/src/client/DiffPane.tsrx +150 -0
  770. package/packages/sandbox/src/client/EjectModal.tsrx +571 -0
  771. package/packages/sandbox/src/client/GateResults.tsrx +60 -0
  772. package/packages/sandbox/src/client/GitHubSettingsModal.tsrx +219 -0
  773. package/packages/sandbox/src/client/NewSessionForm.tsrx +214 -0
  774. package/packages/sandbox/src/client/SessionBar.tsrx +151 -0
  775. package/packages/sandbox/src/client/SessionPicker.tsrx +472 -0
  776. package/packages/sandbox/src/client/SpecEditor.tsrx +109 -0
  777. package/packages/sandbox/src/client/SpecReviewCard.tsrx +321 -0
  778. package/packages/sandbox/src/client/WorkCard.tsrx +128 -0
  779. package/packages/sandbox/src/client/WorkbenchModal.tsrx +161 -0
  780. package/packages/sandbox/src/client/WorkspaceMenu.tsrx +100 -0
  781. package/packages/sandbox/src/client/api.ts +797 -0
  782. package/packages/sandbox/src/client/attachments.ts +73 -0
  783. package/packages/sandbox/src/client/dashboard.ts +46 -0
  784. package/packages/sandbox/src/client/github-settings.ts +48 -0
  785. package/packages/sandbox/src/client/highlight.ts +105 -0
  786. package/packages/sandbox/src/client/i18n.ts +32 -0
  787. package/packages/sandbox/src/client/locales/en.json +466 -0
  788. package/packages/sandbox/src/client/locales/pl.json +466 -0
  789. package/packages/sandbox/src/client/session-labels.ts +77 -0
  790. package/packages/sandbox/src/client/state.ts +108 -0
  791. package/packages/sandbox/src/index.ts +10 -0
  792. package/packages/sandbox/src/preview/PreviewHost.tsrx +373 -0
  793. package/packages/sandbox/src/preview/load-module.ts +16 -0
  794. package/packages/sandbox/src/server/attachments.ts +308 -0
  795. package/packages/sandbox/src/server/auto-review.ts +181 -0
  796. package/packages/sandbox/src/server/checkpoints.ts +90 -0
  797. package/packages/sandbox/src/server/config.ts +460 -0
  798. package/packages/sandbox/src/server/dashboard.ts +245 -0
  799. package/packages/sandbox/src/server/delivery/configuration.ts +193 -0
  800. package/packages/sandbox/src/server/delivery/git-pr.ts +1473 -0
  801. package/packages/sandbox/src/server/delivery/index.ts +83 -0
  802. package/packages/sandbox/src/server/delivery/local.ts +151 -0
  803. package/packages/sandbox/src/server/delivery/official-modules.ts +516 -0
  804. package/packages/sandbox/src/server/delivery/plan.ts +218 -0
  805. package/packages/sandbox/src/server/delivery/policies.ts +239 -0
  806. package/packages/sandbox/src/server/delivery/record.ts +41 -0
  807. package/packages/sandbox/src/server/delivery/steps.ts +464 -0
  808. package/packages/sandbox/src/server/delivery/types.ts +158 -0
  809. package/packages/sandbox/src/server/dependencies.ts +88 -0
  810. package/packages/sandbox/src/server/diff.ts +230 -0
  811. package/packages/sandbox/src/server/gates.ts +388 -0
  812. package/packages/sandbox/src/server/index.ts +139 -0
  813. package/packages/sandbox/src/server/path-guard.ts +282 -0
  814. package/packages/sandbox/src/server/planning.ts +749 -0
  815. package/packages/sandbox/src/server/platform-client.ts +189 -0
  816. package/packages/sandbox/src/server/preview-database-host.ts +340 -0
  817. package/packages/sandbox/src/server/preview-database-protocol.ts +163 -0
  818. package/packages/sandbox/src/server/preview-database-proxy.ts +356 -0
  819. package/packages/sandbox/src/server/preview-database.ts +109 -0
  820. package/packages/sandbox/src/server/preview-ipc.ts +15 -0
  821. package/packages/sandbox/src/server/preview-modules.ts +83 -0
  822. package/packages/sandbox/src/server/preview-revision.ts +44 -0
  823. package/packages/sandbox/src/server/preview-runtime.ts +467 -0
  824. package/packages/sandbox/src/server/preview-worker-manager.ts +436 -0
  825. package/packages/sandbox/src/server/preview-worker.ts +168 -0
  826. package/packages/sandbox/src/server/reference.ts +251 -0
  827. package/packages/sandbox/src/server/routes.ts +2258 -0
  828. package/packages/sandbox/src/server/runtime.ts +188 -0
  829. package/packages/sandbox/src/server/session-owner.ts +23 -0
  830. package/packages/sandbox/src/server/sessions.ts +849 -0
  831. package/packages/sandbox/src/server/spec.ts +471 -0
  832. package/packages/sandbox/src/server/turn-lifecycle.ts +56 -0
  833. package/packages/sandbox/src/server/turns.ts +993 -0
  834. package/packages/sandbox/src/server/workspace-install.ts +266 -0
  835. package/packages/sandbox/src/server/workspace-root.ts +73 -0
  836. package/packages/sandbox/src/styles.css +1573 -0
  837. package/packages/sandbox/vite.config.ts +133 -0
  838. package/packages/server/package.json +43 -0
  839. package/packages/server/src/application-routes.ts +21 -0
  840. package/packages/server/src/composition.ts +48 -0
  841. package/packages/server/src/endpoint.ts +142 -0
  842. package/packages/server/src/http.ts +128 -0
  843. package/packages/server/src/index.ts +46 -0
  844. package/packages/server/src/response-lifetime.ts +56 -0
  845. package/packages/server/src/security-headers.ts +130 -0
  846. package/packages/server/src/web-html.ts +55 -0
  847. package/packages/server/src/web.ts +361 -0
  848. package/packages/ui/package.json +46 -0
  849. package/packages/ui/src/brand/BrandMark.tsrx +66 -0
  850. package/packages/ui/src/brand/mark.ts +44 -0
  851. package/packages/ui/src/components/Alert.tsrx +17 -0
  852. package/packages/ui/src/components/Avatar.tsrx +18 -0
  853. package/packages/ui/src/components/Button.tsrx +29 -0
  854. package/packages/ui/src/components/Chart.tsrx +274 -0
  855. package/packages/ui/src/components/CheckGrid.tsrx +93 -0
  856. package/packages/ui/src/components/ConfirmDialog.tsrx +63 -0
  857. package/packages/ui/src/components/Drawer.tsrx +71 -0
  858. package/packages/ui/src/components/EmptyState.tsrx +26 -0
  859. package/packages/ui/src/components/Filters.tsrx +39 -0
  860. package/packages/ui/src/components/FormField.tsrx +27 -0
  861. package/packages/ui/src/components/Kpi.tsrx +36 -0
  862. package/packages/ui/src/components/PageHeader.tsrx +26 -0
  863. package/packages/ui/src/components/ScopeSummary.tsrx +76 -0
  864. package/packages/ui/src/components/SearchField.tsrx +24 -0
  865. package/packages/ui/src/components/SettingRow.tsrx +50 -0
  866. package/packages/ui/src/components/Switch.tsrx +21 -0
  867. package/packages/ui/src/components/Table.tsrx +267 -0
  868. package/packages/ui/src/components/TableCard.tsrx +52 -0
  869. package/packages/ui/src/components/Tag.tsrx +28 -0
  870. package/packages/ui/src/components/VariableField.tsrx +284 -0
  871. package/packages/ui/src/components/VariableInput.tsrx +7 -0
  872. package/packages/ui/src/components/VariableSelect.tsrx +72 -0
  873. package/packages/ui/src/components/VariableTextarea.tsrx +9 -0
  874. package/packages/ui/src/components/variable-field.ts +61 -0
  875. package/packages/ui/src/components/variable-select.ts +69 -0
  876. package/packages/ui/src/icons/Icon.tsrx +56 -0
  877. package/packages/ui/src/index.ts +81 -0
  878. package/packages/ui/src/initials.ts +10 -0
  879. package/packages/ui/src/styles/base.css +71 -0
  880. package/packages/ui/src/styles/components.css +1859 -0
  881. package/packages/ui/src/styles/index.css +3 -0
  882. package/packages/ui/src/styles/tokens.css +124 -0
  883. package/tsconfig.base.json +18 -0
@@ -0,0 +1,1152 @@
1
+ import {
2
+ migrationObjectState,
3
+ postgresTenantTableState,
4
+ type DatabaseMigration,
5
+ type DatabaseSession,
6
+ } from '@flowdular/sdk/database';
7
+
8
+ /* A grants-only migration leaves no table or column behind, so adoption of a
9
+ pre-ledger schema is decided by the policy it installs. */
10
+ async function policyPresent(
11
+ database: DatabaseSession,
12
+ table: string,
13
+ policy: string,
14
+ ): Promise<boolean> {
15
+ const result = await database.query<{ present: boolean }>({
16
+ text: `SELECT EXISTS (
17
+ SELECT 1 FROM pg_policy
18
+ JOIN pg_class ON pg_class.oid = pg_policy.polrelid
19
+ JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
20
+ WHERE pg_namespace.nspname = current_schema()
21
+ AND pg_class.relname = $1 AND pg_policy.polname = $2
22
+ ) AS present`,
23
+ parameters: [table, policy],
24
+ });
25
+ return result.rows[0]?.present === true;
26
+ }
27
+
28
+ /* Every constant mirrors its migrations/<id>.up.sql file byte for byte;
29
+ tests/migrations.test.ts fails on drift. */
30
+
31
+ /* Mirrors migrations/0001_agents_core.up.sql byte for byte. */
32
+ export const AGENTS_MIGRATION_001 = `CREATE TABLE IF NOT EXISTS agent_definitions (
33
+ id TEXT PRIMARY KEY,
34
+ tenant_id TEXT NOT NULL,
35
+ agent_key TEXT NOT NULL,
36
+ name TEXT NOT NULL,
37
+ description TEXT NOT NULL,
38
+ instructions TEXT NOT NULL,
39
+ provider TEXT NOT NULL,
40
+ model TEXT NOT NULL,
41
+ allowed_tools_json TEXT NOT NULL,
42
+ max_steps INTEGER NOT NULL CHECK (max_steps BETWEEN 1 AND 32),
43
+ timeout_ms BIGINT NOT NULL CHECK (timeout_ms BETWEEN 250 AND 300000),
44
+ temperature_milli INTEGER NOT NULL CHECK (temperature_milli BETWEEN 0 AND 2000),
45
+ status TEXT NOT NULL CHECK (status IN ('draft', 'active', 'paused', 'archived')),
46
+ revision INTEGER NOT NULL CHECK (revision >= 1),
47
+ created_by TEXT NOT NULL,
48
+ created_at BIGINT NOT NULL,
49
+ updated_by TEXT NOT NULL,
50
+ updated_at BIGINT NOT NULL,
51
+ UNIQUE (tenant_id, agent_key)
52
+ );
53
+ CREATE INDEX IF NOT EXISTS agent_definitions_tenant_name_idx ON agent_definitions (tenant_id, name, id);
54
+
55
+ CREATE TABLE IF NOT EXISTS agent_runs (
56
+ id TEXT PRIMARY KEY,
57
+ tenant_id TEXT NOT NULL,
58
+ agent_id TEXT NOT NULL,
59
+ agent_name TEXT NOT NULL,
60
+ agent_revision INTEGER NOT NULL,
61
+ instructions_snapshot TEXT NOT NULL,
62
+ provider TEXT NOT NULL,
63
+ model TEXT NOT NULL,
64
+ allowed_tools_json TEXT NOT NULL,
65
+ max_steps INTEGER NOT NULL,
66
+ timeout_ms BIGINT NOT NULL,
67
+ temperature_milli INTEGER NOT NULL,
68
+ trigger TEXT NOT NULL CHECK (trigger IN ('playground', 'workflow', 'service', 'schedule')),
69
+ status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'succeeded', 'failed', 'cancelled')),
70
+ input TEXT NOT NULL,
71
+ output TEXT,
72
+ requested_by TEXT NOT NULL,
73
+ permission_snapshot_json TEXT NOT NULL,
74
+ tool_grants_json TEXT NOT NULL,
75
+ usage_json TEXT,
76
+ failure_code TEXT,
77
+ failure_message TEXT,
78
+ idempotency_key TEXT,
79
+ attempt INTEGER NOT NULL DEFAULT 0,
80
+ queued_at BIGINT NOT NULL,
81
+ started_at BIGINT,
82
+ completed_at BIGINT,
83
+ lease_owner TEXT,
84
+ lease_expires_at BIGINT,
85
+ FOREIGN KEY (agent_id) REFERENCES agent_definitions(id),
86
+ UNIQUE (tenant_id, idempotency_key)
87
+ );
88
+ CREATE INDEX IF NOT EXISTS agent_runs_tenant_queued_idx ON agent_runs (tenant_id, queued_at DESC, id);
89
+ CREATE INDEX IF NOT EXISTS agent_runs_recovery_idx ON agent_runs (status, lease_expires_at, queued_at);
90
+
91
+ CREATE TABLE IF NOT EXISTS agent_run_events (
92
+ run_id TEXT NOT NULL REFERENCES agent_runs(id) ON DELETE CASCADE,
93
+ tenant_id TEXT NOT NULL,
94
+ sequence BIGINT NOT NULL,
95
+ event_type TEXT NOT NULL,
96
+ message TEXT NOT NULL,
97
+ metadata_json TEXT NOT NULL,
98
+ occurred_at BIGINT NOT NULL,
99
+ PRIMARY KEY (run_id, sequence)
100
+ );
101
+
102
+ CREATE TABLE IF NOT EXISTS agent_audit_events (
103
+ id TEXT PRIMARY KEY,
104
+ tenant_id TEXT NOT NULL,
105
+ sequence BIGINT NOT NULL,
106
+ actor_id TEXT NOT NULL,
107
+ action TEXT NOT NULL,
108
+ subject_type TEXT NOT NULL CHECK (subject_type IN ('agent', 'agent-run')),
109
+ subject_id TEXT NOT NULL,
110
+ metadata_json TEXT NOT NULL,
111
+ occurred_at BIGINT NOT NULL,
112
+ previous_hash TEXT,
113
+ event_hash TEXT NOT NULL,
114
+ UNIQUE (tenant_id, sequence),
115
+ UNIQUE (tenant_id, event_hash)
116
+ );
117
+ CREATE INDEX IF NOT EXISTS agent_audit_tenant_time_idx ON agent_audit_events (tenant_id, occurred_at DESC, sequence DESC);
118
+ ALTER TABLE agent_definitions ENABLE ROW LEVEL SECURITY;
119
+ ALTER TABLE agent_definitions FORCE ROW LEVEL SECURITY;
120
+ CREATE POLICY agent_definitions_tenant_policy ON agent_definitions
121
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
122
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
123
+ ALTER TABLE agent_runs ENABLE ROW LEVEL SECURITY;
124
+ ALTER TABLE agent_runs FORCE ROW LEVEL SECURITY;
125
+ CREATE POLICY agent_runs_tenant_policy ON agent_runs
126
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
127
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
128
+ ALTER TABLE agent_run_events ENABLE ROW LEVEL SECURITY;
129
+ ALTER TABLE agent_run_events FORCE ROW LEVEL SECURITY;
130
+ CREATE POLICY agent_run_events_tenant_policy ON agent_run_events
131
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
132
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
133
+ ALTER TABLE agent_audit_events ENABLE ROW LEVEL SECURITY;
134
+ ALTER TABLE agent_audit_events FORCE ROW LEVEL SECURITY;
135
+ CREATE POLICY agent_audit_events_tenant_policy ON agent_audit_events
136
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
137
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
138
+ `;
139
+
140
+ /* Mirrors migrations/0002_provider_connections.up.sql byte for byte. */
141
+ export const AGENTS_MIGRATION_002 = `CREATE TABLE IF NOT EXISTS agent_provider_connections (
142
+ id TEXT PRIMARY KEY,
143
+ tenant_id TEXT NOT NULL,
144
+ provider_key TEXT NOT NULL,
145
+ name TEXT NOT NULL,
146
+ kind TEXT NOT NULL CHECK (kind IN ('vercel', 'azure', 'openai', 'openai-compatible', 'anthropic')),
147
+ enabled INTEGER NOT NULL CHECK (enabled IN (0, 1)),
148
+ resource_name TEXT,
149
+ base_url TEXT,
150
+ models_json TEXT NOT NULL,
151
+ credential_key_id TEXT NOT NULL,
152
+ credential_iv TEXT NOT NULL,
153
+ credential_tag TEXT NOT NULL,
154
+ credential_ciphertext TEXT NOT NULL,
155
+ credential_revision INTEGER NOT NULL CHECK (credential_revision >= 1),
156
+ readiness_status TEXT NOT NULL CHECK (readiness_status IN ('unknown', 'healthy', 'unhealthy')),
157
+ readiness_model TEXT,
158
+ readiness_latency_ms BIGINT,
159
+ readiness_error_code TEXT,
160
+ readiness_checked_at BIGINT,
161
+ revision INTEGER NOT NULL CHECK (revision >= 1),
162
+ created_by TEXT NOT NULL,
163
+ created_at BIGINT NOT NULL,
164
+ updated_by TEXT NOT NULL,
165
+ updated_at BIGINT NOT NULL,
166
+ UNIQUE (tenant_id, provider_key)
167
+ );
168
+ CREATE INDEX IF NOT EXISTS agent_provider_connections_tenant_name_idx
169
+ ON agent_provider_connections (tenant_id, name, id);
170
+ ALTER TABLE agent_provider_connections ENABLE ROW LEVEL SECURITY;
171
+ ALTER TABLE agent_provider_connections FORCE ROW LEVEL SECURITY;
172
+ CREATE POLICY agent_provider_connections_tenant_policy ON agent_provider_connections
173
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
174
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
175
+ `;
176
+
177
+ /* Mirrors migrations/0003_resource_audit.up.sql byte for byte. */
178
+ export const AGENTS_MIGRATION_003 = `CREATE TABLE IF NOT EXISTS agent_audit_events_v2 (
179
+ id TEXT PRIMARY KEY,
180
+ tenant_id TEXT NOT NULL,
181
+ sequence BIGINT NOT NULL,
182
+ actor_id TEXT NOT NULL,
183
+ action TEXT NOT NULL,
184
+ subject_type TEXT NOT NULL CHECK (subject_type IN ('agent', 'agent-run', 'agent-provider', 'agent-skill')),
185
+ subject_id TEXT NOT NULL,
186
+ metadata_json TEXT NOT NULL,
187
+ occurred_at BIGINT NOT NULL,
188
+ previous_hash TEXT,
189
+ event_hash TEXT NOT NULL,
190
+ UNIQUE (tenant_id, sequence),
191
+ UNIQUE (tenant_id, event_hash)
192
+ );
193
+ INSERT INTO agent_audit_events_v2
194
+ SELECT * FROM agent_audit_events ORDER BY tenant_id, sequence
195
+ ON CONFLICT DO NOTHING;
196
+ CREATE INDEX IF NOT EXISTS agent_audit_v2_tenant_time_idx
197
+ ON agent_audit_events_v2 (tenant_id, occurred_at DESC, sequence DESC);
198
+ ALTER TABLE agent_audit_events_v2 ENABLE ROW LEVEL SECURITY;
199
+ ALTER TABLE agent_audit_events_v2 FORCE ROW LEVEL SECURITY;
200
+ CREATE POLICY agent_audit_events_v2_tenant_policy ON agent_audit_events_v2
201
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
202
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
203
+ `;
204
+
205
+ /* Mirrors migrations/0004_run_grants.up.sql byte for byte. */
206
+ export const AGENTS_MIGRATION_004 = `CREATE TABLE IF NOT EXISTS agent_run_grant_uses (
207
+ grant_id TEXT PRIMARY KEY,
208
+ token_hash TEXT NOT NULL UNIQUE,
209
+ tenant_id TEXT NOT NULL,
210
+ run_id TEXT NOT NULL REFERENCES agent_runs(id) ON DELETE CASCADE,
211
+ worker_id TEXT NOT NULL,
212
+ provider_id TEXT NOT NULL,
213
+ model_id TEXT NOT NULL,
214
+ issued_at BIGINT NOT NULL,
215
+ expires_at BIGINT NOT NULL,
216
+ consumed_at BIGINT NOT NULL
217
+ );
218
+ CREATE INDEX IF NOT EXISTS agent_run_grant_expiry_idx
219
+ ON agent_run_grant_uses (expires_at);
220
+ ALTER TABLE agent_run_grant_uses ENABLE ROW LEVEL SECURITY;
221
+ ALTER TABLE agent_run_grant_uses FORCE ROW LEVEL SECURITY;
222
+ CREATE POLICY agent_run_grant_uses_tenant_policy ON agent_run_grant_uses
223
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
224
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
225
+ `;
226
+
227
+ /* Mirrors migrations/0005_long_running_limits.up.sql byte for byte. */
228
+ export const AGENTS_MIGRATION_005 = `CREATE TABLE IF NOT EXISTS agent_definition_execution_limits (
229
+ agent_id TEXT PRIMARY KEY REFERENCES agent_definitions(id) ON DELETE CASCADE,
230
+ timeout_ms BIGINT NOT NULL CHECK (timeout_ms BETWEEN 250 AND 86400000)
231
+ );
232
+ INSERT INTO agent_definition_execution_limits (agent_id, timeout_ms)
233
+ SELECT id, timeout_ms FROM agent_definitions
234
+ ON CONFLICT DO NOTHING;
235
+ CREATE TABLE IF NOT EXISTS agent_run_execution_limits (
236
+ run_id TEXT PRIMARY KEY REFERENCES agent_runs(id) ON DELETE CASCADE,
237
+ timeout_ms BIGINT NOT NULL CHECK (timeout_ms BETWEEN 250 AND 86400000)
238
+ );
239
+ INSERT INTO agent_run_execution_limits (run_id, timeout_ms)
240
+ SELECT id, timeout_ms FROM agent_runs
241
+ ON CONFLICT DO NOTHING;
242
+ `;
243
+
244
+ /* Mirrors migrations/0006_agent_skills.up.sql byte for byte. */
245
+ export const AGENTS_MIGRATION_006 = `CREATE TABLE IF NOT EXISTS agent_skills (
246
+ id TEXT PRIMARY KEY,
247
+ tenant_id TEXT NOT NULL,
248
+ skill_key TEXT NOT NULL,
249
+ name TEXT NOT NULL,
250
+ description TEXT NOT NULL,
251
+ instructions TEXT NOT NULL,
252
+ required_tools_json TEXT NOT NULL,
253
+ status TEXT NOT NULL CHECK (status IN ('draft', 'active', 'archived')),
254
+ revision INTEGER NOT NULL CHECK (revision >= 1),
255
+ created_by TEXT NOT NULL,
256
+ created_at BIGINT NOT NULL,
257
+ updated_by TEXT NOT NULL,
258
+ updated_at BIGINT NOT NULL,
259
+ UNIQUE (tenant_id, skill_key),
260
+ UNIQUE (id, tenant_id)
261
+ );
262
+ CREATE INDEX IF NOT EXISTS agent_skills_tenant_name_idx ON agent_skills (tenant_id, name, id);
263
+ CREATE TABLE IF NOT EXISTS agent_skill_assignments (
264
+ agent_id TEXT NOT NULL REFERENCES agent_definitions(id) ON DELETE CASCADE,
265
+ skill_id TEXT NOT NULL,
266
+ tenant_id TEXT NOT NULL,
267
+ PRIMARY KEY (agent_id, skill_id),
268
+ FOREIGN KEY (skill_id, tenant_id) REFERENCES agent_skills(id, tenant_id) ON DELETE CASCADE
269
+ );
270
+ CREATE TABLE IF NOT EXISTS agent_run_skill_snapshots (
271
+ run_id TEXT NOT NULL REFERENCES agent_runs(id) ON DELETE CASCADE,
272
+ skill_id TEXT NOT NULL,
273
+ skill_key TEXT NOT NULL,
274
+ skill_name TEXT NOT NULL,
275
+ skill_revision INTEGER NOT NULL,
276
+ required_tools_json TEXT NOT NULL,
277
+ PRIMARY KEY (run_id, skill_id)
278
+ );
279
+ ALTER TABLE agent_skills ENABLE ROW LEVEL SECURITY;
280
+ ALTER TABLE agent_skills FORCE ROW LEVEL SECURITY;
281
+ CREATE POLICY agent_skills_tenant_policy ON agent_skills
282
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
283
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
284
+ ALTER TABLE agent_skill_assignments ENABLE ROW LEVEL SECURITY;
285
+ ALTER TABLE agent_skill_assignments FORCE ROW LEVEL SECURITY;
286
+ CREATE POLICY agent_skill_assignments_tenant_policy ON agent_skill_assignments
287
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
288
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
289
+ `;
290
+
291
+ /* Mirrors migrations/0007_model_readiness.up.sql byte for byte. */
292
+ export const AGENTS_MIGRATION_007 = `CREATE TABLE IF NOT EXISTS agent_provider_model_readiness (
293
+ provider_id TEXT NOT NULL REFERENCES agent_provider_connections(id) ON DELETE CASCADE,
294
+ model_id TEXT NOT NULL,
295
+ status TEXT NOT NULL CHECK (status IN ('healthy', 'unhealthy')),
296
+ latency_ms BIGINT,
297
+ error_code TEXT,
298
+ checked_at BIGINT NOT NULL,
299
+ PRIMARY KEY (provider_id, model_id)
300
+ );
301
+ INSERT INTO agent_provider_model_readiness
302
+ (provider_id, model_id, status, latency_ms, error_code, checked_at)
303
+ SELECT id, readiness_model, readiness_status, readiness_latency_ms,
304
+ readiness_error_code, readiness_checked_at
305
+ FROM agent_provider_connections
306
+ WHERE readiness_model IS NOT NULL
307
+ AND readiness_checked_at IS NOT NULL
308
+ AND readiness_status IN ('healthy', 'unhealthy')
309
+ ON CONFLICT DO NOTHING;
310
+ `;
311
+
312
+ /* Mirrors migrations/0008_output_limits.up.sql byte for byte. */
313
+ export const AGENTS_MIGRATION_008 = `CREATE TABLE IF NOT EXISTS agent_definition_output_limits (
314
+ agent_id TEXT PRIMARY KEY REFERENCES agent_definitions(id) ON DELETE CASCADE,
315
+ max_output_tokens BIGINT NOT NULL CHECK (max_output_tokens BETWEEN 256 AND 65536)
316
+ );
317
+ CREATE TABLE IF NOT EXISTS agent_run_output_limits (
318
+ run_id TEXT PRIMARY KEY REFERENCES agent_runs(id) ON DELETE CASCADE,
319
+ max_output_tokens BIGINT NOT NULL CHECK (max_output_tokens BETWEEN 256 AND 65536)
320
+ );
321
+ `;
322
+
323
+ /* Mirrors migrations/0009_agent_audit_v3.up.sql byte for byte. */
324
+ export const AGENTS_MIGRATION_009 = `CREATE TABLE IF NOT EXISTS agent_audit_events_v3 (
325
+ id TEXT PRIMARY KEY,
326
+ tenant_id TEXT NOT NULL,
327
+ sequence BIGINT NOT NULL,
328
+ actor_id TEXT NOT NULL,
329
+ action TEXT NOT NULL,
330
+ subject_type TEXT NOT NULL CHECK (subject_type IN ('agent', 'agent-run', 'agent-provider', 'agent-skill', 'agent-schedule', 'agent-trigger')),
331
+ subject_id TEXT NOT NULL,
332
+ metadata_json TEXT NOT NULL,
333
+ occurred_at BIGINT NOT NULL,
334
+ previous_hash TEXT,
335
+ event_hash TEXT NOT NULL,
336
+ UNIQUE (tenant_id, sequence),
337
+ UNIQUE (tenant_id, event_hash)
338
+ );
339
+ INSERT INTO agent_audit_events_v3
340
+ SELECT * FROM agent_audit_events_v2 ORDER BY tenant_id, sequence
341
+ ON CONFLICT DO NOTHING;
342
+ CREATE INDEX IF NOT EXISTS agent_audit_v3_tenant_time_idx
343
+ ON agent_audit_events_v3 (tenant_id, occurred_at DESC, sequence DESC);
344
+ ALTER TABLE agent_audit_events_v3 ENABLE ROW LEVEL SECURITY;
345
+ ALTER TABLE agent_audit_events_v3 FORCE ROW LEVEL SECURITY;
346
+ CREATE POLICY agent_audit_events_v3_tenant_policy ON agent_audit_events_v3
347
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
348
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
349
+ `;
350
+
351
+ /* Mirrors migrations/0012_agent_run_costs.up.sql byte for byte. */
352
+ export const AGENTS_MIGRATION_012 = `CREATE TABLE IF NOT EXISTS agent_run_costs (
353
+ run_id TEXT PRIMARY KEY REFERENCES agent_runs(id) ON DELETE CASCADE,
354
+ tenant_id TEXT NOT NULL,
355
+ agent_id TEXT NOT NULL,
356
+ agent_name TEXT NOT NULL,
357
+ model TEXT NOT NULL,
358
+ day TEXT NOT NULL,
359
+ input_tokens BIGINT NOT NULL,
360
+ output_tokens BIGINT NOT NULL,
361
+ cost_micro_usd BIGINT,
362
+ completed_at BIGINT NOT NULL
363
+ );
364
+ CREATE INDEX IF NOT EXISTS agent_run_costs_tenant_day_idx
365
+ ON agent_run_costs (tenant_id, day);
366
+ CREATE INDEX IF NOT EXISTS agent_run_costs_tenant_agent_idx
367
+ ON agent_run_costs (tenant_id, agent_id, day);
368
+ INSERT INTO agent_run_costs
369
+ (run_id, tenant_id, agent_id, agent_name, model, day, input_tokens,
370
+ output_tokens, cost_micro_usd, completed_at)
371
+ SELECT id, tenant_id, agent_id, agent_name, model,
372
+ to_char(to_timestamp(completed_at / 1000), 'YYYY-MM-DD'),
373
+ COALESCE((usage_json::jsonb ->> 'inputTokens')::bigint, 0),
374
+ COALESCE((usage_json::jsonb ->> 'outputTokens')::bigint, 0),
375
+ NULL, completed_at
376
+ FROM agent_runs
377
+ WHERE status = 'succeeded' AND usage_json IS NOT NULL AND completed_at IS NOT NULL
378
+ ON CONFLICT DO NOTHING;
379
+ ALTER TABLE agent_run_costs ENABLE ROW LEVEL SECURITY;
380
+ ALTER TABLE agent_run_costs FORCE ROW LEVEL SECURITY;
381
+ CREATE POLICY agent_run_costs_tenant_policy ON agent_run_costs
382
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
383
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
384
+ `;
385
+
386
+ /* Mirrors migrations/0013_workflow_prerequisites.up.sql byte for byte. */
387
+ export const AGENTS_MIGRATION_013 = `-- SQLite expresses immutability with a BEFORE trigger that aborts. PostgreSQL
388
+ -- needs a function to raise from, shared by every immutable table here.
389
+ CREATE OR REPLACE FUNCTION coreloom_reject_change() RETURNS trigger AS $$
390
+ BEGIN
391
+ RAISE EXCEPTION '%', TG_ARGV[0];
392
+ END;
393
+ $$ LANGUAGE plpgsql;
394
+ CREATE TABLE IF NOT EXISTS agent_definition_revisions (
395
+ tenant_id TEXT NOT NULL,
396
+ agent_id TEXT NOT NULL,
397
+ revision INTEGER NOT NULL CHECK (revision >= 1),
398
+ agent_key TEXT NOT NULL,
399
+ name TEXT NOT NULL,
400
+ description TEXT NOT NULL,
401
+ instructions TEXT NOT NULL,
402
+ provider TEXT NOT NULL,
403
+ model TEXT NOT NULL,
404
+ allowed_tools_json TEXT NOT NULL,
405
+ skills_json TEXT NOT NULL,
406
+ max_steps INTEGER NOT NULL CHECK (max_steps BETWEEN 1 AND 32),
407
+ timeout_ms BIGINT NOT NULL CHECK (timeout_ms BETWEEN 250 AND 86400000),
408
+ temperature_milli INTEGER NOT NULL CHECK (temperature_milli BETWEEN 0 AND 2000),
409
+ max_output_tokens BIGINT NOT NULL CHECK (max_output_tokens BETWEEN 256 AND 65536),
410
+ status TEXT NOT NULL CHECK (status IN ('draft', 'active', 'paused', 'archived')),
411
+ retained_by TEXT NOT NULL,
412
+ retained_at BIGINT NOT NULL,
413
+ PRIMARY KEY (tenant_id, agent_id, revision)
414
+ );
415
+ CREATE INDEX IF NOT EXISTS agent_definition_revisions_tenant_agent_idx
416
+ ON agent_definition_revisions (tenant_id, agent_id, revision DESC);
417
+ CREATE TRIGGER agent_definition_revisions_no_update
418
+ BEFORE UPDATE ON agent_definition_revisions
419
+ FOR EACH ROW EXECUTE FUNCTION coreloom_reject_change('agent definition revisions are immutable');
420
+ CREATE TRIGGER agent_definition_revisions_no_delete
421
+ BEFORE DELETE ON agent_definition_revisions
422
+ FOR EACH ROW EXECUTE FUNCTION coreloom_reject_change('agent definition revisions are immutable');
423
+
424
+ CREATE TABLE IF NOT EXISTS agent_run_contracts (
425
+ run_id TEXT PRIMARY KEY REFERENCES agent_runs(id) ON DELETE CASCADE,
426
+ tenant_id TEXT NOT NULL,
427
+ workflow_run_id TEXT,
428
+ output_contract_json TEXT NOT NULL,
429
+ structured_output_json TEXT,
430
+ request_hash TEXT NOT NULL
431
+ );
432
+ CREATE INDEX IF NOT EXISTS agent_run_contracts_tenant_workflow_idx
433
+ ON agent_run_contracts (tenant_id, workflow_run_id, run_id);
434
+ INSERT INTO agent_run_contracts
435
+ (run_id, tenant_id, workflow_run_id, output_contract_json,
436
+ structured_output_json, request_hash)
437
+ SELECT id, tenant_id, NULL, '{"kind":"text"}', NULL,
438
+ encode(sha256(gen_random_uuid()::text::bytea), 'hex')
439
+ FROM agent_runs
440
+ ON CONFLICT DO NOTHING;
441
+
442
+ CREATE TABLE IF NOT EXISTS agent_action_invocations (
443
+ id TEXT PRIMARY KEY,
444
+ tenant_id TEXT NOT NULL,
445
+ workflow_run_id TEXT NOT NULL,
446
+ node_run_id TEXT NOT NULL,
447
+ action_id TEXT NOT NULL,
448
+ contract_version INTEGER NOT NULL CHECK (contract_version >= 1),
449
+ actor_json TEXT NOT NULL,
450
+ permission_snapshot_json TEXT NOT NULL,
451
+ input_json TEXT NOT NULL,
452
+ idempotency_key TEXT NOT NULL,
453
+ request_hash TEXT NOT NULL,
454
+ status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'succeeded', 'failed', 'cancelled')),
455
+ output_json TEXT,
456
+ failure_code TEXT,
457
+ attempt INTEGER NOT NULL DEFAULT 0,
458
+ queued_at BIGINT NOT NULL,
459
+ started_at BIGINT,
460
+ completed_at BIGINT,
461
+ lease_owner TEXT,
462
+ lease_expires_at BIGINT,
463
+ UNIQUE (tenant_id, idempotency_key)
464
+ );
465
+ CREATE INDEX IF NOT EXISTS agent_actions_tenant_workflow_idx
466
+ ON agent_action_invocations (tenant_id, workflow_run_id, queued_at DESC, id);
467
+ CREATE INDEX IF NOT EXISTS agent_actions_recovery_idx
468
+ ON agent_action_invocations (status, lease_expires_at, queued_at);
469
+ ALTER TABLE agent_definition_revisions ENABLE ROW LEVEL SECURITY;
470
+ ALTER TABLE agent_definition_revisions FORCE ROW LEVEL SECURITY;
471
+ CREATE POLICY agent_definition_revisions_tenant_policy ON agent_definition_revisions
472
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
473
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
474
+ ALTER TABLE agent_run_contracts ENABLE ROW LEVEL SECURITY;
475
+ ALTER TABLE agent_run_contracts FORCE ROW LEVEL SECURITY;
476
+ CREATE POLICY agent_run_contracts_tenant_policy ON agent_run_contracts
477
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
478
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
479
+ ALTER TABLE agent_action_invocations ENABLE ROW LEVEL SECURITY;
480
+ ALTER TABLE agent_action_invocations FORCE ROW LEVEL SECURITY;
481
+ CREATE POLICY agent_action_invocations_tenant_policy ON agent_action_invocations
482
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
483
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
484
+ `;
485
+
486
+ /* Mirrors migrations/0014_agent_action_audit.up.sql byte for byte. */
487
+ export const AGENTS_MIGRATION_014 = `CREATE TABLE IF NOT EXISTS agent_audit_events_v4 (
488
+ id TEXT PRIMARY KEY,
489
+ tenant_id TEXT NOT NULL,
490
+ sequence BIGINT NOT NULL,
491
+ actor_id TEXT NOT NULL,
492
+ action TEXT NOT NULL,
493
+ subject_type TEXT NOT NULL CHECK (subject_type IN ('agent', 'agent-run', 'agent-provider', 'agent-skill', 'agent-schedule', 'agent-trigger', 'agent-action')),
494
+ subject_id TEXT NOT NULL,
495
+ metadata_json TEXT NOT NULL,
496
+ occurred_at BIGINT NOT NULL,
497
+ previous_hash TEXT,
498
+ event_hash TEXT NOT NULL,
499
+ UNIQUE (tenant_id, sequence),
500
+ UNIQUE (tenant_id, event_hash)
501
+ );
502
+ INSERT INTO agent_audit_events_v4
503
+ SELECT * FROM agent_audit_events_v3 ORDER BY tenant_id, sequence
504
+ ON CONFLICT DO NOTHING;
505
+ CREATE INDEX IF NOT EXISTS agent_audit_v4_tenant_time_idx
506
+ ON agent_audit_events_v4 (tenant_id, occurred_at DESC, sequence DESC);
507
+ ALTER TABLE agent_audit_events_v4 ENABLE ROW LEVEL SECURITY;
508
+ ALTER TABLE agent_audit_events_v4 FORCE ROW LEVEL SECURITY;
509
+ CREATE POLICY agent_audit_events_v4_tenant_policy ON agent_audit_events_v4
510
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
511
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
512
+ `;
513
+
514
+ /* Mirrors migrations/0015_agent_run_actors.up.sql byte for byte. */
515
+ export const AGENTS_MIGRATION_015 = `CREATE TABLE IF NOT EXISTS agent_run_actors (
516
+ run_id TEXT PRIMARY KEY REFERENCES agent_runs(id) ON DELETE CASCADE,
517
+ tenant_id TEXT NOT NULL,
518
+ actor_json TEXT NOT NULL CHECK (actor_json IS JSON OBJECT)
519
+ );
520
+ CREATE INDEX IF NOT EXISTS agent_run_actors_tenant_idx
521
+ ON agent_run_actors (tenant_id, run_id);
522
+ INSERT INTO agent_run_actors (run_id, tenant_id, actor_json)
523
+ SELECT id, tenant_id,
524
+ jsonb_build_object('kind', 'user', 'id', requested_by, 'label', requested_by)::text
525
+ FROM agent_runs
526
+ ON CONFLICT DO NOTHING;
527
+ ALTER TABLE agent_run_actors ENABLE ROW LEVEL SECURITY;
528
+ ALTER TABLE agent_run_actors FORCE ROW LEVEL SECURITY;
529
+ CREATE POLICY agent_run_actors_tenant_policy ON agent_run_actors
530
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
531
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
532
+ `;
533
+
534
+ /* Mirrors migrations/0016_module_owned_agents.up.sql byte for byte. */
535
+ export const AGENTS_MIGRATION_016 = `-- SQLite expresses immutability with a BEFORE trigger that aborts. PostgreSQL
536
+ -- needs a function to raise from, shared by every immutable table here.
537
+ CREATE OR REPLACE FUNCTION coreloom_reject_change() RETURNS trigger AS $$
538
+ BEGIN
539
+ RAISE EXCEPTION '%', TG_ARGV[0];
540
+ END;
541
+ $$ LANGUAGE plpgsql;
542
+ CREATE TABLE IF NOT EXISTS module_agent_definitions (
543
+ agent_id TEXT PRIMARY KEY REFERENCES agent_definitions(id),
544
+ module_id TEXT NOT NULL,
545
+ agent_key TEXT NOT NULL,
546
+ definition_revision INTEGER NOT NULL CHECK (definition_revision >= 1),
547
+ content_hash TEXT NOT NULL,
548
+ name TEXT NOT NULL,
549
+ description TEXT NOT NULL,
550
+ instructions TEXT NOT NULL,
551
+ allowed_tools_json TEXT NOT NULL,
552
+ max_steps INTEGER NOT NULL CHECK (max_steps BETWEEN 1 AND 32),
553
+ timeout_ms BIGINT NOT NULL CHECK (timeout_ms BETWEEN 250 AND 86400000),
554
+ temperature_milli INTEGER NOT NULL CHECK (temperature_milli BETWEEN 0 AND 2000),
555
+ max_output_tokens BIGINT NOT NULL CHECK (max_output_tokens BETWEEN 256 AND 65536),
556
+ registered_at BIGINT NOT NULL,
557
+ UNIQUE (module_id, agent_key)
558
+ );
559
+
560
+ CREATE TABLE IF NOT EXISTS module_agent_bindings (
561
+ tenant_id TEXT NOT NULL,
562
+ agent_id TEXT NOT NULL REFERENCES module_agent_definitions(agent_id),
563
+ provider TEXT NOT NULL,
564
+ model TEXT NOT NULL,
565
+ enabled_tools_json TEXT NOT NULL,
566
+ status TEXT NOT NULL CHECK (status IN ('active', 'paused')),
567
+ module_definition_revision INTEGER NOT NULL CHECK (module_definition_revision >= 1),
568
+ executable_revision INTEGER NOT NULL CHECK (executable_revision >= 1),
569
+ revision INTEGER NOT NULL CHECK (revision >= 1),
570
+ updated_by TEXT NOT NULL,
571
+ updated_at BIGINT NOT NULL,
572
+ PRIMARY KEY (tenant_id, agent_id)
573
+ );
574
+ CREATE INDEX IF NOT EXISTS module_agent_bindings_tenant_status_idx
575
+ ON module_agent_bindings (tenant_id, status, agent_id);
576
+
577
+ CREATE TABLE IF NOT EXISTS agent_revision_ownership (
578
+ tenant_id TEXT NOT NULL,
579
+ agent_id TEXT NOT NULL,
580
+ revision INTEGER NOT NULL,
581
+ module_id TEXT NOT NULL,
582
+ module_definition_revision INTEGER NOT NULL CHECK (module_definition_revision >= 1),
583
+ PRIMARY KEY (tenant_id, agent_id, revision),
584
+ FOREIGN KEY (tenant_id, agent_id, revision)
585
+ REFERENCES agent_definition_revisions (tenant_id, agent_id, revision)
586
+ );
587
+ CREATE TRIGGER agent_revision_ownership_no_update
588
+ BEFORE UPDATE ON agent_revision_ownership
589
+ FOR EACH ROW EXECUTE FUNCTION coreloom_reject_change('agent revision ownership is immutable');
590
+ CREATE TRIGGER agent_revision_ownership_no_delete
591
+ BEFORE DELETE ON agent_revision_ownership
592
+ FOR EACH ROW EXECUTE FUNCTION coreloom_reject_change('agent revision ownership is immutable');
593
+ ALTER TABLE module_agent_bindings ENABLE ROW LEVEL SECURITY;
594
+ ALTER TABLE module_agent_bindings FORCE ROW LEVEL SECURITY;
595
+ CREATE POLICY module_agent_bindings_tenant_policy ON module_agent_bindings
596
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
597
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
598
+ ALTER TABLE agent_revision_ownership ENABLE ROW LEVEL SECURITY;
599
+ ALTER TABLE agent_revision_ownership FORCE ROW LEVEL SECURITY;
600
+ CREATE POLICY agent_revision_ownership_tenant_policy ON agent_revision_ownership
601
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
602
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
603
+ `;
604
+
605
+ /* Mirrors migrations/0017_agent_authorization_subjects.up.sql byte for byte. */
606
+ export const AGENTS_MIGRATION_017 = `ALTER TABLE agent_run_actors
607
+ ADD COLUMN authorization_subject_json TEXT CHECK (authorization_subject_json IS NULL OR (authorization_subject_json IS JSON AND authorization_subject_json::jsonb ->> 'kind' = 'user'));
608
+ UPDATE agent_run_actors
609
+ SET authorization_subject_json = CASE actor_json::jsonb ->> 'kind'
610
+ WHEN 'user' THEN actor_json
611
+ WHEN 'service' THEN actor_json::jsonb ->> 'configuredBy'
612
+ ELSE NULL
613
+ END
614
+ WHERE authorization_subject_json IS NULL;
615
+ ALTER TABLE agent_action_invocations
616
+ ADD COLUMN authorization_subject_json TEXT CHECK (authorization_subject_json IS NULL OR (authorization_subject_json IS JSON AND authorization_subject_json::jsonb ->> 'kind' = 'user'));
617
+ UPDATE agent_action_invocations
618
+ SET authorization_subject_json = CASE actor_json::jsonb ->> 'kind'
619
+ WHEN 'user' THEN actor_json
620
+ WHEN 'service' THEN actor_json::jsonb ->> 'configuredBy'
621
+ ELSE NULL
622
+ END
623
+ WHERE authorization_subject_json IS NULL;
624
+ `;
625
+
626
+ /* Mirrors migrations/0019_background_recovery_grants.up.sql byte for byte. */
627
+ export const AGENTS_MIGRATION_019 = `-- The worker recovery polls have to find interrupted work before they know
628
+ -- whose it is, so they read on the background role. That role gets no table
629
+ -- privilege by default: each table it may poll grants the routing columns it
630
+ -- needs and nothing else, under a policy of its own. Every claim that follows
631
+ -- runs on the tenant-scoped runtime role, under the tenant the row named.
632
+ CREATE POLICY agent_runs_background_policy ON agent_runs
633
+ FOR SELECT TO coreloom_background
634
+ USING (true);
635
+ REVOKE SELECT ON agent_runs FROM coreloom_background;
636
+ GRANT SELECT (id, tenant_id, status, queued_at, lease_expires_at)
637
+ ON agent_runs TO coreloom_background;
638
+ CREATE POLICY agent_action_invocations_background_policy ON agent_action_invocations
639
+ FOR SELECT TO coreloom_background
640
+ USING (true);
641
+ REVOKE SELECT ON agent_action_invocations FROM coreloom_background;
642
+ GRANT SELECT (id, tenant_id, status, queued_at, lease_expires_at)
643
+ ON agent_action_invocations TO coreloom_background;
644
+ `;
645
+
646
+ /* Mirrors migrations/0018_agent_child_tenant_isolation.up.sql byte for byte. */
647
+ export const AGENTS_MIGRATION_0018 = `-- These tables hang off a tenant-owned parent and were protected only by it.
648
+ -- A read by a caller-supplied parent id therefore crossed tenants with nothing
649
+ -- but application code in the way. Each one now carries its own tenant and the
650
+ -- same forced row security every other tenant table has, so a mistake in a
651
+ -- query cannot reach another workspace.
652
+ ALTER TABLE agent_definition_execution_limits ADD COLUMN tenant_id TEXT;
653
+ UPDATE agent_definition_execution_limits AS child
654
+ SET tenant_id = parent.tenant_id
655
+ FROM agent_definitions AS parent
656
+ WHERE parent.id = child.agent_id AND child.tenant_id IS NULL;
657
+ DELETE FROM agent_definition_execution_limits WHERE tenant_id IS NULL;
658
+ ALTER TABLE agent_definition_execution_limits ALTER COLUMN tenant_id SET NOT NULL;
659
+ ALTER TABLE agent_definition_execution_limits ENABLE ROW LEVEL SECURITY;
660
+ ALTER TABLE agent_definition_execution_limits FORCE ROW LEVEL SECURITY;
661
+ CREATE POLICY agent_definition_execution_limits_tenant_policy
662
+ ON agent_definition_execution_limits
663
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
664
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
665
+
666
+ ALTER TABLE agent_definition_output_limits ADD COLUMN tenant_id TEXT;
667
+ UPDATE agent_definition_output_limits AS child
668
+ SET tenant_id = parent.tenant_id
669
+ FROM agent_definitions AS parent
670
+ WHERE parent.id = child.agent_id AND child.tenant_id IS NULL;
671
+ DELETE FROM agent_definition_output_limits WHERE tenant_id IS NULL;
672
+ ALTER TABLE agent_definition_output_limits ALTER COLUMN tenant_id SET NOT NULL;
673
+ ALTER TABLE agent_definition_output_limits ENABLE ROW LEVEL SECURITY;
674
+ ALTER TABLE agent_definition_output_limits FORCE ROW LEVEL SECURITY;
675
+ CREATE POLICY agent_definition_output_limits_tenant_policy
676
+ ON agent_definition_output_limits
677
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
678
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
679
+
680
+ ALTER TABLE agent_run_execution_limits ADD COLUMN tenant_id TEXT;
681
+ UPDATE agent_run_execution_limits AS child
682
+ SET tenant_id = parent.tenant_id
683
+ FROM agent_runs AS parent
684
+ WHERE parent.id = child.run_id AND child.tenant_id IS NULL;
685
+ DELETE FROM agent_run_execution_limits WHERE tenant_id IS NULL;
686
+ ALTER TABLE agent_run_execution_limits ALTER COLUMN tenant_id SET NOT NULL;
687
+ ALTER TABLE agent_run_execution_limits ENABLE ROW LEVEL SECURITY;
688
+ ALTER TABLE agent_run_execution_limits FORCE ROW LEVEL SECURITY;
689
+ CREATE POLICY agent_run_execution_limits_tenant_policy
690
+ ON agent_run_execution_limits
691
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
692
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
693
+
694
+ ALTER TABLE agent_run_output_limits ADD COLUMN tenant_id TEXT;
695
+ UPDATE agent_run_output_limits AS child
696
+ SET tenant_id = parent.tenant_id
697
+ FROM agent_runs AS parent
698
+ WHERE parent.id = child.run_id AND child.tenant_id IS NULL;
699
+ DELETE FROM agent_run_output_limits WHERE tenant_id IS NULL;
700
+ ALTER TABLE agent_run_output_limits ALTER COLUMN tenant_id SET NOT NULL;
701
+ ALTER TABLE agent_run_output_limits ENABLE ROW LEVEL SECURITY;
702
+ ALTER TABLE agent_run_output_limits FORCE ROW LEVEL SECURITY;
703
+ CREATE POLICY agent_run_output_limits_tenant_policy
704
+ ON agent_run_output_limits
705
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
706
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
707
+
708
+ ALTER TABLE agent_run_skill_snapshots ADD COLUMN tenant_id TEXT;
709
+ UPDATE agent_run_skill_snapshots AS child
710
+ SET tenant_id = parent.tenant_id
711
+ FROM agent_runs AS parent
712
+ WHERE parent.id = child.run_id AND child.tenant_id IS NULL;
713
+ DELETE FROM agent_run_skill_snapshots WHERE tenant_id IS NULL;
714
+ ALTER TABLE agent_run_skill_snapshots ALTER COLUMN tenant_id SET NOT NULL;
715
+ ALTER TABLE agent_run_skill_snapshots ENABLE ROW LEVEL SECURITY;
716
+ ALTER TABLE agent_run_skill_snapshots FORCE ROW LEVEL SECURITY;
717
+ CREATE POLICY agent_run_skill_snapshots_tenant_policy
718
+ ON agent_run_skill_snapshots
719
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
720
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
721
+
722
+ ALTER TABLE agent_provider_model_readiness ADD COLUMN tenant_id TEXT;
723
+ UPDATE agent_provider_model_readiness AS child
724
+ SET tenant_id = parent.tenant_id
725
+ FROM agent_provider_connections AS parent
726
+ WHERE parent.id = child.provider_id AND child.tenant_id IS NULL;
727
+ DELETE FROM agent_provider_model_readiness WHERE tenant_id IS NULL;
728
+ ALTER TABLE agent_provider_model_readiness ALTER COLUMN tenant_id SET NOT NULL;
729
+ ALTER TABLE agent_provider_model_readiness ENABLE ROW LEVEL SECURITY;
730
+ ALTER TABLE agent_provider_model_readiness FORCE ROW LEVEL SECURITY;
731
+ CREATE POLICY agent_provider_model_readiness_tenant_policy
732
+ ON agent_provider_model_readiness
733
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
734
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
735
+ `;
736
+
737
+ /* Mirrors migrations/0020_provider_summary_role.up.sql byte for byte. */
738
+ export const AGENTS_MIGRATION_0020 = `-- The operator status command counts provider connections across the whole
739
+ -- deployment, which the tenant-scoped runtime role cannot do and should not.
740
+ -- It reads the one flag the count needs, under a policy of this table's own,
741
+ -- and never sees a name, a base URL or an encrypted credential.
742
+ DO $$
743
+ BEGIN
744
+ IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
745
+ RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
746
+ END IF;
747
+ END
748
+ $$;
749
+ CREATE POLICY agent_provider_connections_background_policy
750
+ ON agent_provider_connections
751
+ FOR SELECT TO coreloom_background
752
+ USING (true);
753
+ REVOKE SELECT ON agent_provider_connections FROM coreloom_background;
754
+ GRANT SELECT (id, enabled) ON agent_provider_connections TO coreloom_background;
755
+ `;
756
+
757
+ export const AGENTS_MIGRATION_0021 = `-- Discover only tenant routing keys; boot-time writes still use tenant transactions.
758
+ CREATE POLICY agent_definitions_reconciliation_policy ON agent_definitions
759
+ FOR SELECT TO coreloom_background USING (true);
760
+ GRANT SELECT (tenant_id) ON agent_definitions TO coreloom_background;
761
+ CREATE POLICY module_agent_bindings_reconciliation_policy ON module_agent_bindings
762
+ FOR SELECT TO coreloom_background USING (true);
763
+ GRANT SELECT (tenant_id, agent_id) ON module_agent_bindings TO coreloom_background;
764
+ `;
765
+
766
+ export const databaseMigrations: readonly DatabaseMigration[] = [
767
+ {
768
+ id: '0001_agents_core',
769
+ sql: { postgresql: AGENTS_MIGRATION_001 },
770
+ inspectExisting: async (database) => {
771
+ const states = [
772
+ await postgresTenantTableState(
773
+ database,
774
+ 'agent_definitions',
775
+ 'agent_definitions_tenant_policy',
776
+ [],
777
+ ),
778
+ await postgresTenantTableState(
779
+ database,
780
+ 'agent_runs',
781
+ 'agent_runs_tenant_policy',
782
+ [],
783
+ ),
784
+ await postgresTenantTableState(
785
+ database,
786
+ 'agent_run_events',
787
+ 'agent_run_events_tenant_policy',
788
+ [],
789
+ ),
790
+ await postgresTenantTableState(
791
+ database,
792
+ 'agent_audit_events',
793
+ 'agent_audit_events_tenant_policy',
794
+ [],
795
+ ),
796
+ await migrationObjectState([
797
+ () => database.schema.hasIndex('agent_audit_tenant_time_idx'),
798
+ () => database.schema.hasIndex('agent_definitions_tenant_name_idx'),
799
+ () => database.schema.hasIndex('agent_runs_recovery_idx'),
800
+ () => database.schema.hasIndex('agent_runs_tenant_queued_idx'),
801
+ ]),
802
+ ];
803
+ if (states.every((state) => state === 'complete')) return 'complete';
804
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
805
+ },
806
+ },
807
+ {
808
+ id: '0002_provider_connections',
809
+ sql: { postgresql: AGENTS_MIGRATION_002 },
810
+ inspectExisting: async (database) => {
811
+ const states = [
812
+ await postgresTenantTableState(
813
+ database,
814
+ 'agent_provider_connections',
815
+ 'agent_provider_connections_tenant_policy',
816
+ [],
817
+ ),
818
+ await migrationObjectState([
819
+ () =>
820
+ database.schema.hasIndex(
821
+ 'agent_provider_connections_tenant_name_idx',
822
+ ),
823
+ ]),
824
+ ];
825
+ if (states.every((state) => state === 'complete')) return 'complete';
826
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
827
+ },
828
+ },
829
+ {
830
+ id: '0003_resource_audit',
831
+ sql: { postgresql: AGENTS_MIGRATION_003 },
832
+ inspectExisting: async (database) => {
833
+ const states = [
834
+ await postgresTenantTableState(
835
+ database,
836
+ 'agent_audit_events_v2',
837
+ 'agent_audit_events_v2_tenant_policy',
838
+ [],
839
+ ),
840
+ await migrationObjectState([
841
+ () => database.schema.hasIndex('agent_audit_v2_tenant_time_idx'),
842
+ ]),
843
+ ];
844
+ if (states.every((state) => state === 'complete')) return 'complete';
845
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
846
+ },
847
+ },
848
+ {
849
+ id: '0004_run_grants',
850
+ sql: { postgresql: AGENTS_MIGRATION_004 },
851
+ inspectExisting: async (database) => {
852
+ const states = [
853
+ await postgresTenantTableState(
854
+ database,
855
+ 'agent_run_grant_uses',
856
+ 'agent_run_grant_uses_tenant_policy',
857
+ [],
858
+ ),
859
+ await migrationObjectState([
860
+ () => database.schema.hasIndex('agent_run_grant_expiry_idx'),
861
+ ]),
862
+ ];
863
+ if (states.every((state) => state === 'complete')) return 'complete';
864
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
865
+ },
866
+ },
867
+ {
868
+ id: '0005_long_running_limits',
869
+ sql: { postgresql: AGENTS_MIGRATION_005 },
870
+ inspectExisting: (database) =>
871
+ migrationObjectState([
872
+ () => database.schema.hasTable('agent_definition_execution_limits'),
873
+ () => database.schema.hasTable('agent_run_execution_limits'),
874
+ ]),
875
+ },
876
+ {
877
+ id: '0006_agent_skills',
878
+ sql: { postgresql: AGENTS_MIGRATION_006 },
879
+ inspectExisting: async (database) => {
880
+ const states = [
881
+ await postgresTenantTableState(
882
+ database,
883
+ 'agent_skills',
884
+ 'agent_skills_tenant_policy',
885
+ [],
886
+ ),
887
+ await postgresTenantTableState(
888
+ database,
889
+ 'agent_skill_assignments',
890
+ 'agent_skill_assignments_tenant_policy',
891
+ [],
892
+ ),
893
+ await migrationObjectState([
894
+ () => database.schema.hasTable('agent_run_skill_snapshots'),
895
+ () => database.schema.hasIndex('agent_skills_tenant_name_idx'),
896
+ ]),
897
+ ];
898
+ if (states.every((state) => state === 'complete')) return 'complete';
899
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
900
+ },
901
+ },
902
+ {
903
+ id: '0007_model_readiness',
904
+ sql: { postgresql: AGENTS_MIGRATION_007 },
905
+ inspectExisting: (database) =>
906
+ migrationObjectState([
907
+ () => database.schema.hasTable('agent_provider_model_readiness'),
908
+ ]),
909
+ },
910
+ {
911
+ id: '0008_output_limits',
912
+ sql: { postgresql: AGENTS_MIGRATION_008 },
913
+ inspectExisting: (database) =>
914
+ migrationObjectState([
915
+ () => database.schema.hasTable('agent_definition_output_limits'),
916
+ () => database.schema.hasTable('agent_run_output_limits'),
917
+ ]),
918
+ },
919
+ {
920
+ id: '0009_agent_audit_v3',
921
+ sql: { postgresql: AGENTS_MIGRATION_009 },
922
+ inspectExisting: async (database) => {
923
+ const states = [
924
+ await postgresTenantTableState(
925
+ database,
926
+ 'agent_audit_events_v3',
927
+ 'agent_audit_events_v3_tenant_policy',
928
+ [],
929
+ ),
930
+ await migrationObjectState([
931
+ () => database.schema.hasIndex('agent_audit_v3_tenant_time_idx'),
932
+ ]),
933
+ ];
934
+ if (states.every((state) => state === 'complete')) return 'complete';
935
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
936
+ },
937
+ },
938
+ {
939
+ id: '0012_agent_run_costs',
940
+ sql: { postgresql: AGENTS_MIGRATION_012 },
941
+ inspectExisting: async (database) => {
942
+ const states = [
943
+ await postgresTenantTableState(
944
+ database,
945
+ 'agent_run_costs',
946
+ 'agent_run_costs_tenant_policy',
947
+ [],
948
+ ),
949
+ await migrationObjectState([
950
+ () => database.schema.hasIndex('agent_run_costs_tenant_agent_idx'),
951
+ () => database.schema.hasIndex('agent_run_costs_tenant_day_idx'),
952
+ ]),
953
+ ];
954
+ if (states.every((state) => state === 'complete')) return 'complete';
955
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
956
+ },
957
+ },
958
+ {
959
+ id: '0013_workflow_prerequisites',
960
+ sql: { postgresql: AGENTS_MIGRATION_013 },
961
+ inspectExisting: async (database) => {
962
+ const states = [
963
+ await postgresTenantTableState(
964
+ database,
965
+ 'agent_definition_revisions',
966
+ 'agent_definition_revisions_tenant_policy',
967
+ [],
968
+ ),
969
+ await postgresTenantTableState(
970
+ database,
971
+ 'agent_run_contracts',
972
+ 'agent_run_contracts_tenant_policy',
973
+ [],
974
+ ),
975
+ await postgresTenantTableState(
976
+ database,
977
+ 'agent_action_invocations',
978
+ 'agent_action_invocations_tenant_policy',
979
+ [],
980
+ ),
981
+ await migrationObjectState([
982
+ () => database.schema.hasIndex('agent_actions_recovery_idx'),
983
+ () => database.schema.hasIndex('agent_actions_tenant_workflow_idx'),
984
+ () =>
985
+ database.schema.hasIndex(
986
+ 'agent_definition_revisions_tenant_agent_idx',
987
+ ),
988
+ () =>
989
+ database.schema.hasIndex('agent_run_contracts_tenant_workflow_idx'),
990
+ ]),
991
+ ];
992
+ if (states.every((state) => state === 'complete')) return 'complete';
993
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
994
+ },
995
+ },
996
+ {
997
+ id: '0014_agent_action_audit',
998
+ sql: { postgresql: AGENTS_MIGRATION_014 },
999
+ inspectExisting: async (database) => {
1000
+ const states = [
1001
+ await postgresTenantTableState(
1002
+ database,
1003
+ 'agent_audit_events_v4',
1004
+ 'agent_audit_events_v4_tenant_policy',
1005
+ [],
1006
+ ),
1007
+ await migrationObjectState([
1008
+ () => database.schema.hasIndex('agent_audit_v4_tenant_time_idx'),
1009
+ ]),
1010
+ ];
1011
+ if (states.every((state) => state === 'complete')) return 'complete';
1012
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
1013
+ },
1014
+ },
1015
+ {
1016
+ id: '0015_agent_run_actors',
1017
+ sql: { postgresql: AGENTS_MIGRATION_015 },
1018
+ inspectExisting: async (database) => {
1019
+ const states = [
1020
+ await postgresTenantTableState(
1021
+ database,
1022
+ 'agent_run_actors',
1023
+ 'agent_run_actors_tenant_policy',
1024
+ [],
1025
+ ),
1026
+ await migrationObjectState([
1027
+ () => database.schema.hasIndex('agent_run_actors_tenant_idx'),
1028
+ ]),
1029
+ ];
1030
+ if (states.every((state) => state === 'complete')) return 'complete';
1031
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
1032
+ },
1033
+ },
1034
+ {
1035
+ id: '0016_module_owned_agents',
1036
+ sql: { postgresql: AGENTS_MIGRATION_016 },
1037
+ inspectExisting: async (database) => {
1038
+ const states = [
1039
+ await postgresTenantTableState(
1040
+ database,
1041
+ 'module_agent_bindings',
1042
+ 'module_agent_bindings_tenant_policy',
1043
+ [],
1044
+ ),
1045
+ await postgresTenantTableState(
1046
+ database,
1047
+ 'agent_revision_ownership',
1048
+ 'agent_revision_ownership_tenant_policy',
1049
+ [],
1050
+ ),
1051
+ await migrationObjectState([
1052
+ () => database.schema.hasTable('module_agent_definitions'),
1053
+ () =>
1054
+ database.schema.hasIndex('module_agent_bindings_tenant_status_idx'),
1055
+ ]),
1056
+ ];
1057
+ if (states.every((state) => state === 'complete')) return 'complete';
1058
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
1059
+ },
1060
+ },
1061
+ {
1062
+ id: '0017_agent_authorization_subjects',
1063
+ sql: { postgresql: AGENTS_MIGRATION_017 },
1064
+ inspectExisting: (database) =>
1065
+ migrationObjectState([
1066
+ () =>
1067
+ database.schema.hasColumn(
1068
+ 'agent_run_actors',
1069
+ 'authorization_subject_json',
1070
+ ),
1071
+ () =>
1072
+ database.schema.hasColumn(
1073
+ 'agent_action_invocations',
1074
+ 'authorization_subject_json',
1075
+ ),
1076
+ ]),
1077
+ },
1078
+ {
1079
+ id: '0018_agent_child_tenant_isolation',
1080
+ sql: { postgresql: AGENTS_MIGRATION_0018 },
1081
+ inspectExisting: (database) =>
1082
+ migrationObjectState([
1083
+ () =>
1084
+ database.schema.hasColumn('agent_run_skill_snapshots', 'tenant_id'),
1085
+ () =>
1086
+ database.schema.hasColumn(
1087
+ 'agent_provider_model_readiness',
1088
+ 'tenant_id',
1089
+ ),
1090
+ ]),
1091
+ },
1092
+ {
1093
+ id: '0019_background_recovery_grants',
1094
+ sql: { postgresql: AGENTS_MIGRATION_019 },
1095
+ inspectExisting: (database) =>
1096
+ migrationObjectState([
1097
+ () =>
1098
+ policyPresent(database, 'agent_runs', 'agent_runs_background_policy'),
1099
+ () =>
1100
+ policyPresent(
1101
+ database,
1102
+ 'agent_action_invocations',
1103
+ 'agent_action_invocations_background_policy',
1104
+ ),
1105
+ ]),
1106
+ },
1107
+ {
1108
+ id: '0020_provider_summary_role',
1109
+ sql: { postgresql: AGENTS_MIGRATION_0020 },
1110
+ /* Only the policy proves this migration ran; it creates no object the
1111
+ schema reader can see. */
1112
+ inspectExisting: (database) =>
1113
+ migrationObjectState([
1114
+ () =>
1115
+ policyPresent(
1116
+ database,
1117
+ 'agent_provider_connections',
1118
+ 'agent_provider_connections_background_policy',
1119
+ ),
1120
+ ]),
1121
+ },
1122
+ {
1123
+ id: '0021_agents_agent_reconciliation_role',
1124
+ sql: { postgresql: AGENTS_MIGRATION_0021 },
1125
+ inspectExisting: (database) =>
1126
+ migrationObjectState([
1127
+ () =>
1128
+ policyPresent(
1129
+ database,
1130
+ 'agent_definitions',
1131
+ 'agent_definitions_reconciliation_policy',
1132
+ ),
1133
+ () =>
1134
+ policyPresent(
1135
+ database,
1136
+ 'module_agent_bindings',
1137
+ 'module_agent_bindings_reconciliation_policy',
1138
+ ),
1139
+ async () => {
1140
+ const result = await database.query<{ granted: boolean }>({
1141
+ text: `SELECT CASE WHEN to_regclass('agent_definitions') IS NOT NULL
1142
+ AND to_regclass('module_agent_bindings') IS NOT NULL THEN
1143
+ has_column_privilege('coreloom_background', 'agent_definitions', 'tenant_id', 'SELECT')
1144
+ AND has_column_privilege('coreloom_background', 'module_agent_bindings', 'tenant_id', 'SELECT')
1145
+ AND has_column_privilege('coreloom_background', 'module_agent_bindings', 'agent_id', 'SELECT')
1146
+ ELSE false END AS granted`,
1147
+ });
1148
+ return result.rows[0]?.granted === true;
1149
+ },
1150
+ ]),
1151
+ },
1152
+ ];