@elevasis/core 0.23.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.
- package/dist/index.d.ts +1326 -552
- package/dist/index.js +869 -154
- package/dist/knowledge/index.d.ts +487 -209
- package/dist/knowledge/index.js +104 -1
- package/dist/organization-model/index.d.ts +1326 -552
- package/dist/organization-model/index.js +869 -154
- package/dist/test-utils/index.d.ts +357 -72
- package/dist/test-utils/index.js +795 -142
- package/package.json +5 -5
- package/src/README.md +14 -14
- package/src/__tests__/publish.test.ts +24 -24
- package/src/__tests__/template-core-compatibility.test.ts +9 -12
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +2102 -2096
- package/src/_gen/__tests__/scaffold-contracts.test.ts +30 -30
- package/src/auth/multi-tenancy/credentials/__tests__/encryption.test.ts +217 -217
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +69 -69
- package/src/auth/multi-tenancy/credentials/server/kek-loader.ts +37 -37
- package/src/auth/multi-tenancy/index.ts +26 -26
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +104 -104
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +143 -143
- package/src/auth/multi-tenancy/memberships/index.ts +26 -26
- package/src/auth/multi-tenancy/memberships/membership.ts +130 -130
- package/src/auth/multi-tenancy/organizations/__tests__/api-schemas.test.ts +194 -194
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +136 -136
- package/src/auth/multi-tenancy/permissions.test.ts +42 -42
- package/src/auth/multi-tenancy/permissions.ts +123 -123
- package/src/auth/multi-tenancy/role-management/api-schemas.ts +78 -78
- package/src/auth/multi-tenancy/role-management/index.ts +16 -16
- package/src/auth/multi-tenancy/theme-presets.ts +45 -45
- package/src/auth/multi-tenancy/types.ts +57 -57
- package/src/auth/multi-tenancy/users/api-schemas.ts +165 -165
- package/src/business/README.md +2 -2
- package/src/business/acquisition/activity-events.test.ts +250 -250
- package/src/business/acquisition/activity-events.ts +93 -93
- package/src/business/acquisition/api-schemas.test.ts +1883 -1843
- package/src/business/acquisition/api-schemas.ts +1492 -1497
- package/src/business/acquisition/build-templates.test.ts +240 -240
- package/src/business/acquisition/build-templates.ts +98 -98
- package/src/business/acquisition/crm-next-action.test.ts +262 -262
- package/src/business/acquisition/crm-next-action.ts +220 -220
- package/src/business/acquisition/crm-priority.test.ts +216 -216
- package/src/business/acquisition/crm-priority.ts +349 -349
- package/src/business/acquisition/crm-state-actions.test.ts +153 -153
- package/src/business/acquisition/deal-ownership.test.ts +351 -351
- package/src/business/acquisition/deal-ownership.ts +120 -120
- package/src/business/acquisition/derive-actions.test.ts +129 -104
- package/src/business/acquisition/derive-actions.ts +74 -84
- package/src/business/acquisition/index.ts +171 -170
- package/src/business/acquisition/ontology-validation.ts +309 -0
- package/src/business/acquisition/stateful.ts +30 -30
- package/src/business/acquisition/types.ts +396 -396
- package/src/business/clients/api-schemas.test.ts +115 -115
- package/src/business/clients/api-schemas.ts +158 -158
- package/src/business/clients/index.ts +1 -1
- package/src/business/crm/api-schemas.ts +40 -40
- package/src/business/crm/index.ts +1 -1
- package/src/business/deals/api-schemas.ts +87 -87
- package/src/business/deals/index.ts +1 -1
- package/src/business/index.ts +5 -5
- package/src/business/projects/types.ts +144 -144
- package/src/commands/queue/types/task.ts +15 -15
- package/src/execution/core/runner-types.ts +61 -61
- package/src/execution/core/sse-executions.ts +7 -7
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +10 -10
- package/src/execution/engine/agent/core/__tests__/agent.test.ts +16 -16
- package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +4 -4
- package/src/execution/engine/agent/core/types.ts +25 -25
- package/src/execution/engine/agent/index.ts +6 -6
- package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +24 -24
- package/src/execution/engine/index.ts +443 -443
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +298 -298
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.test.ts +55 -55
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +107 -107
- package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.test.ts +48 -48
- package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.ts +99 -99
- package/src/execution/engine/tools/integration/server/adapters/apollo/index.ts +1 -1
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +363 -363
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +162 -162
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +316 -316
- package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.test.ts +18 -18
- package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.ts +194 -194
- package/src/execution/engine/tools/integration/server/adapters/clickup/index.ts +7 -7
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +204 -204
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +105 -105
- package/src/execution/engine/tools/integration/server/adapters/google-calendar/google-calendar-adapter.ts +428 -428
- package/src/execution/engine/tools/integration/server/adapters/google-calendar/index.ts +2 -2
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1474 -1474
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +103 -103
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.test.ts +88 -88
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +141 -141
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +76 -76
- package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-tools.ts +182 -182
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +310 -310
- package/src/execution/engine/tools/integration/service.test.ts +239 -239
- package/src/execution/engine/tools/integration/service.ts +172 -172
- package/src/execution/engine/tools/integration/tool.ts +255 -255
- package/src/execution/engine/tools/lead-service-types.ts +1005 -1005
- package/src/execution/engine/tools/messages.ts +43 -43
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +7 -7
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +6 -6
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +6 -6
- package/src/execution/engine/tools/platform/acquisition/types.ts +280 -280
- package/src/execution/engine/tools/platform/email/types.ts +97 -97
- package/src/execution/engine/tools/registry.ts +704 -704
- package/src/execution/engine/tools/tool-maps.ts +831 -831
- package/src/execution/engine/tools/types.ts +234 -234
- package/src/execution/engine/workflow/types.ts +202 -202
- package/src/execution/external/__tests__/api-schemas.test.ts +127 -127
- package/src/execution/external/api-schemas.ts +40 -40
- package/src/execution/external/index.ts +1 -1
- package/src/index.ts +18 -18
- package/src/integrations/credentials/__tests__/api-schemas.test.ts +420 -420
- package/src/integrations/credentials/api-schemas.ts +146 -146
- package/src/integrations/credentials/schemas.ts +200 -200
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +7 -7
- package/src/integrations/oauth/provider-registry.ts +74 -74
- package/src/integrations/oauth/server/credentials.ts +43 -43
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +327 -327
- package/src/integrations/webhook-endpoints/api-schemas.ts +103 -103
- package/src/integrations/webhook-endpoints/types.ts +58 -58
- package/src/knowledge/README.md +32 -32
- package/src/knowledge/__tests__/queries.test.ts +626 -535
- package/src/knowledge/format.ts +99 -99
- package/src/knowledge/index.ts +5 -5
- package/src/knowledge/published.ts +5 -5
- package/src/knowledge/queries.ts +269 -218
- package/src/operations/activities/api-schemas.ts +80 -80
- package/src/operations/activities/types.ts +64 -64
- package/src/organization-model/README.md +149 -149
- package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -210
- package/src/organization-model/__tests__/defaults.test.ts +168 -168
- package/src/organization-model/__tests__/domains/actions.test.ts +78 -56
- package/src/organization-model/__tests__/domains/customers.test.ts +299 -299
- package/src/organization-model/__tests__/domains/entities.test.ts +56 -56
- package/src/organization-model/__tests__/domains/goals.test.ts +493 -493
- package/src/organization-model/__tests__/domains/identity.test.ts +280 -280
- package/src/organization-model/__tests__/domains/navigation.test.ts +268 -268
- package/src/organization-model/__tests__/domains/offerings.test.ts +414 -414
- package/src/organization-model/__tests__/domains/policies.test.ts +323 -323
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +293 -293
- package/src/organization-model/__tests__/domains/resources.test.ts +382 -283
- package/src/organization-model/__tests__/domains/roles.test.ts +463 -463
- package/src/organization-model/__tests__/domains/statuses.test.ts +246 -246
- package/src/organization-model/__tests__/domains/systems.test.ts +209 -209
- package/src/organization-model/__tests__/flatten-additive-merge.test.ts +362 -361
- package/src/organization-model/__tests__/foundation.test.ts +77 -77
- package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -144
- package/src/organization-model/__tests__/graph.test.ts +1246 -887
- package/src/organization-model/__tests__/icons.test.ts +10 -1
- package/src/organization-model/__tests__/knowledge.test.ts +251 -15
- package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -438
- package/src/organization-model/__tests__/migration-helpers.test.ts +591 -591
- package/src/organization-model/__tests__/prospecting-ssot.test.ts +103 -103
- package/src/organization-model/__tests__/recursive-system-schema.test.ts +535 -506
- package/src/organization-model/__tests__/resolve.test.ts +274 -164
- package/src/organization-model/__tests__/schema.test.ts +834 -301
- package/src/organization-model/__tests__/surface-projection.test.ts +284 -284
- package/src/organization-model/catalogs/lead-gen.ts +144 -144
- package/src/organization-model/content-kinds/config.ts +36 -36
- package/src/organization-model/content-kinds/index.ts +76 -72
- package/src/organization-model/content-kinds/pipeline.ts +68 -68
- package/src/organization-model/content-kinds/registry.ts +44 -44
- package/src/organization-model/content-kinds/status.ts +71 -71
- package/src/organization-model/content-kinds/template.ts +83 -83
- package/src/organization-model/content-kinds/types.ts +117 -117
- package/src/organization-model/contracts.ts +27 -27
- package/src/organization-model/defaults.ts +40 -50
- package/src/organization-model/domains/actions.ts +333 -239
- package/src/organization-model/domains/customers.ts +78 -78
- package/src/organization-model/domains/entities.ts +144 -144
- package/src/organization-model/domains/goals.ts +83 -83
- package/src/organization-model/domains/knowledge.ts +117 -101
- package/src/organization-model/domains/navigation.ts +139 -139
- package/src/organization-model/domains/offerings.ts +71 -71
- package/src/organization-model/domains/policies.ts +102 -102
- package/src/organization-model/domains/projects.ts +14 -14
- package/src/organization-model/domains/prospecting.ts +395 -395
- package/src/organization-model/domains/resources.ts +167 -132
- package/src/organization-model/domains/roles.ts +96 -96
- package/src/organization-model/domains/sales.test.ts +218 -218
- package/src/organization-model/domains/sales.ts +380 -380
- package/src/organization-model/domains/shared.ts +63 -63
- package/src/organization-model/domains/statuses.ts +339 -339
- package/src/organization-model/domains/systems.ts +217 -172
- package/src/organization-model/foundation.ts +75 -75
- package/src/organization-model/graph/build.ts +1016 -888
- package/src/organization-model/graph/index.ts +4 -4
- package/src/organization-model/graph/link.ts +10 -10
- package/src/organization-model/graph/schema.ts +76 -70
- package/src/organization-model/graph/types.ts +73 -67
- package/src/organization-model/helpers.ts +289 -241
- package/src/organization-model/icons.ts +78 -66
- package/src/organization-model/index.ts +130 -128
- package/src/organization-model/migration-helpers.ts +247 -244
- package/src/organization-model/ontology.ts +661 -0
- package/src/organization-model/organization-graph.mdx +110 -90
- package/src/organization-model/organization-model.mdx +226 -219
- package/src/organization-model/published.ts +289 -235
- package/src/organization-model/resolve.ts +146 -91
- package/src/organization-model/schema.ts +790 -671
- package/src/organization-model/surface-projection.ts +212 -212
- package/src/organization-model/types.ts +177 -167
- package/src/platform/api/types.ts +38 -38
- package/src/platform/constants/versions.ts +3 -3
- package/src/platform/index.ts +23 -23
- package/src/platform/registry/__tests__/command-view.test.ts +10 -10
- package/src/platform/registry/__tests__/resource-link.test.ts +35 -35
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +20 -20
- package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -245
- package/src/platform/registry/__tests__/resource-registry.test.ts +2053 -2053
- package/src/platform/registry/__tests__/validation.test.ts +1347 -1347
- package/src/platform/registry/command-view.ts +10 -10
- package/src/platform/registry/index.ts +103 -103
- package/src/platform/registry/resource-link.ts +32 -32
- package/src/platform/registry/resource-registry.ts +890 -890
- package/src/platform/registry/serialization.ts +295 -295
- package/src/platform/registry/serialized-types.ts +166 -166
- package/src/platform/registry/stats-types.ts +68 -68
- package/src/platform/registry/types.ts +425 -425
- package/src/platform/registry/validation.ts +745 -745
- package/src/platform/utils/__tests__/validation.test.ts +1084 -1084
- package/src/platform/utils/validation.ts +425 -425
- package/src/projects/api-schemas.test.ts +39 -39
- package/src/projects/api-schemas.ts +291 -291
- package/src/reference/_generated/contracts.md +2101 -2096
- package/src/reference/glossary.md +76 -76
- package/src/scaffold-registry/__tests__/index.test.ts +206 -206
- package/src/scaffold-registry/__tests__/schema.test.ts +166 -166
- package/src/scaffold-registry/index.ts +392 -392
- package/src/scaffold-registry/schema.ts +243 -243
- package/src/server.ts +289 -289
- package/src/supabase/database.types.ts +3153 -3153
- package/src/test-utils/README.md +37 -37
- package/src/test-utils/entities.ts +108 -108
- package/src/test-utils/fixtures/memberships.ts +82 -82
- package/src/test-utils/index.ts +12 -12
- package/src/test-utils/organization-model.ts +65 -65
- package/src/test-utils/published.ts +6 -6
- package/src/test-utils/rls/RLSTestContext.ts +588 -588
- 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
|
-
*
|
|
38
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* to
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
+
})
|