@elevasis/core 0.22.0 → 0.24.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 (244) hide show
  1. package/dist/index.d.ts +3214 -2501
  2. package/dist/index.js +3112 -1222
  3. package/dist/knowledge/index.d.ts +1108 -1264
  4. package/dist/knowledge/index.js +112 -9
  5. package/dist/organization-model/index.d.ts +3214 -2501
  6. package/dist/organization-model/index.js +3112 -1222
  7. package/dist/test-utils/index.d.ts +985 -1103
  8. package/dist/test-utils/index.js +2464 -1165
  9. package/package.json +5 -5
  10. package/src/README.md +14 -14
  11. package/src/__tests__/publish.test.ts +24 -24
  12. package/src/__tests__/template-core-compatibility.test.ts +9 -80
  13. package/src/_gen/__tests__/__snapshots__/contracts.md.snap +2389 -2121
  14. package/src/_gen/__tests__/scaffold-contracts.test.ts +30 -30
  15. package/src/auth/multi-tenancy/credentials/__tests__/encryption.test.ts +217 -217
  16. package/src/auth/multi-tenancy/credentials/server/encryption.ts +69 -69
  17. package/src/auth/multi-tenancy/credentials/server/kek-loader.ts +37 -37
  18. package/src/auth/multi-tenancy/index.ts +26 -26
  19. package/src/auth/multi-tenancy/invitations/api-schemas.ts +104 -104
  20. package/src/auth/multi-tenancy/memberships/api-schemas.ts +143 -143
  21. package/src/auth/multi-tenancy/memberships/index.ts +26 -26
  22. package/src/auth/multi-tenancy/memberships/membership.ts +130 -130
  23. package/src/auth/multi-tenancy/organizations/__tests__/api-schemas.test.ts +194 -194
  24. package/src/auth/multi-tenancy/organizations/api-schemas.ts +136 -136
  25. package/src/auth/multi-tenancy/permissions.test.ts +42 -42
  26. package/src/auth/multi-tenancy/permissions.ts +123 -123
  27. package/src/auth/multi-tenancy/role-management/api-schemas.ts +78 -78
  28. package/src/auth/multi-tenancy/role-management/index.ts +16 -16
  29. package/src/auth/multi-tenancy/theme-presets.ts +45 -45
  30. package/src/auth/multi-tenancy/types.ts +57 -57
  31. package/src/auth/multi-tenancy/users/api-schemas.ts +165 -165
  32. package/src/business/README.md +2 -2
  33. package/src/business/acquisition/activity-events.test.ts +250 -250
  34. package/src/business/acquisition/activity-events.ts +93 -93
  35. package/src/business/acquisition/api-schemas.test.ts +1883 -1843
  36. package/src/business/acquisition/api-schemas.ts +1493 -1500
  37. package/src/business/acquisition/build-templates.test.ts +240 -240
  38. package/src/business/acquisition/build-templates.ts +83 -41
  39. package/src/business/acquisition/crm-next-action.test.ts +262 -262
  40. package/src/business/acquisition/crm-next-action.ts +220 -220
  41. package/src/business/acquisition/crm-priority.test.ts +216 -216
  42. package/src/business/acquisition/crm-priority.ts +349 -349
  43. package/src/business/acquisition/crm-state-actions.test.ts +153 -151
  44. package/src/business/acquisition/deal-ownership.test.ts +351 -351
  45. package/src/business/acquisition/deal-ownership.ts +120 -120
  46. package/src/business/acquisition/derive-actions.test.ts +129 -104
  47. package/src/business/acquisition/derive-actions.ts +74 -84
  48. package/src/business/acquisition/index.ts +171 -170
  49. package/src/business/acquisition/ontology-validation.ts +309 -0
  50. package/src/business/acquisition/stateful.ts +30 -30
  51. package/src/business/acquisition/types.ts +396 -392
  52. package/src/business/clients/api-schemas.test.ts +115 -115
  53. package/src/business/clients/api-schemas.ts +158 -158
  54. package/src/business/clients/index.ts +1 -1
  55. package/src/business/crm/api-schemas.ts +40 -40
  56. package/src/business/crm/index.ts +1 -1
  57. package/src/business/deals/api-schemas.ts +87 -87
  58. package/src/business/deals/index.ts +1 -1
  59. package/src/business/index.ts +5 -5
  60. package/src/business/projects/types.ts +144 -144
  61. package/src/commands/queue/types/task.ts +15 -15
  62. package/src/execution/core/runner-types.ts +61 -61
  63. package/src/execution/core/sse-executions.ts +7 -7
  64. package/src/execution/engine/__tests__/fixtures/test-agents.ts +10 -10
  65. package/src/execution/engine/agent/core/__tests__/agent.test.ts +16 -16
  66. package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +4 -4
  67. package/src/execution/engine/agent/core/types.ts +25 -25
  68. package/src/execution/engine/agent/index.ts +6 -6
  69. package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +24 -24
  70. package/src/execution/engine/index.ts +443 -443
  71. package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +298 -298
  72. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.test.ts +55 -55
  73. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +107 -107
  74. package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.test.ts +48 -48
  75. package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.ts +99 -99
  76. package/src/execution/engine/tools/integration/server/adapters/apollo/index.ts +1 -1
  77. package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +363 -363
  78. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +162 -162
  79. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +316 -316
  80. package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.test.ts +18 -18
  81. package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.ts +194 -194
  82. package/src/execution/engine/tools/integration/server/adapters/clickup/index.ts +7 -7
  83. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +204 -204
  84. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +105 -105
  85. package/src/execution/engine/tools/integration/server/adapters/google-calendar/google-calendar-adapter.ts +428 -428
  86. package/src/execution/engine/tools/integration/server/adapters/google-calendar/index.ts +2 -2
  87. package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
  88. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1474 -1474
  89. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +103 -103
  90. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.test.ts +88 -88
  91. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +141 -141
  92. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +76 -76
  93. package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-tools.ts +182 -182
  94. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +310 -310
  95. package/src/execution/engine/tools/integration/service.test.ts +239 -239
  96. package/src/execution/engine/tools/integration/service.ts +172 -172
  97. package/src/execution/engine/tools/integration/tool.ts +255 -255
  98. package/src/execution/engine/tools/lead-service-types.ts +1005 -1005
  99. package/src/execution/engine/tools/messages.ts +43 -43
  100. package/src/execution/engine/tools/platform/acquisition/company-tools.ts +7 -7
  101. package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +6 -6
  102. package/src/execution/engine/tools/platform/acquisition/list-tools.ts +6 -6
  103. package/src/execution/engine/tools/platform/acquisition/types.ts +280 -280
  104. package/src/execution/engine/tools/platform/email/types.ts +97 -97
  105. package/src/execution/engine/tools/registry.ts +704 -704
  106. package/src/execution/engine/tools/tool-maps.ts +831 -831
  107. package/src/execution/engine/tools/types.ts +234 -234
  108. package/src/execution/engine/workflow/types.ts +202 -202
  109. package/src/execution/external/__tests__/api-schemas.test.ts +127 -127
  110. package/src/execution/external/api-schemas.ts +40 -40
  111. package/src/execution/external/index.ts +1 -1
  112. package/src/index.ts +18 -18
  113. package/src/integrations/credentials/__tests__/api-schemas.test.ts +420 -420
  114. package/src/integrations/credentials/api-schemas.ts +146 -146
  115. package/src/integrations/credentials/schemas.ts +200 -200
  116. package/src/integrations/oauth/__tests__/provider-registry.test.ts +7 -7
  117. package/src/integrations/oauth/provider-registry.ts +74 -74
  118. package/src/integrations/oauth/server/credentials.ts +43 -43
  119. package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +327 -327
  120. package/src/integrations/webhook-endpoints/api-schemas.ts +103 -103
  121. package/src/integrations/webhook-endpoints/types.ts +58 -58
  122. package/src/knowledge/README.md +33 -32
  123. package/src/knowledge/__tests__/queries.test.ts +633 -541
  124. package/src/knowledge/format.ts +100 -99
  125. package/src/knowledge/index.ts +5 -5
  126. package/src/knowledge/published.ts +5 -5
  127. package/src/knowledge/queries.ts +274 -222
  128. package/src/operations/activities/api-schemas.ts +80 -80
  129. package/src/operations/activities/types.ts +64 -64
  130. package/src/organization-model/README.md +149 -109
  131. package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -0
  132. package/src/organization-model/__tests__/defaults.test.ts +168 -194
  133. package/src/organization-model/__tests__/domains/actions.test.ts +78 -0
  134. package/src/organization-model/__tests__/domains/customers.test.ts +48 -44
  135. package/src/organization-model/__tests__/domains/entities.test.ts +56 -0
  136. package/src/organization-model/__tests__/domains/goals.test.ts +110 -96
  137. package/src/organization-model/__tests__/domains/identity.test.ts +4 -3
  138. package/src/organization-model/__tests__/domains/navigation.test.ts +222 -166
  139. package/src/organization-model/__tests__/domains/offerings.test.ts +83 -88
  140. package/src/organization-model/__tests__/domains/policies.test.ts +323 -0
  141. package/src/organization-model/__tests__/domains/resource-mappings.test.ts +30 -30
  142. package/src/organization-model/__tests__/domains/resources.test.ts +396 -175
  143. package/src/organization-model/__tests__/domains/roles.test.ts +463 -402
  144. package/src/organization-model/__tests__/domains/statuses.test.ts +13 -10
  145. package/src/organization-model/__tests__/domains/systems.test.ts +209 -193
  146. package/src/organization-model/__tests__/flatten-additive-merge.test.ts +362 -0
  147. package/src/organization-model/__tests__/foundation.test.ts +47 -75
  148. package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -0
  149. package/src/organization-model/__tests__/graph.test.ts +1336 -149
  150. package/src/organization-model/__tests__/icons.test.ts +10 -1
  151. package/src/organization-model/__tests__/knowledge.test.ts +418 -61
  152. package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -0
  153. package/src/organization-model/__tests__/migration-helpers.test.ts +591 -0
  154. package/src/organization-model/__tests__/prospecting-ssot.test.ts +103 -94
  155. package/src/organization-model/__tests__/recursive-system-schema.test.ts +549 -0
  156. package/src/organization-model/__tests__/resolve.test.ts +303 -42
  157. package/src/organization-model/__tests__/schema.test.ts +863 -153
  158. package/src/organization-model/__tests__/surface-projection.test.ts +284 -174
  159. package/src/organization-model/catalogs/lead-gen.ts +144 -0
  160. package/src/organization-model/content-kinds/config.ts +36 -0
  161. package/src/organization-model/content-kinds/index.ts +78 -0
  162. package/src/organization-model/content-kinds/pipeline.ts +68 -0
  163. package/src/organization-model/content-kinds/registry.ts +44 -0
  164. package/src/organization-model/content-kinds/status.ts +71 -0
  165. package/src/organization-model/content-kinds/template.ts +83 -0
  166. package/src/organization-model/content-kinds/types.ts +117 -0
  167. package/src/organization-model/contracts.ts +27 -17
  168. package/src/organization-model/defaults.ts +489 -107
  169. package/src/organization-model/domains/actions.ts +333 -0
  170. package/src/organization-model/domains/customers.ts +10 -7
  171. package/src/organization-model/domains/entities.ts +144 -0
  172. package/src/organization-model/domains/goals.ts +9 -6
  173. package/src/organization-model/domains/knowledge.ts +128 -54
  174. package/src/organization-model/domains/navigation.ts +139 -416
  175. package/src/organization-model/domains/offerings.ts +15 -10
  176. package/src/organization-model/domains/policies.ts +102 -0
  177. package/src/organization-model/domains/projects.ts +6 -40
  178. package/src/organization-model/domains/prospecting.ts +395 -514
  179. package/src/organization-model/domains/resources.ts +173 -81
  180. package/src/organization-model/domains/roles.ts +96 -93
  181. package/src/organization-model/domains/sales.test.ts +218 -218
  182. package/src/organization-model/domains/sales.ts +380 -589
  183. package/src/organization-model/domains/shared.ts +8 -8
  184. package/src/organization-model/domains/statuses.ts +298 -89
  185. package/src/organization-model/domains/systems.ts +240 -38
  186. package/src/organization-model/foundation.ts +35 -48
  187. package/src/organization-model/graph/build.ts +1035 -279
  188. package/src/organization-model/graph/index.ts +4 -4
  189. package/src/organization-model/graph/link.ts +10 -10
  190. package/src/organization-model/graph/schema.ts +77 -56
  191. package/src/organization-model/graph/types.ts +75 -56
  192. package/src/organization-model/helpers.ts +312 -59
  193. package/src/organization-model/icons.ts +78 -66
  194. package/src/organization-model/index.ts +129 -16
  195. package/src/organization-model/migration-helpers.ts +252 -0
  196. package/src/organization-model/ontology.ts +661 -0
  197. package/src/organization-model/organization-graph.mdx +110 -89
  198. package/src/organization-model/organization-model.mdx +226 -171
  199. package/src/organization-model/published.ts +295 -139
  200. package/src/organization-model/resolve.ts +139 -21
  201. package/src/organization-model/schema.ts +841 -301
  202. package/src/organization-model/surface-projection.ts +212 -218
  203. package/src/organization-model/types.ts +181 -90
  204. package/src/platform/api/types.ts +38 -38
  205. package/src/platform/constants/versions.ts +3 -3
  206. package/src/platform/index.ts +23 -23
  207. package/src/platform/registry/__tests__/command-view.test.ts +5 -7
  208. package/src/platform/registry/__tests__/resource-link.test.ts +35 -30
  209. package/src/platform/registry/__tests__/resource-registry.integration.test.ts +17 -32
  210. package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -0
  211. package/src/platform/registry/__tests__/resource-registry.test.ts +2053 -2051
  212. package/src/platform/registry/__tests__/validation.test.ts +1347 -1343
  213. package/src/platform/registry/command-view.ts +10 -10
  214. package/src/platform/registry/index.ts +103 -103
  215. package/src/platform/registry/resource-link.ts +32 -32
  216. package/src/platform/registry/resource-registry.ts +890 -878
  217. package/src/platform/registry/serialization.ts +295 -295
  218. package/src/platform/registry/serialized-types.ts +166 -166
  219. package/src/platform/registry/stats-types.ts +68 -68
  220. package/src/platform/registry/types.ts +425 -425
  221. package/src/platform/registry/validation.ts +745 -743
  222. package/src/platform/utils/__tests__/validation.test.ts +1084 -1084
  223. package/src/platform/utils/validation.ts +425 -425
  224. package/src/projects/api-schemas.test.ts +39 -39
  225. package/src/projects/api-schemas.ts +291 -291
  226. package/src/reference/_generated/contracts.md +2389 -2121
  227. package/src/reference/glossary.md +76 -76
  228. package/src/scaffold-registry/__tests__/index.test.ts +206 -206
  229. package/src/scaffold-registry/__tests__/schema.test.ts +166 -166
  230. package/src/scaffold-registry/index.ts +392 -392
  231. package/src/scaffold-registry/schema.ts +243 -243
  232. package/src/server.ts +289 -289
  233. package/src/supabase/database.types.ts +3153 -3093
  234. package/src/test-utils/README.md +37 -37
  235. package/src/test-utils/entities.ts +108 -108
  236. package/src/test-utils/fixtures/memberships.ts +82 -82
  237. package/src/test-utils/index.ts +12 -12
  238. package/src/test-utils/organization-model.ts +65 -65
  239. package/src/test-utils/published.ts +6 -6
  240. package/src/test-utils/rls/RLSTestContext.ts +588 -588
  241. package/src/test-utils/test-utils.test.ts +44 -49
  242. package/src/organization-model/__tests__/domains/operations.test.ts +0 -203
  243. package/src/organization-model/domains/features.ts +0 -31
  244. package/src/organization-model/domains/operations.ts +0 -85
@@ -1,37 +1,37 @@
1
- import { getSupabaseClient } from '../../../../supabase/server/client'
2
- import { setKek, CURRENT_KEY_ID } from './encryption'
3
-
4
- let loaded = false
5
-
6
- /**
7
- * Loads the platform credential KEK from Supabase Vault and registers it under
8
- * `CURRENT_KEY_ID` ('platform-v1').
9
- *
10
- * Idempotent: subsequent calls are no-ops.
11
- *
12
- * Fails fast on missing / malformed Vault KEK so misconfigured deploys do not
13
- * silently start without a usable encryption key.
14
- */
15
- export async function loadCredentialKEKs(): Promise<void> {
16
- if (loaded) return
17
-
18
- const supabase = await getSupabaseClient()
19
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- RPC isn't in generated types yet (run `supabase gen types` post-merge)
20
- const { data, error } = await (supabase.rpc as any)('get_platform_credential_kek')
21
- if (error) {
22
- throw new Error(
23
- `Failed to load platform credential KEK from Vault: ${error.message}. ` +
24
- `Did you run provision-credential-kek.sql against this environment?`
25
- )
26
- }
27
- if (typeof data !== 'string' || data.length === 0) {
28
- throw new Error('Vault returned null/empty platform credential KEK')
29
- }
30
- const vaultKek = Buffer.from(data, 'hex')
31
- if (vaultKek.length !== 32) {
32
- throw new Error(`Vault KEK is ${vaultKek.length} bytes, expected 32`)
33
- }
34
- setKek(CURRENT_KEY_ID, vaultKek)
35
-
36
- loaded = true
37
- }
1
+ import { getSupabaseClient } from '../../../../supabase/server/client'
2
+ import { setKek, CURRENT_KEY_ID } from './encryption'
3
+
4
+ let loaded = false
5
+
6
+ /**
7
+ * Loads the platform credential KEK from Supabase Vault and registers it under
8
+ * `CURRENT_KEY_ID` ('platform-v1').
9
+ *
10
+ * Idempotent: subsequent calls are no-ops.
11
+ *
12
+ * Fails fast on missing / malformed Vault KEK so misconfigured deploys do not
13
+ * silently start without a usable encryption key.
14
+ */
15
+ export async function loadCredentialKEKs(): Promise<void> {
16
+ if (loaded) return
17
+
18
+ const supabase = await getSupabaseClient()
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- RPC isn't in generated types yet (run `supabase gen types` post-merge)
20
+ const { data, error } = await (supabase.rpc as any)('get_platform_credential_kek')
21
+ if (error) {
22
+ throw new Error(
23
+ `Failed to load platform credential KEK from Vault: ${error.message}. ` +
24
+ `Did you run provision-credential-kek.sql against this environment?`
25
+ )
26
+ }
27
+ if (typeof data !== 'string' || data.length === 0) {
28
+ throw new Error('Vault returned null/empty platform credential KEK')
29
+ }
30
+ const vaultKek = Buffer.from(data, 'hex')
31
+ if (vaultKek.length !== 32) {
32
+ throw new Error(`Vault KEK is ${vaultKek.length} bytes, expected 32`)
33
+ }
34
+ setKek(CURRENT_KEY_ID, vaultKek)
35
+
36
+ loaded = true
37
+ }
@@ -1,26 +1,26 @@
1
- // Theme preset SSOT (const tuple + derived union + Zod enum)
2
- export * from './theme-presets'
3
-
4
- // Config types
5
- export * from './types'
6
-
7
- // Permission catalog (canonical PERMISSIONS constant + types)
8
- export * from './permissions'
9
-
10
- // Role management schemas
11
- export * from './role-management/index'
12
-
13
- // Organization types
14
- export * from './organizations/index'
15
-
16
- // User types
17
- export * from './users/index'
18
-
19
- // Membership types
20
- export * from './memberships/index'
21
-
22
- // Invitation types
23
- export * from './invitations/index'
24
-
25
- // Credentials types
26
- export * from './credentials/index'
1
+ // Theme preset SSOT (const tuple + derived union + Zod enum)
2
+ export * from './theme-presets'
3
+
4
+ // Config types
5
+ export * from './types'
6
+
7
+ // Permission catalog (canonical PERMISSIONS constant + types)
8
+ export * from './permissions'
9
+
10
+ // Role management schemas
11
+ export * from './role-management/index'
12
+
13
+ // Organization types
14
+ export * from './organizations/index'
15
+
16
+ // User types
17
+ export * from './users/index'
18
+
19
+ // Membership types
20
+ export * from './memberships/index'
21
+
22
+ // Invitation types
23
+ export * from './invitations/index'
24
+
25
+ // Credentials types
26
+ export * from './credentials/index'
@@ -1,104 +1,104 @@
1
- /**
2
- * Invitations Domain - Zod Validation Schemas
3
- *
4
- * Validation schemas for invitation management endpoints.
5
- * Includes request bodies, query params, and path params.
6
- *
7
- * Security:
8
- * - All schemas use .strict() to prevent mass assignment attacks
9
- * - Email validation prevents header injection
10
- * - Role enum validation prevents privilege escalation
11
- * - organizationId from JWT (not accepted in body for protected routes)
12
- */
13
-
14
- import { z } from 'zod'
15
- import { EmailSchema } from '../../../platform/utils/validation'
16
- import { MembershipRoleSchema } from '../memberships/api-schemas'
17
-
18
- // ============================================================================
19
- // Path Parameters
20
- // ============================================================================
21
-
22
- /**
23
- * Validate invitation ID in URL path
24
- * Used by: GET/DELETE /invitations/:id
25
- */
26
- export const InvitationIdParamSchema = z
27
- .object({
28
- id: z.string().min(1) // WorkOS invitation IDs
29
- })
30
- .strict()
31
-
32
- // ============================================================================
33
- // Request Bodies
34
- // ============================================================================
35
-
36
- /**
37
- * Send new invitation
38
- * POST /invitations
39
- *
40
- * Security:
41
- * - Email format validated (prevents header injection)
42
- * - roleSlug validated as non-empty slug; service layer checks against org_rol_definitions
43
- * - expiresInDays bounded (1-90 days)
44
- * - organizationId NOT in body (from JWT via requireOrganization middleware)
45
- */
46
- export const SendInvitationSchema = z
47
- .object({
48
- email: EmailSchema,
49
- organizationId: z.string().optional(), // For WorkOS API - but typically from JWT
50
- roleSlug: MembershipRoleSchema.default('member'),
51
- expiresInDays: z.number().int().min(1).max(90).default(7)
52
- })
53
- .strict()
54
-
55
- /**
56
- * Accept invitation by token
57
- * POST /invitations/accept
58
- *
59
- * Security:
60
- * - Token validated (non-empty string)
61
- */
62
- export const AcceptInvitationSchema = z
63
- .object({
64
- invitation_token: z.string().min(1, 'Invitation token is required')
65
- })
66
- .strict()
67
-
68
- // ============================================================================
69
- // Query Parameters
70
- // ============================================================================
71
-
72
- /**
73
- * List invitations with filters
74
- * GET /invitations
75
- *
76
- * Filters:
77
- * - organizationId: Filter by organization
78
- * - email: Filter by email
79
- *
80
- * Security:
81
- * - Requires organizationId or userId filter
82
- * - Email validated
83
- */
84
- export const ListInvitationsQuerySchema = z
85
- .object({
86
- organizationId: z.string().optional(),
87
- userId: z.string().optional(),
88
- email: EmailSchema.optional(),
89
- limit: z.coerce.number().int().min(1).max(100).optional(),
90
- before: z.string().optional(), // WorkOS pagination cursor
91
- after: z.string().optional() // WorkOS pagination cursor
92
- })
93
- .strict()
94
- .refine((data) => data.organizationId || data.userId, { message: 'Either organizationId or userId must be provided' })
95
-
96
- // ============================================================================
97
- // TypeScript Type Exports
98
- // ============================================================================
99
-
100
- // Export inferred types for use in route handlers
101
- export type SendInvitationInput = z.infer<typeof SendInvitationSchema>
102
- export type AcceptInvitationInput = z.infer<typeof AcceptInvitationSchema>
103
- export type ListInvitationsQuery = z.infer<typeof ListInvitationsQuerySchema>
104
- export type InvitationIdParam = z.infer<typeof InvitationIdParamSchema>
1
+ /**
2
+ * Invitations Domain - Zod Validation Schemas
3
+ *
4
+ * Validation schemas for invitation management endpoints.
5
+ * Includes request bodies, query params, and path params.
6
+ *
7
+ * Security:
8
+ * - All schemas use .strict() to prevent mass assignment attacks
9
+ * - Email validation prevents header injection
10
+ * - Role enum validation prevents privilege escalation
11
+ * - organizationId from JWT (not accepted in body for protected routes)
12
+ */
13
+
14
+ import { z } from 'zod'
15
+ import { EmailSchema } from '../../../platform/utils/validation'
16
+ import { MembershipRoleSchema } from '../memberships/api-schemas'
17
+
18
+ // ============================================================================
19
+ // Path Parameters
20
+ // ============================================================================
21
+
22
+ /**
23
+ * Validate invitation ID in URL path
24
+ * Used by: GET/DELETE /invitations/:id
25
+ */
26
+ export const InvitationIdParamSchema = z
27
+ .object({
28
+ id: z.string().min(1) // WorkOS invitation IDs
29
+ })
30
+ .strict()
31
+
32
+ // ============================================================================
33
+ // Request Bodies
34
+ // ============================================================================
35
+
36
+ /**
37
+ * Send new invitation
38
+ * POST /invitations
39
+ *
40
+ * Security:
41
+ * - Email format validated (prevents header injection)
42
+ * - roleSlug validated as non-empty slug; service layer checks against org_rol_definitions
43
+ * - expiresInDays bounded (1-90 days)
44
+ * - organizationId NOT in body (from JWT via requireOrganization middleware)
45
+ */
46
+ export const SendInvitationSchema = z
47
+ .object({
48
+ email: EmailSchema,
49
+ organizationId: z.string().optional(), // For WorkOS API - but typically from JWT
50
+ roleSlug: MembershipRoleSchema.default('member'),
51
+ expiresInDays: z.number().int().min(1).max(90).default(7)
52
+ })
53
+ .strict()
54
+
55
+ /**
56
+ * Accept invitation by token
57
+ * POST /invitations/accept
58
+ *
59
+ * Security:
60
+ * - Token validated (non-empty string)
61
+ */
62
+ export const AcceptInvitationSchema = z
63
+ .object({
64
+ invitation_token: z.string().min(1, 'Invitation token is required')
65
+ })
66
+ .strict()
67
+
68
+ // ============================================================================
69
+ // Query Parameters
70
+ // ============================================================================
71
+
72
+ /**
73
+ * List invitations with filters
74
+ * GET /invitations
75
+ *
76
+ * Filters:
77
+ * - organizationId: Filter by organization
78
+ * - email: Filter by email
79
+ *
80
+ * Security:
81
+ * - Requires organizationId or userId filter
82
+ * - Email validated
83
+ */
84
+ export const ListInvitationsQuerySchema = z
85
+ .object({
86
+ organizationId: z.string().optional(),
87
+ userId: z.string().optional(),
88
+ email: EmailSchema.optional(),
89
+ limit: z.coerce.number().int().min(1).max(100).optional(),
90
+ before: z.string().optional(), // WorkOS pagination cursor
91
+ after: z.string().optional() // WorkOS pagination cursor
92
+ })
93
+ .strict()
94
+ .refine((data) => data.organizationId || data.userId, { message: 'Either organizationId or userId must be provided' })
95
+
96
+ // ============================================================================
97
+ // TypeScript Type Exports
98
+ // ============================================================================
99
+
100
+ // Export inferred types for use in route handlers
101
+ export type SendInvitationInput = z.infer<typeof SendInvitationSchema>
102
+ export type AcceptInvitationInput = z.infer<typeof AcceptInvitationSchema>
103
+ export type ListInvitationsQuery = z.infer<typeof ListInvitationsQuerySchema>
104
+ export type InvitationIdParam = z.infer<typeof InvitationIdParamSchema>
@@ -1,143 +1,143 @@
1
- /**
2
- * Memberships Domain - Zod Validation Schemas
3
- *
4
- * Validation schemas for membership management endpoints.
5
- * Includes request bodies, query params, and path params.
6
- *
7
- * Security:
8
- * - All schemas use .strict() to prevent mass assignment attacks
9
- * - UUID validation prevents invalid references
10
- * - Role enum validation prevents privilege escalation
11
- * - organizationId never accepted in body (from JWT when needed)
12
- */
13
-
14
- import { z } from 'zod'
15
-
16
- // ============================================================================
17
- // Shared Schemas
18
- // ============================================================================
19
-
20
- /**
21
- * Membership role validation
22
- * Accepts any non-empty role slug (max 64 chars).
23
- *
24
- * Roles are now DB-driven via `org_rol_definitions`. Runtime validation
25
- * against valid slugs happens at the service layer, not here.
26
- */
27
- export const MembershipRoleSchema = z.string().min(1).max(64)
28
-
29
- /**
30
- * Membership status validation
31
- * Note: Database constraint only allows 'active' | 'inactive'
32
- */
33
- export const MembershipStatusSchema = z.enum(['active', 'inactive'])
34
-
35
- // ============================================================================
36
- // Path Parameters
37
- // ============================================================================
38
-
39
- /**
40
- * Validate membership ID in URL path
41
- * Used by: GET/PUT/DELETE /memberships/:id
42
- */
43
- export const MembershipIdParamSchema = z
44
- .object({
45
- id: z.string().min(1) // WorkOS membership IDs can be various formats
46
- })
47
- .strict()
48
-
49
- /**
50
- * Validate organization ID (Supabase UUID) in URL path
51
- * Used by: GET /memberships/my-permissions/:orgId
52
- */
53
- export const OrgIdParamSchema = z
54
- .object({
55
- orgId: z.string().uuid()
56
- })
57
- .strict()
58
-
59
- /**
60
- * Response shape for GET /memberships/my-permissions/:orgId
61
- */
62
- export const MyOrgPermissionsResponseSchema = z.object({
63
- permissions: z.array(z.string())
64
- })
65
-
66
- // ============================================================================
67
- // Request Bodies
68
- // ============================================================================
69
-
70
- /**
71
- * Create new membership
72
- * POST /memberships
73
- *
74
- * Security:
75
- * - userId must be valid (string format for WorkOS)
76
- * - organizationId must be valid (string format for WorkOS)
77
- * - roleSlug validated as non-empty slug; service layer checks against org_rol_definitions
78
- * - Strict mode prevents injection
79
- */
80
- export const CreateMembershipSchema = z
81
- .object({
82
- userId: z.string().min(1),
83
- organizationId: z.string().min(1),
84
- roleSlug: MembershipRoleSchema.default('member')
85
- })
86
- .strict()
87
-
88
- /**
89
- * Update membership role
90
- * PUT /memberships/:id
91
- *
92
- * Security:
93
- * - Only roleSlug can be updated
94
- * - Service layer validates slug against org_rol_definitions
95
- */
96
- export const UpdateMembershipSchema = z
97
- .object({
98
- roleSlug: MembershipRoleSchema
99
- })
100
- .strict()
101
-
102
- // ============================================================================
103
- // Query Parameters
104
- // ============================================================================
105
-
106
- /**
107
- * List memberships with filters
108
- * GET /memberships
109
- *
110
- * Filters:
111
- * - userId: Filter by user
112
- * - organizationId: Filter by organization
113
- *
114
- * Security:
115
- * - Requires at least one filter parameter
116
- * - String IDs validated for WorkOS format
117
- */
118
- export const ListMembershipsQuerySchema = z
119
- .object({
120
- userId: z.string().optional(),
121
- organizationId: z.string().optional(),
122
- limit: z.coerce.number().int().min(1).max(100).optional(),
123
- before: z.string().optional(), // WorkOS pagination cursor
124
- after: z.string().optional() // WorkOS pagination cursor
125
- })
126
- .strict()
127
- .refine((data) => data.userId || data.organizationId, {
128
- message: 'Either userId or organizationId must be provided'
129
- })
130
-
131
- // ============================================================================
132
- // TypeScript Type Exports
133
- // ============================================================================
134
-
135
- // Export inferred types for use in route handlers
136
- export type CreateMembershipInput = z.infer<typeof CreateMembershipSchema>
137
- export type UpdateMembershipInput = z.infer<typeof UpdateMembershipSchema>
138
- export type ListMembershipsQuery = z.infer<typeof ListMembershipsQuerySchema>
139
- export type MembershipIdParam = z.infer<typeof MembershipIdParamSchema>
140
- export type MembershipRole = z.infer<typeof MembershipRoleSchema>
141
- export type MembershipStatus = z.infer<typeof MembershipStatusSchema>
142
- export type OrgIdParam = z.infer<typeof OrgIdParamSchema>
143
- export type MyOrgPermissionsResponse = z.infer<typeof MyOrgPermissionsResponseSchema>
1
+ /**
2
+ * Memberships Domain - Zod Validation Schemas
3
+ *
4
+ * Validation schemas for membership management endpoints.
5
+ * Includes request bodies, query params, and path params.
6
+ *
7
+ * Security:
8
+ * - All schemas use .strict() to prevent mass assignment attacks
9
+ * - UUID validation prevents invalid references
10
+ * - Role enum validation prevents privilege escalation
11
+ * - organizationId never accepted in body (from JWT when needed)
12
+ */
13
+
14
+ import { z } from 'zod'
15
+
16
+ // ============================================================================
17
+ // Shared Schemas
18
+ // ============================================================================
19
+
20
+ /**
21
+ * Membership role validation
22
+ * Accepts any non-empty role slug (max 64 chars).
23
+ *
24
+ * Roles are now DB-driven via `org_rol_definitions`. Runtime validation
25
+ * against valid slugs happens at the service layer, not here.
26
+ */
27
+ export const MembershipRoleSchema = z.string().min(1).max(64)
28
+
29
+ /**
30
+ * Membership status validation
31
+ * Note: Database constraint only allows 'active' | 'inactive'
32
+ */
33
+ export const MembershipStatusSchema = z.enum(['active', 'inactive'])
34
+
35
+ // ============================================================================
36
+ // Path Parameters
37
+ // ============================================================================
38
+
39
+ /**
40
+ * Validate membership ID in URL path
41
+ * Used by: GET/PUT/DELETE /memberships/:id
42
+ */
43
+ export const MembershipIdParamSchema = z
44
+ .object({
45
+ id: z.string().min(1) // WorkOS membership IDs can be various formats
46
+ })
47
+ .strict()
48
+
49
+ /**
50
+ * Validate organization ID (Supabase UUID) in URL path
51
+ * Used by: GET /memberships/my-permissions/:orgId
52
+ */
53
+ export const OrgIdParamSchema = z
54
+ .object({
55
+ orgId: z.string().uuid()
56
+ })
57
+ .strict()
58
+
59
+ /**
60
+ * Response shape for GET /memberships/my-permissions/:orgId
61
+ */
62
+ export const MyOrgPermissionsResponseSchema = z.object({
63
+ permissions: z.array(z.string())
64
+ })
65
+
66
+ // ============================================================================
67
+ // Request Bodies
68
+ // ============================================================================
69
+
70
+ /**
71
+ * Create new membership
72
+ * POST /memberships
73
+ *
74
+ * Security:
75
+ * - userId must be valid (string format for WorkOS)
76
+ * - organizationId must be valid (string format for WorkOS)
77
+ * - roleSlug validated as non-empty slug; service layer checks against org_rol_definitions
78
+ * - Strict mode prevents injection
79
+ */
80
+ export const CreateMembershipSchema = z
81
+ .object({
82
+ userId: z.string().min(1),
83
+ organizationId: z.string().min(1),
84
+ roleSlug: MembershipRoleSchema.default('member')
85
+ })
86
+ .strict()
87
+
88
+ /**
89
+ * Update membership role
90
+ * PUT /memberships/:id
91
+ *
92
+ * Security:
93
+ * - Only roleSlug can be updated
94
+ * - Service layer validates slug against org_rol_definitions
95
+ */
96
+ export const UpdateMembershipSchema = z
97
+ .object({
98
+ roleSlug: MembershipRoleSchema
99
+ })
100
+ .strict()
101
+
102
+ // ============================================================================
103
+ // Query Parameters
104
+ // ============================================================================
105
+
106
+ /**
107
+ * List memberships with filters
108
+ * GET /memberships
109
+ *
110
+ * Filters:
111
+ * - userId: Filter by user
112
+ * - organizationId: Filter by organization
113
+ *
114
+ * Security:
115
+ * - Requires at least one filter parameter
116
+ * - String IDs validated for WorkOS format
117
+ */
118
+ export const ListMembershipsQuerySchema = z
119
+ .object({
120
+ userId: z.string().optional(),
121
+ organizationId: z.string().optional(),
122
+ limit: z.coerce.number().int().min(1).max(100).optional(),
123
+ before: z.string().optional(), // WorkOS pagination cursor
124
+ after: z.string().optional() // WorkOS pagination cursor
125
+ })
126
+ .strict()
127
+ .refine((data) => data.userId || data.organizationId, {
128
+ message: 'Either userId or organizationId must be provided'
129
+ })
130
+
131
+ // ============================================================================
132
+ // TypeScript Type Exports
133
+ // ============================================================================
134
+
135
+ // Export inferred types for use in route handlers
136
+ export type CreateMembershipInput = z.infer<typeof CreateMembershipSchema>
137
+ export type UpdateMembershipInput = z.infer<typeof UpdateMembershipSchema>
138
+ export type ListMembershipsQuery = z.infer<typeof ListMembershipsQuerySchema>
139
+ export type MembershipIdParam = z.infer<typeof MembershipIdParamSchema>
140
+ export type MembershipRole = z.infer<typeof MembershipRoleSchema>
141
+ export type MembershipStatus = z.infer<typeof MembershipStatusSchema>
142
+ export type OrgIdParam = z.infer<typeof OrgIdParamSchema>
143
+ export type MyOrgPermissionsResponse = z.infer<typeof MyOrgPermissionsResponseSchema>