@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.
Files changed (112) hide show
  1. package/dist/index.d.ts +2330 -2391
  2. package/dist/index.js +2322 -1147
  3. package/dist/knowledge/index.d.ts +702 -1136
  4. package/dist/knowledge/index.js +9 -9
  5. package/dist/organization-model/index.d.ts +2330 -2391
  6. package/dist/organization-model/index.js +2322 -1147
  7. package/dist/test-utils/index.d.ts +703 -1106
  8. package/dist/test-utils/index.js +1735 -1089
  9. package/package.json +1 -1
  10. package/src/__tests__/template-core-compatibility.test.ts +11 -79
  11. package/src/_gen/__tests__/__snapshots__/contracts.md.snap +360 -98
  12. package/src/business/acquisition/api-schemas.test.ts +2 -2
  13. package/src/business/acquisition/api-schemas.ts +7 -9
  14. package/src/business/acquisition/build-templates.test.ts +4 -4
  15. package/src/business/acquisition/build-templates.ts +72 -30
  16. package/src/business/acquisition/crm-state-actions.test.ts +13 -11
  17. package/src/business/acquisition/types.ts +7 -3
  18. package/src/execution/engine/agent/core/types.ts +1 -1
  19. package/src/execution/engine/workflow/types.ts +2 -2
  20. package/src/knowledge/README.md +8 -7
  21. package/src/knowledge/__tests__/queries.test.ts +74 -73
  22. package/src/knowledge/format.ts +10 -9
  23. package/src/knowledge/index.ts +1 -1
  24. package/src/knowledge/published.ts +1 -1
  25. package/src/knowledge/queries.ts +26 -25
  26. package/src/organization-model/README.md +66 -26
  27. package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -0
  28. package/src/organization-model/__tests__/defaults.test.ts +72 -98
  29. package/src/organization-model/__tests__/domains/actions.test.ts +56 -0
  30. package/src/organization-model/__tests__/domains/customers.test.ts +299 -295
  31. package/src/organization-model/__tests__/domains/entities.test.ts +56 -0
  32. package/src/organization-model/__tests__/domains/goals.test.ts +493 -479
  33. package/src/organization-model/__tests__/domains/identity.test.ts +280 -279
  34. package/src/organization-model/__tests__/domains/navigation.test.ts +268 -212
  35. package/src/organization-model/__tests__/domains/offerings.test.ts +414 -419
  36. package/src/organization-model/__tests__/domains/policies.test.ts +323 -0
  37. package/src/organization-model/__tests__/domains/resource-mappings.test.ts +271 -271
  38. package/src/organization-model/__tests__/domains/resources.test.ts +159 -37
  39. package/src/organization-model/__tests__/domains/roles.test.ts +147 -86
  40. package/src/organization-model/__tests__/domains/statuses.test.ts +246 -243
  41. package/src/organization-model/__tests__/domains/systems.test.ts +67 -51
  42. package/src/organization-model/__tests__/flatten-additive-merge.test.ts +361 -0
  43. package/src/organization-model/__tests__/foundation.test.ts +74 -102
  44. package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -0
  45. package/src/organization-model/__tests__/graph.test.ts +899 -71
  46. package/src/organization-model/__tests__/knowledge.test.ts +173 -52
  47. package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -0
  48. package/src/organization-model/__tests__/migration-helpers.test.ts +591 -0
  49. package/src/organization-model/__tests__/prospecting-ssot.test.ts +36 -27
  50. package/src/organization-model/__tests__/recursive-system-schema.test.ts +520 -0
  51. package/src/organization-model/__tests__/resolve.test.ts +174 -23
  52. package/src/organization-model/__tests__/schema.test.ts +291 -114
  53. package/src/organization-model/__tests__/surface-projection.test.ts +207 -97
  54. package/src/organization-model/catalogs/lead-gen.ts +144 -0
  55. package/src/organization-model/content-kinds/config.ts +36 -0
  56. package/src/organization-model/content-kinds/index.ts +74 -0
  57. package/src/organization-model/content-kinds/pipeline.ts +68 -0
  58. package/src/organization-model/content-kinds/registry.ts +44 -0
  59. package/src/organization-model/content-kinds/status.ts +71 -0
  60. package/src/organization-model/content-kinds/template.ts +83 -0
  61. package/src/organization-model/content-kinds/types.ts +117 -0
  62. package/src/organization-model/contracts.ts +13 -3
  63. package/src/organization-model/defaults.ts +488 -96
  64. package/src/organization-model/domains/actions.ts +239 -0
  65. package/src/organization-model/domains/customers.ts +78 -75
  66. package/src/organization-model/domains/entities.ts +144 -0
  67. package/src/organization-model/domains/goals.ts +83 -80
  68. package/src/organization-model/domains/knowledge.ts +74 -16
  69. package/src/organization-model/domains/navigation.ts +107 -384
  70. package/src/organization-model/domains/offerings.ts +71 -66
  71. package/src/organization-model/domains/policies.ts +102 -0
  72. package/src/organization-model/domains/projects.ts +14 -48
  73. package/src/organization-model/domains/prospecting.ts +62 -181
  74. package/src/organization-model/domains/resources.ts +81 -24
  75. package/src/organization-model/domains/roles.ts +13 -10
  76. package/src/organization-model/domains/sales.ts +10 -219
  77. package/src/organization-model/domains/shared.ts +57 -57
  78. package/src/organization-model/domains/statuses.ts +339 -130
  79. package/src/organization-model/domains/systems.ts +186 -29
  80. package/src/organization-model/foundation.ts +54 -67
  81. package/src/organization-model/graph/build.ts +682 -54
  82. package/src/organization-model/graph/link.ts +1 -1
  83. package/src/organization-model/graph/schema.ts +24 -9
  84. package/src/organization-model/graph/types.ts +20 -7
  85. package/src/organization-model/helpers.ts +231 -26
  86. package/src/organization-model/index.ts +116 -5
  87. package/src/organization-model/migration-helpers.ts +249 -0
  88. package/src/organization-model/organization-graph.mdx +16 -15
  89. package/src/organization-model/organization-model.mdx +89 -41
  90. package/src/organization-model/published.ts +120 -18
  91. package/src/organization-model/resolve.ts +117 -54
  92. package/src/organization-model/schema.ts +561 -140
  93. package/src/organization-model/surface-projection.ts +116 -122
  94. package/src/organization-model/types.ts +102 -21
  95. package/src/platform/constants/versions.ts +1 -1
  96. package/src/platform/registry/__tests__/command-view.test.ts +6 -8
  97. package/src/platform/registry/__tests__/resource-link.test.ts +13 -8
  98. package/src/platform/registry/__tests__/resource-registry.integration.test.ts +16 -31
  99. package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -0
  100. package/src/platform/registry/__tests__/resource-registry.test.ts +9 -7
  101. package/src/platform/registry/__tests__/validation.test.ts +15 -11
  102. package/src/platform/registry/resource-registry.ts +20 -8
  103. package/src/platform/registry/serialization.ts +7 -7
  104. package/src/platform/registry/types.ts +3 -3
  105. package/src/platform/registry/validation.ts +17 -15
  106. package/src/reference/_generated/contracts.md +362 -99
  107. package/src/reference/glossary.md +18 -18
  108. package/src/supabase/database.types.ts +60 -0
  109. package/src/test-utils/test-utils.test.ts +1 -6
  110. package/src/organization-model/__tests__/domains/operations.test.ts +0 -203
  111. package/src/organization-model/domains/features.ts +0 -31
  112. 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** -- either a platform capability, a shell `FeatureModule`, or an Organization Model feature node. In the current shell contract, Organization Model feature nodes drive sidebar hierarchy and access state.
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
- **FeatureGuard** -- route-level feature gate from `@elevasis/ui/features/auth`.
18
+ **SystemGuard** -- route-level System gate from `@elevasis/ui/features/auth`.
19
19
 
20
- **FeatureModule** -- manifest contract a shell feature provides to `ElevasisFeaturesProvider`. Key fields are `key`, `featureId`, optional `capabilityIds`, optional `icon`, optional `sidebar`, and optional graph bridge metadata.
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
- **featureId** -- the `FeatureModule` field that must match an `OrganizationModel.features[].id`.
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 `feature:sales.crm`, `integration:instantly`, or `resource:lead-import`.
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: `{ features?: Record<string, boolean> }`.
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 `features`, `branding`, `navigation`, `sales`, `prospecting`, `projects`, `identity`, `customers`, `offerings`, `roles`, `goals`, `systems`, `resources`, `statuses`, `operations`, and `knowledge`.
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
- **OrganizationModelFeature** -- feature node in `OrganizationModel.features`. Fields include `id`, `label`, `description`, `enabled`, `path`, `icon`, `color`, `uiPosition`, `requiresAdmin`, and `devOnly`.
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 / ElevasisFeaturesProvider** -- runtime that registers manifests, resolves feature access against the org model, and exposes shell helpers through `useElevasisFeatures()`.
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.entries` for a workflow, agent, or integration. Runtime code derives `resourceId` and kind from the descriptor, then attaches executable behavior in operations.
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 `systemId`, governance `status`, and optional role ownership. Workflow descriptors may mirror `capabilityKey`; agent descriptors carry `agentKind`, `sessionCapable`, and optional `actsAsRoleId`; integration descriptors name a provider.
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** -- settings is a feature node, but individual access is normally governed by admin checks rather than user-facing feature toggles.
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 `features`, `childrenOf`, `ancestorsOf`, `parentOf`, `topLevel`, `findByPath`, `uiPositionFor`, `requiresAdminFor`, and `devOnlyFor`.
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** -- feature-scoped UI region rendered when the current route matches a feature whose manifest supplies a 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`, `OrganizationModelFeature`
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
- - `FeatureModule`
69
- - `FeatureGuard`, `AdminGuard`, `ProtectedRoute`
70
- - `ElevasisFeaturesProvider`, `ElevasisCoreProvider`, `useElevasisFeatures`
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
- }