@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,144 +1,144 @@
1
- // ============================================================================
2
- // Lead-Gen Stage Catalog (OM Spine processing-state model)
3
- //
4
- // Canonical set of processing stage keys for acq_companies.processing_state and
5
- // acq_contacts.processing_state. These keys coordinate build templates, workflow
6
- // factory validation, API filters, and UI progress projections.
7
- //
8
- // State is sparse: absent keys mean "not attempted"; present keys hold terminal
9
- // status entries such as success, no_result, skipped, or error.
10
- //
11
- // Historical sources:
12
- // ACQ_LIST_MEMBERS_LEAD_GEN_PIPELINE -> personalized, uploaded, interested,
13
- // discovered, verified
14
- // ACQ_LIST_COMPANIES_LEAD_GEN_PIPELINE -> populated, extracted, qualified
15
- // Design plan hint (lead-gen-domain-cleanup.mdx section 4) -> scraped, enriched
16
- //
17
- // ============================================================================
18
-
19
- /** One entry in the lead-gen stage catalog. */
20
- export interface LeadGenStageCatalogEntry {
21
- /** Matches the status key written into processing_state jsonb (e.g. 'scraped'). */
22
- key: string
23
- /** Human-readable label for UI display. */
24
- label: string
25
- /** Short description of what this stage represents. */
26
- description: string
27
- /** Canonical pipeline order for UI sorting. Lower = earlier in the funnel. */
28
- order: number
29
- /** Which entity's processing_state jsonb carries this stage status. */
30
- entity: 'company' | 'contact'
31
- /** Additional entities allowed to write/read this processing_state key. */
32
- additionalEntities?: Array<'company' | 'contact'>
33
- /**
34
- * Optional read-side override for Records views when a company-scoped step
35
- * produces records on a different entity.
36
- */
37
- recordEntity?: 'company' | 'contact'
38
- /** Stage key to read from recordEntity.processing_state for Records views. */
39
- recordStageKey?: string
40
- }
41
-
42
- /**
43
- * Canonical lead-gen processing stage catalog.
44
- * Keys are the stage names written by workflow steps into processing_state jsonb.
45
- *
46
- * Ordered roughly by pipeline progression (prospecting -> outreach -> qualification).
47
- */
48
- export const LEAD_GEN_STAGE_CATALOG: Record<string, LeadGenStageCatalogEntry> = {
49
- // Prospecting - company population
50
- scraped: {
51
- key: 'scraped',
52
- label: 'Scraped',
53
- description: 'Company was scraped from a source directory (Apify actor run).',
54
- order: 1,
55
- entity: 'company'
56
- },
57
- populated: {
58
- key: 'populated',
59
- label: 'Companies found',
60
- description: 'Companies have been found and added to the lead-gen list.',
61
- order: 2,
62
- entity: 'company'
63
- },
64
- crawled: {
65
- key: 'crawled',
66
- label: 'Websites crawled',
67
- description:
68
- 'Company websites have been crawled (e.g. via Apify) and raw page content stored for downstream LLM analysis.',
69
- order: 2.5,
70
- entity: 'company'
71
- },
72
- extracted: {
73
- key: 'extracted',
74
- label: 'Websites analyzed',
75
- description: 'Company websites have been analyzed for business signals.',
76
- order: 3,
77
- entity: 'company'
78
- },
79
- enriched: {
80
- key: 'enriched',
81
- label: 'Enriched',
82
- description: 'Company or contact enriched with third-party data (e.g. Tomba, Anymailfinder).',
83
- order: 4,
84
- entity: 'company'
85
- },
86
- 'decision-makers-enriched': {
87
- key: 'decision-makers-enriched',
88
- label: 'Decision-makers found',
89
- description: 'Decision-maker contacts discovered and attached to a qualified company.',
90
- order: 6,
91
- entity: 'company',
92
- recordEntity: 'contact',
93
- recordStageKey: 'discovered'
94
- },
95
-
96
- // Prospecting - contact discovery
97
- discovered: {
98
- key: 'discovered',
99
- label: 'Decision-makers found',
100
- description: 'Decision-maker contact details have been found.',
101
- order: 5,
102
- entity: 'contact'
103
- },
104
- verified: {
105
- key: 'verified',
106
- label: 'Emails verified',
107
- description: 'Contact email addresses have been checked for deliverability.',
108
- order: 7,
109
- entity: 'contact'
110
- },
111
-
112
- // Qualification
113
- qualified: {
114
- key: 'qualified',
115
- label: 'Companies qualified',
116
- description: 'Companies have been scored against the qualification criteria.',
117
- order: 8,
118
- entity: 'company'
119
- },
120
-
121
- // Outreach
122
- personalized: {
123
- key: 'personalized',
124
- label: 'Personalized',
125
- description: 'Outreach message personalized for the contact (Instantly personalization workflow).',
126
- order: 9,
127
- entity: 'contact'
128
- },
129
- uploaded: {
130
- key: 'uploaded',
131
- label: 'Reviewed and exported',
132
- description: 'Approved records have been reviewed and exported for handoff.',
133
- order: 10,
134
- entity: 'company',
135
- additionalEntities: ['contact']
136
- },
137
- interested: {
138
- key: 'interested',
139
- label: 'Interested',
140
- description: 'Contact replied with a positive signal (Instantly reply-handler transition).',
141
- order: 11,
142
- entity: 'contact'
143
- }
144
- }
1
+ // ============================================================================
2
+ // Lead-Gen Stage Catalog (OM Spine processing-state model)
3
+ //
4
+ // Canonical set of processing stage keys for acq_companies.processing_state and
5
+ // acq_contacts.processing_state. These keys coordinate build templates, workflow
6
+ // factory validation, API filters, and UI progress projections.
7
+ //
8
+ // State is sparse: absent keys mean "not attempted"; present keys hold terminal
9
+ // status entries such as success, no_result, skipped, or error.
10
+ //
11
+ // Historical sources:
12
+ // ACQ_LIST_MEMBERS_LEAD_GEN_PIPELINE -> personalized, uploaded, interested,
13
+ // discovered, verified
14
+ // ACQ_LIST_COMPANIES_LEAD_GEN_PIPELINE -> populated, extracted, qualified
15
+ // Design plan hint (lead-gen-domain-cleanup.mdx section 4) -> scraped, enriched
16
+ //
17
+ // ============================================================================
18
+
19
+ /** One entry in the lead-gen stage catalog. */
20
+ export interface LeadGenStageCatalogEntry {
21
+ /** Matches the status key written into processing_state jsonb (e.g. 'scraped'). */
22
+ key: string
23
+ /** Human-readable label for UI display. */
24
+ label: string
25
+ /** Short description of what this stage represents. */
26
+ description: string
27
+ /** Canonical pipeline order for UI sorting. Lower = earlier in the funnel. */
28
+ order: number
29
+ /** Which entity's processing_state jsonb carries this stage status. */
30
+ entity: 'company' | 'contact'
31
+ /** Additional entities allowed to write/read this processing_state key. */
32
+ additionalEntities?: Array<'company' | 'contact'>
33
+ /**
34
+ * Optional read-side override for Records views when a company-scoped step
35
+ * produces records on a different entity.
36
+ */
37
+ recordEntity?: 'company' | 'contact'
38
+ /** Stage key to read from recordEntity.processing_state for Records views. */
39
+ recordStageKey?: string
40
+ }
41
+
42
+ /**
43
+ * Canonical lead-gen processing stage catalog.
44
+ * Keys are the stage names written by workflow steps into processing_state jsonb.
45
+ *
46
+ * Ordered roughly by pipeline progression (prospecting -> outreach -> qualification).
47
+ */
48
+ export const LEAD_GEN_STAGE_CATALOG: Record<string, LeadGenStageCatalogEntry> = {
49
+ // Prospecting - company population
50
+ scraped: {
51
+ key: 'scraped',
52
+ label: 'Scraped',
53
+ description: 'Company was scraped from a source directory (Apify actor run).',
54
+ order: 1,
55
+ entity: 'company'
56
+ },
57
+ populated: {
58
+ key: 'populated',
59
+ label: 'Companies found',
60
+ description: 'Companies have been found and added to the lead-gen list.',
61
+ order: 2,
62
+ entity: 'company'
63
+ },
64
+ crawled: {
65
+ key: 'crawled',
66
+ label: 'Websites crawled',
67
+ description:
68
+ 'Company websites have been crawled (e.g. via Apify) and raw page content stored for downstream LLM analysis.',
69
+ order: 2.5,
70
+ entity: 'company'
71
+ },
72
+ extracted: {
73
+ key: 'extracted',
74
+ label: 'Websites analyzed',
75
+ description: 'Company websites have been analyzed for business signals.',
76
+ order: 3,
77
+ entity: 'company'
78
+ },
79
+ enriched: {
80
+ key: 'enriched',
81
+ label: 'Enriched',
82
+ description: 'Company or contact enriched with third-party data (e.g. Tomba, Anymailfinder).',
83
+ order: 4,
84
+ entity: 'company'
85
+ },
86
+ 'decision-makers-enriched': {
87
+ key: 'decision-makers-enriched',
88
+ label: 'Decision-makers found',
89
+ description: 'Decision-maker contacts discovered and attached to a qualified company.',
90
+ order: 6,
91
+ entity: 'company',
92
+ recordEntity: 'contact',
93
+ recordStageKey: 'discovered'
94
+ },
95
+
96
+ // Prospecting - contact discovery
97
+ discovered: {
98
+ key: 'discovered',
99
+ label: 'Decision-makers found',
100
+ description: 'Decision-maker contact details have been found.',
101
+ order: 5,
102
+ entity: 'contact'
103
+ },
104
+ verified: {
105
+ key: 'verified',
106
+ label: 'Emails verified',
107
+ description: 'Contact email addresses have been checked for deliverability.',
108
+ order: 7,
109
+ entity: 'contact'
110
+ },
111
+
112
+ // Qualification
113
+ qualified: {
114
+ key: 'qualified',
115
+ label: 'Companies qualified',
116
+ description: 'Companies have been scored against the qualification criteria.',
117
+ order: 8,
118
+ entity: 'company'
119
+ },
120
+
121
+ // Outreach
122
+ personalized: {
123
+ key: 'personalized',
124
+ label: 'Personalized',
125
+ description: 'Outreach message personalized for the contact (Instantly personalization workflow).',
126
+ order: 9,
127
+ entity: 'contact'
128
+ },
129
+ uploaded: {
130
+ key: 'uploaded',
131
+ label: 'Reviewed and exported',
132
+ description: 'Approved records have been reviewed and exported for handoff.',
133
+ order: 10,
134
+ entity: 'company',
135
+ additionalEntities: ['contact']
136
+ },
137
+ interested: {
138
+ key: 'interested',
139
+ label: 'Interested',
140
+ description: 'Contact replied with a positive signal (Instantly reply-handler transition).',
141
+ order: 11,
142
+ entity: 'contact'
143
+ }
144
+ }
@@ -1,36 +1,36 @@
1
- import { z } from 'zod'
2
- import { defineContentType } from './registry'
3
-
4
- // ---------------------------------------------------------------------------
5
- // config kinds (Phase 3, Wave 2A)
6
- // ---------------------------------------------------------------------------
7
- //
8
- // `config:kv` — a flat key-value configuration store co-located with a system.
9
- // Per L15: single starter config type; feature-flag semantics are
10
- // a usage pattern over kv, not a separate type.
11
- //
12
- // Per L15: `config` is a first-class registered meta-kind. Scope: NEW
13
- // tenant-defined settings co-located with a system. Strongly-typed platform
14
- // fields (system.ui.devOnly, system.ui.requiresAdmin, etc.) stay where they
15
- // are and are NOT hoisting destinations for existing typed fields.
16
-
17
- const ConfigKvPayloadSchema = z.object({
18
- /**
19
- * Flat key-value entries. Values are JSON primitives.
20
- * Keys are short identifiers (e.g. 'maxBatchSize', 'featureEnabled').
21
- */
22
- entries: z
23
- .record(z.string().trim().min(1).max(200), z.union([z.string(), z.number(), z.boolean(), z.null()]))
24
- .meta({ label: 'Entries', hint: 'Key-value configuration entries (string, number, boolean, or null values)' })
25
- })
26
-
27
- export type ConfigKvPayload = z.infer<typeof ConfigKvPayloadSchema>
28
-
29
- export const configKvKind = defineContentType({
30
- kind: 'config',
31
- type: 'kv',
32
- label: 'Key-Value Config',
33
- description: 'A flat key-value configuration store co-located with a system. Values are JSON primitives.',
34
- payloadSchema: ConfigKvPayloadSchema,
35
- parentTypes: []
36
- })
1
+ import { z } from 'zod'
2
+ import { defineContentType } from './registry'
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // config kinds (Phase 3, Wave 2A)
6
+ // ---------------------------------------------------------------------------
7
+ //
8
+ // `config:kv` — a flat key-value configuration store co-located with a system.
9
+ // Per L15: single starter config type; feature-flag semantics are
10
+ // a usage pattern over kv, not a separate type.
11
+ //
12
+ // Per L15: `config` is a first-class registered meta-kind. Scope: NEW
13
+ // tenant-defined settings co-located with a system. Strongly-typed platform
14
+ // fields (system.ui.devOnly, system.ui.requiresAdmin, etc.) stay where they
15
+ // are and are NOT hoisting destinations for existing typed fields.
16
+
17
+ const ConfigKvPayloadSchema = z.object({
18
+ /**
19
+ * Flat key-value entries. Values are JSON primitives.
20
+ * Keys are short identifiers (e.g. 'maxBatchSize', 'featureEnabled').
21
+ */
22
+ entries: z
23
+ .record(z.string().trim().min(1).max(200), z.union([z.string(), z.number(), z.boolean(), z.null()]))
24
+ .meta({ label: 'Entries', hint: 'Key-value configuration entries (string, number, boolean, or null values)' })
25
+ })
26
+
27
+ export type ConfigKvPayload = z.infer<typeof ConfigKvPayloadSchema>
28
+
29
+ export const configKvKind = defineContentType({
30
+ kind: 'config',
31
+ type: 'kv',
32
+ label: 'Key-Value Config',
33
+ description: 'A flat key-value configuration store co-located with a system. Values are JSON primitives.',
34
+ payloadSchema: ConfigKvPayloadSchema,
35
+ parentTypes: []
36
+ })
@@ -1,74 +1,78 @@
1
- // ---------------------------------------------------------------------------
2
- // content-kinds barrel (Phase 3, Wave 2A)
3
- // ---------------------------------------------------------------------------
4
- //
5
- // Per D8 (locked): CONTENT_KIND_REGISTRY is populated via static import, not
6
- // side-effecting registration. This file is the single source of truth for
7
- // the populated registry. `registry.ts` exports the EMPTY registry constant
8
- // (kept for historical/import-chain reasons) — consumers MUST import from
9
- // this barrel, not from `registry.ts` directly, to get the populated registry.
10
- //
11
- // Registry keys follow the `<kind>:<type>` ContentTypeKey format (per L4, D8).
12
-
13
- export { defineContentType } from './registry'
14
- export type { ContentTypeKey, ContentTypeDefinition } from './types'
15
- export { ContentNodeBaseSchema, ContentNodeSchema, ExtensionNodeSchema } from './types'
16
- export type { ContentNodeBase, ContentNode, ExtensionNode } from './types'
17
-
18
- export { pipelineKind, stageKind } from './pipeline'
19
- export type { PipelinePayload, StagePayload } from './pipeline'
20
-
21
- export { templateKind, templateStepKind } from './template'
22
- export type { TemplatePayload, TemplateStepPayload } from './template'
23
-
24
- export { statusFlowKind, statusKind } from './status'
25
- export type { StatusFlowPayload, StatusPayload } from './status'
26
-
27
- export { configKvKind } from './config'
28
- export type { ConfigKvPayload } from './config'
29
-
30
- import { pipelineKind, stageKind } from './pipeline'
31
- import { templateKind, templateStepKind } from './template'
32
- import { statusFlowKind, statusKind } from './status'
33
- import { configKvKind } from './config'
34
- import type { ContentTypeDefinition, ContentTypeKey } from './types'
35
-
36
- /**
37
- * The populated content-kind registry for all platform-shipped kinds.
38
- * Per D8: static const object keyed by `'<kind>:<type>'` composite key.
1
+ // ---------------------------------------------------------------------------
2
+ // content-kinds barrel (Phase 3, Wave 2A)
3
+ // ---------------------------------------------------------------------------
4
+ //
5
+ // Per D8 (locked): CONTENT_KIND_REGISTRY is populated via static import, not
6
+ // side-effecting registration. This file is the single source of truth for
7
+ // the populated registry. `registry.ts` exports the EMPTY registry constant
8
+ // (kept for historical/import-chain reasons) — consumers MUST import from
9
+ // this barrel, not from `registry.ts` directly, to get the populated registry.
10
+ //
11
+ // Registry keys follow the `<kind>:<type>` ContentTypeKey format (per L4, D8).
12
+
13
+ export { defineContentType } from './registry'
14
+ export type { ContentTypeKey, ContentTypeDefinition } from './types'
15
+ export { ContentNodeBaseSchema, ContentNodeSchema, ExtensionNodeSchema } from './types'
16
+ export type { ContentNodeBase, ContentNode, ExtensionNode } from './types'
17
+
18
+ export { pipelineKind, stageKind } from './pipeline'
19
+ export type { PipelinePayload, StagePayload } from './pipeline'
20
+
21
+ export { templateKind, templateStepKind } from './template'
22
+ export type { TemplatePayload, TemplateStepPayload } from './template'
23
+
24
+ export { statusFlowKind, statusKind } from './status'
25
+ export type { StatusFlowPayload, StatusPayload } from './status'
26
+
27
+ export { configKvKind } from './config'
28
+ export type { ConfigKvPayload } from './config'
29
+
30
+ import { pipelineKind, stageKind } from './pipeline'
31
+ import { templateKind, templateStepKind } from './template'
32
+ import { statusFlowKind, statusKind } from './status'
33
+ import { configKvKind } from './config'
34
+ import type { ContentTypeDefinition, ContentTypeKey } from './types'
35
+
36
+ /**
37
+ * Compatibility registry for bridge-era System.content nodes.
38
+ * New schema/catalog authoring should use System.ontology, and new
39
+ * system-local settings should use System.config. These definitions remain so
40
+ * old tenant content can parse, render, migrate, and project read-only.
39
41
  *
40
- * Keys:
41
- * 'schema:pipeline' — pipeline applying to an entity type
42
- * 'schema:stage' — stage within a pipeline (parentTypes: ['schema:pipeline'])
43
- * 'schema:template' — named build template
44
- * 'schema:template-step' — step within a template (parentTypes: ['schema:template'])
45
- * 'schema:status-flow' — status set for a project/milestone/task scope
46
- * 'schema:status' — single status within a flow (parentTypes: ['schema:status-flow'])
47
- * 'config:kv' — flat key-value config store co-located with a system
42
+ * Per D8: static const object keyed by `'<kind>:<type>'` composite key.
48
43
  *
49
- * Wave 3A's `ContentNodeDescribeView` consumes `lookupContentType(kind, type)`
50
- * which indexes into this registry. Import `lookupContentType` from this barrel
51
- * to get the populated version.
52
- */
53
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
- export const CONTENT_KIND_REGISTRY: Readonly<Record<ContentTypeKey, ContentTypeDefinition<any>>> = {
55
- 'schema:pipeline': pipelineKind,
56
- 'schema:stage': stageKind,
57
- 'schema:template': templateKind,
58
- 'schema:template-step': templateStepKind,
59
- 'schema:status-flow': statusFlowKind,
60
- 'schema:status': statusKind,
61
- 'config:kv': configKvKind
62
- } as const
63
-
64
- /**
65
- * Look up a registered content-type definition by (kind, type).
66
- * Uses the populated CONTENT_KIND_REGISTRY from this barrel — wave 2A override
67
- * of the empty registry exported from registry.ts.
68
- * Returns `undefined` when the pair is not registered — per D2, this is not
69
- * an error; unregistered pairs render generically and skip payload validation.
70
- */
71
- export function lookupContentType(kind: string, type: string): ContentTypeDefinition | undefined {
72
- const key: ContentTypeKey = `${kind}:${type}`
73
- return CONTENT_KIND_REGISTRY[key]
74
- }
44
+ * Bridge keys:
45
+ * 'schema:pipeline' — projects to ontology catalog records
46
+ * 'schema:stage' — projects to ontology catalog entries
47
+ * 'schema:template' — projects to ontology/catalog or action metadata
48
+ * 'schema:template-step' — projects to template metadata or catalog entries
49
+ * 'schema:status-flow' — projects to ontology catalog records
50
+ * 'schema:status' projects to ontology catalog entries
51
+ * 'config:kv' projects into resolved System.config
52
+ *
53
+ * Wave 3A's `ContentNodeDescribeView` consumes `lookupContentType(kind, type)`
54
+ * which indexes into this registry. Import `lookupContentType` from this barrel
55
+ * to get the populated version.
56
+ */
57
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
+ export const CONTENT_KIND_REGISTRY: Readonly<Record<ContentTypeKey, ContentTypeDefinition<any>>> = {
59
+ 'schema:pipeline': pipelineKind,
60
+ 'schema:stage': stageKind,
61
+ 'schema:template': templateKind,
62
+ 'schema:template-step': templateStepKind,
63
+ 'schema:status-flow': statusFlowKind,
64
+ 'schema:status': statusKind,
65
+ 'config:kv': configKvKind
66
+ } as const
67
+
68
+ /**
69
+ * Look up a registered content-type definition by (kind, type).
70
+ * Uses the populated CONTENT_KIND_REGISTRY from this barrel — wave 2A override
71
+ * of the empty registry exported from registry.ts.
72
+ * Returns `undefined` when the pair is not registered — per D2, this is not
73
+ * an error; unregistered pairs render generically and skip payload validation.
74
+ */
75
+ export function lookupContentType(kind: string, type: string): ContentTypeDefinition | undefined {
76
+ const key: ContentTypeKey = `${kind}:${type}`
77
+ return CONTENT_KIND_REGISTRY[key]
78
+ }
@@ -1,68 +1,68 @@
1
- import { z } from 'zod'
2
- import { defineContentType } from './registry'
3
-
4
- // ---------------------------------------------------------------------------
5
- // pipeline + stage kinds (Phase 3, Wave 2A)
6
- // ---------------------------------------------------------------------------
7
- //
8
- // `schema:pipeline` — a named pipeline that applies to an entity type.
9
- // `schema:stage` — a stage within a pipeline; parentTypes constrains it to
10
- // live under a `schema:pipeline` sibling.
11
- //
12
- // Per L19: `schema:stage` parents only under `schema:pipeline`.
13
- // Per L19 (parent kind constraint): both share the same meta-kind `schema`.
14
-
15
- const PipelinePayloadSchema = z.object({
16
- /**
17
- * Local NodeId of the entity this pipeline applies to (e.g. 'crm.deal').
18
- * `.meta({ ref: 'entity' })` enables SchemaDrivenFieldList to render a
19
- * clickable graph link to the referenced entity node.
20
- */
21
- entityId: z
22
- .string()
23
- .trim()
24
- .min(1)
25
- .max(200)
26
- .meta({ label: 'Entity', ref: 'entity', hint: 'The entity type this pipeline tracks' }),
27
- /**
28
- * Optional Kanban column color token for UI rendering.
29
- */
30
- kanbanColor: z.string().trim().min(1).max(40).optional().meta({ label: 'Kanban color', hint: 'UI color token' })
31
- })
32
-
33
- export type PipelinePayload = z.infer<typeof PipelinePayloadSchema>
34
-
35
- export const pipelineKind = defineContentType({
36
- kind: 'schema',
37
- type: 'pipeline',
38
- label: 'Pipeline',
39
- description: 'A named progression pipeline that applies to a specific entity type.',
40
- payloadSchema: PipelinePayloadSchema,
41
- parentTypes: []
42
- })
43
-
44
- // ---------------------------------------------------------------------------
45
-
46
- const StagePayloadSchema = z.object({
47
- /**
48
- * Semantic classification for this stage.
49
- * Drives color, icon, and CRM-priority logic in consuming views.
50
- * Optional — prospecting stages use data.entityKind instead.
51
- * Enum aligned with SalesStageSemanticClassSchema (sales.ts).
52
- */
53
- semanticClass: z
54
- .enum(['open', 'active', 'nurturing', 'closed_won', 'closed_lost', 'won', 'lost', 'closed'])
55
- .optional()
56
- .meta({ label: 'Semantic class', hint: 'Semantic meaning of this stage', color: 'blue' })
57
- })
58
-
59
- export type StagePayload = z.infer<typeof StagePayloadSchema>
60
-
61
- export const stageKind = defineContentType({
62
- kind: 'schema',
63
- type: 'stage',
64
- label: 'Stage',
65
- description: 'A stage within a pipeline. Must be parented under a schema:pipeline content node.',
66
- payloadSchema: StagePayloadSchema,
67
- parentTypes: ['schema:pipeline']
68
- })
1
+ import { z } from 'zod'
2
+ import { defineContentType } from './registry'
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // pipeline + stage kinds (Phase 3, Wave 2A)
6
+ // ---------------------------------------------------------------------------
7
+ //
8
+ // `schema:pipeline` — a named pipeline that applies to an entity type.
9
+ // `schema:stage` — a stage within a pipeline; parentTypes constrains it to
10
+ // live under a `schema:pipeline` sibling.
11
+ //
12
+ // Per L19: `schema:stage` parents only under `schema:pipeline`.
13
+ // Per L19 (parent kind constraint): both share the same meta-kind `schema`.
14
+
15
+ const PipelinePayloadSchema = z.object({
16
+ /**
17
+ * Local NodeId of the entity this pipeline applies to (e.g. 'crm.deal').
18
+ * `.meta({ ref: 'entity' })` enables SchemaDrivenFieldList to render a
19
+ * clickable graph link to the referenced entity node.
20
+ */
21
+ entityId: z
22
+ .string()
23
+ .trim()
24
+ .min(1)
25
+ .max(200)
26
+ .meta({ label: 'Entity', ref: 'entity', hint: 'The entity type this pipeline tracks' }),
27
+ /**
28
+ * Optional Kanban column color token for UI rendering.
29
+ */
30
+ kanbanColor: z.string().trim().min(1).max(40).optional().meta({ label: 'Kanban color', hint: 'UI color token' })
31
+ })
32
+
33
+ export type PipelinePayload = z.infer<typeof PipelinePayloadSchema>
34
+
35
+ export const pipelineKind = defineContentType({
36
+ kind: 'schema',
37
+ type: 'pipeline',
38
+ label: 'Pipeline',
39
+ description: 'A named progression pipeline that applies to a specific entity type.',
40
+ payloadSchema: PipelinePayloadSchema,
41
+ parentTypes: []
42
+ })
43
+
44
+ // ---------------------------------------------------------------------------
45
+
46
+ const StagePayloadSchema = z.object({
47
+ /**
48
+ * Semantic classification for this stage.
49
+ * Drives color, icon, and CRM-priority logic in consuming views.
50
+ * Optional — prospecting stages use data.entityKind instead.
51
+ * Enum aligned with SalesStageSemanticClassSchema (sales.ts).
52
+ */
53
+ semanticClass: z
54
+ .enum(['open', 'active', 'nurturing', 'closed_won', 'closed_lost', 'won', 'lost', 'closed'])
55
+ .optional()
56
+ .meta({ label: 'Semantic class', hint: 'Semantic meaning of this stage', color: 'blue' })
57
+ })
58
+
59
+ export type StagePayload = z.infer<typeof StagePayloadSchema>
60
+
61
+ export const stageKind = defineContentType({
62
+ kind: 'schema',
63
+ type: 'stage',
64
+ label: 'Stage',
65
+ description: 'A stage within a pipeline. Must be parented under a schema:pipeline content node.',
66
+ payloadSchema: StagePayloadSchema,
67
+ parentTypes: ['schema:pipeline']
68
+ })