@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,261 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { OntologyIdSchema, parseOntologyId } from '../ontology'
|
|
3
|
+
import { JsonValueSchema, SystemPathSchema } from './systems'
|
|
4
|
+
import { ModelIdSchema } from './shared'
|
|
5
|
+
import { ResourceIdSchema, type ResourceEntry } from './resources'
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Topology domain
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
//
|
|
11
|
+
// Topology captures durable operational wiring. It stays separate from
|
|
12
|
+
// ontology, which describes semantic meaning.
|
|
13
|
+
|
|
14
|
+
const SecretLikeMetadataKeySchema = /(?:secret|password|passwd|token|api[-_]?key|credential|private[-_]?key)/i
|
|
15
|
+
const SecretLikeMetadataValueSchema =
|
|
16
|
+
/(?:sk-[A-Za-z0-9_-]{12,}|pk_live_[A-Za-z0-9_-]{12,}|eyJ[A-Za-z0-9_-]{20,}|-----BEGIN (?:RSA |OPENSSH |EC )?PRIVATE KEY-----)/
|
|
17
|
+
|
|
18
|
+
export const OmTopologyNodeKindSchema = z.enum([
|
|
19
|
+
'system',
|
|
20
|
+
'resource',
|
|
21
|
+
'ontology',
|
|
22
|
+
'policy',
|
|
23
|
+
'role',
|
|
24
|
+
'trigger',
|
|
25
|
+
'humanCheckpoint',
|
|
26
|
+
'externalResource'
|
|
27
|
+
])
|
|
28
|
+
|
|
29
|
+
export const OmTopologyRelationshipKindSchema = z.enum(['triggers', 'uses', 'approval'])
|
|
30
|
+
|
|
31
|
+
export const OmTopologyNodeRefSchema = z.discriminatedUnion('kind', [
|
|
32
|
+
z.object({ kind: z.literal('system'), id: ModelIdSchema }),
|
|
33
|
+
z.object({ kind: z.literal('resource'), id: ResourceIdSchema }),
|
|
34
|
+
z.object({ kind: z.literal('ontology'), id: OntologyIdSchema }),
|
|
35
|
+
z.object({ kind: z.literal('policy'), id: ModelIdSchema }),
|
|
36
|
+
z.object({ kind: z.literal('role'), id: ModelIdSchema }),
|
|
37
|
+
z.object({ kind: z.literal('trigger'), id: ResourceIdSchema }),
|
|
38
|
+
z.object({ kind: z.literal('humanCheckpoint'), id: ResourceIdSchema }),
|
|
39
|
+
z.object({ kind: z.literal('externalResource'), id: ResourceIdSchema })
|
|
40
|
+
])
|
|
41
|
+
|
|
42
|
+
export const OmTopologyMetadataSchema = z
|
|
43
|
+
.record(z.string().trim().min(1).max(120), JsonValueSchema)
|
|
44
|
+
.superRefine((metadata, ctx) => {
|
|
45
|
+
function visit(value: unknown, path: Array<string | number>): void {
|
|
46
|
+
if (typeof value === 'string' && SecretLikeMetadataValueSchema.test(value)) {
|
|
47
|
+
ctx.addIssue({
|
|
48
|
+
code: z.ZodIssueCode.custom,
|
|
49
|
+
path,
|
|
50
|
+
message: 'Topology metadata must not contain secret-like values'
|
|
51
|
+
})
|
|
52
|
+
return
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (Array.isArray(value)) {
|
|
56
|
+
value.forEach((entry, index) => visit(entry, [...path, index]))
|
|
57
|
+
return
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (typeof value !== 'object' || value === null) return
|
|
61
|
+
|
|
62
|
+
Object.entries(value).forEach(([key, entry]) => {
|
|
63
|
+
if (SecretLikeMetadataKeySchema.test(key)) {
|
|
64
|
+
ctx.addIssue({
|
|
65
|
+
code: z.ZodIssueCode.custom,
|
|
66
|
+
path: [...path, key],
|
|
67
|
+
message: `Topology metadata key "${key}" looks secret-like`
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
visit(entry, [...path, key])
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
visit(metadata, [])
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
export const OmTopologyRelationshipSchema = z.object({
|
|
78
|
+
from: OmTopologyNodeRefSchema,
|
|
79
|
+
kind: OmTopologyRelationshipKindSchema,
|
|
80
|
+
to: OmTopologyNodeRefSchema,
|
|
81
|
+
systemPath: SystemPathSchema.optional(),
|
|
82
|
+
required: z.boolean().optional(),
|
|
83
|
+
metadata: OmTopologyMetadataSchema.optional()
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
export const OmTopologyDomainSchema = z
|
|
87
|
+
.object({
|
|
88
|
+
version: z.literal(1).default(1),
|
|
89
|
+
relationships: z.record(z.string().trim().min(1).max(255), OmTopologyRelationshipSchema).default({})
|
|
90
|
+
})
|
|
91
|
+
.default({ version: 1, relationships: {} })
|
|
92
|
+
|
|
93
|
+
export const DEFAULT_ORGANIZATION_MODEL_TOPOLOGY: z.infer<typeof OmTopologyDomainSchema> = {
|
|
94
|
+
version: 1,
|
|
95
|
+
relationships: {}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export type OmTopologyNodeKind = z.infer<typeof OmTopologyNodeKindSchema>
|
|
99
|
+
export type OmTopologyRelationshipKind = z.infer<typeof OmTopologyRelationshipKindSchema>
|
|
100
|
+
export type OmTopologyNodeRef = z.infer<typeof OmTopologyNodeRefSchema>
|
|
101
|
+
export type OmTopologyMetadata = z.infer<typeof OmTopologyMetadataSchema>
|
|
102
|
+
export type OmTopologyRelationship = z.infer<typeof OmTopologyRelationshipSchema>
|
|
103
|
+
export type OmTopologyDomain = z.infer<typeof OmTopologyDomainSchema>
|
|
104
|
+
|
|
105
|
+
type TypedIdObject = { id: string }
|
|
106
|
+
type TopologyRefFactoryInput = string | TypedIdObject
|
|
107
|
+
type TopologyRelationshipInput = Omit<OmTopologyRelationship, 'from' | 'to'> & {
|
|
108
|
+
from: OmTopologyNodeInput
|
|
109
|
+
to: OmTopologyNodeInput
|
|
110
|
+
}
|
|
111
|
+
type TopologyRelationshipOptions = Omit<Partial<OmTopologyRelationship>, 'from' | 'kind' | 'to'>
|
|
112
|
+
export type OmTopologyNodeInput = OmTopologyNodeRef | ResourceEntry
|
|
113
|
+
|
|
114
|
+
function idFrom(input: TopologyRefFactoryInput): string {
|
|
115
|
+
return typeof input === 'string' ? input : input.id
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function parseRef(kind: OmTopologyNodeKind, id: string): OmTopologyNodeRef {
|
|
119
|
+
return OmTopologyNodeRefSchema.parse({ kind, id })
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function isNodeRef(input: unknown): input is OmTopologyNodeRef {
|
|
123
|
+
return OmTopologyNodeRefSchema.safeParse(input).success
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function isResourceEntry(input: unknown): input is ResourceEntry {
|
|
127
|
+
if (typeof input !== 'object' || input === null) return false
|
|
128
|
+
const candidate = input as Partial<ResourceEntry>
|
|
129
|
+
return (
|
|
130
|
+
typeof candidate.id === 'string' &&
|
|
131
|
+
typeof candidate.systemPath === 'string' &&
|
|
132
|
+
typeof candidate.status === 'string' &&
|
|
133
|
+
['workflow', 'agent', 'integration', 'script'].includes(String(candidate.kind))
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export const topologyRef = {
|
|
138
|
+
system: (system: TopologyRefFactoryInput) => parseRef('system', idFrom(system)),
|
|
139
|
+
resource: (resource: TopologyRefFactoryInput) => parseRef('resource', idFrom(resource)),
|
|
140
|
+
ontology: (record: TopologyRefFactoryInput) => parseRef('ontology', idFrom(record)),
|
|
141
|
+
policy: (policy: TopologyRefFactoryInput) => parseRef('policy', idFrom(policy)),
|
|
142
|
+
role: (role: TopologyRefFactoryInput) => parseRef('role', idFrom(role)),
|
|
143
|
+
trigger: (trigger: TopologyRefFactoryInput) => parseRef('trigger', idFrom(trigger)),
|
|
144
|
+
humanCheckpoint: (checkpoint: TopologyRefFactoryInput) => parseRef('humanCheckpoint', idFrom(checkpoint)),
|
|
145
|
+
externalResource: (externalResource: TopologyRefFactoryInput) => parseRef('externalResource', idFrom(externalResource))
|
|
146
|
+
} as const
|
|
147
|
+
|
|
148
|
+
export const topologyRelationship = {
|
|
149
|
+
triggers: (from: OmTopologyNodeInput, to: OmTopologyNodeInput, options: TopologyRelationshipOptions = {}) =>
|
|
150
|
+
defineTopologyRelationship({
|
|
151
|
+
...options,
|
|
152
|
+
from,
|
|
153
|
+
kind: 'triggers',
|
|
154
|
+
to
|
|
155
|
+
}),
|
|
156
|
+
uses: (from: OmTopologyNodeInput, to: OmTopologyNodeInput, options: TopologyRelationshipOptions = {}) =>
|
|
157
|
+
defineTopologyRelationship({
|
|
158
|
+
...options,
|
|
159
|
+
from,
|
|
160
|
+
kind: 'uses',
|
|
161
|
+
to
|
|
162
|
+
}),
|
|
163
|
+
approval: (from: OmTopologyNodeInput, to: OmTopologyNodeInput, options: TopologyRelationshipOptions = {}) =>
|
|
164
|
+
defineTopologyRelationship({
|
|
165
|
+
...options,
|
|
166
|
+
from,
|
|
167
|
+
kind: 'approval',
|
|
168
|
+
to
|
|
169
|
+
}),
|
|
170
|
+
usesIntegration: (
|
|
171
|
+
from: OmTopologyNodeInput,
|
|
172
|
+
integration: OmTopologyNodeInput,
|
|
173
|
+
options: TopologyRelationshipOptions = {}
|
|
174
|
+
) =>
|
|
175
|
+
defineTopologyRelationship({
|
|
176
|
+
required: true,
|
|
177
|
+
...options,
|
|
178
|
+
from,
|
|
179
|
+
kind: 'uses',
|
|
180
|
+
to: integration
|
|
181
|
+
}),
|
|
182
|
+
requestsApproval: (
|
|
183
|
+
from: OmTopologyNodeInput,
|
|
184
|
+
checkpoint: TopologyRefFactoryInput,
|
|
185
|
+
options: TopologyRelationshipOptions = {}
|
|
186
|
+
) =>
|
|
187
|
+
defineTopologyRelationship({
|
|
188
|
+
required: true,
|
|
189
|
+
...options,
|
|
190
|
+
from,
|
|
191
|
+
kind: 'approval',
|
|
192
|
+
to: topologyRef.humanCheckpoint(checkpoint)
|
|
193
|
+
}),
|
|
194
|
+
checkpointRoutesTo: (
|
|
195
|
+
checkpoint: TopologyRefFactoryInput,
|
|
196
|
+
to: OmTopologyNodeInput,
|
|
197
|
+
options: TopologyRelationshipOptions = {}
|
|
198
|
+
) =>
|
|
199
|
+
defineTopologyRelationship({
|
|
200
|
+
required: true,
|
|
201
|
+
...options,
|
|
202
|
+
from: topologyRef.humanCheckpoint(checkpoint),
|
|
203
|
+
kind: 'triggers',
|
|
204
|
+
to
|
|
205
|
+
})
|
|
206
|
+
} as const
|
|
207
|
+
|
|
208
|
+
export function compileTopologyNodeRef(input: OmTopologyNodeInput): OmTopologyNodeRef {
|
|
209
|
+
if (isNodeRef(input)) return input
|
|
210
|
+
if (isResourceEntry(input)) return topologyRef.resource(input)
|
|
211
|
+
|
|
212
|
+
throw new Error('Topology node refs must be typed node objects or serializable { kind, id } refs')
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function parseTopologyNodeRef(input: string | OmTopologyNodeRef): OmTopologyNodeRef {
|
|
216
|
+
if (typeof input !== 'string') return OmTopologyNodeRefSchema.parse(input)
|
|
217
|
+
|
|
218
|
+
const separatorIndex = input.indexOf(':')
|
|
219
|
+
if (separatorIndex === -1) {
|
|
220
|
+
throw new Error(`Topology node ref "${input}" must use <kind>:<id>`)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const kind = input.slice(0, separatorIndex)
|
|
224
|
+
const id = input.slice(separatorIndex + 1)
|
|
225
|
+
if (!OmTopologyNodeKindSchema.safeParse(kind).success) {
|
|
226
|
+
throw new Error(`Topology node ref "${input}" has unsupported kind "${kind}"`)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return OmTopologyNodeRefSchema.parse({ kind, id })
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export function defineTopologyRelationship(input: TopologyRelationshipInput): OmTopologyRelationship {
|
|
233
|
+
return OmTopologyRelationshipSchema.parse({
|
|
234
|
+
...input,
|
|
235
|
+
from: compileTopologyNodeRef(input.from),
|
|
236
|
+
to: compileTopologyNodeRef(input.to)
|
|
237
|
+
})
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function defineTopology(
|
|
241
|
+
relationships: Record<string, TopologyRelationshipInput> | TopologyRelationshipInput[]
|
|
242
|
+
): OmTopologyDomain {
|
|
243
|
+
const entries = Array.isArray(relationships)
|
|
244
|
+
? relationships.map((relationship, index) => [`relationship-${index + 1}`, relationship] as const)
|
|
245
|
+
: Object.entries(relationships)
|
|
246
|
+
|
|
247
|
+
return OmTopologyDomainSchema.parse({
|
|
248
|
+
version: 1,
|
|
249
|
+
relationships: Object.fromEntries(entries.map(([key, relationship]) => [key, defineTopologyRelationship(relationship)]))
|
|
250
|
+
})
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export function isOntologyTopologyRef(value: unknown): value is Extract<OmTopologyNodeRef, { kind: 'ontology' }> {
|
|
254
|
+
if (!isNodeRef(value) || value.kind !== 'ontology') return false
|
|
255
|
+
try {
|
|
256
|
+
parseOntologyId(value.id)
|
|
257
|
+
return true
|
|
258
|
+
} catch {
|
|
259
|
+
return false
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
import { resolveOrganizationModel } from './resolve'
|
|
2
|
-
import type { OrganizationModelBuiltinIconToken } from './icons'
|
|
3
|
-
import { projectOrganizationSurfaces, type OrganizationSurfaceProjection } from './surface-projection'
|
|
4
|
-
import type { DeepPartial, OrganizationModel } from './types'
|
|
5
|
-
|
|
6
|
-
export type FoundationSurfaceType = 'page' | 'dashboard' | 'graph' | 'detail' | 'list' | 'settings'
|
|
7
|
-
|
|
8
|
-
export type FoundationSurfaceIcon = Extract<
|
|
9
|
-
OrganizationModelBuiltinIconToken,
|
|
10
|
-
| 'feature.dashboard'
|
|
11
|
-
| 'feature.crm'
|
|
12
|
-
| 'feature.lead-gen'
|
|
13
|
-
| 'feature.projects'
|
|
14
|
-
| 'feature.operations'
|
|
15
|
-
| 'feature.settings'
|
|
16
|
-
>
|
|
17
|
-
|
|
18
|
-
export type FoundationNavigationSurface = Omit<OrganizationSurfaceProjection, 'icon' | 'surfaceType'> & {
|
|
19
|
-
icon?: FoundationSurfaceIcon | OrganizationModelBuiltinIconToken | string
|
|
20
|
-
surfaceType: FoundationSurfaceType
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface FoundationOrganizationModel extends Omit<OrganizationModel, 'navigation'> {
|
|
24
|
-
navigation: {
|
|
25
|
-
defaultSurfaceId: string
|
|
26
|
-
homeLabel: string
|
|
27
|
-
quickAccessSurfaceIds: readonly string[]
|
|
28
|
-
surfaces: FoundationNavigationSurface[]
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface FoundationBranding {
|
|
33
|
-
organizationName: string
|
|
34
|
-
productName: string
|
|
35
|
-
shortName: string
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function createFoundationOrganizationModel(override: DeepPartial<OrganizationModel>): {
|
|
39
|
-
canonical: OrganizationModel
|
|
40
|
-
model: FoundationOrganizationModel
|
|
41
|
-
homeLabel: string
|
|
42
|
-
quickAccessSurfaceIds: readonly string[]
|
|
43
|
-
getOrganizationSurface: (surfaceId: string) => FoundationNavigationSurface | undefined
|
|
44
|
-
} {
|
|
45
|
-
const canonical = resolveOrganizationModel(override)
|
|
46
|
-
const navigationSurfaces: FoundationNavigationSurface[] = projectOrganizationSurfaces(canonical)
|
|
47
|
-
const defaultSurface = navigationSurfaces.find((surface) => surface.path === '/') ?? navigationSurfaces[0]
|
|
48
|
-
const homeLabel = defaultSurface?.label ?? 'Dashboard'
|
|
49
|
-
const quickAccessSurfaceIds = navigationSurfaces
|
|
50
|
-
.filter((surface) => surface.id !== defaultSurface?.id && surface.surfaceType !== 'settings')
|
|
51
|
-
.slice(0, 4)
|
|
52
|
-
.map((surface) => surface.id)
|
|
53
|
-
|
|
54
|
-
const model: FoundationOrganizationModel = {
|
|
55
|
-
...canonical,
|
|
56
|
-
navigation: {
|
|
57
|
-
defaultSurfaceId: defaultSurface?.id ?? '',
|
|
58
|
-
homeLabel,
|
|
59
|
-
quickAccessSurfaceIds: [...quickAccessSurfaceIds],
|
|
60
|
-
surfaces: navigationSurfaces
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function getOrganizationSurface(surfaceId: string): FoundationNavigationSurface | undefined {
|
|
65
|
-
return model.navigation.surfaces.find((candidate) => candidate.id === surfaceId)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return {
|
|
69
|
-
canonical,
|
|
70
|
-
model,
|
|
71
|
-
homeLabel,
|
|
72
|
-
quickAccessSurfaceIds,
|
|
73
|
-
getOrganizationSurface
|
|
74
|
-
}
|
|
75
|
-
}
|
|
1
|
+
import { resolveOrganizationModel } from './resolve'
|
|
2
|
+
import type { OrganizationModelBuiltinIconToken } from './icons'
|
|
3
|
+
import { projectOrganizationSurfaces, type OrganizationSurfaceProjection } from './surface-projection'
|
|
4
|
+
import type { DeepPartial, OrganizationModel } from './types'
|
|
5
|
+
|
|
6
|
+
export type FoundationSurfaceType = 'page' | 'dashboard' | 'graph' | 'detail' | 'list' | 'settings'
|
|
7
|
+
|
|
8
|
+
export type FoundationSurfaceIcon = Extract<
|
|
9
|
+
OrganizationModelBuiltinIconToken,
|
|
10
|
+
| 'feature.dashboard'
|
|
11
|
+
| 'feature.crm'
|
|
12
|
+
| 'feature.lead-gen'
|
|
13
|
+
| 'feature.projects'
|
|
14
|
+
| 'feature.operations'
|
|
15
|
+
| 'feature.settings'
|
|
16
|
+
>
|
|
17
|
+
|
|
18
|
+
export type FoundationNavigationSurface = Omit<OrganizationSurfaceProjection, 'icon' | 'surfaceType'> & {
|
|
19
|
+
icon?: FoundationSurfaceIcon | OrganizationModelBuiltinIconToken | string
|
|
20
|
+
surfaceType: FoundationSurfaceType
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface FoundationOrganizationModel extends Omit<OrganizationModel, 'navigation'> {
|
|
24
|
+
navigation: {
|
|
25
|
+
defaultSurfaceId: string
|
|
26
|
+
homeLabel: string
|
|
27
|
+
quickAccessSurfaceIds: readonly string[]
|
|
28
|
+
surfaces: FoundationNavigationSurface[]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface FoundationBranding {
|
|
33
|
+
organizationName: string
|
|
34
|
+
productName: string
|
|
35
|
+
shortName: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function createFoundationOrganizationModel(override: DeepPartial<OrganizationModel>): {
|
|
39
|
+
canonical: OrganizationModel
|
|
40
|
+
model: FoundationOrganizationModel
|
|
41
|
+
homeLabel: string
|
|
42
|
+
quickAccessSurfaceIds: readonly string[]
|
|
43
|
+
getOrganizationSurface: (surfaceId: string) => FoundationNavigationSurface | undefined
|
|
44
|
+
} {
|
|
45
|
+
const canonical = resolveOrganizationModel(override)
|
|
46
|
+
const navigationSurfaces: FoundationNavigationSurface[] = projectOrganizationSurfaces(canonical)
|
|
47
|
+
const defaultSurface = navigationSurfaces.find((surface) => surface.path === '/') ?? navigationSurfaces[0]
|
|
48
|
+
const homeLabel = defaultSurface?.label ?? 'Dashboard'
|
|
49
|
+
const quickAccessSurfaceIds = navigationSurfaces
|
|
50
|
+
.filter((surface) => surface.id !== defaultSurface?.id && surface.surfaceType !== 'settings')
|
|
51
|
+
.slice(0, 4)
|
|
52
|
+
.map((surface) => surface.id)
|
|
53
|
+
|
|
54
|
+
const model: FoundationOrganizationModel = {
|
|
55
|
+
...canonical,
|
|
56
|
+
navigation: {
|
|
57
|
+
defaultSurfaceId: defaultSurface?.id ?? '',
|
|
58
|
+
homeLabel,
|
|
59
|
+
quickAccessSurfaceIds: [...quickAccessSurfaceIds],
|
|
60
|
+
surfaces: navigationSurfaces
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function getOrganizationSurface(surfaceId: string): FoundationNavigationSurface | undefined {
|
|
65
|
+
return model.navigation.surfaces.find((candidate) => candidate.id === surfaceId)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
canonical,
|
|
70
|
+
model,
|
|
71
|
+
homeLabel,
|
|
72
|
+
quickAccessSurfaceIds,
|
|
73
|
+
getOrganizationSurface
|
|
74
|
+
}
|
|
75
|
+
}
|