@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
|
@@ -2,120 +2,136 @@ import { z } from 'zod'
|
|
|
2
2
|
import { IconNameSchema, ModelIdSchema } from './shared'
|
|
3
3
|
import { NodeIdStringSchema } from './systems'
|
|
4
4
|
import { RoleIdSchema } from './roles'
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'
|
|
18
|
-
'
|
|
19
|
-
'
|
|
20
|
-
'
|
|
5
|
+
import { OntologyIdSchema } from '../ontology'
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// KnowledgeLink — a typed graph link pointing to another OM node.
|
|
9
|
+
// Uses NodeIdStringSchema (kind:dotted-path) to resolve to a graph node.
|
|
10
|
+
// Phase 1 only emits 'governs' edges from knowledge nodes.
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
export const KnowledgeTargetKindSchema = z
|
|
14
|
+
.enum([
|
|
15
|
+
'system',
|
|
16
|
+
'resource',
|
|
17
|
+
'knowledge',
|
|
18
|
+
'stage',
|
|
19
|
+
'action',
|
|
20
|
+
'role',
|
|
21
|
+
'goal',
|
|
21
22
|
'customer-segment',
|
|
22
23
|
'offering',
|
|
24
|
+
'ontology',
|
|
23
25
|
// D4: content nodes are a valid knowledge target after compound-domain data moved into system.content
|
|
24
26
|
'content-node'
|
|
25
27
|
])
|
|
26
28
|
.meta({ label: 'Target kind' })
|
|
27
29
|
|
|
28
|
-
export const KnowledgeTargetRefSchema = z
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
nodeId: NodeIdStringSchema
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
const CanonicalKnowledgeLinkSchema = z.object({
|
|
42
|
-
target: KnowledgeTargetRefSchema
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
function nodeIdFromTarget(target: z.infer<typeof KnowledgeTargetRefSchema>): string {
|
|
46
|
-
return `${target.kind}:${target.id}`
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function targetFromNodeId(nodeId: string): z.infer<typeof KnowledgeTargetRefSchema> {
|
|
50
|
-
const [kind, ...idParts] = nodeId.split(':')
|
|
51
|
-
return {
|
|
52
|
-
kind: KnowledgeTargetKindSchema.parse(kind),
|
|
53
|
-
id: idParts.join(':')
|
|
54
|
-
}
|
|
55
|
-
}
|
|
30
|
+
export const KnowledgeTargetRefSchema = z
|
|
31
|
+
.object({
|
|
32
|
+
kind: KnowledgeTargetKindSchema,
|
|
33
|
+
// D4: content-node targets use a qualified id format '<system-path>:<local-content-id>'.
|
|
34
|
+
// Ontology targets use the canonical '<scope>:<kind>/<local-id>' ontology id format.
|
|
35
|
+
// Business-logic validation of target existence is done in OrganizationModelSchema.superRefine.
|
|
36
|
+
id: z.string().trim().min(1).max(300)
|
|
37
|
+
})
|
|
38
|
+
.superRefine((target, ctx) => {
|
|
39
|
+
if (target.kind !== 'ontology') return
|
|
56
40
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
41
|
+
const result = OntologyIdSchema.safeParse(target.id)
|
|
42
|
+
if (!result.success) {
|
|
43
|
+
ctx.addIssue({
|
|
44
|
+
code: z.ZodIssueCode.custom,
|
|
45
|
+
path: ['id'],
|
|
46
|
+
message: 'Ontology knowledge targets must use <system-path>:<kind>/<local-id> or global:<kind>/<local-id>'
|
|
47
|
+
})
|
|
64
48
|
}
|
|
65
49
|
})
|
|
66
50
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
51
|
+
const LegacyKnowledgeLinkSchema = z.object({
|
|
52
|
+
nodeId: z.union([NodeIdStringSchema, z.templateLiteral(['ontology:', OntologyIdSchema])])
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
const CanonicalKnowledgeLinkSchema = z.object({
|
|
56
|
+
target: KnowledgeTargetRefSchema
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
function nodeIdFromTarget(target: z.infer<typeof KnowledgeTargetRefSchema>): string {
|
|
60
|
+
return `${target.kind}:${target.id}`
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function targetFromNodeId(nodeId: string): z.infer<typeof KnowledgeTargetRefSchema> {
|
|
64
|
+
const [kind, ...idParts] = nodeId.split(':')
|
|
65
|
+
return {
|
|
66
|
+
kind: KnowledgeTargetKindSchema.parse(kind),
|
|
67
|
+
id: idParts.join(':')
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export const KnowledgeLinkSchema = z
|
|
72
|
+
.union([CanonicalKnowledgeLinkSchema, LegacyKnowledgeLinkSchema])
|
|
73
|
+
.transform((link) => {
|
|
74
|
+
const target = 'target' in link ? link.target : targetFromNodeId(link.nodeId)
|
|
75
|
+
return {
|
|
76
|
+
target,
|
|
77
|
+
nodeId: nodeIdFromTarget(target)
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// OrgKnowledgeNode — single schema, `kind` discriminator drives presentation.
|
|
83
|
+
// Phase 1: body is raw MDX string (lossless migration from operations/ docs).
|
|
84
|
+
// Phase 2 (deferred): structured block format (Supabase-backed authoring).
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
|
|
87
|
+
export const OrgKnowledgeKindSchema = z
|
|
88
|
+
.enum(['playbook', 'strategy', 'reference'])
|
|
89
|
+
.meta({ label: 'Knowledge kind', color: 'grape' })
|
|
90
|
+
|
|
91
|
+
export const OrgKnowledgeNodeSchema = z.object({
|
|
92
|
+
id: ModelIdSchema,
|
|
93
|
+
kind: OrgKnowledgeKindSchema,
|
|
94
|
+
title: z.string().trim().min(1).max(200),
|
|
95
|
+
summary: z.string().trim().min(1).max(1000),
|
|
82
96
|
icon: IconNameSchema.optional(),
|
|
83
97
|
/** Canonical documentation URL when body content is a local summary. */
|
|
84
98
|
externalUrl: z.string().trim().url().max(500).optional(),
|
|
99
|
+
/** Optional generated source file path for local MDX-backed knowledge nodes. */
|
|
100
|
+
sourceFilePath: z.string().trim().min(1).max(500).optional(),
|
|
85
101
|
/** Raw MDX string. Phase 2 will introduce a structured block format. */
|
|
86
102
|
body: z.string().trim().min(1),
|
|
87
|
-
/**
|
|
88
|
-
* Graph links to other OM nodes this knowledge node governs.
|
|
89
|
-
* Each link emits a `governs` edge: knowledge-node -> target node.
|
|
90
|
-
*/
|
|
91
|
-
links: z.array(KnowledgeLinkSchema).default([]),
|
|
92
|
-
/** Role identifiers that own this knowledge node. */
|
|
93
|
-
ownerIds: z.array(RoleIdSchema.meta({ ref: 'role' })).default([]),
|
|
94
|
-
/** ISO date string (YYYY-MM-DD or full ISO 8601) of last meaningful update. */
|
|
95
|
-
updatedAt: z.string().trim().min(1).max(50)
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
// ---------------------------------------------------------------------------
|
|
99
|
-
// Domain schema — flat Record<id, KnowledgeNode> (D3: flatten per Phase 4 cut)
|
|
100
|
-
//
|
|
101
|
-
// Wave 1 shape change: the old wrapper object { version, lastModified, nodes[] }
|
|
102
|
-
// is replaced by a plain id-keyed map. version/lastModified move to
|
|
103
|
-
// domainMetadata.knowledge (D7). The default is an empty map {}.
|
|
104
|
-
//
|
|
105
|
-
// Wave 2 (elevasis-core canonicalOrganizationModel) must produce a value of this
|
|
106
|
-
// shape: Record<KnowledgeId, OrgKnowledgeNode> — i.e., an object keyed by
|
|
107
|
-
// each node's id string, with OrgKnowledgeNode as the value. Example:
|
|
108
|
-
// knowledge: {
|
|
109
|
-
// 'playbook.crm.discovery': { id: 'playbook.crm.discovery', kind: 'playbook', ... },
|
|
110
|
-
// }
|
|
111
|
-
// ---------------------------------------------------------------------------
|
|
112
|
-
|
|
113
|
-
export const KnowledgeDomainSchema = z.record(ModelIdSchema, OrgKnowledgeNodeSchema).default({})
|
|
114
|
-
|
|
115
|
-
export type OrgKnowledgeNode = z.infer<typeof OrgKnowledgeNodeSchema>
|
|
116
|
-
export type OrgKnowledgeNodeInput = z.input<typeof OrgKnowledgeNodeSchema>
|
|
117
|
-
export type OrgKnowledgeKind = z.infer<typeof OrgKnowledgeKindSchema>
|
|
118
|
-
export type KnowledgeTargetKind = z.infer<typeof KnowledgeTargetKindSchema>
|
|
119
|
-
export type KnowledgeTargetRef = z.infer<typeof KnowledgeTargetRefSchema>
|
|
120
|
-
export type KnowledgeLink = z.infer<typeof KnowledgeLinkSchema>
|
|
121
|
-
export type KnowledgeDomain = z.infer<typeof KnowledgeDomainSchema>
|
|
103
|
+
/**
|
|
104
|
+
* Graph links to other OM nodes this knowledge node governs.
|
|
105
|
+
* Each link emits a `governs` edge: knowledge-node -> target node.
|
|
106
|
+
*/
|
|
107
|
+
links: z.array(KnowledgeLinkSchema).default([]),
|
|
108
|
+
/** Role identifiers that own this knowledge node. */
|
|
109
|
+
ownerIds: z.array(RoleIdSchema.meta({ ref: 'role' })).default([]),
|
|
110
|
+
/** ISO date string (YYYY-MM-DD or full ISO 8601) of last meaningful update. */
|
|
111
|
+
updatedAt: z.string().trim().min(1).max(50)
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Domain schema — flat Record<id, KnowledgeNode> (D3: flatten per Phase 4 cut)
|
|
116
|
+
//
|
|
117
|
+
// Wave 1 shape change: the old wrapper object { version, lastModified, nodes[] }
|
|
118
|
+
// is replaced by a plain id-keyed map. version/lastModified move to
|
|
119
|
+
// domainMetadata.knowledge (D7). The default is an empty map {}.
|
|
120
|
+
//
|
|
121
|
+
// Wave 2 (elevasis-core canonicalOrganizationModel) must produce a value of this
|
|
122
|
+
// shape: Record<KnowledgeId, OrgKnowledgeNode> — i.e., an object keyed by
|
|
123
|
+
// each node's id string, with OrgKnowledgeNode as the value. Example:
|
|
124
|
+
// knowledge: {
|
|
125
|
+
// 'playbook.crm.discovery': { id: 'playbook.crm.discovery', kind: 'playbook', ... },
|
|
126
|
+
// }
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
export const KnowledgeDomainSchema = z.record(ModelIdSchema, OrgKnowledgeNodeSchema).default({})
|
|
130
|
+
|
|
131
|
+
export type OrgKnowledgeNode = z.infer<typeof OrgKnowledgeNodeSchema>
|
|
132
|
+
export type OrgKnowledgeNodeInput = z.input<typeof OrgKnowledgeNodeSchema>
|
|
133
|
+
export type OrgKnowledgeKind = z.infer<typeof OrgKnowledgeKindSchema>
|
|
134
|
+
export type KnowledgeTargetKind = z.infer<typeof KnowledgeTargetKindSchema>
|
|
135
|
+
export type KnowledgeTargetRef = z.infer<typeof KnowledgeTargetRefSchema>
|
|
136
|
+
export type KnowledgeLink = z.infer<typeof KnowledgeLinkSchema>
|
|
137
|
+
export type KnowledgeDomain = z.infer<typeof KnowledgeDomainSchema>
|
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
import { z, type ZodType } from 'zod'
|
|
2
|
-
import { DescriptionSchema, IconNameSchema, LabelSchema, ModelIdSchema, PathSchema } from './shared'
|
|
3
|
-
|
|
4
|
-
export const SurfaceTypeSchema = z
|
|
5
|
-
.enum(['page', 'dashboard', 'graph', 'detail', 'list', 'settings'])
|
|
6
|
-
.meta({ label: 'Surface type', color: 'blue' })
|
|
7
|
-
|
|
8
|
-
export const SurfaceDefinitionSchema = z.object({
|
|
9
|
-
id: ModelIdSchema,
|
|
10
|
-
label: LabelSchema,
|
|
11
|
-
path: PathSchema,
|
|
12
|
-
surfaceType: SurfaceTypeSchema,
|
|
13
|
-
description: DescriptionSchema.optional(),
|
|
14
|
-
enabled: z.boolean().default(true),
|
|
15
|
-
devOnly: z.boolean().optional(),
|
|
16
|
-
icon: IconNameSchema.optional(),
|
|
17
|
-
systemIds: z.array(ModelIdSchema.meta({ ref: 'system' })).default([]),
|
|
18
|
-
entityIds: z.array(ModelIdSchema.meta({ ref: 'entity' })).default([]),
|
|
19
|
-
resourceIds: z.array(ModelIdSchema.meta({ ref: 'resource' })).default([]),
|
|
20
|
-
actionIds: z.array(ModelIdSchema.meta({ ref: 'action' })).default([]),
|
|
21
|
-
parentId: ModelIdSchema.meta({ ref: 'surface' }).optional()
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
export const SidebarSurfaceTargetsSchema = z
|
|
25
|
-
.object({
|
|
26
|
-
systems: z.array(ModelIdSchema.meta({ ref: 'system' })).default([]).optional(),
|
|
27
|
-
entities: z.array(ModelIdSchema.meta({ ref: 'entity' })).default([]).optional(),
|
|
28
|
-
resources: z.array(ModelIdSchema.meta({ ref: 'resource' })).default([]).optional(),
|
|
29
|
-
actions: z.array(ModelIdSchema.meta({ ref: 'action' })).default([]).optional()
|
|
30
|
-
})
|
|
31
|
-
.default({})
|
|
32
|
-
|
|
33
|
-
export interface SidebarSurfaceNode {
|
|
34
|
-
type: 'surface'
|
|
35
|
-
label: string
|
|
36
|
-
path: string
|
|
37
|
-
surfaceType: z.infer<typeof SurfaceTypeSchema>
|
|
38
|
-
description?: string
|
|
39
|
-
icon?: string
|
|
40
|
-
order?: number
|
|
41
|
-
targets?: {
|
|
42
|
-
systems?: string[]
|
|
43
|
-
entities?: string[]
|
|
44
|
-
resources?: string[]
|
|
45
|
-
actions?: string[]
|
|
46
|
-
}
|
|
47
|
-
devOnly?: boolean
|
|
48
|
-
requiresAdmin?: boolean
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export interface SidebarGroupNode {
|
|
52
|
-
type: 'group'
|
|
53
|
-
label: string
|
|
54
|
-
description?: string
|
|
55
|
-
icon?: string
|
|
56
|
-
order?: number
|
|
57
|
-
children: Record<string, SidebarNode>
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export type SidebarNode = SidebarSurfaceNode | SidebarGroupNode
|
|
61
|
-
|
|
62
|
-
export const SidebarNodeSchema: ZodType<SidebarNode> = z.lazy(() =>
|
|
63
|
-
z.discriminatedUnion('type', [
|
|
64
|
-
z.object({
|
|
65
|
-
type: z.literal('group'),
|
|
66
|
-
label: LabelSchema,
|
|
67
|
-
description: DescriptionSchema.optional(),
|
|
68
|
-
icon: IconNameSchema.optional(),
|
|
69
|
-
order: z.number().int().optional(),
|
|
70
|
-
children: z.record(z.string(), SidebarNodeSchema).default({})
|
|
71
|
-
}),
|
|
72
|
-
z.object({
|
|
73
|
-
type: z.literal('surface'),
|
|
74
|
-
label: LabelSchema,
|
|
75
|
-
path: PathSchema,
|
|
76
|
-
surfaceType: SurfaceTypeSchema,
|
|
77
|
-
description: DescriptionSchema.optional(),
|
|
78
|
-
icon: IconNameSchema.optional(),
|
|
79
|
-
order: z.number().int().optional(),
|
|
80
|
-
targets: SidebarSurfaceTargetsSchema.optional(),
|
|
81
|
-
devOnly: z.boolean().optional(),
|
|
82
|
-
requiresAdmin: z.boolean().optional()
|
|
83
|
-
})
|
|
84
|
-
])
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
export const SidebarSectionSchema = z.record(z.string(), SidebarNodeSchema).default({})
|
|
88
|
-
|
|
89
|
-
export const SidebarNavigationSchema = z
|
|
90
|
-
.object({
|
|
91
|
-
primary: SidebarSectionSchema,
|
|
92
|
-
bottom: SidebarSectionSchema
|
|
93
|
-
})
|
|
94
|
-
.default({ primary: {}, bottom: {} })
|
|
95
|
-
|
|
96
|
-
export const OrganizationModelNavigationSchema = z
|
|
97
|
-
.object({
|
|
98
|
-
sidebar: SidebarNavigationSchema
|
|
99
|
-
})
|
|
100
|
-
.default({ sidebar: { primary: {}, bottom: {} } })
|
|
101
|
-
|
|
102
|
-
export const DEFAULT_ORGANIZATION_MODEL_NAVIGATION: z.infer<typeof OrganizationModelNavigationSchema> = {
|
|
103
|
-
sidebar: {
|
|
104
|
-
primary: {},
|
|
105
|
-
bottom: {}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export function getSortedSidebarEntries<TNode extends SidebarNode>(
|
|
110
|
-
nodes: Record<string, TNode>
|
|
111
|
-
): Array<[string, TNode]> {
|
|
112
|
-
return Object.entries(nodes).sort(([leftId, left], [rightId, right]) => {
|
|
113
|
-
const orderDelta = (left.order ?? Number.MAX_SAFE_INTEGER) - (right.order ?? Number.MAX_SAFE_INTEGER)
|
|
114
|
-
return orderDelta === 0 ? leftId.localeCompare(rightId) : orderDelta
|
|
115
|
-
})
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Core placement values: 'primary' | 'secondary' | 'bottom'.
|
|
120
|
-
*
|
|
121
|
-
* `placement` is intentionally open (`z.string()`) so that per-project adapters can
|
|
122
|
-
* introduce additional placement IDs (e.g. 'pinned', 'spotlight', 'contextual') without
|
|
123
|
-
* forking core. Extension pattern: add the new string literal to the project's
|
|
124
|
-
* `foundations/config/organization-model.ts` adapter — no changes to this file required.
|
|
125
|
-
*
|
|
126
|
-
* `surfaceType` and `resourceType` remain closed enums (UI/runtime invariants).
|
|
127
|
-
*/
|
|
128
|
-
export const CORE_PLACEMENT_VALUES = ['primary', 'secondary', 'bottom'] as const
|
|
129
|
-
export type CorePlacement = (typeof CORE_PLACEMENT_VALUES)[number]
|
|
130
|
-
|
|
131
|
-
export const NavigationGroupSchema = z.object({
|
|
132
|
-
id: ModelIdSchema,
|
|
133
|
-
label: LabelSchema,
|
|
134
|
-
placement: z.string().trim().min(1).max(50),
|
|
135
|
-
surfaceIds: z.array(ModelIdSchema.meta({ ref: 'surface' })).default([])
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
// SurfaceDefinitionSchema and NavigationGroupSchema remain for derived DTOs and
|
|
139
|
-
// transitional call sites. They are not authored top-level OrganizationModel fields.
|
|
1
|
+
import { z, type ZodType } from 'zod'
|
|
2
|
+
import { DescriptionSchema, IconNameSchema, LabelSchema, ModelIdSchema, PathSchema } from './shared'
|
|
3
|
+
|
|
4
|
+
export const SurfaceTypeSchema = z
|
|
5
|
+
.enum(['page', 'dashboard', 'graph', 'detail', 'list', 'settings'])
|
|
6
|
+
.meta({ label: 'Surface type', color: 'blue' })
|
|
7
|
+
|
|
8
|
+
export const SurfaceDefinitionSchema = z.object({
|
|
9
|
+
id: ModelIdSchema,
|
|
10
|
+
label: LabelSchema,
|
|
11
|
+
path: PathSchema,
|
|
12
|
+
surfaceType: SurfaceTypeSchema,
|
|
13
|
+
description: DescriptionSchema.optional(),
|
|
14
|
+
enabled: z.boolean().default(true),
|
|
15
|
+
devOnly: z.boolean().optional(),
|
|
16
|
+
icon: IconNameSchema.optional(),
|
|
17
|
+
systemIds: z.array(ModelIdSchema.meta({ ref: 'system' })).default([]),
|
|
18
|
+
entityIds: z.array(ModelIdSchema.meta({ ref: 'entity' })).default([]),
|
|
19
|
+
resourceIds: z.array(ModelIdSchema.meta({ ref: 'resource' })).default([]),
|
|
20
|
+
actionIds: z.array(ModelIdSchema.meta({ ref: 'action' })).default([]),
|
|
21
|
+
parentId: ModelIdSchema.meta({ ref: 'surface' }).optional()
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
export const SidebarSurfaceTargetsSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
systems: z.array(ModelIdSchema.meta({ ref: 'system' })).default([]).optional(),
|
|
27
|
+
entities: z.array(ModelIdSchema.meta({ ref: 'entity' })).default([]).optional(),
|
|
28
|
+
resources: z.array(ModelIdSchema.meta({ ref: 'resource' })).default([]).optional(),
|
|
29
|
+
actions: z.array(ModelIdSchema.meta({ ref: 'action' })).default([]).optional()
|
|
30
|
+
})
|
|
31
|
+
.default({})
|
|
32
|
+
|
|
33
|
+
export interface SidebarSurfaceNode {
|
|
34
|
+
type: 'surface'
|
|
35
|
+
label: string
|
|
36
|
+
path: string
|
|
37
|
+
surfaceType: z.infer<typeof SurfaceTypeSchema>
|
|
38
|
+
description?: string
|
|
39
|
+
icon?: string
|
|
40
|
+
order?: number
|
|
41
|
+
targets?: {
|
|
42
|
+
systems?: string[]
|
|
43
|
+
entities?: string[]
|
|
44
|
+
resources?: string[]
|
|
45
|
+
actions?: string[]
|
|
46
|
+
}
|
|
47
|
+
devOnly?: boolean
|
|
48
|
+
requiresAdmin?: boolean
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface SidebarGroupNode {
|
|
52
|
+
type: 'group'
|
|
53
|
+
label: string
|
|
54
|
+
description?: string
|
|
55
|
+
icon?: string
|
|
56
|
+
order?: number
|
|
57
|
+
children: Record<string, SidebarNode>
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type SidebarNode = SidebarSurfaceNode | SidebarGroupNode
|
|
61
|
+
|
|
62
|
+
export const SidebarNodeSchema: ZodType<SidebarNode> = z.lazy(() =>
|
|
63
|
+
z.discriminatedUnion('type', [
|
|
64
|
+
z.object({
|
|
65
|
+
type: z.literal('group'),
|
|
66
|
+
label: LabelSchema,
|
|
67
|
+
description: DescriptionSchema.optional(),
|
|
68
|
+
icon: IconNameSchema.optional(),
|
|
69
|
+
order: z.number().int().optional(),
|
|
70
|
+
children: z.record(z.string(), SidebarNodeSchema).default({})
|
|
71
|
+
}),
|
|
72
|
+
z.object({
|
|
73
|
+
type: z.literal('surface'),
|
|
74
|
+
label: LabelSchema,
|
|
75
|
+
path: PathSchema,
|
|
76
|
+
surfaceType: SurfaceTypeSchema,
|
|
77
|
+
description: DescriptionSchema.optional(),
|
|
78
|
+
icon: IconNameSchema.optional(),
|
|
79
|
+
order: z.number().int().optional(),
|
|
80
|
+
targets: SidebarSurfaceTargetsSchema.optional(),
|
|
81
|
+
devOnly: z.boolean().optional(),
|
|
82
|
+
requiresAdmin: z.boolean().optional()
|
|
83
|
+
})
|
|
84
|
+
])
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
export const SidebarSectionSchema = z.record(z.string(), SidebarNodeSchema).default({})
|
|
88
|
+
|
|
89
|
+
export const SidebarNavigationSchema = z
|
|
90
|
+
.object({
|
|
91
|
+
primary: SidebarSectionSchema,
|
|
92
|
+
bottom: SidebarSectionSchema
|
|
93
|
+
})
|
|
94
|
+
.default({ primary: {}, bottom: {} })
|
|
95
|
+
|
|
96
|
+
export const OrganizationModelNavigationSchema = z
|
|
97
|
+
.object({
|
|
98
|
+
sidebar: SidebarNavigationSchema
|
|
99
|
+
})
|
|
100
|
+
.default({ sidebar: { primary: {}, bottom: {} } })
|
|
101
|
+
|
|
102
|
+
export const DEFAULT_ORGANIZATION_MODEL_NAVIGATION: z.infer<typeof OrganizationModelNavigationSchema> = {
|
|
103
|
+
sidebar: {
|
|
104
|
+
primary: {},
|
|
105
|
+
bottom: {}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function getSortedSidebarEntries<TNode extends SidebarNode>(
|
|
110
|
+
nodes: Record<string, TNode>
|
|
111
|
+
): Array<[string, TNode]> {
|
|
112
|
+
return Object.entries(nodes).sort(([leftId, left], [rightId, right]) => {
|
|
113
|
+
const orderDelta = (left.order ?? Number.MAX_SAFE_INTEGER) - (right.order ?? Number.MAX_SAFE_INTEGER)
|
|
114
|
+
return orderDelta === 0 ? leftId.localeCompare(rightId) : orderDelta
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Core placement values: 'primary' | 'secondary' | 'bottom'.
|
|
120
|
+
*
|
|
121
|
+
* `placement` is intentionally open (`z.string()`) so that per-project adapters can
|
|
122
|
+
* introduce additional placement IDs (e.g. 'pinned', 'spotlight', 'contextual') without
|
|
123
|
+
* forking core. Extension pattern: add the new string literal to the project's
|
|
124
|
+
* `foundations/config/organization-model.ts` adapter — no changes to this file required.
|
|
125
|
+
*
|
|
126
|
+
* `surfaceType` and `resourceType` remain closed enums (UI/runtime invariants).
|
|
127
|
+
*/
|
|
128
|
+
export const CORE_PLACEMENT_VALUES = ['primary', 'secondary', 'bottom'] as const
|
|
129
|
+
export type CorePlacement = (typeof CORE_PLACEMENT_VALUES)[number]
|
|
130
|
+
|
|
131
|
+
export const NavigationGroupSchema = z.object({
|
|
132
|
+
id: ModelIdSchema,
|
|
133
|
+
label: LabelSchema,
|
|
134
|
+
placement: z.string().trim().min(1).max(50),
|
|
135
|
+
surfaceIds: z.array(ModelIdSchema.meta({ ref: 'surface' })).default([])
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
// SurfaceDefinitionSchema and NavigationGroupSchema remain for derived DTOs and
|
|
139
|
+
// transitional call sites. They are not authored top-level OrganizationModel fields.
|