@elevasis/ui 2.40.1 → 2.41.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 (92) hide show
  1. package/dist/api/index.js +4 -6
  2. package/dist/app/index.css +384 -0
  3. package/dist/app/index.d.ts +108 -0
  4. package/dist/app/index.js +17 -27
  5. package/dist/auth/index.css +659 -0
  6. package/dist/auth/index.js +19 -6
  7. package/dist/charts/index.css +533 -0
  8. package/dist/charts/index.js +18 -15
  9. package/dist/{chunk-RXH4D6TY.js → chunk-5M4HSHQ5.js} +631 -2
  10. package/dist/{chunk-TE4P6OSJ.js → chunk-7FJI76OH.js} +1 -1
  11. package/dist/chunk-GMXGDO3I.js +244 -0
  12. package/dist/{chunk-CXY7FMUM.js → chunk-GUKY77FJ.js} +50 -4
  13. package/dist/{chunk-5JYKCULK.js → chunk-NZ2F5RQ4.js} +44 -2
  14. package/dist/{chunk-WF7CONXF.js → chunk-OJJK27GC.js} +658 -6
  15. package/dist/{chunk-RX6RSKWC.js → chunk-QDXTIQT4.js} +29255 -18312
  16. package/dist/{chunk-73EWE2EW.js → chunk-V5HWC5EW.js} +1 -1
  17. package/dist/components/chat/index.js +1 -2
  18. package/dist/components/index.css +149 -149
  19. package/dist/components/index.js +13 -37
  20. package/dist/components/navigation/index.css +659 -0
  21. package/dist/components/navigation/index.js +25 -4
  22. package/dist/features/auth/index.js +14 -38
  23. package/dist/features/clients/index.css +149 -149
  24. package/dist/features/clients/index.js +13 -37
  25. package/dist/features/crm/index.js +13 -37
  26. package/dist/features/dashboard/index.js +13 -37
  27. package/dist/features/delivery/index.js +13 -37
  28. package/dist/features/knowledge/index.css +659 -0
  29. package/dist/features/knowledge/index.js +25 -248
  30. package/dist/features/lead-gen/index.d.ts +81 -0
  31. package/dist/features/lead-gen/index.js +13 -37
  32. package/dist/features/monitoring/index.js +13 -37
  33. package/dist/features/monitoring/requests/index.d.ts +69 -7
  34. package/dist/features/monitoring/requests/index.js +32 -41
  35. package/dist/features/operations/index.d.ts +79 -0
  36. package/dist/features/operations/index.js +13 -37
  37. package/dist/features/seo/index.js +1 -4
  38. package/dist/features/settings/index.js +13 -37
  39. package/dist/hooks/access/index.css +659 -0
  40. package/dist/hooks/access/index.js +19 -5
  41. package/dist/hooks/delivery/index.js +13 -37
  42. package/dist/hooks/index.d.ts +18 -6
  43. package/dist/hooks/index.js +13 -37
  44. package/dist/hooks/published.d.ts +18 -6
  45. package/dist/hooks/published.js +13 -37
  46. package/dist/index.d.ts +151 -7
  47. package/dist/index.js +14 -38
  48. package/dist/initialization/index.js +1 -1
  49. package/dist/knowledge/index.css +659 -0
  50. package/dist/knowledge/index.d.ts +81 -0
  51. package/dist/knowledge/index.js +25 -15
  52. package/dist/layout/index.css +659 -0
  53. package/dist/layout/index.d.ts +18 -2
  54. package/dist/layout/index.js +24 -7
  55. package/dist/organization/index.js +13 -37
  56. package/dist/provider/index.css +384 -0
  57. package/dist/provider/index.d.ts +120 -1
  58. package/dist/provider/index.js +18 -22
  59. package/dist/provider/published.css +533 -0
  60. package/dist/provider/published.d.ts +121 -2
  61. package/dist/provider/published.js +18 -17
  62. package/dist/test-utils/index.js +4 -6
  63. package/dist/theme/index.js +2 -5
  64. package/dist/theme/presets/index.js +1 -2
  65. package/dist/utils/index.js +1 -3
  66. package/package.json +3 -3
  67. package/dist/chunk-3KMDHCAR.js +0 -52
  68. package/dist/chunk-4DRI3G36.js +0 -1016
  69. package/dist/chunk-5EYJ2GIN.js +0 -122
  70. package/dist/chunk-66U7JOWV.js +0 -425
  71. package/dist/chunk-6D4LCJ52.js +0 -10
  72. package/dist/chunk-6EV47QQW.js +0 -340
  73. package/dist/chunk-6ROXVZ3L.js +0 -9
  74. package/dist/chunk-7MTWRSUZ.js +0 -357
  75. package/dist/chunk-7PHY5ONQ.js +0 -85
  76. package/dist/chunk-B2DZLPDL.js +0 -39
  77. package/dist/chunk-CLDCYJQT.js +0 -1
  78. package/dist/chunk-CTJBPF3Z.js +0 -734
  79. package/dist/chunk-DT3QYZVU.js +0 -23
  80. package/dist/chunk-IIMU5YAJ.js +0 -53
  81. package/dist/chunk-IUQAP4IO.js +0 -2131
  82. package/dist/chunk-J3FLIZY4.js +0 -423
  83. package/dist/chunk-K7GKKETO.js +0 -3157
  84. package/dist/chunk-L7GXUSCV.js +0 -215
  85. package/dist/chunk-LJDYY3XB.js +0 -133
  86. package/dist/chunk-NYBEU5TE.js +0 -118
  87. package/dist/chunk-RH5VWWSC.js +0 -624
  88. package/dist/chunk-SJNIOGVX.js +0 -112
  89. package/dist/chunk-TYRUKGGD.js +0 -46
  90. package/dist/chunk-WLOQ4IBG.js +0 -654
  91. package/dist/chunk-X4WBGKJQ.js +0 -138
  92. package/dist/chunk-X7D6SUKR.js +0 -1234
@@ -1,2131 +0,0 @@
1
- import { buildOrganizationGraph, projectOrganizationSurfaces, SemanticIcon, getSortedSidebarEntries } from './chunk-K7GKKETO.js';
2
- import { compileOrganizationOntology, parseOntologyId, getSystem, resolveSystemConfig } from './chunk-RH5VWWSC.js';
3
- import { useMemo, useState, useRef, useEffect } from 'react';
4
- import { useTree, Text, Tree, UnstyledButton, Group, TextInput } from '@mantine/core';
5
- import { useClipboard } from '@mantine/hooks';
6
- import { IconChevronDown, IconChevronRight, IconX, IconSearch, IconCheck, IconCopy, IconStarFilled, IconStar } from '@tabler/icons-react';
7
- import { create } from 'zustand';
8
- import { persist, createJSONStorage } from 'zustand/middleware';
9
- import { jsx, jsxs } from 'react/jsx-runtime';
10
-
11
- // src/organization-model/getSharedOrganizationGraph.ts
12
- var cache = /* @__PURE__ */ new WeakMap();
13
- function getSharedOrganizationGraph(organizationModel) {
14
- const cached = cache.get(organizationModel);
15
- if (cached) return cached;
16
- const graph = buildOrganizationGraph({ organizationModel });
17
- cache.set(organizationModel, graph);
18
- return graph;
19
- }
20
-
21
- // src/knowledge/iconTokens.ts
22
- var KNOWLEDGE_ICON_TOKEN_BY_KIND = {
23
- playbook: "playbook",
24
- strategy: "strategy",
25
- reference: "reference"
26
- };
27
- function getKnowledgeIconToken(node) {
28
- return node.icon ?? KNOWLEDGE_ICON_TOKEN_BY_KIND[node.kind];
29
- }
30
- var useKnowledgeFavoritesStore = create()(
31
- persist(
32
- (set) => ({
33
- favorites: {},
34
- toggleFavorite: (entry) => set((state) => {
35
- const next = { ...state.favorites };
36
- if (next[entry.routeId]) {
37
- delete next[entry.routeId];
38
- } else {
39
- next[entry.routeId] = { ...entry, addedAt: Date.now() };
40
- }
41
- return { favorites: next };
42
- }),
43
- removeFavorite: (routeId) => set((state) => {
44
- if (!state.favorites[routeId]) return state;
45
- const next = { ...state.favorites };
46
- delete next[routeId];
47
- return { favorites: next };
48
- }),
49
- clearFavorites: () => set({ favorites: {} })
50
- }),
51
- {
52
- name: "elevasis-knowledge-favorites",
53
- storage: createJSONStorage(() => localStorage),
54
- version: 1
55
- }
56
- )
57
- );
58
-
59
- // src/knowledge/navigationProjection.ts
60
- function collectSurfaceIds(nodes) {
61
- return getSortedSidebarEntries(nodes).flatMap(
62
- ([id, node]) => node.type === "group" ? collectSurfaceIds(node.children) : [id]
63
- );
64
- }
65
- function collectGroups(nodes, placement, groups = []) {
66
- getSortedSidebarEntries(nodes).forEach(([id, node]) => {
67
- if (node.type !== "group") return;
68
- groups.push({
69
- id,
70
- label: node.label,
71
- placement,
72
- surfaceIds: collectSurfaceIds(node.children)
73
- });
74
- collectGroups(node.children, placement, groups);
75
- });
76
- return groups;
77
- }
78
- function projectNavigationSurfaces(model) {
79
- return projectOrganizationSurfaces(model);
80
- }
81
- function projectNavigationGroups(model) {
82
- return [
83
- ...collectGroups(model.navigation.sidebar.primary, "primary"),
84
- ...collectGroups(model.navigation.sidebar.bottom, "bottom")
85
- ];
86
- }
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 `/om 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 `/om read-folder ${kind}:${id}`;
265
- }
266
- function getKnowledgeTreeFolderCommand(treeValue) {
267
- return `/om 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) {
294
- switch (kind) {
295
- case "knowledge":
296
- return "reference";
297
- case "resource":
298
- return "workflow";
299
- case "action":
300
- return "view";
301
- case "entity":
302
- case "event":
303
- return "database";
304
- case "policy":
305
- return "shield";
306
- case "system":
307
- return "operations";
308
- case "role":
309
- return "user";
310
- case "stage":
311
- return "pending";
312
- case "organization":
313
- return "building";
314
- default:
315
- return "info";
316
- }
317
- }
318
- var QUICK_ACCESS_GROUP_KEY = "quick-access";
319
- var FAVORITE_PREFIX = "favorite:";
320
- var QUICK_ACCESS_GROUP_VALUE = `group:${QUICK_ACCESS_GROUP_KEY}`;
321
- var GROUP_ICON_TOKENS = {
322
- [QUICK_ACCESS_GROUP_KEY]: "om.quick-access",
323
- profile: "om.profile",
324
- "business-model": "om.business-model",
325
- systems: "om.systems",
326
- graph: "om.graph",
327
- resources: "resources",
328
- knowledge: "knowledge",
329
- navigation: "view",
330
- "governance-wiring": "om.governance-wiring"
331
- };
332
- function findFavoritePathInTree(nodes, favorite) {
333
- const matchesPrimary = (node) => {
334
- if (favorite.kind === "knowledge") {
335
- return node.nodeType === "leaf" && node.knowledgeNodeId === favorite.routeId;
336
- }
337
- if (favorite.kind === "graph") {
338
- return node.graphNodeId === favorite.routeId;
339
- }
340
- return typeof node.value === "string" && node.value === favorite.routeId;
341
- };
342
- const matchesFallback = (node) => {
343
- if (favorite.kind !== "knowledge") return false;
344
- return node.nodeType === "item" && node.domainKey === "knowledge" && node.itemId === favorite.routeId;
345
- };
346
- function dfs(node, ancestors, match) {
347
- if (node.value === QUICK_ACCESS_GROUP_VALUE) return void 0;
348
- const value = typeof node.value === "string" ? node.value : "";
349
- const path = [...ancestors, value];
350
- if (match(node)) return path;
351
- for (const child of node.children ?? []) {
352
- const found = dfs(child, path, match);
353
- if (found) return found;
354
- }
355
- return void 0;
356
- }
357
- for (const root of nodes) {
358
- const found = dfs(root, [], matchesPrimary);
359
- if (found) return found;
360
- }
361
- for (const root of nodes) {
362
- const found = dfs(root, [], matchesFallback);
363
- if (found) return found;
364
- }
365
- return void 0;
366
- }
367
- var OM_TREE_GROUPS = [
368
- { key: "profile", label: "Profile", domains: ["identity", "branding"] },
369
- { key: "business-model", label: "Business Model", domains: ["customers", "offerings", "goals"] },
370
- { key: "systems", label: "Systems", domains: ["systems", "sales", "prospecting", "projects"] },
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"] }
391
- ];
392
- var DOMAIN_PREFIX = "domain:";
393
- var GROUP_PREFIX = "group:";
394
- var ITEM_PREFIX = "item:";
395
- function domainKeyForKnowledgeTarget(targetKind) {
396
- switch (targetKind) {
397
- case "customer-segment":
398
- return "customers";
399
- case "offering":
400
- return "offerings";
401
- case "goal":
402
- return "goals";
403
- case "role":
404
- return "roles";
405
- default:
406
- return void 0;
407
- }
408
- }
409
- function graphNodeIdForKnowledgeTarget(targetKind, targetId) {
410
- switch (targetKind) {
411
- case "resource":
412
- case "action":
413
- case "entity":
414
- case "event":
415
- case "policy":
416
- case "role":
417
- case "knowledge":
418
- case "ontology":
419
- case "system":
420
- case "stage":
421
- return `${targetKind}:${targetId}`;
422
- default:
423
- return void 0;
424
- }
425
- }
426
- var GRAPH_RESOURCE_TYPE_ORDER = [
427
- "workflow",
428
- "agent",
429
- "integration",
430
- "script",
431
- "external",
432
- "trigger",
433
- "human_checkpoint"
434
- ];
435
- var GRAPH_RESOURCE_TYPE_LABELS = {
436
- workflow: "Workflows",
437
- agent: "Agents",
438
- integration: "Integrations",
439
- script: "Scripts",
440
- external: "External",
441
- trigger: "Triggers",
442
- human_checkpoint: "Human Checkpoints"
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
- ];
458
- var KNOWLEDGE_START_HERE_IDS = [
459
- "knowledge.org-model-reference",
460
- "knowledge.org-model-graph-contract",
461
- "knowledge.org-model-actions",
462
- "knowledge.org-model-entities",
463
- "knowledge.org-model-events",
464
- "knowledge.org-model-policies",
465
- "knowledge.platform-command-view"
466
- ];
467
- var SPINE_PREFIX = "spine:";
468
- var LEAF_PREFIX = "leaf:";
469
- var FOLDER_PREFIX = "folder:";
470
- var GROUP_THRESHOLD = 8;
471
- var SIDEBAR_TREE_ACCENT_COLOR = "var(--color-primary)";
472
- var DEFAULT_KNOWLEDGE_FACET_STATES = { knowledge: "include" };
473
- var FOLDER_ORDER = [
474
- "campaigns",
475
- "pipeline",
476
- "targeting",
477
- "channels",
478
- "proof",
479
- "references",
480
- "playbooks",
481
- "strategies"
482
- ];
483
- var FOLDER_LABELS = {
484
- campaigns: "Campaigns",
485
- pipeline: "Pipeline",
486
- targeting: "Targeting and Strategy",
487
- channels: "Channels",
488
- proof: "Proof",
489
- references: "References",
490
- playbooks: "Playbooks",
491
- strategies: "Strategies"
492
- };
493
- var KNOWLEDGE_DOMAINS_WITH_PANELS = /* @__PURE__ */ new Set([
494
- "identity",
495
- "branding",
496
- "customers",
497
- "offerings",
498
- "goals",
499
- "roles",
500
- "sales",
501
- "prospecting",
502
- "projects",
503
- "navigation",
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"
515
- ]);
516
- var FILTERABLE_DOMAIN_KEYS = /* @__PURE__ */ new Set(["customers", "offerings", "goals", "roles", "policies"]);
517
- function shouldRouteItemToDomainPanel(domainKey) {
518
- return FILTERABLE_DOMAIN_KEYS.has(domainKey);
519
- }
520
- function toBareGraphId(graphNodeId, kind) {
521
- const prefix = `${kind}:`;
522
- return graphNodeId.startsWith(prefix) ? graphNodeId.slice(prefix.length) : graphNodeId;
523
- }
524
- function topLevelGraphIds(allBareIds) {
525
- return allBareIds.filter((id) => !id.includes("."));
526
- }
527
- function childGraphIds(allBareIds, parentId) {
528
- const prefix = `${parentId}.`;
529
- return allBareIds.filter((id) => id.startsWith(prefix) && !id.slice(prefix.length).includes("."));
530
- }
531
- function buildTreeContext(graph, knowledgeNodes) {
532
- const knowledgeByGraphId = /* @__PURE__ */ new Map();
533
- const nodesById = /* @__PURE__ */ new Map();
534
- for (const node of graph.nodes) {
535
- nodesById.set(node.id, node);
536
- if (node.kind === "knowledge") {
537
- knowledgeByGraphId.set(node.id, node.sourceId ?? node.id.replace(/^knowledge:/, ""));
538
- }
539
- }
540
- const knowledgeById = new Map(knowledgeNodes.map((node) => [node.id, node]));
541
- const governsRaw = /* @__PURE__ */ new Map();
542
- const edgesBySource = /* @__PURE__ */ new Map();
543
- const edgesByTarget = /* @__PURE__ */ new Map();
544
- for (const edge of graph.edges) {
545
- const src = edgesBySource.get(edge.sourceId) ?? [];
546
- src.push(edge);
547
- edgesBySource.set(edge.sourceId, src);
548
- const tgt = edgesByTarget.get(edge.targetId) ?? [];
549
- tgt.push(edge);
550
- edgesByTarget.set(edge.targetId, tgt);
551
- if (edge.kind === "governs") {
552
- const knowledgeId = knowledgeByGraphId.get(edge.sourceId);
553
- const knowledgeNode = knowledgeId ? knowledgeById.get(knowledgeId) : void 0;
554
- if (knowledgeNode) {
555
- const bucket = governsRaw.get(edge.targetId) ?? [];
556
- bucket.push(knowledgeNode);
557
- governsRaw.set(edge.targetId, bucket);
558
- }
559
- }
560
- }
561
- const governsEdgesByTarget = /* @__PURE__ */ new Map();
562
- for (const [targetId, nodes] of governsRaw) {
563
- governsEdgesByTarget.set(
564
- targetId,
565
- nodes.sort((a, b) => a.title.localeCompare(b.title))
566
- );
567
- }
568
- return { governsEdgesByTarget, nodesById, edgesBySource, edgesByTarget };
569
- }
570
- function getKnowledgeByTarget(knowledgeNodes) {
571
- const map = /* @__PURE__ */ new Map();
572
- for (const node of knowledgeNodes) {
573
- for (const link of node.links) {
574
- const graphNodeId = graphNodeIdForKnowledgeTarget(link.target.kind, link.target.id);
575
- const domainKey = domainKeyForKnowledgeTarget(link.target.kind);
576
- const targetKeys = [
577
- graphNodeId,
578
- domainKey ? `${domainKey}:${link.target.id}` : void 0,
579
- domainKey ? domainKey : void 0
580
- ].filter((key) => key !== void 0);
581
- for (const targetKey of targetKeys) {
582
- const bucket = map.get(targetKey) ?? [];
583
- bucket.push(node);
584
- map.set(targetKey, bucket);
585
- }
586
- }
587
- }
588
- return map;
589
- }
590
- function uniqueKnowledgeNodes(nodes) {
591
- const seen = /* @__PURE__ */ new Set();
592
- return nodes.sort((left, right) => left.title.localeCompare(right.title)).filter((node) => {
593
- if (seen.has(node.id)) return false;
594
- seen.add(node.id);
595
- return true;
596
- });
597
- }
598
- function getTargetKnowledge(knowledgeByTarget, targetKey, facetStates) {
599
- if (facetStates.knowledge === "exclude") return [];
600
- return uniqueKnowledgeNodes(knowledgeByTarget.get(targetKey) ?? []);
601
- }
602
- function sortByOrderThenLabel(items, getLabel) {
603
- return [...items].sort(
604
- (left, right) => (left.order ?? 0) - (right.order ?? 0) || getLabel(left).localeCompare(getLabel(right))
605
- );
606
- }
607
- function modelRecordValues(record, getLabel) {
608
- return sortByOrderThenLabel(Object.values(record ?? {}), getLabel);
609
- }
610
- function spineNodeHasVisibleDescendant(bareId, allBareIds, spine, facetStates, ctx, organizationModel, cache2 = /* @__PURE__ */ new Map()) {
611
- const cached = cache2.get(bareId);
612
- if (cached !== void 0) return cached;
613
- const graphNodeId = `${spine}:${bareId}`;
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(
621
- (childId) => spineNodeHasVisibleDescendant(childId, allBareIds, spine, facetStates, ctx, organizationModel, cache2)
622
- );
623
- cache2.set(bareId, result);
624
- return result;
625
- }
626
- function buildSpineMetaMap(graph, spine) {
627
- const map = {};
628
- for (const node of graph.nodes) {
629
- if (node.kind === spine) {
630
- map[toBareGraphId(node.id, spine)] = { label: node.label, icon: node.icon, node };
631
- }
632
- }
633
- return map;
634
- }
635
- function getKnowledgeDirectoryCommand(nodeIds, fallbackCommand) {
636
- const command = getKnowledgeNodeReadCommands(nodeIds ?? []);
637
- return command || fallbackCommand;
638
- }
639
- function getKnowledgeFolderKey(node) {
640
- const key = `${node.id} ${node.title}`.toLowerCase();
641
- if (/\b(stage|booking|discovery|pipeline|communications?)\b/.test(key)) return "pipeline";
642
- if (/\b(upwork scanning|youtube|obs|recording|reddit|social)\b/.test(key)) return "channels";
643
- if (/\b(testimonials?|case stud|proof)\b/.test(key)) return "proof";
644
- if (/\b(target|personalization|vertical|calibration|query|research|strategy)\b/.test(key)) return "targeting";
645
- if (/\b(outreach|campaign|copy|handoff|bounce|reply|lead-gen playbook)\b/.test(key)) return "campaigns";
646
- if (node.kind === "reference") return "references";
647
- if (node.kind === "strategy") return "strategies";
648
- return "playbooks";
649
- }
650
- function sortFolderKeys(left, right) {
651
- const leftIndex = FOLDER_ORDER.indexOf(left);
652
- const rightIndex = FOLDER_ORDER.indexOf(right);
653
- if (leftIndex === -1 && rightIndex === -1) return left.localeCompare(right);
654
- if (leftIndex === -1) return 1;
655
- if (rightIndex === -1) return -1;
656
- return leftIndex - rightIndex;
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
- }
666
- function createKnowledgeLeaf(graphNodeId, node) {
667
- return {
668
- value: `${LEAF_PREFIX}${graphNodeId}::${node.id}`,
669
- label: node.title,
670
- nodeType: "leaf",
671
- knowledgeNodeId: node.id,
672
- knowledgeNodeIds: [node.id]
673
- };
674
- }
675
- function createKnowledgeLeaves(graphNodeId, nodes) {
676
- if (nodes.length < GROUP_THRESHOLD) {
677
- return nodes.map((node) => createKnowledgeLeaf(graphNodeId, node));
678
- }
679
- const grouped = /* @__PURE__ */ new Map();
680
- for (const node of nodes) {
681
- const folderKey = getKnowledgeFolderKey(node);
682
- const folderNodes = grouped.get(folderKey) ?? [];
683
- folderNodes.push(node);
684
- grouped.set(folderKey, folderNodes);
685
- }
686
- return [...grouped.entries()].sort(([left], [right]) => sortFolderKeys(left, right)).map(([folderKey, folderNodes]) => ({
687
- value: `${FOLDER_PREFIX}${graphNodeId}::${folderKey}`,
688
- label: FOLDER_LABELS[folderKey] ?? folderKey,
689
- nodeType: "folder",
690
- icon: "playbook",
691
- knowledgeNodeIds: folderNodes.map((node) => node.id),
692
- children: folderNodes.map((node) => createKnowledgeLeaf(graphNodeId, node))
693
- }));
694
- }
695
- function collectKnowledgeNodeIds(node) {
696
- if (node.knowledgeNodeIds) return node.knowledgeNodeIds;
697
- return (node.children ?? []).flatMap(collectKnowledgeNodeIds);
698
- }
699
- function createItemNode({
700
- domainKey,
701
- itemId,
702
- label,
703
- graphNodeId,
704
- knowledgeNodes = [],
705
- children = []
706
- }) {
707
- const knowledgeLeaves = knowledgeNodes.length > 0 ? createKnowledgeLeaves(`${ITEM_PREFIX}${domainKey}:${itemId}`, knowledgeNodes) : [];
708
- const allChildren = [...children, ...knowledgeLeaves];
709
- return {
710
- value: `${ITEM_PREFIX}${domainKey}:${itemId}`,
711
- label,
712
- nodeType: "item",
713
- domainKey,
714
- itemId,
715
- graphNodeId,
716
- knowledgeNodeIds: [...knowledgeNodes.map((node) => node.id), ...children.flatMap(collectKnowledgeNodeIds)],
717
- children: allChildren.length > 0 ? allChildren : void 0
718
- };
719
- }
720
- function createDomainNode({
721
- domainKey,
722
- label,
723
- knowledgeNodes = [],
724
- children = []
725
- }) {
726
- const knowledgeLeaves = knowledgeNodes.length > 0 ? createKnowledgeLeaves(`${DOMAIN_PREFIX}${domainKey}`, knowledgeNodes) : [];
727
- const allChildren = [...children, ...knowledgeLeaves];
728
- return {
729
- value: `${DOMAIN_PREFIX}${domainKey}`,
730
- label,
731
- nodeType: "domain",
732
- domainKey,
733
- knowledgeNodeIds: [...knowledgeNodes.map((node) => node.id), ...children.flatMap(collectKnowledgeNodeIds)],
734
- children: allChildren.length > 0 ? allChildren : void 0
735
- };
736
- }
737
- function createGroupNode({
738
- groupKey,
739
- label,
740
- children
741
- }) {
742
- return {
743
- value: `${GROUP_PREFIX}${groupKey}`,
744
- label,
745
- nodeType: "group",
746
- knowledgeNodeIds: children.flatMap(collectKnowledgeNodeIds),
747
- children: children.length > 0 ? children : void 0
748
- };
749
- }
750
- function getIncludedFacetNodes(graphNodeId, spineKind, facetStates, ctx) {
751
- const includedKinds = new Set(
752
- Object.entries(facetStates).filter(([kind, state]) => state === "include" && kind !== "knowledge" && kind !== spineKind).map(([kind]) => kind)
753
- );
754
- if (includedKinds.size === 0) return [];
755
- const seen = /* @__PURE__ */ new Set();
756
- const nodes = [];
757
- const outgoing = ctx.edgesBySource.get(graphNodeId) ?? [];
758
- const incoming = ctx.edgesByTarget.get(graphNodeId) ?? [];
759
- for (const edge of [...outgoing, ...incoming]) {
760
- const relatedId = edge.sourceId === graphNodeId ? edge.targetId : edge.sourceId;
761
- const relatedNode = ctx.nodesById.get(relatedId);
762
- if (!relatedNode || !includedKinds.has(relatedNode.kind) || seen.has(relatedNode.id)) continue;
763
- seen.add(relatedNode.id);
764
- nodes.push(relatedNode);
765
- }
766
- return nodes.sort((left, right) => left.kind.localeCompare(right.kind) || left.label.localeCompare(right.label));
767
- }
768
- function createFacetGraphLeaves(nodes) {
769
- return nodes.map((node) => ({
770
- value: `graph:${node.id}`,
771
- label: node.label,
772
- nodeType: "graph",
773
- icon: node.icon,
774
- graphNodeId: node.id,
775
- knowledgeNodeIds: []
776
- }));
777
- }
778
- function createGraphNodeItem(node, domainKey) {
779
- return createItemNode({
780
- domainKey,
781
- itemId: node.sourceId ?? node.id,
782
- label: node.label,
783
- graphNodeId: node.id
784
- });
785
- }
786
- function createCollectionNode(parentKey, collectionKey, label, children) {
787
- return {
788
- value: `${FOLDER_PREFIX}${parentKey}:${collectionKey}`,
789
- label,
790
- nodeType: "folder",
791
- knowledgeNodeIds: children.flatMap(collectKnowledgeNodeIds),
792
- children: children.length > 0 ? children : void 0
793
- };
794
- }
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;
804
- return {
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
- )
817
- };
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
- ];
865
- }
866
- function buildSystemConfigSubgroup(bareId, organizationModel) {
867
- if (!organizationModel) return [];
868
- const system = getSystem(organizationModel, bareId);
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
- });
887
- }
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",
934
- nodeType: "folder",
935
- icon: "view",
936
- knowledgeNodeIds: [],
937
- children: uiChildren.length > 0 ? uiChildren : void 0
938
- });
939
- }
940
- if (children.length === 0) return [];
941
- return [
942
- {
943
- value: `${FOLDER_PREFIX}config:${bareId}`,
944
- label: "Config",
945
- nodeType: "folder",
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
1025
- }
1026
- ];
1027
- }
1028
- function buildSpineTreeNode(bareId, allBareIds, spineMetaMap, spine, facetStates, ctx, visibleSpineIds, organizationModel) {
1029
- const graphNodeId = `${spine}:${bareId}`;
1030
- const governing = facetStates.knowledge === "exclude" ? [] : ctx.governsEdgesByTarget.get(graphNodeId) ?? [];
1031
- const childIds = childGraphIds(allBareIds, bareId);
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
- ] : [];
1039
- const childSpineNodes = childIds.filter((childId) => visibleSpineIds.has(childId)).map(
1040
- (childId) => buildSpineTreeNode(childId, allBareIds, spineMetaMap, spine, facetStates, ctx, visibleSpineIds, organizationModel)
1041
- );
1042
- const knowledgeLeaves = spine === "system" ? [] : createKnowledgeLeaves(graphNodeId, governing);
1043
- const facetLeaves = createFacetGraphLeaves(getIncludedFacetNodes(graphNodeId, spine, facetStates, ctx));
1044
- const children = [...systemModelChildren, ...childSpineNodes, ...knowledgeLeaves, ...facetLeaves];
1045
- const meta = spineMetaMap[bareId];
1046
- return {
1047
- value: `${SPINE_PREFIX}${spine}:${bareId}`,
1048
- label: meta?.label ?? bareId,
1049
- nodeType: "spine",
1050
- icon: meta?.icon,
1051
- graphNodeId,
1052
- knowledgeNodeIds: children.flatMap(collectKnowledgeNodeIds),
1053
- children: children.length > 0 ? children : void 0
1054
- };
1055
- }
1056
- function getInitialExpandedState(nodes, omRooted) {
1057
- if (!omRooted) return {};
1058
- const systemsValue = `${GROUP_PREFIX}systems`;
1059
- const quickAccessValue = `${GROUP_PREFIX}${QUICK_ACCESS_GROUP_KEY}`;
1060
- const expanded = {};
1061
- for (const node of nodes) {
1062
- if (node.value === systemsValue) expanded[systemsValue] = true;
1063
- if (node.value === quickAccessValue) expanded[quickAccessValue] = true;
1064
- }
1065
- return expanded;
1066
- }
1067
- function buildProfileGroup(organizationModel, knowledgeByTarget, facetStates) {
1068
- return createGroupNode({
1069
- groupKey: "profile",
1070
- label: "Profile",
1071
- children: [
1072
- createDomainNode({
1073
- domainKey: "identity",
1074
- label: "Identity",
1075
- knowledgeNodes: getTargetKnowledge(knowledgeByTarget, "identity", facetStates)
1076
- }),
1077
- createDomainNode({
1078
- domainKey: "branding",
1079
- label: "Branding",
1080
- knowledgeNodes: getTargetKnowledge(knowledgeByTarget, "branding", facetStates)
1081
- })
1082
- ]
1083
- });
1084
- }
1085
- function buildBusinessModelGroup(organizationModel, knowledgeByTarget, facetStates) {
1086
- return createGroupNode({
1087
- groupKey: "business-model",
1088
- label: "Business Model",
1089
- children: [
1090
- createDomainNode({
1091
- domainKey: "customers",
1092
- label: "Customers",
1093
- children: modelRecordValues(organizationModel?.customers, (segment) => segment.name || segment.id).map(
1094
- (segment) => createItemNode({
1095
- domainKey: "customers",
1096
- itemId: segment.id,
1097
- label: segment.name || segment.id,
1098
- knowledgeNodes: getTargetKnowledge(knowledgeByTarget, `customers:${segment.id}`, facetStates)
1099
- })
1100
- )
1101
- }),
1102
- createDomainNode({
1103
- domainKey: "offerings",
1104
- label: "Offerings",
1105
- children: modelRecordValues(organizationModel?.offerings, (offering) => offering.name || offering.id).map(
1106
- (offering) => createItemNode({
1107
- domainKey: "offerings",
1108
- itemId: offering.id,
1109
- label: offering.name || offering.id,
1110
- knowledgeNodes: getTargetKnowledge(knowledgeByTarget, `offerings:${offering.id}`, facetStates)
1111
- })
1112
- )
1113
- }),
1114
- createDomainNode({
1115
- domainKey: "goals",
1116
- label: "Goals",
1117
- children: modelRecordValues(organizationModel?.goals, (goal) => goal.description || goal.id).map(
1118
- (goal) => createItemNode({
1119
- domainKey: "goals",
1120
- itemId: goal.id,
1121
- label: goal.description || goal.id,
1122
- knowledgeNodes: getTargetKnowledge(knowledgeByTarget, `goals:${goal.id}`, facetStates)
1123
- })
1124
- )
1125
- })
1126
- ]
1127
- });
1128
- }
1129
- function buildRolesDomain(graph, organizationModel, knowledgeByTarget, facetStates) {
1130
- const graphNodesById = new Map(graph.nodes.map((node) => [node.id, node]));
1131
- const roleItems = modelRecordValues(organizationModel?.roles, (role) => role.title || role.id).map(
1132
- (role) => createItemNode({
1133
- domainKey: "roles",
1134
- itemId: role.id,
1135
- label: role.title || role.id,
1136
- graphNodeId: graphNodesById.get(`role:${role.id}`)?.id,
1137
- knowledgeNodes: getTargetKnowledge(knowledgeByTarget, `role:${role.id}`, facetStates)
1138
- })
1139
- );
1140
- return createDomainNode({ domainKey: "roles", label: "Roles", children: roleItems });
1141
- }
1142
- function buildSystemsGroup(graph, organizationModel, facetStates, ctx, visibleSpineIds) {
1143
- const spineMetaMap = buildSpineMetaMap(graph, "system");
1144
- const allBareIds = Object.keys(spineMetaMap);
1145
- const topIds = topLevelGraphIds(allBareIds);
1146
- const children = topIds.filter((bareId) => visibleSpineIds.has(bareId)).map(
1147
- (bareId) => buildSpineTreeNode(
1148
- bareId,
1149
- allBareIds,
1150
- spineMetaMap,
1151
- "system",
1152
- facetStates,
1153
- ctx,
1154
- visibleSpineIds,
1155
- organizationModel
1156
- )
1157
- );
1158
- return createGroupNode({ groupKey: "systems", label: "Systems", children });
1159
- }
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
- });
1193
- }
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
- );
1198
- const children = GRAPH_RESOURCE_TYPE_ORDER.map((resourceType) => {
1199
- const typedResources = resourceNodes.filter((node) => node.resourceType === resourceType);
1200
- if (typedResources.length === 0) return void 0;
1201
- return createCollectionNode(
1202
- "resources",
1203
- resourceType,
1204
- GRAPH_RESOURCE_TYPE_LABELS[resourceType],
1205
- typedResources.map((node) => createGraphNodeItem(node, "resources"))
1206
- );
1207
- }).filter((node) => node !== void 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) {
1213
- children.push(
1214
- createCollectionNode(
1215
- "resources",
1216
- "other",
1217
- "Other",
1218
- otherResources.map((node) => createGraphNodeItem(node, "resources"))
1219
- )
1220
- );
1221
- }
1222
- return createGroupNode({
1223
- groupKey: "resources",
1224
- label: "Resources",
1225
- children
1226
- });
1227
- }
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
- )
1258
- );
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])
1268
- );
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",
1298
- label: "Knowledge",
1299
- children
1300
- });
1301
- }
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
- );
1310
- return createGroupNode({
1311
- groupKey: "navigation",
1312
- label: "Navigation",
1313
- children: [createDomainNode({ domainKey: "navigation", label: "Surfaces", children: navigationSurfaces })]
1314
- });
1315
- }
1316
- function buildGovernanceGroup(graph, organizationModel, knowledgeByTarget, facetStates) {
1317
- const graphNodesById = new Map(graph.nodes.map((node) => [node.id, node]));
1318
- const policies = modelRecordValues(organizationModel?.policies, (policy) => policy.label || policy.id).map(
1319
- (policy) => createItemNode({
1320
- domainKey: "policies",
1321
- itemId: policy.id,
1322
- label: policy.label || policy.id,
1323
- graphNodeId: graphNodesById.get(`policy:${policy.id}`)?.id,
1324
- knowledgeNodes: getTargetKnowledge(knowledgeByTarget, `policy:${policy.id}`, facetStates)
1325
- })
1326
- );
1327
- const rolesDomain = buildRolesDomain(graph, organizationModel, knowledgeByTarget, facetStates);
1328
- return createGroupNode({
1329
- groupKey: "governance-wiring",
1330
- label: "Governance",
1331
- children: [
1332
- rolesDomain,
1333
- createDomainNode({ domainKey: "policies", label: "Policies", children: policies })
1334
- ]
1335
- });
1336
- }
1337
- function computeVisibleSpineIds(allBareIds, spine, facetStates, ctx, organizationModel) {
1338
- const cache2 = /* @__PURE__ */ new Map();
1339
- const visible = /* @__PURE__ */ new Set();
1340
- for (const bareId of allBareIds) {
1341
- if (spineNodeHasVisibleDescendant(bareId, allBareIds, spine, facetStates, ctx, organizationModel, cache2)) {
1342
- visible.add(bareId);
1343
- }
1344
- }
1345
- return visible;
1346
- }
1347
- function buildOrgTreeNode(graph, knowledgeNodes, facetStates, organizationModel, favorites = []) {
1348
- const ctx = buildTreeContext(graph, knowledgeNodes);
1349
- const knowledgeByTarget = getKnowledgeByTarget(knowledgeNodes);
1350
- const spineMetaMap = buildSpineMetaMap(graph, "system");
1351
- const allBareIds = Object.keys(spineMetaMap);
1352
- const visibleSpineIds = computeVisibleSpineIds(allBareIds, "system", facetStates, ctx, organizationModel);
1353
- const omGroups = OM_TREE_GROUPS.map((group) => {
1354
- switch (group.key) {
1355
- case "profile":
1356
- return buildProfileGroup(organizationModel, knowledgeByTarget, facetStates);
1357
- case "business-model":
1358
- return buildBusinessModelGroup(organizationModel, knowledgeByTarget, facetStates);
1359
- case "systems":
1360
- return buildSystemsGroup(graph, organizationModel, facetStates, ctx, visibleSpineIds);
1361
- case "graph":
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);
1369
- case "governance-wiring":
1370
- return buildGovernanceGroup(graph, organizationModel, knowledgeByTarget, facetStates);
1371
- default:
1372
- return createGroupNode({ groupKey: group.key, label: group.label, children: [] });
1373
- }
1374
- });
1375
- const quickAccess = buildQuickAccessGroup(favorites, knowledgeNodes, graph);
1376
- return [quickAccess, ...omGroups];
1377
- }
1378
- function buildQuickAccessGroup(favorites, knowledgeNodes, graph) {
1379
- const knowledgeIds = new Set(knowledgeNodes.map((node) => node.id));
1380
- const graphIds = new Set(graph.nodes.map((node) => node.id));
1381
- const children = favorites.filter((favorite) => {
1382
- if (favorite.kind === "knowledge") return knowledgeIds.has(favorite.routeId);
1383
- if (favorite.kind === "graph") return graphIds.has(favorite.routeId);
1384
- return true;
1385
- }).map((favorite) => ({
1386
- value: `${FAVORITE_PREFIX}${favorite.routeId}`,
1387
- label: favorite.label,
1388
- nodeType: "favorite",
1389
- icon: favorite.iconToken,
1390
- favoriteRouteId: favorite.routeId,
1391
- favoriteKind: favorite.kind,
1392
- knowledgeNodeIds: []
1393
- }));
1394
- return {
1395
- value: `${GROUP_PREFIX}${QUICK_ACCESS_GROUP_KEY}`,
1396
- label: "Quick Access",
1397
- nodeType: "group",
1398
- knowledgeNodeIds: [],
1399
- children
1400
- };
1401
- }
1402
- function KnowledgeTree({
1403
- graph,
1404
- knowledgeNodes,
1405
- organizationModel,
1406
- onSelectNode,
1407
- onSelectGraphNode,
1408
- onSelectDomain,
1409
- onSelectGroup,
1410
- onSelectItem,
1411
- spine = "system",
1412
- omRooted = false,
1413
- facetStates = DEFAULT_KNOWLEDGE_FACET_STATES,
1414
- selectedNodeId
1415
- }) {
1416
- const graphSpine = spine;
1417
- const favoritesMap = useKnowledgeFavoritesStore((state) => state.favorites);
1418
- const favorites = useMemo(
1419
- () => Object.values(favoritesMap).sort((left, right) => right.addedAt - left.addedAt),
1420
- [favoritesMap]
1421
- );
1422
- const treeData = useMemo(() => {
1423
- if (omRooted) {
1424
- return buildOrgTreeNode(graph, knowledgeNodes, facetStates, organizationModel, favorites);
1425
- }
1426
- const ctx = buildTreeContext(graph, knowledgeNodes);
1427
- const spineMetaMap = buildSpineMetaMap(graph, graphSpine);
1428
- const allBareIds = Object.keys(spineMetaMap);
1429
- const topIds = topLevelGraphIds(allBareIds);
1430
- const visibleSpineIds = computeVisibleSpineIds(allBareIds, graphSpine, facetStates, ctx, organizationModel);
1431
- return topIds.filter((bareId) => visibleSpineIds.has(bareId)).map(
1432
- (bareId) => buildSpineTreeNode(
1433
- bareId,
1434
- allBareIds,
1435
- spineMetaMap,
1436
- graphSpine,
1437
- facetStates,
1438
- ctx,
1439
- visibleSpineIds,
1440
- organizationModel
1441
- )
1442
- );
1443
- }, [facetStates, favorites, graph, graphSpine, knowledgeNodes, omRooted, organizationModel]);
1444
- const initialExpandedState = useMemo(() => getInitialExpandedState(treeData, omRooted), [treeData, omRooted]);
1445
- const treeController = useTree({ initialExpandedState });
1446
- const leafNodeMap = useMemo(() => {
1447
- const map = /* @__PURE__ */ new Map();
1448
- for (const node of knowledgeNodes) {
1449
- map.set(node.id, node);
1450
- }
1451
- return map;
1452
- }, [knowledgeNodes]);
1453
- const graphNodeMap = useMemo(() => {
1454
- const map = /* @__PURE__ */ new Map();
1455
- for (const graphNode of graph.nodes) {
1456
- map.set(graphNode.id, graphNode);
1457
- }
1458
- return map;
1459
- }, [graph]);
1460
- if (treeData.length === 0) {
1461
- return /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", style: { padding: "var(--mantine-spacing-md)" }, children: omRooted ? "No OM domains in model." : `No ${spine} spine nodes in graph.` });
1462
- }
1463
- return /* @__PURE__ */ jsx(
1464
- Tree,
1465
- {
1466
- data: treeData,
1467
- tree: treeController,
1468
- style: { padding: "var(--mantine-spacing-xs)" },
1469
- renderNode: ({ node, expanded, hasChildren, elementProps }) => {
1470
- const value = node.value;
1471
- const typedNode = node;
1472
- const decoratedElementProps = {
1473
- ...elementProps,
1474
- "data-tree-row-value": typeof value === "string" ? value : void 0
1475
- };
1476
- if (typedNode.nodeType === "group") {
1477
- const groupKey = typeof value === "string" ? value.slice(GROUP_PREFIX.length) : "";
1478
- const isActive2 = selectedNodeId === value;
1479
- const isQuickAccess = groupKey === QUICK_ACCESS_GROUP_KEY;
1480
- return /* @__PURE__ */ jsx(
1481
- DirectoryRow,
1482
- {
1483
- elementProps: decoratedElementProps,
1484
- expanded,
1485
- hasChildren,
1486
- label: String(node.label),
1487
- iconToken: GROUP_ICON_TOKENS[groupKey] ?? typedNode.icon,
1488
- command: isQuickAccess ? "" : getKnowledgeDirectoryCommand(
1489
- typedNode.knowledgeNodeIds,
1490
- getKnowledgeTreeFolderCommand(`${GROUP_PREFIX}${groupKey}`)
1491
- ),
1492
- isActive: isActive2,
1493
- fallbackKind: "organization",
1494
- uppercase: true,
1495
- onSelectGraphNode: isQuickAccess ? void 0 : onSelectGroup ? () => onSelectGroup(groupKey) : void 0,
1496
- favorite: isQuickAccess ? void 0 : {
1497
- routeId: `${GROUP_PREFIX}${groupKey}`,
1498
- label: String(node.label),
1499
- kind: "group",
1500
- iconToken: typedNode.icon
1501
- }
1502
- }
1503
- );
1504
- }
1505
- if (typedNode.nodeType === "favorite" && typedNode.favoriteRouteId && typedNode.favoriteKind) {
1506
- const routeId = typedNode.favoriteRouteId;
1507
- const favoriteKind = typedNode.favoriteKind;
1508
- return /* @__PURE__ */ jsx(
1509
- FavoriteRow,
1510
- {
1511
- elementProps: decoratedElementProps,
1512
- label: String(node.label),
1513
- routeId,
1514
- kind: favoriteKind,
1515
- iconToken: typedNode.icon,
1516
- onActivate: () => {
1517
- dispatchFavoriteSelection(routeId, favoriteKind, typedNode, {
1518
- onSelectNode,
1519
- onSelectGraphNode,
1520
- onSelectGroup,
1521
- onSelectDomain,
1522
- onSelectItem,
1523
- leafNodeMap,
1524
- graphNodeMap
1525
- });
1526
- focusFavoriteInTree(treeData, treeController, { routeId, kind: favoriteKind });
1527
- }
1528
- }
1529
- );
1530
- }
1531
- if (typedNode.nodeType === "domain" && typedNode.domainKey) {
1532
- const domainKey = typedNode.domainKey;
1533
- const isActive2 = selectedNodeId === `${DOMAIN_PREFIX}${domainKey}`;
1534
- return /* @__PURE__ */ jsx(
1535
- DirectoryRow,
1536
- {
1537
- elementProps: decoratedElementProps,
1538
- expanded,
1539
- hasChildren,
1540
- label: String(node.label),
1541
- iconToken: void 0,
1542
- command: getKnowledgeDirectoryCommand(
1543
- typedNode.knowledgeNodeIds,
1544
- getKnowledgeTreeFolderCommand(`${DOMAIN_PREFIX}${domainKey}`)
1545
- ),
1546
- isActive: isActive2,
1547
- fallbackKind: "organization",
1548
- uppercase: true,
1549
- onSelectGraphNode: onSelectDomain ? () => onSelectDomain(domainKey) : void 0,
1550
- favorite: {
1551
- routeId: `${DOMAIN_PREFIX}${domainKey}`,
1552
- label: String(node.label),
1553
- kind: "domain"
1554
- }
1555
- }
1556
- );
1557
- }
1558
- if (typedNode.nodeType === "item" && typedNode.domainKey && typedNode.itemId) {
1559
- const graphNode2 = typedNode.graphNodeId ? graphNodeMap.get(typedNode.graphNodeId) : void 0;
1560
- const itemRouteId = `${ITEM_PREFIX}${typedNode.domainKey}:${typedNode.itemId}`;
1561
- const routeToDomainPanel = shouldRouteItemToDomainPanel(typedNode.domainKey);
1562
- const fallbackCommand = graphNode2?.kind === "knowledge" && graphNode2.sourceId ? getKnowledgeNodeReadCommand(graphNode2.sourceId) : graphNode2 ? getKnowledgeGraphFolderCommand(graphNode2.id) : getKnowledgeTreeFolderCommand(itemRouteId);
1563
- const isActive2 = selectedNodeId !== void 0 && (selectedNodeId === itemRouteId || selectedNodeId === typedNode.itemId || selectedNodeId === typedNode.graphNodeId || graphNode2 !== void 0 && (selectedNodeId === graphNode2.id || selectedNodeId === graphNode2.sourceId));
1564
- return /* @__PURE__ */ jsx(
1565
- DirectoryRow,
1566
- {
1567
- elementProps: decoratedElementProps,
1568
- expanded,
1569
- hasChildren,
1570
- label: String(node.label),
1571
- iconToken: typedNode.icon ?? graphNode2?.icon,
1572
- command: getKnowledgeDirectoryCommand(typedNode.knowledgeNodeIds, fallbackCommand),
1573
- isActive: isActive2,
1574
- fallbackKind: graphNode2?.kind ?? "organization",
1575
- onSelectGraphNode: routeToDomainPanel && onSelectItem ? () => onSelectItem(typedNode.domainKey ?? "", typedNode.itemId ?? "") : graphNode2 ? () => onSelectGraphNode?.(graphNode2) : onSelectItem ? () => onSelectItem(typedNode.domainKey ?? "", typedNode.itemId ?? "") : void 0,
1576
- favorite: {
1577
- routeId: itemRouteId,
1578
- label: String(node.label),
1579
- kind: "item",
1580
- iconToken: typedNode.icon ?? graphNode2?.icon
1581
- }
1582
- }
1583
- );
1584
- }
1585
- if (typeof value === "string" && value.startsWith(LEAF_PREFIX)) {
1586
- const knowledgeNodeId = value.split("::").at(-1);
1587
- const knowledgeNode = knowledgeNodeId ? leafNodeMap.get(knowledgeNodeId) : void 0;
1588
- if (!knowledgeNode) return null;
1589
- return /* @__PURE__ */ jsx(
1590
- KnowledgeLeafRow,
1591
- {
1592
- elementProps: decoratedElementProps,
1593
- knowledgeNode,
1594
- isActive: knowledgeNode.id === selectedNodeId,
1595
- onSelectNode
1596
- }
1597
- );
1598
- }
1599
- if (typeof value === "string" && value.startsWith(FOLDER_PREFIX)) {
1600
- return /* @__PURE__ */ jsx(
1601
- DirectoryRow,
1602
- {
1603
- elementProps: decoratedElementProps,
1604
- expanded,
1605
- hasChildren,
1606
- label: String(node.label),
1607
- iconToken: typedNode.icon,
1608
- command: getKnowledgeDirectoryCommand(
1609
- typedNode.knowledgeNodeIds,
1610
- getKnowledgeTreeFolderCommand(String(value))
1611
- ),
1612
- isActive: false
1613
- }
1614
- );
1615
- }
1616
- if (typedNode.nodeType === "graph" && typedNode.graphNodeId) {
1617
- const graphNode2 = graphNodeMap.get(typedNode.graphNodeId);
1618
- if (!graphNode2) return null;
1619
- const isActive2 = selectedNodeId !== void 0 && (selectedNodeId === graphNode2.id || selectedNodeId === graphNode2.sourceId);
1620
- return /* @__PURE__ */ jsx(
1621
- DirectoryRow,
1622
- {
1623
- elementProps: decoratedElementProps,
1624
- expanded,
1625
- hasChildren,
1626
- label: String(node.label),
1627
- iconToken: typedNode.icon,
1628
- command: getKnowledgeGraphFolderCommand(graphNode2.id),
1629
- isActive: isActive2,
1630
- fallbackKind: graphNode2.kind,
1631
- onSelectGraphNode: () => onSelectGraphNode?.(graphNode2),
1632
- favorite: {
1633
- routeId: graphNode2.id,
1634
- label: graphNode2.label,
1635
- kind: "graph",
1636
- iconToken: typedNode.icon ?? graphNode2.icon
1637
- }
1638
- }
1639
- );
1640
- }
1641
- const graphNodeId = typedNode.graphNodeId ?? String(value).replace(SPINE_PREFIX, "");
1642
- const graphNode = graphNodeMap.get(graphNodeId);
1643
- const isActive = selectedNodeId !== void 0 && graphNode !== void 0 && (selectedNodeId === graphNode.id || selectedNodeId === graphNode.sourceId || selectedNodeId === graphNodeId);
1644
- return /* @__PURE__ */ jsx(
1645
- DirectoryRow,
1646
- {
1647
- elementProps: decoratedElementProps,
1648
- expanded,
1649
- hasChildren,
1650
- label: String(node.label),
1651
- iconToken: typedNode.icon,
1652
- command: graphSpine ? getKnowledgeSpineFolderCommand(graphSpine, graphNode?.sourceId ?? graphNodeId) : "",
1653
- isActive,
1654
- fallbackKind: graphNode?.kind ?? "system",
1655
- uppercase: true,
1656
- onSelectGraphNode: graphNode ? () => onSelectGraphNode?.(graphNode) : void 0,
1657
- favorite: graphNode ? {
1658
- routeId: graphNode.id,
1659
- label: graphNode.label,
1660
- kind: "graph",
1661
- iconToken: typedNode.icon ?? graphNode.icon
1662
- } : void 0
1663
- }
1664
- );
1665
- }
1666
- }
1667
- );
1668
- }
1669
- function FavoriteStarControl({ routeId, label, kind, iconToken, hovered }) {
1670
- const isFavorited = useKnowledgeFavoritesStore((state) => Boolean(state.favorites[routeId]));
1671
- const toggleFavorite = useKnowledgeFavoritesStore((state) => state.toggleFavorite);
1672
- const visible = hovered || isFavorited;
1673
- return /* @__PURE__ */ jsx(
1674
- "span",
1675
- {
1676
- role: "button",
1677
- tabIndex: visible ? 0 : -1,
1678
- "aria-hidden": !visible,
1679
- "aria-pressed": isFavorited,
1680
- "aria-label": isFavorited ? `Unfavorite ${label}` : `Favorite ${label}`,
1681
- onClick: (event) => {
1682
- event.preventDefault();
1683
- event.stopPropagation();
1684
- toggleFavorite({ routeId, label, kind, iconToken });
1685
- },
1686
- onKeyDown: (event) => {
1687
- if (event.key !== "Enter" && event.key !== " ") return;
1688
- event.preventDefault();
1689
- event.stopPropagation();
1690
- toggleFavorite({ routeId, label, kind, iconToken });
1691
- },
1692
- style: {
1693
- display: "inline-flex",
1694
- alignItems: "center",
1695
- justifyContent: "center",
1696
- width: 22,
1697
- height: 22,
1698
- flexShrink: 0,
1699
- opacity: visible ? 1 : 0,
1700
- pointerEvents: visible ? "auto" : "none",
1701
- color: isFavorited ? "var(--mantine-color-yellow-5)" : "var(--color-text-subtle)",
1702
- transition: "opacity 120ms ease, color 120ms ease"
1703
- },
1704
- children: isFavorited ? /* @__PURE__ */ jsx(IconStarFilled, { size: 14 }) : /* @__PURE__ */ jsx(IconStar, { size: 14 })
1705
- }
1706
- );
1707
- }
1708
- function focusFavoriteInTree(treeData, controller, favorite) {
1709
- const path = findFavoritePathInTree(treeData, favorite);
1710
- if (!path || path.length === 0) return;
1711
- for (let i = 0; i < path.length - 1; i++) {
1712
- controller.expand(path[i]);
1713
- }
1714
- const targetValue = path[path.length - 1];
1715
- if (typeof window === "undefined" || typeof document === "undefined") return;
1716
- const escape = (raw) => typeof CSS !== "undefined" && typeof CSS.escape === "function" ? CSS.escape(raw) : raw.replace(/"/g, '\\"');
1717
- window.requestAnimationFrame(() => {
1718
- window.requestAnimationFrame(() => {
1719
- const el = document.querySelector(`[data-tree-row-value="${escape(targetValue)}"]`);
1720
- if (el instanceof HTMLElement) {
1721
- el.scrollIntoView({ behavior: "smooth", block: "center" });
1722
- }
1723
- });
1724
- });
1725
- }
1726
- function dispatchFavoriteSelection(routeId, kind, typedNode, ctx) {
1727
- if (kind === "group" && routeId.startsWith(GROUP_PREFIX)) {
1728
- ctx.onSelectGroup?.(routeId.slice(GROUP_PREFIX.length));
1729
- return;
1730
- }
1731
- if (kind === "domain" && routeId.startsWith(DOMAIN_PREFIX)) {
1732
- ctx.onSelectDomain?.(routeId.slice(DOMAIN_PREFIX.length));
1733
- return;
1734
- }
1735
- if (kind === "item" && routeId.startsWith(ITEM_PREFIX)) {
1736
- const rest = routeId.slice(ITEM_PREFIX.length);
1737
- const sepIndex = rest.indexOf(":");
1738
- if (sepIndex > 0) {
1739
- ctx.onSelectItem?.(rest.slice(0, sepIndex), rest.slice(sepIndex + 1));
1740
- }
1741
- return;
1742
- }
1743
- if (kind === "graph") {
1744
- const graphNode = ctx.graphNodeMap.get(routeId);
1745
- if (graphNode) ctx.onSelectGraphNode?.(graphNode);
1746
- return;
1747
- }
1748
- if (kind === "knowledge") {
1749
- const knowledgeNode = ctx.leafNodeMap.get(routeId);
1750
- if (knowledgeNode) ctx.onSelectNode(knowledgeNode);
1751
- }
1752
- }
1753
- function FavoriteRow({ elementProps, label, routeId, kind, iconToken, onActivate }) {
1754
- const [hovered, setHovered] = useState(false);
1755
- return /* @__PURE__ */ jsx(
1756
- UnstyledButton,
1757
- {
1758
- ...elementProps,
1759
- onMouseEnter: (event) => {
1760
- elementProps.onMouseEnter?.(event);
1761
- setHovered(true);
1762
- },
1763
- onMouseLeave: (event) => {
1764
- elementProps.onMouseLeave?.(event);
1765
- setHovered(false);
1766
- },
1767
- onClick: () => onActivate(),
1768
- style: {
1769
- ...elementProps.style ?? {},
1770
- padding: "5px 8px 5px 24px",
1771
- borderRadius: "var(--mantine-radius-sm)",
1772
- backgroundColor: hovered ? "var(--color-surface-hover)" : "transparent",
1773
- width: "100%",
1774
- textAlign: "left",
1775
- display: "block"
1776
- },
1777
- children: /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", children: [
1778
- /* @__PURE__ */ jsx(
1779
- SemanticIcon,
1780
- {
1781
- token: iconToken ?? (kind === "knowledge" ? "reference" : "info"),
1782
- size: 15,
1783
- style: { color: SIDEBAR_TREE_ACCENT_COLOR }
1784
- }
1785
- ),
1786
- /* @__PURE__ */ jsx(
1787
- Text,
1788
- {
1789
- size: "sm",
1790
- c: hovered ? "var(--color-text)" : void 0,
1791
- style: { flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" },
1792
- children: label
1793
- }
1794
- ),
1795
- /* @__PURE__ */ jsx(
1796
- TrailingCopySlot,
1797
- {
1798
- command: "",
1799
- label: "",
1800
- showCopy: false,
1801
- favorite: { routeId, label, kind, iconToken },
1802
- hovered
1803
- }
1804
- )
1805
- ] })
1806
- }
1807
- );
1808
- }
1809
- function CopyCommandControl({ command, label, visible }) {
1810
- const clipboard = useClipboard({ timeout: 1500 });
1811
- if (!command) return null;
1812
- return /* @__PURE__ */ jsx(
1813
- "span",
1814
- {
1815
- role: "button",
1816
- tabIndex: visible ? 0 : -1,
1817
- "aria-hidden": !visible,
1818
- "aria-label": label,
1819
- onClick: (event) => {
1820
- event.preventDefault();
1821
- event.stopPropagation();
1822
- clipboard.copy(command);
1823
- },
1824
- onKeyDown: (event) => {
1825
- if (event.key !== "Enter" && event.key !== " ") return;
1826
- event.preventDefault();
1827
- event.stopPropagation();
1828
- clipboard.copy(command);
1829
- },
1830
- style: {
1831
- display: "inline-flex",
1832
- alignItems: "center",
1833
- justifyContent: "center",
1834
- width: 22,
1835
- height: 22,
1836
- flexShrink: 0,
1837
- opacity: visible ? 1 : 0,
1838
- pointerEvents: visible ? "auto" : "none",
1839
- color: clipboard.copied ? "var(--color-primary)" : "var(--color-text-subtle)",
1840
- transition: "opacity 120ms ease, color 120ms ease"
1841
- },
1842
- children: clipboard.copied ? /* @__PURE__ */ jsx(IconCheck, { size: 14 }) : /* @__PURE__ */ jsx(IconCopy, { size: 14 })
1843
- }
1844
- );
1845
- }
1846
- function KnowledgeLeafRow({ elementProps, knowledgeNode, isActive, onSelectNode }) {
1847
- const [hovered, setHovered] = useState(false);
1848
- return /* @__PURE__ */ jsx(
1849
- UnstyledButton,
1850
- {
1851
- ...elementProps,
1852
- onMouseEnter: (event) => {
1853
- elementProps.onMouseEnter?.(event);
1854
- setHovered(true);
1855
- },
1856
- onMouseLeave: (event) => {
1857
- elementProps.onMouseLeave?.(event);
1858
- setHovered(false);
1859
- },
1860
- onClick: () => onSelectNode(knowledgeNode),
1861
- style: {
1862
- ...elementProps.style ?? {},
1863
- padding: "5px 8px 5px 24px",
1864
- borderRadius: "var(--mantine-radius-sm)",
1865
- backgroundColor: isActive ? "color-mix(in srgb, var(--color-primary) 10%, transparent)" : hovered ? "var(--color-surface-hover)" : "transparent",
1866
- width: "100%",
1867
- textAlign: "left",
1868
- display: "block"
1869
- },
1870
- children: /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", children: [
1871
- /* @__PURE__ */ jsx(
1872
- SemanticIcon,
1873
- {
1874
- token: getKnowledgeIconToken(knowledgeNode) ?? "reference",
1875
- size: 15,
1876
- style: { color: SIDEBAR_TREE_ACCENT_COLOR }
1877
- }
1878
- ),
1879
- /* @__PURE__ */ jsx(
1880
- Text,
1881
- {
1882
- size: "sm",
1883
- c: isActive ? "var(--color-primary)" : hovered ? "var(--color-text)" : void 0,
1884
- fw: isActive ? 600 : 400,
1885
- style: { flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" },
1886
- children: knowledgeNode.title
1887
- }
1888
- ),
1889
- /* @__PURE__ */ jsx(
1890
- TrailingCopySlot,
1891
- {
1892
- command: getKnowledgeNodeReadCommand(knowledgeNode.id),
1893
- label: "Copy knowledge command",
1894
- showCopy: hovered,
1895
- favorite: {
1896
- routeId: knowledgeNode.id,
1897
- label: knowledgeNode.title,
1898
- kind: "knowledge",
1899
- iconToken: getKnowledgeIconToken(knowledgeNode)
1900
- },
1901
- hovered
1902
- }
1903
- )
1904
- ] })
1905
- }
1906
- );
1907
- }
1908
- function DirectoryRow({
1909
- elementProps,
1910
- expanded,
1911
- hasChildren,
1912
- label,
1913
- iconToken,
1914
- command,
1915
- isActive,
1916
- fallbackKind = "system",
1917
- uppercase = false,
1918
- onSelectGraphNode,
1919
- favorite
1920
- }) {
1921
- const [hovered, setHovered] = useState(false);
1922
- return /* @__PURE__ */ jsxs(
1923
- Group,
1924
- {
1925
- ...elementProps,
1926
- gap: "xs",
1927
- onMouseEnter: (event) => {
1928
- elementProps.onMouseEnter?.(event);
1929
- setHovered(true);
1930
- },
1931
- onMouseLeave: (event) => {
1932
- elementProps.onMouseLeave?.(event);
1933
- setHovered(false);
1934
- },
1935
- onClick: (event) => {
1936
- if (onSelectGraphNode) {
1937
- if (isActive && expanded) {
1938
- elementProps.onClick?.(event);
1939
- } else {
1940
- if (!expanded) elementProps.onClick?.(event);
1941
- onSelectGraphNode();
1942
- }
1943
- } else {
1944
- elementProps.onClick?.(event);
1945
- }
1946
- },
1947
- style: {
1948
- ...elementProps.style ?? {},
1949
- padding: "4px 8px",
1950
- borderRadius: "var(--mantine-radius-sm)",
1951
- backgroundColor: isActive ? "color-mix(in srgb, var(--color-primary) 10%, transparent)" : hovered ? "var(--color-surface-hover)" : "transparent",
1952
- cursor: onSelectGraphNode || hasChildren ? "pointer" : "default",
1953
- userSelect: "none"
1954
- },
1955
- children: [
1956
- hasChildren ? /* @__PURE__ */ jsx(
1957
- "span",
1958
- {
1959
- "aria-hidden": "true",
1960
- style: {
1961
- display: "inline-flex",
1962
- alignItems: "center",
1963
- justifyContent: "center",
1964
- width: 12,
1965
- height: 12,
1966
- color: SIDEBAR_TREE_ACCENT_COLOR,
1967
- flexShrink: 0
1968
- },
1969
- children: expanded ? /* @__PURE__ */ jsx(IconChevronDown, { size: 12, stroke: 2 }) : /* @__PURE__ */ jsx(IconChevronRight, { size: 12, stroke: 2 })
1970
- }
1971
- ) : /* @__PURE__ */ jsx(Text, { size: "xs", style: { width: 12, flexShrink: 0 } }),
1972
- /* @__PURE__ */ jsx(
1973
- SemanticIcon,
1974
- {
1975
- token: iconToken ?? (fallbackKind !== void 0 ? graphKindToFallbackToken(fallbackKind) : "info"),
1976
- size: 14,
1977
- style: { color: SIDEBAR_TREE_ACCENT_COLOR }
1978
- }
1979
- ),
1980
- /* @__PURE__ */ jsx(
1981
- Text,
1982
- {
1983
- size: "sm",
1984
- fw: isActive ? 700 : 600,
1985
- tt: uppercase ? "uppercase" : void 0,
1986
- c: isActive ? "var(--color-primary)" : hovered ? "var(--color-text)" : void 0,
1987
- style: {
1988
- letterSpacing: uppercase ? "0.05em" : 0,
1989
- flex: 1,
1990
- minWidth: 0,
1991
- overflow: "hidden",
1992
- textOverflow: "ellipsis",
1993
- whiteSpace: "nowrap"
1994
- },
1995
- children: label
1996
- }
1997
- ),
1998
- /* @__PURE__ */ jsx(
1999
- TrailingCopySlot,
2000
- {
2001
- command,
2002
- label: "Copy folder knowledge commands",
2003
- showCopy: hovered,
2004
- favorite,
2005
- hovered
2006
- }
2007
- )
2008
- ]
2009
- }
2010
- );
2011
- }
2012
- function TrailingCopySlot({ command, label, showCopy, favorite, hovered }) {
2013
- const isFavorited = useKnowledgeFavoritesStore(
2014
- (state) => favorite ? Boolean(state.favorites[favorite.routeId]) : false
2015
- );
2016
- const favoriteVisible = Boolean(favorite) && (hovered || isFavorited);
2017
- const copyVisible = showCopy && Boolean(command);
2018
- if (!favoriteVisible && !copyVisible) return null;
2019
- return /* @__PURE__ */ jsxs(
2020
- "span",
2021
- {
2022
- style: {
2023
- display: "inline-flex",
2024
- alignItems: "center",
2025
- justifyContent: "flex-end",
2026
- gap: 2,
2027
- height: 22,
2028
- flexShrink: 0
2029
- },
2030
- children: [
2031
- copyVisible ? /* @__PURE__ */ jsx(CopyCommandControl, { command, label, visible: true }) : null,
2032
- favoriteVisible && favorite ? /* @__PURE__ */ jsx(
2033
- FavoriteStarControl,
2034
- {
2035
- routeId: favorite.routeId,
2036
- label: favorite.label,
2037
- kind: favorite.kind,
2038
- iconToken: favorite.iconToken,
2039
- hovered: true
2040
- }
2041
- ) : null
2042
- ]
2043
- }
2044
- );
2045
- }
2046
- var indexPromise = null;
2047
- function loadSearchIndex() {
2048
- if (!indexPromise) {
2049
- indexPromise = import('./knowledge-search-index-NBCTFIOH.js').then(
2050
- (mod) => buildSearchIndex(mod.default ?? mod)
2051
- );
2052
- }
2053
- return indexPromise;
2054
- }
2055
- function buildSearchIndex(entries) {
2056
- return {
2057
- search(query) {
2058
- if (!query.trim()) return [];
2059
- const q = query.trim().toLowerCase();
2060
- const scored = [];
2061
- for (const entry of entries) {
2062
- let score = 0;
2063
- if (entry.title.toLowerCase().includes(q)) score += 3;
2064
- if (entry.summary.toLowerCase().includes(q)) score += 2;
2065
- if (entry.bodyText.toLowerCase().includes(q)) score += 1;
2066
- if (score > 0) scored.push({ id: entry.id, score });
2067
- }
2068
- return scored.sort((a, b) => b.score - a.score).map((s) => s.id);
2069
- }
2070
- };
2071
- }
2072
- function KnowledgeSearchBar({
2073
- knowledgeNodes,
2074
- onResults,
2075
- placeholder = "Search knowledge\u2026"
2076
- }) {
2077
- const [query, setQuery] = useState("");
2078
- const indexRef = useRef(null);
2079
- const nodeMapRef = useRef(/* @__PURE__ */ new Map());
2080
- useEffect(() => {
2081
- const map = /* @__PURE__ */ new Map();
2082
- for (const node of knowledgeNodes) map.set(node.id, node);
2083
- nodeMapRef.current = map;
2084
- }, [knowledgeNodes]);
2085
- const handleChange = (value) => {
2086
- setQuery(value);
2087
- if (!value.trim()) {
2088
- onResults(null);
2089
- return;
2090
- }
2091
- if (indexRef.current) {
2092
- runSearch(value, indexRef.current);
2093
- return;
2094
- }
2095
- void loadSearchIndex().then((index) => {
2096
- indexRef.current = index;
2097
- if (query.trim() || value.trim()) runSearch(value, index);
2098
- });
2099
- };
2100
- function runSearch(value, index) {
2101
- const ids = index.search(value);
2102
- const hits = ids.flatMap((id) => {
2103
- const node = nodeMapRef.current.get(id);
2104
- return node ? [node] : [];
2105
- });
2106
- onResults(hits);
2107
- }
2108
- const handleClear = () => {
2109
- setQuery("");
2110
- onResults(null);
2111
- };
2112
- return /* @__PURE__ */ jsx(
2113
- TextInput,
2114
- {
2115
- value: query,
2116
- onChange: (e) => handleChange(e.currentTarget.value),
2117
- placeholder,
2118
- leftSection: /* @__PURE__ */ jsx(IconSearch, { size: 16 }),
2119
- rightSection: query ? /* @__PURE__ */ jsx(IconX, { size: 14, style: { cursor: "pointer", color: "var(--color-text-subtle)" }, onClick: handleClear }) : null,
2120
- styles: {
2121
- input: {
2122
- backgroundColor: "var(--color-surface)",
2123
- borderColor: "var(--color-border)",
2124
- color: "var(--color-text)"
2125
- }
2126
- }
2127
- }
2128
- );
2129
- }
2130
-
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 };