@elevasis/core 0.22.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3214 -2501
- package/dist/index.js +3112 -1222
- package/dist/knowledge/index.d.ts +1108 -1264
- package/dist/knowledge/index.js +112 -9
- package/dist/organization-model/index.d.ts +3214 -2501
- package/dist/organization-model/index.js +3112 -1222
- package/dist/test-utils/index.d.ts +985 -1103
- package/dist/test-utils/index.js +2464 -1165
- 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 -80
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +2389 -2121
- 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 +1493 -1500
- package/src/business/acquisition/build-templates.test.ts +240 -240
- package/src/business/acquisition/build-templates.ts +83 -41
- 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 -151
- 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 -392
- 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 +33 -32
- package/src/knowledge/__tests__/queries.test.ts +633 -541
- package/src/knowledge/format.ts +100 -99
- package/src/knowledge/index.ts +5 -5
- package/src/knowledge/published.ts +5 -5
- package/src/knowledge/queries.ts +274 -222
- package/src/operations/activities/api-schemas.ts +80 -80
- package/src/operations/activities/types.ts +64 -64
- package/src/organization-model/README.md +149 -109
- package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -0
- package/src/organization-model/__tests__/defaults.test.ts +168 -194
- package/src/organization-model/__tests__/domains/actions.test.ts +78 -0
- package/src/organization-model/__tests__/domains/customers.test.ts +48 -44
- package/src/organization-model/__tests__/domains/entities.test.ts +56 -0
- package/src/organization-model/__tests__/domains/goals.test.ts +110 -96
- package/src/organization-model/__tests__/domains/identity.test.ts +4 -3
- package/src/organization-model/__tests__/domains/navigation.test.ts +222 -166
- package/src/organization-model/__tests__/domains/offerings.test.ts +83 -88
- package/src/organization-model/__tests__/domains/policies.test.ts +323 -0
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +30 -30
- package/src/organization-model/__tests__/domains/resources.test.ts +396 -175
- package/src/organization-model/__tests__/domains/roles.test.ts +463 -402
- package/src/organization-model/__tests__/domains/statuses.test.ts +13 -10
- package/src/organization-model/__tests__/domains/systems.test.ts +209 -193
- package/src/organization-model/__tests__/flatten-additive-merge.test.ts +362 -0
- package/src/organization-model/__tests__/foundation.test.ts +47 -75
- package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -0
- package/src/organization-model/__tests__/graph.test.ts +1336 -149
- package/src/organization-model/__tests__/icons.test.ts +10 -1
- package/src/organization-model/__tests__/knowledge.test.ts +418 -61
- package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -0
- package/src/organization-model/__tests__/migration-helpers.test.ts +591 -0
- package/src/organization-model/__tests__/prospecting-ssot.test.ts +103 -94
- package/src/organization-model/__tests__/recursive-system-schema.test.ts +549 -0
- package/src/organization-model/__tests__/resolve.test.ts +303 -42
- package/src/organization-model/__tests__/schema.test.ts +863 -153
- package/src/organization-model/__tests__/surface-projection.test.ts +284 -174
- package/src/organization-model/catalogs/lead-gen.ts +144 -0
- package/src/organization-model/content-kinds/config.ts +36 -0
- package/src/organization-model/content-kinds/index.ts +78 -0
- package/src/organization-model/content-kinds/pipeline.ts +68 -0
- package/src/organization-model/content-kinds/registry.ts +44 -0
- package/src/organization-model/content-kinds/status.ts +71 -0
- package/src/organization-model/content-kinds/template.ts +83 -0
- package/src/organization-model/content-kinds/types.ts +117 -0
- package/src/organization-model/contracts.ts +27 -17
- package/src/organization-model/defaults.ts +489 -107
- package/src/organization-model/domains/actions.ts +333 -0
- package/src/organization-model/domains/customers.ts +10 -7
- package/src/organization-model/domains/entities.ts +144 -0
- package/src/organization-model/domains/goals.ts +9 -6
- package/src/organization-model/domains/knowledge.ts +128 -54
- package/src/organization-model/domains/navigation.ts +139 -416
- package/src/organization-model/domains/offerings.ts +15 -10
- package/src/organization-model/domains/policies.ts +102 -0
- package/src/organization-model/domains/projects.ts +6 -40
- package/src/organization-model/domains/prospecting.ts +395 -514
- package/src/organization-model/domains/resources.ts +173 -81
- package/src/organization-model/domains/roles.ts +96 -93
- package/src/organization-model/domains/sales.test.ts +218 -218
- package/src/organization-model/domains/sales.ts +380 -589
- package/src/organization-model/domains/shared.ts +8 -8
- package/src/organization-model/domains/statuses.ts +298 -89
- package/src/organization-model/domains/systems.ts +240 -38
- package/src/organization-model/foundation.ts +35 -48
- package/src/organization-model/graph/build.ts +1035 -279
- 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 +77 -56
- package/src/organization-model/graph/types.ts +75 -56
- package/src/organization-model/helpers.ts +312 -59
- package/src/organization-model/icons.ts +78 -66
- package/src/organization-model/index.ts +129 -16
- package/src/organization-model/migration-helpers.ts +252 -0
- package/src/organization-model/ontology.ts +661 -0
- package/src/organization-model/organization-graph.mdx +110 -89
- package/src/organization-model/organization-model.mdx +226 -171
- package/src/organization-model/published.ts +295 -139
- package/src/organization-model/resolve.ts +139 -21
- package/src/organization-model/schema.ts +841 -301
- package/src/organization-model/surface-projection.ts +212 -218
- package/src/organization-model/types.ts +181 -90
- 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 +5 -7
- package/src/platform/registry/__tests__/resource-link.test.ts +35 -30
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +17 -32
- package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -0
- package/src/platform/registry/__tests__/resource-registry.test.ts +2053 -2051
- package/src/platform/registry/__tests__/validation.test.ts +1347 -1343
- 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 -878
- 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 -743
- 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 +2389 -2121
- 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 -3093
- 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 -49
- package/src/organization-model/__tests__/domains/operations.test.ts +0 -203
- package/src/organization-model/domains/features.ts +0 -31
- package/src/organization-model/domains/operations.ts +0 -85
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { EntityIdSchema } from './entities'
|
|
3
|
+
import { DescriptionSchema, LabelSchema, ModelIdSchema } from './shared'
|
|
4
|
+
|
|
5
|
+
export const ActionResourceIdSchema = z
|
|
6
|
+
.string()
|
|
7
|
+
.trim()
|
|
8
|
+
.min(1)
|
|
9
|
+
.max(255)
|
|
10
|
+
.regex(/^[A-Za-z0-9]+(?:[-._][A-Za-z0-9]+)*$/, 'Resource IDs must use letters, numbers, -, _, or . separators')
|
|
11
|
+
|
|
12
|
+
export const ActionInvocationKindSchema = z
|
|
13
|
+
.enum(['slash-command', 'mcp-tool', 'api-endpoint', 'script-execution'])
|
|
14
|
+
.meta({ label: 'Invocation kind' })
|
|
15
|
+
|
|
16
|
+
export const ActionIdSchema = ModelIdSchema
|
|
17
|
+
|
|
18
|
+
export const ActionScopeSchema = z.union([
|
|
19
|
+
z.literal('global'),
|
|
20
|
+
z.object({
|
|
21
|
+
domain: ModelIdSchema
|
|
22
|
+
})
|
|
23
|
+
])
|
|
24
|
+
|
|
25
|
+
export const ActionRefSchema = z.object({
|
|
26
|
+
actionId: ActionIdSchema.meta({ ref: 'action' }),
|
|
27
|
+
intent: z.enum(['exposes', 'consumes']).meta({ label: 'Intent' })
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
export const SlashCommandInvocationSchema = z.object({
|
|
31
|
+
kind: z.literal('slash-command'),
|
|
32
|
+
command: z
|
|
33
|
+
.string()
|
|
34
|
+
.trim()
|
|
35
|
+
.min(1)
|
|
36
|
+
.max(200)
|
|
37
|
+
.regex(/^\/[^\s].*$/, 'Slash commands must start with /'),
|
|
38
|
+
toolFactory: ModelIdSchema.optional()
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
export const McpToolInvocationSchema = z.object({
|
|
42
|
+
kind: z.literal('mcp-tool'),
|
|
43
|
+
server: ModelIdSchema,
|
|
44
|
+
name: ModelIdSchema
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
export const ApiEndpointInvocationSchema = z.object({
|
|
48
|
+
kind: z.literal('api-endpoint'),
|
|
49
|
+
method: z.enum(['GET', 'POST', 'PATCH', 'DELETE']).meta({ label: 'HTTP method' }),
|
|
50
|
+
path: z.string().trim().startsWith('/').max(500),
|
|
51
|
+
requestSchema: ModelIdSchema.optional(),
|
|
52
|
+
responseSchema: ModelIdSchema.optional()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
export const ScriptExecutionInvocationSchema = z.object({
|
|
56
|
+
kind: z.literal('script-execution'),
|
|
57
|
+
resourceId: ActionResourceIdSchema
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
export const ActionInvocationSchema = z.discriminatedUnion('kind', [
|
|
61
|
+
SlashCommandInvocationSchema,
|
|
62
|
+
McpToolInvocationSchema,
|
|
63
|
+
ApiEndpointInvocationSchema,
|
|
64
|
+
ScriptExecutionInvocationSchema
|
|
65
|
+
])
|
|
66
|
+
|
|
67
|
+
export const ActionSchema = z.object({
|
|
68
|
+
id: ActionIdSchema,
|
|
69
|
+
/** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
|
|
70
|
+
order: z.number(),
|
|
71
|
+
label: LabelSchema,
|
|
72
|
+
description: DescriptionSchema.optional(),
|
|
73
|
+
scope: ActionScopeSchema.default('global'),
|
|
74
|
+
resourceId: ActionResourceIdSchema.optional(),
|
|
75
|
+
affects: z.array(EntityIdSchema.meta({ ref: 'entity' })).optional(),
|
|
76
|
+
invocations: z.array(ActionInvocationSchema).default([]),
|
|
77
|
+
knowledge: z
|
|
78
|
+
.array(ModelIdSchema.meta({ ref: 'knowledge' }))
|
|
79
|
+
.default([])
|
|
80
|
+
.optional(),
|
|
81
|
+
lifecycle: z
|
|
82
|
+
.enum(['draft', 'beta', 'active', 'deprecated', 'archived'])
|
|
83
|
+
.meta({ label: 'Lifecycle', color: 'teal' })
|
|
84
|
+
.default('active')
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
export const ActionsDomainSchema = z
|
|
88
|
+
.record(z.string(), ActionSchema)
|
|
89
|
+
.refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
|
|
90
|
+
message: 'Each action entry id must match its map key'
|
|
91
|
+
})
|
|
92
|
+
.default({})
|
|
93
|
+
|
|
94
|
+
const LEAD_GEN_ACTION_ENTRY_INPUTS: z.input<typeof ActionSchema>[] = [
|
|
95
|
+
{
|
|
96
|
+
id: 'lead-gen.company.source',
|
|
97
|
+
order: 10,
|
|
98
|
+
label: 'Source companies',
|
|
99
|
+
description: 'Import source companies from a list provider.',
|
|
100
|
+
scope: { domain: 'sales' },
|
|
101
|
+
resourceId: 'lgn-import-workflow',
|
|
102
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/source' }]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 'lead-gen.company.apollo-import',
|
|
106
|
+
order: 20,
|
|
107
|
+
label: 'Import from Apollo',
|
|
108
|
+
description: 'Pull companies and seed contact data from an Apollo search or list.',
|
|
109
|
+
scope: { domain: 'sales' },
|
|
110
|
+
resourceId: 'lgn-01c-apollo-import-workflow',
|
|
111
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/apollo-import' }]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: 'lead-gen.contact.discover',
|
|
115
|
+
order: 30,
|
|
116
|
+
label: 'Discover contact emails',
|
|
117
|
+
description: 'Find email addresses for contacts at qualified companies.',
|
|
118
|
+
scope: { domain: 'sales' },
|
|
119
|
+
resourceId: 'lgn-04-email-discovery-workflow',
|
|
120
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/contacts/discover' }]
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
id: 'lead-gen.contact.verify-email',
|
|
124
|
+
order: 40,
|
|
125
|
+
label: 'Verify emails',
|
|
126
|
+
description: 'Check email deliverability before outreach.',
|
|
127
|
+
scope: { domain: 'sales' },
|
|
128
|
+
resourceId: 'lgn-05-email-verification-workflow',
|
|
129
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/contacts/verify-email' }]
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: 'lead-gen.company.apify-crawl',
|
|
133
|
+
order: 50,
|
|
134
|
+
label: 'Crawl websites',
|
|
135
|
+
description:
|
|
136
|
+
'Crawl company websites via Apify and store raw page markdown in enrichmentData.websiteCrawl.pages for downstream LLM analysis.',
|
|
137
|
+
scope: { domain: 'sales' },
|
|
138
|
+
resourceId: 'lgn-02a-apify-website-crawl-workflow',
|
|
139
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/apify-crawl' }]
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
id: 'lead-gen.company.website-extract',
|
|
143
|
+
order: 60,
|
|
144
|
+
label: 'Extract website signals',
|
|
145
|
+
description: 'Scrape and analyze company websites for qualification signals.',
|
|
146
|
+
scope: { domain: 'sales' },
|
|
147
|
+
resourceId: 'lgn-02-website-extract-workflow',
|
|
148
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/website-extract' }]
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
id: 'lead-gen.company.qualify',
|
|
152
|
+
order: 70,
|
|
153
|
+
label: 'Qualify companies',
|
|
154
|
+
description: 'Score and filter companies against the ICP rubric.',
|
|
155
|
+
scope: { domain: 'sales' },
|
|
156
|
+
resourceId: 'lgn-03-company-qualification-workflow',
|
|
157
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/qualify' }]
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: 'lead-gen.company.dtc-subscription-qualify',
|
|
161
|
+
order: 80,
|
|
162
|
+
label: 'Qualify DTC subscription fit',
|
|
163
|
+
description: 'Classify subscription potential and consumable-product fit for DTC brands.',
|
|
164
|
+
scope: { domain: 'sales' },
|
|
165
|
+
resourceId: 'lgn-03b-dtc-subscription-score-workflow',
|
|
166
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/dtc-subscription-qualify' }]
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: 'lead-gen.contact.apollo-decision-maker-enrich',
|
|
170
|
+
order: 90,
|
|
171
|
+
label: 'Enrich decision-makers',
|
|
172
|
+
description: 'Find and enrich qualified contacts at qualified companies via Apollo.',
|
|
173
|
+
scope: { domain: 'sales' },
|
|
174
|
+
resourceId: 'lgn-04b-apollo-decision-maker-enrich-workflow',
|
|
175
|
+
invocations: [
|
|
176
|
+
{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/contacts/apollo-decision-maker-enrich' }
|
|
177
|
+
]
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: 'lead-gen.contact.personalize',
|
|
181
|
+
order: 100,
|
|
182
|
+
label: 'Personalize outreach',
|
|
183
|
+
description: 'Generate personalized opening lines for each contact.',
|
|
184
|
+
scope: { domain: 'sales' },
|
|
185
|
+
resourceId: 'ist-personalization-workflow',
|
|
186
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/contacts/personalize' }]
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
id: 'lead-gen.review.outreach-ready',
|
|
190
|
+
order: 110,
|
|
191
|
+
label: 'Upload to outreach',
|
|
192
|
+
description: 'Upload approved contacts to the outreach sequence after QC review.',
|
|
193
|
+
scope: { domain: 'sales' },
|
|
194
|
+
resourceId: 'ist-upload-contacts-workflow',
|
|
195
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/review/outreach-ready' }]
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: 'lead-gen.export.list',
|
|
199
|
+
order: 120,
|
|
200
|
+
label: 'Export lead list',
|
|
201
|
+
description: 'Export approved leads as a downloadable lead list.',
|
|
202
|
+
scope: { domain: 'sales' },
|
|
203
|
+
resourceId: 'lgn-06-export-list-workflow',
|
|
204
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/export/list' }]
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: 'lead-gen.company.cleanup',
|
|
208
|
+
order: 130,
|
|
209
|
+
label: 'Clean up companies',
|
|
210
|
+
description: 'Remove disqualified or duplicate companies from the list.',
|
|
211
|
+
scope: { domain: 'sales' },
|
|
212
|
+
resourceId: 'lgn-company-cleanup-workflow',
|
|
213
|
+
invocations: [{ kind: 'api-endpoint', method: 'POST', path: '/api/prospecting/companies/cleanup' }]
|
|
214
|
+
}
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
export const LEAD_GEN_ACTION_ENTRIES: Record<string, z.infer<typeof ActionSchema>> = Object.fromEntries(
|
|
218
|
+
LEAD_GEN_ACTION_ENTRY_INPUTS.map((action) => {
|
|
219
|
+
const parsed = ActionSchema.parse(action)
|
|
220
|
+
return [parsed.id, parsed]
|
|
221
|
+
})
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
const CRM_ACTION_ENTRY_INPUTS: z.input<typeof ActionSchema>[] = [
|
|
225
|
+
{
|
|
226
|
+
id: 'send_reply',
|
|
227
|
+
order: 210,
|
|
228
|
+
label: 'Send Reply',
|
|
229
|
+
description: 'Send a contextual reply for an active CRM deal.',
|
|
230
|
+
scope: { domain: 'sales' },
|
|
231
|
+
resourceId: 'crm-send-reply-workflow',
|
|
232
|
+
affects: ['crm.deal']
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
id: 'send_link',
|
|
236
|
+
order: 220,
|
|
237
|
+
label: 'Send Booking Link',
|
|
238
|
+
description: 'Send a booking link to move a deal toward a scheduled call.',
|
|
239
|
+
scope: { domain: 'sales' },
|
|
240
|
+
resourceId: 'crm-send-booking-link-workflow',
|
|
241
|
+
affects: ['crm.deal']
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: 'send_nudge',
|
|
245
|
+
order: 230,
|
|
246
|
+
label: 'Send Nudge',
|
|
247
|
+
description: 'Send a follow-up nudge for a stalled CRM deal.',
|
|
248
|
+
scope: { domain: 'sales' },
|
|
249
|
+
resourceId: 'crm-send-nudge-workflow',
|
|
250
|
+
affects: ['crm.deal']
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
id: 'rebook',
|
|
254
|
+
order: 240,
|
|
255
|
+
label: 'Rebook',
|
|
256
|
+
description: 'Rebook a missed or rescheduled CRM appointment.',
|
|
257
|
+
scope: { domain: 'sales' },
|
|
258
|
+
resourceId: 'crm-rebook-workflow',
|
|
259
|
+
affects: ['crm.deal']
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
id: 'move_to_proposal',
|
|
263
|
+
order: 250,
|
|
264
|
+
label: 'Move to Proposal',
|
|
265
|
+
description: 'Advance a qualified CRM deal into the proposal stage.',
|
|
266
|
+
scope: { domain: 'sales' },
|
|
267
|
+
resourceId: 'move_to_proposal-workflow',
|
|
268
|
+
affects: ['crm.deal']
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
id: 'move_to_closing',
|
|
272
|
+
order: 260,
|
|
273
|
+
label: 'Move to Closing',
|
|
274
|
+
description: 'Advance a proposal-stage CRM deal into closing.',
|
|
275
|
+
scope: { domain: 'sales' },
|
|
276
|
+
resourceId: 'move_to_closing-workflow',
|
|
277
|
+
affects: ['crm.deal']
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
id: 'move_to_closed_won',
|
|
281
|
+
order: 270,
|
|
282
|
+
label: 'Close Won',
|
|
283
|
+
description: 'Mark a CRM deal as closed won.',
|
|
284
|
+
scope: { domain: 'sales' },
|
|
285
|
+
resourceId: 'move_to_closed_won-workflow',
|
|
286
|
+
affects: ['crm.deal']
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
id: 'move_to_closed_lost',
|
|
290
|
+
order: 280,
|
|
291
|
+
label: 'Close Lost',
|
|
292
|
+
description: 'Mark a CRM deal as closed lost.',
|
|
293
|
+
scope: { domain: 'sales' },
|
|
294
|
+
resourceId: 'move_to_closed_lost-workflow',
|
|
295
|
+
affects: ['crm.deal']
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
id: 'move_to_nurturing',
|
|
299
|
+
order: 290,
|
|
300
|
+
label: 'Move to Nurturing',
|
|
301
|
+
description: 'Move a CRM deal into nurturing for future follow-up.',
|
|
302
|
+
scope: { domain: 'sales' },
|
|
303
|
+
resourceId: 'move_to_nurturing-workflow',
|
|
304
|
+
affects: ['crm.deal']
|
|
305
|
+
}
|
|
306
|
+
]
|
|
307
|
+
|
|
308
|
+
export const CRM_ACTION_ENTRIES: Record<string, z.infer<typeof ActionSchema>> = Object.fromEntries(
|
|
309
|
+
CRM_ACTION_ENTRY_INPUTS.map((action) => {
|
|
310
|
+
const parsed = ActionSchema.parse(action)
|
|
311
|
+
return [parsed.id, parsed]
|
|
312
|
+
})
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
export const DEFAULT_ORGANIZATION_MODEL_ACTIONS: z.infer<typeof ActionsDomainSchema> = {
|
|
316
|
+
...LEAD_GEN_ACTION_ENTRIES,
|
|
317
|
+
...CRM_ACTION_ENTRIES
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export function findOrganizationActionById(
|
|
321
|
+
id: string,
|
|
322
|
+
actions: z.infer<typeof ActionsDomainSchema> = DEFAULT_ORGANIZATION_MODEL_ACTIONS
|
|
323
|
+
): z.infer<typeof ActionSchema> | undefined {
|
|
324
|
+
return actions[id]
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export type ActionId = z.infer<typeof ActionIdSchema>
|
|
328
|
+
export type ActionScope = z.infer<typeof ActionScopeSchema>
|
|
329
|
+
export type ActionRef = z.infer<typeof ActionRefSchema>
|
|
330
|
+
export type ActionInvocationKind = z.infer<typeof ActionInvocationKindSchema>
|
|
331
|
+
export type ActionInvocation = z.infer<typeof ActionInvocationSchema>
|
|
332
|
+
export type Action = z.infer<typeof ActionSchema>
|
|
333
|
+
export type ActionsDomain = z.infer<typeof ActionsDomainSchema>
|
|
@@ -30,6 +30,8 @@ export const FirmographicsSchema = z.object({
|
|
|
30
30
|
export const CustomerSegmentSchema = z.object({
|
|
31
31
|
/** Stable unique identifier for the segment (e.g. "segment-smb-agencies"). */
|
|
32
32
|
id: z.string().trim().min(1).max(100),
|
|
33
|
+
/** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
|
|
34
|
+
order: z.number(),
|
|
33
35
|
/** Human-readable name shown to agents and in UI (e.g. "SMB Marketing Agencies"). */
|
|
34
36
|
name: z.string().trim().max(200).default(''),
|
|
35
37
|
/** One or two sentences describing who this segment is. */
|
|
@@ -59,17 +61,18 @@ export const CustomerSegmentSchema = z.object({
|
|
|
59
61
|
})
|
|
60
62
|
|
|
61
63
|
// ---------------------------------------------------------------------------
|
|
62
|
-
// Customers domain schema —
|
|
64
|
+
// Customers domain schema — id-keyed map of customer segments.
|
|
63
65
|
// ---------------------------------------------------------------------------
|
|
64
66
|
|
|
65
|
-
export const CustomersDomainSchema = z
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
export const CustomersDomainSchema = z
|
|
68
|
+
.record(z.string(), CustomerSegmentSchema)
|
|
69
|
+
.refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
|
|
70
|
+
message: 'Each segment entry id must match its map key'
|
|
71
|
+
})
|
|
72
|
+
.default({})
|
|
68
73
|
|
|
69
74
|
// ---------------------------------------------------------------------------
|
|
70
75
|
// Seed — empty by default; adapters populate with real segment definitions.
|
|
71
76
|
// ---------------------------------------------------------------------------
|
|
72
77
|
|
|
73
|
-
export const DEFAULT_ORGANIZATION_MODEL_CUSTOMERS: z.infer<typeof CustomersDomainSchema> = {
|
|
74
|
-
segments: []
|
|
75
|
-
}
|
|
78
|
+
export const DEFAULT_ORGANIZATION_MODEL_CUSTOMERS: z.infer<typeof CustomersDomainSchema> = {}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { DescriptionSchema, LabelSchema, ModelIdSchema } from './shared'
|
|
3
|
+
|
|
4
|
+
export const EntityIdSchema = ModelIdSchema
|
|
5
|
+
|
|
6
|
+
export const EntityLinkKindSchema = z
|
|
7
|
+
.enum(['belongs-to', 'has-many', 'has-one', 'many-to-many'])
|
|
8
|
+
.meta({ label: 'Link kind' })
|
|
9
|
+
|
|
10
|
+
export const EntityLinkSchema = z.object({
|
|
11
|
+
toEntity: EntityIdSchema.meta({ ref: 'entity' }),
|
|
12
|
+
kind: EntityLinkKindSchema,
|
|
13
|
+
via: z.string().trim().min(1).max(255).optional(),
|
|
14
|
+
label: LabelSchema.optional()
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
export const EntitySchema = z.object({
|
|
18
|
+
id: EntityIdSchema,
|
|
19
|
+
/** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
|
|
20
|
+
order: z.number(),
|
|
21
|
+
label: LabelSchema,
|
|
22
|
+
description: DescriptionSchema.optional(),
|
|
23
|
+
ownedBySystemId: ModelIdSchema.meta({ ref: 'system' }),
|
|
24
|
+
table: z.string().trim().min(1).max(255).optional(),
|
|
25
|
+
rowSchema: ModelIdSchema.optional(),
|
|
26
|
+
stateCatalogId: ModelIdSchema.optional(),
|
|
27
|
+
links: z.array(EntityLinkSchema).optional()
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
export const EntitiesDomainSchema = z
|
|
31
|
+
.record(z.string(), EntitySchema)
|
|
32
|
+
.refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
|
|
33
|
+
message: 'Each entity entry id must match its map key'
|
|
34
|
+
})
|
|
35
|
+
.default({})
|
|
36
|
+
|
|
37
|
+
const ENTITY_ENTRY_INPUTS: z.input<typeof EntitySchema>[] = [
|
|
38
|
+
{
|
|
39
|
+
id: 'crm.deal',
|
|
40
|
+
order: 10,
|
|
41
|
+
label: 'Deal',
|
|
42
|
+
description: 'A CRM opportunity or sales pipeline record.',
|
|
43
|
+
ownedBySystemId: 'sales.crm',
|
|
44
|
+
table: 'crm_deals',
|
|
45
|
+
stateCatalogId: 'crm.pipeline',
|
|
46
|
+
links: [{ toEntity: 'crm.contact', kind: 'has-many', via: 'deal_contacts', label: 'contacts' }]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 'crm.contact',
|
|
50
|
+
order: 20,
|
|
51
|
+
label: 'CRM Contact',
|
|
52
|
+
description: 'A person associated with a CRM relationship or deal.',
|
|
53
|
+
ownedBySystemId: 'sales.crm',
|
|
54
|
+
table: 'crm_contacts'
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'leadgen.list',
|
|
58
|
+
order: 30,
|
|
59
|
+
label: 'Lead List',
|
|
60
|
+
description: 'A prospecting list that groups companies and contacts for acquisition workflows.',
|
|
61
|
+
ownedBySystemId: 'sales.lead-gen',
|
|
62
|
+
table: 'acq_lists',
|
|
63
|
+
links: [
|
|
64
|
+
{ toEntity: 'leadgen.company', kind: 'has-many', via: 'acq_list_companies', label: 'companies' },
|
|
65
|
+
{ toEntity: 'leadgen.contact', kind: 'has-many', via: 'acq_list_members', label: 'contacts' }
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: 'leadgen.company',
|
|
70
|
+
order: 40,
|
|
71
|
+
label: 'Lead Company',
|
|
72
|
+
description: 'A company record sourced, enriched, and qualified during prospecting.',
|
|
73
|
+
ownedBySystemId: 'sales.lead-gen',
|
|
74
|
+
table: 'acq_list_companies',
|
|
75
|
+
stateCatalogId: 'lead-gen.company',
|
|
76
|
+
links: [
|
|
77
|
+
{ toEntity: 'leadgen.list', kind: 'belongs-to', via: 'list_id', label: 'list' },
|
|
78
|
+
{ toEntity: 'leadgen.contact', kind: 'has-many', via: 'company_id', label: 'contacts' }
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: 'leadgen.contact',
|
|
83
|
+
order: 50,
|
|
84
|
+
label: 'Lead Contact',
|
|
85
|
+
description: 'A prospect contact discovered or enriched during lead generation.',
|
|
86
|
+
ownedBySystemId: 'sales.lead-gen',
|
|
87
|
+
table: 'acq_list_members',
|
|
88
|
+
stateCatalogId: 'lead-gen.contact',
|
|
89
|
+
links: [
|
|
90
|
+
{ toEntity: 'leadgen.list', kind: 'belongs-to', via: 'list_id', label: 'list' },
|
|
91
|
+
{ toEntity: 'leadgen.company', kind: 'belongs-to', via: 'company_id', label: 'company' }
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: 'delivery.project',
|
|
96
|
+
order: 60,
|
|
97
|
+
label: 'Project',
|
|
98
|
+
description: 'A client delivery project.',
|
|
99
|
+
ownedBySystemId: 'projects',
|
|
100
|
+
table: 'projects',
|
|
101
|
+
links: [
|
|
102
|
+
{ toEntity: 'delivery.milestone', kind: 'has-many', via: 'project_id', label: 'milestones' },
|
|
103
|
+
{ toEntity: 'delivery.task', kind: 'has-many', via: 'project_id', label: 'tasks' }
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: 'delivery.milestone',
|
|
108
|
+
order: 70,
|
|
109
|
+
label: 'Milestone',
|
|
110
|
+
description: 'A delivery checkpoint within a project.',
|
|
111
|
+
ownedBySystemId: 'projects',
|
|
112
|
+
table: 'project_milestones',
|
|
113
|
+
links: [
|
|
114
|
+
{ toEntity: 'delivery.project', kind: 'belongs-to', via: 'project_id', label: 'project' },
|
|
115
|
+
{ toEntity: 'delivery.task', kind: 'has-many', via: 'milestone_id', label: 'tasks' }
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 'delivery.task',
|
|
120
|
+
order: 80,
|
|
121
|
+
label: 'Task',
|
|
122
|
+
description: 'A delivery task that can move through the task status catalog.',
|
|
123
|
+
ownedBySystemId: 'projects',
|
|
124
|
+
table: 'project_tasks',
|
|
125
|
+
stateCatalogId: 'delivery.task',
|
|
126
|
+
links: [
|
|
127
|
+
{ toEntity: 'delivery.project', kind: 'belongs-to', via: 'project_id', label: 'project' },
|
|
128
|
+
{ toEntity: 'delivery.milestone', kind: 'belongs-to', via: 'milestone_id', label: 'milestone' }
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
|
|
133
|
+
export const DEFAULT_ORGANIZATION_MODEL_ENTITIES: z.infer<typeof EntitiesDomainSchema> = Object.fromEntries(
|
|
134
|
+
ENTITY_ENTRY_INPUTS.map((entity) => {
|
|
135
|
+
const parsed = EntitySchema.parse(entity)
|
|
136
|
+
return [parsed.id, parsed]
|
|
137
|
+
})
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
export type EntityId = z.infer<typeof EntityIdSchema>
|
|
141
|
+
export type EntityLinkKind = z.infer<typeof EntityLinkKindSchema>
|
|
142
|
+
export type EntityLink = z.infer<typeof EntityLinkSchema>
|
|
143
|
+
export type Entity = z.infer<typeof EntitySchema>
|
|
144
|
+
export type EntitiesDomain = z.infer<typeof EntitiesDomainSchema>
|
|
@@ -43,6 +43,8 @@ const ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/
|
|
|
43
43
|
export const ObjectiveSchema = z.object({
|
|
44
44
|
/** Stable unique identifier for the goal (e.g. "goal-grow-arr-q1-2026"). */
|
|
45
45
|
id: z.string().trim().min(1).max(100),
|
|
46
|
+
/** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
|
|
47
|
+
order: z.number(),
|
|
46
48
|
/** Plain-language description of what the organization wants to achieve. */
|
|
47
49
|
description: z.string().trim().min(1).max(1000),
|
|
48
50
|
/**
|
|
@@ -67,14 +69,15 @@ export const ObjectiveSchema = z.object({
|
|
|
67
69
|
// Goals domain schema — a collection of goals the organization is pursuing.
|
|
68
70
|
// ---------------------------------------------------------------------------
|
|
69
71
|
|
|
70
|
-
export const GoalsDomainSchema = z
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
export const GoalsDomainSchema = z
|
|
73
|
+
.record(z.string(), ObjectiveSchema)
|
|
74
|
+
.refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
|
|
75
|
+
message: 'Each objective entry id must match its map key'
|
|
76
|
+
})
|
|
77
|
+
.default({})
|
|
73
78
|
|
|
74
79
|
// ---------------------------------------------------------------------------
|
|
75
80
|
// Seed — empty by default; adapters populate with real goal definitions.
|
|
76
81
|
// ---------------------------------------------------------------------------
|
|
77
82
|
|
|
78
|
-
export const DEFAULT_ORGANIZATION_MODEL_GOALS: z.infer<typeof GoalsDomainSchema> = {
|
|
79
|
-
objectives: []
|
|
80
|
-
}
|
|
83
|
+
export const DEFAULT_ORGANIZATION_MODEL_GOALS: z.infer<typeof GoalsDomainSchema> = {}
|