@flowdular/sdk 0.2.4 → 0.3.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 (908) hide show
  1. package/.ai/agents/sandbox/business-manager.md +5 -1
  2. package/.ai/blueprints/author-spec/README.md +1 -1
  3. package/.ai/blueprints/author-spec/spec-requirements.yaml +44 -0
  4. package/.ai/blueprints/author-spec/steps.yaml +5 -5
  5. package/.ai/blueprints/author-spec/templates/module.yaml +99 -3
  6. package/.ai/blueprints/edit-module/gates.yaml +4 -0
  7. package/.ai/blueprints/edit-module/required-files.yaml +9 -0
  8. package/.ai/blueprints/new-module/gates.yaml +4 -0
  9. package/.ai/blueprints/new-module/spec-requirements.yaml +2 -2
  10. package/.ai/blueprints/release/gates.yaml +4 -0
  11. package/.ai/platform-capabilities.md +128 -0
  12. package/.ai/policies/capabilities.yaml +100 -0
  13. package/.ai/policies/path-ownership.yaml +5 -2
  14. package/.ai/policies/task-budgets.yaml +5 -3
  15. package/.ai/references/catalog/module.json +4 -4
  16. package/.ai/references/catalog/package.json +2 -2
  17. package/.ai/references/catalog/spec/module.yaml +5 -3
  18. package/.ai/references/catalog/src/platform.ts +2 -0
  19. package/.ai/references/catalog/src/services/catalog-service.ts +89 -1
  20. package/.ai/references/catalog/src/services/data-classes.ts +47 -0
  21. package/.ai/references/catalog/src/services/database-repository.ts +98 -1
  22. package/.ai/references/catalog/src/services/repository.ts +22 -1
  23. package/.ai/references/catalog/tests/data-classes.test.ts +157 -0
  24. package/.ai/references/catalog.provenance.json +12 -10
  25. package/.ai/skills/README.md +10 -0
  26. package/.ai/skills/agent-tool-design/SKILL.md +1 -2
  27. package/.ai/skills/auth-security-review/SKILL.md +1 -1
  28. package/.ai/skills/business-agent-design/SKILL.md +0 -1
  29. package/.ai/skills/deploy-operate/SKILL.md +114 -0
  30. package/.ai/skills/module-new/SKILL.md +29 -3
  31. package/.ai/skills/module-update/SKILL.md +9 -3
  32. package/.ai/skills/perf-audit/SKILL.md +0 -1
  33. package/.ai/skills/release-eject-pr/SKILL.md +0 -1
  34. package/.ai/skills/spec-interview/SKILL.md +120 -0
  35. package/.ai/skills/test-hardening/SKILL.md +1 -0
  36. package/.ai/skills/ux-design/SKILL.md +34 -3
  37. package/.ai/skills/variables/SKILL.md +0 -2
  38. package/.ai/skills/workflow-development/SKILL.md +0 -1
  39. package/AGENTS.md +4 -0
  40. package/docs/agent-contract.md +2 -2
  41. package/docs/design-system.md +185 -31
  42. package/modules/access/migrations/0001_access_core.down.sql +1 -0
  43. package/modules/access/migrations/0001_access_core.up.sql +28 -0
  44. package/modules/access/migrations/README.md +3 -0
  45. package/modules/access/module.json +33 -0
  46. package/modules/access/package.json +43 -0
  47. package/modules/access/spec/module.yaml +225 -0
  48. package/modules/access/src/acl/permissions.ts +6 -0
  49. package/modules/access/src/api/endpoints.ts +244 -0
  50. package/modules/access/src/client/ActivityView.tsrx +245 -0
  51. package/modules/access/src/client/AttestationsView.tsrx +176 -0
  52. package/modules/access/src/client/ReviewView.tsrx +586 -0
  53. package/modules/access/src/client/api.ts +132 -0
  54. package/modules/access/src/client/contribution.tsrx +41 -0
  55. package/modules/access/src/client/index.ts +41 -0
  56. package/modules/access/src/client/navigation.ts +57 -0
  57. package/modules/access/src/client/presentation.ts +69 -0
  58. package/modules/access/src/client/state.ts +72 -0
  59. package/modules/access/src/domain/types.ts +189 -0
  60. package/modules/access/src/index.ts +38 -0
  61. package/modules/access/src/platform.ts +60 -0
  62. package/modules/access/src/server/index.ts +42 -0
  63. package/modules/access/src/server/runtime.ts +105 -0
  64. package/modules/access/src/services/access-service.ts +298 -0
  65. package/modules/access/src/services/audit-window.ts +78 -0
  66. package/modules/access/src/services/auth-directory.ts +72 -0
  67. package/modules/access/src/services/changes.ts +91 -0
  68. package/modules/access/src/services/data-classes.ts +28 -0
  69. package/modules/access/src/services/database-repository.ts +185 -0
  70. package/modules/access/src/services/directory.ts +102 -0
  71. package/modules/access/src/services/index.ts +33 -0
  72. package/modules/access/src/services/list-exports.ts +150 -0
  73. package/modules/access/src/services/migration.ts +54 -0
  74. package/modules/access/src/services/repository.ts +30 -0
  75. package/modules/access/src/services/review.ts +178 -0
  76. package/modules/access/translations/en.json +155 -0
  77. package/modules/access/translations/pl.json +155 -0
  78. package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
  79. package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
  80. package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
  81. package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
  82. package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
  83. package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
  84. package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
  85. package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
  86. package/modules/agents/module.json +30 -4
  87. package/modules/agents/package.json +2 -1
  88. package/modules/agents/spec/module.yaml +63 -5
  89. package/modules/agents/src/api/endpoints.ts +291 -33
  90. package/modules/agents/src/cli/commands.json +11 -0
  91. package/modules/agents/src/cli/index.ts +45 -0
  92. package/modules/agents/src/client/AgentDashboardWidget.tsrx +19 -11
  93. package/modules/agents/src/client/AgentDefinitionList.tsrx +53 -10
  94. package/modules/agents/src/client/AgentPlaygroundView.tsrx +4 -4
  95. package/modules/agents/src/client/AgentProceduresView.tsrx +2 -2
  96. package/modules/agents/src/client/AgentRunsView.tsrx +143 -40
  97. package/modules/agents/src/client/AgentsView.tsrx +109 -33
  98. package/modules/agents/src/client/api.ts +99 -21
  99. package/modules/agents/src/client/state.ts +97 -0
  100. package/modules/agents/src/domain/types.ts +44 -4
  101. package/modules/agents/src/platform.ts +42 -0
  102. package/modules/agents/src/server/action-execution.ts +201 -106
  103. package/modules/agents/src/server/runtime.ts +32 -0
  104. package/modules/agents/src/services/agent-service.ts +158 -30
  105. package/modules/agents/src/services/credential-rotation.ts +185 -0
  106. package/modules/agents/src/services/credential-vault.ts +71 -46
  107. package/modules/agents/src/services/data-classes.ts +176 -0
  108. package/modules/agents/src/services/database-repository.ts +393 -101
  109. package/modules/agents/src/services/metering.ts +111 -0
  110. package/modules/agents/src/services/migration.ts +109 -0
  111. package/modules/agents/src/services/module-agent-preflight.ts +17 -9
  112. package/modules/agents/src/services/notifications.ts +98 -0
  113. package/modules/agents/src/services/provider-repository.ts +9 -18
  114. package/modules/agents/src/services/provider-service.ts +1 -9
  115. package/modules/agents/src/services/reports.ts +107 -0
  116. package/modules/agents/src/services/repository.ts +86 -6
  117. package/modules/agents/src/services/usage-service.ts +2 -0
  118. package/modules/agents/src/services/worker.ts +114 -4
  119. package/modules/agents/src/settings.ts +14 -3
  120. package/modules/agents/translations/en.json +14 -4
  121. package/modules/agents/translations/pl.json +14 -4
  122. package/modules/approvals/migrations/0001_approvals_core.down.sql +3 -0
  123. package/modules/approvals/migrations/0001_approvals_core.up.sql +78 -0
  124. package/modules/approvals/migrations/0002_approvals_expiry_routing_role.down.sql +2 -0
  125. package/modules/approvals/migrations/0002_approvals_expiry_routing_role.up.sql +19 -0
  126. package/modules/approvals/migrations/0003_approvals_retention_indexes.down.sql +6 -0
  127. package/modules/approvals/migrations/0003_approvals_retention_indexes.up.sql +14 -0
  128. package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.down.sql +5 -0
  129. package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.up.sql +12 -0
  130. package/modules/approvals/migrations/README.md +3 -0
  131. package/modules/approvals/module.json +34 -0
  132. package/modules/approvals/package.json +43 -0
  133. package/modules/approvals/spec/module.yaml +318 -0
  134. package/modules/approvals/src/acl/permissions.ts +7 -0
  135. package/modules/approvals/src/api/endpoints.ts +457 -0
  136. package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
  137. package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
  138. package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
  139. package/modules/approvals/src/client/api.ts +203 -0
  140. package/modules/approvals/src/client/approvals.css +51 -0
  141. package/modules/approvals/src/client/contribution.tsrx +44 -0
  142. package/modules/approvals/src/client/index.ts +26 -0
  143. package/modules/approvals/src/client/navigation.ts +39 -0
  144. package/modules/approvals/src/client/pending-count.ts +26 -0
  145. package/modules/approvals/src/client/presentation.ts +52 -0
  146. package/modules/approvals/src/client/state.ts +141 -0
  147. package/modules/approvals/src/domain/capability.ts +95 -0
  148. package/modules/approvals/src/domain/types.ts +154 -0
  149. package/modules/approvals/src/index.ts +52 -0
  150. package/modules/approvals/src/platform.ts +128 -0
  151. package/modules/approvals/src/server/index.ts +42 -0
  152. package/modules/approvals/src/server/runtime.ts +181 -0
  153. package/modules/approvals/src/services/approvals-service.ts +557 -0
  154. package/modules/approvals/src/services/callbacks.ts +75 -0
  155. package/modules/approvals/src/services/data-classes.ts +167 -0
  156. package/modules/approvals/src/services/database-repository.ts +724 -0
  157. package/modules/approvals/src/services/eligibility.ts +121 -0
  158. package/modules/approvals/src/services/expiry-runner.ts +81 -0
  159. package/modules/approvals/src/services/index.ts +31 -0
  160. package/modules/approvals/src/services/migration.ts +222 -0
  161. package/modules/approvals/src/services/notifications.ts +95 -0
  162. package/modules/approvals/src/services/repository.ts +161 -0
  163. package/modules/approvals/src/services/service-error.ts +70 -0
  164. package/modules/approvals/src/settings.ts +102 -0
  165. package/modules/approvals/translations/en.json +104 -0
  166. package/modules/approvals/translations/pl.json +104 -0
  167. package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
  168. package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
  169. package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
  170. package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
  171. package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
  172. package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
  173. package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
  174. package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
  175. package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
  176. package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
  177. package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
  178. package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
  179. package/modules/audit/migrations/README.md +3 -0
  180. package/modules/audit/module.json +32 -0
  181. package/modules/audit/package.json +49 -0
  182. package/modules/audit/spec/module.yaml +809 -0
  183. package/modules/audit/src/acl/permissions.ts +7 -0
  184. package/modules/audit/src/api/endpoints.ts +315 -0
  185. package/modules/audit/src/cli/commands.json +95 -0
  186. package/modules/audit/src/cli/index.ts +658 -0
  187. package/modules/audit/src/client/DataClassesView.tsrx +420 -0
  188. package/modules/audit/src/client/ExportsView.tsrx +256 -0
  189. package/modules/audit/src/client/HoldsView.tsrx +604 -0
  190. package/modules/audit/src/client/SweepsView.tsrx +251 -0
  191. package/modules/audit/src/client/api.ts +185 -0
  192. package/modules/audit/src/client/contribution.tsrx +52 -0
  193. package/modules/audit/src/client/index.ts +23 -0
  194. package/modules/audit/src/client/navigation.ts +74 -0
  195. package/modules/audit/src/client/presentation.ts +105 -0
  196. package/modules/audit/src/client/state.ts +86 -0
  197. package/modules/audit/src/domain/data-classes.ts +16 -0
  198. package/modules/audit/src/domain/types.ts +339 -0
  199. package/modules/audit/src/index.ts +76 -0
  200. package/modules/audit/src/platform.ts +44 -0
  201. package/modules/audit/src/server/index.ts +177 -0
  202. package/modules/audit/src/server/runtime.ts +303 -0
  203. package/modules/audit/src/services/anchor-key.ts +143 -0
  204. package/modules/audit/src/services/anchor-rotation.ts +147 -0
  205. package/modules/audit/src/services/audit-runners.ts +278 -0
  206. package/modules/audit/src/services/backup-guard.ts +95 -0
  207. package/modules/audit/src/services/database-repository.ts +1946 -0
  208. package/modules/audit/src/services/declared-classes.ts +64 -0
  209. package/modules/audit/src/services/erasure-port.ts +126 -0
  210. package/modules/audit/src/services/erasure-service.ts +770 -0
  211. package/modules/audit/src/services/export-directory.ts +106 -0
  212. package/modules/audit/src/services/export-service.ts +714 -0
  213. package/modules/audit/src/services/hold-service.ts +295 -0
  214. package/modules/audit/src/services/index.ts +17 -0
  215. package/modules/audit/src/services/migration.ts +658 -0
  216. package/modules/audit/src/services/own-classes.ts +318 -0
  217. package/modules/audit/src/services/platform-version.ts +23 -0
  218. package/modules/audit/src/services/repository.ts +495 -0
  219. package/modules/audit/src/services/retention-service.ts +191 -0
  220. package/modules/audit/src/services/seal-service.ts +769 -0
  221. package/modules/audit/src/services/service-error.ts +61 -0
  222. package/modules/audit/src/services/subject-keys.ts +90 -0
  223. package/modules/audit/src/services/sweep-service.ts +298 -0
  224. package/modules/audit/src/services/zip.ts +217 -0
  225. package/modules/audit/src/settings.ts +69 -0
  226. package/modules/audit/translations/en.json +210 -0
  227. package/modules/audit/translations/pl.json +210 -0
  228. package/modules/auth/README.md +77 -29
  229. package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
  230. package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
  231. package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
  232. package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
  233. package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
  234. package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
  235. package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
  236. package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
  237. package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
  238. package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
  239. package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
  240. package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
  241. package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
  242. package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
  243. package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
  244. package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
  245. package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
  246. package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
  247. package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
  248. package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
  249. package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
  250. package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
  251. package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
  252. package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
  253. package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
  254. package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
  255. package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
  256. package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
  257. package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
  258. package/modules/auth/module.json +3 -3
  259. package/modules/auth/package.json +2 -1
  260. package/modules/auth/spec/module.yaml +372 -3
  261. package/modules/auth/src/acl/scopes.ts +50 -6
  262. package/modules/auth/src/cli/commands.json +11 -0
  263. package/modules/auth/src/cli/greenfield.ts +2 -2
  264. package/modules/auth/src/cli/index.ts +14 -0
  265. package/modules/auth/src/cli/secrets.ts +114 -0
  266. package/modules/auth/src/client/AuthenticationCore.tsrx +61 -8
  267. package/modules/auth/src/client/api.ts +72 -6
  268. package/modules/auth/src/client/contribution.tsrx +23 -0
  269. package/modules/auth/src/client/index.ts +6 -0
  270. package/modules/auth/src/client/providers/IdentityProviderForm.tsrx +191 -0
  271. package/modules/auth/src/client/providers/IdentityProvidersView.tsrx +358 -0
  272. package/modules/auth/src/client/providers/api.ts +128 -0
  273. package/modules/auth/src/client/providers/provider-columns.tsrx +60 -0
  274. package/modules/auth/src/client/providers/state.ts +35 -0
  275. package/modules/auth/src/client/security/SecurityView.tsrx +9 -1
  276. package/modules/auth/src/client/state.ts +15 -1
  277. package/modules/auth/src/domain/types.ts +55 -0
  278. package/modules/auth/src/index.ts +11 -1
  279. package/modules/auth/src/middleware/authentication.ts +4 -0
  280. package/modules/auth/src/server/endpoints.ts +467 -171
  281. package/modules/auth/src/server/http.ts +3 -2
  282. package/modules/auth/src/server/index.ts +22 -1
  283. package/modules/auth/src/server/membership-endpoints.ts +62 -0
  284. package/modules/auth/src/server/mfa-enforcement.ts +156 -0
  285. package/modules/auth/src/server/oidc.ts +389 -0
  286. package/modules/auth/src/server/provider-endpoints.ts +246 -0
  287. package/modules/auth/src/server/provider-host.ts +77 -0
  288. package/modules/auth/src/server/runtime.ts +231 -55
  289. package/modules/auth/src/services/auth-service-error.ts +7 -2
  290. package/modules/auth/src/services/auth-service.ts +948 -51
  291. package/modules/auth/src/services/data-classes.ts +236 -0
  292. package/modules/auth/src/services/database-repository.ts +853 -71
  293. package/modules/auth/src/services/identity-provider-service.ts +571 -0
  294. package/modules/auth/src/services/mail-delivery.ts +16 -16
  295. package/modules/auth/src/services/mail-message.ts +54 -0
  296. package/modules/auth/src/services/mail-port.ts +24 -0
  297. package/modules/auth/src/services/mail-smtp.ts +85 -0
  298. package/modules/auth/src/services/mfa-rotation.ts +144 -0
  299. package/modules/auth/src/services/migration.ts +810 -0
  300. package/modules/auth/src/services/password.ts +14 -0
  301. package/modules/auth/src/services/provider-secret-rotation.ts +169 -0
  302. package/modules/auth/src/services/provider-secrets.ts +136 -0
  303. package/modules/auth/src/services/repository.ts +321 -5
  304. package/modules/auth/src/services/session-sweep-runner.ts +73 -0
  305. package/modules/auth/src/services/settings-store.ts +10 -83
  306. package/modules/auth/src/services/totp.ts +88 -62
  307. package/modules/auth/src/services/validation.ts +194 -7
  308. package/modules/auth/src/settings.ts +18 -0
  309. package/modules/auth/translations/en.json +84 -1
  310. package/modules/auth/translations/pl.json +84 -1
  311. package/modules/automations/migrations/0005_secret_rotation_inventory.down.sql +1 -0
  312. package/modules/automations/migrations/0005_secret_rotation_inventory.up.sql +6 -0
  313. package/modules/automations/migrations/0006_automations_list_sort_indexes.down.sql +4 -0
  314. package/modules/automations/migrations/0006_automations_list_sort_indexes.up.sql +11 -0
  315. package/modules/automations/module.json +24 -6
  316. package/modules/automations/package.json +4 -1
  317. package/modules/automations/spec/module.yaml +81 -7
  318. package/modules/automations/src/api/endpoints.ts +202 -28
  319. package/modules/automations/src/cli/commands.json +17 -0
  320. package/modules/automations/src/cli/index.ts +114 -0
  321. package/modules/automations/src/client/AutomationScheduleForm.tsrx +77 -19
  322. package/modules/automations/src/client/AutomationSchedulesView.tsrx +144 -40
  323. package/modules/automations/src/client/AutomationTriggersView.tsrx +131 -32
  324. package/modules/automations/src/client/api.ts +62 -19
  325. package/modules/automations/src/client/presentation.ts +20 -2
  326. package/modules/automations/src/client/state.ts +84 -0
  327. package/modules/automations/src/domain/cadence.ts +99 -3
  328. package/modules/automations/src/domain/cron.ts +366 -0
  329. package/modules/automations/src/domain/time-zone.ts +61 -0
  330. package/modules/automations/src/platform.ts +38 -4
  331. package/modules/automations/src/server/index.ts +11 -0
  332. package/modules/automations/src/server/runtime.ts +46 -22
  333. package/modules/{automations-workflows-integration/src/server/adapter.ts → automations/src/server/workflow-target.ts} +13 -14
  334. package/modules/{automations-workflows-integration/src/server/tools.ts → automations/src/server/workflow-tools.ts} +0 -0
  335. package/modules/automations/src/services/data-classes.ts +62 -0
  336. package/modules/automations/src/services/database-repository.ts +152 -38
  337. package/modules/automations/src/services/migration.ts +119 -9
  338. package/modules/automations/src/services/repository.ts +52 -1
  339. package/modules/automations/src/services/schedule-runner.ts +84 -0
  340. package/modules/automations/src/services/schedule-service.ts +152 -26
  341. package/modules/automations/src/services/secret-rotation.ts +176 -0
  342. package/modules/automations/src/services/secret-vault.ts +68 -41
  343. package/modules/automations/src/services/trigger-service.ts +13 -10
  344. package/modules/automations/translations/en.json +15 -2
  345. package/modules/automations/translations/pl.json +15 -2
  346. package/modules/connectors/migrations/0001_connectors_core.down.sql +3 -0
  347. package/modules/connectors/migrations/0001_connectors_core.up.sql +72 -0
  348. package/modules/connectors/migrations/0002_connectors_call_keys.down.sql +3 -0
  349. package/modules/connectors/migrations/0002_connectors_call_keys.up.sql +18 -0
  350. package/modules/connectors/migrations/README.md +3 -0
  351. package/modules/connectors/module.json +28 -0
  352. package/modules/{automations-workflows-integration → connectors}/package.json +27 -26
  353. package/modules/connectors/spec/module.yaml +447 -0
  354. package/modules/connectors/src/acl/permissions.ts +6 -0
  355. package/modules/connectors/src/agent/tools.ts +180 -0
  356. package/modules/connectors/src/api/endpoints.ts +572 -0
  357. package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
  358. package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
  359. package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
  360. package/modules/connectors/src/client/api.ts +281 -0
  361. package/modules/connectors/src/client/consent.ts +48 -0
  362. package/modules/connectors/src/client/contribution.tsrx +37 -0
  363. package/modules/connectors/src/client/index.ts +22 -0
  364. package/modules/connectors/src/client/navigation.ts +42 -0
  365. package/modules/connectors/src/client/presentation.ts +38 -0
  366. package/modules/connectors/src/client/state.ts +175 -0
  367. package/modules/connectors/src/domain/calls.ts +70 -0
  368. package/modules/connectors/src/domain/definitions.ts +190 -0
  369. package/modules/connectors/src/domain/http-json.ts +68 -0
  370. package/modules/connectors/src/domain/types.ts +185 -0
  371. package/modules/connectors/src/index.ts +64 -0
  372. package/modules/connectors/src/platform.ts +56 -0
  373. package/modules/connectors/src/server/index.ts +66 -0
  374. package/modules/connectors/src/server/runtime.ts +163 -0
  375. package/modules/connectors/src/services/call-service.ts +903 -0
  376. package/modules/connectors/src/services/connectors-service.ts +653 -0
  377. package/modules/connectors/src/services/credential-vault.ts +188 -0
  378. package/modules/connectors/src/services/data-classes.ts +158 -0
  379. package/modules/connectors/src/services/database-repository.ts +897 -0
  380. package/modules/connectors/src/services/egress.ts +261 -0
  381. package/modules/connectors/src/services/index.ts +19 -0
  382. package/modules/connectors/src/services/migration.ts +166 -0
  383. package/modules/connectors/src/services/repository.ts +175 -0
  384. package/modules/connectors/src/services/service-error.ts +46 -0
  385. package/modules/connectors/src/settings.ts +69 -0
  386. package/modules/connectors/translations/en.json +191 -0
  387. package/modules/connectors/translations/pl.json +191 -0
  388. package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
  389. package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
  390. package/modules/directory/migrations/README.md +3 -0
  391. package/modules/directory/module.json +27 -0
  392. package/modules/directory/package.json +46 -0
  393. package/modules/directory/spec/module.yaml +351 -0
  394. package/modules/directory/src/acl/permissions.ts +7 -0
  395. package/modules/directory/src/api/endpoints.ts +478 -0
  396. package/modules/directory/src/api/scim-endpoints.ts +516 -0
  397. package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
  398. package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
  399. package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
  400. package/modules/directory/src/client/api.ts +222 -0
  401. package/modules/directory/src/client/contribution.tsrx +46 -0
  402. package/modules/directory/src/client/index.ts +22 -0
  403. package/modules/directory/src/client/navigation.ts +57 -0
  404. package/modules/directory/src/client/presentation.ts +143 -0
  405. package/modules/directory/src/client/state.ts +173 -0
  406. package/modules/directory/src/domain/scim.ts +346 -0
  407. package/modules/directory/src/domain/types.ts +166 -0
  408. package/modules/directory/src/index.ts +44 -0
  409. package/modules/directory/src/platform.ts +43 -0
  410. package/modules/directory/src/server/index.ts +17 -0
  411. package/modules/directory/src/server/runtime.ts +124 -0
  412. package/modules/directory/src/services/auth-port.ts +127 -0
  413. package/modules/directory/src/services/data-classes.ts +41 -0
  414. package/modules/directory/src/services/database-repository.ts +1067 -0
  415. package/modules/directory/src/services/directory-service.ts +311 -0
  416. package/modules/directory/src/services/index.ts +43 -0
  417. package/modules/directory/src/services/migration.ts +146 -0
  418. package/modules/directory/src/services/provisioning-service.ts +1420 -0
  419. package/modules/directory/src/services/rate-limiter.ts +103 -0
  420. package/modules/directory/src/services/repository.ts +208 -0
  421. package/modules/directory/src/services/service-error.ts +42 -0
  422. package/modules/directory/src/services/token-service.ts +215 -0
  423. package/modules/directory/src/settings.ts +86 -0
  424. package/modules/directory/translations/en.json +185 -0
  425. package/modules/directory/translations/pl.json +185 -0
  426. package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
  427. package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
  428. package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
  429. package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
  430. package/modules/documents/migrations/README.md +3 -0
  431. package/modules/documents/module.json +28 -0
  432. package/modules/documents/package.json +49 -0
  433. package/modules/documents/spec/module.yaml +247 -0
  434. package/modules/documents/src/acl/permissions.ts +6 -0
  435. package/modules/documents/src/api/endpoints.ts +401 -0
  436. package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
  437. package/modules/documents/src/client/DocumentsView.tsrx +540 -0
  438. package/modules/documents/src/client/api.ts +209 -0
  439. package/modules/documents/src/client/contribution.tsrx +29 -0
  440. package/modules/documents/src/client/download.ts +70 -0
  441. package/modules/documents/src/client/index.ts +22 -0
  442. package/modules/documents/src/client/navigation.ts +25 -0
  443. package/modules/documents/src/client/presentation.ts +110 -0
  444. package/modules/documents/src/client/state.ts +117 -0
  445. package/modules/documents/src/domain/attachments.ts +84 -0
  446. package/modules/documents/src/domain/types.ts +80 -0
  447. package/modules/documents/src/index.ts +46 -0
  448. package/modules/documents/src/platform.ts +61 -0
  449. package/modules/documents/src/server/index.ts +30 -0
  450. package/modules/documents/src/server/runtime.ts +107 -0
  451. package/modules/documents/src/services/attachments.ts +39 -0
  452. package/modules/documents/src/services/data-classes.ts +25 -0
  453. package/modules/documents/src/services/database-repository.ts +259 -0
  454. package/modules/documents/src/services/documents-service.ts +586 -0
  455. package/modules/documents/src/services/index.ts +18 -0
  456. package/modules/documents/src/services/migration.ts +82 -0
  457. package/modules/documents/src/services/repository.ts +48 -0
  458. package/modules/documents/src/settings.ts +107 -0
  459. package/modules/documents/translations/en.json +111 -0
  460. package/modules/documents/translations/pl.json +111 -0
  461. package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
  462. package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
  463. package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
  464. package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
  465. package/modules/exports/migrations/README.md +3 -0
  466. package/modules/exports/module.json +28 -0
  467. package/modules/exports/package.json +44 -0
  468. package/modules/exports/spec/module.yaml +229 -0
  469. package/modules/exports/src/acl/permissions.ts +6 -0
  470. package/modules/exports/src/api/endpoints.ts +211 -0
  471. package/modules/exports/src/client/ExportsView.tsrx +327 -0
  472. package/modules/exports/src/client/api.ts +133 -0
  473. package/modules/exports/src/client/contribution.tsrx +31 -0
  474. package/modules/exports/src/client/index.ts +20 -0
  475. package/modules/exports/src/client/navigation.ts +25 -0
  476. package/modules/exports/src/client/presentation.ts +53 -0
  477. package/modules/exports/src/client/state.ts +56 -0
  478. package/modules/exports/src/domain/lists.ts +29 -0
  479. package/modules/exports/src/domain/types.ts +120 -0
  480. package/modules/exports/src/index.ts +41 -0
  481. package/modules/exports/src/platform.ts +80 -0
  482. package/modules/exports/src/server/index.ts +51 -0
  483. package/modules/exports/src/server/runtime.ts +160 -0
  484. package/modules/exports/src/services/data-classes.ts +56 -0
  485. package/modules/exports/src/services/database-repository.ts +405 -0
  486. package/modules/exports/src/services/export-runner.ts +123 -0
  487. package/modules/exports/src/services/export-service.ts +356 -0
  488. package/modules/exports/src/services/index.ts +6 -0
  489. package/modules/exports/src/services/list-registry.ts +105 -0
  490. package/modules/exports/src/services/migration.ts +89 -0
  491. package/modules/exports/src/services/repository.ts +97 -0
  492. package/modules/exports/src/settings.ts +70 -0
  493. package/modules/exports/translations/en.json +69 -0
  494. package/modules/exports/translations/pl.json +69 -0
  495. package/modules/import/migrations/0001_import_core.down.sql +6 -0
  496. package/modules/import/migrations/0001_import_core.up.sql +61 -0
  497. package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
  498. package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
  499. package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
  500. package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
  501. package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
  502. package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
  503. package/modules/import/migrations/README.md +3 -0
  504. package/modules/import/module.json +37 -0
  505. package/modules/import/package.json +50 -0
  506. package/modules/import/spec/module.yaml +335 -0
  507. package/modules/import/src/acl/permissions.ts +6 -0
  508. package/modules/import/src/api/endpoints.ts +400 -0
  509. package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
  510. package/modules/import/src/client/ImportsView.tsrx +455 -0
  511. package/modules/import/src/client/NewImportForm.tsrx +274 -0
  512. package/modules/import/src/client/api.ts +243 -0
  513. package/modules/import/src/client/contribution.tsrx +29 -0
  514. package/modules/import/src/client/index.ts +23 -0
  515. package/modules/import/src/client/navigation.ts +25 -0
  516. package/modules/import/src/client/presentation.ts +59 -0
  517. package/modules/import/src/client/state.ts +43 -0
  518. package/modules/import/src/domain/csv.ts +258 -0
  519. package/modules/import/src/domain/ports.ts +157 -0
  520. package/modules/import/src/domain/types.ts +179 -0
  521. package/modules/import/src/index.ts +58 -0
  522. package/modules/import/src/platform.ts +60 -0
  523. package/modules/import/src/server/index.ts +49 -0
  524. package/modules/import/src/server/runtime.ts +158 -0
  525. package/modules/import/src/services/csv-source.ts +121 -0
  526. package/modules/import/src/services/data-classes.ts +63 -0
  527. package/modules/import/src/services/database-repository.ts +780 -0
  528. package/modules/import/src/services/import-runner.ts +127 -0
  529. package/modules/import/src/services/import-service.ts +872 -0
  530. package/modules/import/src/services/index.ts +6 -0
  531. package/modules/import/src/services/migration.ts +156 -0
  532. package/modules/import/src/services/port-registry.ts +158 -0
  533. package/modules/import/src/services/repository.ts +147 -0
  534. package/modules/import/src/settings.ts +70 -0
  535. package/modules/import/translations/en.json +175 -0
  536. package/modules/import/translations/pl.json +175 -0
  537. package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
  538. package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
  539. package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
  540. package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
  541. package/modules/metering/migrations/README.md +3 -0
  542. package/modules/metering/module.json +46 -0
  543. package/modules/metering/package.json +50 -0
  544. package/modules/metering/spec/module.yaml +269 -0
  545. package/modules/metering/src/acl/permissions.ts +5 -0
  546. package/modules/metering/src/api/endpoints.ts +104 -0
  547. package/modules/metering/src/cli/commands.json +28 -0
  548. package/modules/metering/src/cli/index.ts +246 -0
  549. package/modules/metering/src/client/LimitsView.tsrx +170 -0
  550. package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
  551. package/modules/metering/src/client/UsageView.tsrx +205 -0
  552. package/modules/metering/src/client/api.ts +91 -0
  553. package/modules/metering/src/client/contribution.tsrx +42 -0
  554. package/modules/metering/src/client/index.ts +26 -0
  555. package/modules/metering/src/client/navigation.ts +54 -0
  556. package/modules/metering/src/client/presentation.ts +63 -0
  557. package/modules/metering/src/client/state.ts +31 -0
  558. package/modules/metering/src/domain/meters.ts +100 -0
  559. package/modules/metering/src/domain/types.ts +71 -0
  560. package/modules/metering/src/index.ts +51 -0
  561. package/modules/metering/src/platform.ts +84 -0
  562. package/modules/metering/src/server/index.ts +40 -0
  563. package/modules/metering/src/server/runtime.ts +165 -0
  564. package/modules/metering/src/services/data-classes.ts +34 -0
  565. package/modules/metering/src/services/database-repository.ts +574 -0
  566. package/modules/metering/src/services/index.ts +9 -0
  567. package/modules/metering/src/services/meter-registry.ts +145 -0
  568. package/modules/metering/src/services/metering-service.ts +441 -0
  569. package/modules/metering/src/services/migration.ts +183 -0
  570. package/modules/metering/src/services/notifications.ts +75 -0
  571. package/modules/metering/src/services/reports.ts +105 -0
  572. package/modules/metering/src/services/repository.ts +132 -0
  573. package/modules/metering/src/services/service-error.ts +46 -0
  574. package/modules/metering/src/settings.ts +47 -0
  575. package/modules/metering/translations/en.json +68 -0
  576. package/modules/metering/translations/pl.json +68 -0
  577. package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
  578. package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
  579. package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
  580. package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
  581. package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
  582. package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
  583. package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
  584. package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
  585. package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
  586. package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
  587. package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
  588. package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
  589. package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
  590. package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
  591. package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
  592. package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
  593. package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
  594. package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
  595. package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
  596. package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
  597. package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
  598. package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
  599. package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
  600. package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
  601. package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
  602. package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
  603. package/modules/notifications/migrations/README.md +3 -0
  604. package/modules/notifications/module.json +32 -0
  605. package/modules/notifications/package.json +49 -0
  606. package/modules/notifications/spec/module.yaml +718 -0
  607. package/modules/notifications/src/acl/permissions.ts +11 -0
  608. package/modules/notifications/src/api/endpoints.ts +814 -0
  609. package/modules/notifications/src/cli/commands.json +17 -0
  610. package/modules/notifications/src/cli/index.ts +126 -0
  611. package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
  612. package/modules/notifications/src/client/FactList.tsrx +24 -0
  613. package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
  614. package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
  615. package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
  616. package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
  617. package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
  618. package/modules/notifications/src/client/api.ts +382 -0
  619. package/modules/notifications/src/client/contribution.tsrx +83 -0
  620. package/modules/notifications/src/client/inbox.ts +41 -0
  621. package/modules/notifications/src/client/index.ts +29 -0
  622. package/modules/notifications/src/client/navigation.ts +92 -0
  623. package/modules/notifications/src/client/notifications.css +70 -0
  624. package/modules/notifications/src/client/presentation.ts +81 -0
  625. package/modules/notifications/src/client/state.ts +246 -0
  626. package/modules/notifications/src/client/unread-count.ts +26 -0
  627. package/modules/notifications/src/domain/locale.ts +47 -0
  628. package/modules/notifications/src/domain/publish.ts +46 -0
  629. package/modules/notifications/src/domain/types.ts +186 -0
  630. package/modules/notifications/src/index.ts +62 -0
  631. package/modules/notifications/src/platform.ts +85 -0
  632. package/modules/notifications/src/server/index.ts +82 -0
  633. package/modules/notifications/src/server/runtime.ts +251 -0
  634. package/modules/notifications/src/services/data-classes.ts +139 -0
  635. package/modules/notifications/src/services/database-repository.ts +1334 -0
  636. package/modules/notifications/src/services/delivery-payload.ts +93 -0
  637. package/modules/notifications/src/services/delivery-runner.ts +170 -0
  638. package/modules/notifications/src/services/delivery-service.ts +811 -0
  639. package/modules/notifications/src/services/egress.ts +239 -0
  640. package/modules/notifications/src/services/email-channel.ts +93 -0
  641. package/modules/notifications/src/services/index.ts +23 -0
  642. package/modules/notifications/src/services/migration.ts +572 -0
  643. package/modules/notifications/src/services/notifications-service.ts +297 -0
  644. package/modules/notifications/src/services/paging.ts +60 -0
  645. package/modules/notifications/src/services/publish-service.ts +133 -0
  646. package/modules/notifications/src/services/repository.ts +342 -0
  647. package/modules/notifications/src/services/secret-rotation.ts +177 -0
  648. package/modules/notifications/src/services/secret-vault.ts +168 -0
  649. package/modules/notifications/src/services/service-error.ts +67 -0
  650. package/modules/notifications/src/services/signature.ts +81 -0
  651. package/modules/notifications/src/services/webhook-service.ts +307 -0
  652. package/modules/notifications/src/settings.ts +130 -0
  653. package/modules/notifications/translations/en.json +255 -0
  654. package/modules/notifications/translations/pl.json +255 -0
  655. package/modules/profile/module.json +3 -3
  656. package/modules/profile/package.json +1 -1
  657. package/modules/profile/spec/module.yaml +3 -3
  658. package/modules/profile/src/services/database-repository.ts +3 -13
  659. package/modules/reports/module.json +28 -0
  660. package/modules/reports/package.json +42 -0
  661. package/modules/reports/spec/module.yaml +231 -0
  662. package/modules/reports/src/acl/permissions.ts +5 -0
  663. package/modules/reports/src/api/endpoints.ts +72 -0
  664. package/modules/reports/src/client/ReportsSummaryWidget.tsrx +52 -0
  665. package/modules/reports/src/client/ReportsView.tsrx +246 -0
  666. package/modules/reports/src/client/api.ts +65 -0
  667. package/modules/reports/src/client/contribution.tsrx +36 -0
  668. package/modules/reports/src/client/index.ts +18 -0
  669. package/modules/reports/src/client/navigation.ts +39 -0
  670. package/modules/reports/src/client/presentation.ts +123 -0
  671. package/modules/reports/src/client/state.ts +28 -0
  672. package/modules/reports/src/domain/providers.ts +115 -0
  673. package/modules/reports/src/domain/types.ts +44 -0
  674. package/modules/reports/src/index.ts +47 -0
  675. package/modules/reports/src/platform.ts +37 -0
  676. package/modules/reports/src/server/index.ts +21 -0
  677. package/modules/reports/src/server/runtime.ts +40 -0
  678. package/modules/reports/src/services/index.ts +17 -0
  679. package/modules/reports/src/services/provider-registry.ts +144 -0
  680. package/modules/reports/src/services/range.ts +65 -0
  681. package/modules/reports/src/services/reports-service.ts +316 -0
  682. package/modules/reports/src/services/service-error.ts +26 -0
  683. package/modules/reports/src/settings.ts +49 -0
  684. package/modules/reports/translations/en.json +35 -0
  685. package/modules/reports/translations/pl.json +35 -0
  686. package/modules/sandbox/module.json +4 -4
  687. package/modules/sandbox/package.json +1 -1
  688. package/modules/sandbox/spec/module.yaml +3 -3
  689. package/modules/sandbox/src/services/database-repository.ts +14 -23
  690. package/modules/sandbox/src/services/directory.ts +16 -0
  691. package/modules/sandbox/src/services/sandbox-service.ts +13 -11
  692. package/modules/search/migrations/0001_search_core.down.sql +1 -0
  693. package/modules/search/migrations/0001_search_core.up.sql +22 -0
  694. package/modules/search/migrations/0002_search_recent_export.down.sql +3 -0
  695. package/modules/search/migrations/0002_search_recent_export.up.sql +5 -0
  696. package/modules/search/migrations/README.md +3 -0
  697. package/modules/search/module.json +28 -0
  698. package/modules/search/package.json +43 -0
  699. package/modules/search/spec/module.yaml +177 -0
  700. package/modules/search/src/acl/permissions.ts +5 -0
  701. package/modules/search/src/api/endpoints.ts +221 -0
  702. package/modules/search/src/client/SearchView.tsrx +346 -0
  703. package/modules/search/src/client/api.ts +157 -0
  704. package/modules/search/src/client/contribution.tsrx +31 -0
  705. package/modules/search/src/client/index.ts +17 -0
  706. package/modules/search/src/client/navigation.ts +97 -0
  707. package/modules/search/src/client/search.css +56 -0
  708. package/modules/search/src/client/state.ts +113 -0
  709. package/modules/search/src/domain/data-classes.ts +73 -0
  710. package/modules/search/src/domain/providers.ts +88 -0
  711. package/modules/search/src/domain/types.ts +56 -0
  712. package/modules/search/src/index.ts +46 -0
  713. package/modules/search/src/platform.ts +42 -0
  714. package/modules/search/src/server/index.ts +25 -0
  715. package/modules/search/src/server/runtime.ts +123 -0
  716. package/modules/search/src/services/database-repository.ts +163 -0
  717. package/modules/search/src/services/index.ts +21 -0
  718. package/modules/search/src/services/migration.ts +65 -0
  719. package/modules/search/src/services/provider-registry.ts +137 -0
  720. package/modules/search/src/services/repository.ts +43 -0
  721. package/modules/search/src/services/search-service.ts +442 -0
  722. package/modules/search/src/services/service-error.ts +35 -0
  723. package/modules/search/src/settings.ts +68 -0
  724. package/modules/search/translations/en.json +45 -0
  725. package/modules/search/translations/pl.json +45 -0
  726. package/modules/system/module.json +2 -2
  727. package/modules/system/package.json +1 -1
  728. package/modules/system/spec/module.yaml +30 -3
  729. package/modules/system/src/client/FlagsPanel.tsrx +127 -0
  730. package/modules/system/src/client/ModuleSettingRow.tsrx +17 -7
  731. package/modules/system/src/client/ModuleSettingsSection.tsrx +10 -71
  732. package/modules/system/src/client/ModulesView.tsrx +91 -65
  733. package/modules/system/src/client/flags.ts +35 -0
  734. package/modules/system/src/client/index.ts +8 -0
  735. package/modules/system/src/client/navigation.ts +8 -0
  736. package/modules/system/src/client/settings-state.ts +159 -0
  737. package/modules/system/src/client/state.ts +2 -0
  738. package/modules/system/src/domain/time-zone.ts +105 -0
  739. package/modules/system/src/index.ts +12 -0
  740. package/modules/system/src/platform.ts +5 -1
  741. package/modules/system/src/server/endpoints.ts +72 -21
  742. package/modules/system/src/settings.ts +28 -0
  743. package/modules/system/translations/en.json +17 -0
  744. package/modules/system/translations/pl.json +17 -0
  745. package/modules/users/module.json +30 -4
  746. package/modules/users/package.json +4 -1
  747. package/modules/users/spec/module.yaml +290 -7
  748. package/modules/users/src/api/endpoints.ts +228 -15
  749. package/modules/users/src/client/InviteMemberForm.tsrx +2 -2
  750. package/modules/users/src/client/MemberDrawer.tsrx +142 -26
  751. package/modules/users/src/client/UserAccountForm.tsrx +2 -2
  752. package/modules/users/src/client/UsersView.tsrx +432 -71
  753. package/modules/users/src/client/api.ts +106 -12
  754. package/modules/users/src/client/contribution.tsrx +5 -0
  755. package/modules/users/src/client/member-columns.tsrx +22 -9
  756. package/modules/users/src/client/state.ts +172 -7
  757. package/modules/users/src/domain/lists.ts +9 -0
  758. package/modules/users/src/index.ts +11 -0
  759. package/modules/users/src/platform.ts +50 -1
  760. package/modules/users/src/services/member-export.ts +51 -0
  761. package/modules/users/src/services/member-import.ts +249 -0
  762. package/modules/users/src/services/member-search.ts +145 -0
  763. package/modules/users/src/services/users-service.ts +117 -4
  764. package/modules/users/translations/en.json +57 -8
  765. package/modules/users/translations/pl.json +57 -8
  766. package/modules/workflows/migrations/0004_payload_rotation_inventory.up.sql +17 -0
  767. package/modules/workflows/migrations/0005_workflows_human_approval.up.sql +28 -0
  768. package/modules/workflows/migrations/0006_workflows_retention_indexes.up.sql +11 -0
  769. package/modules/workflows/migrations/0007_workflows_erasure_subject_indexes.up.sql +17 -0
  770. package/modules/workflows/migrations/0008_workflows_subject_account.up.sql +24 -0
  771. package/modules/workflows/migrations/0009_workflows_definition_list_indexes.up.sql +9 -0
  772. package/modules/workflows/module.json +34 -6
  773. package/modules/workflows/package.json +2 -1
  774. package/modules/workflows/spec/module.yaml +26 -9
  775. package/modules/workflows/src/api/endpoints.ts +131 -25
  776. package/modules/workflows/src/cli/commands.json +17 -0
  777. package/modules/workflows/src/cli/index.ts +114 -0
  778. package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +36 -27
  779. package/modules/workflows/src/client/WorkflowInspector.tsrx +116 -0
  780. package/modules/workflows/src/client/WorkflowNodePalette.tsrx +1 -0
  781. package/modules/workflows/src/client/WorkflowsView.tsrx +236 -99
  782. package/modules/workflows/src/client/api.ts +54 -34
  783. package/modules/workflows/src/client/canvas-model.ts +12 -0
  784. package/modules/workflows/src/client/state.ts +95 -0
  785. package/modules/workflows/src/domain/events.ts +25 -11
  786. package/modules/workflows/src/domain/graph.ts +135 -1
  787. package/modules/workflows/src/domain/types.ts +91 -4
  788. package/modules/workflows/src/platform.ts +12 -0
  789. package/modules/workflows/src/server/runtime.ts +78 -5
  790. package/modules/workflows/src/services/approvals.ts +62 -0
  791. package/modules/workflows/src/services/cursors.ts +37 -0
  792. package/modules/workflows/src/services/data-classes.ts +232 -0
  793. package/modules/workflows/src/services/database-repository.ts +660 -171
  794. package/modules/workflows/src/services/migration.ts +240 -0
  795. package/modules/workflows/src/services/notifications.ts +98 -0
  796. package/modules/workflows/src/services/payload-codec.ts +51 -28
  797. package/modules/workflows/src/services/payload-rotation.ts +171 -0
  798. package/modules/workflows/src/services/repository.ts +123 -8
  799. package/modules/workflows/src/services/simulation.ts +7 -0
  800. package/modules/workflows/src/services/worker.ts +446 -25
  801. package/modules/workflows/src/services/workflows-service.ts +264 -103
  802. package/modules/workflows/translations/en.json +12 -4
  803. package/modules/workflows/translations/pl.json +12 -4
  804. package/modules.json +48 -4
  805. package/package.json +64 -6
  806. package/packages/client/package.json +1 -0
  807. package/packages/client/src/ApplicationShell.tsrx +43 -0
  808. package/packages/client/src/contributions.ts +55 -0
  809. package/packages/client/src/i18n/locales/en.json +5 -0
  810. package/packages/client/src/i18n/locales/pl.json +5 -0
  811. package/packages/client/src/index.ts +13 -1
  812. package/packages/client/src/routing.ts +22 -0
  813. package/packages/client/src/shell/CommandPalette.tsrx +223 -11
  814. package/packages/client/src/shell/command-search.ts +126 -0
  815. package/packages/client/src/shell/command.ts +30 -0
  816. package/packages/client/src/shell/navigation.ts +12 -0
  817. package/packages/client/src/shell/palette-keys.ts +27 -0
  818. package/packages/client/src/shell/shell.css +7 -0
  819. package/packages/contracts/schemas/module-spec.schema.json +287 -1
  820. package/packages/contracts/schemas/module.schema.json +25 -0
  821. package/packages/contracts/src/index.ts +144 -1
  822. package/packages/database/src/backup.ts +179 -0
  823. package/packages/database/src/decoders.ts +25 -0
  824. package/packages/database/src/index.ts +17 -0
  825. package/packages/database/src/record-history.ts +5 -14
  826. package/packages/harness/src/index.ts +2 -0
  827. package/packages/harness/src/runtime.ts +218 -1
  828. package/packages/harness/src/tool-adapters.ts +19 -1
  829. package/packages/kernel/src/acl.ts +179 -0
  830. package/packages/kernel/src/capability-registry.ts +69 -2
  831. package/packages/kernel/src/data-class-registry.ts +354 -0
  832. package/packages/kernel/src/index.ts +65 -4
  833. package/packages/kernel/src/keyring.ts +208 -0
  834. package/packages/kernel/src/module-compatibility.ts +35 -4
  835. package/packages/kernel/src/module-registry.ts +49 -2
  836. package/packages/kernel/src/module-settings.ts +189 -27
  837. package/packages/server/package.json +2 -1
  838. package/packages/server/src/composition.ts +38 -0
  839. package/packages/server/src/endpoint.ts +104 -47
  840. package/packages/server/src/export/csv.ts +34 -0
  841. package/packages/server/src/export/definition.ts +346 -0
  842. package/packages/server/src/export/index.ts +61 -0
  843. package/packages/server/src/export/run.ts +116 -0
  844. package/packages/server/src/index.ts +155 -0
  845. package/packages/server/src/jobs/index.ts +93 -0
  846. package/packages/server/src/jobs/runner.ts +486 -0
  847. package/packages/server/src/log.ts +291 -0
  848. package/packages/server/src/mail/config.ts +184 -0
  849. package/packages/server/src/mail/contracts.ts +251 -0
  850. package/packages/server/src/mail/index.ts +31 -0
  851. package/packages/server/src/mail/port.ts +101 -0
  852. package/packages/server/src/mail/smtp.ts +191 -0
  853. package/packages/server/src/mail/template.ts +105 -0
  854. package/packages/server/src/metrics.ts +447 -0
  855. package/packages/server/src/pagination.ts +246 -0
  856. package/packages/server/src/trace/context.ts +103 -0
  857. package/packages/server/src/trace/egress.ts +66 -0
  858. package/packages/server/src/trace/error-sink.ts +296 -0
  859. package/packages/server/src/trace/exporter.ts +295 -0
  860. package/packages/server/src/trace/index.ts +60 -0
  861. package/packages/server/src/trace/job-sink.ts +172 -0
  862. package/packages/server/src/trace/tracer.ts +338 -0
  863. package/packages/server/src/web.ts +5 -1
  864. package/packages/storage/package.json +40 -0
  865. package/packages/storage/src/config.ts +189 -0
  866. package/packages/storage/src/content-type.ts +124 -0
  867. package/packages/storage/src/contracts.ts +112 -0
  868. package/packages/storage/src/envelope.ts +189 -0
  869. package/packages/storage/src/index.ts +43 -0
  870. package/packages/storage/src/local.ts +75 -0
  871. package/packages/storage/src/port.ts +251 -0
  872. package/packages/storage/src/read-token.ts +130 -0
  873. package/packages/storage/src/s3.ts +144 -0
  874. package/packages/storage/src/scanner.ts +22 -0
  875. package/packages/storage/src/sigv4.ts +104 -0
  876. package/packages/storage/src/store.ts +13 -0
  877. package/packages/ui/package.json +1 -0
  878. package/packages/ui/src/components/Button.tsrx +3 -0
  879. package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
  880. package/packages/ui/src/components/DateField.tsrx +92 -0
  881. package/packages/ui/src/components/DatePicker.tsrx +525 -0
  882. package/packages/ui/src/components/DateRangeField.tsrx +93 -0
  883. package/packages/ui/src/components/Drawer.tsrx +10 -1
  884. package/packages/ui/src/components/FileUpload.tsrx +158 -0
  885. package/packages/ui/src/components/Pagination.tsrx +130 -0
  886. package/packages/ui/src/components/Select.tsrx +78 -0
  887. package/packages/ui/src/components/Table.tsrx +498 -81
  888. package/packages/ui/src/components/Tabs.tsrx +53 -0
  889. package/packages/ui/src/components/ToastHost.tsrx +48 -0
  890. package/packages/ui/src/components/calendar.ts +243 -0
  891. package/packages/ui/src/components/date-field.ts +62 -0
  892. package/packages/ui/src/components/file-upload.ts +49 -0
  893. package/packages/ui/src/components/focus-trap.ts +62 -0
  894. package/packages/ui/src/components/pagination.ts +68 -0
  895. package/packages/ui/src/components/table-sorting.ts +49 -0
  896. package/packages/ui/src/components/tabs.ts +61 -0
  897. package/packages/ui/src/components/toast-store.ts +116 -0
  898. package/packages/ui/src/icons/Icon.tsrx +5 -0
  899. package/packages/ui/src/index.ts +45 -0
  900. package/packages/ui/src/styles/components.css +598 -0
  901. package/modules/automations-workflows-integration/module.json +0 -27
  902. package/modules/automations-workflows-integration/spec/module.yaml +0 -93
  903. package/modules/automations-workflows-integration/src/index.ts +0 -14
  904. package/modules/automations-workflows-integration/src/platform.ts +0 -24
  905. package/modules/automations-workflows-integration/src/server/index.ts +0 -11
  906. package/modules/automations-workflows-integration/translations/en.json +0 -21
  907. package/modules/automations-workflows-integration/translations/pl.json +0 -21
  908. package/modules/workflows/src/services/cursor-codec.ts +0 -62
@@ -4,8 +4,10 @@ import type {
4
4
  } from '@flowdular/sdk/harness';
5
5
  import type {
6
6
  AgentAuditEvent,
7
- AgentAuditPage,
7
+ AgentAuditListQuery,
8
8
  AgentDefinition,
9
+ AgentListPage,
10
+ AgentListQuery,
9
11
  AgentDefinitionRevision,
10
12
  ModuleAgentBinding,
11
13
  ModuleAgentDefinition,
@@ -13,6 +15,7 @@ import type {
13
15
  AgentRun,
14
16
  AgentRunDetail,
15
17
  AgentRunExecution,
18
+ AgentRunListQuery,
16
19
  AgentProcedure,
17
20
  AgentUsageAgent,
18
21
  AgentUsageBucket,
@@ -69,11 +72,32 @@ export interface CompletedRunCost {
69
72
  readonly costMicroUsd: number | null;
70
73
  }
71
74
 
75
+ /** Where a run export page resumes: newest queue time first, then run id. */
76
+ export interface AgentRunExportCursor {
77
+ readonly queuedAt: number;
78
+ readonly id: string;
79
+ }
80
+
81
+ /** One run and its steps, as the workspace export presents them. */
82
+ export interface ExportedAgentRun {
83
+ readonly run: AgentRun;
84
+ readonly events: readonly AgentExecutionEvent[];
85
+ }
86
+
72
87
  export type PendingAgentAuditEvent = Omit<
73
88
  AgentAuditEvent,
74
89
  'id' | 'sequence' | 'previousHash' | 'eventHash'
75
90
  >;
76
91
 
92
+ /**
93
+ * What a caller that may be abandoned hands down to the statement. A read on a
94
+ * request path passes the signal the caller is bounded by, so the statement is
95
+ * cancelled with the work nobody is waiting for any more.
96
+ */
97
+ export interface AgentReadOptions {
98
+ readonly signal?: AbortSignal | undefined;
99
+ }
100
+
77
101
  export interface AgentRepository {
78
102
  close(): Promise<void>;
79
103
  reconcileModuleAgents(
@@ -93,7 +117,13 @@ export interface AgentRepository {
93
117
  expectedRevision: number,
94
118
  audit: PendingAgentAuditEvent,
95
119
  ): Promise<ModuleAgentBinding>;
120
+ /* Every definition of the tenant, for the run queue capability and revision
121
+ adoption, which need the whole catalog. Screens read `listAgentsPage`. */
96
122
  listAgents(tenantId: string): Promise<readonly AgentDefinition[]>;
123
+ listAgentsPage(
124
+ tenantId: string,
125
+ query: AgentListQuery,
126
+ ): Promise<AgentListPage>;
97
127
  getAgent(tenantId: string, agentId: string): Promise<AgentDefinition | null>;
98
128
  getAgentRevision(
99
129
  tenantId: string,
@@ -133,7 +163,10 @@ export interface AgentRepository {
133
163
  readonly assignments: number;
134
164
  readonly activeDefinitions: number;
135
165
  }>;
136
- listRuns(tenantId: string, limit: number): Promise<readonly AgentRun[]>;
166
+ listRuns(
167
+ tenantId: string,
168
+ query: AgentRunListQuery,
169
+ ): Promise<readonly AgentRun[]>;
137
170
  getRun(tenantId: string, runId: string): Promise<AgentRunDetail | null>;
138
171
  listRunEvents(
139
172
  tenantId: string,
@@ -240,6 +273,13 @@ export interface AgentRepository {
240
273
  workerId: string,
241
274
  leaseExpiresAt: number,
242
275
  ): Promise<boolean>;
276
+ /* Hands a claim back to the queue, clearing the lease, for work this worker
277
+ took but will not perform. Answers whether the row was still its own. */
278
+ releaseAction(
279
+ tenantId: string,
280
+ invocationId: string,
281
+ workerId: string,
282
+ ): Promise<boolean>;
243
283
  completeAction(
244
284
  tenantId: string,
245
285
  invocationId: string,
@@ -262,23 +302,63 @@ export interface AgentRepository {
262
302
  completedAt: number,
263
303
  audit: PendingAgentAuditEvent,
264
304
  ): Promise<AgentActionInvocation['status'] | null>;
305
+ /* Keyset page of the run export, newest queue time first, with the steps of
306
+ every run on the page. */
307
+ exportRunsPage(
308
+ tenantId: string,
309
+ after: AgentRunExportCursor | null,
310
+ limit: number,
311
+ ): Promise<readonly ExportedAgentRun[]>;
312
+ /* Removes at most `limit` settled runs completed before `before`, taking
313
+ their steps and child rows with them. A queued or running run is never
314
+ removed, whatever the age of the request behind it. */
315
+ deleteSettledRunsBefore(
316
+ tenantId: string,
317
+ before: number,
318
+ limit: number,
319
+ ): Promise<number>;
320
+ /* Removes at most `limit` runs one account requested, in any state. */
321
+ deleteRunsRequestedBy(
322
+ tenantId: string,
323
+ accountId: string,
324
+ limit: number,
325
+ ): Promise<number>;
326
+ /**
327
+ * Takes the standing refusal of one workspace, meter and month, and answers
328
+ * whether this call is the one that took it. A refusal stands until the
329
+ * month turns or the limit is raised, so only the call that takes it writes
330
+ * the audit event and a retry loop adds no second row. The claim removes the
331
+ * rows of earlier months, so a workspace holds one row per meter.
332
+ */
333
+ claimMeterRefusal(
334
+ tenantId: string,
335
+ meter: string,
336
+ period: string,
337
+ at: number,
338
+ ): Promise<boolean>;
265
339
  appendAuditEvent(event: PendingAgentAuditEvent): Promise<AgentAuditEvent>;
266
340
  listAuditEvents(
267
341
  tenantId: string,
268
342
  limit: number,
269
343
  ): Promise<readonly AgentAuditEvent[]>;
270
- /* Keyset page over the tenant trail, newest first, cursor `occurredAt:sequence`. */
271
- pageAuditEvents(
344
+ /* Keyset page of the tenant trail in chain order, oldest first. */
345
+ exportAuditEventsPage(
272
346
  tenantId: string,
273
- cursor: { readonly occurredAt: number; readonly sequence: number } | null,
347
+ afterSequence: number,
274
348
  limit: number,
275
- ): Promise<AgentAuditPage>;
349
+ ): Promise<readonly AgentAuditEvent[]>;
350
+ /* Keyset page over the tenant trail, newest first. */
351
+ pageAuditEvents(
352
+ tenantId: string,
353
+ query: AgentAuditListQuery,
354
+ ): Promise<readonly AgentAuditEvent[]>;
276
355
  verifyAuditChain(tenantId: string): Promise<boolean>;
277
356
  verifyAuditChainDetailed(tenantId: string): Promise<AuditChainVerification>;
278
357
  usageByDay(
279
358
  tenantId: string,
280
359
  fromDay: string,
281
360
  toDay: string,
361
+ options?: AgentReadOptions,
282
362
  ): Promise<readonly AgentUsageDay[]>;
283
363
  usageByAgent(
284
364
  tenantId: string,
@@ -54,6 +54,7 @@ export class AgentUsageService {
54
54
  const to = usageDay(now);
55
55
  const from = usageDay(now - (window - 1) * DAY_MS);
56
56
  const monthFrom = firstDayOfMonth(now);
57
+ await this.settings?.prime(tenantId);
57
58
  return {
58
59
  from,
59
60
  to,
@@ -87,6 +88,7 @@ export class AgentUsageService {
87
88
  agentId: string,
88
89
  now = this.now(),
89
90
  ): Promise<BudgetRefusal | null> {
91
+ await this.settings?.prime(tenantId);
90
92
  const caps = this.caps(tenantId);
91
93
  if (caps.monthlyCostMicroUsd === 0 && caps.agentMonthlyCostMicroUsd === 0) {
92
94
  return null;
@@ -1,6 +1,16 @@
1
1
  import type { AgentHarness, AgentProvider } from '@flowdular/sdk/harness';
2
- import type { AgentRunExecution, AgentWorkerStatus } from '../domain/types.ts';
2
+ import type {
3
+ AgentRun,
4
+ AgentRunExecution,
5
+ AgentWorkerStatus,
6
+ } from '../domain/types.ts';
3
7
  import type { AgentRepository, RecoverableRun } from './repository.ts';
8
+ import {
9
+ publishRunOutcome,
10
+ runNotificationRecipients,
11
+ type NotificationPublisherResolver,
12
+ } from './notifications.ts';
13
+ import { AGENT_METERS, type MeterRegistryResolver } from './metering.ts';
4
14
  import type { AgentProviderBroker } from './provider-broker.ts';
5
15
  import type { AgentRunGrantAuthority } from './run-grant.ts';
6
16
 
@@ -12,6 +22,13 @@ export interface AgentWorkerOptions {
12
22
  readonly leaseMs: number;
13
23
  readonly runGrantAuthority?: AgentRunGrantAuthority;
14
24
  readonly providerBroker?: AgentProviderBroker;
25
+ /* Resolved when a run settles. Absent, or resolving to null, means the
26
+ optional notifications module is not composed and nothing is published. */
27
+ readonly notifications?: NotificationPublisherResolver;
28
+ /* Resolved when a run settles, so the registry is the one the platform holds
29
+ then. Absent only in a process that built a worker outside the module
30
+ composition, such as a test; a composed deployment always has it. */
31
+ readonly meters?: MeterRegistryResolver;
15
32
  readonly now?: () => number;
16
33
  }
17
34
 
@@ -35,10 +52,17 @@ const CANCELLED = 'cancelled';
35
52
  const SHUTDOWN = 'worker-shutdown';
36
53
  const LEASE_LOST = 'lease-lost';
37
54
 
55
+ /* A provider, a driver or the database can put any text on `code`. Only a
56
+ stable code may reach the failure record, the audit metadata and the
57
+ notification body a person reads. */
58
+ const STABLE_CODE = /^[A-Z][A-Z0-9_]+$/;
59
+
38
60
  function failure(error: unknown): { code: string; message: string } {
39
61
  if (error instanceof Error) {
40
62
  const code =
41
- 'code' in error && typeof error.code === 'string'
63
+ 'code' in error &&
64
+ typeof error.code === 'string' &&
65
+ STABLE_CODE.test(error.code)
42
66
  ? error.code
43
67
  : 'AGENT_EXECUTION_FAILED';
44
68
  return { code, message: error.message.slice(0, 1_000) };
@@ -242,6 +266,10 @@ export class AgentWorker {
242
266
  ): Promise<void> {
243
267
  let eventWrites = Promise.resolve();
244
268
  let eventFailure: unknown;
269
+ /* The abort a refused event write decides on waits for one ownership
270
+ probe; the failure path awaits this so the reason is known before the
271
+ run is settled, and the release waits for it so nothing outruns it. */
272
+ let eventClassification = Promise.resolve();
245
273
  const renewal = setInterval(
246
274
  async () => {
247
275
  try {
@@ -312,9 +340,25 @@ export class AgentWorker {
312
340
  event,
313
341
  ),
314
342
  );
315
- void eventWrites.catch((error) => {
343
+ eventClassification = eventWrites.catch(async (error) => {
344
+ /* An event refused on a run this worker no longer holds is the lost
345
+ lease, not a persistence fault: an erasure or another worker took
346
+ the row, and which failure surfaces first is a matter of timing.
347
+ One rejection reaches every later write; classify it once. */
348
+ if (eventFailure !== undefined) return;
316
349
  eventFailure = error;
317
- controller.abort('event-persistence-failed');
350
+ let owned = false;
351
+ try {
352
+ owned = await this.repository.renewLease(
353
+ candidate.tenantId,
354
+ candidate.runId,
355
+ this.options.workerId,
356
+ this.#now() + this.options.leaseMs,
357
+ );
358
+ } catch {
359
+ owned = false;
360
+ }
361
+ controller.abort(owned ? 'event-persistence-failed' : LEASE_LOST);
318
362
  });
319
363
  };
320
364
  const result = await this.harness.execute(
@@ -356,13 +400,19 @@ export class AgentWorker {
356
400
  occurredAt: result.completedAt,
357
401
  },
358
402
  );
403
+ await this.#reportMeters(execution.run, result.usage.totalTokens);
359
404
  await this.#recordRunSuccess(
360
405
  execution,
361
406
  result.completedAt,
362
407
  result.startedAt,
363
408
  );
409
+ await this.#publishOutcome(execution.run, 'agent-run-completed', {
410
+ title: `Agent ${execution.run.agentName} finished`,
411
+ body: `The run finished in ${result.completedAt - result.startedAt} ms and used ${result.usage.totalTokens} tokens.`,
412
+ });
364
413
  } catch (error) {
365
414
  await eventWrites.catch(() => undefined);
415
+ await eventClassification;
366
416
  /* The service already moved a cancelled row and wrote its audit event;
367
417
  the worker only had to stop. */
368
418
  if (controller.signal.aborted && controller.signal.reason === CANCELLED) {
@@ -412,10 +462,70 @@ export class AgentWorker {
412
462
  `[agents] run ${candidate.runId} failed with ${failed.code} and could not be settled:`,
413
463
  settleError instanceof Error ? settleError.message : settleError,
414
464
  );
465
+ return;
415
466
  }
467
+ await this.#reportMeters(execution.run, 0);
468
+ await this.#publishOutcome(execution.run, 'agent-run-failed', {
469
+ title: `Agent ${execution.run.agentName} failed`,
470
+ body: `The run stopped with ${failed.code}.`,
471
+ });
416
472
  } finally {
417
473
  clearInterval(renewal);
418
474
  await eventWrites.catch(() => undefined);
475
+ await eventClassification;
476
+ }
477
+ }
478
+
479
+ /* Called after the terminal row is committed and outside its transaction.
480
+ The run id is the source reference, so a terminal step that runs twice
481
+ reports the same outcome instead of adding a second notification. A run a
482
+ workflow owns stays silent: workflows.core reports the outcome the person
483
+ actually asked for, once, instead of one notification per agent step. */
484
+ async #publishOutcome(
485
+ run: AgentRun,
486
+ kind: 'agent-run-completed' | 'agent-run-failed',
487
+ copy: { readonly title: string; readonly body: string },
488
+ ): Promise<void> {
489
+ if (run.workflowRunId !== null) return;
490
+ await publishRunOutcome(this.options.notifications, {
491
+ tenantId: run.tenantId,
492
+ kind,
493
+ sourceModule: 'agents.core',
494
+ sourceRef: run.id,
495
+ title: copy.title,
496
+ body: copy.body,
497
+ recipients: runNotificationRecipients(run.authorizationSubject),
498
+ });
499
+ }
500
+
501
+ /* Called after the terminal row is committed and outside its transaction.
502
+ The run id is the source reference, so a terminal step that runs twice
503
+ counts the run once. Counting is advisory: metering.core commits the fact
504
+ in its own transaction and a failure there never changes a settled run. A
505
+ run that reported no tokens counts none rather than claiming zero. */
506
+ async #reportMeters(run: AgentRun, totalTokens: number): Promise<void> {
507
+ const meters = this.options.meters?.();
508
+ if (!meters) return;
509
+ try {
510
+ await meters.record({
511
+ tenantId: run.tenantId,
512
+ meter: AGENT_METERS.runs,
513
+ amount: 1,
514
+ sourceRef: run.id,
515
+ });
516
+ if (totalTokens > 0) {
517
+ await meters.record({
518
+ tenantId: run.tenantId,
519
+ meter: AGENT_METERS.runTokens,
520
+ amount: totalTokens,
521
+ sourceRef: run.id,
522
+ });
523
+ }
524
+ } catch (error) {
525
+ console.warn(
526
+ `[agents] metering for run ${run.id} failed:`,
527
+ error instanceof Error ? error.message : error,
528
+ );
419
529
  }
420
530
  }
421
531
 
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  defineModuleSettings,
3
+ ModuleSettingsError,
3
4
  PLATFORM_SETTINGS_TENANT,
4
5
  type ModuleSettingsDeclaration,
5
6
  type ModuleSettingsRuntime,
@@ -166,6 +167,8 @@ export function agentsModuleSettingsFromEnvironment(
166
167
  }
167
168
 
168
169
  export interface AgentSettingsReader {
170
+ /** Loads a workspace's settings; a tenant-scoped read needs it first. */
171
+ prime(tenantId: string): Promise<void>;
169
172
  workerConcurrency(): number;
170
173
  workerLeaseMs(): number;
171
174
  providerReadinessTtlMs(): number;
@@ -185,8 +188,9 @@ function settingsSource(value: unknown): ModuleSettingsRuntime | null {
185
188
  : null;
186
189
  }
187
190
 
188
- /* Reads are live and per call. Without a settings runtime, or when a read
189
- fails, the environment decides exactly as before. */
191
+ /* Reads are live and per call. Without a settings runtime, or when the
192
+ module's settings are not declared, the environment decides exactly as
193
+ before; a workspace nobody primed stays a loud caller defect. */
190
194
  export function agentSettings(context: {
191
195
  readonly environment: NodeJS.ProcessEnv;
192
196
  readonly settings?: unknown;
@@ -204,11 +208,18 @@ export function agentSettings(context: {
204
208
  return typeof value === typeof fallbackValue
205
209
  ? (value as T)
206
210
  : fallbackValue;
207
- } catch {
211
+ } catch (error) {
212
+ if (
213
+ error instanceof ModuleSettingsError &&
214
+ error.code === 'SETTINGS_NOT_PRIMED'
215
+ ) {
216
+ throw error;
217
+ }
208
218
  return fallbackValue;
209
219
  }
210
220
  };
211
221
  return {
222
+ prime: (tenantId) => source?.prime(tenantId) ?? Promise.resolve(),
212
223
  workerConcurrency: () =>
213
224
  read(
214
225
  PLATFORM_SETTINGS_TENANT,
@@ -8,6 +8,10 @@
8
8
  "common.actions": "Agent actions",
9
9
  "common.requestFailed": "The agent operation failed.",
10
10
  "common.view": "View",
11
+ "common.page.label": "List pages",
12
+ "common.page.previous": "Previous",
13
+ "common.page.next": "Next",
14
+ "common.page.summary": "Page {page} · from {from}",
11
15
  "navigation.agents": "Agents",
12
16
  "navigation.agentsDescription": "Reusable worker definitions",
13
17
  "navigation.providers": "Providers",
@@ -132,7 +136,7 @@
132
136
  "definitions.lifecycle.delete.confirm": "Delete agent",
133
137
  "definitions.lifecycle.delete.description": "Permanently delete {name}. Agents with run history cannot be deleted.",
134
138
  "definitions.table.title": "Custom agents",
135
- "definitions.table.count": "{active} active · {total} defined",
139
+ "definitions.table.count": "{count} on this page",
136
140
  "definitions.table.caption": "Agent definitions",
137
141
  "definitions.loading": "Loading custom agents…",
138
142
  "definitions.search.placeholder": "Filter by name, key, or description",
@@ -148,6 +152,7 @@
148
152
  "definitions.column.agent": "Agent",
149
153
  "definitions.column.purpose": "Purpose",
150
154
  "definitions.column.model": "Model",
155
+ "definitions.column.updated": "Updated",
151
156
  "definitions.column.status": "Status",
152
157
  "definitions.form.name": "Name",
153
158
  "definitions.form.key": "Stable key",
@@ -284,9 +289,9 @@
284
289
  "runs.error.cancel": "Could not cancel the run.",
285
290
  "runs.error.load": "Could not load agent runs.",
286
291
  "runs.table.title": "Execution history",
287
- "runs.table.count": "{count} recent runs",
292
+ "runs.table.count": "{count} on this page",
288
293
  "runs.table.caption": "Agent runs",
289
- "runs.search.placeholder": "Search agent, input, or run id",
294
+ "runs.search.placeholder": "Search by agent name or run id",
290
295
  "runs.search.label": "Search agent runs",
291
296
  "runs.filter.status": "Status",
292
297
  "runs.filter.allStatuses": "All statuses",
@@ -399,5 +404,10 @@
399
404
  "settings.monthlyCostCapUsd.label": "Monthly agent budget (USD)",
400
405
  "settings.monthlyCostCapUsd.description": "Enqueue is refused once the calendar month costs this much. Zero means no cap. A run already executing is never stopped.",
401
406
  "settings.agentMonthlyCostCapUsd.label": "Monthly budget per agent (USD)",
402
- "settings.agentMonthlyCostCapUsd.description": "Applied to every agent on its own, in addition to the workspace budget. Zero means no cap."
407
+ "settings.agentMonthlyCostCapUsd.description": "Applied to every agent on its own, in addition to the workspace budget. Zero means no cap.",
408
+ "report.runs.label": "Agent runs",
409
+ "report.runs.tile.runs": "Runs",
410
+ "report.runs.tile.tokens": "Tokens",
411
+ "report.runs.series.runsPerDay": "Runs per day",
412
+ "report.runs.series.tokensPerDay": "Tokens per day"
403
413
  }
@@ -8,6 +8,10 @@
8
8
  "common.actions": "Akcje agenta",
9
9
  "common.requestFailed": "Operacja agenta nie powiodła się.",
10
10
  "common.view": "Zobacz",
11
+ "common.page.label": "Strony listy",
12
+ "common.page.previous": "Poprzednia",
13
+ "common.page.next": "Następna",
14
+ "common.page.summary": "Strona {page} · od {from}",
11
15
  "navigation.agents": "Agenci",
12
16
  "navigation.agentsDescription": "Definicje agentów wielokrotnego użytku",
13
17
  "navigation.providers": "Dostawcy modeli",
@@ -132,7 +136,7 @@
132
136
  "definitions.lifecycle.delete.confirm": "Usuń agenta",
133
137
  "definitions.lifecycle.delete.description": "Trwale usuń agenta {name}. Agenta z historią uruchomień nie można usunąć.",
134
138
  "definitions.table.title": "Agenci własni",
135
- "definitions.table.count": "aktywni: {active} · zdefiniowani: {total}",
139
+ "definitions.table.count": "Na tej stronie: {count}",
136
140
  "definitions.table.caption": "Definicje agentów",
137
141
  "definitions.loading": "Wczytywanie agentów własnych…",
138
142
  "definitions.search.placeholder": "Szukaj po nazwie, kluczu lub opisie",
@@ -148,6 +152,7 @@
148
152
  "definitions.column.agent": "Agent",
149
153
  "definitions.column.purpose": "Zadanie",
150
154
  "definitions.column.model": "Model",
155
+ "definitions.column.updated": "Zaktualizowano",
151
156
  "definitions.column.status": "Status",
152
157
  "definitions.form.name": "Nazwa",
153
158
  "definitions.form.key": "Stały klucz",
@@ -284,9 +289,9 @@
284
289
  "runs.error.cancel": "Nie udało się anulować uruchomienia.",
285
290
  "runs.error.load": "Nie udało się wczytać uruchomień agentów.",
286
291
  "runs.table.title": "Historia wykonań",
287
- "runs.table.count": "Ostatnie uruchomienia: {count}",
292
+ "runs.table.count": "Na tej stronie: {count}",
288
293
  "runs.table.caption": "Uruchomienia agentów",
289
- "runs.search.placeholder": "Szukaj agenta, danych wejściowych lub identyfikatora",
294
+ "runs.search.placeholder": "Szukaj po nazwie agenta lub identyfikatorze uruchomienia",
290
295
  "runs.search.label": "Szukaj uruchomień agentów",
291
296
  "runs.filter.status": "Status",
292
297
  "runs.filter.allStatuses": "Wszystkie statusy",
@@ -399,5 +404,10 @@
399
404
  "settings.monthlyCostCapUsd.label": "Miesięczny budżet agentów (USD)",
400
405
  "settings.monthlyCostCapUsd.description": "Po osiągnięciu tej kwoty w miesiącu nowe uruchomienia są odrzucane. Zero wyłącza limit. Trwające uruchomienie nie jest przerywane.",
401
406
  "settings.agentMonthlyCostCapUsd.label": "Miesięczny budżet jednego agenta (USD)",
402
- "settings.agentMonthlyCostCapUsd.description": "Obowiązuje osobno dla każdego agenta, niezależnie od budżetu przestrzeni roboczej. Zero wyłącza limit."
407
+ "settings.agentMonthlyCostCapUsd.description": "Obowiązuje osobno dla każdego agenta, niezależnie od budżetu przestrzeni roboczej. Zero wyłącza limit.",
408
+ "report.runs.label": "Uruchomienia agentów",
409
+ "report.runs.tile.runs": "Uruchomienia",
410
+ "report.runs.tile.tokens": "Tokeny",
411
+ "report.runs.series.runsPerDay": "Uruchomienia dziennie",
412
+ "report.runs.series.tokensPerDay": "Tokeny dziennie"
403
413
  }
@@ -0,0 +1,3 @@
1
+ DROP TABLE IF EXISTS approvals_decisions;
2
+ DROP TABLE IF EXISTS approvals_eligible;
3
+ DROP TABLE IF EXISTS approvals_requests;
@@ -0,0 +1,78 @@
1
+ CREATE TABLE IF NOT EXISTS approvals_requests (
2
+ id TEXT PRIMARY KEY,
3
+ tenant_id TEXT NOT NULL,
4
+ subject_module TEXT NOT NULL,
5
+ subject_ref TEXT NOT NULL,
6
+ permission TEXT NOT NULL,
7
+ action TEXT NOT NULL,
8
+ title TEXT NOT NULL,
9
+ summary TEXT,
10
+ requester_account_id TEXT NOT NULL,
11
+ requirement_json TEXT NOT NULL,
12
+ decisions_needed BIGINT NOT NULL CHECK (decisions_needed >= 1),
13
+ status TEXT NOT NULL CHECK (status IN ('pending', 'approved', 'rejected', 'expired', 'cancelled')),
14
+ expires_at BIGINT NOT NULL,
15
+ resolved_at BIGINT,
16
+ created_at BIGINT NOT NULL
17
+ );
18
+ -- A subject module that reopens after a crash has to find the request it
19
+ -- already opened instead of asking the same question twice. One pending
20
+ -- request per subject reference is what makes opening idempotent.
21
+ CREATE UNIQUE INDEX IF NOT EXISTS approvals_requests_pending_subject_idx
22
+ ON approvals_requests (tenant_id, subject_module, subject_ref)
23
+ WHERE status = 'pending';
24
+ CREATE INDEX IF NOT EXISTS approvals_requests_tenant_status_idx
25
+ ON approvals_requests (tenant_id, status, created_at DESC, id);
26
+ CREATE INDEX IF NOT EXISTS approvals_requests_requester_idx
27
+ ON approvals_requests (tenant_id, requester_account_id, created_at DESC, id);
28
+ -- The cross-tenant expiry poll reads in this order and stops at the first
29
+ -- request that is not due yet.
30
+ CREATE INDEX IF NOT EXISTS approvals_requests_routing_idx
31
+ ON approvals_requests (status, expires_at, tenant_id, id);
32
+ ALTER TABLE approvals_requests ENABLE ROW LEVEL SECURITY;
33
+ ALTER TABLE approvals_requests FORCE ROW LEVEL SECURITY;
34
+ CREATE POLICY approvals_requests_tenant_policy ON approvals_requests
35
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
36
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
37
+ -- The eligibility snapshot taken when the request opened. It decides whose
38
+ -- inbox the request appears in, so it is a row per decider with its own index
39
+ -- rather than a list inside the request: the screen asks "what may I decide"
40
+ -- once per open workspace and that question has to stay one index lookup.
41
+ CREATE TABLE IF NOT EXISTS approvals_eligible (
42
+ tenant_id TEXT NOT NULL,
43
+ request_id TEXT NOT NULL,
44
+ account_id TEXT NOT NULL,
45
+ PRIMARY KEY (tenant_id, request_id, account_id)
46
+ );
47
+ CREATE INDEX IF NOT EXISTS approvals_eligible_account_idx
48
+ ON approvals_eligible (tenant_id, account_id, request_id);
49
+ ALTER TABLE approvals_eligible ENABLE ROW LEVEL SECURITY;
50
+ ALTER TABLE approvals_eligible FORCE ROW LEVEL SECURITY;
51
+ CREATE POLICY approvals_eligible_tenant_policy ON approvals_eligible
52
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
53
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
54
+ CREATE TABLE IF NOT EXISTS approvals_decisions (
55
+ id TEXT PRIMARY KEY,
56
+ tenant_id TEXT NOT NULL,
57
+ request_id TEXT NOT NULL,
58
+ decider_account_id TEXT,
59
+ decision TEXT NOT NULL CHECK (decision IN ('approve', 'reject', 'expire', 'cancel')),
60
+ comment TEXT,
61
+ decided_at BIGINT NOT NULL,
62
+ -- Expiry is the one decision no member makes. Every other row names the
63
+ -- account answerable for it, and the pair is checked here rather than only
64
+ -- in the service that writes it.
65
+ CHECK ((decision = 'expire') = (decider_account_id IS NULL))
66
+ );
67
+ -- One approval or rejection per member per request. The service checks first,
68
+ -- but this index is what actually guarantees the conflict it reports.
69
+ CREATE UNIQUE INDEX IF NOT EXISTS approvals_decisions_decider_idx
70
+ ON approvals_decisions (tenant_id, request_id, decider_account_id)
71
+ WHERE decision IN ('approve', 'reject');
72
+ CREATE INDEX IF NOT EXISTS approvals_decisions_request_idx
73
+ ON approvals_decisions (tenant_id, request_id, decided_at, id);
74
+ ALTER TABLE approvals_decisions ENABLE ROW LEVEL SECURITY;
75
+ ALTER TABLE approvals_decisions FORCE ROW LEVEL SECURITY;
76
+ CREATE POLICY approvals_decisions_tenant_policy ON approvals_decisions
77
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
78
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
@@ -0,0 +1,2 @@
1
+ REVOKE SELECT (tenant_id, id, expires_at, status) ON approvals_requests FROM coreloom_background;
2
+ DROP POLICY IF EXISTS approvals_requests_background_policy ON approvals_requests;
@@ -0,0 +1,19 @@
1
+ -- The expiry loop has to find due pending requests before it knows whose they
2
+ -- are, and the requests table is invisible to the cross-tenant role: it carries
3
+ -- no background policy and the role holds no default table grant. This adds the
4
+ -- four routing columns and nothing else. The subject, the requester, the
5
+ -- requirement, the eligibility snapshot and the title stay unreadable on this
6
+ -- connection, and every request it names is read again under its own tenant
7
+ -- before anything about it is written.
8
+ DO $$
9
+ BEGIN
10
+ IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
11
+ RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
12
+ END IF;
13
+ END
14
+ $$;
15
+ CREATE POLICY approvals_requests_background_policy ON approvals_requests
16
+ FOR SELECT TO coreloom_background
17
+ USING (true);
18
+ REVOKE SELECT ON approvals_requests FROM coreloom_background;
19
+ GRANT SELECT (tenant_id, id, expires_at, status) ON approvals_requests TO coreloom_background;
@@ -0,0 +1,6 @@
1
+ -- The three indexes carry no data of their own, so dropping them returns the
2
+ -- schema to what 0002 left and costs only the scans the retention operations
3
+ -- then have to perform.
4
+ DROP INDEX IF EXISTS approvals_decisions_decider_account_idx;
5
+ DROP INDEX IF EXISTS approvals_requests_export_idx;
6
+ DROP INDEX IF EXISTS approvals_requests_resolved_idx;
@@ -0,0 +1,14 @@
1
+ -- The retention sweep of approvals.core.requests asks one workspace for its
2
+ -- oldest resolved requests, the export walks every request of a workspace in
3
+ -- id order, and a subject erasure asks it for the decisions one account made.
4
+ -- None of the three is covered by what the module already carries: the status
5
+ -- index orders by creation rather than by resolution, the requester index
6
+ -- answers who asked rather than who decided, and no index carries the export's
7
+ -- own key order. All three are bounded batches, so all three need a range scan
8
+ -- rather than a pass over the workspace's requests.
9
+ CREATE INDEX IF NOT EXISTS approvals_requests_resolved_idx
10
+ ON approvals_requests (tenant_id, status, resolved_at, id);
11
+ CREATE INDEX IF NOT EXISTS approvals_requests_export_idx
12
+ ON approvals_requests (tenant_id, id);
13
+ CREATE INDEX IF NOT EXISTS approvals_decisions_decider_account_idx
14
+ ON approvals_decisions (tenant_id, decider_account_id, id);
@@ -0,0 +1,5 @@
1
+ -- The three indexes carry no data of their own, so dropping them returns the
2
+ -- schema to what 0003 left and costs only the sort every inbox page then pays.
3
+ DROP INDEX IF EXISTS approvals_requests_created_idx;
4
+ DROP INDEX IF EXISTS approvals_requests_requester_created_idx;
5
+ DROP INDEX IF EXISTS approvals_requests_status_created_idx;
@@ -0,0 +1,12 @@
1
+ -- The inbox pages by keyset on (created_at, id) in one direction, under a
2
+ -- status filter, a requester filter, or neither. The two indexes 0001 carries
3
+ -- order created_at DESC with id ASC, so a page walked in either direction ends
4
+ -- in a sort, and a workspace-wide page has no index at all. These three carry
5
+ -- both keys ascending: a newest-first page is a backward scan of the same
6
+ -- index, and a page continued from a cursor starts where the cursor names.
7
+ CREATE INDEX IF NOT EXISTS approvals_requests_status_created_idx
8
+ ON approvals_requests (tenant_id, status, created_at, id);
9
+ CREATE INDEX IF NOT EXISTS approvals_requests_requester_created_idx
10
+ ON approvals_requests (tenant_id, requester_account_id, created_at, id);
11
+ CREATE INDEX IF NOT EXISTS approvals_requests_created_idx
12
+ ON approvals_requests (tenant_id, created_at, id);
@@ -0,0 +1,3 @@
1
+ # Migrations
2
+
3
+ Migrations in this directory are append-only after release.