@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
@@ -1,18 +1,37 @@
1
+ import { useEffect, useId, useMemo, useRef, useState } from 'octane';
1
2
  import type { OctaneNode } from 'octane';
2
3
  import {
4
+ columnFilteringFeature,
3
5
  createCoreRowModel,
6
+ createFilteredRowModel,
7
+ createSortedRowModel,
4
8
  flexRender,
9
+ globalFilteringFeature,
10
+ rowPaginationFeature,
11
+ rowSelectionFeature,
12
+ rowSortingFeature,
5
13
  tableFeatures,
6
14
  useTable,
7
15
  type ColumnDef,
8
16
  type RowData,
17
+ type RowSelectionState,
9
18
  } from '@octanejs/tanstack-table';
10
19
  import { Icon } from '../icons/Icon.tsrx';
11
20
  import { Button } from './Button.tsrx';
12
21
  import { EmptyState } from './EmptyState.tsrx';
22
+ import { pageRange } from './pagination.ts';
23
+ import {
24
+ compareCellValues,
25
+ sortingSignature,
26
+ type TableSort,
27
+ type TableSortChange,
28
+ } from './table-sorting.ts';
13
29
 
14
30
  export type TableStatus = 'idle' | 'loading';
15
31
 
32
+ /** 'server' means the module already sorted, narrowed and paged in SQL. */
33
+ export type TableMode = 'client' | 'server';
34
+
16
35
  export interface TableColumn<Row extends RowData> {
17
36
  readonly key: string;
18
37
  readonly header: string;
@@ -20,6 +39,8 @@ export interface TableColumn<Row extends RowData> {
20
39
  readonly numeric?: boolean | undefined;
21
40
  /** Required CSS width, e.g. '120px' or '20%', to prevent layout drift. */
22
41
  readonly width: string;
42
+ /** Comparable, searchable value behind the cell: it makes the column sortable and scanned by `globalFilter`. */
43
+ readonly value?: ((row: Row) => string | number | null) | undefined;
23
44
  readonly cell: (row: Row) => OctaneNode;
24
45
  }
25
46
 
@@ -36,13 +57,54 @@ export interface TableAction {
36
57
  readonly icon?: string | undefined;
37
58
  readonly tone?: 'default' | 'danger' | undefined;
38
59
  readonly disabled?: boolean | undefined;
60
+ /** Why this action is refused. Read only while `disabled`, as the button's accessible description. */
61
+ readonly reason?: string | undefined;
39
62
  readonly onSelect: () => void;
40
63
  }
41
64
 
65
+ export interface TableSelection<Row extends RowData> {
66
+ /** Controlled by the screen, which resets it on a page, sort or filter change. The header checkbox touches only the rows on screen; the clear button empties the whole set. */
67
+ readonly selectedKeys: ReadonlySet<string>;
68
+ readonly onSelectionChange: (keys: ReadonlySet<string>) => void;
69
+ /** Accessible name of the header checkbox. */
70
+ readonly label: string;
71
+ /** Accessible name of a row's checkbox. */
72
+ readonly rowLabel: (row: Row) => string;
73
+ /** false: the row has no checkbox and the header checkbox skips it. */
74
+ readonly selectable?: ((row: Row) => boolean) | undefined;
75
+ /** Label of the clear-selection button in the bulk bar. */
76
+ readonly clearLabel?: string | undefined;
77
+ }
78
+
79
+ export interface TableBulkAction {
80
+ readonly id: string;
81
+ readonly label: string;
82
+ readonly icon?: string | undefined;
83
+ readonly tone?: 'default' | 'danger' | undefined;
84
+ readonly disabled?: boolean | undefined;
85
+ /** Why this action is refused. Read only while `disabled`, like `TableAction.reason`. */
86
+ readonly reason?: string | undefined;
87
+ readonly onSelect: (keys: readonly string[]) => void;
88
+ }
89
+
90
+ export interface TablePagination {
91
+ /** Zero-based index of the page on screen. */
92
+ readonly pageIndex: number;
93
+ readonly pageSize: number;
94
+ /** The page the table clamped to, reported once the render commits. It moves the page for no other reason. */
95
+ readonly onPageChange: (pageIndex: number) => void;
96
+ /** Rows behind the table when `rows` is already one page. Omit to page client-side over `rows`, or, in server mode, for a keyset page nobody counted. */
97
+ readonly totalRows?: number | undefined;
98
+ /** Whether a page follows this one. Read only when `totalRows` is absent: a keyset page knows there is more without knowing how much. */
99
+ readonly hasMore?: boolean | undefined;
100
+ }
101
+
42
102
  export interface TableProps<Row extends RowData> {
43
103
  readonly columns: readonly TableColumn<Row>[];
44
104
  readonly rows: readonly Row[];
45
105
  readonly rowKey: (row: Row) => string;
106
+ /** 'server' renders `rows` as they arrive and reports every sort and page change instead of narrowing. */
107
+ readonly mode?: TableMode | undefined;
46
108
  /** 'loading' replaces the body with the loading row; the screen decides when. */
47
109
  readonly status?: TableStatus | undefined;
48
110
  readonly loadingLabel?: string | undefined;
@@ -50,6 +112,16 @@ export interface TableProps<Row extends RowData> {
50
112
  /** A search term or filter is narrowing the set, so `emptyFiltered` applies. */
51
113
  readonly filtered?: boolean | undefined;
52
114
  readonly emptyFiltered?: TableEmpty | undefined;
115
+ /** Sortable headers for every column that declares `value`. */
116
+ readonly sorting?: boolean | undefined;
117
+ /** Controlled sorting state; omit to let the table keep its own. */
118
+ readonly sortingState?: readonly TableSort[] | undefined;
119
+ /** Every sort change, controlled or not. */
120
+ readonly onSortingChange?: TableSortChange | undefined;
121
+ /** Narrows rows to those whose `value` columns contain this text. */
122
+ readonly globalFilter?: string | undefined;
123
+ /** Slices rows to one page. Pair it with a `Pagination` in the card's `after`. */
124
+ readonly pagination?: TablePagination | undefined;
53
125
  /** Actions rendered as compact buttons in the trailing column. */
54
126
  readonly actions?: ((row: Row) => readonly TableAction[]) | undefined;
55
127
  /** Accessible name for the otherwise visually empty action-column header. */
@@ -58,6 +130,12 @@ export interface TableProps<Row extends RowData> {
58
130
  readonly actionsWidth?: string | undefined;
59
131
  readonly onSelect?: ((row: Row) => void) | undefined;
60
132
  readonly selectedKey?: string | undefined;
133
+ /** Multi-row selection through a leading checkbox column. The header checkbox toggles the rows on screen. */
134
+ readonly selection?: TableSelection<Row> | undefined;
135
+ /** Buttons in the bar above the table while at least one row is selected. */
136
+ readonly bulkActions?: readonly TableBulkAction[] | undefined;
137
+ /** Text of the bulk bar and the polite announcement, e.g. "3 selected". */
138
+ readonly selectionSummary?: ((count: number) => string) | undefined;
61
139
  /** Accessible name for the table, rendered as its aria-label. */
62
140
  readonly caption?: string | undefined;
63
141
  }
@@ -69,52 +147,169 @@ interface FlowdularColumnMeta {
69
147
  readonly actionsLabel?: string;
70
148
  }
71
149
 
150
+ /* Sorting and filtering are stitched in statically because the feature set is
151
+ fixed when the table is constructed. Each stage stays inert for a screen
152
+ that did not ask for it through its manual* option, so a table without these
153
+ props renders exactly the rows it is given. `rowPaginationFeature` carries
154
+ no row model: it is registered for `manualPagination`, which keeps the
155
+ filtered and sorted models from resetting a page the engine does not own. */
72
156
  const FEATURES = tableFeatures({
73
157
  coreRowModel: createCoreRowModel(),
158
+ columnFilteringFeature,
159
+ globalFilteringFeature,
160
+ filteredRowModel: createFilteredRowModel(),
161
+ rowSortingFeature,
162
+ sortedRowModel: createSortedRowModel(),
163
+ rowPaginationFeature,
164
+ rowSelectionFeature,
74
165
  columnMeta: {} as FlowdularColumnMeta,
75
166
  });
76
167
 
168
+ const SELECT_WIDTH = '44px';
169
+
170
+ function defaultSelectionSummary(count: number): string {
171
+ return count + ' selected';
172
+ }
173
+
174
+ /* A checkbox answers Space on its own; Enter is added so both keys the row
175
+ contract names toggle the same way. */
176
+ function enterToggles(toggle: () => void): (event: KeyboardEvent) => void {
177
+ return (event) => {
178
+ if (event.key !== 'Enter') return;
179
+ event.preventDefault();
180
+ toggle();
181
+ };
182
+ }
183
+
184
+ function stopClick(event: MouseEvent): void {
185
+ event.stopPropagation();
186
+ }
187
+
188
+ function SelectAll(props: {
189
+ readonly label: string;
190
+ readonly checked: boolean;
191
+ readonly mixed: boolean;
192
+ readonly disabled: boolean;
193
+ readonly onToggle: () => void;
194
+ }) @{
195
+ const ref = useRef<HTMLInputElement | null>(null);
196
+ /* Every render: a click the screen ignored has already cleared the native
197
+ flag while `mixed` still holds. */
198
+ useEffect(() => {
199
+ if (ref.current) ref.current.indeterminate = props.mixed;
200
+ });
201
+
202
+ <input
203
+ type="checkbox"
204
+ ref={ref}
205
+ aria-label={props.label}
206
+ aria-checked={props.mixed
207
+ ? 'mixed'
208
+ : props.checked
209
+ ? 'true'
210
+ : 'false'}
211
+ checked={props.checked}
212
+ disabled={props.disabled}
213
+ onChange={props.onToggle}
214
+ onKeyDown={enterToggles(props.onToggle)}
215
+ />
216
+ }
217
+
77
218
  function ActionButtons(props: { readonly actions: readonly TableAction[] }) @{
78
- const entries = props.actions.map((action) => ({ key: action.id, action }));
219
+ const base = useId();
220
+ /* A reason answers "why can I not do this", so it is read only while the
221
+ action is refused; an enabled action pays for no description node. */
222
+ const entries = props.actions.map((action) => {
223
+ const reason =
224
+ action.disabled === true ? action.reason ?? '' : '';
225
+ return {
226
+ key: action.id,
227
+ action,
228
+ reason,
229
+ reasonId: reason === '' ? undefined : base + '-' + action.id,
230
+ };
231
+ });
79
232
  @if (entries.length > 0) {
80
233
  <div
81
234
  class="ui-table-action-buttons"
82
235
  onClick={(event: MouseEvent) => event.stopPropagation()}
83
236
  >
84
237
  @for (const entry of entries; key entry.key) {
85
- <Button
86
- size="sm"
87
- variant={entry.action.tone === 'danger' ? 'danger' : 'secondary'}
88
- disabled={entry.action.disabled ?? false}
89
- onClick={entry.action.onSelect}
238
+ <span
239
+ class="ui-table-action"
240
+ title={entry.reason === '' ? undefined : entry.reason}
90
241
  >
91
- @if (entry.action.icon) {
92
- <Icon name={entry.action.icon} size={16} />
242
+ <Button
243
+ size="sm"
244
+ variant={entry.action.tone === 'danger' ? 'danger' : 'secondary'}
245
+ disabled={entry.action.disabled ?? false}
246
+ describedBy={entry.reasonId}
247
+ onClick={entry.action.onSelect}
248
+ >
249
+ @if (entry.action.icon) {
250
+ <Icon name={entry.action.icon} size={16} />
251
+ }
252
+ {entry.action.label}
253
+ </Button>
254
+ @if (entry.reasonId) {
255
+ <span
256
+ class="ui-visually-hidden"
257
+ id={entry.reasonId}
258
+ >{entry.reason}</span>
93
259
  }
94
- {entry.action.label}
95
- </Button>
260
+ </span>
96
261
  }
97
262
  </div>
98
263
  }
99
264
  }
100
265
 
266
+ function SortIndicator(props: { readonly direction: 'asc' | 'desc' | false }) @{
267
+ <span
268
+ class={[
269
+ 'ui-table__sort-icon',
270
+ props.direction !== false && 'ui-table__sort-icon--on',
271
+ props.direction === 'asc' && 'ui-table__sort-icon--asc',
272
+ ]}
273
+ >
274
+ <Icon
275
+ name={props.direction === false ? 'sort' : 'chevron-down'}
276
+ size={14}
277
+ />
278
+ </span>
279
+ }
280
+
101
281
  function tanstackColumns<Row extends RowData>(
102
282
  columns: readonly TableColumn<Row>[],
103
283
  actions: ((row: Row) => readonly TableAction[]) | undefined,
104
284
  actionsLabel: string,
105
285
  actionsWidth: string,
106
286
  ): readonly ColumnDef<typeof FEATURES, Row>[] {
107
- const definitions: ColumnDef<typeof FEATURES, Row>[] = columns.map(
108
- (column) => ({
287
+ const definitions: ColumnDef<typeof FEATURES, Row>[] = columns.map((
288
+ column,
289
+ ) => {
290
+ const meta = {
291
+ numeric: column.numeric ?? false,
292
+ width: column.width,
293
+ };
294
+ const value = column.value;
295
+ if (!value) return {
109
296
  id: column.key,
110
297
  header: column.header,
111
298
  cell: (context) => column.cell(context.row.original),
112
- meta: {
113
- numeric: column.numeric ?? false,
114
- width: column.width,
115
- },
116
- }),
117
- );
299
+ meta,
300
+ };
301
+ return {
302
+ id: column.key,
303
+ accessorFn: (row: Row) => value(row),
304
+ header: column.header,
305
+ cell: (context) => column.cell(context.row.original),
306
+ sortFn: (rowA, rowB, columnId) => compareCellValues(
307
+ rowA.getValue(columnId),
308
+ rowB.getValue(columnId),
309
+ ),
310
+ meta,
311
+ };
312
+ });
118
313
  if (actions) {
119
314
  definitions.push({
120
315
  id: '__actions',
@@ -140,6 +335,15 @@ function widthStyle(width: string | undefined): string {
140
335
  return width === undefined ? '' : `width: ${width};`;
141
336
  }
142
337
 
338
+ function ariaSort(
339
+ direction: 'asc' | 'desc' | false,
340
+ sortable: boolean,
341
+ ): 'ascending' | 'descending' | 'none' | undefined {
342
+ if (direction === 'asc') return 'ascending';
343
+ if (direction === 'desc') return 'descending';
344
+ return sortable ? 'none' : undefined;
345
+ }
346
+
143
347
  /**
144
348
  * Flowdular's visual table over the official TanStack Table v9 adapter for
145
349
  * Octane. Screens keep the small Flowdular contract while TanStack owns the
@@ -152,14 +356,147 @@ export function Table<Row extends RowData>(props: TableProps<Row>) @{
152
356
  props.actionsLabel ?? '',
153
357
  props.actionsWidth ?? '160px',
154
358
  );
359
+ const sortable = props.sorting === true;
360
+ const [ownSorting, setOwnSorting] = useState<readonly TableSort[]>([]);
361
+ const sorts = props.sortingState ?? ownSorting;
362
+ const signature = sortingSignature(sorts);
363
+ /* The engine compares external state slices by reference, so a fresh array
364
+ on every render would write its atom mid-render. Rebuild only on a real
365
+ sort change. */
366
+ const engineSorting = useMemo(
367
+ () => sorts.map((sort) => ({ id: sort.key, desc: sort.desc })),
368
+ [signature],
369
+ );
370
+ const selection = props.selection;
371
+ const selectedKeys = selection?.selectedKeys;
372
+ /* Same reference rule as sorting: the engine's selection slice is rebuilt
373
+ only when the set of keys changed, never for a Set the screen recreated. */
374
+ const selectionSignature =
375
+ selectedKeys === undefined ? '' : [...selectedKeys].sort().join('\n');
376
+ const rowSelection = useMemo<RowSelectionState>(() => {
377
+ const state: Record<string, true> = {};
378
+ if (selectedKeys) for (const key of selectedKeys) state[key] = true;
379
+ return state;
380
+ }, [selectionSignature]);
381
+ const pagination = props.pagination;
382
+ /* Server mode: the module sorted, narrowed and cut the page in SQL, so every
383
+ stage here stays inert and the header and pager only report. */
384
+ const server = props.mode === 'server';
155
385
  const table = useTable({
156
386
  features: FEATURES,
157
387
  data: props.rows,
158
388
  columns,
159
389
  getRowId: (row) => props.rowKey(row),
390
+ enableSorting: sortable,
391
+ manualSorting: server || !sortable,
392
+ manualFiltering: server || props.globalFilter === undefined,
393
+ /* The engine filters and sorts; the page window is taken below. The row
394
+ count to clamp a page index against exists only once the engine has
395
+ filtered, so a page slice fed back into the engine would have to be
396
+ computed before the number it depends on. */
397
+ manualPagination: true,
398
+ getColumnCanGlobalFilter: () => true,
399
+ enableRowSelection: selection === undefined
400
+ ? false
401
+ : (row) => selection.selectable?.(row.original) ?? true,
402
+ state: {
403
+ ...(sortable ? { sorting: engineSorting } : {}),
404
+ ...(props.globalFilter === undefined
405
+ ? {}
406
+ : { globalFilter: props.globalFilter }),
407
+ ...(selection === undefined ? {} : { rowSelection }),
408
+ },
409
+ ...(sortable
410
+ ? {
411
+ onSortingChange: (updater) => {
412
+ const next =
413
+ typeof updater === 'function' ? updater(engineSorting) : updater;
414
+ const mapped = next.map(
415
+ (sort) => ({
416
+ key: sort.id,
417
+ desc: sort.desc,
418
+ }),
419
+ );
420
+ if (props.sortingState === undefined) setOwnSorting(mapped);
421
+ props.onSortingChange?.(mapped);
422
+ },
423
+ }
424
+ : {}),
160
425
  });
161
- const empty = props.filtered && props.emptyFiltered || props.empty;
162
- const span = columns.length;
426
+ const pagedRows = table.getRowModel().rows;
427
+ /* A keyset page was never counted, so there is no total to clamp against and
428
+ `hasMore` is all the table knows about what is behind it. */
429
+ const total = server
430
+ ? pagination?.totalRows
431
+ : pagination?.totalRows ?? pagedRows.length;
432
+ const range =
433
+ pagination !== undefined && total !== undefined
434
+ ? pageRange(total, pagination.pageSize, pagination.pageIndex)
435
+ : undefined;
436
+ /* The table owns no page of its own: it clamps for this render and tells the
437
+ screen once the render commits, so a row set that shrinks under the reader
438
+ never updates the screen's state from inside the render. */
439
+ useEffect(() => {
440
+ if (!pagination) return;
441
+ if (range) {
442
+ if (range.pageIndex !== pagination.pageIndex) pagination.onPageChange(
443
+ range.pageIndex,
444
+ );
445
+ return;
446
+ }
447
+ /* An empty keyset page with nothing behind it is the only proof the
448
+ reader walked off the end of the set. A page still waiting on its rows is
449
+ not that proof: it is empty because the request is in flight. */
450
+ if (
451
+ props.status !== 'loading' && pagination.pageIndex > 0 &&
452
+ pagedRows.length === 0 &&
453
+ pagination.hasMore !== true
454
+ ) pagination.onPageChange(pagination.pageIndex - 1);
455
+ }, [range?.pageIndex, pagination?.pageIndex, pagedRows.length, props.status]);
456
+ /* The module paginated in SQL, so `rows` is already the page on screen. */
457
+ const prePaged = server || pagination?.totalRows !== undefined;
458
+ /* `from` and `to` are the same one-based positions the pager reads, so the
459
+ rows on screen and the reading under them can never disagree. */
460
+ const windowRows =
461
+ range !== undefined && !prePaged
462
+ ? pagedRows.slice(Math.max(0, range.from - 1), range.to)
463
+ : pagedRows;
464
+ const narrowed = props.filtered === true || (props.globalFilter ?? '') !== '';
465
+ const empty = narrowed && props.emptyFiltered || props.empty;
466
+ const span = columns.length + (selection === undefined ? 0 : 1);
467
+ const change = (keys: readonly string[], checked: boolean) => {
468
+ if (!selection) return;
469
+ const next = new Set(selection.selectedKeys);
470
+ for (const key of keys) {
471
+ if (checked) next.add(key);
472
+ else next.delete(key);
473
+ }
474
+ selection.onSelectionChange(next);
475
+ };
476
+ /* The header checkbox covers exactly the rows on screen: in server mode that
477
+ is the page the module gave, never the whole set behind it. */
478
+ const selectableRows =
479
+ selection === undefined
480
+ ? []
481
+ : windowRows.filter((row) => row.getCanSelect());
482
+ const checkedOnScreen = selectableRows.filter(
483
+ (row) => row.getIsSelected(),
484
+ ).length;
485
+ const allChecked =
486
+ selectableRows.length > 0 && checkedOnScreen === selectableRows.length;
487
+ const toggleAll = () => change(
488
+ selectableRows.map((row) => row.id),
489
+ !allChecked,
490
+ );
491
+ const selectedCount = selectedKeys?.size ?? 0;
492
+ const summarize = props.selectionSummary ?? defaultSelectionSummary;
493
+ const summary = summarize(selectedCount);
494
+ const bulk = (props.bulkActions ?? []).map(
495
+ (action): TableAction => ({
496
+ ...action,
497
+ onSelect: () => action.onSelect([...(selectedKeys ?? [])]),
498
+ }),
499
+ );
163
500
  /* TanStack row/header/cell objects are live compatibility objects. Render
164
501
  them here and carry immutable values into keyed TSRX loops. */
165
502
  const headerGroups = table.getHeaderGroups().map(
@@ -167,22 +504,33 @@ export function Table<Row extends RowData>(props: TableProps<Row>) @{
167
504
  key: group.id,
168
505
  headers: group.headers.map((header) => {
169
506
  const meta = header.column.columnDef.meta as FlowdularColumnMeta | undefined;
507
+ const canSort = header.column.getCanSort();
508
+ const direction =
509
+ canSort ? header.column.getIsSorted() : false;
170
510
  return {
171
511
  key: header.id,
172
512
  content: header.isPlaceholder
173
513
  ? null
174
514
  : flexRender(header.column.columnDef.header, header.getContext()),
175
515
  meta,
516
+ canSort,
517
+ direction,
518
+ sort: ariaSort(direction, canSort),
519
+ onToggle: () => header.column.toggleSorting(),
176
520
  };
177
521
  }),
178
522
  }),
179
523
  );
180
- const renderedRows = table.getRowModel().rows.map(
524
+ const renderedRows = windowRows.map(
181
525
  (row) => ({
182
526
  key: row.id,
183
527
  selected: props.selectedKey === row.id,
184
528
  clickable: props.onSelect !== undefined,
185
529
  onClick: () => props.onSelect?.(row.original),
530
+ selectable: row.getCanSelect(),
531
+ checked: row.getIsSelected(),
532
+ checkLabel: selection?.rowLabel(row.original) ?? '',
533
+ onCheck: (checked: boolean) => change([row.id], checked),
186
534
  cells: row.getAllCells().map(
187
535
  (cell) => ({
188
536
  key: cell.id,
@@ -199,69 +547,138 @@ export function Table<Row extends RowData>(props: TableProps<Row>) @{
199
547
  }),
200
548
  );
201
549
 
202
- <div class="ui-table-wrap">
203
- <table class="ui-table" aria-label={props.caption ?? ''}>
204
- <colgroup>
205
- @for (const column of leafColumns; key column.key) {
206
- <col
207
- class={column.meta?.actions && 'ui-table__actions-column'}
208
- style={widthStyle(column.meta?.width)}
209
- />
210
- }
211
- </colgroup>
212
- <thead>
213
- @for (const group of headerGroups; key group.key) {
214
- <tr>
215
- @for (const header of group.headers; key header.key) {
216
- <th
217
- class={[
218
- header.meta?.numeric && 'num',
219
- header.meta?.actions && 'ui-table__actions',
220
- ]}
221
- style={widthStyle(header.meta?.width)}
222
- aria-label={header.meta?.actions
223
- ? header.meta.actionsLabel ?? ''
224
- : ''}
225
- >{header.content}</th>
226
- }
227
- </tr>
228
- }
229
- </thead>
230
- <tbody>
231
- @if (props.status === 'loading') {
232
- <tr class="ui-table__placeholder">
233
- <td class="ui-table__empty" colspan={span}>
234
- {props.loadingLabel ?? 'Loading…'}
235
- </td>
236
- </tr>
237
- } @else if (renderedRows.length === 0) {
238
- <tr class="ui-table__placeholder">
239
- <td colspan={span}>
240
- <EmptyState
241
- icon={empty.icon}
242
- title={empty.title}
243
- code={empty.code ?? ''}
244
- >{empty.hint}</EmptyState>
245
- </td>
246
- </tr>
247
- } @else {
248
- @for (const row of renderedRows; key row.key) {
249
- <tr
250
- class={rowClass(row.clickable, row.selected)}
251
- onClick={row.onClick}
252
- >
253
- @for (const cell of row.cells; key cell.key) {
254
- <td
550
+ <>
551
+ @if (selection) {
552
+ <div class="ui-visually-hidden" aria-live="polite">{summary}</div>
553
+ }
554
+ @if (selection && selectedCount > 0) {
555
+ <div class="ui-table__bulk">
556
+ <span class="ui-table__bulk-count">{summary}</span>
557
+ <ActionButtons actions={bulk} />
558
+ <Button
559
+ size="sm"
560
+ variant="ghost"
561
+ onClick={() => selection.onSelectionChange(new Set())}
562
+ >
563
+ {selection.clearLabel ?? 'Clear selection'}
564
+ </Button>
565
+ </div>
566
+ }
567
+ <div class="ui-table-wrap">
568
+ <table class="ui-table" aria-label={props.caption ?? ''}>
569
+ <colgroup>
570
+ @if (selection) {
571
+ <col
572
+ class="ui-table__select-column"
573
+ style={widthStyle(SELECT_WIDTH)}
574
+ />
575
+ }
576
+ @for (const column of leafColumns; key column.key) {
577
+ <col
578
+ class={column.meta?.actions && 'ui-table__actions-column'}
579
+ style={widthStyle(column.meta?.width)}
580
+ />
581
+ }
582
+ </colgroup>
583
+ <thead>
584
+ @for (const group of headerGroups; key group.key) {
585
+ <tr>
586
+ @if (selection) {
587
+ <th class="ui-table__select" style={widthStyle(SELECT_WIDTH)}>
588
+ <SelectAll
589
+ label={selection.label}
590
+ checked={allChecked}
591
+ mixed={checkedOnScreen > 0 && !allChecked}
592
+ disabled={selectableRows.length === 0}
593
+ onToggle={toggleAll}
594
+ />
595
+ </th>
596
+ }
597
+ @for (const header of group.headers; key header.key) {
598
+ <th
255
599
  class={[
256
- cell.meta?.numeric && 'num',
257
- cell.meta?.actions && 'ui-table__actions',
600
+ header.meta?.numeric && 'num',
601
+ header.meta?.actions && 'ui-table__actions',
258
602
  ]}
259
- >{cell.content}</td>
603
+ style={widthStyle(header.meta?.width)}
604
+ aria-label={header.meta?.actions
605
+ ? header.meta.actionsLabel ?? ''
606
+ : ''}
607
+ aria-sort={header.sort}
608
+ >
609
+ {header.canSort
610
+ ? <button
611
+ class="ui-table__sort"
612
+ type="button"
613
+ onClick={header.onToggle}
614
+ >
615
+ {header.content}
616
+ <SortIndicator direction={header.direction} />
617
+ </button>
618
+ : header.content}
619
+ </th>
260
620
  }
261
621
  </tr>
262
622
  }
263
- }
264
- </tbody>
265
- </table>
266
- </div>
623
+ </thead>
624
+ <tbody>
625
+ @if (props.status === 'loading') {
626
+ <tr class="ui-table__placeholder">
627
+ <td class="ui-table__empty" colspan={span}>
628
+ {props.loadingLabel ?? 'Loading…'}
629
+ </td>
630
+ </tr>
631
+ } @else if (renderedRows.length === 0) {
632
+ <tr class="ui-table__placeholder">
633
+ <td colspan={span}>
634
+ <EmptyState
635
+ icon={empty.icon}
636
+ title={empty.title}
637
+ code={empty.code ?? ''}
638
+ >{empty.hint}</EmptyState>
639
+ </td>
640
+ </tr>
641
+ } @else {
642
+ @for (const row of renderedRows; key row.key) {
643
+ <tr
644
+ class={rowClass(row.clickable, row.selected)}
645
+ aria-selected={selection === undefined
646
+ ? undefined
647
+ : row.checked
648
+ ? 'true'
649
+ : 'false'}
650
+ onClick={row.onClick}
651
+ >
652
+ @if (selection) {
653
+ <td class="ui-table__select" onClick={stopClick}>
654
+ @if (row.selectable) {
655
+ <input
656
+ type="checkbox"
657
+ aria-label={row.checkLabel}
658
+ checked={row.checked}
659
+ onChange={(event: Event) => row.onCheck(
660
+ (event.currentTarget as HTMLInputElement).checked,
661
+ )}
662
+ onKeyDown={enterToggles(
663
+ () => row.onCheck(!row.checked),
664
+ )}
665
+ />
666
+ }
667
+ </td>
668
+ }
669
+ @for (const cell of row.cells; key cell.key) {
670
+ <td
671
+ class={[
672
+ cell.meta?.numeric && 'num',
673
+ cell.meta?.actions && 'ui-table__actions',
674
+ ]}
675
+ >{cell.content}</td>
676
+ }
677
+ </tr>
678
+ }
679
+ }
680
+ </tbody>
681
+ </table>
682
+ </div>
683
+ </>
267
684
  }