@elevasis/core 0.3.0 → 0.5.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/business/entities-published.d.ts +215 -0
- package/dist/business/entities-published.js +69 -0
- package/dist/index.d.ts +17 -5
- package/dist/index.js +291 -15
- package/dist/organization-model/index.d.ts +17 -5
- package/dist/organization-model/index.js +291 -15
- package/package.json +5 -1
- package/src/__tests__/publish.test.ts +1 -1
- package/src/business/README.md +52 -0
- package/src/business/__tests__/entities-published.test.ts +33 -0
- package/src/business/entities-published.ts +24 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +2 -3
- package/src/organization-model/__tests__/foundation.test.ts +105 -0
- package/src/organization-model/__tests__/resolve.test.ts +2 -2
- package/src/organization-model/contracts.ts +11 -0
- package/src/organization-model/defaults.ts +43 -12
- package/src/organization-model/domains/navigation.ts +246 -6
- package/src/organization-model/foundation.ts +4 -3
- package/src/organization-model/organization-graph.mdx +37 -28
- package/src/organization-model/published.ts +14 -1
- package/src/platform/constants/versions.ts +1 -1
- package/src/reference/_generated/contracts.md +1 -1
|
@@ -70,8 +70,8 @@ describe('organization-model', () => {
|
|
|
70
70
|
expect(model.branding.shortName).toBe('Elevasis')
|
|
71
71
|
expect(model.features).toHaveLength(7)
|
|
72
72
|
expect(model.navigation.defaultSurfaceId).toBe('crm.pipeline')
|
|
73
|
-
expect(model.navigation.surfaces).toHaveLength(
|
|
74
|
-
expect(model.navigation.groups).toHaveLength(
|
|
73
|
+
expect(model.navigation.surfaces).toHaveLength(22)
|
|
74
|
+
expect(model.navigation.groups).toHaveLength(4)
|
|
75
75
|
})
|
|
76
76
|
|
|
77
77
|
it('preserves sibling fields when overriding a nested property', () => {
|
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
export const PROJECTS_FEATURE_ID = 'projects' as const
|
|
2
2
|
export const PROJECTS_INDEX_SURFACE_ID = 'projects.index' as const
|
|
3
3
|
export const DELIVERY_PROJECTS_VIEW_CAPABILITY_ID = 'delivery.projects.view' as const
|
|
4
|
+
|
|
5
|
+
export const CRM_FEATURE_ID = 'crm' as const
|
|
6
|
+
export const LEAD_GEN_FEATURE_ID = 'lead-gen' as const
|
|
7
|
+
export const OPERATIONS_FEATURE_ID = 'operations' as const
|
|
8
|
+
export const MONITORING_FEATURE_ID = 'monitoring' as const
|
|
9
|
+
export const SETTINGS_FEATURE_ID = 'settings' as const
|
|
10
|
+
export const SEO_FEATURE_ID = 'seo' as const
|
|
11
|
+
|
|
12
|
+
export const CRM_PIPELINE_SURFACE_ID = 'crm.pipeline' as const
|
|
13
|
+
export const LEAD_GEN_LISTS_SURFACE_ID = 'lead-gen.lists' as const
|
|
14
|
+
export const OPERATIONS_ORGANIZATION_GRAPH_SURFACE_ID = 'operations.organization-graph' as const
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import type { OrganizationModel } from './types'
|
|
2
2
|
import {
|
|
3
|
+
CRM_FEATURE_ID,
|
|
4
|
+
CRM_PIPELINE_SURFACE_ID,
|
|
3
5
|
DELIVERY_PROJECTS_VIEW_CAPABILITY_ID,
|
|
6
|
+
LEAD_GEN_FEATURE_ID,
|
|
7
|
+
LEAD_GEN_LISTS_SURFACE_ID,
|
|
8
|
+
MONITORING_FEATURE_ID,
|
|
9
|
+
OPERATIONS_FEATURE_ID,
|
|
10
|
+
OPERATIONS_ORGANIZATION_GRAPH_SURFACE_ID,
|
|
4
11
|
PROJECTS_FEATURE_ID,
|
|
5
|
-
PROJECTS_INDEX_SURFACE_ID
|
|
12
|
+
PROJECTS_INDEX_SURFACE_ID,
|
|
13
|
+
SETTINGS_FEATURE_ID,
|
|
14
|
+
SEO_FEATURE_ID
|
|
6
15
|
} from './contracts'
|
|
7
16
|
import { DEFAULT_ORGANIZATION_MODEL_BRANDING } from './domains/branding'
|
|
8
17
|
import { DEFAULT_ORGANIZATION_MODEL_CRM } from './domains/crm'
|
|
@@ -14,24 +23,24 @@ export const DEFAULT_ORGANIZATION_MODEL: OrganizationModel = {
|
|
|
14
23
|
version: 1,
|
|
15
24
|
features: [
|
|
16
25
|
{
|
|
17
|
-
id:
|
|
26
|
+
id: CRM_FEATURE_ID,
|
|
18
27
|
label: 'CRM',
|
|
19
28
|
description: 'Relationship pipeline and deal management',
|
|
20
29
|
enabled: true,
|
|
21
30
|
color: 'blue',
|
|
22
31
|
entityIds: ['crm.deal'],
|
|
23
|
-
surfaceIds: [
|
|
32
|
+
surfaceIds: [CRM_PIPELINE_SURFACE_ID],
|
|
24
33
|
resourceIds: [],
|
|
25
34
|
capabilityIds: ['crm.pipeline.manage']
|
|
26
35
|
},
|
|
27
36
|
{
|
|
28
|
-
id:
|
|
37
|
+
id: LEAD_GEN_FEATURE_ID,
|
|
29
38
|
label: 'Lead Gen',
|
|
30
39
|
description: 'Prospecting, qualification, and outreach preparation',
|
|
31
40
|
enabled: true,
|
|
32
41
|
color: 'cyan',
|
|
33
42
|
entityIds: ['leadgen.list', 'leadgen.company', 'leadgen.contact'],
|
|
34
|
-
surfaceIds: [
|
|
43
|
+
surfaceIds: [LEAD_GEN_LISTS_SURFACE_ID],
|
|
35
44
|
resourceIds: [],
|
|
36
45
|
capabilityIds: ['leadgen.lists.manage']
|
|
37
46
|
},
|
|
@@ -47,36 +56,58 @@ export const DEFAULT_ORGANIZATION_MODEL: OrganizationModel = {
|
|
|
47
56
|
capabilityIds: [DELIVERY_PROJECTS_VIEW_CAPABILITY_ID]
|
|
48
57
|
},
|
|
49
58
|
{
|
|
50
|
-
id:
|
|
59
|
+
id: OPERATIONS_FEATURE_ID,
|
|
51
60
|
label: 'Operations',
|
|
52
61
|
description: 'Operational resources, topology, and orchestration visibility',
|
|
53
62
|
enabled: true,
|
|
54
63
|
color: 'violet',
|
|
55
64
|
entityIds: [],
|
|
56
|
-
surfaceIds: [
|
|
65
|
+
surfaceIds: [
|
|
66
|
+
OPERATIONS_ORGANIZATION_GRAPH_SURFACE_ID,
|
|
67
|
+
'operations.command-view',
|
|
68
|
+
'operations.overview',
|
|
69
|
+
'operations.resources',
|
|
70
|
+
'operations.command-queue',
|
|
71
|
+
'operations.sessions',
|
|
72
|
+
'operations.task-scheduler'
|
|
73
|
+
],
|
|
57
74
|
resourceIds: [],
|
|
58
75
|
capabilityIds: ['operations.organization-graph', 'operations.command-view']
|
|
59
76
|
},
|
|
60
77
|
{
|
|
61
|
-
id:
|
|
78
|
+
id: MONITORING_FEATURE_ID,
|
|
62
79
|
label: 'Monitoring',
|
|
63
80
|
enabled: true,
|
|
64
81
|
entityIds: [],
|
|
65
|
-
surfaceIds: [
|
|
82
|
+
surfaceIds: [
|
|
83
|
+
'monitoring.activity-log',
|
|
84
|
+
'monitoring.execution-logs',
|
|
85
|
+
'monitoring.execution-health',
|
|
86
|
+
'monitoring.cost-analytics',
|
|
87
|
+
'monitoring.notifications'
|
|
88
|
+
],
|
|
66
89
|
resourceIds: [],
|
|
67
90
|
capabilityIds: []
|
|
68
91
|
},
|
|
69
92
|
{
|
|
70
|
-
id:
|
|
93
|
+
id: SETTINGS_FEATURE_ID,
|
|
71
94
|
label: 'Settings',
|
|
72
95
|
enabled: true,
|
|
73
96
|
entityIds: [],
|
|
74
|
-
surfaceIds: [
|
|
97
|
+
surfaceIds: [
|
|
98
|
+
'settings.account',
|
|
99
|
+
'settings.appearance',
|
|
100
|
+
'settings.organization',
|
|
101
|
+
'settings.credentials',
|
|
102
|
+
'settings.api-keys',
|
|
103
|
+
'settings.webhooks',
|
|
104
|
+
'settings.deployments'
|
|
105
|
+
],
|
|
75
106
|
resourceIds: [],
|
|
76
107
|
capabilityIds: []
|
|
77
108
|
},
|
|
78
109
|
{
|
|
79
|
-
id:
|
|
110
|
+
id: SEO_FEATURE_ID,
|
|
80
111
|
label: 'SEO',
|
|
81
112
|
enabled: false,
|
|
82
113
|
entityIds: [],
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
-
import {
|
|
3
|
-
DELIVERY_PROJECTS_VIEW_CAPABILITY_ID,
|
|
4
|
-
PROJECTS_FEATURE_ID,
|
|
5
|
-
PROJECTS_INDEX_SURFACE_ID
|
|
6
|
-
} from '../contracts'
|
|
2
|
+
import { DELIVERY_PROJECTS_VIEW_CAPABILITY_ID, PROJECTS_FEATURE_ID, PROJECTS_INDEX_SURFACE_ID } from '../contracts'
|
|
7
3
|
import { DescriptionSchema, IconNameSchema, LabelSchema, ModelIdSchema, PathSchema, ReferenceIdsSchema } from './shared'
|
|
8
4
|
|
|
9
5
|
export const SurfaceTypeSchema = z.enum(['page', 'dashboard', 'graph', 'detail', 'list', 'settings'])
|
|
@@ -14,6 +10,7 @@ export const SurfaceDefinitionSchema = z.object({
|
|
|
14
10
|
path: PathSchema,
|
|
15
11
|
surfaceType: SurfaceTypeSchema,
|
|
16
12
|
description: DescriptionSchema.optional(),
|
|
13
|
+
enabled: z.boolean().default(true),
|
|
17
14
|
icon: IconNameSchema.optional(),
|
|
18
15
|
featureId: ModelIdSchema.optional(),
|
|
19
16
|
featureIds: ReferenceIdsSchema,
|
|
@@ -44,6 +41,7 @@ export const DEFAULT_ORGANIZATION_MODEL_NAVIGATION: z.infer<typeof OrganizationM
|
|
|
44
41
|
label: 'Pipeline',
|
|
45
42
|
path: '/crm/pipeline',
|
|
46
43
|
surfaceType: 'graph',
|
|
44
|
+
enabled: true,
|
|
47
45
|
featureId: 'crm',
|
|
48
46
|
featureIds: ['crm'],
|
|
49
47
|
entityIds: ['crm.deal'],
|
|
@@ -55,6 +53,7 @@ export const DEFAULT_ORGANIZATION_MODEL_NAVIGATION: z.infer<typeof OrganizationM
|
|
|
55
53
|
label: 'Lists',
|
|
56
54
|
path: '/lead-gen/lists',
|
|
57
55
|
surfaceType: 'list',
|
|
56
|
+
enabled: true,
|
|
58
57
|
featureId: 'lead-gen',
|
|
59
58
|
featureIds: ['lead-gen'],
|
|
60
59
|
entityIds: ['leadgen.list'],
|
|
@@ -66,6 +65,7 @@ export const DEFAULT_ORGANIZATION_MODEL_NAVIGATION: z.infer<typeof OrganizationM
|
|
|
66
65
|
label: 'Projects',
|
|
67
66
|
path: '/projects',
|
|
68
67
|
surfaceType: 'list',
|
|
68
|
+
enabled: true,
|
|
69
69
|
featureId: PROJECTS_FEATURE_ID,
|
|
70
70
|
featureIds: [PROJECTS_FEATURE_ID],
|
|
71
71
|
entityIds: ['delivery.project'],
|
|
@@ -77,6 +77,7 @@ export const DEFAULT_ORGANIZATION_MODEL_NAVIGATION: z.infer<typeof OrganizationM
|
|
|
77
77
|
label: 'Organization Graph',
|
|
78
78
|
path: '/operations/organization-graph',
|
|
79
79
|
surfaceType: 'graph',
|
|
80
|
+
enabled: true,
|
|
80
81
|
featureId: 'operations',
|
|
81
82
|
featureIds: ['operations'],
|
|
82
83
|
entityIds: [],
|
|
@@ -88,11 +89,216 @@ export const DEFAULT_ORGANIZATION_MODEL_NAVIGATION: z.infer<typeof OrganizationM
|
|
|
88
89
|
label: 'Command View',
|
|
89
90
|
path: '/operations/command-view',
|
|
90
91
|
surfaceType: 'graph',
|
|
92
|
+
enabled: false,
|
|
91
93
|
featureId: 'operations',
|
|
92
94
|
featureIds: ['operations'],
|
|
93
95
|
entityIds: [],
|
|
94
96
|
resourceIds: [],
|
|
95
97
|
capabilityIds: ['operations.command-view']
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: 'operations.overview',
|
|
101
|
+
label: 'Overview',
|
|
102
|
+
path: '/operations',
|
|
103
|
+
surfaceType: 'dashboard',
|
|
104
|
+
enabled: true,
|
|
105
|
+
featureId: 'operations',
|
|
106
|
+
featureIds: ['operations'],
|
|
107
|
+
entityIds: [],
|
|
108
|
+
resourceIds: [],
|
|
109
|
+
capabilityIds: []
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: 'operations.resources',
|
|
113
|
+
label: 'Resources',
|
|
114
|
+
path: '/operations/resources',
|
|
115
|
+
surfaceType: 'list',
|
|
116
|
+
enabled: true,
|
|
117
|
+
featureId: 'operations',
|
|
118
|
+
featureIds: ['operations'],
|
|
119
|
+
entityIds: [],
|
|
120
|
+
resourceIds: [],
|
|
121
|
+
capabilityIds: []
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: 'operations.command-queue',
|
|
125
|
+
label: 'Command Queue',
|
|
126
|
+
path: '/operations/command-queue',
|
|
127
|
+
surfaceType: 'list',
|
|
128
|
+
enabled: true,
|
|
129
|
+
featureId: 'operations',
|
|
130
|
+
featureIds: ['operations'],
|
|
131
|
+
entityIds: [],
|
|
132
|
+
resourceIds: [],
|
|
133
|
+
capabilityIds: []
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: 'operations.sessions',
|
|
137
|
+
label: 'Sessions',
|
|
138
|
+
path: '/operations/sessions',
|
|
139
|
+
surfaceType: 'page',
|
|
140
|
+
enabled: false,
|
|
141
|
+
featureId: 'operations',
|
|
142
|
+
featureIds: ['operations'],
|
|
143
|
+
entityIds: [],
|
|
144
|
+
resourceIds: [],
|
|
145
|
+
capabilityIds: []
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: 'operations.task-scheduler',
|
|
149
|
+
label: 'Task Scheduler',
|
|
150
|
+
path: '/operations/task-scheduler',
|
|
151
|
+
surfaceType: 'page',
|
|
152
|
+
enabled: true,
|
|
153
|
+
featureId: 'operations',
|
|
154
|
+
featureIds: ['operations'],
|
|
155
|
+
entityIds: [],
|
|
156
|
+
resourceIds: [],
|
|
157
|
+
capabilityIds: []
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: 'monitoring.activity-log',
|
|
161
|
+
label: 'Activity Log',
|
|
162
|
+
path: '/monitoring/activity-log',
|
|
163
|
+
surfaceType: 'list',
|
|
164
|
+
enabled: true,
|
|
165
|
+
featureId: 'monitoring',
|
|
166
|
+
featureIds: ['monitoring'],
|
|
167
|
+
entityIds: [],
|
|
168
|
+
resourceIds: [],
|
|
169
|
+
capabilityIds: []
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
id: 'monitoring.execution-logs',
|
|
173
|
+
label: 'Execution Logs',
|
|
174
|
+
path: '/monitoring/execution-logs',
|
|
175
|
+
surfaceType: 'list',
|
|
176
|
+
enabled: true,
|
|
177
|
+
featureId: 'monitoring',
|
|
178
|
+
featureIds: ['monitoring'],
|
|
179
|
+
entityIds: [],
|
|
180
|
+
resourceIds: [],
|
|
181
|
+
capabilityIds: []
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
id: 'monitoring.execution-health',
|
|
185
|
+
label: 'Execution Health',
|
|
186
|
+
path: '/monitoring/execution-health',
|
|
187
|
+
surfaceType: 'dashboard',
|
|
188
|
+
enabled: true,
|
|
189
|
+
featureId: 'monitoring',
|
|
190
|
+
featureIds: ['monitoring'],
|
|
191
|
+
entityIds: [],
|
|
192
|
+
resourceIds: [],
|
|
193
|
+
capabilityIds: []
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: 'monitoring.cost-analytics',
|
|
197
|
+
label: 'Cost Analytics',
|
|
198
|
+
path: '/monitoring/cost-analytics',
|
|
199
|
+
surfaceType: 'dashboard',
|
|
200
|
+
enabled: false,
|
|
201
|
+
featureId: 'monitoring',
|
|
202
|
+
featureIds: ['monitoring'],
|
|
203
|
+
entityIds: [],
|
|
204
|
+
resourceIds: [],
|
|
205
|
+
capabilityIds: []
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
id: 'monitoring.notifications',
|
|
209
|
+
label: 'Notifications',
|
|
210
|
+
path: '/monitoring/notifications',
|
|
211
|
+
surfaceType: 'page',
|
|
212
|
+
enabled: true,
|
|
213
|
+
featureId: 'monitoring',
|
|
214
|
+
featureIds: ['monitoring'],
|
|
215
|
+
entityIds: [],
|
|
216
|
+
resourceIds: [],
|
|
217
|
+
capabilityIds: []
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
id: 'settings.account',
|
|
221
|
+
label: 'Account',
|
|
222
|
+
path: '/settings/account',
|
|
223
|
+
surfaceType: 'settings',
|
|
224
|
+
enabled: true,
|
|
225
|
+
featureId: 'settings',
|
|
226
|
+
featureIds: ['settings'],
|
|
227
|
+
entityIds: [],
|
|
228
|
+
resourceIds: [],
|
|
229
|
+
capabilityIds: []
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: 'settings.appearance',
|
|
233
|
+
label: 'Appearance',
|
|
234
|
+
path: '/settings/appearance',
|
|
235
|
+
surfaceType: 'settings',
|
|
236
|
+
enabled: true,
|
|
237
|
+
featureId: 'settings',
|
|
238
|
+
featureIds: ['settings'],
|
|
239
|
+
entityIds: [],
|
|
240
|
+
resourceIds: [],
|
|
241
|
+
capabilityIds: []
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: 'settings.organization',
|
|
245
|
+
label: 'Organization',
|
|
246
|
+
path: '/settings/organization',
|
|
247
|
+
surfaceType: 'settings',
|
|
248
|
+
enabled: true,
|
|
249
|
+
featureId: 'settings',
|
|
250
|
+
featureIds: ['settings'],
|
|
251
|
+
entityIds: [],
|
|
252
|
+
resourceIds: [],
|
|
253
|
+
capabilityIds: []
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
id: 'settings.credentials',
|
|
257
|
+
label: 'Credentials',
|
|
258
|
+
path: '/settings/credentials',
|
|
259
|
+
surfaceType: 'settings',
|
|
260
|
+
enabled: true,
|
|
261
|
+
featureId: 'settings',
|
|
262
|
+
featureIds: ['settings'],
|
|
263
|
+
entityIds: [],
|
|
264
|
+
resourceIds: [],
|
|
265
|
+
capabilityIds: []
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
id: 'settings.api-keys',
|
|
269
|
+
label: 'API Keys',
|
|
270
|
+
path: '/settings/api-keys',
|
|
271
|
+
surfaceType: 'settings',
|
|
272
|
+
enabled: true,
|
|
273
|
+
featureId: 'settings',
|
|
274
|
+
featureIds: ['settings'],
|
|
275
|
+
entityIds: [],
|
|
276
|
+
resourceIds: [],
|
|
277
|
+
capabilityIds: []
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
id: 'settings.webhooks',
|
|
281
|
+
label: 'Webhooks',
|
|
282
|
+
path: '/settings/webhooks',
|
|
283
|
+
surfaceType: 'settings',
|
|
284
|
+
enabled: true,
|
|
285
|
+
featureId: 'settings',
|
|
286
|
+
featureIds: ['settings'],
|
|
287
|
+
entityIds: [],
|
|
288
|
+
resourceIds: [],
|
|
289
|
+
capabilityIds: []
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
id: 'settings.deployments',
|
|
293
|
+
label: 'Deployments',
|
|
294
|
+
path: '/settings/deployments',
|
|
295
|
+
surfaceType: 'settings',
|
|
296
|
+
enabled: true,
|
|
297
|
+
featureId: 'settings',
|
|
298
|
+
featureIds: ['settings'],
|
|
299
|
+
entityIds: [],
|
|
300
|
+
resourceIds: [],
|
|
301
|
+
capabilityIds: []
|
|
96
302
|
}
|
|
97
303
|
],
|
|
98
304
|
groups: [
|
|
@@ -106,7 +312,41 @@ export const DEFAULT_ORGANIZATION_MODEL_NAVIGATION: z.infer<typeof OrganizationM
|
|
|
106
312
|
id: 'primary-operations',
|
|
107
313
|
label: 'Operations',
|
|
108
314
|
placement: 'primary',
|
|
109
|
-
surfaceIds: [
|
|
315
|
+
surfaceIds: [
|
|
316
|
+
'operations.organization-graph',
|
|
317
|
+
'operations.command-view',
|
|
318
|
+
'operations.overview',
|
|
319
|
+
'operations.resources',
|
|
320
|
+
'operations.command-queue',
|
|
321
|
+
'operations.sessions',
|
|
322
|
+
'operations.task-scheduler'
|
|
323
|
+
]
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
id: 'primary-monitoring',
|
|
327
|
+
label: 'Monitoring',
|
|
328
|
+
placement: 'primary',
|
|
329
|
+
surfaceIds: [
|
|
330
|
+
'monitoring.activity-log',
|
|
331
|
+
'monitoring.execution-logs',
|
|
332
|
+
'monitoring.execution-health',
|
|
333
|
+
'monitoring.cost-analytics',
|
|
334
|
+
'monitoring.notifications'
|
|
335
|
+
]
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
id: 'primary-settings',
|
|
339
|
+
label: 'Settings',
|
|
340
|
+
placement: 'bottom',
|
|
341
|
+
surfaceIds: [
|
|
342
|
+
'settings.account',
|
|
343
|
+
'settings.appearance',
|
|
344
|
+
'settings.organization',
|
|
345
|
+
'settings.credentials',
|
|
346
|
+
'settings.api-keys',
|
|
347
|
+
'settings.webhooks',
|
|
348
|
+
'settings.deployments'
|
|
349
|
+
]
|
|
110
350
|
}
|
|
111
351
|
]
|
|
112
352
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PROJECTS_FEATURE_ID, PROJECTS_INDEX_SURFACE_ID } from './contracts'
|
|
2
2
|
import { resolveOrganizationModel } from './resolve'
|
|
3
|
-
import type { OrganizationModel, OrganizationModelSurface } from './types'
|
|
3
|
+
import type { DeepPartial, OrganizationModel, OrganizationModelSurface } from './types'
|
|
4
4
|
|
|
5
5
|
export type FoundationSurfaceType = OrganizationModelSurface['surfaceType']
|
|
6
6
|
|
|
@@ -25,14 +25,14 @@ export interface FoundationBranding {
|
|
|
25
25
|
shortName: string
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
export function createFoundationOrganizationModel(
|
|
28
|
+
export function createFoundationOrganizationModel(override: DeepPartial<OrganizationModel>): {
|
|
29
29
|
canonical: OrganizationModel
|
|
30
30
|
model: FoundationOrganizationModel
|
|
31
31
|
homeLabel: string
|
|
32
32
|
quickAccessSurfaceIds: readonly string[]
|
|
33
33
|
getOrganizationSurface: (surfaceId: string) => FoundationNavigationSurface | undefined
|
|
34
34
|
} {
|
|
35
|
-
const canonical = resolveOrganizationModel(
|
|
35
|
+
const canonical = resolveOrganizationModel(override)
|
|
36
36
|
|
|
37
37
|
function requireCoreSurface(surfaceId: string): OrganizationModelSurface {
|
|
38
38
|
const surface = canonical.navigation.surfaces.find((candidate) => candidate.id === surfaceId)
|
|
@@ -60,6 +60,7 @@ export function createFoundationOrganizationModel(branding: FoundationBranding):
|
|
|
60
60
|
label: 'Settings',
|
|
61
61
|
path: '/settings/account',
|
|
62
62
|
surfaceType: 'settings',
|
|
63
|
+
enabled: true,
|
|
63
64
|
icon: 'settings',
|
|
64
65
|
featureId: 'settings',
|
|
65
66
|
featureIds: ['settings'],
|
|
@@ -5,7 +5,7 @@ description: Organization OS Graph layer documentation for the Cytoscape-based o
|
|
|
5
5
|
|
|
6
6
|
## Overview
|
|
7
7
|
|
|
8
|
-
Within Organization OS, the organization graph is the dedicated **Graph** layer. It treats the organization model as the top-level ontology and bridges in Command View runtime topology so one graph can support semantic exploration and operations-oriented tracing.
|
|
8
|
+
Within Organization OS, the organization graph is the dedicated **Graph** layer. It treats the organization model as the top-level ontology and bridges in Command View runtime topology so one graph can support semantic exploration and operations-oriented tracing. Command View is now one lens over this shared graph, not a separate live graph renderer.
|
|
9
9
|
|
|
10
10
|
Graph contracts live in `@repo/core` alongside the organization model. Rendering lives in `@repo/ui` with Cytoscape.js. The command-center route is a thin wrapper over the shared page.
|
|
11
11
|
|
|
@@ -32,7 +32,7 @@ Graph types are intentionally **not** part of the published `@elevasis/core` sur
|
|
|
32
32
|
The graph helps users:
|
|
33
33
|
|
|
34
34
|
- orient themselves in the organization model
|
|
35
|
-
- discover how
|
|
35
|
+
- discover how features, capabilities, surfaces, entities, resources, and workflows connect
|
|
36
36
|
- trace upstream/downstream dependencies
|
|
37
37
|
- understand ownership and implementation boundaries
|
|
38
38
|
- assess blast radius before changing a workflow, agent, feature, or integration
|
|
@@ -46,21 +46,22 @@ The graph does not replace workflow editors, execution-run visualizers, or build
|
|
|
46
46
|
|
|
47
47
|
The implementation uses one typed graph, not separate semantic and implementation taxonomies.
|
|
48
48
|
|
|
49
|
-
- Node kinds: `organization`, `feature`, `
|
|
49
|
+
- Node kinds: `organization`, `feature`, `surface`, `entity`, `capability`, `resource`
|
|
50
50
|
- Edge kinds: `contains`, `references`, `exposes`, `maps_to`
|
|
51
51
|
- `resource` nodes carry `resourceType` metadata: `workflow`, `agent`, `trigger`, `integration`, `external`, or `human_checkpoint`
|
|
52
52
|
- `references` edges may also carry `relationshipType`: `triggers`, `uses`, or `approval`
|
|
53
53
|
|
|
54
|
-
This means runtime topology is represented as bridged `resource` nodes plus relationship metadata on shared edge types, rather than as a second disconnected edge/node vocabulary.
|
|
54
|
+
This means runtime topology is represented as bridged `resource` nodes plus relationship metadata on shared edge types, rather than as a second disconnected edge/node vocabulary. `maps_to` is the main crossover edge: the builder emits it from organization-model resource mappings, and the UI presence helpers also treat it as topology-facing when classifying which non-resource nodes participate in runtime-adjacent views.
|
|
55
55
|
|
|
56
56
|
### Compatibility rules with the organization model
|
|
57
57
|
|
|
58
58
|
- `OrganizationModelSchema` is the source of truth for semantic structure. The graph does not introduce a second ontology.
|
|
59
59
|
- Graph node IDs and references reuse organization-model IDs wherever those IDs already exist.
|
|
60
|
-
- `domain` nodes derive from `organizationModel.domains`.
|
|
61
60
|
- `surface` nodes derive from `organizationModel.navigation.surfaces`; graph routing respects surface `path` and `defaultSurfaceId`.
|
|
62
61
|
- Feature gating and labels respect `organizationModel.features.enabled` and `.labels`.
|
|
63
62
|
- Implementation-resource bridging prefers `organizationModel.resourceMappings`.
|
|
63
|
+
- Semantic grouping now comes from the unified `organizationModel.features` array. The builder no longer emits separate `domain` nodes.
|
|
64
|
+
- Command View resource `domains` metadata is currently bridged onto `feature` references, not onto a distinct domain-node layer.
|
|
64
65
|
- Graph defaults remain valid when produced by `resolveOrganizationModel()`.
|
|
65
66
|
- If the graph needs a concept the model cannot express, extend the model first.
|
|
66
67
|
|
|
@@ -70,7 +71,6 @@ This means runtime topology is represented as bridged `resource` nodes plus rela
|
|
|
70
71
|
type OrganizationGraphNodeKind =
|
|
71
72
|
| 'organization'
|
|
72
73
|
| 'feature'
|
|
73
|
-
| 'domain'
|
|
74
74
|
| 'surface'
|
|
75
75
|
| 'entity'
|
|
76
76
|
| 'capability'
|
|
@@ -86,7 +86,7 @@ interface OrganizationGraph {
|
|
|
86
86
|
}
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
-
`OrganizationGraphNode` also includes optional `sourceId`, `description`, `enabled`, `
|
|
89
|
+
`OrganizationGraphNode` also includes optional `sourceId`, `description`, `enabled`, `featureId`, `surfaceType`, and `resourceType`. `OrganizationGraphEdge` includes optional `label` and `relationshipType`.
|
|
90
90
|
|
|
91
91
|
### Build pipeline
|
|
92
92
|
|
|
@@ -100,9 +100,9 @@ interface BuildOrganizationGraphInput {
|
|
|
100
100
|
`buildOrganizationGraph` accepts optional topology input so the semantic graph still renders when operational bridging is sparse. The derivation flow is additive and upsert-oriented:
|
|
101
101
|
|
|
102
102
|
1. Resolve the active organization model.
|
|
103
|
-
2. Derive semantic nodes and edges from
|
|
103
|
+
2. Derive semantic nodes and edges from features, surfaces, entities, capabilities, and resource mappings.
|
|
104
104
|
3. Upsert bridged runtime resources from Command View data into shared `resource` nodes.
|
|
105
|
-
4.
|
|
105
|
+
4. Bridge Command View runtime topology onto the same DTO as `references` edges between `resource` nodes, using `relationshipType` for runtime relationship labels.
|
|
106
106
|
5. Hand the resulting graph to UI-level lensing, filtering, and Cytoscape projection.
|
|
107
107
|
|
|
108
108
|
Keeping assembly outside the renderer keeps graph semantics testable without UI and prevents Cytoscape concepts from leaking into business logic.
|
|
@@ -110,7 +110,7 @@ Keeping assembly outside the renderer keeps graph semantics testable without UI
|
|
|
110
110
|
### Ownership split
|
|
111
111
|
|
|
112
112
|
- `@repo/core` owns normalized node/edge types, schemas, and build/derivation helpers.
|
|
113
|
-
- `@repo/ui` owns Cytoscape element conversion, layout presets, selection
|
|
113
|
+
- `@repo/ui` owns Cytoscape element conversion, layout presets, selection state, path tracing, viewport mechanics, detail panels, and presentation helpers.
|
|
114
114
|
- `apps/command-center` owns route wiring and page-level integration.
|
|
115
115
|
|
|
116
116
|
## Interaction Model
|
|
@@ -124,6 +124,8 @@ The graph ships with two lens presets in UI code:
|
|
|
124
124
|
|
|
125
125
|
Lenses do not change the core DTO. They configure how the shared graph is initially presented.
|
|
126
126
|
|
|
127
|
+
The command-view preset is intentionally narrow. It starts from topology-focused `resource` nodes so runtime traces stay readable, even though the underlying graph still contains semantic nodes and bridge edges.
|
|
128
|
+
|
|
127
129
|
### Modes
|
|
128
130
|
|
|
129
131
|
- **Map mode** -- clustered for broad graph orientation
|
|
@@ -138,18 +140,13 @@ Layouts are deterministic presets, not unconstrained force simulation:
|
|
|
138
140
|
|
|
139
141
|
### Interactions
|
|
140
142
|
|
|
141
|
-
Primary set
|
|
143
|
+
Primary set in the current shared page:
|
|
142
144
|
|
|
143
145
|
- click node for detail panel
|
|
144
146
|
- click edge for relationship meaning
|
|
145
|
-
- hover for adjacency preview
|
|
146
|
-
- search and jump to node
|
|
147
|
-
- expand immediate neighbors
|
|
148
|
-
- isolate selected node + N-hop neighborhood
|
|
149
147
|
- switch mode
|
|
150
|
-
-
|
|
151
|
-
-
|
|
152
|
-
- filter by node kind, domain, capability, feature, status, environment
|
|
148
|
+
- highlight shortest directed paths between two visible nodes in trace mode
|
|
149
|
+
- filter by node kind, topology presence, and free-text search
|
|
153
150
|
|
|
154
151
|
Deferred: freeform node placement, collaborative annotations, graph editing/authoring, arbitrary canvas drawing.
|
|
155
152
|
|
|
@@ -163,13 +160,15 @@ Filter inputs:
|
|
|
163
160
|
- `nodeKinds`
|
|
164
161
|
- `topologyPresence: 'all' | 'semantic-only' | 'topology-only'`
|
|
165
162
|
|
|
166
|
-
Presence is derived per node:
|
|
163
|
+
Presence is derived per node in UI helpers:
|
|
167
164
|
|
|
168
165
|
- `resource` nodes are `topology-only`
|
|
169
|
-
- nodes with only semantic edges are `semantic-only`
|
|
170
|
-
- nodes with
|
|
166
|
+
- non-resource nodes with only semantic edges are `semantic-only`
|
|
167
|
+
- non-resource nodes with `maps_to` edges or runtime relationship edges alongside semantic edges are treated as `bridge` nodes internally
|
|
168
|
+
|
|
169
|
+
`bridge` is an internal classification used by the filtering helpers. The public filter control only exposes `all`, `semantic-only`, and `topology-only`, so bridge nodes appear when presence is `all`.
|
|
171
170
|
|
|
172
|
-
Search matches node IDs, labels, descriptions, source IDs, feature
|
|
171
|
+
Search matches node IDs, labels, descriptions, source IDs, feature IDs, surface/resource types, edge labels, edge kinds, and `relationshipType`.
|
|
173
172
|
|
|
174
173
|
The page applies `useDeferredValue()` to the active filters so graph search stays responsive while typing.
|
|
175
174
|
|
|
@@ -188,19 +187,28 @@ The graph is exposed through `ElevasisFeaturesProvider` rather than as app-local
|
|
|
188
187
|
- The provider resolves that against `organizationModel.navigation.surfaces` and exposes the result as `organizationGraph` in context.
|
|
189
188
|
- Shared UI/operations code stays manifest-driven while remaining aware of semantic organization topology.
|
|
190
189
|
|
|
190
|
+
This provider bridge resolves the canonical shared graph surface, not a Command View-specific surface. Command View still has its own navigation surface (`operations.command-view`), but the live page delegates into the shared graph renderer.
|
|
191
|
+
|
|
191
192
|
## Command View Integration
|
|
192
193
|
|
|
193
|
-
`CommandViewPage` now delegates to `OrganizationGraphPage` through a command-view lens preset. The
|
|
194
|
+
`CommandViewPage` now delegates to `OrganizationGraphPage` through a command-view lens preset. The shared page adds command-view operational context through:
|
|
194
195
|
|
|
195
|
-
-
|
|
196
|
+
- command-view summary cards rendered in `OrganizationGraphPage`
|
|
196
197
|
- selection-aware resource and human-checkpoint summaries inside the shared graph detail panel
|
|
197
198
|
- follow-up actions for recent executions and pending tasks inside the detail panel
|
|
198
|
-
- dedicated command-view sidebar content
|
|
199
|
+
- dedicated command-view sidebar content alongside the shared graph controls
|
|
199
200
|
|
|
200
201
|
Operational summary and drill-down derivation is covered by tests under `packages/ui/src/features/operations/organization-graph/__tests__/`.
|
|
201
202
|
|
|
202
203
|
The detail experience is shared through `OrganizationGraphDetailPanel`, which can render both semantic context and command-view-specific follow-up sections.
|
|
203
204
|
|
|
205
|
+
Keep the current seam explicit:
|
|
206
|
+
|
|
207
|
+
- The graph canvas, selection model, path tracing, shared filters, and detail panel all live in `OrganizationGraphPage`.
|
|
208
|
+
- `OperationsSidebarMiddle` still renders `CommandViewSidebarContent` for `/operations/command-view`.
|
|
209
|
+
- That sidebar remains a companion operational panel with some legacy store/filter assumptions and is not the source of truth for the shared graph's filter state.
|
|
210
|
+
- Older React Flow Command View code still exists in the repo, but it is no longer the live renderer for the current Command View route.
|
|
211
|
+
|
|
204
212
|
## Cytoscape Responsibility Split
|
|
205
213
|
|
|
206
214
|
Cytoscape owns:
|
|
@@ -217,16 +225,17 @@ React owns:
|
|
|
217
225
|
|
|
218
226
|
- mode switching
|
|
219
227
|
- side panels and inspectors
|
|
220
|
-
- search and
|
|
228
|
+
- filter toolbar search and trace controls
|
|
221
229
|
- route state and deep-linking
|
|
222
230
|
- server data fetching
|
|
223
|
-
- persistence of saved filters and views
|
|
224
231
|
|
|
225
232
|
## Package Boundary
|
|
226
233
|
|
|
227
234
|
- `packages/ui/package.json` declares Cytoscape on the published UI surface.
|
|
228
235
|
- `packages/ui/tsup.config.ts` and `packages/ui/rollup.dts.config.mjs` keep Cytoscape **externalized** for publish output.
|
|
229
|
-
- Graph DTO types
|
|
236
|
+
- Graph DTO types, schemas, and builders live in monorepo `@repo/core` organization-model modules.
|
|
237
|
+
- Cytoscape rendering, lens presets, filtering helpers, and detail/runtime presentation live in `@repo/ui`.
|
|
238
|
+
- The published `@elevasis/core` wrapper still exposes only the narrow organization-model API; this graph contract should be treated as monorepo-internal for now.
|
|
230
239
|
|
|
231
240
|
## Theming
|
|
232
241
|
|