@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
@@ -0,0 +1,333 @@
1
+ import { z } from 'zod'
2
+ import { EntityIdSchema } from './entities'
3
+ import { DescriptionSchema, LabelSchema, ModelIdSchema } from './shared'
4
+
5
+ export const ActionResourceIdSchema = z
6
+ .string()
7
+ .trim()
8
+ .min(1)
9
+ .max(255)
10
+ .regex(/^[A-Za-z0-9]+(?:[-._][A-Za-z0-9]+)*$/, 'Resource IDs must use letters, numbers, -, _, or . separators')
11
+
12
+ export const ActionInvocationKindSchema = z
13
+ .enum(['slash-command', 'mcp-tool', 'api-endpoint', 'script-execution'])
14
+ .meta({ label: 'Invocation kind' })
15
+
16
+ export const ActionIdSchema = ModelIdSchema
17
+
18
+ export const ActionScopeSchema = z.union([
19
+ z.literal('global'),
20
+ z.object({
21
+ domain: ModelIdSchema
22
+ })
23
+ ])
24
+
25
+ export const ActionRefSchema = z.object({
26
+ actionId: ActionIdSchema.meta({ ref: 'action' }),
27
+ intent: z.enum(['exposes', 'consumes']).meta({ label: 'Intent' })
28
+ })
29
+
30
+ export const SlashCommandInvocationSchema = z.object({
31
+ kind: z.literal('slash-command'),
32
+ command: z
33
+ .string()
34
+ .trim()
35
+ .min(1)
36
+ .max(200)
37
+ .regex(/^\/[^\s].*$/, 'Slash commands must start with /'),
38
+ toolFactory: ModelIdSchema.optional()
39
+ })
40
+
41
+ export const McpToolInvocationSchema = z.object({
42
+ kind: z.literal('mcp-tool'),
43
+ server: ModelIdSchema,
44
+ name: ModelIdSchema
45
+ })
46
+
47
+ export const ApiEndpointInvocationSchema = z.object({
48
+ kind: z.literal('api-endpoint'),
49
+ method: z.enum(['GET', 'POST', 'PATCH', 'DELETE']).meta({ label: 'HTTP method' }),
50
+ path: z.string().trim().startsWith('/').max(500),
51
+ requestSchema: ModelIdSchema.optional(),
52
+ responseSchema: ModelIdSchema.optional()
53
+ })
54
+
55
+ export const ScriptExecutionInvocationSchema = z.object({
56
+ kind: z.literal('script-execution'),
57
+ resourceId: ActionResourceIdSchema
58
+ })
59
+
60
+ export const ActionInvocationSchema = z.discriminatedUnion('kind', [
61
+ SlashCommandInvocationSchema,
62
+ McpToolInvocationSchema,
63
+ ApiEndpointInvocationSchema,
64
+ ScriptExecutionInvocationSchema
65
+ ])
66
+
67
+ export const ActionSchema = z.object({
68
+ id: ActionIdSchema,
69
+ /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
70
+ order: z.number(),
71
+ label: LabelSchema,
72
+ description: DescriptionSchema.optional(),
73
+ scope: ActionScopeSchema.default('global'),
74
+ resourceId: ActionResourceIdSchema.optional(),
75
+ affects: z.array(EntityIdSchema.meta({ ref: 'entity' })).optional(),
76
+ invocations: z.array(ActionInvocationSchema).default([]),
77
+ knowledge: z
78
+ .array(ModelIdSchema.meta({ ref: 'knowledge' }))
79
+ .default([])
80
+ .optional(),
81
+ lifecycle: z
82
+ .enum(['draft', 'beta', 'active', 'deprecated', 'archived'])
83
+ .meta({ label: 'Lifecycle', color: 'teal' })
84
+ .default('active')
85
+ })
86
+
87
+ export const ActionsDomainSchema = z
88
+ .record(z.string(), ActionSchema)
89
+ .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
90
+ message: 'Each action entry id must match its map key'
91
+ })
92
+ .default({})
93
+
94
+ const LEAD_GEN_ACTION_ENTRY_INPUTS: z.input<typeof ActionSchema>[] = [
95
+ {
96
+ id: 'lead-gen.company.source',
97
+ order: 10,
98
+ label: 'Source companies',
99
+ description: 'Import source companies from a list provider.',
100
+ scope: { domain: 'sales' },
101
+ resourceId: 'lgn-import-workflow',
102
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/source' }]
103
+ },
104
+ {
105
+ id: 'lead-gen.company.apollo-import',
106
+ order: 20,
107
+ label: 'Import from Apollo',
108
+ description: 'Pull companies and seed contact data from an Apollo search or list.',
109
+ scope: { domain: 'sales' },
110
+ resourceId: 'lgn-01c-apollo-import-workflow',
111
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/apollo-import' }]
112
+ },
113
+ {
114
+ id: 'lead-gen.contact.discover',
115
+ order: 30,
116
+ label: 'Discover contact emails',
117
+ description: 'Find email addresses for contacts at qualified companies.',
118
+ scope: { domain: 'sales' },
119
+ resourceId: 'lgn-04-email-discovery-workflow',
120
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/contacts/discover' }]
121
+ },
122
+ {
123
+ id: 'lead-gen.contact.verify-email',
124
+ order: 40,
125
+ label: 'Verify emails',
126
+ description: 'Check email deliverability before outreach.',
127
+ scope: { domain: 'sales' },
128
+ resourceId: 'lgn-05-email-verification-workflow',
129
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/contacts/verify-email' }]
130
+ },
131
+ {
132
+ id: 'lead-gen.company.apify-crawl',
133
+ order: 50,
134
+ label: 'Crawl websites',
135
+ description:
136
+ 'Crawl company websites via Apify and store raw page markdown in enrichmentData.websiteCrawl.pages for downstream LLM analysis.',
137
+ scope: { domain: 'sales' },
138
+ resourceId: 'lgn-02a-apify-website-crawl-workflow',
139
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/apify-crawl' }]
140
+ },
141
+ {
142
+ id: 'lead-gen.company.website-extract',
143
+ order: 60,
144
+ label: 'Extract website signals',
145
+ description: 'Scrape and analyze company websites for qualification signals.',
146
+ scope: { domain: 'sales' },
147
+ resourceId: 'lgn-02-website-extract-workflow',
148
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/website-extract' }]
149
+ },
150
+ {
151
+ id: 'lead-gen.company.qualify',
152
+ order: 70,
153
+ label: 'Qualify companies',
154
+ description: 'Score and filter companies against the ICP rubric.',
155
+ scope: { domain: 'sales' },
156
+ resourceId: 'lgn-03-company-qualification-workflow',
157
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/qualify' }]
158
+ },
159
+ {
160
+ id: 'lead-gen.company.dtc-subscription-qualify',
161
+ order: 80,
162
+ label: 'Qualify DTC subscription fit',
163
+ description: 'Classify subscription potential and consumable-product fit for DTC brands.',
164
+ scope: { domain: 'sales' },
165
+ resourceId: 'lgn-03b-dtc-subscription-score-workflow',
166
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/dtc-subscription-qualify' }]
167
+ },
168
+ {
169
+ id: 'lead-gen.contact.apollo-decision-maker-enrich',
170
+ order: 90,
171
+ label: 'Enrich decision-makers',
172
+ description: 'Find and enrich qualified contacts at qualified companies via Apollo.',
173
+ scope: { domain: 'sales' },
174
+ resourceId: 'lgn-04b-apollo-decision-maker-enrich-workflow',
175
+ invocations: [
176
+ { kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/contacts/apollo-decision-maker-enrich' }
177
+ ]
178
+ },
179
+ {
180
+ id: 'lead-gen.contact.personalize',
181
+ order: 100,
182
+ label: 'Personalize outreach',
183
+ description: 'Generate personalized opening lines for each contact.',
184
+ scope: { domain: 'sales' },
185
+ resourceId: 'ist-personalization-workflow',
186
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/contacts/personalize' }]
187
+ },
188
+ {
189
+ id: 'lead-gen.review.outreach-ready',
190
+ order: 110,
191
+ label: 'Upload to outreach',
192
+ description: 'Upload approved contacts to the outreach sequence after QC review.',
193
+ scope: { domain: 'sales' },
194
+ resourceId: 'ist-upload-contacts-workflow',
195
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/review/outreach-ready' }]
196
+ },
197
+ {
198
+ id: 'lead-gen.export.list',
199
+ order: 120,
200
+ label: 'Export lead list',
201
+ description: 'Export approved leads as a downloadable lead list.',
202
+ scope: { domain: 'sales' },
203
+ resourceId: 'lgn-06-export-list-workflow',
204
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/export/list' }]
205
+ },
206
+ {
207
+ id: 'lead-gen.company.cleanup',
208
+ order: 130,
209
+ label: 'Clean up companies',
210
+ description: 'Remove disqualified or duplicate companies from the list.',
211
+ scope: { domain: 'sales' },
212
+ resourceId: 'lgn-company-cleanup-workflow',
213
+ invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/cleanup' }]
214
+ }
215
+ ]
216
+
217
+ export const LEAD_GEN_ACTION_ENTRIES: Record<string, z.infer<typeof ActionSchema>> = Object.fromEntries(
218
+ LEAD_GEN_ACTION_ENTRY_INPUTS.map((action) => {
219
+ const parsed = ActionSchema.parse(action)
220
+ return [parsed.id, parsed]
221
+ })
222
+ )
223
+
224
+ const CRM_ACTION_ENTRY_INPUTS: z.input<typeof ActionSchema>[] = [
225
+ {
226
+ id: 'send_reply',
227
+ order: 210,
228
+ label: 'Send Reply',
229
+ description: 'Send a contextual reply for an active CRM deal.',
230
+ scope: { domain: 'sales' },
231
+ resourceId: 'crm-send-reply-workflow',
232
+ affects: ['crm.deal']
233
+ },
234
+ {
235
+ id: 'send_link',
236
+ order: 220,
237
+ label: 'Send Booking Link',
238
+ description: 'Send a booking link to move a deal toward a scheduled call.',
239
+ scope: { domain: 'sales' },
240
+ resourceId: 'crm-send-booking-link-workflow',
241
+ affects: ['crm.deal']
242
+ },
243
+ {
244
+ id: 'send_nudge',
245
+ order: 230,
246
+ label: 'Send Nudge',
247
+ description: 'Send a follow-up nudge for a stalled CRM deal.',
248
+ scope: { domain: 'sales' },
249
+ resourceId: 'crm-send-nudge-workflow',
250
+ affects: ['crm.deal']
251
+ },
252
+ {
253
+ id: 'rebook',
254
+ order: 240,
255
+ label: 'Rebook',
256
+ description: 'Rebook a missed or rescheduled CRM appointment.',
257
+ scope: { domain: 'sales' },
258
+ resourceId: 'crm-rebook-workflow',
259
+ affects: ['crm.deal']
260
+ },
261
+ {
262
+ id: 'move_to_proposal',
263
+ order: 250,
264
+ label: 'Move to Proposal',
265
+ description: 'Advance a qualified CRM deal into the proposal stage.',
266
+ scope: { domain: 'sales' },
267
+ resourceId: 'move_to_proposal-workflow',
268
+ affects: ['crm.deal']
269
+ },
270
+ {
271
+ id: 'move_to_closing',
272
+ order: 260,
273
+ label: 'Move to Closing',
274
+ description: 'Advance a proposal-stage CRM deal into closing.',
275
+ scope: { domain: 'sales' },
276
+ resourceId: 'move_to_closing-workflow',
277
+ affects: ['crm.deal']
278
+ },
279
+ {
280
+ id: 'move_to_closed_won',
281
+ order: 270,
282
+ label: 'Close Won',
283
+ description: 'Mark a CRM deal as closed won.',
284
+ scope: { domain: 'sales' },
285
+ resourceId: 'move_to_closed_won-workflow',
286
+ affects: ['crm.deal']
287
+ },
288
+ {
289
+ id: 'move_to_closed_lost',
290
+ order: 280,
291
+ label: 'Close Lost',
292
+ description: 'Mark a CRM deal as closed lost.',
293
+ scope: { domain: 'sales' },
294
+ resourceId: 'move_to_closed_lost-workflow',
295
+ affects: ['crm.deal']
296
+ },
297
+ {
298
+ id: 'move_to_nurturing',
299
+ order: 290,
300
+ label: 'Move to Nurturing',
301
+ description: 'Move a CRM deal into nurturing for future follow-up.',
302
+ scope: { domain: 'sales' },
303
+ resourceId: 'move_to_nurturing-workflow',
304
+ affects: ['crm.deal']
305
+ }
306
+ ]
307
+
308
+ export const CRM_ACTION_ENTRIES: Record<string, z.infer<typeof ActionSchema>> = Object.fromEntries(
309
+ CRM_ACTION_ENTRY_INPUTS.map((action) => {
310
+ const parsed = ActionSchema.parse(action)
311
+ return [parsed.id, parsed]
312
+ })
313
+ )
314
+
315
+ export const DEFAULT_ORGANIZATION_MODEL_ACTIONS: z.infer<typeof ActionsDomainSchema> = {
316
+ ...LEAD_GEN_ACTION_ENTRIES,
317
+ ...CRM_ACTION_ENTRIES
318
+ }
319
+
320
+ export function findOrganizationActionById(
321
+ id: string,
322
+ actions: z.infer<typeof ActionsDomainSchema> = DEFAULT_ORGANIZATION_MODEL_ACTIONS
323
+ ): z.infer<typeof ActionSchema> | undefined {
324
+ return actions[id]
325
+ }
326
+
327
+ export type ActionId = z.infer<typeof ActionIdSchema>
328
+ export type ActionScope = z.infer<typeof ActionScopeSchema>
329
+ export type ActionRef = z.infer<typeof ActionRefSchema>
330
+ export type ActionInvocationKind = z.infer<typeof ActionInvocationKindSchema>
331
+ export type ActionInvocation = z.infer<typeof ActionInvocationSchema>
332
+ export type Action = z.infer<typeof ActionSchema>
333
+ export type ActionsDomain = z.infer<typeof ActionsDomainSchema>
@@ -30,6 +30,8 @@ export const FirmographicsSchema = z.object({
30
30
  export const CustomerSegmentSchema = z.object({
31
31
  /** Stable unique identifier for the segment (e.g. "segment-smb-agencies"). */
32
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(),
33
35
  /** Human-readable name shown to agents and in UI (e.g. "SMB Marketing Agencies"). */
34
36
  name: z.string().trim().max(200).default(''),
35
37
  /** One or two sentences describing who this segment is. */
@@ -59,17 +61,18 @@ export const CustomerSegmentSchema = z.object({
59
61
  })
60
62
 
61
63
  // ---------------------------------------------------------------------------
62
- // Customers domain schema — a collection of customer segments.
64
+ // Customers domain schema — id-keyed map of customer segments.
63
65
  // ---------------------------------------------------------------------------
64
66
 
65
- export const CustomersDomainSchema = z.object({
66
- segments: z.array(CustomerSegmentSchema).default([])
67
- })
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({})
68
73
 
69
74
  // ---------------------------------------------------------------------------
70
75
  // Seed — empty by default; adapters populate with real segment definitions.
71
76
  // ---------------------------------------------------------------------------
72
77
 
73
- export const DEFAULT_ORGANIZATION_MODEL_CUSTOMERS: z.infer<typeof CustomersDomainSchema> = {
74
- segments: []
75
- }
78
+ export const DEFAULT_ORGANIZATION_MODEL_CUSTOMERS: z.infer<typeof CustomersDomainSchema> = {}
@@ -0,0 +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>
@@ -43,6 +43,8 @@ const ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/
43
43
  export const ObjectiveSchema = z.object({
44
44
  /** Stable unique identifier for the goal (e.g. "goal-grow-arr-q1-2026"). */
45
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(),
46
48
  /** Plain-language description of what the organization wants to achieve. */
47
49
  description: z.string().trim().min(1).max(1000),
48
50
  /**
@@ -67,14 +69,15 @@ export const ObjectiveSchema = z.object({
67
69
  // Goals domain schema — a collection of goals the organization is pursuing.
68
70
  // ---------------------------------------------------------------------------
69
71
 
70
- export const GoalsDomainSchema = z.object({
71
- objectives: z.array(ObjectiveSchema).default([])
72
- })
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({})
73
78
 
74
79
  // ---------------------------------------------------------------------------
75
80
  // Seed — empty by default; adapters populate with real goal definitions.
76
81
  // ---------------------------------------------------------------------------
77
82
 
78
- export const DEFAULT_ORGANIZATION_MODEL_GOALS: z.infer<typeof GoalsDomainSchema> = {
79
- objectives: []
80
- }
83
+ export const DEFAULT_ORGANIZATION_MODEL_GOALS: z.infer<typeof GoalsDomainSchema> = {}