@elevasis/ui 2.32.0 → 2.33.1

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 (91) hide show
  1. package/dist/app/index.d.ts +3 -0
  2. package/dist/app/index.js +3 -3
  3. package/dist/{chunk-LLRXA7D7.js → chunk-2VYMDNJ3.js} +1 -1
  4. package/dist/{chunk-7KZINJLP.js → chunk-3YZRKADM.js} +4 -4
  5. package/dist/{chunk-MOY4VOHF.js → chunk-4AAZXKLL.js} +1 -1
  6. package/dist/{chunk-RQTWIXJ5.js → chunk-53436UTQ.js} +1 -1
  7. package/dist/{chunk-WQPX44YM.js → chunk-AV2TKVVV.js} +673 -168
  8. package/dist/chunk-CLDCYJQT.js +1 -0
  9. package/dist/chunk-DWXDNT7P.js +145 -0
  10. package/dist/{chunk-T35FWDAB.js → chunk-DYIDXUJS.js} +1089 -158
  11. package/dist/{chunk-IQHU7O5Y.js → chunk-F3MXFE72.js} +1 -1
  12. package/dist/{chunk-5FJJ72HU.js → chunk-FOUYP4JX.js} +1 -1
  13. package/dist/{chunk-QQHOKTJA.js → chunk-H6EFQP2P.js} +39 -2
  14. package/dist/{chunk-5J4PDX26.js → chunk-KW7ZNQD7.js} +16 -2
  15. package/dist/{chunk-ZQOKIGZP.js → chunk-NCEQGEW5.js} +4 -4
  16. package/dist/{chunk-6DWD423K.js → chunk-PIS24NIV.js} +1 -1
  17. package/dist/{chunk-4MFNGNHF.js → chunk-QVTIOT73.js} +2 -2
  18. package/dist/{chunk-GCOQ3TBG.js → chunk-SWMQTF2H.js} +2 -2
  19. package/dist/{chunk-4QK76KIF.js → chunk-UNVRVCXZ.js} +1 -1
  20. package/dist/{chunk-VRNMNB3O.js → chunk-UYRT7SPM.js} +1 -1
  21. package/dist/{chunk-IZWTVFJ2.js → chunk-V6SZ4ECN.js} +6 -3
  22. package/dist/{chunk-YLQEVSOR.js → chunk-WGUEIGPC.js} +202 -54
  23. package/dist/{chunk-QXCDKE2O.js → chunk-WJOE76FI.js} +9 -28
  24. package/dist/{chunk-QTI3KC7D.js → chunk-YENKDBUU.js} +106 -43
  25. package/dist/components/index.d.ts +117 -4
  26. package/dist/components/index.js +24 -23
  27. package/dist/components/navigation/index.js +4 -3
  28. package/dist/execution/index.d.ts +8 -3
  29. package/dist/features/auth/index.d.ts +3 -0
  30. package/dist/features/clients/index.js +8 -7
  31. package/dist/features/crm/index.d.ts +3 -0
  32. package/dist/features/crm/index.js +10 -9
  33. package/dist/features/dashboard/index.d.ts +113 -3
  34. package/dist/features/dashboard/index.js +9 -8
  35. package/dist/features/delivery/index.d.ts +3 -0
  36. package/dist/features/delivery/index.js +9 -8
  37. package/dist/features/knowledge/index.js +8 -18
  38. package/dist/features/lead-gen/index.js +10 -9
  39. package/dist/features/monitoring/index.js +10 -9
  40. package/dist/features/monitoring/requests/index.d.ts +2 -2
  41. package/dist/features/monitoring/requests/index.js +8 -7
  42. package/dist/features/operations/index.d.ts +560 -93
  43. package/dist/features/operations/index.js +13 -12
  44. package/dist/features/settings/index.d.ts +3 -0
  45. package/dist/features/settings/index.js +9 -8
  46. package/dist/hooks/delivery/index.d.ts +3 -0
  47. package/dist/hooks/index.d.ts +210 -6
  48. package/dist/hooks/index.js +8 -7
  49. package/dist/hooks/operations/command-view/utils/transformCommandViewData.d.ts +205 -4
  50. package/dist/hooks/published.d.ts +210 -6
  51. package/dist/hooks/published.js +8 -7
  52. package/dist/index.d.ts +565 -95
  53. package/dist/index.js +8 -7
  54. package/dist/initialization/index.d.ts +3 -0
  55. package/dist/knowledge/index.d.ts +577 -215
  56. package/dist/knowledge/index.js +1180 -689
  57. package/dist/knowledge-search-index-P7PR626V.js +1514 -0
  58. package/dist/layout/index.js +1 -1
  59. package/dist/profile/index.d.ts +3 -0
  60. package/dist/provider/index.d.ts +447 -73
  61. package/dist/provider/index.js +7 -6
  62. package/dist/provider/published.d.ts +447 -73
  63. package/dist/provider/published.js +5 -4
  64. package/dist/supabase/index.d.ts +6 -0
  65. package/dist/types/index.d.ts +208 -4
  66. package/dist/utils/index.d.ts +113 -3
  67. package/package.json +39 -39
  68. package/src/README.md +29 -29
  69. package/src/api/README.md +18 -18
  70. package/src/app/README.md +24 -24
  71. package/src/auth/README.md +18 -18
  72. package/src/components/README.md +24 -24
  73. package/src/execution/README.md +16 -16
  74. package/src/features/README.md +28 -28
  75. package/src/graph/README.md +16 -16
  76. package/src/hooks/README.md +23 -23
  77. package/src/initialization/README.md +19 -19
  78. package/src/knowledge/README.md +31 -31
  79. package/src/organization/README.md +18 -18
  80. package/src/profile/README.md +19 -19
  81. package/src/provider/README.md +32 -32
  82. package/src/router/README.md +18 -18
  83. package/src/sse/README.md +13 -13
  84. package/src/test-utils/README.md +7 -7
  85. package/src/theme/README.md +23 -23
  86. package/src/theme/presets/README.md +19 -19
  87. package/src/types/README.md +16 -16
  88. package/src/utils/README.md +18 -18
  89. package/src/zustand/README.md +18 -18
  90. package/dist/chunk-UROTM5OR.js +0 -172
  91. package/dist/knowledge-search-index-5KYPO746.js +0 -1479
@@ -1,5 +1,5 @@
1
- import { SemanticIcon } from './chunk-UROTM5OR.js';
2
- import { buildOrganizationGraph, projectOrganizationSurfaces, getSortedSidebarEntries, getSystem } from './chunk-T35FWDAB.js';
1
+ import { SemanticIcon } from './chunk-DWXDNT7P.js';
2
+ import { buildOrganizationGraph, projectOrganizationSurfaces, compileOrganizationOntology, getSortedSidebarEntries, parseOntologyId, getSystem, resolveSystemConfig } from './chunk-DYIDXUJS.js';
3
3
  import { useMemo, useState, useRef, useEffect } from 'react';
4
4
  import { useTree, Text, Tree, UnstyledButton, Group, TextInput } from '@mantine/core';
5
5
  import { useClipboard } from '@mantine/hooks';
@@ -20,9 +20,9 @@ function getSharedOrganizationGraph(organizationModel) {
20
20
 
21
21
  // src/knowledge/iconTokens.ts
22
22
  var KNOWLEDGE_ICON_TOKEN_BY_KIND = {
23
- playbook: "knowledge.playbook",
24
- strategy: "knowledge.strategy",
25
- reference: "knowledge.reference"
23
+ playbook: "playbook",
24
+ strategy: "strategy",
25
+ reference: "reference"
26
26
  };
27
27
  function getKnowledgeIconToken(node) {
28
28
  return node.icon ?? KNOWLEDGE_ICON_TOKEN_BY_KIND[node.kind];
@@ -84,25 +84,235 @@ function projectNavigationGroups(model) {
84
84
  ...collectGroups(model.navigation.sidebar.bottom, "bottom")
85
85
  ];
86
86
  }
87
- function toSemanticFallbackKind(kind) {
87
+
88
+ // src/knowledge/ontologyProjection.ts
89
+ var DOMAIN_LABELS = {
90
+ "ontology-objects": "Objects",
91
+ "ontology-links": "Links",
92
+ "ontology-actions": "Actions",
93
+ "ontology-catalogs": "Catalogs",
94
+ "ontology-events": "Events",
95
+ "ontology-interfaces": "Interfaces",
96
+ "ontology-value-types": "Value Types",
97
+ "ontology-properties": "Shared Properties",
98
+ "ontology-groups": "Groups",
99
+ "ontology-surfaces": "Surfaces",
100
+ "ontology-resources": "Resources"
101
+ };
102
+ function titleFromId(id) {
103
+ const localId = id.includes("/") ? id.slice(id.lastIndexOf("/") + 1) : id;
104
+ return localId.replace(/[-_.]+/g, " ").replace(/\s+/g, " ").trim().replace(/\b\w/g, (char) => char.toUpperCase());
105
+ }
106
+ function isLegacyBridgeRecord(record) {
107
+ const origin = record["origin"];
108
+ if (typeof origin === "object" && origin !== null) {
109
+ const source = origin.source;
110
+ if (typeof source === "string" && source.startsWith("legacy.")) return true;
111
+ }
112
+ return typeof record["legacyActionId"] === "string";
113
+ }
114
+ function ontologyItem(id, record, fallbackKind) {
115
+ let parsed;
116
+ try {
117
+ parsed = parseOntologyId(id);
118
+ } catch {
119
+ parsed = void 0;
120
+ }
121
+ const ownerSystemId = typeof record["ownerSystemId"] === "string" ? record["ownerSystemId"] : parsed?.isGlobal === false ? parsed.scope : void 0;
122
+ const meta = {};
123
+ for (const [key, value] of Object.entries(record)) {
124
+ if (["id", "label", "description", "ownerSystemId", "aliases"].includes(key)) continue;
125
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
126
+ meta[key] = value;
127
+ }
128
+ }
129
+ return {
130
+ id,
131
+ label: typeof record["label"] === "string" ? record["label"] : titleFromId(id),
132
+ description: typeof record["description"] === "string" ? record["description"] : void 0,
133
+ kind: parsed?.kind ?? fallbackKind,
134
+ ownerSystemId,
135
+ source: isLegacyBridgeRecord(record) ? "legacy-bridge" : "ontology",
136
+ meta
137
+ };
138
+ }
139
+ function sortItems(items) {
140
+ return [...items].sort(
141
+ (left, right) => (left.ownerSystemId ?? "").localeCompare(right.ownerSystemId ?? "") || left.label.localeCompare(right.label) || left.id.localeCompare(right.id)
142
+ );
143
+ }
144
+ function resourceDescription(resource) {
145
+ return resource.codeRefs.find((codeRef) => codeRef.description !== void 0)?.description;
146
+ }
147
+ function getKnowledgeOntologyProjection(model) {
148
+ const compiled = compileOrganizationOntology(model);
149
+ return {
150
+ objects: sortItems(
151
+ Object.entries(compiled.ontology.objectTypes).map(
152
+ ([id, record]) => ontologyItem(id, record, "object")
153
+ )
154
+ ),
155
+ links: sortItems(
156
+ Object.entries(compiled.ontology.linkTypes).map(
157
+ ([id, record]) => ontologyItem(id, record, "link")
158
+ )
159
+ ),
160
+ actions: sortItems(
161
+ Object.entries(compiled.ontology.actionTypes).map(
162
+ ([id, record]) => ontologyItem(id, record, "action")
163
+ )
164
+ ),
165
+ catalogs: sortItems(
166
+ Object.entries(compiled.ontology.catalogTypes).map(
167
+ ([id, record]) => ontologyItem(id, record, "catalog")
168
+ )
169
+ ),
170
+ events: sortItems(
171
+ Object.entries(compiled.ontology.eventTypes).map(
172
+ ([id, record]) => ontologyItem(id, record, "event")
173
+ )
174
+ ),
175
+ interfaces: sortItems(
176
+ Object.entries(compiled.ontology.interfaceTypes).map(
177
+ ([id, record]) => ontologyItem(id, record, "interface")
178
+ )
179
+ ),
180
+ valueTypes: sortItems(
181
+ Object.entries(compiled.ontology.valueTypes).map(
182
+ ([id, record]) => ontologyItem(id, record, "value-type")
183
+ )
184
+ ),
185
+ properties: sortItems(
186
+ Object.entries(compiled.ontology.sharedProperties).map(
187
+ ([id, record]) => ontologyItem(id, record, "property")
188
+ )
189
+ ),
190
+ groups: sortItems(
191
+ Object.entries(compiled.ontology.groups).map(
192
+ ([id, record]) => ontologyItem(id, record, "group")
193
+ )
194
+ ),
195
+ surfaces: sortItems(
196
+ Object.entries(compiled.ontology.surfaces).map(
197
+ ([id, record]) => ontologyItem(id, record, "surface")
198
+ )
199
+ ),
200
+ resources: sortItems(
201
+ Object.values(model.resources ?? {}).map((resource) => ({
202
+ id: resource.id,
203
+ label: resource.id,
204
+ description: resourceDescription(resource),
205
+ kind: "resource",
206
+ ownerSystemId: resource.systemPath,
207
+ source: "resource",
208
+ meta: { type: resource.kind, status: resource.status }
209
+ }))
210
+ ),
211
+ diagnosticsCount: compiled.diagnostics.length
212
+ };
213
+ }
214
+ function getOntologyItemsForDomain(projection, domainKey) {
215
+ switch (domainKey) {
216
+ case "ontology-objects":
217
+ return projection.objects;
218
+ case "ontology-links":
219
+ return projection.links;
220
+ case "ontology-actions":
221
+ return projection.actions;
222
+ case "ontology-catalogs":
223
+ return projection.catalogs;
224
+ case "ontology-events":
225
+ return projection.events;
226
+ case "ontology-interfaces":
227
+ return projection.interfaces;
228
+ case "ontology-value-types":
229
+ return projection.valueTypes;
230
+ case "ontology-properties":
231
+ return projection.properties;
232
+ case "ontology-groups":
233
+ return projection.groups;
234
+ case "ontology-surfaces":
235
+ return projection.surfaces;
236
+ case "ontology-resources":
237
+ return projection.resources;
238
+ default:
239
+ return [];
240
+ }
241
+ }
242
+ function getPrimaryOntologyItemsForDomain(projection, domainKey) {
243
+ return getOntologyItemsForDomain(projection, domainKey).filter((item) => item.source !== "legacy-bridge");
244
+ }
245
+ function getOntologyDomainLabel(domainKey) {
246
+ return DOMAIN_LABELS[domainKey] ?? "Ontology";
247
+ }
248
+
249
+ // src/knowledge/knowledgeCopyCommands.ts
250
+ function stripGraphKindPrefix(id, kind) {
251
+ const prefix = `${kind}:`;
252
+ return id.startsWith(prefix) ? id.slice(prefix.length) : id;
253
+ }
254
+ function normalizeKnowledgeNodeId(nodeId) {
255
+ return nodeId.startsWith("knowledge:") ? nodeId.slice("knowledge:".length) : nodeId;
256
+ }
257
+ function getKnowledgeNodeReadCommand(nodeId) {
258
+ return `/knowledge read ${normalizeKnowledgeNodeId(nodeId)}`;
259
+ }
260
+ function getKnowledgeNodeReadCommands(nodeIds) {
261
+ return [...new Set(nodeIds)].map(getKnowledgeNodeReadCommand).join("\n");
262
+ }
263
+ function getKnowledgeFolderCommand(kind, id) {
264
+ return `/knowledge read-folder ${kind}:${id}`;
265
+ }
266
+ function getKnowledgeTreeFolderCommand(treeValue) {
267
+ return `/knowledge read-folder ${treeValue}`;
268
+ }
269
+ function getKnowledgeDomainFolderCommand(domainKey) {
270
+ return getKnowledgeFolderCommand("domain", domainKey);
271
+ }
272
+ function getKnowledgeGraphFolderCommand(graphNodeId) {
273
+ return getKnowledgeFolderCommand("graph", graphNodeId);
274
+ }
275
+ function getKnowledgeSpineFolderCommand(spine, id) {
276
+ const bareId = stripGraphKindPrefix(id, spine);
277
+ if (spine === "system") return getKnowledgeFolderCommand("system", bareId);
278
+ if (spine === "ontology") return getKnowledgeFolderCommand("ontology", bareId);
279
+ return getKnowledgeGraphFolderCommand(`${spine}:${bareId}`);
280
+ }
281
+ function getKnowledgeGraphNodeCommand(node) {
282
+ if (node.kind === "knowledge") {
283
+ return getKnowledgeNodeReadCommand(node.sourceId ?? node.id);
284
+ }
285
+ if (node.kind === "system") {
286
+ return getKnowledgeFolderCommand("system", node.sourceId ?? stripGraphKindPrefix(node.id, "system"));
287
+ }
288
+ if (node.kind === "ontology") {
289
+ return getKnowledgeFolderCommand("ontology", node.sourceId ?? stripGraphKindPrefix(node.id, "ontology"));
290
+ }
291
+ return getKnowledgeGraphFolderCommand(node.id);
292
+ }
293
+ function graphKindToFallbackToken(kind) {
88
294
  switch (kind) {
89
295
  case "knowledge":
296
+ return "reference";
90
297
  case "resource":
298
+ return "workflow";
91
299
  case "action":
300
+ return "view";
92
301
  case "entity":
93
302
  case "event":
303
+ return "database";
94
304
  case "policy":
95
- return kind;
305
+ return "shield";
96
306
  case "system":
97
- return "feature";
307
+ return "operations";
98
308
  case "role":
99
- return "unknown";
309
+ return "user";
100
310
  case "stage":
101
- return "status";
311
+ return "pending";
102
312
  case "organization":
103
- return "unknown";
313
+ return "building";
104
314
  default:
105
- return "unknown";
315
+ return "info";
106
316
  }
107
317
  }
108
318
  var QUICK_ACCESS_GROUP_KEY = "quick-access";
@@ -114,6 +324,9 @@ var GROUP_ICON_TOKENS = {
114
324
  "business-model": "om.business-model",
115
325
  systems: "om.systems",
116
326
  graph: "om.graph",
327
+ resources: "resources",
328
+ knowledge: "knowledge",
329
+ navigation: "view",
117
330
  "governance-wiring": "om.governance-wiring"
118
331
  };
119
332
  function findFavoritePathInTree(nodes, favorite) {
@@ -155,8 +368,26 @@ var OM_TREE_GROUPS = [
155
368
  { key: "profile", label: "Profile", domains: ["identity", "branding"] },
156
369
  { key: "business-model", label: "Business Model", domains: ["customers", "offerings", "goals"] },
157
370
  { key: "systems", label: "Systems", domains: ["systems", "sales", "prospecting", "projects"] },
158
- { key: "graph", label: "Graph", domains: ["resources", "actions", "entities", "events", "stages", "knowledge"] },
159
- { key: "governance-wiring", label: "Governance & Wiring", domains: ["roles", "policies", "statuses", "navigation"] }
371
+ {
372
+ key: "graph",
373
+ label: "Ontology",
374
+ domains: [
375
+ "ontology-objects",
376
+ "ontology-links",
377
+ "ontology-actions",
378
+ "ontology-catalogs",
379
+ "ontology-events",
380
+ "ontology-interfaces",
381
+ "ontology-value-types",
382
+ "ontology-properties",
383
+ "ontology-groups",
384
+ "ontology-surfaces"
385
+ ]
386
+ },
387
+ { key: "resources", label: "Resources", domains: ["resources"] },
388
+ { key: "knowledge", label: "Knowledge", domains: ["knowledge"] },
389
+ { key: "navigation", label: "Navigation", domains: ["navigation"] },
390
+ { key: "governance-wiring", label: "Governance", domains: ["roles", "policies"] }
160
391
  ];
161
392
  var DOMAIN_PREFIX = "domain:";
162
393
  var GROUP_PREFIX = "group:";
@@ -184,6 +415,7 @@ function graphNodeIdForKnowledgeTarget(targetKind, targetId) {
184
415
  case "policy":
185
416
  case "role":
186
417
  case "knowledge":
418
+ case "ontology":
187
419
  case "system":
188
420
  case "stage":
189
421
  return `${targetKind}:${targetId}`;
@@ -209,6 +441,20 @@ var GRAPH_RESOURCE_TYPE_LABELS = {
209
441
  trigger: "Triggers",
210
442
  human_checkpoint: "Human Checkpoints"
211
443
  };
444
+ var CORE_ONTOLOGY_DOMAIN_KEYS = [
445
+ "ontology-objects",
446
+ "ontology-links",
447
+ "ontology-actions",
448
+ "ontology-catalogs",
449
+ "ontology-events",
450
+ "ontology-surfaces"
451
+ ];
452
+ var OPTIONAL_ONTOLOGY_DOMAIN_KEYS = [
453
+ "ontology-interfaces",
454
+ "ontology-value-types",
455
+ "ontology-properties",
456
+ "ontology-groups"
457
+ ];
212
458
  var KNOWLEDGE_START_HERE_IDS = [
213
459
  "knowledge.org-model-reference",
214
460
  "knowledge.org-model-graph-contract",
@@ -254,11 +500,20 @@ var KNOWLEDGE_DOMAINS_WITH_PANELS = /* @__PURE__ */ new Set([
254
500
  "sales",
255
501
  "prospecting",
256
502
  "projects",
257
- "statuses",
258
503
  "navigation",
259
- "policies"
504
+ "policies",
505
+ "ontology-objects",
506
+ "ontology-links",
507
+ "ontology-actions",
508
+ "ontology-catalogs",
509
+ "ontology-events",
510
+ "ontology-interfaces",
511
+ "ontology-value-types",
512
+ "ontology-properties",
513
+ "ontology-groups",
514
+ "ontology-surfaces"
260
515
  ]);
261
- var FILTERABLE_DOMAIN_KEYS = /* @__PURE__ */ new Set(["customers", "offerings", "goals", "roles", "statuses", "policies"]);
516
+ var FILTERABLE_DOMAIN_KEYS = /* @__PURE__ */ new Set(["customers", "offerings", "goals", "roles", "policies"]);
262
517
  function shouldRouteItemToDomainPanel(domainKey) {
263
518
  return FILTERABLE_DOMAIN_KEYS.has(domainKey);
264
519
  }
@@ -356,8 +611,13 @@ function spineNodeHasVisibleDescendant(bareId, allBareIds, spine, facetStates, c
356
611
  const cached = cache2.get(bareId);
357
612
  if (cached !== void 0) return cached;
358
613
  const graphNodeId = `${spine}:${bareId}`;
359
- const hasContentChildren = spine === "system" && organizationModel !== void 0 && Object.keys(getSystem(organizationModel, bareId)?.content ?? {}).length > 0;
360
- let result = hasContentChildren || facetStates.knowledge !== "exclude" && (ctx.governsEdgesByTarget.get(graphNodeId)?.length ?? 0) > 0 || getIncludedFacetNodes(graphNodeId, spine, facetStates, ctx).length > 0 || childGraphIds(allBareIds, bareId).some(
614
+ const hasSystemModelChildren = spine === "system" && [
615
+ ...buildOntologySubgroup(bareId, organizationModel),
616
+ ...buildSystemResourcesSubgroup(bareId, ctx),
617
+ ...buildSystemConfigSubgroup(bareId, organizationModel),
618
+ ...buildSystemGovernanceSubgroup(bareId, organizationModel)
619
+ ].length > 0;
620
+ let result = hasSystemModelChildren || facetStates.knowledge !== "exclude" && (ctx.governsEdgesByTarget.get(graphNodeId)?.length ?? 0) > 0 || getIncludedFacetNodes(graphNodeId, spine, facetStates, ctx).length > 0 || childGraphIds(allBareIds, bareId).some(
361
621
  (childId) => spineNodeHasVisibleDescendant(childId, allBareIds, spine, facetStates, ctx, organizationModel, cache2)
362
622
  );
363
623
  cache2.set(bareId, result);
@@ -372,20 +632,8 @@ function buildSpineMetaMap(graph, spine) {
372
632
  }
373
633
  return map;
374
634
  }
375
- function getKnowledgeReadCommand(nodeId) {
376
- return `/knowledge read ${nodeId}`;
377
- }
378
- function getKnowledgeReadCommands(nodeIds) {
379
- return [...new Set(nodeIds)].map(getKnowledgeReadCommand).join("\n");
380
- }
381
- function getKnowledgeReadSpineFolderCommand(spine, bareId) {
382
- return `/knowledge read-folder ${spine}:${bareId}`;
383
- }
384
- function getKnowledgeReadTreeFolderCommand(treeValue) {
385
- return `/knowledge read-folder ${treeValue}`;
386
- }
387
635
  function getKnowledgeDirectoryCommand(nodeIds, fallbackCommand) {
388
- const command = getKnowledgeReadCommands(nodeIds ?? []);
636
+ const command = getKnowledgeNodeReadCommands(nodeIds ?? []);
389
637
  return command || fallbackCommand;
390
638
  }
391
639
  function getKnowledgeFolderKey(node) {
@@ -407,6 +655,14 @@ function sortFolderKeys(left, right) {
407
655
  if (rightIndex === -1) return -1;
408
656
  return leftIndex - rightIndex;
409
657
  }
658
+ function formatTreeLabel(value) {
659
+ const spaced = value.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[._/-]+/g, " ").trim();
660
+ if (!spaced) return value;
661
+ return spaced.split(/\s+/).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
662
+ }
663
+ function treeValueSegment(value) {
664
+ return value.replace(/[^A-Za-z0-9_.-]/g, "-");
665
+ }
410
666
  function createKnowledgeLeaf(graphNodeId, node) {
411
667
  return {
412
668
  value: `${LEAF_PREFIX}${graphNodeId}::${node.id}`,
@@ -431,7 +687,7 @@ function createKnowledgeLeaves(graphNodeId, nodes) {
431
687
  value: `${FOLDER_PREFIX}${graphNodeId}::${folderKey}`,
432
688
  label: FOLDER_LABELS[folderKey] ?? folderKey,
433
689
  nodeType: "folder",
434
- icon: "knowledge.playbook",
690
+ icon: "playbook",
435
691
  knowledgeNodeIds: folderNodes.map((node) => node.id),
436
692
  children: folderNodes.map((node) => createKnowledgeLeaf(graphNodeId, node))
437
693
  }));
@@ -536,55 +792,236 @@ function createCollectionNode(parentKey, collectionKey, label, children) {
536
792
  children: children.length > 0 ? children : void 0
537
793
  };
538
794
  }
539
- var CONTENT_META_KIND_ORDER = ["schema", "config", "knowledge"];
540
- function contentMetaKindSortKey(kind) {
541
- const idx = CONTENT_META_KIND_ORDER.indexOf(kind);
542
- return idx === -1 ? CONTENT_META_KIND_ORDER.length : idx;
543
- }
544
- function buildContentKindItems(systemPath, entries) {
545
- return [...entries].sort(([, a], [, b]) => (a.order ?? 0) - (b.order ?? 0) || (a.label ?? "").localeCompare(b.label ?? "")).map(([localId, node]) => {
546
- const qualifiedId = `${systemPath}:${localId}`;
795
+ function buildOntologySubgroup(bareId, organizationModel) {
796
+ if (!organizationModel) return [];
797
+ const projection = getKnowledgeOntologyProjection(organizationModel);
798
+ const domainKeys = [...CORE_ONTOLOGY_DOMAIN_KEYS, ...OPTIONAL_ONTOLOGY_DOMAIN_KEYS];
799
+ const domainFolders = domainKeys.map((domainKey) => {
800
+ const items = getPrimaryOntologyItemsForDomain(projection, domainKey).filter(
801
+ (item) => item.ownerSystemId === bareId
802
+ );
803
+ if (items.length === 0) return void 0;
547
804
  return {
548
- // Wave 5 will project content nodes into the graph; until then render as
549
- // 'item' so the label appears without requiring a graph-node map lookup.
550
- value: `${ITEM_PREFIX}content:${qualifiedId}`,
551
- label: node.label ?? localId,
552
- nodeType: "item",
553
- domainKey: "content",
554
- itemId: qualifiedId,
555
- graphNodeId: `content-node:${qualifiedId}`,
556
- knowledgeNodeIds: []
805
+ value: `${FOLDER_PREFIX}ontology:${bareId}:${domainKey}`,
806
+ label: getOntologyDomainLabel(domainKey),
807
+ nodeType: "folder",
808
+ knowledgeNodeIds: [],
809
+ children: items.map(
810
+ (item) => createItemNode({
811
+ domainKey,
812
+ itemId: item.id,
813
+ label: item.label,
814
+ graphNodeId: item.kind === "resource" ? `resource:${item.id}` : `ontology:${item.id}`
815
+ })
816
+ )
557
817
  };
558
- });
818
+ }).filter((node) => node !== void 0);
819
+ if (domainFolders.length === 0) return [];
820
+ return [
821
+ {
822
+ value: `${FOLDER_PREFIX}ontology:${bareId}`,
823
+ label: "Ontology",
824
+ nodeType: "folder",
825
+ knowledgeNodeIds: [],
826
+ children: domainFolders
827
+ }
828
+ ];
829
+ }
830
+ function buildSystemResourcesSubgroup(bareId, ctx) {
831
+ const graphNodeId = `system:${bareId}`;
832
+ const resourceNodes = (ctx.edgesBySource.get(graphNodeId) ?? []).filter((edge) => edge.kind === "contains").map((edge) => ctx.nodesById.get(edge.targetId)).filter((node) => node?.kind === "resource").sort((left, right) => left.label.localeCompare(right.label) || left.id.localeCompare(right.id));
833
+ if (resourceNodes.length === 0) return [];
834
+ const children = GRAPH_RESOURCE_TYPE_ORDER.map((resourceType) => {
835
+ const typedResources = resourceNodes.filter((node) => node.resourceType === resourceType);
836
+ if (typedResources.length === 0) return void 0;
837
+ return createCollectionNode(
838
+ `system:${bareId}:resources`,
839
+ resourceType,
840
+ GRAPH_RESOURCE_TYPE_LABELS[resourceType],
841
+ typedResources.map((node) => createGraphNodeItem(node, "resources"))
842
+ );
843
+ }).filter((node) => node !== void 0);
844
+ const unclassifiedResources = resourceNodes.filter((node) => node.resourceType === void 0);
845
+ if (unclassifiedResources.length > 0) {
846
+ children.push(
847
+ createCollectionNode(
848
+ `system:${bareId}:resources`,
849
+ "unknown",
850
+ "Unclassified",
851
+ unclassifiedResources.map((node) => createGraphNodeItem(node, "resources"))
852
+ )
853
+ );
854
+ }
855
+ return [
856
+ {
857
+ value: `${FOLDER_PREFIX}resources:${bareId}`,
858
+ label: "Resources",
859
+ nodeType: "folder",
860
+ icon: "workflow",
861
+ knowledgeNodeIds: children.flatMap(collectKnowledgeNodeIds),
862
+ children
863
+ }
864
+ ];
559
865
  }
560
- function buildContentSubgroup(bareId, organizationModel) {
866
+ function buildSystemConfigSubgroup(bareId, organizationModel) {
561
867
  if (!organizationModel) return [];
562
868
  const system = getSystem(organizationModel, bareId);
563
- const contentMap = system?.content;
564
- if (!contentMap || Object.keys(contentMap).length === 0) return [];
565
- const byMetaKind = /* @__PURE__ */ new Map();
566
- for (const [localId, node] of Object.entries(contentMap)) {
567
- const bucket = byMetaKind.get(node.kind) ?? [];
568
- bucket.push([localId, node]);
569
- byMetaKind.set(node.kind, bucket);
869
+ if (!system) return [];
870
+ const config = resolveSystemConfig(organizationModel, bareId);
871
+ const configKeys = Object.keys(config).sort((left, right) => left.localeCompare(right));
872
+ const children = [];
873
+ if (configKeys.length > 0) {
874
+ children.push({
875
+ value: `${FOLDER_PREFIX}config:${bareId}:defaults`,
876
+ label: "Defaults",
877
+ nodeType: "folder",
878
+ icon: "settings",
879
+ knowledgeNodeIds: [],
880
+ children: configKeys.map((key) => ({
881
+ value: `${FOLDER_PREFIX}config:${bareId}:defaults:${treeValueSegment(key)}`,
882
+ label: formatTreeLabel(key),
883
+ nodeType: "folder",
884
+ knowledgeNodeIds: []
885
+ }))
886
+ });
570
887
  }
571
- const kindFolders = [...byMetaKind.entries()].sort(([a], [b]) => contentMetaKindSortKey(a) - contentMetaKindSortKey(b) || a.localeCompare(b)).map(([metaKind, entries]) => {
572
- const items = buildContentKindItems(bareId, entries);
573
- return {
574
- value: `${FOLDER_PREFIX}content:${bareId}:${metaKind}`,
575
- label: metaKind.charAt(0).toUpperCase() + metaKind.slice(1),
888
+ const hasUiConfig = system.ui !== void 0 || system.path !== void 0 || system.icon !== void 0 || system.uiPosition !== void 0 || system.enabled !== void 0 || system.devOnly !== void 0 || system.requiresAdmin !== void 0;
889
+ if (hasUiConfig) {
890
+ const uiChildren = [];
891
+ if (system.ui?.path !== void 0 || system.path !== void 0) {
892
+ uiChildren.push({
893
+ value: `${FOLDER_PREFIX}config:${bareId}:ui:path`,
894
+ label: "Path",
895
+ nodeType: "folder",
896
+ knowledgeNodeIds: []
897
+ });
898
+ }
899
+ if ((system.ui?.surfaces.length ?? 0) > 0) {
900
+ uiChildren.push({
901
+ value: `${FOLDER_PREFIX}config:${bareId}:ui:surfaces`,
902
+ label: "Surfaces",
903
+ nodeType: "folder",
904
+ knowledgeNodeIds: []
905
+ });
906
+ }
907
+ if (system.ui?.icon !== void 0 || system.icon !== void 0) {
908
+ uiChildren.push({
909
+ value: `${FOLDER_PREFIX}config:${bareId}:ui:icon`,
910
+ label: "Icon",
911
+ nodeType: "folder",
912
+ knowledgeNodeIds: []
913
+ });
914
+ }
915
+ if (system.uiPosition !== void 0) {
916
+ uiChildren.push({
917
+ value: `${FOLDER_PREFIX}config:${bareId}:ui:placement`,
918
+ label: "Placement",
919
+ nodeType: "folder",
920
+ knowledgeNodeIds: []
921
+ });
922
+ }
923
+ if (system.enabled !== void 0 || system.devOnly !== void 0 || system.requiresAdmin !== void 0) {
924
+ uiChildren.push({
925
+ value: `${FOLDER_PREFIX}config:${bareId}:ui:access`,
926
+ label: "Access",
927
+ nodeType: "folder",
928
+ knowledgeNodeIds: []
929
+ });
930
+ }
931
+ children.push({
932
+ value: `${FOLDER_PREFIX}config:${bareId}:ui`,
933
+ label: "UI",
576
934
  nodeType: "folder",
935
+ icon: "view",
577
936
  knowledgeNodeIds: [],
578
- children: items.length > 0 ? items : void 0
579
- };
580
- });
937
+ children: uiChildren.length > 0 ? uiChildren : void 0
938
+ });
939
+ }
940
+ if (children.length === 0) return [];
581
941
  return [
582
942
  {
583
- value: `${FOLDER_PREFIX}content:${bareId}`,
584
- label: "Content",
943
+ value: `${FOLDER_PREFIX}config:${bareId}`,
944
+ label: "Config",
585
945
  nodeType: "folder",
586
- knowledgeNodeIds: [],
587
- children: kindFolders.length > 0 ? kindFolders : void 0
946
+ icon: "settings",
947
+ knowledgeNodeIds: children.flatMap(collectKnowledgeNodeIds),
948
+ children
949
+ }
950
+ ];
951
+ }
952
+ function buildSystemKnowledgeSubgroup(graphNodeId, governing) {
953
+ if (governing.length === 0) return [];
954
+ const children = createKnowledgeLeaves(graphNodeId, governing);
955
+ return [
956
+ {
957
+ value: `${FOLDER_PREFIX}knowledge:${graphNodeId}`,
958
+ label: "Knowledge",
959
+ nodeType: "folder",
960
+ icon: "reference",
961
+ knowledgeNodeIds: children.flatMap(collectKnowledgeNodeIds),
962
+ children
963
+ }
964
+ ];
965
+ }
966
+ function buildSystemGovernanceSubgroup(bareId, organizationModel) {
967
+ if (!organizationModel) return [];
968
+ const system = getSystem(organizationModel, bareId);
969
+ if (!system) return [];
970
+ const roleIds = /* @__PURE__ */ new Set();
971
+ if (system.responsibleRoleId !== void 0) roleIds.add(system.responsibleRoleId);
972
+ for (const role of Object.values(organizationModel.roles ?? {})) {
973
+ if (role.responsibleFor?.includes(bareId)) roleIds.add(role.id);
974
+ }
975
+ const policyIds = new Set(system.policies ?? []);
976
+ for (const policy of Object.values(organizationModel.policies ?? {})) {
977
+ if (policy.appliesTo.systemIds.includes(bareId)) policyIds.add(policy.id);
978
+ }
979
+ const roles = Object.values(organizationModel.roles ?? {}).filter((role) => roleIds.has(role.id)).sort((left, right) => (left.order ?? 0) - (right.order ?? 0) || left.title.localeCompare(right.title));
980
+ const policies = Object.values(organizationModel.policies ?? {}).filter((policy) => policyIds.has(policy.id)).sort((left, right) => (left.order ?? 0) - (right.order ?? 0) || left.label.localeCompare(right.label));
981
+ const children = [];
982
+ if (roles.length > 0) {
983
+ children.push(
984
+ createCollectionNode(
985
+ `governance:${bareId}`,
986
+ "roles",
987
+ roles.length === 1 ? "Responsible Role" : "Responsible Roles",
988
+ roles.map(
989
+ (role) => createItemNode({
990
+ domainKey: "roles",
991
+ itemId: role.id,
992
+ label: role.title,
993
+ graphNodeId: `role:${role.id}`
994
+ })
995
+ )
996
+ )
997
+ );
998
+ }
999
+ if (policies.length > 0) {
1000
+ children.push(
1001
+ createCollectionNode(
1002
+ `governance:${bareId}`,
1003
+ "policies",
1004
+ "Policies",
1005
+ policies.map(
1006
+ (policy) => createItemNode({
1007
+ domainKey: "policies",
1008
+ itemId: policy.id,
1009
+ label: policy.label,
1010
+ graphNodeId: `policy:${policy.id}`
1011
+ })
1012
+ )
1013
+ )
1014
+ );
1015
+ }
1016
+ if (children.length === 0) return [];
1017
+ return [
1018
+ {
1019
+ value: `${FOLDER_PREFIX}governance:${bareId}`,
1020
+ label: "Governance",
1021
+ nodeType: "folder",
1022
+ icon: "shield",
1023
+ knowledgeNodeIds: children.flatMap(collectKnowledgeNodeIds),
1024
+ children
588
1025
  }
589
1026
  ];
590
1027
  }
@@ -592,14 +1029,19 @@ function buildSpineTreeNode(bareId, allBareIds, spineMetaMap, spine, facetStates
592
1029
  const graphNodeId = `${spine}:${bareId}`;
593
1030
  const governing = facetStates.knowledge === "exclude" ? [] : ctx.governsEdgesByTarget.get(graphNodeId) ?? [];
594
1031
  const childIds = childGraphIds(allBareIds, bareId);
595
- const contentChildren = spine === "system" ? buildContentSubgroup(bareId, organizationModel) : [];
596
- const domainConfigChildren = [];
1032
+ const systemModelChildren = spine === "system" ? [
1033
+ ...buildOntologySubgroup(bareId, organizationModel),
1034
+ ...buildSystemResourcesSubgroup(bareId, ctx),
1035
+ ...buildSystemConfigSubgroup(bareId, organizationModel),
1036
+ ...buildSystemKnowledgeSubgroup(graphNodeId, governing),
1037
+ ...buildSystemGovernanceSubgroup(bareId, organizationModel)
1038
+ ] : [];
597
1039
  const childSpineNodes = childIds.filter((childId) => visibleSpineIds.has(childId)).map(
598
1040
  (childId) => buildSpineTreeNode(childId, allBareIds, spineMetaMap, spine, facetStates, ctx, visibleSpineIds, organizationModel)
599
1041
  );
600
- const knowledgeLeaves = createKnowledgeLeaves(graphNodeId, governing);
1042
+ const knowledgeLeaves = spine === "system" ? [] : createKnowledgeLeaves(graphNodeId, governing);
601
1043
  const facetLeaves = createFacetGraphLeaves(getIncludedFacetNodes(graphNodeId, spine, facetStates, ctx));
602
- const children = [...domainConfigChildren, ...contentChildren, ...childSpineNodes, ...knowledgeLeaves, ...facetLeaves];
1044
+ const children = [...systemModelChildren, ...childSpineNodes, ...knowledgeLeaves, ...facetLeaves];
603
1045
  const meta = spineMetaMap[bareId];
604
1046
  return {
605
1047
  value: `${SPINE_PREFIX}${spine}:${bareId}`,
@@ -715,90 +1157,160 @@ function buildSystemsGroup(graph, organizationModel, facetStates, ctx, visibleSp
715
1157
  );
716
1158
  return createGroupNode({ groupKey: "systems", label: "Systems", children });
717
1159
  }
718
- function graphNodesByKind(graph, kind) {
719
- return graph.nodes.filter((node) => node.kind === kind).sort((left, right) => left.label.localeCompare(right.label) || left.id.localeCompare(right.id));
1160
+ function buildOntologyBranch(organizationModel, domainKey) {
1161
+ if (!organizationModel) return void 0;
1162
+ const projection = getKnowledgeOntologyProjection(organizationModel);
1163
+ const items = getPrimaryOntologyItemsForDomain(projection, domainKey);
1164
+ if (items.length === 0) return void 0;
1165
+ return createDomainNode({
1166
+ domainKey,
1167
+ label: getOntologyDomainLabel(domainKey),
1168
+ children: items.map(
1169
+ (item) => createItemNode({
1170
+ domainKey,
1171
+ itemId: item.id,
1172
+ label: item.label,
1173
+ children: [
1174
+ {
1175
+ value: `${FOLDER_PREFIX}${domainKey}:${item.id}:owner`,
1176
+ label: item.ownerSystemId ?? "global",
1177
+ nodeType: "folder",
1178
+ icon: item.kind === "resource" ? "workflow" : "info",
1179
+ knowledgeNodeIds: []
1180
+ }
1181
+ ]
1182
+ })
1183
+ )
1184
+ });
1185
+ }
1186
+ function buildGraphGroup(organizationModel) {
1187
+ const ontologyDomains = [...CORE_ONTOLOGY_DOMAIN_KEYS, ...OPTIONAL_ONTOLOGY_DOMAIN_KEYS].map((domainKey) => buildOntologyBranch(organizationModel, domainKey)).filter((node) => node !== void 0);
1188
+ return createGroupNode({
1189
+ groupKey: "graph",
1190
+ label: "Ontology",
1191
+ children: ontologyDomains
1192
+ });
720
1193
  }
721
- function buildGraphResourcesBranch(graph) {
722
- const resources = graphNodesByKind(graph, "resource");
1194
+ function buildResourcesGroup(graph) {
1195
+ const resourceNodes = graph.nodes.filter((node) => node.kind === "resource").sort(
1196
+ (left, right) => (left.resourceType ?? "").localeCompare(right.resourceType ?? "") || left.label.localeCompare(right.label) || left.id.localeCompare(right.id)
1197
+ );
723
1198
  const children = GRAPH_RESOURCE_TYPE_ORDER.map((resourceType) => {
724
- const resourceNodes = resources.filter((node) => node.resourceType === resourceType);
725
- if (resourceNodes.length === 0) return void 0;
1199
+ const typedResources = resourceNodes.filter((node) => node.resourceType === resourceType);
1200
+ if (typedResources.length === 0) return void 0;
726
1201
  return createCollectionNode(
727
- "graph:resources",
1202
+ "resources",
728
1203
  resourceType,
729
1204
  GRAPH_RESOURCE_TYPE_LABELS[resourceType],
730
- resourceNodes.map((node) => createGraphNodeItem(node, "resources"))
1205
+ typedResources.map((node) => createGraphNodeItem(node, "resources"))
731
1206
  );
732
1207
  }).filter((node) => node !== void 0);
733
- const untypedResources = resources.filter((node) => node.resourceType === void 0);
734
- if (untypedResources.length > 0) {
1208
+ const orderedTypes = new Set(GRAPH_RESOURCE_TYPE_ORDER);
1209
+ const otherResources = resourceNodes.filter(
1210
+ (node) => node.resourceType === void 0 || !orderedTypes.has(node.resourceType)
1211
+ );
1212
+ if (otherResources.length > 0) {
735
1213
  children.push(
736
1214
  createCollectionNode(
737
- "graph:resources",
738
- "unknown",
739
- "Unclassified",
740
- untypedResources.map((node) => createGraphNodeItem(node, "resources"))
1215
+ "resources",
1216
+ "other",
1217
+ "Other",
1218
+ otherResources.map((node) => createGraphNodeItem(node, "resources"))
741
1219
  )
742
1220
  );
743
1221
  }
744
- return createDomainNode({ domainKey: "resources", label: "Resources", children });
1222
+ return createGroupNode({
1223
+ groupKey: "resources",
1224
+ label: "Resources",
1225
+ children
1226
+ });
745
1227
  }
746
- function buildGraphKnowledgeBranch(graph, knowledgeNodes) {
747
- const graphNodesBySourceId = new Map(
748
- graph.nodes.filter((node) => node.kind === "knowledge").map((node) => [node.sourceId ?? node.id, node])
1228
+ function formatOntologyKnowledgeTargetLabel(targetId, organizationModel) {
1229
+ if (organizationModel) {
1230
+ const projection = getKnowledgeOntologyProjection(organizationModel);
1231
+ for (const domainKey of [...CORE_ONTOLOGY_DOMAIN_KEYS, ...OPTIONAL_ONTOLOGY_DOMAIN_KEYS]) {
1232
+ const item = getPrimaryOntologyItemsForDomain(projection, domainKey).find((candidate) => candidate.id === targetId);
1233
+ if (item) return item.label;
1234
+ }
1235
+ }
1236
+ return formatTreeLabel(targetId.includes("/") ? targetId.slice(targetId.lastIndexOf("/") + 1) : targetId);
1237
+ }
1238
+ function createKnowledgeCollection(parentKey, collectionKey, label, nodes) {
1239
+ return createCollectionNode(parentKey, collectionKey, label, createKnowledgeLeaves(`knowledge:${collectionKey}`, nodes));
1240
+ }
1241
+ function buildKnowledgeTargetCollections(knowledgeNodes, targetKind, parentKey, collectionLabel, formatTargetLabel) {
1242
+ const grouped = /* @__PURE__ */ new Map();
1243
+ for (const node of knowledgeNodes) {
1244
+ for (const link of node.links) {
1245
+ if (link.target.kind !== targetKind) continue;
1246
+ const bucket = grouped.get(link.target.id) ?? [];
1247
+ bucket.push(node);
1248
+ grouped.set(link.target.id, bucket);
1249
+ }
1250
+ }
1251
+ const children = [...grouped.entries()].sort(([left], [right]) => formatTargetLabel(left).localeCompare(formatTargetLabel(right))).map(
1252
+ ([targetId, nodes]) => createCollectionNode(
1253
+ `${parentKey}:${collectionKeyForTarget(targetKind)}`,
1254
+ treeValueSegment(targetId),
1255
+ formatTargetLabel(targetId),
1256
+ uniqueKnowledgeNodes(nodes).map((node) => createKnowledgeLeaf(`knowledge:${targetKind}:${targetId}`, node))
1257
+ )
749
1258
  );
750
- const knowledgeById = new Map(knowledgeNodes.map((node) => [node.id, node]));
751
- const startHere = KNOWLEDGE_START_HERE_IDS.map((id) => knowledgeById.get(id)).filter(
752
- (node) => node !== void 0
1259
+ if (children.length === 0) return void 0;
1260
+ return createCollectionNode(parentKey, collectionKeyForTarget(targetKind), collectionLabel, children);
1261
+ }
1262
+ function collectionKeyForTarget(targetKind) {
1263
+ return targetKind === "system" ? "by-system" : "by-ontology";
1264
+ }
1265
+ function buildKnowledgeGroup(graph, knowledgeNodes, organizationModel) {
1266
+ const systemLabels = new Map(
1267
+ graph.nodes.filter((node) => node.kind === "system").map((node) => [node.sourceId ?? node.id.replace(/^system:/, ""), node.label])
753
1268
  );
754
- const startHereIds = new Set(startHere.map((node) => node.id));
755
- const allKnowledge = [...knowledgeNodes].filter((node) => !startHereIds.has(node.id)).sort((left, right) => left.title.localeCompare(right.title));
756
- const toKnowledgeItem = (node) => createItemNode({
757
- domainKey: "knowledge",
758
- itemId: node.id,
759
- label: node.title,
760
- graphNodeId: graphNodesBySourceId.get(node.id)?.id
761
- });
762
- return createDomainNode({
763
- domainKey: "knowledge",
1269
+ const sortedKnowledgeNodes = uniqueKnowledgeNodes(knowledgeNodes);
1270
+ const startHereNodes = sortedKnowledgeNodes.filter((node) => KNOWLEDGE_START_HERE_IDS.includes(node.id));
1271
+ const startHereIds = new Set(startHereNodes.map((node) => node.id));
1272
+ const allNodes = sortedKnowledgeNodes.filter((node) => !startHereIds.has(node.id));
1273
+ const children = [];
1274
+ if (startHereNodes.length > 0) {
1275
+ children.push(createKnowledgeCollection("knowledge", "start-here", "Start Here", startHereNodes));
1276
+ }
1277
+ if (allNodes.length > 0) {
1278
+ children.push(createKnowledgeCollection("knowledge", "all", "All", allNodes));
1279
+ }
1280
+ const bySystem = buildKnowledgeTargetCollections(
1281
+ sortedKnowledgeNodes,
1282
+ "system",
1283
+ "knowledge",
1284
+ "By System",
1285
+ (targetId) => systemLabels.get(targetId) ?? formatTreeLabel(targetId)
1286
+ );
1287
+ if (bySystem) children.push(bySystem);
1288
+ const byOntology = buildKnowledgeTargetCollections(
1289
+ sortedKnowledgeNodes,
1290
+ "ontology",
1291
+ "knowledge",
1292
+ "By Ontology",
1293
+ (targetId) => formatOntologyKnowledgeTargetLabel(targetId, organizationModel)
1294
+ );
1295
+ if (byOntology) children.push(byOntology);
1296
+ return createGroupNode({
1297
+ groupKey: "knowledge",
764
1298
  label: "Knowledge",
765
- children: [
766
- createCollectionNode("graph:knowledge", "start-here", "Start Here", startHere.map(toKnowledgeItem)),
767
- createCollectionNode("graph:knowledge", "all", "All", allKnowledge.map(toKnowledgeItem))
768
- ]
769
- });
770
- }
771
- function buildGraphStagesBranch(graph) {
772
- return createDomainNode({
773
- domainKey: "stages",
774
- label: "Stages",
775
- children: graphNodesByKind(graph, "stage").map((node) => createGraphNodeItem(node, "stages"))
1299
+ children
776
1300
  });
777
1301
  }
778
- function buildGraphGroup(graph, knowledgeNodes) {
1302
+ function buildNavigationGroup(organizationModel) {
1303
+ const navigationSurfaces = (organizationModel ? projectNavigationSurfaces(organizationModel) : []).sort((left, right) => left.label.localeCompare(right.label)).map(
1304
+ (surface) => createItemNode({
1305
+ domainKey: "navigation",
1306
+ itemId: surface.id,
1307
+ label: surface.label
1308
+ })
1309
+ );
779
1310
  return createGroupNode({
780
- groupKey: "graph",
781
- label: "Graph",
782
- children: [
783
- buildGraphResourcesBranch(graph),
784
- createDomainNode({
785
- domainKey: "actions",
786
- label: "Actions",
787
- children: graphNodesByKind(graph, "action").map((node) => createGraphNodeItem(node, "actions"))
788
- }),
789
- createDomainNode({
790
- domainKey: "entities",
791
- label: "Entities",
792
- children: graphNodesByKind(graph, "entity").map((node) => createGraphNodeItem(node, "entities"))
793
- }),
794
- createDomainNode({
795
- domainKey: "events",
796
- label: "Events",
797
- children: graphNodesByKind(graph, "event").map((node) => createGraphNodeItem(node, "events"))
798
- }),
799
- buildGraphStagesBranch(graph),
800
- buildGraphKnowledgeBranch(graph, knowledgeNodes)
801
- ]
1311
+ groupKey: "navigation",
1312
+ label: "Navigation",
1313
+ children: [createDomainNode({ domainKey: "navigation", label: "Surfaces", children: navigationSurfaces })]
802
1314
  });
803
1315
  }
804
1316
  function buildGovernanceGroup(graph, organizationModel, knowledgeByTarget, facetStates) {
@@ -812,23 +1324,13 @@ function buildGovernanceGroup(graph, organizationModel, knowledgeByTarget, facet
812
1324
  knowledgeNodes: getTargetKnowledge(knowledgeByTarget, `policy:${policy.id}`, facetStates)
813
1325
  })
814
1326
  );
815
- const statusGroups = [];
816
- const navigationSurfaces = (organizationModel ? projectNavigationSurfaces(organizationModel) : []).sort((left, right) => left.label.localeCompare(right.label)).map(
817
- (surface) => createItemNode({
818
- domainKey: "navigation",
819
- itemId: surface.id,
820
- label: surface.label
821
- })
822
- );
823
1327
  const rolesDomain = buildRolesDomain(graph, organizationModel, knowledgeByTarget, facetStates);
824
1328
  return createGroupNode({
825
1329
  groupKey: "governance-wiring",
826
- label: "Governance & Wiring",
1330
+ label: "Governance",
827
1331
  children: [
828
1332
  rolesDomain,
829
- createDomainNode({ domainKey: "policies", label: "Policies", children: policies }),
830
- createDomainNode({ domainKey: "statuses", label: "Statuses", children: statusGroups }),
831
- createDomainNode({ domainKey: "navigation", label: "Navigation", children: navigationSurfaces })
1333
+ createDomainNode({ domainKey: "policies", label: "Policies", children: policies })
832
1334
  ]
833
1335
  });
834
1336
  }
@@ -857,7 +1359,13 @@ function buildOrgTreeNode(graph, knowledgeNodes, facetStates, organizationModel,
857
1359
  case "systems":
858
1360
  return buildSystemsGroup(graph, organizationModel, facetStates, ctx, visibleSpineIds);
859
1361
  case "graph":
860
- return buildGraphGroup(graph, knowledgeNodes);
1362
+ return buildGraphGroup(organizationModel);
1363
+ case "resources":
1364
+ return buildResourcesGroup(graph);
1365
+ case "knowledge":
1366
+ return buildKnowledgeGroup(graph, knowledgeNodes, organizationModel);
1367
+ case "navigation":
1368
+ return buildNavigationGroup(organizationModel);
861
1369
  case "governance-wiring":
862
1370
  return buildGovernanceGroup(graph, organizationModel, knowledgeByTarget, facetStates);
863
1371
  default:
@@ -979,7 +1487,7 @@ function KnowledgeTree({
979
1487
  iconToken: GROUP_ICON_TOKENS[groupKey] ?? typedNode.icon,
980
1488
  command: isQuickAccess ? "" : getKnowledgeDirectoryCommand(
981
1489
  typedNode.knowledgeNodeIds,
982
- getKnowledgeReadTreeFolderCommand(`${GROUP_PREFIX}${groupKey}`)
1490
+ getKnowledgeTreeFolderCommand(`${GROUP_PREFIX}${groupKey}`)
983
1491
  ),
984
1492
  isActive: isActive2,
985
1493
  fallbackKind: "organization",
@@ -1033,7 +1541,7 @@ function KnowledgeTree({
1033
1541
  iconToken: void 0,
1034
1542
  command: getKnowledgeDirectoryCommand(
1035
1543
  typedNode.knowledgeNodeIds,
1036
- getKnowledgeReadTreeFolderCommand(`${DOMAIN_PREFIX}${domainKey}`)
1544
+ getKnowledgeTreeFolderCommand(`${DOMAIN_PREFIX}${domainKey}`)
1037
1545
  ),
1038
1546
  isActive: isActive2,
1039
1547
  fallbackKind: "organization",
@@ -1051,7 +1559,7 @@ function KnowledgeTree({
1051
1559
  const graphNode2 = typedNode.graphNodeId ? graphNodeMap.get(typedNode.graphNodeId) : void 0;
1052
1560
  const itemRouteId = `${ITEM_PREFIX}${typedNode.domainKey}:${typedNode.itemId}`;
1053
1561
  const routeToDomainPanel = shouldRouteItemToDomainPanel(typedNode.domainKey);
1054
- const fallbackCommand = graphNode2?.kind === "knowledge" && graphNode2.sourceId ? getKnowledgeReadCommand(graphNode2.sourceId) : graphNode2 ? getKnowledgeReadTreeFolderCommand(`graph:${graphNode2.id}`) : getKnowledgeReadTreeFolderCommand(itemRouteId);
1562
+ const fallbackCommand = graphNode2?.kind === "knowledge" && graphNode2.sourceId ? getKnowledgeNodeReadCommand(graphNode2.sourceId) : graphNode2 ? getKnowledgeGraphFolderCommand(graphNode2.id) : getKnowledgeTreeFolderCommand(itemRouteId);
1055
1563
  const isActive2 = selectedNodeId !== void 0 && (selectedNodeId === itemRouteId || selectedNodeId === typedNode.itemId || selectedNodeId === typedNode.graphNodeId || graphNode2 !== void 0 && (selectedNodeId === graphNode2.id || selectedNodeId === graphNode2.sourceId));
1056
1564
  return /* @__PURE__ */ jsx(
1057
1565
  DirectoryRow,
@@ -1099,7 +1607,7 @@ function KnowledgeTree({
1099
1607
  iconToken: typedNode.icon,
1100
1608
  command: getKnowledgeDirectoryCommand(
1101
1609
  typedNode.knowledgeNodeIds,
1102
- getKnowledgeReadTreeFolderCommand(String(value))
1610
+ getKnowledgeTreeFolderCommand(String(value))
1103
1611
  ),
1104
1612
  isActive: false
1105
1613
  }
@@ -1117,7 +1625,7 @@ function KnowledgeTree({
1117
1625
  hasChildren,
1118
1626
  label: String(node.label),
1119
1627
  iconToken: typedNode.icon,
1120
- command: getKnowledgeReadTreeFolderCommand(`graph:${graphNode2.id}`),
1628
+ command: getKnowledgeGraphFolderCommand(graphNode2.id),
1121
1629
  isActive: isActive2,
1122
1630
  fallbackKind: graphNode2.kind,
1123
1631
  onSelectGraphNode: () => onSelectGraphNode?.(graphNode2),
@@ -1141,7 +1649,7 @@ function KnowledgeTree({
1141
1649
  hasChildren,
1142
1650
  label: String(node.label),
1143
1651
  iconToken: typedNode.icon,
1144
- command: graphSpine ? getKnowledgeReadSpineFolderCommand(graphSpine, graphNode?.sourceId ?? graphNodeId) : "",
1652
+ command: graphSpine ? getKnowledgeSpineFolderCommand(graphSpine, graphNode?.sourceId ?? graphNodeId) : "",
1145
1653
  isActive,
1146
1654
  fallbackKind: graphNode?.kind ?? "system",
1147
1655
  uppercase: true,
@@ -1270,8 +1778,7 @@ function FavoriteRow({ elementProps, label, routeId, kind, iconToken, onActivate
1270
1778
  /* @__PURE__ */ jsx(
1271
1779
  SemanticIcon,
1272
1780
  {
1273
- token: iconToken,
1274
- fallbackKind: kind === "knowledge" ? "knowledge" : "unknown",
1781
+ token: iconToken ?? (kind === "knowledge" ? "reference" : "info"),
1275
1782
  size: 15,
1276
1783
  style: { color: SIDEBAR_TREE_ACCENT_COLOR }
1277
1784
  }
@@ -1364,8 +1871,7 @@ function KnowledgeLeafRow({ elementProps, knowledgeNode, isActive, onSelectNode
1364
1871
  /* @__PURE__ */ jsx(
1365
1872
  SemanticIcon,
1366
1873
  {
1367
- token: getKnowledgeIconToken(knowledgeNode),
1368
- fallbackKind: knowledgeNode.kind,
1874
+ token: getKnowledgeIconToken(knowledgeNode) ?? "reference",
1369
1875
  size: 15,
1370
1876
  style: { color: SIDEBAR_TREE_ACCENT_COLOR }
1371
1877
  }
@@ -1383,7 +1889,7 @@ function KnowledgeLeafRow({ elementProps, knowledgeNode, isActive, onSelectNode
1383
1889
  /* @__PURE__ */ jsx(
1384
1890
  TrailingCopySlot,
1385
1891
  {
1386
- command: getKnowledgeReadCommand(knowledgeNode.id),
1892
+ command: getKnowledgeNodeReadCommand(knowledgeNode.id),
1387
1893
  label: "Copy knowledge command",
1388
1894
  showCopy: hovered,
1389
1895
  favorite: {
@@ -1466,8 +1972,7 @@ function DirectoryRow({
1466
1972
  /* @__PURE__ */ jsx(
1467
1973
  SemanticIcon,
1468
1974
  {
1469
- token: iconToken,
1470
- fallbackKind: fallbackKind !== void 0 ? toSemanticFallbackKind(fallbackKind) : "unknown",
1975
+ token: iconToken ?? (fallbackKind !== void 0 ? graphKindToFallbackToken(fallbackKind) : "info"),
1471
1976
  size: 14,
1472
1977
  style: { color: SIDEBAR_TREE_ACCENT_COLOR }
1473
1978
  }
@@ -1541,7 +2046,7 @@ function TrailingCopySlot({ command, label, showCopy, favorite, hovered }) {
1541
2046
  var indexPromise = null;
1542
2047
  function loadSearchIndex() {
1543
2048
  if (!indexPromise) {
1544
- indexPromise = import('./knowledge-search-index-5KYPO746.js').then(
2049
+ indexPromise = import('./knowledge-search-index-P7PR626V.js').then(
1545
2050
  (mod) => buildSearchIndex(mod.default ?? mod)
1546
2051
  );
1547
2052
  }
@@ -1623,4 +2128,4 @@ function KnowledgeSearchBar({
1623
2128
  );
1624
2129
  }
1625
2130
 
1626
- export { KNOWLEDGE_DOMAINS_WITH_PANELS, KNOWLEDGE_ICON_TOKEN_BY_KIND, KnowledgeSearchBar, KnowledgeTree, OM_TREE_GROUPS, getKnowledgeIconToken, getSharedOrganizationGraph, projectNavigationGroups, projectNavigationSurfaces };
2131
+ export { KNOWLEDGE_DOMAINS_WITH_PANELS, KNOWLEDGE_ICON_TOKEN_BY_KIND, KnowledgeSearchBar, KnowledgeTree, OM_TREE_GROUPS, getKnowledgeDomainFolderCommand, getKnowledgeGraphNodeCommand, getKnowledgeIconToken, getKnowledgeNodeReadCommand, getKnowledgeOntologyProjection, getKnowledgeTreeFolderCommand, getOntologyDomainLabel, getPrimaryOntologyItemsForDomain, getSharedOrganizationGraph, projectNavigationGroups, projectNavigationSurfaces };