@elevasis/core 0.22.0 → 0.23.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 +2330 -2391
- package/dist/index.js +2322 -1147
- package/dist/knowledge/index.d.ts +702 -1136
- package/dist/knowledge/index.js +9 -9
- package/dist/organization-model/index.d.ts +2330 -2391
- package/dist/organization-model/index.js +2322 -1147
- package/dist/test-utils/index.d.ts +703 -1106
- package/dist/test-utils/index.js +1735 -1089
- package/package.json +1 -1
- package/src/__tests__/template-core-compatibility.test.ts +11 -79
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +360 -98
- package/src/business/acquisition/api-schemas.test.ts +2 -2
- package/src/business/acquisition/api-schemas.ts +7 -9
- package/src/business/acquisition/build-templates.test.ts +4 -4
- package/src/business/acquisition/build-templates.ts +72 -30
- package/src/business/acquisition/crm-state-actions.test.ts +13 -11
- package/src/business/acquisition/types.ts +7 -3
- package/src/execution/engine/agent/core/types.ts +1 -1
- package/src/execution/engine/workflow/types.ts +2 -2
- package/src/knowledge/README.md +8 -7
- package/src/knowledge/__tests__/queries.test.ts +74 -73
- package/src/knowledge/format.ts +10 -9
- package/src/knowledge/index.ts +1 -1
- package/src/knowledge/published.ts +1 -1
- package/src/knowledge/queries.ts +26 -25
- package/src/organization-model/README.md +66 -26
- package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -0
- package/src/organization-model/__tests__/defaults.test.ts +72 -98
- package/src/organization-model/__tests__/domains/actions.test.ts +56 -0
- package/src/organization-model/__tests__/domains/customers.test.ts +299 -295
- package/src/organization-model/__tests__/domains/entities.test.ts +56 -0
- package/src/organization-model/__tests__/domains/goals.test.ts +493 -479
- package/src/organization-model/__tests__/domains/identity.test.ts +280 -279
- package/src/organization-model/__tests__/domains/navigation.test.ts +268 -212
- package/src/organization-model/__tests__/domains/offerings.test.ts +414 -419
- package/src/organization-model/__tests__/domains/policies.test.ts +323 -0
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +271 -271
- package/src/organization-model/__tests__/domains/resources.test.ts +159 -37
- package/src/organization-model/__tests__/domains/roles.test.ts +147 -86
- package/src/organization-model/__tests__/domains/statuses.test.ts +246 -243
- package/src/organization-model/__tests__/domains/systems.test.ts +67 -51
- package/src/organization-model/__tests__/flatten-additive-merge.test.ts +361 -0
- package/src/organization-model/__tests__/foundation.test.ts +74 -102
- package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -0
- package/src/organization-model/__tests__/graph.test.ts +899 -71
- package/src/organization-model/__tests__/knowledge.test.ts +173 -52
- 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 +36 -27
- package/src/organization-model/__tests__/recursive-system-schema.test.ts +520 -0
- package/src/organization-model/__tests__/resolve.test.ts +174 -23
- package/src/organization-model/__tests__/schema.test.ts +291 -114
- package/src/organization-model/__tests__/surface-projection.test.ts +207 -97
- 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 +74 -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 +13 -3
- package/src/organization-model/defaults.ts +488 -96
- package/src/organization-model/domains/actions.ts +239 -0
- package/src/organization-model/domains/customers.ts +78 -75
- package/src/organization-model/domains/entities.ts +144 -0
- package/src/organization-model/domains/goals.ts +83 -80
- package/src/organization-model/domains/knowledge.ts +74 -16
- package/src/organization-model/domains/navigation.ts +107 -384
- package/src/organization-model/domains/offerings.ts +71 -66
- package/src/organization-model/domains/policies.ts +102 -0
- package/src/organization-model/domains/projects.ts +14 -48
- package/src/organization-model/domains/prospecting.ts +62 -181
- package/src/organization-model/domains/resources.ts +81 -24
- package/src/organization-model/domains/roles.ts +13 -10
- package/src/organization-model/domains/sales.ts +10 -219
- package/src/organization-model/domains/shared.ts +57 -57
- package/src/organization-model/domains/statuses.ts +339 -130
- package/src/organization-model/domains/systems.ts +186 -29
- package/src/organization-model/foundation.ts +54 -67
- package/src/organization-model/graph/build.ts +682 -54
- package/src/organization-model/graph/link.ts +1 -1
- package/src/organization-model/graph/schema.ts +24 -9
- package/src/organization-model/graph/types.ts +20 -7
- package/src/organization-model/helpers.ts +231 -26
- package/src/organization-model/index.ts +116 -5
- package/src/organization-model/migration-helpers.ts +249 -0
- package/src/organization-model/organization-graph.mdx +16 -15
- package/src/organization-model/organization-model.mdx +89 -41
- package/src/organization-model/published.ts +120 -18
- package/src/organization-model/resolve.ts +117 -54
- package/src/organization-model/schema.ts +561 -140
- package/src/organization-model/surface-projection.ts +116 -122
- package/src/organization-model/types.ts +102 -21
- package/src/platform/constants/versions.ts +1 -1
- package/src/platform/registry/__tests__/command-view.test.ts +6 -8
- package/src/platform/registry/__tests__/resource-link.test.ts +13 -8
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +16 -31
- package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -0
- package/src/platform/registry/__tests__/resource-registry.test.ts +9 -7
- package/src/platform/registry/__tests__/validation.test.ts +15 -11
- package/src/platform/registry/resource-registry.ts +20 -8
- package/src/platform/registry/serialization.ts +7 -7
- package/src/platform/registry/types.ts +3 -3
- package/src/platform/registry/validation.ts +17 -15
- package/src/reference/_generated/contracts.md +362 -99
- package/src/reference/glossary.md +18 -18
- package/src/supabase/database.types.ts +60 -0
- package/src/test-utils/test-utils.test.ts +1 -6
- 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
|
@@ -13,31 +13,31 @@ description: Terminology disambiguation for Organization OS concepts used in the
|
|
|
13
13
|
|
|
14
14
|
**DeploymentSpec** -- runtime/deploy assembly for one organization: workflows, agents, triggers, integrations, relationships, external resources, and human checkpoints. It assembles executable behavior around Organization Model resource descriptors; it is not the source of resource identity.
|
|
15
15
|
|
|
16
|
-
**Feature** --
|
|
16
|
+
**Feature** -- legacy or UI-package wording for a platform capability area. In the current Organization Model, use **System** for semantic ownership and **navigation surface** for shell placement. Keep "feature" only when referring to existing UI package folders, exported manifest names, or legacy compatibility recipes.
|
|
17
17
|
|
|
18
|
-
**
|
|
18
|
+
**SystemGuard** -- route-level System gate from `@elevasis/ui/features/auth`.
|
|
19
19
|
|
|
20
|
-
**
|
|
20
|
+
**SystemModule** -- manifest contract a shell module provides to `ElevasisSystemsProvider`. Key fields are `key`, optional `systemId`, optional `routePrefixes`, optional `capabilityIds`, optional `icon`, optional `sidebar`, optional `sidebarWidth`, and optional graph bridge metadata.
|
|
21
21
|
|
|
22
|
-
**
|
|
22
|
+
**systemId** -- the `SystemModule` field that points to an `OrganizationModel.systems` entry. Navigation-only app modules may omit it and use route prefixes/surface metadata instead.
|
|
23
23
|
|
|
24
24
|
**Foundations** -- local adapter layer in external projects that exports `canonicalOrganizationModel`, `organizationModel`, and workflow I/O schemas.
|
|
25
25
|
|
|
26
|
-
**Graph node ID** -- kind-prefixed cross-collection identifier such as `
|
|
26
|
+
**Graph node ID** -- kind-prefixed cross-collection identifier such as `system:sales.crm`, `integration:instantly`, or `resource:lead-import`.
|
|
27
27
|
|
|
28
28
|
**Manifest** -- a runtime declaration for a feature or resource collection.
|
|
29
29
|
|
|
30
|
-
**MembershipFeatureConfig** -- per-member feature override config
|
|
30
|
+
**MembershipFeatureConfig** -- legacy per-member feature override config. Current System visibility is resolved through Organization Model lifecycle/access metadata and provider compatibility layers.
|
|
31
31
|
|
|
32
|
-
**OrganizationModel** -- top-level semantic contract for an organization. Current primary fields include `
|
|
32
|
+
**OrganizationModel** -- top-level semantic contract for an organization. Current primary fields include `version`, `domainMetadata`, `branding`, `navigation`, `sales`, `prospecting`, `projects`, `identity`, `customers`, `offerings`, `roles`, `goals`, `systems`, `resources`, `actions`, `entities`, `policies`, `statuses`, and `knowledge`.
|
|
33
33
|
|
|
34
|
-
**
|
|
34
|
+
**OrganizationModelSystemEntry** -- System node in `OrganizationModel.systems`. Fields include `id`, `label`, `description`, `parentSystemId`, `subsystems`, `lifecycle`, `ui`, `requiresAdmin`, `devOnly`, `responsibleRoleId`, `governedByKnowledge`, `drivesGoals`, `actions`, `content`, and `order`.
|
|
35
35
|
|
|
36
|
-
**Provider /
|
|
36
|
+
**Provider / ElevasisSystemsProvider** -- runtime that registers System modules, resolves System access against the org model, projects sidebar navigation, and exposes shell helpers through `useElevasisSystems()`.
|
|
37
37
|
|
|
38
|
-
**Resource** -- governance-only descriptor in `OrganizationModel.resources
|
|
38
|
+
**Resource** -- governance-only descriptor in `OrganizationModel.resources` for a workflow, agent, integration, or script. Runtime code derives `resourceId` and kind from the descriptor, then attaches executable behavior in operations.
|
|
39
39
|
|
|
40
|
-
**Resource descriptor** -- OM entry with canonical `id`, required `
|
|
40
|
+
**Resource descriptor** -- OM entry with canonical `id`, required `systemPath`, governance `status`, and optional role ownership. Workflow descriptors may mirror `actionKey`; agent descriptors carry `agentKind`, `sessionCapable`, and optional `actsAsRoleId`; integration descriptors name a provider.
|
|
41
41
|
|
|
42
42
|
**System** -- tenant-defined bounded context in `OrganizationModel.systems.systems` that groups operational resources and carries governance metadata such as responsible role, governing knowledge, driven goals, kind, and status.
|
|
43
43
|
|
|
@@ -45,11 +45,11 @@ description: Terminology disambiguation for Organization OS concepts used in the
|
|
|
45
45
|
|
|
46
46
|
**ResourceLink** -- graph binding on resource metadata: `{ nodeId, kind }`.
|
|
47
47
|
|
|
48
|
-
**Settings asymmetry** --
|
|
48
|
+
**Settings asymmetry** -- Settings is a navigation/app surface whose individual pages are normally governed by admin checks rather than user-facing System toggles.
|
|
49
49
|
|
|
50
|
-
**Shell model** -- provider output used by sidebars and breadcrumbs. Includes `
|
|
50
|
+
**Shell model** -- provider output used by sidebars and breadcrumbs. Includes `systems`, `childrenOf`, `ancestorsOf`, `parentOf`, `topLevel`, `findByPath`, `requiresAdminFor`, and `devOnlyFor`.
|
|
51
51
|
|
|
52
|
-
**Subshell / Sidebar** --
|
|
52
|
+
**Subshell / Sidebar** -- System- or route-prefix-scoped UI region rendered when the current route matches a module whose manifest supplies a sidebar.
|
|
53
53
|
|
|
54
54
|
**Topology** -- runtime resource relationships declared in `DeploymentSpec.relationships`.
|
|
55
55
|
|
|
@@ -57,7 +57,7 @@ description: Terminology disambiguation for Organization OS concepts used in the
|
|
|
57
57
|
|
|
58
58
|
**`@elevasis/core`**
|
|
59
59
|
|
|
60
|
-
- `OrganizationModel`, `
|
|
60
|
+
- `OrganizationModel`, `OrganizationModelSystemEntry`
|
|
61
61
|
- `SystemEntry`, `ResourceEntry`
|
|
62
62
|
- `resolveOrganizationModel`, `defineOrganizationModel`, `DEFAULT_ORGANIZATION_MODEL`
|
|
63
63
|
- `MembershipFeatureConfig`
|
|
@@ -65,9 +65,9 @@ description: Terminology disambiguation for Organization OS concepts used in the
|
|
|
65
65
|
|
|
66
66
|
**`@elevasis/ui`**
|
|
67
67
|
|
|
68
|
-
- `
|
|
69
|
-
- `
|
|
70
|
-
- `
|
|
68
|
+
- `SystemModule`
|
|
69
|
+
- `SystemGuard`, `AdminGuard`, `ProtectedRoute`
|
|
70
|
+
- `ElevasisSystemsProvider`, `ElevasisCoreProvider`, `useElevasisSystems`
|
|
71
71
|
|
|
72
72
|
**External project source**
|
|
73
73
|
|
|
@@ -2770,6 +2770,66 @@ export type Database = {
|
|
|
2770
2770
|
},
|
|
2771
2771
|
]
|
|
2772
2772
|
}
|
|
2773
|
+
user_notes: {
|
|
2774
|
+
Row: {
|
|
2775
|
+
content: string
|
|
2776
|
+
created_at: string
|
|
2777
|
+
created_by: string
|
|
2778
|
+
id: string
|
|
2779
|
+
metadata: Json
|
|
2780
|
+
organization_id: string | null
|
|
2781
|
+
pinned: boolean
|
|
2782
|
+
priority: string
|
|
2783
|
+
source: string | null
|
|
2784
|
+
title: string | null
|
|
2785
|
+
updated_at: string
|
|
2786
|
+
user_id: string
|
|
2787
|
+
}
|
|
2788
|
+
Insert: {
|
|
2789
|
+
content: string
|
|
2790
|
+
created_at?: string
|
|
2791
|
+
created_by?: string
|
|
2792
|
+
id?: string
|
|
2793
|
+
metadata?: Json
|
|
2794
|
+
organization_id?: string | null
|
|
2795
|
+
pinned?: boolean
|
|
2796
|
+
priority?: string
|
|
2797
|
+
source?: string | null
|
|
2798
|
+
title?: string | null
|
|
2799
|
+
updated_at?: string
|
|
2800
|
+
user_id: string
|
|
2801
|
+
}
|
|
2802
|
+
Update: {
|
|
2803
|
+
content?: string
|
|
2804
|
+
created_at?: string
|
|
2805
|
+
created_by?: string
|
|
2806
|
+
id?: string
|
|
2807
|
+
metadata?: Json
|
|
2808
|
+
organization_id?: string | null
|
|
2809
|
+
pinned?: boolean
|
|
2810
|
+
priority?: string
|
|
2811
|
+
source?: string | null
|
|
2812
|
+
title?: string | null
|
|
2813
|
+
updated_at?: string
|
|
2814
|
+
user_id?: string
|
|
2815
|
+
}
|
|
2816
|
+
Relationships: [
|
|
2817
|
+
{
|
|
2818
|
+
foreignKeyName: "user_notes_organization_id_fkey"
|
|
2819
|
+
columns: ["organization_id"]
|
|
2820
|
+
isOneToOne: false
|
|
2821
|
+
referencedRelation: "organizations"
|
|
2822
|
+
referencedColumns: ["id"]
|
|
2823
|
+
},
|
|
2824
|
+
{
|
|
2825
|
+
foreignKeyName: "user_notes_user_id_fkey"
|
|
2826
|
+
columns: ["user_id"]
|
|
2827
|
+
isOneToOne: false
|
|
2828
|
+
referencedRelation: "users"
|
|
2829
|
+
referencedColumns: ["id"]
|
|
2830
|
+
},
|
|
2831
|
+
]
|
|
2832
|
+
}
|
|
2773
2833
|
users: {
|
|
2774
2834
|
Row: {
|
|
2775
2835
|
config: Json
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest'
|
|
2
2
|
import { BaseProjectSchema, BaseTaskSchema } from '../business/base-entities'
|
|
3
|
-
import { DEFAULT_ORGANIZATION_MODEL } from '../organization-model'
|
|
4
3
|
import {
|
|
5
4
|
makeInitializationState,
|
|
6
5
|
makeOrganizationModel,
|
|
@@ -28,16 +27,12 @@ describe('published test-utils factories', () => {
|
|
|
28
27
|
|
|
29
28
|
it('creates organization model and initialization fixtures', () => {
|
|
30
29
|
const model = makeOrganizationModel({
|
|
31
|
-
branding: { organizationName: 'Test Brand' }
|
|
32
|
-
features: DEFAULT_ORGANIZATION_MODEL.features.map((feature) =>
|
|
33
|
-
feature.id === 'seo' ? { ...feature, enabled: true } : feature
|
|
34
|
-
)
|
|
30
|
+
branding: { organizationName: 'Test Brand' }
|
|
35
31
|
})
|
|
36
32
|
const profile = makeUserProfile({ id: TEST_USERS.admin.id, email: TEST_USERS.admin.email })
|
|
37
33
|
const state = makeInitializationState({ profile, organizationReady: false, allReady: false })
|
|
38
34
|
|
|
39
35
|
expect(model.branding.organizationName).toBe('Test Brand')
|
|
40
|
-
expect(model.features.find((feature) => feature.id === 'seo')?.enabled).toBe(true)
|
|
41
36
|
expect(state.profile?.email).toBe(TEST_USERS.admin.email)
|
|
42
37
|
expect(state.organizationReady).toBe(false)
|
|
43
38
|
})
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import {
|
|
3
|
-
DEFAULT_ORGANIZATION_MODEL_OPERATIONS,
|
|
4
|
-
OperationEntrySchema,
|
|
5
|
-
OperationsDomainSchema,
|
|
6
|
-
OperationSemanticClassSchema
|
|
7
|
-
} from '../../domains/operations'
|
|
8
|
-
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
// Group 1: OperationEntrySchema — positive parse
|
|
11
|
-
// ---------------------------------------------------------------------------
|
|
12
|
-
|
|
13
|
-
describe('OperationEntrySchema — positive parse', () => {
|
|
14
|
-
it('accepts a fully-specified entry (id, label, semanticClass, featureId, supportedStatusSemanticClass)', () => {
|
|
15
|
-
const result = OperationEntrySchema.safeParse({
|
|
16
|
-
id: 'operations.queue',
|
|
17
|
-
label: 'HITL Queue',
|
|
18
|
-
semanticClass: 'queue',
|
|
19
|
-
featureId: 'operations',
|
|
20
|
-
supportedStatusSemanticClass: ['queue']
|
|
21
|
-
})
|
|
22
|
-
expect(result.success).toBe(true)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('accepts a minimal entry without optional fields', () => {
|
|
26
|
-
const result = OperationEntrySchema.safeParse({
|
|
27
|
-
id: 'operations.sessions',
|
|
28
|
-
label: 'Sessions',
|
|
29
|
-
semanticClass: 'sessions'
|
|
30
|
-
})
|
|
31
|
-
expect(result.success).toBe(true)
|
|
32
|
-
if (result.success) {
|
|
33
|
-
expect(result.data.featureId).toBeUndefined()
|
|
34
|
-
expect(result.data.supportedStatusSemanticClass).toBeUndefined()
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
it('trims whitespace from id and label', () => {
|
|
39
|
-
const result = OperationEntrySchema.safeParse({
|
|
40
|
-
id: ' trimmed-id ',
|
|
41
|
-
label: ' Trimmed Label ',
|
|
42
|
-
semanticClass: 'executions'
|
|
43
|
-
})
|
|
44
|
-
expect(result.success).toBe(true)
|
|
45
|
-
if (result.success) {
|
|
46
|
-
expect(result.data.id).toBe('trimmed-id')
|
|
47
|
-
expect(result.data.label).toBe('Trimmed Label')
|
|
48
|
-
}
|
|
49
|
-
})
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
// ---------------------------------------------------------------------------
|
|
53
|
-
// Group 2: OperationEntrySchema — negative parse
|
|
54
|
-
// ---------------------------------------------------------------------------
|
|
55
|
-
|
|
56
|
-
describe('OperationEntrySchema — negative parse', () => {
|
|
57
|
-
it('rejects a missing id field', () => {
|
|
58
|
-
const result = OperationEntrySchema.safeParse({
|
|
59
|
-
label: 'No ID',
|
|
60
|
-
semanticClass: 'queue'
|
|
61
|
-
})
|
|
62
|
-
expect(result.success).toBe(false)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('rejects a missing label field', () => {
|
|
66
|
-
const result = OperationEntrySchema.safeParse({
|
|
67
|
-
id: 'operations.queue',
|
|
68
|
-
semanticClass: 'queue'
|
|
69
|
-
})
|
|
70
|
-
expect(result.success).toBe(false)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('rejects a missing semanticClass field', () => {
|
|
74
|
-
const result = OperationEntrySchema.safeParse({
|
|
75
|
-
id: 'operations.queue',
|
|
76
|
-
label: 'HITL Queue'
|
|
77
|
-
})
|
|
78
|
-
expect(result.success).toBe(false)
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
it('rejects an unknown semanticClass value', () => {
|
|
82
|
-
const result = OperationEntrySchema.safeParse({
|
|
83
|
-
id: 'some.entry',
|
|
84
|
-
label: 'Some Entry',
|
|
85
|
-
semanticClass: 'not-a-real-class'
|
|
86
|
-
})
|
|
87
|
-
expect(result.success).toBe(false)
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('rejects a non-string id (number)', () => {
|
|
91
|
-
const result = OperationEntrySchema.safeParse({
|
|
92
|
-
id: 42,
|
|
93
|
-
label: 'Label',
|
|
94
|
-
semanticClass: 'queue'
|
|
95
|
-
})
|
|
96
|
-
expect(result.success).toBe(false)
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
it('rejects an empty string label (min length 1 after trim)', () => {
|
|
100
|
-
const result = OperationEntrySchema.safeParse({
|
|
101
|
-
id: 'some.entry',
|
|
102
|
-
label: ' ',
|
|
103
|
-
semanticClass: 'queue'
|
|
104
|
-
})
|
|
105
|
-
expect(result.success).toBe(false)
|
|
106
|
-
})
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
// ---------------------------------------------------------------------------
|
|
110
|
-
// Group 3: OperationsDomainSchema — structural tests
|
|
111
|
-
// ---------------------------------------------------------------------------
|
|
112
|
-
|
|
113
|
-
describe('OperationsDomainSchema — structural tests', () => {
|
|
114
|
-
it('accepts an entries-empty domain object', () => {
|
|
115
|
-
const result = OperationsDomainSchema.safeParse({ entries: [] })
|
|
116
|
-
expect(result.success).toBe(true)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('applies an empty-array default when entries is omitted', () => {
|
|
120
|
-
const result = OperationsDomainSchema.safeParse({})
|
|
121
|
-
expect(result.success).toBe(true)
|
|
122
|
-
if (result.success) {
|
|
123
|
-
expect(result.data.entries).toEqual([])
|
|
124
|
-
}
|
|
125
|
-
})
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
// ---------------------------------------------------------------------------
|
|
129
|
-
// Group 4: Semantic class enum — all 5 values declared
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
|
|
132
|
-
describe('OperationSemanticClassSchema — enum coverage', () => {
|
|
133
|
-
const expectedClasses = ['queue', 'executions', 'sessions', 'notifications', 'schedules'] as const
|
|
134
|
-
|
|
135
|
-
it('enum exposes exactly 5 semantic classes', () => {
|
|
136
|
-
expect(OperationSemanticClassSchema.options).toHaveLength(5)
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
it.each(expectedClasses)('"%s" is a valid semanticClass value', (cls) => {
|
|
140
|
-
const result = OperationSemanticClassSchema.safeParse(cls)
|
|
141
|
-
expect(result.success).toBe(true)
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
it('every entry in the seed uses one of the 5 known semanticClass values', () => {
|
|
145
|
-
const valid = new Set<string>(OperationSemanticClassSchema.options)
|
|
146
|
-
for (const entry of DEFAULT_ORGANIZATION_MODEL_OPERATIONS.entries) {
|
|
147
|
-
expect(
|
|
148
|
-
valid.has(entry.semanticClass),
|
|
149
|
-
`Unexpected semanticClass "${entry.semanticClass}" on entry "${entry.id}"`
|
|
150
|
-
).toBe(true)
|
|
151
|
-
}
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
it('all 5 semanticClass values have exactly one seed entry', () => {
|
|
155
|
-
const presentClasses = new Set(DEFAULT_ORGANIZATION_MODEL_OPERATIONS.entries.map((e) => e.semanticClass))
|
|
156
|
-
for (const cls of OperationSemanticClassSchema.options) {
|
|
157
|
-
expect(presentClasses.has(cls), `No seed entry found for semanticClass "${cls}"`).toBe(true)
|
|
158
|
-
}
|
|
159
|
-
})
|
|
160
|
-
})
|
|
161
|
-
|
|
162
|
-
// ---------------------------------------------------------------------------
|
|
163
|
-
// Group 5: Seed completeness
|
|
164
|
-
// ---------------------------------------------------------------------------
|
|
165
|
-
|
|
166
|
-
describe('DEFAULT_ORGANIZATION_MODEL_OPERATIONS seed — completeness', () => {
|
|
167
|
-
it('has exactly 5 entries (one per entity category)', () => {
|
|
168
|
-
expect(DEFAULT_ORGANIZATION_MODEL_OPERATIONS.entries).toHaveLength(5)
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
it('all entry ids are unique', () => {
|
|
172
|
-
const ids = DEFAULT_ORGANIZATION_MODEL_OPERATIONS.entries.map((e) => e.id)
|
|
173
|
-
const uniqueIds = new Set(ids)
|
|
174
|
-
expect(uniqueIds.size).toBe(ids.length)
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
it('every entry has a non-empty id, label, and semanticClass', () => {
|
|
178
|
-
for (const entry of DEFAULT_ORGANIZATION_MODEL_OPERATIONS.entries) {
|
|
179
|
-
expect(entry.id.length).toBeGreaterThan(0)
|
|
180
|
-
expect(entry.label.length).toBeGreaterThan(0)
|
|
181
|
-
expect(entry.semanticClass.length).toBeGreaterThan(0)
|
|
182
|
-
}
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
it('queue entry references queue status semantic class', () => {
|
|
186
|
-
const queueEntry = DEFAULT_ORGANIZATION_MODEL_OPERATIONS.entries.find((e) => e.semanticClass === 'queue')
|
|
187
|
-
expect(queueEntry).toBeDefined()
|
|
188
|
-
expect(queueEntry?.supportedStatusSemanticClass).toContain('queue')
|
|
189
|
-
})
|
|
190
|
-
|
|
191
|
-
it('executions entry references execution status semantic class', () => {
|
|
192
|
-
const execEntry = DEFAULT_ORGANIZATION_MODEL_OPERATIONS.entries.find((e) => e.semanticClass === 'executions')
|
|
193
|
-
expect(execEntry).toBeDefined()
|
|
194
|
-
expect(execEntry?.supportedStatusSemanticClass).toContain('execution')
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
it('schedules entry references schedule and schedule.run status semantic classes', () => {
|
|
198
|
-
const schedEntry = DEFAULT_ORGANIZATION_MODEL_OPERATIONS.entries.find((e) => e.semanticClass === 'schedules')
|
|
199
|
-
expect(schedEntry).toBeDefined()
|
|
200
|
-
expect(schedEntry?.supportedStatusSemanticClass).toContain('schedule')
|
|
201
|
-
expect(schedEntry?.supportedStatusSemanticClass).toContain('schedule.run')
|
|
202
|
-
})
|
|
203
|
-
})
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod'
|
|
2
|
-
import { ColorTokenSchema, DescriptionSchema, IconNameSchema, LabelSchema, PathSchema } from './shared'
|
|
3
|
-
|
|
4
|
-
export const NodeIdPathSchema = z
|
|
5
|
-
.string()
|
|
6
|
-
.trim()
|
|
7
|
-
.min(1)
|
|
8
|
-
.max(100)
|
|
9
|
-
.regex(/^([a-z0-9-]+)(\.[a-z0-9-]+)*$/, 'Node IDs must be lowercase dotted paths')
|
|
10
|
-
|
|
11
|
-
export const NodeIdStringSchema = z
|
|
12
|
-
.string()
|
|
13
|
-
.trim()
|
|
14
|
-
.min(1)
|
|
15
|
-
.max(200)
|
|
16
|
-
.regex(/^[a-z]+:([a-z0-9-]+)(\.[a-z0-9-]+)*$/, 'Node references must use kind:dotted-path')
|
|
17
|
-
|
|
18
|
-
export const UiPositionSchema = z.enum(['sidebar-primary', 'sidebar-bottom'])
|
|
19
|
-
|
|
20
|
-
export const FeatureSchema = z.object({
|
|
21
|
-
id: NodeIdPathSchema,
|
|
22
|
-
label: LabelSchema,
|
|
23
|
-
description: DescriptionSchema.optional(),
|
|
24
|
-
enabled: z.boolean().default(true),
|
|
25
|
-
path: PathSchema.optional(),
|
|
26
|
-
icon: IconNameSchema.optional(),
|
|
27
|
-
color: ColorTokenSchema.optional(),
|
|
28
|
-
uiPosition: UiPositionSchema.optional(),
|
|
29
|
-
requiresAdmin: z.boolean().optional(),
|
|
30
|
-
devOnly: z.boolean().optional()
|
|
31
|
-
})
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod'
|
|
2
|
-
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
// Semantic class enum — one value per stateful runtime entity category.
|
|
5
|
-
// Every operation entry declares which category it belongs to via semanticClass.
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
|
|
8
|
-
export const OperationSemanticClassSchema = z.enum(['queue', 'executions', 'sessions', 'notifications', 'schedules'])
|
|
9
|
-
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// Operation entry schema
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
|
|
14
|
-
export const OperationEntrySchema = z.object({
|
|
15
|
-
id: z.string().trim().min(1).max(100),
|
|
16
|
-
label: z.string().trim().min(1).max(120),
|
|
17
|
-
semanticClass: OperationSemanticClassSchema,
|
|
18
|
-
/** Optional reference to the feature that owns this runtime entity. */
|
|
19
|
-
featureId: z.string().trim().min(1).max(100).optional(),
|
|
20
|
-
/**
|
|
21
|
-
* Optional pointer to the status semanticClass values that apply to this
|
|
22
|
-
* entity — ties operations back to the statuses domain for vibe rendering.
|
|
23
|
-
*/
|
|
24
|
-
supportedStatusSemanticClass: z.array(z.string().trim().min(1).max(80)).optional()
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
|
-
// Domain schema — a flat array of operation entries
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
|
|
31
|
-
export const OperationsDomainSchema = z.object({
|
|
32
|
-
entries: z.array(OperationEntrySchema).default([])
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
// Seed — one entry per stateful runtime entity category.
|
|
37
|
-
// Categories: queue (HITL), executions, sessions, notifications, schedules.
|
|
38
|
-
// ---------------------------------------------------------------------------
|
|
39
|
-
|
|
40
|
-
export const DEFAULT_ORGANIZATION_MODEL_OPERATIONS: z.infer<typeof OperationsDomainSchema> = {
|
|
41
|
-
entries: [
|
|
42
|
-
// --- queue (HITL command queue) ---
|
|
43
|
-
{
|
|
44
|
-
id: 'operations.queue',
|
|
45
|
-
label: 'HITL Queue',
|
|
46
|
-
semanticClass: 'queue',
|
|
47
|
-
featureId: 'operations',
|
|
48
|
-
supportedStatusSemanticClass: ['queue']
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
// --- executions (workflow / agent executions) ---
|
|
52
|
-
{
|
|
53
|
-
id: 'operations.executions',
|
|
54
|
-
label: 'Executions',
|
|
55
|
-
semanticClass: 'executions',
|
|
56
|
-
featureId: 'operations',
|
|
57
|
-
supportedStatusSemanticClass: ['execution']
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
// --- sessions (agent conversation sessions) ---
|
|
61
|
-
{
|
|
62
|
-
id: 'operations.sessions',
|
|
63
|
-
label: 'Sessions',
|
|
64
|
-
semanticClass: 'sessions',
|
|
65
|
-
featureId: 'operations'
|
|
66
|
-
},
|
|
67
|
-
|
|
68
|
-
// --- notifications (platform in-app notifications) ---
|
|
69
|
-
{
|
|
70
|
-
id: 'operations.notifications',
|
|
71
|
-
label: 'Notifications',
|
|
72
|
-
semanticClass: 'notifications',
|
|
73
|
-
featureId: 'monitoring'
|
|
74
|
-
},
|
|
75
|
-
|
|
76
|
-
// --- schedules (task scheduler) ---
|
|
77
|
-
{
|
|
78
|
-
id: 'operations.schedules',
|
|
79
|
-
label: 'Schedules',
|
|
80
|
-
semanticClass: 'schedules',
|
|
81
|
-
featureId: 'operations',
|
|
82
|
-
supportedStatusSemanticClass: ['schedule', 'schedule.run']
|
|
83
|
-
}
|
|
84
|
-
]
|
|
85
|
-
}
|