@elevasis/core 0.21.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 (132) hide show
  1. package/dist/index.d.ts +2518 -2169
  2. package/dist/index.js +2495 -1095
  3. package/dist/knowledge/index.d.ts +706 -1044
  4. package/dist/knowledge/index.js +9 -9
  5. package/dist/organization-model/index.d.ts +2518 -2169
  6. package/dist/organization-model/index.js +2495 -1095
  7. package/dist/test-utils/index.d.ts +826 -1014
  8. package/dist/test-utils/index.js +1894 -1032
  9. package/package.json +3 -3
  10. package/src/__tests__/template-core-compatibility.test.ts +11 -79
  11. package/src/_gen/__tests__/__snapshots__/contracts.md.snap +852 -397
  12. package/src/auth/multi-tenancy/permissions.ts +20 -8
  13. package/src/business/README.md +2 -2
  14. package/src/business/acquisition/api-schemas.test.ts +175 -2
  15. package/src/business/acquisition/api-schemas.ts +132 -16
  16. package/src/business/acquisition/build-templates.test.ts +4 -4
  17. package/src/business/acquisition/build-templates.ts +72 -30
  18. package/src/business/acquisition/crm-state-actions.test.ts +13 -11
  19. package/src/business/acquisition/index.ts +12 -0
  20. package/src/business/acquisition/types.ts +7 -3
  21. package/src/business/clients/api-schemas.test.ts +115 -0
  22. package/src/business/clients/api-schemas.ts +158 -0
  23. package/src/business/clients/index.ts +1 -0
  24. package/src/business/deals/api-schemas.ts +8 -0
  25. package/src/business/index.ts +5 -2
  26. package/src/business/projects/types.ts +19 -0
  27. package/src/execution/engine/__tests__/fixtures/test-agents.ts +10 -8
  28. package/src/execution/engine/agent/core/__tests__/agent.test.ts +16 -12
  29. package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +4 -3
  30. package/src/execution/engine/agent/core/types.ts +25 -15
  31. package/src/execution/engine/agent/index.ts +6 -4
  32. package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +24 -18
  33. package/src/execution/engine/index.ts +3 -0
  34. package/src/execution/engine/workflow/types.ts +9 -2
  35. package/src/knowledge/README.md +8 -7
  36. package/src/knowledge/__tests__/queries.test.ts +74 -73
  37. package/src/knowledge/format.ts +10 -9
  38. package/src/knowledge/index.ts +1 -1
  39. package/src/knowledge/published.ts +1 -1
  40. package/src/knowledge/queries.ts +26 -25
  41. package/src/organization-model/README.md +73 -26
  42. package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -0
  43. package/src/organization-model/__tests__/defaults.test.ts +76 -96
  44. package/src/organization-model/__tests__/domains/actions.test.ts +56 -0
  45. package/src/organization-model/__tests__/domains/customers.test.ts +299 -295
  46. package/src/organization-model/__tests__/domains/entities.test.ts +56 -0
  47. package/src/organization-model/__tests__/domains/goals.test.ts +493 -479
  48. package/src/organization-model/__tests__/domains/identity.test.ts +280 -279
  49. package/src/organization-model/__tests__/domains/navigation.test.ts +268 -212
  50. package/src/organization-model/__tests__/domains/offerings.test.ts +414 -419
  51. package/src/organization-model/__tests__/domains/policies.test.ts +323 -0
  52. package/src/organization-model/__tests__/domains/resource-mappings.test.ts +271 -271
  53. package/src/organization-model/__tests__/domains/resources.test.ts +310 -0
  54. package/src/organization-model/__tests__/domains/roles.test.ts +463 -347
  55. package/src/organization-model/__tests__/domains/statuses.test.ts +246 -243
  56. package/src/organization-model/__tests__/domains/systems.test.ts +209 -0
  57. package/src/organization-model/__tests__/flatten-additive-merge.test.ts +361 -0
  58. package/src/organization-model/__tests__/foundation.test.ts +74 -102
  59. package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -0
  60. package/src/organization-model/__tests__/graph.test.ts +899 -71
  61. package/src/organization-model/__tests__/knowledge.test.ts +209 -49
  62. package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -0
  63. package/src/organization-model/__tests__/migration-helpers.test.ts +591 -0
  64. package/src/organization-model/__tests__/prospecting-ssot.test.ts +36 -27
  65. package/src/organization-model/__tests__/recursive-system-schema.test.ts +520 -0
  66. package/src/organization-model/__tests__/resolve.test.ts +174 -23
  67. package/src/organization-model/__tests__/schema.test.ts +291 -114
  68. package/src/organization-model/__tests__/surface-projection.test.ts +207 -97
  69. package/src/organization-model/catalogs/lead-gen.ts +144 -0
  70. package/src/organization-model/content-kinds/config.ts +36 -0
  71. package/src/organization-model/content-kinds/index.ts +74 -0
  72. package/src/organization-model/content-kinds/pipeline.ts +68 -0
  73. package/src/organization-model/content-kinds/registry.ts +44 -0
  74. package/src/organization-model/content-kinds/status.ts +71 -0
  75. package/src/organization-model/content-kinds/template.ts +83 -0
  76. package/src/organization-model/content-kinds/types.ts +117 -0
  77. package/src/organization-model/contracts.ts +13 -3
  78. package/src/organization-model/defaults.ts +499 -86
  79. package/src/organization-model/domains/actions.ts +239 -0
  80. package/src/organization-model/domains/customers.ts +78 -75
  81. package/src/organization-model/domains/entities.ts +144 -0
  82. package/src/organization-model/domains/goals.ts +83 -80
  83. package/src/organization-model/domains/knowledge.ts +76 -17
  84. package/src/organization-model/domains/navigation.ts +107 -384
  85. package/src/organization-model/domains/offerings.ts +71 -66
  86. package/src/organization-model/domains/policies.ts +102 -0
  87. package/src/organization-model/domains/projects.ts +14 -48
  88. package/src/organization-model/domains/prospecting.ts +62 -181
  89. package/src/organization-model/domains/resources.ts +145 -0
  90. package/src/organization-model/domains/roles.ts +96 -55
  91. package/src/organization-model/domains/sales.ts +10 -219
  92. package/src/organization-model/domains/shared.ts +57 -57
  93. package/src/organization-model/domains/statuses.ts +339 -130
  94. package/src/organization-model/domains/systems.ts +203 -0
  95. package/src/organization-model/foundation.ts +54 -67
  96. package/src/organization-model/graph/build.ts +682 -54
  97. package/src/organization-model/graph/link.ts +1 -1
  98. package/src/organization-model/graph/schema.ts +24 -9
  99. package/src/organization-model/graph/types.ts +20 -7
  100. package/src/organization-model/helpers.ts +231 -26
  101. package/src/organization-model/icons.ts +1 -0
  102. package/src/organization-model/index.ts +118 -5
  103. package/src/organization-model/migration-helpers.ts +249 -0
  104. package/src/organization-model/organization-graph.mdx +16 -15
  105. package/src/organization-model/organization-model.mdx +111 -44
  106. package/src/organization-model/published.ts +172 -19
  107. package/src/organization-model/resolve.ts +117 -54
  108. package/src/organization-model/schema.ts +654 -112
  109. package/src/organization-model/surface-projection.ts +116 -122
  110. package/src/organization-model/types.ts +146 -20
  111. package/src/platform/api/types.ts +38 -35
  112. package/src/platform/constants/versions.ts +1 -1
  113. package/src/platform/registry/__tests__/command-view.test.ts +6 -8
  114. package/src/platform/registry/__tests__/resource-link.test.ts +13 -8
  115. package/src/platform/registry/__tests__/resource-registry.integration.test.ts +16 -31
  116. package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -0
  117. package/src/platform/registry/__tests__/resource-registry.test.ts +2053 -2005
  118. package/src/platform/registry/__tests__/validation.test.ts +1347 -1086
  119. package/src/platform/registry/index.ts +14 -0
  120. package/src/platform/registry/resource-registry.ts +52 -2
  121. package/src/platform/registry/serialization.ts +241 -202
  122. package/src/platform/registry/serialized-types.ts +1 -0
  123. package/src/platform/registry/types.ts +411 -361
  124. package/src/platform/registry/validation.ts +745 -513
  125. package/src/projects/api-schemas.ts +290 -267
  126. package/src/reference/_generated/contracts.md +853 -397
  127. package/src/reference/glossary.md +23 -18
  128. package/src/supabase/database.types.ts +181 -0
  129. package/src/test-utils/test-utils.test.ts +1 -6
  130. package/src/organization-model/__tests__/domains/operations.test.ts +0 -203
  131. package/src/organization-model/domains/features.ts +0 -31
  132. 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).toBeUndefined()
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
+ })