@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.
- package/dist/index.d.ts +4343 -2690
- package/dist/index.js +1101 -156
- package/dist/knowledge/index.d.ts +574 -210
- package/dist/knowledge/index.js +104 -1
- package/dist/organization-model/index.d.ts +4343 -2690
- package/dist/organization-model/index.js +1101 -156
- package/dist/test-utils/index.d.ts +483 -109
- package/dist/test-utils/index.js +904 -144
- package/package.json +3 -3
- 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 +2137 -2093
- 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 +195 -197
- 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 +387 -277
- 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__/domains/topology.test.ts +188 -0
- 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 +1312 -862
- 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 +844 -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 +42 -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 +202 -124
- 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/domains/topology.ts +261 -0
- package/src/organization-model/foundation.ts +75 -75
- package/src/organization-model/graph/build.ts +1043 -867
- 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 +75 -68
- package/src/organization-model/graph/types.ts +71 -64
- package/src/organization-model/helpers.ts +289 -241
- package/src/organization-model/icons.ts +78 -66
- package/src/organization-model/index.ts +128 -125
- package/src/organization-model/migration-helpers.ts +247 -244
- package/src/organization-model/ontology.ts +658 -0
- package/src/organization-model/organization-graph.mdx +110 -90
- package/src/organization-model/organization-model.mdx +225 -213
- package/src/organization-model/published.ts +299 -222
- package/src/organization-model/resolve.ts +146 -91
- package/src/organization-model/schema.ts +818 -659
- package/src/organization-model/surface-projection.ts +212 -212
- package/src/organization-model/types.ts +179 -155
- 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 +1444 -1259
- 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 +886 -886
- 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 +876 -684
- 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 +2136 -2093
- 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 +3 -0
- 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
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { DEFAULT_ORGANIZATION_MODEL } from '../../organization-model/defaults'
|
|
2
|
+
import {
|
|
3
|
+
compileOrganizationOntology,
|
|
4
|
+
formatOntologyId,
|
|
5
|
+
type OntologyActionType,
|
|
6
|
+
type OntologyCatalogType,
|
|
7
|
+
type OntologyId,
|
|
8
|
+
type OntologyScope,
|
|
9
|
+
type ResolvedOntologyIndex
|
|
10
|
+
} from '../../organization-model/ontology'
|
|
11
|
+
import type { OrganizationModel } from '../../organization-model/types'
|
|
12
|
+
import {
|
|
13
|
+
CRM_PIPELINE_DEFINITION,
|
|
14
|
+
LEAD_GEN_STAGE_CATALOG,
|
|
15
|
+
type LeadGenStageCatalogEntry,
|
|
16
|
+
type StatefulStateDefinition
|
|
17
|
+
} from '../../organization-model/domains/sales'
|
|
18
|
+
|
|
19
|
+
export const CRM_PIPELINE_CATALOG_ONTOLOGY_ID = formatOntologyId({
|
|
20
|
+
scope: 'sales.crm',
|
|
21
|
+
kind: 'catalog',
|
|
22
|
+
localId: 'crm.pipeline'
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
export const LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID = formatOntologyId({
|
|
26
|
+
scope: 'sales.lead-gen',
|
|
27
|
+
kind: 'catalog',
|
|
28
|
+
localId: 'lead-gen.stage-catalog'
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const CRM_DEAL_OBJECT_ONTOLOGY_ID = formatOntologyId({
|
|
32
|
+
scope: 'sales.crm',
|
|
33
|
+
kind: 'object',
|
|
34
|
+
localId: 'crm.deal'
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
type CrmCatalogStageEntry = {
|
|
38
|
+
key: string
|
|
39
|
+
label: string
|
|
40
|
+
order: number
|
|
41
|
+
color?: string
|
|
42
|
+
states: StatefulStateDefinition[]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type BusinessOntologyValidationIndex = {
|
|
46
|
+
ontology: ResolvedOntologyIndex
|
|
47
|
+
crmPipelineCatalog: OntologyCatalogType
|
|
48
|
+
leadGenStageCatalog: OntologyCatalogType
|
|
49
|
+
actionTypesByLegacyId: Record<string, OntologyActionType>
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function createCrmPipelineCatalog(): OntologyCatalogType {
|
|
53
|
+
return {
|
|
54
|
+
id: CRM_PIPELINE_CATALOG_ONTOLOGY_ID,
|
|
55
|
+
label: CRM_PIPELINE_DEFINITION.label,
|
|
56
|
+
ownerSystemId: 'sales.crm',
|
|
57
|
+
kind: 'pipeline',
|
|
58
|
+
appliesTo: CRM_DEAL_OBJECT_ONTOLOGY_ID,
|
|
59
|
+
entries: Object.fromEntries(
|
|
60
|
+
CRM_PIPELINE_DEFINITION.stages.map((stage, index) => [
|
|
61
|
+
stage.stageKey,
|
|
62
|
+
{
|
|
63
|
+
key: stage.stageKey,
|
|
64
|
+
label: stage.label,
|
|
65
|
+
order: (index + 1) * 10,
|
|
66
|
+
...(stage.color !== undefined ? { color: stage.color } : {}),
|
|
67
|
+
states: stage.states.map((state) => ({ ...state }))
|
|
68
|
+
} satisfies CrmCatalogStageEntry
|
|
69
|
+
])
|
|
70
|
+
),
|
|
71
|
+
legacyPipelineKey: CRM_PIPELINE_DEFINITION.pipelineKey,
|
|
72
|
+
legacyEntityKey: CRM_PIPELINE_DEFINITION.entityKey
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function createLeadGenStageCatalog(): OntologyCatalogType {
|
|
77
|
+
return {
|
|
78
|
+
id: LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID,
|
|
79
|
+
label: 'Lead Gen Processing Stages',
|
|
80
|
+
ownerSystemId: 'sales.lead-gen',
|
|
81
|
+
kind: 'processing-stage-catalog',
|
|
82
|
+
entries: Object.fromEntries(
|
|
83
|
+
Object.entries(LEAD_GEN_STAGE_CATALOG).map(([key, entry]) => [
|
|
84
|
+
key,
|
|
85
|
+
{
|
|
86
|
+
...entry
|
|
87
|
+
}
|
|
88
|
+
])
|
|
89
|
+
),
|
|
90
|
+
legacyCatalogKey: 'LEAD_GEN_STAGE_CATALOG'
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
95
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function mergeBridgeCatalogs(model: OrganizationModel): OrganizationModel {
|
|
99
|
+
const baseCatalogTypes = model.ontology?.catalogTypes ?? {}
|
|
100
|
+
const bridgeCatalogTypes: Record<OntologyId, OntologyCatalogType> = {}
|
|
101
|
+
|
|
102
|
+
if (baseCatalogTypes[CRM_PIPELINE_CATALOG_ONTOLOGY_ID] === undefined) {
|
|
103
|
+
bridgeCatalogTypes[CRM_PIPELINE_CATALOG_ONTOLOGY_ID] = createCrmPipelineCatalog()
|
|
104
|
+
}
|
|
105
|
+
if (baseCatalogTypes[LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID] === undefined) {
|
|
106
|
+
bridgeCatalogTypes[LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID] = createLeadGenStageCatalog()
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (Object.keys(bridgeCatalogTypes).length === 0) return model
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
...model,
|
|
113
|
+
ontology: {
|
|
114
|
+
...(model.ontology ?? {}),
|
|
115
|
+
catalogTypes: {
|
|
116
|
+
...baseCatalogTypes,
|
|
117
|
+
...bridgeCatalogTypes
|
|
118
|
+
}
|
|
119
|
+
} satisfies OntologyScope
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function compileBusinessOntologyValidationIndex(
|
|
124
|
+
model: OrganizationModel = DEFAULT_ORGANIZATION_MODEL
|
|
125
|
+
): BusinessOntologyValidationIndex {
|
|
126
|
+
const compilation = compileOrganizationOntology(mergeBridgeCatalogs(model))
|
|
127
|
+
if (compilation.diagnostics.length > 0) {
|
|
128
|
+
const summary = compilation.diagnostics.map((diagnostic) => diagnostic.message).join('; ')
|
|
129
|
+
throw new Error(`Business ontology validation index failed to compile: ${summary}`)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const crmPipelineCatalog = compilation.ontology.catalogTypes[CRM_PIPELINE_CATALOG_ONTOLOGY_ID]
|
|
133
|
+
const leadGenStageCatalog = compilation.ontology.catalogTypes[LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID]
|
|
134
|
+
if (crmPipelineCatalog === undefined || leadGenStageCatalog === undefined) {
|
|
135
|
+
throw new Error('Business ontology validation index is missing CRM or lead-gen catalog bridge records')
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
ontology: compilation.ontology,
|
|
140
|
+
crmPipelineCatalog,
|
|
141
|
+
leadGenStageCatalog,
|
|
142
|
+
actionTypesByLegacyId: indexActionTypesByLegacyId(compilation.ontology.actionTypes)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function indexActionTypesByLegacyId(
|
|
147
|
+
actionTypes: Record<OntologyId, OntologyActionType>
|
|
148
|
+
): Record<string, OntologyActionType> {
|
|
149
|
+
const byLegacyId: Record<string, OntologyActionType> = {}
|
|
150
|
+
for (const actionType of Object.values(actionTypes)) {
|
|
151
|
+
const legacyActionId = actionType['legacyActionId']
|
|
152
|
+
if (typeof legacyActionId === 'string') {
|
|
153
|
+
byLegacyId[legacyActionId] = actionType
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return byLegacyId
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export const BUSINESS_ONTOLOGY_VALIDATION_INDEX = compileBusinessOntologyValidationIndex()
|
|
160
|
+
|
|
161
|
+
function getCatalogEntries(catalog: OntologyCatalogType): Record<string, unknown> {
|
|
162
|
+
return isPlainRecord(catalog.entries) ? catalog.entries : {}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function asCrmStageEntry(key: string, value: unknown): CrmCatalogStageEntry {
|
|
166
|
+
const record = isPlainRecord(value) ? value : {}
|
|
167
|
+
const label = typeof record.label === 'string' ? record.label : key
|
|
168
|
+
const order = typeof record.order === 'number' ? record.order : 0
|
|
169
|
+
const color = typeof record.color === 'string' ? record.color : undefined
|
|
170
|
+
const rawStates = Array.isArray(record.states) ? record.states : []
|
|
171
|
+
const states = rawStates.flatMap((state): StatefulStateDefinition[] => {
|
|
172
|
+
if (!isPlainRecord(state) || typeof state.stateKey !== 'string') return []
|
|
173
|
+
return [
|
|
174
|
+
{
|
|
175
|
+
stateKey: state.stateKey,
|
|
176
|
+
label: typeof state.label === 'string' ? state.label : state.stateKey
|
|
177
|
+
}
|
|
178
|
+
]
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
key,
|
|
183
|
+
label,
|
|
184
|
+
order,
|
|
185
|
+
...(color !== undefined ? { color } : {}),
|
|
186
|
+
states
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function asLeadGenStageEntry(key: string, value: unknown): LeadGenStageCatalogEntry {
|
|
191
|
+
const record = isPlainRecord(value) ? value : {}
|
|
192
|
+
const entity = record.entity === 'contact' ? 'contact' : 'company'
|
|
193
|
+
const additionalEntities = Array.isArray(record.additionalEntities)
|
|
194
|
+
? record.additionalEntities.filter(
|
|
195
|
+
(item): item is 'company' | 'contact' => item === 'company' || item === 'contact'
|
|
196
|
+
)
|
|
197
|
+
: undefined
|
|
198
|
+
const recordEntity =
|
|
199
|
+
record.recordEntity === 'company' || record.recordEntity === 'contact' ? record.recordEntity : undefined
|
|
200
|
+
const recordStageKey = typeof record.recordStageKey === 'string' ? record.recordStageKey : undefined
|
|
201
|
+
|
|
202
|
+
return {
|
|
203
|
+
key: typeof record.key === 'string' ? record.key : key,
|
|
204
|
+
label: typeof record.label === 'string' ? record.label : key,
|
|
205
|
+
description: typeof record.description === 'string' ? record.description : '',
|
|
206
|
+
order: typeof record.order === 'number' ? record.order : 0,
|
|
207
|
+
entity,
|
|
208
|
+
...(additionalEntities !== undefined ? { additionalEntities } : {}),
|
|
209
|
+
...(recordEntity !== undefined ? { recordEntity } : {}),
|
|
210
|
+
...(recordStageKey !== undefined ? { recordStageKey } : {})
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export const CRM_STAGE_KEYS_FROM_ONTOLOGY = Object.keys(
|
|
215
|
+
getCatalogEntries(BUSINESS_ONTOLOGY_VALIDATION_INDEX.crmPipelineCatalog)
|
|
216
|
+
) as [string, ...string[]]
|
|
217
|
+
|
|
218
|
+
export const CRM_STATE_KEYS_FROM_ONTOLOGY = Object.values(
|
|
219
|
+
getCatalogEntries(BUSINESS_ONTOLOGY_VALIDATION_INDEX.crmPipelineCatalog)
|
|
220
|
+
).flatMap((entry, index) => {
|
|
221
|
+
const stageKey = CRM_STAGE_KEYS_FROM_ONTOLOGY[index]
|
|
222
|
+
if (stageKey === undefined) return []
|
|
223
|
+
return asCrmStageEntry(stageKey, entry).states.map((state) => state.stateKey)
|
|
224
|
+
}) as [string, ...string[]]
|
|
225
|
+
|
|
226
|
+
export const LEAD_GEN_STAGE_KEYS_FROM_ONTOLOGY = Object.keys(
|
|
227
|
+
getCatalogEntries(BUSINESS_ONTOLOGY_VALIDATION_INDEX.leadGenStageCatalog)
|
|
228
|
+
) as [string, ...string[]]
|
|
229
|
+
|
|
230
|
+
export function getCrmStatesForStage(stageKey: string): StatefulStateDefinition[] {
|
|
231
|
+
const entry = getCatalogEntries(BUSINESS_ONTOLOGY_VALIDATION_INDEX.crmPipelineCatalog)[stageKey]
|
|
232
|
+
return entry === undefined ? [] : asCrmStageEntry(stageKey, entry).states
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export function isCrmStageKey(stageKey: string): boolean {
|
|
236
|
+
return Object.prototype.hasOwnProperty.call(
|
|
237
|
+
getCatalogEntries(BUSINESS_ONTOLOGY_VALIDATION_INDEX.crmPipelineCatalog),
|
|
238
|
+
stageKey
|
|
239
|
+
)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export function isCrmStateKey(stateKey: string): boolean {
|
|
243
|
+
return CRM_STATE_KEYS_FROM_ONTOLOGY.includes(stateKey)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export function getLeadGenStageCatalogFromOntology(): Record<string, LeadGenStageCatalogEntry> {
|
|
247
|
+
return Object.fromEntries(
|
|
248
|
+
Object.entries(getCatalogEntries(BUSINESS_ONTOLOGY_VALIDATION_INDEX.leadGenStageCatalog)).map(([key, value]) => [
|
|
249
|
+
key,
|
|
250
|
+
asLeadGenStageEntry(key, value)
|
|
251
|
+
])
|
|
252
|
+
)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function getLeadGenStageEntry(stageKey: string): LeadGenStageCatalogEntry | undefined {
|
|
256
|
+
return getLeadGenStageCatalogFromOntology()[stageKey]
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export function isLeadGenStageKey(stageKey: string): boolean {
|
|
260
|
+
return getLeadGenStageEntry(stageKey) !== undefined
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export function isLeadGenStageValidForEntity(stageKey: string, entity: 'company' | 'contact'): boolean {
|
|
264
|
+
const stage = getLeadGenStageEntry(stageKey)
|
|
265
|
+
return stage !== undefined && (stage.entity === entity || stage.additionalEntities?.includes(entity) === true)
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export function isLeadGenRecordStageValidForEntity(stageKey: string, entity: 'company' | 'contact'): boolean {
|
|
269
|
+
const stage = getLeadGenStageEntry(stageKey)
|
|
270
|
+
return (
|
|
271
|
+
stage !== undefined &&
|
|
272
|
+
(stage.entity === entity || stage.additionalEntities?.includes(entity) === true || stage.recordEntity === entity)
|
|
273
|
+
)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export function resolveLeadGenRecordStageKey(stageKey: string, entity: 'company' | 'contact'): string {
|
|
277
|
+
const stage = getLeadGenStageEntry(stageKey)
|
|
278
|
+
return stage?.recordEntity === entity && stage.recordStageKey ? stage.recordStageKey : stageKey
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export type BusinessActionMetadata = {
|
|
282
|
+
id: string
|
|
283
|
+
label: string
|
|
284
|
+
resourceId?: string
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function getActionMetadata(actionKey: string): BusinessActionMetadata | undefined {
|
|
288
|
+
const actionType = BUSINESS_ONTOLOGY_VALIDATION_INDEX.actionTypesByLegacyId[actionKey]
|
|
289
|
+
if (actionType === undefined) return undefined
|
|
290
|
+
|
|
291
|
+
const resourceId = actionType['resourceId']
|
|
292
|
+
return {
|
|
293
|
+
id: actionKey,
|
|
294
|
+
label: actionType.label ?? actionKey,
|
|
295
|
+
...(typeof resourceId === 'string' ? { resourceId } : {})
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export function getCrmActionMetadata(actionKey: string): BusinessActionMetadata | undefined {
|
|
300
|
+
const actionType = BUSINESS_ONTOLOGY_VALIDATION_INDEX.actionTypesByLegacyId[actionKey]
|
|
301
|
+
return actionType?.ownerSystemId === 'sales.crm' ? getActionMetadata(actionKey) : undefined
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export function isLeadGenActionKey(actionKey: string): boolean {
|
|
305
|
+
return (
|
|
306
|
+
actionKey.startsWith('lead-gen.') &&
|
|
307
|
+
BUSINESS_ONTOLOGY_VALIDATION_INDEX.actionTypesByLegacyId[actionKey] !== undefined
|
|
308
|
+
)
|
|
309
|
+
}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { z } from 'zod'
|
|
2
|
-
import { ActivityEventSchema, type ActivityEvent } from './activity-events'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Stateful trait — the (pipeline_key, stage_key, state_key, activity_log) quartet
|
|
6
|
-
* applied to acq_deals (CRM HITL, shipped 2026-04-27) and being generalized to
|
|
7
|
-
* acq_lists / acq_list_members / acq_list_companies via Track B.
|
|
8
|
-
*/
|
|
9
|
-
export interface Stateful {
|
|
10
|
-
pipeline_key: string
|
|
11
|
-
stage_key: string
|
|
12
|
-
state_key: string
|
|
13
|
-
activity_log: ActivityEvent[]
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const StatefulSchema = z.object({
|
|
17
|
-
pipeline_key: z.string(),
|
|
18
|
-
stage_key: z.string(),
|
|
19
|
-
state_key: z.string(),
|
|
20
|
-
activity_log: z.array(ActivityEventSchema)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
/** Generic transition shape — concrete per-entity transitionItem implementations satisfy this. */
|
|
24
|
-
export type TransitionItem<T extends Stateful, TEvent extends ActivityEvent> = (
|
|
25
|
-
item: T,
|
|
26
|
-
transition: { stage_key?: string; state_key?: string; event: TEvent }
|
|
27
|
-
) => T
|
|
28
|
-
|
|
29
|
-
/** Generic action-derivation shape — concrete per-entity deriveActions implementations satisfy this. */
|
|
30
|
-
export type DeriveActions<T extends Stateful, TAction> = (item: T) => TAction[]
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { ActivityEventSchema, type ActivityEvent } from './activity-events'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Stateful trait — the (pipeline_key, stage_key, state_key, activity_log) quartet
|
|
6
|
+
* applied to acq_deals (CRM HITL, shipped 2026-04-27) and being generalized to
|
|
7
|
+
* acq_lists / acq_list_members / acq_list_companies via Track B.
|
|
8
|
+
*/
|
|
9
|
+
export interface Stateful {
|
|
10
|
+
pipeline_key: string
|
|
11
|
+
stage_key: string
|
|
12
|
+
state_key: string
|
|
13
|
+
activity_log: ActivityEvent[]
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const StatefulSchema = z.object({
|
|
17
|
+
pipeline_key: z.string(),
|
|
18
|
+
stage_key: z.string(),
|
|
19
|
+
state_key: z.string(),
|
|
20
|
+
activity_log: z.array(ActivityEventSchema)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
/** Generic transition shape — concrete per-entity transitionItem implementations satisfy this. */
|
|
24
|
+
export type TransitionItem<T extends Stateful, TEvent extends ActivityEvent> = (
|
|
25
|
+
item: T,
|
|
26
|
+
transition: { stage_key?: string; state_key?: string; event: TEvent }
|
|
27
|
+
) => T
|
|
28
|
+
|
|
29
|
+
/** Generic action-derivation shape — concrete per-entity deriveActions implementations satisfy this. */
|
|
30
|
+
export type DeriveActions<T extends Stateful, TAction> = (item: T) => TAction[]
|