@elevasis/core 0.23.0 → 0.24.1

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 (243) hide show
  1. package/dist/index.d.ts +4343 -2690
  2. package/dist/index.js +1101 -156
  3. package/dist/knowledge/index.d.ts +574 -210
  4. package/dist/knowledge/index.js +104 -1
  5. package/dist/organization-model/index.d.ts +4343 -2690
  6. package/dist/organization-model/index.js +1101 -156
  7. package/dist/test-utils/index.d.ts +483 -109
  8. package/dist/test-utils/index.js +904 -144
  9. package/package.json +3 -3
  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 -12
  13. package/src/_gen/__tests__/__snapshots__/contracts.md.snap +2137 -2093
  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 +1492 -1497
  37. package/src/business/acquisition/build-templates.test.ts +240 -240
  38. package/src/business/acquisition/build-templates.ts +98 -98
  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 -153
  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 -396
  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 +195 -197
  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 +32 -32
  123. package/src/knowledge/__tests__/queries.test.ts +626 -535
  124. package/src/knowledge/format.ts +99 -99
  125. package/src/knowledge/index.ts +5 -5
  126. package/src/knowledge/published.ts +5 -5
  127. package/src/knowledge/queries.ts +269 -218
  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 -149
  131. package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -210
  132. package/src/organization-model/__tests__/defaults.test.ts +168 -168
  133. package/src/organization-model/__tests__/domains/actions.test.ts +78 -56
  134. package/src/organization-model/__tests__/domains/customers.test.ts +299 -299
  135. package/src/organization-model/__tests__/domains/entities.test.ts +56 -56
  136. package/src/organization-model/__tests__/domains/goals.test.ts +493 -493
  137. package/src/organization-model/__tests__/domains/identity.test.ts +280 -280
  138. package/src/organization-model/__tests__/domains/navigation.test.ts +268 -268
  139. package/src/organization-model/__tests__/domains/offerings.test.ts +414 -414
  140. package/src/organization-model/__tests__/domains/policies.test.ts +323 -323
  141. package/src/organization-model/__tests__/domains/resource-mappings.test.ts +293 -293
  142. package/src/organization-model/__tests__/domains/resources.test.ts +387 -277
  143. package/src/organization-model/__tests__/domains/roles.test.ts +463 -463
  144. package/src/organization-model/__tests__/domains/statuses.test.ts +246 -246
  145. package/src/organization-model/__tests__/domains/systems.test.ts +209 -209
  146. package/src/organization-model/__tests__/domains/topology.test.ts +188 -0
  147. package/src/organization-model/__tests__/flatten-additive-merge.test.ts +362 -361
  148. package/src/organization-model/__tests__/foundation.test.ts +77 -77
  149. package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -144
  150. package/src/organization-model/__tests__/graph.test.ts +1312 -862
  151. package/src/organization-model/__tests__/icons.test.ts +10 -1
  152. package/src/organization-model/__tests__/knowledge.test.ts +251 -15
  153. package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -438
  154. package/src/organization-model/__tests__/migration-helpers.test.ts +591 -591
  155. package/src/organization-model/__tests__/prospecting-ssot.test.ts +103 -103
  156. package/src/organization-model/__tests__/recursive-system-schema.test.ts +535 -506
  157. package/src/organization-model/__tests__/resolve.test.ts +274 -164
  158. package/src/organization-model/__tests__/schema.test.ts +844 -301
  159. package/src/organization-model/__tests__/surface-projection.test.ts +284 -284
  160. package/src/organization-model/catalogs/lead-gen.ts +144 -144
  161. package/src/organization-model/content-kinds/config.ts +36 -36
  162. package/src/organization-model/content-kinds/index.ts +76 -72
  163. package/src/organization-model/content-kinds/pipeline.ts +68 -68
  164. package/src/organization-model/content-kinds/registry.ts +44 -44
  165. package/src/organization-model/content-kinds/status.ts +71 -71
  166. package/src/organization-model/content-kinds/template.ts +83 -83
  167. package/src/organization-model/content-kinds/types.ts +117 -117
  168. package/src/organization-model/contracts.ts +27 -27
  169. package/src/organization-model/defaults.ts +42 -50
  170. package/src/organization-model/domains/actions.ts +333 -239
  171. package/src/organization-model/domains/customers.ts +78 -78
  172. package/src/organization-model/domains/entities.ts +144 -144
  173. package/src/organization-model/domains/goals.ts +83 -83
  174. package/src/organization-model/domains/knowledge.ts +117 -101
  175. package/src/organization-model/domains/navigation.ts +139 -139
  176. package/src/organization-model/domains/offerings.ts +71 -71
  177. package/src/organization-model/domains/policies.ts +102 -102
  178. package/src/organization-model/domains/projects.ts +14 -14
  179. package/src/organization-model/domains/prospecting.ts +395 -395
  180. package/src/organization-model/domains/resources.ts +202 -124
  181. package/src/organization-model/domains/roles.ts +96 -96
  182. package/src/organization-model/domains/sales.test.ts +218 -218
  183. package/src/organization-model/domains/sales.ts +380 -380
  184. package/src/organization-model/domains/shared.ts +63 -63
  185. package/src/organization-model/domains/statuses.ts +339 -339
  186. package/src/organization-model/domains/systems.ts +217 -172
  187. package/src/organization-model/domains/topology.ts +261 -0
  188. package/src/organization-model/foundation.ts +75 -75
  189. package/src/organization-model/graph/build.ts +1043 -867
  190. package/src/organization-model/graph/index.ts +4 -4
  191. package/src/organization-model/graph/link.ts +10 -10
  192. package/src/organization-model/graph/schema.ts +75 -68
  193. package/src/organization-model/graph/types.ts +71 -64
  194. package/src/organization-model/helpers.ts +289 -241
  195. package/src/organization-model/icons.ts +78 -66
  196. package/src/organization-model/index.ts +128 -125
  197. package/src/organization-model/migration-helpers.ts +247 -244
  198. package/src/organization-model/ontology.ts +658 -0
  199. package/src/organization-model/organization-graph.mdx +110 -90
  200. package/src/organization-model/organization-model.mdx +225 -213
  201. package/src/organization-model/published.ts +299 -222
  202. package/src/organization-model/resolve.ts +146 -91
  203. package/src/organization-model/schema.ts +818 -659
  204. package/src/organization-model/surface-projection.ts +212 -212
  205. package/src/organization-model/types.ts +179 -155
  206. package/src/platform/api/types.ts +38 -38
  207. package/src/platform/constants/versions.ts +3 -3
  208. package/src/platform/index.ts +23 -23
  209. package/src/platform/registry/__tests__/command-view.test.ts +10 -10
  210. package/src/platform/registry/__tests__/resource-link.test.ts +35 -35
  211. package/src/platform/registry/__tests__/resource-registry.integration.test.ts +20 -20
  212. package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -245
  213. package/src/platform/registry/__tests__/resource-registry.test.ts +2053 -2053
  214. package/src/platform/registry/__tests__/validation.test.ts +1444 -1259
  215. package/src/platform/registry/command-view.ts +10 -10
  216. package/src/platform/registry/index.ts +103 -103
  217. package/src/platform/registry/resource-link.ts +32 -32
  218. package/src/platform/registry/resource-registry.ts +886 -886
  219. package/src/platform/registry/serialization.ts +295 -295
  220. package/src/platform/registry/serialized-types.ts +166 -166
  221. package/src/platform/registry/stats-types.ts +68 -68
  222. package/src/platform/registry/types.ts +425 -425
  223. package/src/platform/registry/validation.ts +876 -684
  224. package/src/platform/utils/__tests__/validation.test.ts +1084 -1084
  225. package/src/platform/utils/validation.ts +425 -425
  226. package/src/projects/api-schemas.test.ts +39 -39
  227. package/src/projects/api-schemas.ts +291 -291
  228. package/src/reference/_generated/contracts.md +2136 -2093
  229. package/src/reference/glossary.md +76 -76
  230. package/src/scaffold-registry/__tests__/index.test.ts +206 -206
  231. package/src/scaffold-registry/__tests__/schema.test.ts +166 -166
  232. package/src/scaffold-registry/index.ts +392 -392
  233. package/src/scaffold-registry/schema.ts +243 -243
  234. package/src/server.ts +289 -289
  235. package/src/supabase/database.types.ts +3 -0
  236. package/src/test-utils/README.md +37 -37
  237. package/src/test-utils/entities.ts +108 -108
  238. package/src/test-utils/fixtures/memberships.ts +82 -82
  239. package/src/test-utils/index.ts +12 -12
  240. package/src/test-utils/organization-model.ts +65 -65
  241. package/src/test-utils/published.ts +6 -6
  242. package/src/test-utils/rls/RLSTestContext.ts +588 -588
  243. package/src/test-utils/test-utils.test.ts +44 -44
@@ -1,78 +1,78 @@
1
- import { z } from 'zod'
2
-
3
- // ---------------------------------------------------------------------------
4
- // Firmographics — optional demographic/firmographic filters that describe the
5
- // target customer segment's organizational profile. All fields are optional so
6
- // a segment can declare only the axes relevant to targeting.
7
- // ---------------------------------------------------------------------------
8
-
9
- export const FirmographicsSchema = z.object({
10
- /** Industry vertical (e.g. "Marketing Agency", "Legal", "Real Estate"). */
11
- industry: z.string().trim().max(200).optional(),
12
- /**
13
- * Company headcount band (e.g. "1–10", "11–50", "51–200", "200+").
14
- * Free-form string to accommodate any band notation.
15
- */
16
- companySize: z.string().trim().max(100).optional(),
17
- /**
18
- * Primary geographic region the segment operates in or is targeted from
19
- * (e.g. "North America", "Europe", "Global").
20
- */
21
- region: z.string().trim().max(200).optional()
22
- })
23
-
24
- // ---------------------------------------------------------------------------
25
- // Customer segment schema — one entry per distinct buyer archetype.
26
- // Modeled after Value Proposition Canvas (BMC / VPC) and Business Model Canvas
27
- // customer-segment language. Fields use plain English throughout.
28
- // ---------------------------------------------------------------------------
29
-
30
- export const CustomerSegmentSchema = z.object({
31
- /** Stable unique identifier for the segment (e.g. "segment-smb-agencies"). */
32
- id: z.string().trim().min(1).max(100),
33
- /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
34
- order: z.number(),
35
- /** Human-readable name shown to agents and in UI (e.g. "SMB Marketing Agencies"). */
36
- name: z.string().trim().max(200).default(''),
37
- /** One or two sentences describing who this segment is. */
38
- description: z.string().trim().max(2000).default(''),
39
- /**
40
- * The primary job(s) this segment is trying to get done — the goal they hire
41
- * a product/service to accomplish. Plain-language narrative or bullet list.
42
- */
43
- jobsToBeDone: z.string().trim().max(2000).default(''),
44
- /**
45
- * Pains — frustrations, obstacles, and risks the segment experiences
46
- * when trying to accomplish their jobs-to-be-done.
47
- */
48
- pains: z.array(z.string().trim().max(500)).default([]),
49
- /**
50
- * Gains — outcomes and benefits the segment desires; positive motivators
51
- * beyond merely resolving pains.
52
- */
53
- gains: z.array(z.string().trim().max(500)).default([]),
54
- /** Firmographic profile for targeting and filtering. */
55
- firmographics: FirmographicsSchema.default({}),
56
- /**
57
- * Value proposition — one or two sentences stating why this organization's
58
- * offering is uniquely suited for this segment's needs.
59
- */
60
- valueProp: z.string().trim().max(2000).default('')
61
- })
62
-
63
- // ---------------------------------------------------------------------------
64
- // Customers domain schema — id-keyed map of customer segments.
65
- // ---------------------------------------------------------------------------
66
-
67
- export const CustomersDomainSchema = z
68
- .record(z.string(), CustomerSegmentSchema)
69
- .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
70
- message: 'Each segment entry id must match its map key'
71
- })
72
- .default({})
73
-
74
- // ---------------------------------------------------------------------------
75
- // Seed — empty by default; adapters populate with real segment definitions.
76
- // ---------------------------------------------------------------------------
77
-
78
- export const DEFAULT_ORGANIZATION_MODEL_CUSTOMERS: z.infer<typeof CustomersDomainSchema> = {}
1
+ import { z } from 'zod'
2
+
3
+ // ---------------------------------------------------------------------------
4
+ // Firmographics — optional demographic/firmographic filters that describe the
5
+ // target customer segment's organizational profile. All fields are optional so
6
+ // a segment can declare only the axes relevant to targeting.
7
+ // ---------------------------------------------------------------------------
8
+
9
+ export const FirmographicsSchema = z.object({
10
+ /** Industry vertical (e.g. "Marketing Agency", "Legal", "Real Estate"). */
11
+ industry: z.string().trim().max(200).optional(),
12
+ /**
13
+ * Company headcount band (e.g. "1–10", "11–50", "51–200", "200+").
14
+ * Free-form string to accommodate any band notation.
15
+ */
16
+ companySize: z.string().trim().max(100).optional(),
17
+ /**
18
+ * Primary geographic region the segment operates in or is targeted from
19
+ * (e.g. "North America", "Europe", "Global").
20
+ */
21
+ region: z.string().trim().max(200).optional()
22
+ })
23
+
24
+ // ---------------------------------------------------------------------------
25
+ // Customer segment schema — one entry per distinct buyer archetype.
26
+ // Modeled after Value Proposition Canvas (BMC / VPC) and Business Model Canvas
27
+ // customer-segment language. Fields use plain English throughout.
28
+ // ---------------------------------------------------------------------------
29
+
30
+ export const CustomerSegmentSchema = z.object({
31
+ /** Stable unique identifier for the segment (e.g. "segment-smb-agencies"). */
32
+ id: z.string().trim().min(1).max(100),
33
+ /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
34
+ order: z.number(),
35
+ /** Human-readable name shown to agents and in UI (e.g. "SMB Marketing Agencies"). */
36
+ name: z.string().trim().max(200).default(''),
37
+ /** One or two sentences describing who this segment is. */
38
+ description: z.string().trim().max(2000).default(''),
39
+ /**
40
+ * The primary job(s) this segment is trying to get done — the goal they hire
41
+ * a product/service to accomplish. Plain-language narrative or bullet list.
42
+ */
43
+ jobsToBeDone: z.string().trim().max(2000).default(''),
44
+ /**
45
+ * Pains — frustrations, obstacles, and risks the segment experiences
46
+ * when trying to accomplish their jobs-to-be-done.
47
+ */
48
+ pains: z.array(z.string().trim().max(500)).default([]),
49
+ /**
50
+ * Gains — outcomes and benefits the segment desires; positive motivators
51
+ * beyond merely resolving pains.
52
+ */
53
+ gains: z.array(z.string().trim().max(500)).default([]),
54
+ /** Firmographic profile for targeting and filtering. */
55
+ firmographics: FirmographicsSchema.default({}),
56
+ /**
57
+ * Value proposition — one or two sentences stating why this organization's
58
+ * offering is uniquely suited for this segment's needs.
59
+ */
60
+ valueProp: z.string().trim().max(2000).default('')
61
+ })
62
+
63
+ // ---------------------------------------------------------------------------
64
+ // Customers domain schema — id-keyed map of customer segments.
65
+ // ---------------------------------------------------------------------------
66
+
67
+ export const CustomersDomainSchema = z
68
+ .record(z.string(), CustomerSegmentSchema)
69
+ .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
70
+ message: 'Each segment entry id must match its map key'
71
+ })
72
+ .default({})
73
+
74
+ // ---------------------------------------------------------------------------
75
+ // Seed — empty by default; adapters populate with real segment definitions.
76
+ // ---------------------------------------------------------------------------
77
+
78
+ export const DEFAULT_ORGANIZATION_MODEL_CUSTOMERS: z.infer<typeof CustomersDomainSchema> = {}
@@ -1,144 +1,144 @@
1
- import { z } from 'zod'
2
- import { DescriptionSchema, LabelSchema, ModelIdSchema } from './shared'
3
-
4
- export const EntityIdSchema = ModelIdSchema
5
-
6
- export const EntityLinkKindSchema = z
7
- .enum(['belongs-to', 'has-many', 'has-one', 'many-to-many'])
8
- .meta({ label: 'Link kind' })
9
-
10
- export const EntityLinkSchema = z.object({
11
- toEntity: EntityIdSchema.meta({ ref: 'entity' }),
12
- kind: EntityLinkKindSchema,
13
- via: z.string().trim().min(1).max(255).optional(),
14
- label: LabelSchema.optional()
15
- })
16
-
17
- export const EntitySchema = z.object({
18
- id: EntityIdSchema,
19
- /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
20
- order: z.number(),
21
- label: LabelSchema,
22
- description: DescriptionSchema.optional(),
23
- ownedBySystemId: ModelIdSchema.meta({ ref: 'system' }),
24
- table: z.string().trim().min(1).max(255).optional(),
25
- rowSchema: ModelIdSchema.optional(),
26
- stateCatalogId: ModelIdSchema.optional(),
27
- links: z.array(EntityLinkSchema).optional()
28
- })
29
-
30
- export const EntitiesDomainSchema = z
31
- .record(z.string(), EntitySchema)
32
- .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
33
- message: 'Each entity entry id must match its map key'
34
- })
35
- .default({})
36
-
37
- const ENTITY_ENTRY_INPUTS: z.input<typeof EntitySchema>[] = [
38
- {
39
- id: 'crm.deal',
40
- order: 10,
41
- label: 'Deal',
42
- description: 'A CRM opportunity or sales pipeline record.',
43
- ownedBySystemId: 'sales.crm',
44
- table: 'crm_deals',
45
- stateCatalogId: 'crm.pipeline',
46
- links: [{ toEntity: 'crm.contact', kind: 'has-many', via: 'deal_contacts', label: 'contacts' }]
47
- },
48
- {
49
- id: 'crm.contact',
50
- order: 20,
51
- label: 'CRM Contact',
52
- description: 'A person associated with a CRM relationship or deal.',
53
- ownedBySystemId: 'sales.crm',
54
- table: 'crm_contacts'
55
- },
56
- {
57
- id: 'leadgen.list',
58
- order: 30,
59
- label: 'Lead List',
60
- description: 'A prospecting list that groups companies and contacts for acquisition workflows.',
61
- ownedBySystemId: 'sales.lead-gen',
62
- table: 'acq_lists',
63
- links: [
64
- { toEntity: 'leadgen.company', kind: 'has-many', via: 'acq_list_companies', label: 'companies' },
65
- { toEntity: 'leadgen.contact', kind: 'has-many', via: 'acq_list_members', label: 'contacts' }
66
- ]
67
- },
68
- {
69
- id: 'leadgen.company',
70
- order: 40,
71
- label: 'Lead Company',
72
- description: 'A company record sourced, enriched, and qualified during prospecting.',
73
- ownedBySystemId: 'sales.lead-gen',
74
- table: 'acq_list_companies',
75
- stateCatalogId: 'lead-gen.company',
76
- links: [
77
- { toEntity: 'leadgen.list', kind: 'belongs-to', via: 'list_id', label: 'list' },
78
- { toEntity: 'leadgen.contact', kind: 'has-many', via: 'company_id', label: 'contacts' }
79
- ]
80
- },
81
- {
82
- id: 'leadgen.contact',
83
- order: 50,
84
- label: 'Lead Contact',
85
- description: 'A prospect contact discovered or enriched during lead generation.',
86
- ownedBySystemId: 'sales.lead-gen',
87
- table: 'acq_list_members',
88
- stateCatalogId: 'lead-gen.contact',
89
- links: [
90
- { toEntity: 'leadgen.list', kind: 'belongs-to', via: 'list_id', label: 'list' },
91
- { toEntity: 'leadgen.company', kind: 'belongs-to', via: 'company_id', label: 'company' }
92
- ]
93
- },
94
- {
95
- id: 'delivery.project',
96
- order: 60,
97
- label: 'Project',
98
- description: 'A client delivery project.',
99
- ownedBySystemId: 'projects',
100
- table: 'projects',
101
- links: [
102
- { toEntity: 'delivery.milestone', kind: 'has-many', via: 'project_id', label: 'milestones' },
103
- { toEntity: 'delivery.task', kind: 'has-many', via: 'project_id', label: 'tasks' }
104
- ]
105
- },
106
- {
107
- id: 'delivery.milestone',
108
- order: 70,
109
- label: 'Milestone',
110
- description: 'A delivery checkpoint within a project.',
111
- ownedBySystemId: 'projects',
112
- table: 'project_milestones',
113
- links: [
114
- { toEntity: 'delivery.project', kind: 'belongs-to', via: 'project_id', label: 'project' },
115
- { toEntity: 'delivery.task', kind: 'has-many', via: 'milestone_id', label: 'tasks' }
116
- ]
117
- },
118
- {
119
- id: 'delivery.task',
120
- order: 80,
121
- label: 'Task',
122
- description: 'A delivery task that can move through the task status catalog.',
123
- ownedBySystemId: 'projects',
124
- table: 'project_tasks',
125
- stateCatalogId: 'delivery.task',
126
- links: [
127
- { toEntity: 'delivery.project', kind: 'belongs-to', via: 'project_id', label: 'project' },
128
- { toEntity: 'delivery.milestone', kind: 'belongs-to', via: 'milestone_id', label: 'milestone' }
129
- ]
130
- }
131
- ]
132
-
133
- export const DEFAULT_ORGANIZATION_MODEL_ENTITIES: z.infer<typeof EntitiesDomainSchema> = Object.fromEntries(
134
- ENTITY_ENTRY_INPUTS.map((entity) => {
135
- const parsed = EntitySchema.parse(entity)
136
- return [parsed.id, parsed]
137
- })
138
- )
139
-
140
- export type EntityId = z.infer<typeof EntityIdSchema>
141
- export type EntityLinkKind = z.infer<typeof EntityLinkKindSchema>
142
- export type EntityLink = z.infer<typeof EntityLinkSchema>
143
- export type Entity = z.infer<typeof EntitySchema>
144
- export type EntitiesDomain = z.infer<typeof EntitiesDomainSchema>
1
+ import { z } from 'zod'
2
+ import { DescriptionSchema, LabelSchema, ModelIdSchema } from './shared'
3
+
4
+ export const EntityIdSchema = ModelIdSchema
5
+
6
+ export const EntityLinkKindSchema = z
7
+ .enum(['belongs-to', 'has-many', 'has-one', 'many-to-many'])
8
+ .meta({ label: 'Link kind' })
9
+
10
+ export const EntityLinkSchema = z.object({
11
+ toEntity: EntityIdSchema.meta({ ref: 'entity' }),
12
+ kind: EntityLinkKindSchema,
13
+ via: z.string().trim().min(1).max(255).optional(),
14
+ label: LabelSchema.optional()
15
+ })
16
+
17
+ export const EntitySchema = z.object({
18
+ id: EntityIdSchema,
19
+ /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
20
+ order: z.number(),
21
+ label: LabelSchema,
22
+ description: DescriptionSchema.optional(),
23
+ ownedBySystemId: ModelIdSchema.meta({ ref: 'system' }),
24
+ table: z.string().trim().min(1).max(255).optional(),
25
+ rowSchema: ModelIdSchema.optional(),
26
+ stateCatalogId: ModelIdSchema.optional(),
27
+ links: z.array(EntityLinkSchema).optional()
28
+ })
29
+
30
+ export const EntitiesDomainSchema = z
31
+ .record(z.string(), EntitySchema)
32
+ .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
33
+ message: 'Each entity entry id must match its map key'
34
+ })
35
+ .default({})
36
+
37
+ const ENTITY_ENTRY_INPUTS: z.input<typeof EntitySchema>[] = [
38
+ {
39
+ id: 'crm.deal',
40
+ order: 10,
41
+ label: 'Deal',
42
+ description: 'A CRM opportunity or sales pipeline record.',
43
+ ownedBySystemId: 'sales.crm',
44
+ table: 'crm_deals',
45
+ stateCatalogId: 'crm.pipeline',
46
+ links: [{ toEntity: 'crm.contact', kind: 'has-many', via: 'deal_contacts', label: 'contacts' }]
47
+ },
48
+ {
49
+ id: 'crm.contact',
50
+ order: 20,
51
+ label: 'CRM Contact',
52
+ description: 'A person associated with a CRM relationship or deal.',
53
+ ownedBySystemId: 'sales.crm',
54
+ table: 'crm_contacts'
55
+ },
56
+ {
57
+ id: 'leadgen.list',
58
+ order: 30,
59
+ label: 'Lead List',
60
+ description: 'A prospecting list that groups companies and contacts for acquisition workflows.',
61
+ ownedBySystemId: 'sales.lead-gen',
62
+ table: 'acq_lists',
63
+ links: [
64
+ { toEntity: 'leadgen.company', kind: 'has-many', via: 'acq_list_companies', label: 'companies' },
65
+ { toEntity: 'leadgen.contact', kind: 'has-many', via: 'acq_list_members', label: 'contacts' }
66
+ ]
67
+ },
68
+ {
69
+ id: 'leadgen.company',
70
+ order: 40,
71
+ label: 'Lead Company',
72
+ description: 'A company record sourced, enriched, and qualified during prospecting.',
73
+ ownedBySystemId: 'sales.lead-gen',
74
+ table: 'acq_list_companies',
75
+ stateCatalogId: 'lead-gen.company',
76
+ links: [
77
+ { toEntity: 'leadgen.list', kind: 'belongs-to', via: 'list_id', label: 'list' },
78
+ { toEntity: 'leadgen.contact', kind: 'has-many', via: 'company_id', label: 'contacts' }
79
+ ]
80
+ },
81
+ {
82
+ id: 'leadgen.contact',
83
+ order: 50,
84
+ label: 'Lead Contact',
85
+ description: 'A prospect contact discovered or enriched during lead generation.',
86
+ ownedBySystemId: 'sales.lead-gen',
87
+ table: 'acq_list_members',
88
+ stateCatalogId: 'lead-gen.contact',
89
+ links: [
90
+ { toEntity: 'leadgen.list', kind: 'belongs-to', via: 'list_id', label: 'list' },
91
+ { toEntity: 'leadgen.company', kind: 'belongs-to', via: 'company_id', label: 'company' }
92
+ ]
93
+ },
94
+ {
95
+ id: 'delivery.project',
96
+ order: 60,
97
+ label: 'Project',
98
+ description: 'A client delivery project.',
99
+ ownedBySystemId: 'projects',
100
+ table: 'projects',
101
+ links: [
102
+ { toEntity: 'delivery.milestone', kind: 'has-many', via: 'project_id', label: 'milestones' },
103
+ { toEntity: 'delivery.task', kind: 'has-many', via: 'project_id', label: 'tasks' }
104
+ ]
105
+ },
106
+ {
107
+ id: 'delivery.milestone',
108
+ order: 70,
109
+ label: 'Milestone',
110
+ description: 'A delivery checkpoint within a project.',
111
+ ownedBySystemId: 'projects',
112
+ table: 'project_milestones',
113
+ links: [
114
+ { toEntity: 'delivery.project', kind: 'belongs-to', via: 'project_id', label: 'project' },
115
+ { toEntity: 'delivery.task', kind: 'has-many', via: 'milestone_id', label: 'tasks' }
116
+ ]
117
+ },
118
+ {
119
+ id: 'delivery.task',
120
+ order: 80,
121
+ label: 'Task',
122
+ description: 'A delivery task that can move through the task status catalog.',
123
+ ownedBySystemId: 'projects',
124
+ table: 'project_tasks',
125
+ stateCatalogId: 'delivery.task',
126
+ links: [
127
+ { toEntity: 'delivery.project', kind: 'belongs-to', via: 'project_id', label: 'project' },
128
+ { toEntity: 'delivery.milestone', kind: 'belongs-to', via: 'milestone_id', label: 'milestone' }
129
+ ]
130
+ }
131
+ ]
132
+
133
+ export const DEFAULT_ORGANIZATION_MODEL_ENTITIES: z.infer<typeof EntitiesDomainSchema> = Object.fromEntries(
134
+ ENTITY_ENTRY_INPUTS.map((entity) => {
135
+ const parsed = EntitySchema.parse(entity)
136
+ return [parsed.id, parsed]
137
+ })
138
+ )
139
+
140
+ export type EntityId = z.infer<typeof EntityIdSchema>
141
+ export type EntityLinkKind = z.infer<typeof EntityLinkKindSchema>
142
+ export type EntityLink = z.infer<typeof EntityLinkSchema>
143
+ export type Entity = z.infer<typeof EntitySchema>
144
+ export type EntitiesDomain = z.infer<typeof EntitiesDomainSchema>
@@ -1,83 +1,83 @@
1
- import { z } from 'zod'
2
-
3
- // ---------------------------------------------------------------------------
4
- // Measurable outcome schema — one trackable result that supports a goal.
5
- // The field name `keyResults` is used for compatibility with OKR tooling;
6
- // user-facing surfaces and documentation MUST say "measurable outcomes",
7
- // never "key results" or "OKR".
8
- // ---------------------------------------------------------------------------
9
-
10
- export const KeyResultSchema = z.object({
11
- /** Stable unique identifier for the measurable outcome (e.g. "kr-revenue-q1"). */
12
- id: z.string().trim().min(1).max(100),
13
- /** Plain-language description of this measurable outcome (e.g. "Increase trial-to-paid conversion"). */
14
- description: z.string().trim().min(1).max(500),
15
- /**
16
- * What is being measured — the metric name (e.g. "monthly revenue", "NPS score",
17
- * "trial-to-paid conversion rate"). Free-form string.
18
- */
19
- targetMetric: z.string().trim().min(1).max(200),
20
- /** Current measured value. Defaults to 0 when not yet tracked. */
21
- currentValue: z.number().default(0),
22
- /**
23
- * Target value to reach for this measurable outcome to be considered achieved.
24
- * Optional — omit if the outcome is directional (e.g. "reduce churn") without
25
- * a hard numeric target.
26
- */
27
- targetValue: z.number().optional()
28
- })
29
-
30
- // ---------------------------------------------------------------------------
31
- // Objective schema — one goal the organization is working toward.
32
- // User-facing label is "goal"; this schema type is named Objective for
33
- // structural continuity with OKR tooling. Do NOT expose "OKR", "objective",
34
- // or "key result" in any user-facing label or documentation.
35
- //
36
- // Period fields use ISO 8601 date strings (YYYY-MM-DD). Cross-schema
37
- // validation (periodEnd > periodStart) is enforced in
38
- // `OrganizationModelSchema.superRefine()`.
39
- // ---------------------------------------------------------------------------
40
-
41
- const ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/
42
-
43
- export const ObjectiveSchema = z.object({
44
- /** Stable unique identifier for the goal (e.g. "goal-grow-arr-q1-2026"). */
45
- id: z.string().trim().min(1).max(100),
46
- /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
47
- order: z.number(),
48
- /** Plain-language description of what the organization wants to achieve. */
49
- description: z.string().trim().min(1).max(1000),
50
- /**
51
- * Start of the period this goal is active for — ISO 8601 date string (YYYY-MM-DD).
52
- * Must be strictly before `periodEnd`.
53
- */
54
- periodStart: z.string().regex(ISO_DATE_REGEX, 'periodStart must be an ISO date string (YYYY-MM-DD)'),
55
- /**
56
- * End of the period this goal is active for — ISO 8601 date string (YYYY-MM-DD).
57
- * Must be strictly after `periodStart`.
58
- * Enforced via `OrganizationModelSchema.superRefine()`.
59
- */
60
- periodEnd: z.string().regex(ISO_DATE_REGEX, 'periodEnd must be an ISO date string (YYYY-MM-DD)'),
61
- /**
62
- * List of measurable outcomes that define success for this goal.
63
- * Defaults to empty array so goals can be declared before outcomes are defined.
64
- */
65
- keyResults: z.array(KeyResultSchema).default([])
66
- })
67
-
68
- // ---------------------------------------------------------------------------
69
- // Goals domain schema — a collection of goals the organization is pursuing.
70
- // ---------------------------------------------------------------------------
71
-
72
- export const GoalsDomainSchema = z
73
- .record(z.string(), ObjectiveSchema)
74
- .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
75
- message: 'Each objective entry id must match its map key'
76
- })
77
- .default({})
78
-
79
- // ---------------------------------------------------------------------------
80
- // Seed — empty by default; adapters populate with real goal definitions.
81
- // ---------------------------------------------------------------------------
82
-
83
- export const DEFAULT_ORGANIZATION_MODEL_GOALS: z.infer<typeof GoalsDomainSchema> = {}
1
+ import { z } from 'zod'
2
+
3
+ // ---------------------------------------------------------------------------
4
+ // Measurable outcome schema — one trackable result that supports a goal.
5
+ // The field name `keyResults` is used for compatibility with OKR tooling;
6
+ // user-facing surfaces and documentation MUST say "measurable outcomes",
7
+ // never "key results" or "OKR".
8
+ // ---------------------------------------------------------------------------
9
+
10
+ export const KeyResultSchema = z.object({
11
+ /** Stable unique identifier for the measurable outcome (e.g. "kr-revenue-q1"). */
12
+ id: z.string().trim().min(1).max(100),
13
+ /** Plain-language description of this measurable outcome (e.g. "Increase trial-to-paid conversion"). */
14
+ description: z.string().trim().min(1).max(500),
15
+ /**
16
+ * What is being measured — the metric name (e.g. "monthly revenue", "NPS score",
17
+ * "trial-to-paid conversion rate"). Free-form string.
18
+ */
19
+ targetMetric: z.string().trim().min(1).max(200),
20
+ /** Current measured value. Defaults to 0 when not yet tracked. */
21
+ currentValue: z.number().default(0),
22
+ /**
23
+ * Target value to reach for this measurable outcome to be considered achieved.
24
+ * Optional — omit if the outcome is directional (e.g. "reduce churn") without
25
+ * a hard numeric target.
26
+ */
27
+ targetValue: z.number().optional()
28
+ })
29
+
30
+ // ---------------------------------------------------------------------------
31
+ // Objective schema — one goal the organization is working toward.
32
+ // User-facing label is "goal"; this schema type is named Objective for
33
+ // structural continuity with OKR tooling. Do NOT expose "OKR", "objective",
34
+ // or "key result" in any user-facing label or documentation.
35
+ //
36
+ // Period fields use ISO 8601 date strings (YYYY-MM-DD). Cross-schema
37
+ // validation (periodEnd > periodStart) is enforced in
38
+ // `OrganizationModelSchema.superRefine()`.
39
+ // ---------------------------------------------------------------------------
40
+
41
+ const ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/
42
+
43
+ export const ObjectiveSchema = z.object({
44
+ /** Stable unique identifier for the goal (e.g. "goal-grow-arr-q1-2026"). */
45
+ id: z.string().trim().min(1).max(100),
46
+ /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
47
+ order: z.number(),
48
+ /** Plain-language description of what the organization wants to achieve. */
49
+ description: z.string().trim().min(1).max(1000),
50
+ /**
51
+ * Start of the period this goal is active for — ISO 8601 date string (YYYY-MM-DD).
52
+ * Must be strictly before `periodEnd`.
53
+ */
54
+ periodStart: z.string().regex(ISO_DATE_REGEX, 'periodStart must be an ISO date string (YYYY-MM-DD)'),
55
+ /**
56
+ * End of the period this goal is active for — ISO 8601 date string (YYYY-MM-DD).
57
+ * Must be strictly after `periodStart`.
58
+ * Enforced via `OrganizationModelSchema.superRefine()`.
59
+ */
60
+ periodEnd: z.string().regex(ISO_DATE_REGEX, 'periodEnd must be an ISO date string (YYYY-MM-DD)'),
61
+ /**
62
+ * List of measurable outcomes that define success for this goal.
63
+ * Defaults to empty array so goals can be declared before outcomes are defined.
64
+ */
65
+ keyResults: z.array(KeyResultSchema).default([])
66
+ })
67
+
68
+ // ---------------------------------------------------------------------------
69
+ // Goals domain schema — a collection of goals the organization is pursuing.
70
+ // ---------------------------------------------------------------------------
71
+
72
+ export const GoalsDomainSchema = z
73
+ .record(z.string(), ObjectiveSchema)
74
+ .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
75
+ message: 'Each objective entry id must match its map key'
76
+ })
77
+ .default({})
78
+
79
+ // ---------------------------------------------------------------------------
80
+ // Seed — empty by default; adapters populate with real goal definitions.
81
+ // ---------------------------------------------------------------------------
82
+
83
+ export const DEFAULT_ORGANIZATION_MODEL_GOALS: z.infer<typeof GoalsDomainSchema> = {}