@flowdular/sdk 0.2.3 → 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 (912) 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 +3 -2
  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 +3 -2
  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 +5 -2
  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 +2 -2
  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 +2 -2
  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 +2 -2
  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 +5 -2
  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 +3 -2
  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 +66 -7
  806. package/packages/client/package.json +2 -1
  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/dev-console/package.json +2 -1
  827. package/packages/dev-console/src/brand.d.mts +8 -0
  828. package/packages/dev-console/src/brand.mjs +33 -0
  829. package/packages/dev-console/src/index.mjs +2 -1
  830. package/packages/harness/src/index.ts +2 -0
  831. package/packages/harness/src/runtime.ts +218 -1
  832. package/packages/harness/src/tool-adapters.ts +19 -1
  833. package/packages/kernel/src/acl.ts +179 -0
  834. package/packages/kernel/src/capability-registry.ts +69 -2
  835. package/packages/kernel/src/data-class-registry.ts +354 -0
  836. package/packages/kernel/src/index.ts +65 -4
  837. package/packages/kernel/src/keyring.ts +208 -0
  838. package/packages/kernel/src/module-compatibility.ts +35 -4
  839. package/packages/kernel/src/module-registry.ts +49 -2
  840. package/packages/kernel/src/module-settings.ts +189 -27
  841. package/packages/server/package.json +2 -1
  842. package/packages/server/src/composition.ts +38 -0
  843. package/packages/server/src/endpoint.ts +104 -47
  844. package/packages/server/src/export/csv.ts +34 -0
  845. package/packages/server/src/export/definition.ts +346 -0
  846. package/packages/server/src/export/index.ts +61 -0
  847. package/packages/server/src/export/run.ts +116 -0
  848. package/packages/server/src/index.ts +155 -0
  849. package/packages/server/src/jobs/index.ts +93 -0
  850. package/packages/server/src/jobs/runner.ts +486 -0
  851. package/packages/server/src/log.ts +291 -0
  852. package/packages/server/src/mail/config.ts +184 -0
  853. package/packages/server/src/mail/contracts.ts +251 -0
  854. package/packages/server/src/mail/index.ts +31 -0
  855. package/packages/server/src/mail/port.ts +101 -0
  856. package/packages/server/src/mail/smtp.ts +191 -0
  857. package/packages/server/src/mail/template.ts +105 -0
  858. package/packages/server/src/metrics.ts +447 -0
  859. package/packages/server/src/pagination.ts +246 -0
  860. package/packages/server/src/trace/context.ts +103 -0
  861. package/packages/server/src/trace/egress.ts +66 -0
  862. package/packages/server/src/trace/error-sink.ts +296 -0
  863. package/packages/server/src/trace/exporter.ts +295 -0
  864. package/packages/server/src/trace/index.ts +60 -0
  865. package/packages/server/src/trace/job-sink.ts +172 -0
  866. package/packages/server/src/trace/tracer.ts +338 -0
  867. package/packages/server/src/web.ts +5 -1
  868. package/packages/storage/package.json +40 -0
  869. package/packages/storage/src/config.ts +189 -0
  870. package/packages/storage/src/content-type.ts +124 -0
  871. package/packages/storage/src/contracts.ts +112 -0
  872. package/packages/storage/src/envelope.ts +189 -0
  873. package/packages/storage/src/index.ts +43 -0
  874. package/packages/storage/src/local.ts +75 -0
  875. package/packages/storage/src/port.ts +251 -0
  876. package/packages/storage/src/read-token.ts +130 -0
  877. package/packages/storage/src/s3.ts +144 -0
  878. package/packages/storage/src/scanner.ts +22 -0
  879. package/packages/storage/src/sigv4.ts +104 -0
  880. package/packages/storage/src/store.ts +13 -0
  881. package/packages/ui/package.json +1 -0
  882. package/packages/ui/src/components/Button.tsrx +3 -0
  883. package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
  884. package/packages/ui/src/components/DateField.tsrx +92 -0
  885. package/packages/ui/src/components/DatePicker.tsrx +525 -0
  886. package/packages/ui/src/components/DateRangeField.tsrx +93 -0
  887. package/packages/ui/src/components/Drawer.tsrx +10 -1
  888. package/packages/ui/src/components/FileUpload.tsrx +158 -0
  889. package/packages/ui/src/components/Pagination.tsrx +130 -0
  890. package/packages/ui/src/components/Select.tsrx +78 -0
  891. package/packages/ui/src/components/Table.tsrx +498 -81
  892. package/packages/ui/src/components/Tabs.tsrx +53 -0
  893. package/packages/ui/src/components/ToastHost.tsrx +48 -0
  894. package/packages/ui/src/components/calendar.ts +243 -0
  895. package/packages/ui/src/components/date-field.ts +62 -0
  896. package/packages/ui/src/components/file-upload.ts +49 -0
  897. package/packages/ui/src/components/focus-trap.ts +62 -0
  898. package/packages/ui/src/components/pagination.ts +68 -0
  899. package/packages/ui/src/components/table-sorting.ts +49 -0
  900. package/packages/ui/src/components/tabs.ts +61 -0
  901. package/packages/ui/src/components/toast-store.ts +116 -0
  902. package/packages/ui/src/icons/Icon.tsrx +5 -0
  903. package/packages/ui/src/index.ts +45 -0
  904. package/packages/ui/src/styles/components.css +598 -0
  905. package/modules/automations-workflows-integration/module.json +0 -27
  906. package/modules/automations-workflows-integration/spec/module.yaml +0 -93
  907. package/modules/automations-workflows-integration/src/index.ts +0 -14
  908. package/modules/automations-workflows-integration/src/platform.ts +0 -24
  909. package/modules/automations-workflows-integration/src/server/index.ts +0 -11
  910. package/modules/automations-workflows-integration/translations/en.json +0 -21
  911. package/modules/automations-workflows-integration/translations/pl.json +0 -21
  912. package/modules/workflows/src/services/cursor-codec.ts +0 -62
@@ -0,0 +1,249 @@
1
+ import type { AuthPrincipal, TenantMember } from '@flowdular/sdk/modules/auth';
2
+ import type { AuthRuntime } from '@flowdular/sdk/modules/auth/server';
3
+ import {
4
+ AuthServiceError,
5
+ TENANT_MEMBER_LOOKUP_LIMIT,
6
+ } from '@flowdular/sdk/modules/auth/server';
7
+ import type {
8
+ ImportPort,
9
+ ImportRow,
10
+ ImportValidateInput,
11
+ ImportValidation,
12
+ ImportWriteInput,
13
+ ImportWriteOutcome,
14
+ } from '@flowdular/sdk/modules/import';
15
+ import { USER_PERMISSIONS } from '../acl/permissions.ts';
16
+ import { UsersService } from './users-service.ts';
17
+
18
+ /** The port key; import.core composes the target id `users.core.members`. */
19
+ export const MEMBER_IMPORT_PORT_KEY = 'members';
20
+
21
+ /** A row that names no role joins on the least privileged built-in role. */
22
+ export const MEMBER_IMPORT_DEFAULT_ROLE = 'member';
23
+
24
+ const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
25
+
26
+ /* The address rule auth.core applies, so the natural key this port looks up is
27
+ the same string auth.core stored. */
28
+ function address(value: string | undefined): string {
29
+ return (value ?? '').trim().normalize('NFKC').toLowerCase();
30
+ }
31
+
32
+ function text(value: string | undefined): string | undefined {
33
+ const trimmed = value?.trim();
34
+ return trimmed === undefined || trimmed === '' ? undefined : trimmed;
35
+ }
36
+
37
+ function refusal(row: number, field: string, reason: string): ImportValidation {
38
+ return { row, verdict: 'invalid', field, reason };
39
+ }
40
+
41
+ /**
42
+ * Refusals only, as the port contract asks: a row this says nothing about is
43
+ * taken as valid. Whether a member already exists is not one of them, because
44
+ * the job's mode decides what an existing member means, and that is read at
45
+ * write time.
46
+ */
47
+ async function validateRows(
48
+ auth: AuthRuntime,
49
+ { tenantId, rows }: ImportValidateInput,
50
+ ): Promise<readonly ImportValidation[]> {
51
+ const roles = new Set(
52
+ (await (await auth.service()).listRoles(tenantId)).map((role) => role.key),
53
+ );
54
+ const refusals: ImportValidation[] = [];
55
+ const seen = new Set<string>();
56
+ for (const entry of rows) {
57
+ const email = address(entry.values.email);
58
+ if (email.length > 254 || !EMAIL.test(email)) {
59
+ refusals.push(refusal(entry.row, 'email', 'EMAIL_INVALID'));
60
+ continue;
61
+ }
62
+ const displayName = text(entry.values.displayName);
63
+ if (
64
+ displayName === undefined ||
65
+ displayName.length < 2 ||
66
+ displayName.length > 80
67
+ ) {
68
+ refusals.push(refusal(entry.row, 'displayName', 'DISPLAY_NAME_INVALID'));
69
+ continue;
70
+ }
71
+ const role = text(entry.values.role);
72
+ if (role !== undefined && !roles.has(role)) {
73
+ refusals.push(refusal(entry.row, 'role', 'ROLE_UNKNOWN'));
74
+ continue;
75
+ }
76
+ /* The first row carrying an address is the one that writes it, so a
77
+ repeat further down the file would write over this import's own row.
78
+ A repeat in a later batch meets the natural key at write instead. */
79
+ if (seen.has(email)) {
80
+ refusals.push(refusal(entry.row, 'email', 'EMAIL_DUPLICATE'));
81
+ continue;
82
+ }
83
+ seen.add(email);
84
+ }
85
+ return refusals;
86
+ }
87
+
88
+ /* No credential at all: auth.core stores its unusable marker, so nothing has to
89
+ be drawn, kept, or thrown away here. The member reaches the workspace through
90
+ the public reset flow or an administrative temporary password. */
91
+ async function createMember(
92
+ users: UsersService,
93
+ principal: AuthPrincipal,
94
+ entry: ImportRow,
95
+ email: string,
96
+ ): Promise<ImportWriteOutcome> {
97
+ const created = await users.createWithoutPassword(principal, {
98
+ email,
99
+ displayName: text(entry.values.displayName) ?? '',
100
+ role: text(entry.values.role) ?? MEMBER_IMPORT_DEFAULT_ROLE,
101
+ });
102
+ return { row: entry.row, outcome: 'created', recordRef: created.accountId };
103
+ }
104
+
105
+ async function applyExisting(
106
+ users: UsersService,
107
+ principal: AuthPrincipal,
108
+ entry: ImportRow,
109
+ member: TenantMember,
110
+ mode: ImportWriteInput['mode'],
111
+ ): Promise<ImportWriteOutcome> {
112
+ if (mode === 'create-only') {
113
+ return { row: entry.row, outcome: 'failed', reason: 'ALREADY_EXISTS' };
114
+ }
115
+ if (mode === 'skip-existing') {
116
+ return { row: entry.row, outcome: 'skipped', recordRef: member.accountId };
117
+ }
118
+ /* There is no transaction across the two writes, so the display name goes
119
+ first: it is the bounded one, refused only for its own shape, while the
120
+ role meets the owner cap, the acting principal and the assignable set. A
121
+ value the member already holds is not written at all, so a repeat leaves
122
+ no audit event for a change that did not happen. */
123
+ const displayName = text(entry.values.displayName);
124
+ let renamed = false;
125
+ if (displayName !== undefined && displayName !== member.displayName) {
126
+ await users.rename(principal, member.accountId, displayName);
127
+ renamed = true;
128
+ }
129
+ const role = text(entry.values.role);
130
+ if (role !== undefined && role !== member.role) {
131
+ try {
132
+ await users.assignRole(principal, member.accountId, role);
133
+ } catch (error) {
134
+ /* The rename already landed. Failing the whole row here would report a
135
+ change that did happen as one that did not, so the row is updated and
136
+ names what the role write met. */
137
+ if (!renamed) throw error;
138
+ return {
139
+ row: entry.row,
140
+ outcome: 'updated',
141
+ recordRef: member.accountId,
142
+ reason: `ROLE_UNCHANGED:${
143
+ error instanceof AuthServiceError ? error.code : 'WRITE_FAILED'
144
+ }`,
145
+ };
146
+ }
147
+ }
148
+ return { row: entry.row, outcome: 'updated', recordRef: member.accountId };
149
+ }
150
+
151
+ /**
152
+ * The batch's natural keys, resolved by the addresses the batch names rather
153
+ * than by listing the workspace: the cost is the rows the file asks about, not
154
+ * the workspace's member count. auth.core bounds one lookup, and an import
155
+ * batch is a setting a deployment raises, so the addresses are split into
156
+ * chunks of that bound.
157
+ */
158
+ async function existingMembers(
159
+ auth: AuthRuntime,
160
+ tenantId: string,
161
+ addresses: readonly string[],
162
+ ): Promise<Map<string, TenantMember>> {
163
+ const service = await auth.service();
164
+ const found = new Map<string, TenantMember>();
165
+ const wanted = [...new Set(addresses)];
166
+ for (
167
+ let start = 0;
168
+ start < wanted.length;
169
+ start += TENANT_MEMBER_LOOKUP_LIMIT
170
+ ) {
171
+ for (const member of await service.findTenantMembersByEmail(
172
+ tenantId,
173
+ wanted.slice(start, start + TENANT_MEMBER_LOOKUP_LIMIT),
174
+ )) {
175
+ found.set(address(member.email), member);
176
+ }
177
+ }
178
+ return found;
179
+ }
180
+
181
+ /**
182
+ * One outcome per row. The read names the job's workspace while every write
183
+ * pins the tenant to the principal, so a disagreement between the two fails the
184
+ * row in auth.core instead of reaching another workspace.
185
+ */
186
+ async function writeRows(
187
+ auth: AuthRuntime,
188
+ users: UsersService,
189
+ { tenantId, principal, rows, mode }: ImportWriteInput,
190
+ ): Promise<readonly ImportWriteOutcome[]> {
191
+ const existing = await existingMembers(
192
+ auth,
193
+ tenantId,
194
+ rows.map((entry) => address(entry.values.email)).filter(Boolean),
195
+ );
196
+ const outcomes: ImportWriteOutcome[] = [];
197
+ for (const entry of rows) {
198
+ const email = address(entry.values.email);
199
+ const member = existing.get(email);
200
+ try {
201
+ outcomes.push(
202
+ member === undefined
203
+ ? await createMember(users, principal, entry, email)
204
+ : await applyExisting(users, principal, entry, member, mode),
205
+ );
206
+ } catch (error) {
207
+ /* One row never fails the batch, and only the stable code is reported:
208
+ an auth.core message can name the member it refused. */
209
+ outcomes.push({
210
+ row: entry.row,
211
+ outcome: 'failed',
212
+ reason: error instanceof AuthServiceError ? error.code : 'WRITE_FAILED',
213
+ });
214
+ }
215
+ }
216
+ return outcomes;
217
+ }
218
+
219
+ /**
220
+ * The workspace's members as an import target. Every read and write goes
221
+ * through the auth administration port with the principal that started the job
222
+ * as the actor, so the owner cap, the last-owner rule and the audit trail hold
223
+ * for an imported row exactly as they do for the Users screen.
224
+ */
225
+ export function createMemberImportPort(auth: AuthRuntime): ImportPort {
226
+ const users = new UsersService(auth);
227
+ return {
228
+ key: MEMBER_IMPORT_PORT_KEY,
229
+ label: 'Members',
230
+ permission: USER_PERMISSIONS.manage,
231
+ fields: [
232
+ { id: 'email', label: 'Email', required: true, type: 'email' },
233
+ {
234
+ id: 'displayName',
235
+ label: 'Display name',
236
+ required: true,
237
+ type: 'string',
238
+ },
239
+ { id: 'role', label: 'Role', required: false, type: 'string' },
240
+ ],
241
+ naturalKey: ['email'],
242
+ /* The address rule auth.core stores under, so two rows naming one member
243
+ in different case are one natural key for the whole file, not only
244
+ inside the batch the port happens to see them in. */
245
+ naturalKeyOf: (values) => address(values.email),
246
+ validate: (input) => validateRows(auth, input),
247
+ write: (input) => writeRows(auth, users, input),
248
+ };
249
+ }
@@ -0,0 +1,145 @@
1
+ import type { TenantMember } from '@flowdular/sdk/modules/auth';
2
+ import type { AuthRuntime } from '@flowdular/sdk/modules/auth/server';
3
+ import type {
4
+ SearchHit,
5
+ SearchProvider,
6
+ SearchProviderPage,
7
+ SearchProviderQuery,
8
+ } from '@flowdular/sdk/modules/search';
9
+ import { USER_PERMISSIONS } from '../acl/permissions.ts';
10
+
11
+ export const MEMBER_SEARCH_PROVIDER_KEY = 'users.members';
12
+
13
+ /**
14
+ * Members one query may read. auth.core applies both the predicate and this
15
+ * limit in SQL, so the read is the matching rows rather than the workspace.
16
+ * Ranking and the multi-term rule still run here, over that bounded set.
17
+ */
18
+ export const MEMBER_SEARCH_SCAN_LIMIT = 500;
19
+
20
+ /**
21
+ * Terms of one query the provider may push down. auth.core matches a prefix,
22
+ * so a term that opens no name and no address answers nothing and the next one
23
+ * has to be asked for; the cap keeps a long query to a bounded number of reads
24
+ * of at most `MEMBER_SEARCH_SCAN_LIMIT` rows each, at the price of not finding
25
+ * a member only the fourth term or later opens.
26
+ */
27
+ export const MEMBER_SEARCH_PUSHDOWN_LIMIT = 3;
28
+
29
+ /** The view a hit opens, as the users client contribution registers it. */
30
+ const MEMBER_VIEW_ID = 'users';
31
+
32
+ function aborted(signal: AbortSignal | undefined): boolean {
33
+ return signal?.aborted === true;
34
+ }
35
+
36
+ /**
37
+ * The terms the query names, in the order they were typed. A query of only
38
+ * whitespace names none and reads nothing.
39
+ */
40
+ function searchTerms(query: string): readonly string[] {
41
+ return query.split(' ').filter((term) => term.length > 0);
42
+ }
43
+
44
+ /**
45
+ * How well one member answers the query. Only compared against other members,
46
+ * so the scale is this provider's own: an exact address beats a name that
47
+ * starts with the term, which beats a term found anywhere.
48
+ */
49
+ export function memberScore(member: TenantMember, term: string): number {
50
+ const name = member.displayName.toLowerCase();
51
+ const email = member.email.toLowerCase();
52
+ if (email === term) return 1;
53
+ if (name === term) return 0.9;
54
+ if (name.startsWith(term)) return 0.8;
55
+ if (email.startsWith(term)) return 0.7;
56
+ if (name.includes(term)) return 0.5;
57
+ if (email.includes(term)) return 0.4;
58
+ return 0;
59
+ }
60
+
61
+ /** Every term has to land somewhere, so "ada lovelace" does not match "ada". */
62
+ export function matchMembers(
63
+ members: readonly TenantMember[],
64
+ query: string,
65
+ ): readonly { readonly member: TenantMember; readonly score: number }[] {
66
+ const terms = query.toLowerCase().split(' ').filter(Boolean);
67
+ if (terms.length === 0) return [];
68
+ const matched: { member: TenantMember; score: number }[] = [];
69
+ for (const member of members) {
70
+ let best = 0;
71
+ let all = true;
72
+ for (const term of terms) {
73
+ const score = memberScore(member, term);
74
+ if (score === 0) {
75
+ all = false;
76
+ break;
77
+ }
78
+ if (score > best) best = score;
79
+ }
80
+ if (all) matched.push({ member, score: best });
81
+ }
82
+ matched.sort(
83
+ (left, right) =>
84
+ right.score - left.score ||
85
+ left.member.displayName.localeCompare(right.member.displayName) ||
86
+ left.member.accountId.localeCompare(right.member.accountId),
87
+ );
88
+ return matched;
89
+ }
90
+
91
+ function toHit(member: TenantMember, score: number): SearchHit {
92
+ return {
93
+ ref: member.accountId,
94
+ title: member.displayName,
95
+ snippet: member.email,
96
+ viewId: MEMBER_VIEW_ID,
97
+ route: '/users?member=' + encodeURIComponent(member.accountId),
98
+ score,
99
+ };
100
+ }
101
+
102
+ /**
103
+ * The workspace's members as a search provider. Every read goes through the
104
+ * auth administration port with the tenant of the principal search.core
105
+ * resolved, so this module still opens no table of another one.
106
+ */
107
+ export function createMemberSearchProvider(auth: AuthRuntime): SearchProvider {
108
+ return {
109
+ key: MEMBER_SEARCH_PROVIDER_KEY,
110
+ label: 'Members',
111
+ permission: USER_PERMISSIONS.read,
112
+ async search(input: SearchProviderQuery): Promise<SearchProviderPage> {
113
+ if (aborted(input.signal)) return { hits: [], nextCursor: null };
114
+ const terms = searchTerms(input.query);
115
+ if (terms.length === 0) return { hits: [], nextCursor: null };
116
+ const service = await auth.service();
117
+ const pushdowns = Math.min(terms.length, MEMBER_SEARCH_PUSHDOWN_LIMIT);
118
+ /* The port matches a prefix, so the term typed first is not
119
+ necessarily the one that opens the member: "lovelace ada" has to
120
+ fall through to "ada" to reach Ada Lovelace. Each term is pushed
121
+ in turn until one answers rows, and `matchMembers` still requires
122
+ every term over what came back. */
123
+ let members: readonly TenantMember[] = [];
124
+ for (let index = 0; index < pushdowns; index += 1) {
125
+ members = await service.searchTenantMembers(input.tenantId, {
126
+ query: terms[index]!,
127
+ limit: MEMBER_SEARCH_SCAN_LIMIT,
128
+ });
129
+ if (members.length > 0) break;
130
+ if (aborted(input.signal)) return { hits: [], nextCursor: null };
131
+ }
132
+ if (aborted(input.signal)) return { hits: [], nextCursor: null };
133
+ const matched = matchMembers(members, input.query);
134
+ const offset = Number(input.cursor ?? '0');
135
+ const start =
136
+ Number.isSafeInteger(offset) && offset >= 0 ? offset : matched.length;
137
+ const page = matched.slice(start, start + input.limit);
138
+ const next = start + page.length;
139
+ return {
140
+ hits: page.map((entry) => toHit(entry.member, entry.score)),
141
+ nextCursor: next < matched.length ? String(next) : null,
142
+ };
143
+ },
144
+ };
145
+ }
@@ -2,10 +2,15 @@ import type {
2
2
  AuthActor,
3
3
  AuthPrincipal,
4
4
  CreateTenantMemberInput,
5
+ CreateTenantMemberWithoutPasswordInput,
5
6
  TenantMember,
7
+ TenantMemberKeyset,
8
+ TenantMemberSort,
9
+ TenantMemberSortedPage,
6
10
  TenantRole,
7
11
  } from '@flowdular/sdk/modules/auth';
8
12
  import type { AuthRuntime } from '@flowdular/sdk/modules/auth/server';
13
+ import { AuthServiceError } from '@flowdular/sdk/modules/auth/server';
9
14
 
10
15
  export interface CreateUserInput {
11
16
  readonly email: string;
@@ -14,8 +19,30 @@ export interface CreateUserInput {
14
19
  readonly role: string;
15
20
  }
16
21
 
17
- export interface UserDirectory {
18
- readonly users: readonly TenantMember[];
22
+ export type MemberStatusFilter = 'active' | 'disabled' | null;
23
+
24
+ export interface MemberListInput {
25
+ readonly sort: TenantMemberSort;
26
+ readonly direction: 'asc' | 'desc';
27
+ readonly limit: number;
28
+ /** A prefix of the display name or the address; empty narrows nothing. */
29
+ readonly query: string;
30
+ readonly status: MemberStatusFilter;
31
+ readonly after: TenantMemberKeyset | null;
32
+ }
33
+
34
+ /** Ids one bulk member action may name. */
35
+ export const MEMBER_BULK_LIMIT = 100;
36
+
37
+ export interface MemberBulkOutcome {
38
+ readonly accountId: string;
39
+ readonly outcome: 'updated' | 'not-found' | 'refused';
40
+ /** The stable auth.core code behind a refusal. */
41
+ readonly reason?: string;
42
+ }
43
+
44
+ /** What the Members screen needs beside the page it shows. */
45
+ export interface UsersContext {
19
46
  readonly roles: readonly Pick<
20
47
  TenantRole,
21
48
  'id' | 'key' | 'name' | 'builtin'
@@ -25,6 +52,8 @@ export interface UserDirectory {
25
52
  readonly actor: { readonly accountId: string; readonly role: string };
26
53
  /** Shared auth.core setting, read through the declared dependency. */
27
54
  readonly passwordMinLength: number;
55
+ /** Every membership of the workspace, counted in the database. */
56
+ readonly memberCount: number;
28
57
  }
29
58
 
30
59
  function actor(principal: AuthPrincipal): AuthActor {
@@ -47,16 +76,35 @@ export class UsersService {
47
76
  this.#auth = auth;
48
77
  }
49
78
 
50
- async list(principal: AuthPrincipal): Promise<UserDirectory> {
79
+ /* One page, sorted, narrowed and cut by auth.core; the screen shows it as
80
+ it arrives. */
81
+ async list(
82
+ principal: AuthPrincipal,
83
+ input: MemberListInput,
84
+ ): Promise<TenantMemberSortedPage> {
85
+ return (await this.#auth.service()).listTenantMembersSorted(
86
+ principal.tenantId,
87
+ {
88
+ sort: input.sort,
89
+ direction: input.direction,
90
+ limit: input.limit,
91
+ query: input.query,
92
+ membershipStatus: input.status,
93
+ after: input.after,
94
+ },
95
+ );
96
+ }
97
+
98
+ async context(principal: AuthPrincipal): Promise<UsersContext> {
51
99
  const service = await this.#auth.service();
52
100
  return {
53
- users: await service.listTenantMembers(principal.tenantId),
54
101
  roles: (await service.listRoles(principal.tenantId)).map(
55
102
  ({ id, key, name, builtin }) => ({ id, key, name, builtin }),
56
103
  ),
57
104
  grantableScopes: await service.listGrantableScopes(principal.tenantId),
58
105
  actor: { accountId: principal.accountId, role: principal.role },
59
106
  passwordMinLength: this.#auth.settings.passwordMinLength,
107
+ memberCount: await service.countTenantMembers(principal.tenantId),
60
108
  };
61
109
  }
62
110
 
@@ -74,6 +122,22 @@ export class UsersService {
74
122
  );
75
123
  }
76
124
 
125
+ /* A member who holds no password: auth.core stores its unusable credential
126
+ marker, so no secret is drawn here and none has to be delivered. */
127
+ async createWithoutPassword(
128
+ principal: AuthPrincipal,
129
+ input: Omit<CreateUserInput, 'password'>,
130
+ ): Promise<TenantMember> {
131
+ const record: CreateTenantMemberWithoutPasswordInput = {
132
+ ...input,
133
+ tenantId: principal.tenantId,
134
+ };
135
+ return (await this.#auth.service()).createTenantMemberWithoutPassword(
136
+ record,
137
+ actor(principal),
138
+ );
139
+ }
140
+
77
141
  async rename(
78
142
  principal: AuthPrincipal,
79
143
  accountId: string,
@@ -110,6 +174,55 @@ export class UsersService {
110
174
  );
111
175
  }
112
176
 
177
+ /* Workspace access for several members at once: the membership path the
178
+ drawer's switch uses, once per id, so every row keeps its own audit event
179
+ and its own refusal (the acting principal, the last owner, an owner
180
+ touched by a non-owner) and a missing or foreign id costs nobody else. */
181
+ setMembershipStatusMany(
182
+ principal: AuthPrincipal,
183
+ accountIds: readonly string[],
184
+ status: 'active' | 'disabled',
185
+ ): Promise<readonly MemberBulkOutcome[]> {
186
+ return this.#each(accountIds, async (accountId) => {
187
+ await (
188
+ await this.#auth.service()
189
+ ).setMembershipStatus(actor(principal), accountId, status);
190
+ });
191
+ }
192
+
193
+ assignRoleMany(
194
+ principal: AuthPrincipal,
195
+ accountIds: readonly string[],
196
+ roleKey: string,
197
+ ): Promise<readonly MemberBulkOutcome[]> {
198
+ return this.#each(accountIds, async (accountId) => {
199
+ await (
200
+ await this.#auth.service()
201
+ ).assignMemberRole(actor(principal), accountId, roleKey);
202
+ });
203
+ }
204
+
205
+ async #each(
206
+ accountIds: readonly string[],
207
+ write: (accountId: string) => Promise<void>,
208
+ ): Promise<readonly MemberBulkOutcome[]> {
209
+ const outcomes: MemberBulkOutcome[] = [];
210
+ for (const accountId of accountIds) {
211
+ try {
212
+ await write(accountId);
213
+ outcomes.push({ accountId, outcome: 'updated' });
214
+ } catch (error) {
215
+ if (!(error instanceof AuthServiceError)) throw error;
216
+ outcomes.push(
217
+ error.code === 'ACCOUNT_NOT_FOUND'
218
+ ? { accountId, outcome: 'not-found' }
219
+ : { accountId, outcome: 'refused', reason: error.code },
220
+ );
221
+ }
222
+ }
223
+ return outcomes;
224
+ }
225
+
113
226
  async remove(principal: AuthPrincipal, accountId: string): Promise<void> {
114
227
  await (
115
228
  await this.#auth.service()
@@ -19,6 +19,10 @@
19
19
  "invite.sending": "Sending…",
20
20
  "invite.sent": "Invitation sent to {email}.",
21
21
  "invite.error": "The invitation could not be sent.",
22
+ "export.action": "Export CSV",
23
+ "export.started": "The member export started. It appears on the Exports screen as soon as the file is ready.",
24
+ "export.link": "Open Exports",
25
+ "export.error": "The export could not be started.",
22
26
  "action.manage": "Manage",
23
27
  "action.cancel": "Cancel",
24
28
  "action.close": "Close",
@@ -31,10 +35,11 @@
31
35
  "denied.members": "Reading the user directory needs the users.members.read scope.",
32
36
  "table.title": "Members",
33
37
  "table.caption": "Workspace users",
34
- "table.count": "{owners} owners · {accounts} accounts",
38
+ "table.count": "{accounts} accounts",
35
39
  "table.user": "User",
40
+ "table.email": "Email",
36
41
  "table.role": "Role",
37
- "table.status": "Status",
42
+ "table.status": "Workspace access",
38
43
  "table.scopes": "Scopes",
39
44
  "table.actions": "User actions",
40
45
  "table.loading": "Loading workspace accounts…",
@@ -42,11 +47,36 @@
42
47
  "table.emptyHint": "Create the first account for this workspace.",
43
48
  "table.emptyFilteredTitle": "No matching accounts",
44
49
  "table.emptyFilteredHint": "No account in this workspace matches the current filter.",
50
+ "selection.label": "Select all members on screen",
51
+ "selection.rowLabel": "Select {name}",
52
+ "selection.clear": "Clear selection",
53
+ "selection.summary": "{count} selected",
54
+ "action.deactivateSelected": "Deactivate selected",
55
+ "action.assignRoleSelected": "Assign role",
56
+ "action.bulkRefused": "Select at least one member other than yourself.",
57
+ "deactivateMany.title": "Deactivate the selected members?",
58
+ "deactivateMany.description": "{count} members lose access to this workspace; their sessions and API tokens here are revoked. Their other workspaces are untouched.",
59
+ "roleMany.title": "Assign a role to the selected members",
60
+ "roleMany.description": "The role replaces the scopes of {count} members.",
61
+ "notice.deactivatedMany": "Deactivated {updated}, missing {missing}, refused {refused}.",
62
+ "notice.roleAssignedMany": "Role assigned to {updated}, missing {missing}, refused {refused}.",
63
+ "error.deactivateMany": "Could not deactivate the selected members.",
64
+ "error.roleMany": "Could not assign the role to the selected members.",
65
+ "common.messages": "Messages",
45
66
  "table.note": "Roles decide what an account may reach. Owners administer the workspace; every other role carries exactly the scopes it lists.",
46
- "search.placeholder": "Filter by name or email",
67
+ "search.placeholder": "Starts with name or email",
47
68
  "search.label": "Filter members",
69
+ "filter.label": "Filters",
70
+ "filter.status": "Workspace access",
71
+ "filter.allStatuses": "All",
72
+ "pagination.label": "Member pages",
73
+ "pagination.previous": "Previous",
74
+ "pagination.next": "Next",
75
+ "pagination.size": "Members per page",
76
+ "pagination.summary": "Page {page} · from member {from}",
48
77
  "status.active": "Active",
49
78
  "status.disabled": "Disabled",
79
+ "status.blocked": "Operator block",
50
80
  "status.passwordResetPending": "Password reset pending",
51
81
  "drawer.newTitle": "New account",
52
82
  "drawer.newSubtitle": "Direct workspace access",
@@ -68,28 +98,47 @@
68
98
  "member.saveName": "Save name",
69
99
  "member.roleDescription": "A role sets the scopes below; custom roles live on the Roles screen.",
70
100
  "member.assignRole": "Assign role",
101
+ "member.access": "Access to this workspace",
102
+ "member.accessDescription": "Turns this membership on or off. It never touches the person's other workspaces or their account.",
103
+ "membership.active": "Active in this workspace",
104
+ "membership.disabled": "Disabled in this workspace",
105
+ "membership.reasonActive": "The member signs in to this workspace normally. Other workspaces are unaffected either way.",
106
+ "membership.reasonDisabled": "Sign-in to this workspace is refused and its sessions and API tokens are revoked. Other workspaces keep working.",
107
+ "membership.disable": "Disable access",
108
+ "membership.confirmTitle": "Disable access for {name}?",
109
+ "membership.confirmDescription": "Sessions and API tokens for this workspace are revoked at once and sign-in here is refused. Other workspaces stay untouched. Turning access back on restores sign-in, not the revoked tokens.",
110
+ "membership.error": "Workspace access could not be changed.",
111
+ "membership.errorSelf": "You cannot change your own access to this workspace. Ask another owner.",
112
+ "membership.errorLastOwner": "This is the last active owner of the workspace. Give another member the owner role first.",
113
+ "membership.errorOwnerRequired": "Only an owner can change another owner's access to this workspace.",
114
+ "membership.errorNotFound": "This member is no longer in the workspace. Refresh the list.",
71
115
  "member.account": "Account",
72
- "member.accountDescription": "Disabling ends every session at once and blocks sign-in.",
73
- "member.disable": "Disable account",
74
- "member.enable": "Enable account",
116
+ "member.accountDescription": "The global account state an operator owns. Signing out ends every session of this account, in every workspace.",
117
+ "member.accountReadOnly": "Blocking or unblocking an account is a deployment operator action and cannot be done here. Use the workspace access switch above to end access to this workspace.",
75
118
  "member.signOutEverywhere": "Sign out everywhere",
76
119
  "member.temporaryPassword": "Temporary password",
77
120
  "member.temporaryPasswordHelp": "At least {min} characters. The member picks a new one at the next sign-in.",
78
121
  "member.resetPassword": "Reset password",
122
+ "member.mfa": "Multi-factor authentication",
123
+ "member.mfaDescription": "Clear the enrolled authenticator when a member loses the device. The member enrols again from account security.",
124
+ "member.resetMfa": "Reset MFA",
79
125
  "member.removeTitle": "Remove from workspace",
80
126
  "member.removeDescription": "Ends the membership with its sessions and tokens; the account stays if it belongs to another workspace.",
81
127
  "member.remove": "Remove member",
82
128
  "notice.nameSaved": "Display name saved.",
83
129
  "notice.roleAssigned": "Role assigned.",
84
130
  "notice.scopesSaved": "Scopes saved.",
85
- "notice.accountDisabled": "Account disabled.",
86
- "notice.accountEnabled": "Account enabled.",
131
+ "notice.membershipDisabled": "Access to this workspace disabled.",
132
+ "notice.membershipEnabled": "Access to this workspace enabled.",
87
133
  "notice.passwordSet": "Temporary password set. The member must change it at sign-in.",
134
+ "notice.mfaReset": "Multi-factor authentication cleared. The member must enrol again.",
88
135
  "notice.sessionsCount": "Sessions ended: {count}.",
89
136
  "notice.sessionsEnded": "Sessions ended.",
90
137
  "remove.title": "Remove this member?",
91
138
  "remove.fallbackName": "The member",
92
139
  "remove.description": "{name} loses access to this workspace immediately. Sessions and API tokens for this membership are revoked.",
140
+ "mfaReset.title": "Reset multi-factor authentication?",
141
+ "mfaReset.description": "{name} loses the enrolled authenticator and every recovery code, and must enrol again before the next sign-in that asks for a second factor.",
93
142
  "roles.title": "Roles",
94
143
  "roles.description": "Built-in and custom roles with the exact scopes they grant.",
95
144
  "roles.new": "New role",