@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
@@ -1,32 +1,59 @@
1
1
  import { describe, expect, it } from 'vitest'
2
- import { defineOrganizationModel, resolveOrganizationModel } from '../resolve'
2
+ import { defineOrganizationModel, resolveOrganizationModel, resolveOrganizationModelWithResources } from '../resolve'
3
3
 
4
4
  describe('organization-model resolve', () => {
5
- it('resolves the flat feature defaults', () => {
5
+ it('resolves the system defaults', () => {
6
6
  const model = resolveOrganizationModel()
7
7
 
8
8
  expect(model.version).toBe(1)
9
- expect(model.features.find((feature) => feature.id === 'dashboard')?.path).toBe('/')
10
- expect(model.features.find((feature) => feature.id === 'sales')?.path).toBe('/sales')
11
- expect(model.features.find((feature) => feature.id === 'sales.crm')?.path).toBe('/crm')
12
- expect(model.features.find((feature) => feature.id === 'admin')?.requiresAdmin).toBe(true)
13
- expect(model.features.find((feature) => feature.id === 'archive')?.devOnly).toBe(true)
9
+ expect('surfaces' in model).toBe(false)
10
+ expect('navigationGroups' in model).toBe(false)
11
+ expect(model.systems['dashboard']?.path).toBe('/')
12
+ expect(model.systems['sales']?.path).toBe('/sales')
13
+ expect(model.systems['sales.crm']?.path).toBe('/crm')
14
+ expect(model.systems['admin']?.requiresAdmin).toBe(true)
15
+ expect(model.systems['archive']?.devOnly).toBe(true)
14
16
  })
15
17
 
16
- it('replaces arrays when an override supplies a complete feature slice', () => {
18
+ it('resolves authored sidebar navigation with Dashboard above Business and /clients as the client route', () => {
19
+ const model = resolveOrganizationModel()
20
+ const primaryEntries = Object.entries(model.navigation.sidebar.primary).sort(
21
+ ([leftId, left], [rightId, right]) =>
22
+ (left.order ?? Number.MAX_SAFE_INTEGER) - (right.order ?? Number.MAX_SAFE_INTEGER) ||
23
+ leftId.localeCompare(rightId)
24
+ )
25
+
26
+ expect(primaryEntries[0]?.[0]).toBe('dashboard')
27
+ expect(primaryEntries[1]?.[0]).toBe('business')
28
+
29
+ const business = model.navigation.sidebar.primary.business
30
+ expect(business?.type).toBe('group')
31
+ if (business?.type === 'group') {
32
+ expect(business.children.clients).toMatchObject({
33
+ type: 'surface',
34
+ path: '/clients',
35
+ targets: { systems: ['clients'] }
36
+ })
37
+ }
38
+ })
39
+
40
+ it('adds tenant systems additively to the merged record', () => {
41
+ const baseSize = Object.keys(resolveOrganizationModel().systems).length
42
+
17
43
  const model = resolveOrganizationModel({
18
- features: [
19
- {
44
+ systems: {
45
+ custom: {
20
46
  id: 'custom',
47
+ order: 10,
21
48
  label: 'Custom',
22
49
  enabled: true,
23
50
  path: '/custom'
24
51
  }
25
- ]
52
+ }
26
53
  })
27
54
 
28
- expect(model.features).toHaveLength(1)
29
- expect(model.features[0]?.id).toBe('custom')
55
+ expect(Object.keys(model.systems)).toHaveLength(baseSize + 1)
56
+ expect(model.systems['custom']?.id).toBe('custom')
30
57
  })
31
58
 
32
59
  it('preserves sibling fields when overriding a nested property', () => {
@@ -38,18 +65,24 @@ describe('organization-model resolve', () => {
38
65
 
39
66
  expect(model.branding.organizationName).toBe('OverriddenOrg')
40
67
  expect(model.branding.productName).toBe('Elevasis')
41
- expect(model.features.length).toBeGreaterThan(0)
68
+ expect(Object.keys(model.systems).length).toBeGreaterThan(0)
42
69
  })
43
70
 
44
- it('throws on duplicate feature ids in the merged result', () => {
45
- expect(() =>
46
- resolveOrganizationModel({
47
- features: [
48
- { id: 'custom', label: 'Custom A', enabled: true, path: '/custom-a' },
49
- { id: 'custom', label: 'Custom B', enabled: true, path: '/custom-b' }
50
- ]
51
- })
52
- ).toThrow()
71
+ it('overrides an existing system by id when the same key is supplied', () => {
72
+ const model = resolveOrganizationModel({
73
+ systems: {
74
+ dashboard: {
75
+ id: 'dashboard',
76
+ order: 10,
77
+ label: 'Renamed Dashboard',
78
+ enabled: true,
79
+ path: '/dashboard-overridden'
80
+ }
81
+ }
82
+ })
83
+
84
+ expect(model.systems['dashboard']?.label).toBe('Renamed Dashboard')
85
+ expect(model.systems['dashboard']?.path).toBe('/dashboard-overridden')
53
86
  })
54
87
 
55
88
  it('returns defineOrganizationModel input unchanged', () => {
@@ -57,3 +90,121 @@ describe('organization-model resolve', () => {
57
90
  expect(defineOrganizationModel(input)).toBe(input)
58
91
  })
59
92
  })
93
+
94
+ describe('resolveOrganizationModelWithResources', () => {
95
+ it('populates resources on the matching system entry', () => {
96
+ const resolved = resolveOrganizationModelWithResources({
97
+ systems: {
98
+ sys: {
99
+ id: 'sys',
100
+ order: 900,
101
+ label: 'Sys',
102
+ enabled: true
103
+ },
104
+ 'sys.crm': {
105
+ id: 'sys.crm',
106
+ order: 910,
107
+ label: 'CRM',
108
+ enabled: true
109
+ }
110
+ },
111
+ resources: {
112
+ 'crm-workflow': {
113
+ id: 'crm-workflow',
114
+ kind: 'workflow',
115
+ systemPath: 'sys.crm',
116
+ status: 'active',
117
+ order: 10
118
+ }
119
+ }
120
+ })
121
+
122
+ const crmSystem = resolved.systems['sys.crm']
123
+ expect(crmSystem?.resources).toHaveLength(1)
124
+ expect(crmSystem?.resources?.[0]?.id).toBe('crm-workflow')
125
+ })
126
+
127
+ it('leaves systems without resources with no resources property', () => {
128
+ const resolved = resolveOrganizationModelWithResources({
129
+ systems: {
130
+ sys: {
131
+ id: 'sys',
132
+ order: 900,
133
+ label: 'Sys',
134
+ enabled: true
135
+ }
136
+ }
137
+ })
138
+
139
+ // sys has no resources attached — property should be absent (undefined)
140
+ expect(resolved.systems['sys']?.resources).toBeUndefined()
141
+ })
142
+
143
+ it('does not include descendant resources in the direct system entry', () => {
144
+ const resolved = resolveOrganizationModelWithResources({
145
+ systems: {
146
+ sys: {
147
+ id: 'sys',
148
+ order: 900,
149
+ label: 'Sys',
150
+ enabled: true
151
+ },
152
+ 'sys.crm': {
153
+ id: 'sys.crm',
154
+ order: 910,
155
+ label: 'CRM',
156
+ enabled: true
157
+ }
158
+ },
159
+ resources: {
160
+ 'crm-workflow': {
161
+ id: 'crm-workflow',
162
+ kind: 'workflow',
163
+ systemPath: 'sys.crm',
164
+ status: 'active',
165
+ order: 10
166
+ }
167
+ }
168
+ })
169
+
170
+ // 'sys' parent should NOT pick up the child's resource
171
+ expect(resolved.systems['sys']?.resources).toBeUndefined()
172
+ })
173
+
174
+ it('groups multiple resources under the correct system', () => {
175
+ const resolved = resolveOrganizationModelWithResources({
176
+ systems: {
177
+ sys: {
178
+ id: 'sys',
179
+ order: 900,
180
+ label: 'Sys',
181
+ enabled: true
182
+ },
183
+ 'sys.crm': {
184
+ id: 'sys.crm',
185
+ order: 910,
186
+ label: 'CRM',
187
+ enabled: true
188
+ }
189
+ },
190
+ resources: {
191
+ 'crm-workflow-a': {
192
+ id: 'crm-workflow-a',
193
+ kind: 'workflow',
194
+ systemPath: 'sys.crm',
195
+ status: 'active',
196
+ order: 10
197
+ },
198
+ 'crm-workflow-b': {
199
+ id: 'crm-workflow-b',
200
+ kind: 'workflow',
201
+ systemPath: 'sys.crm',
202
+ status: 'active',
203
+ order: 20
204
+ }
205
+ }
206
+ })
207
+
208
+ expect(resolved.systems['sys.crm']?.resources).toHaveLength(2)
209
+ })
210
+ })