@elevasis/ui 2.45.2 → 2.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/api/index.js +3 -3
  2. package/dist/app/index.d.ts +2 -2
  3. package/dist/app/index.js +3 -3
  4. package/dist/auth/index.js +3 -3
  5. package/dist/charts/index.js +3 -3
  6. package/dist/{chunk-HQPJ6TGV.js → chunk-CDZB24OR.js} +6 -9
  7. package/dist/{chunk-FLQKWUSH.js → chunk-FVI3AMBM.js} +472 -40
  8. package/dist/{chunk-L4RIHGPO.js → chunk-OFLWSKSC.js} +1 -1
  9. package/dist/{chunk-SDUMVYGI.js → chunk-SOGPJFO6.js} +1 -1
  10. package/dist/components/index.d.ts +1 -1
  11. package/dist/components/index.js +3 -3
  12. package/dist/components/navigation/index.js +3 -3
  13. package/dist/features/auth/index.js +4 -4
  14. package/dist/features/clients/index.js +3 -3
  15. package/dist/features/crm/index.js +3 -3
  16. package/dist/features/dashboard/index.d.ts +1 -1
  17. package/dist/features/dashboard/index.js +3 -3
  18. package/dist/features/delivery/index.js +3 -3
  19. package/dist/features/knowledge/index.js +3 -3
  20. package/dist/features/lead-gen/index.d.ts +2 -2
  21. package/dist/features/lead-gen/index.js +3 -3
  22. package/dist/features/monitoring/index.js +3 -3
  23. package/dist/features/monitoring/requests/index.js +4 -4
  24. package/dist/features/operations/index.d.ts +2 -2
  25. package/dist/features/operations/index.js +3 -3
  26. package/dist/features/settings/index.js +3 -3
  27. package/dist/hooks/access/index.js +3 -3
  28. package/dist/hooks/delivery/index.js +3 -3
  29. package/dist/hooks/index.d.ts +1 -1
  30. package/dist/hooks/index.js +3 -3
  31. package/dist/hooks/operations/command-view/utils/transformCommandViewData.d.ts +1 -1
  32. package/dist/hooks/published.d.ts +1 -1
  33. package/dist/hooks/published.js +3 -3
  34. package/dist/index.d.ts +2 -2
  35. package/dist/index.js +4 -4
  36. package/dist/knowledge/index.d.ts +68 -6
  37. package/dist/knowledge/index.js +348 -79
  38. package/dist/layout/index.js +3 -3
  39. package/dist/organization/index.js +3 -3
  40. package/dist/provider/index.d.ts +2 -2
  41. package/dist/provider/index.js +3 -3
  42. package/dist/provider/published.d.ts +2 -2
  43. package/dist/provider/published.js +3 -3
  44. package/dist/test-utils/index.js +3 -3
  45. package/dist/types/index.d.ts +1 -1
  46. package/dist/utils/index.d.ts +1 -1
  47. package/dist/utils/index.js +1 -1
  48. package/package.json +5 -5
@@ -1,5 +1,5 @@
1
- import { SemanticIcon, getKnowledgeIconToken, PageContainer, getKnowledgeGraphNodeCommand, IdentityDomainSchema, WorkflowResourceEntrySchema, AgentResourceEntrySchema, IntegrationResourceEntrySchema, ScriptResourceEntrySchema, getKnowledgeNodeReadCommand, getKnowledgeOntologyProjection, getPrimaryOntologyItemsForDomain, projectNavigationSurfaces, projectNavigationGroups, SurfaceDefinitionSchema, RoleSchema, PolicySchema, getOntologyDomainLabel, getKnowledgeDomainFolderCommand, getKnowledgeTreeFolderCommand, KNOWLEDGE_DOMAINS_WITH_PANELS } from '../chunk-FLQKWUSH.js';
2
- export { KNOWLEDGE_ICON_TOKEN_BY_KIND, KnowledgeSearchBar, KnowledgeTree, OM_NESTED_TREE_GROUPS, OM_TREE_GROUPS, SemanticIcon, extendSemanticIconRegistry, findOmTreeGroup, getKnowledgeIconToken, getSemanticIconComponent, getSharedOrganizationGraph, resolveSemanticIconComponent } from '../chunk-FLQKWUSH.js';
1
+ import { getConceptDefinition, normaliseConceptKey, SemanticIcon, getKnowledgeIconToken, PageContainer, getKnowledgeGraphNodeCommand, IdentityDomainSchema, WorkflowResourceEntrySchema, AgentResourceEntrySchema, IntegrationResourceEntrySchema, ScriptResourceEntrySchema, getKnowledgeNodeReadCommand, getKnowledgeOntologyProjection, getPrimaryOntologyItemsForDomain, projectNavigationSurfaces, projectNavigationGroups, SurfaceDefinitionSchema, RoleSchema, PolicySchema, getOntologyDomainLabel, getKnowledgeDomainFolderCommand, getKnowledgeTreeFolderCommand, KNOWLEDGE_DOMAINS_WITH_PANELS } from '../chunk-FVI3AMBM.js';
2
+ export { FILTERABLE_DOMAIN_KEYS, KNOWLEDGE_DOMAINS_WITH_PANELS, KNOWLEDGE_ICON_TOKEN_BY_KIND, KnowledgeSearchBar, KnowledgeTree, OM_NESTED_TREE_GROUPS, OM_TREE_GROUPS, SemanticIcon, buildKnowledgeOmTreeData, extendSemanticIconRegistry, findKnowledgeTreeNodeByValue, findOmTreeGroup, getKnowledgeIconToken, getSemanticIconComponent, getSharedOrganizationGraph, resolveSemanticIconComponent } from '../chunk-FVI3AMBM.js';
3
3
  import { usePresetsContext } from '../chunk-NZ2F5RQ4.js';
4
4
  import '../chunk-OJJK27GC.js';
5
5
  import '../chunk-AUDNF2Q7.js';
@@ -10,7 +10,7 @@ import '../chunk-SJHM4WDG.js';
10
10
  import '../chunk-ZTWA5H77.js';
11
11
  import '../chunk-S3XR4II4.js';
12
12
  import '../chunk-6DO4PE3O.js';
13
- import '../chunk-L4RIHGPO.js';
13
+ import '../chunk-OFLWSKSC.js';
14
14
  import '../chunk-DD3CCMCZ.js';
15
15
  import '../chunk-GMXGDO3I.js';
16
16
  import '../chunk-2IFYDILW.js';
@@ -19,7 +19,7 @@ import '../chunk-HENXLGVD.js';
19
19
  import '../chunk-7FPLLSHN.js';
20
20
  import '../chunk-RNP5R5I3.js';
21
21
  import '../chunk-W2SFTXMT.js';
22
- import { getSystem, SystemEntrySchema, EntitySchema, ActionSchema, OntologyIdSchema, ontologyGraphNodeId, compileOrganizationOntology, parseOntologyId } from '../chunk-HQPJ6TGV.js';
22
+ import { getSystem, SystemEntrySchema, EntitySchema, ActionSchema, OntologyIdSchema, ontologyGraphNodeId, compileOrganizationOntology, parseOntologyId } from '../chunk-CDZB24OR.js';
23
23
  import '../chunk-KRWALB24.js';
24
24
  import '../chunk-2FTX4WO2.js';
25
25
  import '../chunk-MQZE7SUI.js';
@@ -27,7 +27,7 @@ import '../chunk-TVTSASST.js';
27
27
  import '../chunk-BRJ3QZ4E.js';
28
28
  import '../chunk-I2KLQ2HA.js';
29
29
  import { createContext, Children, isValidElement, cloneElement, useMemo, useContext, useRef, useState, useEffect } from 'react';
30
- import { Card, Text, SimpleGrid, Group, Stack, Alert, Tabs, Box, Table, CopyButton, Tooltip, ActionIcon, Title, Badge, Divider, Button, Paper, TableOfContents, ThemeIcon, UnstyledButton, List, Code, Progress, Loader } from '@mantine/core';
30
+ import { Card, Text, SimpleGrid, Group, Stack, Alert, Tabs, Box, Table, CopyButton, Tooltip, ActionIcon, Title, Badge, Divider, Button, Paper, TableOfContents, ThemeIcon, UnstyledButton, List, Code, Progress, Loader, Spoiler } from '@mantine/core';
31
31
  import { IconBook, IconCheck, IconCopy, IconExternalLink, IconCircleX, IconAlertTriangle, IconInfoCircle } from '@tabler/icons-react';
32
32
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
33
33
  import { Highlight, themes } from 'prism-react-renderer';
@@ -6897,6 +6897,19 @@ function useKnowledgeAllowlist() {
6897
6897
  }
6898
6898
  return ctx;
6899
6899
  }
6900
+ function ConceptTooltip({ conceptKey, variant = "chip", children }) {
6901
+ const definition = getConceptDefinition(conceptKey);
6902
+ if (!definition) {
6903
+ return /* @__PURE__ */ jsx(Fragment, { children });
6904
+ }
6905
+ if (variant === "label") {
6906
+ return /* @__PURE__ */ jsxs(Group, { gap: 4, wrap: "nowrap", align: "center", style: { display: "inline-flex" }, children: [
6907
+ children,
6908
+ /* @__PURE__ */ jsx(Tooltip, { label: definition.description, withArrow: true, multiline: true, maw: 260, children: /* @__PURE__ */ jsx(IconInfoCircle, { size: 12, style: { color: "var(--color-text-subtle)", cursor: "help", flexShrink: 0 } }) })
6909
+ ] });
6910
+ }
6911
+ return /* @__PURE__ */ jsx(Tooltip, { label: definition.description, withArrow: true, multiline: true, maw: 260, children: /* @__PURE__ */ jsx("span", { style: { cursor: "help", display: "inline-flex", width: "fit-content" }, children }) });
6912
+ }
6900
6913
  var KIND_CHIP_TONE_STYLES = {
6901
6914
  subtle: {
6902
6915
  backgroundColor: "var(--color-surface-hover)",
@@ -6915,7 +6928,7 @@ var KIND_CHIP_TONE_STYLES = {
6915
6928
  }
6916
6929
  };
6917
6930
  function KindChip({ kind, tone = "subtle", style, ...spanProps }) {
6918
- return /* @__PURE__ */ jsx(
6931
+ const chip = /* @__PURE__ */ jsx(
6919
6932
  "span",
6920
6933
  {
6921
6934
  ...spanProps,
@@ -6942,6 +6955,9 @@ function KindChip({ kind, tone = "subtle", style, ...spanProps }) {
6942
6955
  children: kind
6943
6956
  }
6944
6957
  );
6958
+ const hasDefinition = Boolean(getConceptDefinition(normaliseConceptKey(kind)));
6959
+ if (!hasDefinition) return chip;
6960
+ return /* @__PURE__ */ jsx(ConceptTooltip, { conceptKey: kind, variant: "chip", children: chip });
6945
6961
  }
6946
6962
  function NodeHeader({
6947
6963
  title,
@@ -6996,7 +7012,7 @@ function EdgeChip({ id, onClick }) {
6996
7012
  }
6997
7013
  function EdgeGroup({ label, ids, onNavigateToNode }) {
6998
7014
  return /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
6999
- /* @__PURE__ */ jsx(Text, { size: "xs", fw: 500, style: { color: "var(--color-text-subtle)" }, children: label }),
7015
+ /* @__PURE__ */ jsx(Text, { component: "span", size: "xs", fw: 500, style: { color: "var(--color-text-subtle)", display: "block" }, children: /* @__PURE__ */ jsx(ConceptTooltip, { conceptKey: label, variant: "label", children: label }) }),
7000
7016
  ids.map((id) => /* @__PURE__ */ jsx(EdgeChip, { id, onClick: onNavigateToNode ? () => onNavigateToNode(id) : void 0 }, id))
7001
7017
  ] });
7002
7018
  }
@@ -7789,7 +7805,7 @@ function SystemDescribeView({
7789
7805
  const ontologyObjectIds = getPrimaryOntologyNodeIds(systemSourceId, organizationModel, "ontology-objects") ?? getContainedOntologyNodeIds(node, graph, "object");
7790
7806
  const ontologyActionIds = getPrimaryOntologyNodeIds(systemSourceId, organizationModel, "ontology-actions") ?? getContainedOntologyNodeIds(node, graph, "action");
7791
7807
  const ontologyCatalogIds = getPrimaryOntologyNodeIds(systemSourceId, organizationModel, "ontology-catalogs") ?? getContainedOntologyNodeIds(node, graph, "catalog");
7792
- const ontologySurfaceIds = getPrimaryOntologyNodeIds(systemSourceId, organizationModel, "ontology-surfaces") ?? getContainedOntologyNodeIds(node, graph, "surface");
7808
+ const ontologyEndpointIds = getPrimaryOntologyNodeIds(systemSourceId, organizationModel, "ontology-endpoints") ?? getContainedOntologyNodeIds(node, graph, "endpoint");
7793
7809
  const uiIcon = system?.ui?.icon ?? system?.icon;
7794
7810
  const uiPath = system?.ui?.path ?? system?.path;
7795
7811
  const uiSurfaces = system?.ui?.surfaces;
@@ -7906,11 +7922,11 @@ function SystemDescribeView({
7906
7922
  onNavigateToNode
7907
7923
  }
7908
7924
  ),
7909
- ontologySurfaceIds.length > 0 && /* @__PURE__ */ jsx(
7925
+ ontologyEndpointIds.length > 0 && /* @__PURE__ */ jsx(
7910
7926
  EdgeGroup,
7911
7927
  {
7912
- label: `Ontology surfaces (${ontologySurfaceIds.length})`,
7913
- ids: ontologySurfaceIds,
7928
+ label: `Ontology endpoints (${ontologyEndpointIds.length})`,
7929
+ ids: ontologyEndpointIds,
7914
7930
  onNavigateToNode
7915
7931
  }
7916
7932
  ),
@@ -8885,31 +8901,66 @@ function SurfaceDescribeView({
8885
8901
  }
8886
8902
  );
8887
8903
  }
8888
- function formatValue(value) {
8889
- if (value === null || value === void 0) return "";
8890
- if (typeof value === "string") return value;
8891
- if (typeof value === "number" || typeof value === "boolean") return String(value);
8904
+ var NESTED_BLOCK_STYLE = {
8905
+ borderLeft: "2px solid var(--color-border)",
8906
+ paddingLeft: "var(--mantine-spacing-sm)"
8907
+ };
8908
+ function isScalar(value) {
8909
+ return typeof value === "string" || typeof value === "number" || typeof value === "boolean";
8910
+ }
8911
+ function isEmpty(value) {
8912
+ if (value === null || value === void 0 || value === "") return true;
8913
+ if (Array.isArray(value)) return value.length === 0;
8914
+ if (typeof value === "object") return Object.keys(value).length === 0;
8915
+ return false;
8916
+ }
8917
+ function isComplex(value) {
8918
+ if (Array.isArray(value)) return !value.every(isScalar);
8919
+ return typeof value === "object" && value !== null;
8920
+ }
8921
+ function hasRenderableEntries(record) {
8922
+ if (!record) return false;
8923
+ return Object.values(record).some((value) => !isEmpty(value));
8924
+ }
8925
+ function JsonValueView({ value, depth = 0 }) {
8926
+ if (isEmpty(value)) return null;
8927
+ if (isScalar(value)) {
8928
+ return /* @__PURE__ */ jsx(Text, { size: "sm", style: { whiteSpace: "pre-wrap", wordBreak: "break-word" }, children: String(value) });
8929
+ }
8892
8930
  if (Array.isArray(value)) {
8893
- const items = value.map(
8894
- (item) => typeof item === "string" || typeof item === "number" || typeof item === "boolean" ? String(item) : JSON.stringify(item)
8895
- );
8896
- return items.join(", ");
8931
+ if (value.every(isScalar)) {
8932
+ return /* @__PURE__ */ jsx(Group, { gap: 6, wrap: "wrap", children: value.map((item, idx) => /* @__PURE__ */ jsx(KindChip, { kind: String(item), tone: "muted" }, idx)) });
8933
+ }
8934
+ return /* @__PURE__ */ jsx(Stack, { gap: "xs", children: value.map((item, idx) => /* @__PURE__ */ jsx(Box, { style: NESTED_BLOCK_STYLE, children: /* @__PURE__ */ jsx(JsonValueView, { value: item, depth: depth + 1 }) }, idx)) });
8935
+ }
8936
+ return /* @__PURE__ */ jsx(RecordRows, { record: value, gap: 6 });
8937
+ }
8938
+ function NestedRow({ label, value, depth }) {
8939
+ if (!isComplex(value)) {
8940
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8 }, children: [
8941
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", style: { minWidth: 140, flexShrink: 0 }, children: label }),
8942
+ /* @__PURE__ */ jsx("div", { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ jsx(JsonValueView, { value, depth: depth + 1 }) })
8943
+ ] });
8897
8944
  }
8898
- return JSON.stringify(value, null, 2);
8945
+ return /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
8946
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", children: label }),
8947
+ /* @__PURE__ */ jsx(Box, { style: { paddingLeft: "var(--mantine-spacing-xs)" }, children: /* @__PURE__ */ jsx(JsonValueView, { value, depth: depth + 1 }) })
8948
+ ] });
8949
+ }
8950
+ function RecordRows({ record, gap = "xs", depth = 0 }) {
8951
+ if (!record) return null;
8952
+ const entries = Object.entries(record).filter(([, value]) => !isEmpty(value));
8953
+ if (entries.length === 0) return null;
8954
+ return /* @__PURE__ */ jsx(Stack, { gap, children: entries.map(([key, value]) => /* @__PURE__ */ jsx(NestedRow, { label: key, value, depth }, key)) });
8899
8955
  }
8900
8956
  function AdditionalProperties({ domain, knownKeys }) {
8901
8957
  const knownSet = new Set(knownKeys);
8902
- const extras = Object.entries(domain).filter(
8903
- ([key, value]) => !knownSet.has(key) && value !== void 0 && value !== null && value !== ""
8904
- );
8905
- if (extras.length === 0) return null;
8958
+ const extras = Object.fromEntries(Object.entries(domain).filter(([key]) => !knownSet.has(key)));
8959
+ if (!hasRenderableEntries(extras)) return null;
8906
8960
  return /* @__PURE__ */ jsxs(Fragment, { children: [
8907
8961
  /* @__PURE__ */ jsx(Divider, {}),
8908
8962
  /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, c: "dimmed", tt: "uppercase", style: { letterSpacing: "0.05em" }, children: "Additional Properties" }),
8909
- /* @__PURE__ */ jsx(Stack, { gap: "xs", children: extras.map(([key, value]) => /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8 }, children: [
8910
- /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", style: { minWidth: 140, flexShrink: 0 }, children: key }),
8911
- /* @__PURE__ */ jsx(Text, { size: "sm", style: { flex: 1, whiteSpace: "pre-wrap", wordBreak: "break-word" }, children: formatValue(value) })
8912
- ] }, key)) })
8963
+ /* @__PURE__ */ jsx(RecordRows, { record: extras })
8913
8964
  ] });
8914
8965
  }
8915
8966
  var BRANDING_KNOWN_KEYS = [
@@ -9076,10 +9127,167 @@ function ThemeSwatchRow({ tokens }) {
9076
9127
  /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", ta: "center", children: label })
9077
9128
  ] }, label)) });
9078
9129
  }
9130
+ function RecordSection({ title, record }) {
9131
+ if (!record) return null;
9132
+ if (!hasRenderableEntries(record)) return null;
9133
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
9134
+ /* @__PURE__ */ jsx(Divider, {}),
9135
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, c: "dimmed", tt: "uppercase", style: { letterSpacing: "0.05em" }, children: title }),
9136
+ /* @__PURE__ */ jsx(RecordRows, { record })
9137
+ ] });
9138
+ }
9139
+ var IDENTITY_KNOWN_KEYS = [
9140
+ "organizationName",
9141
+ "shortName",
9142
+ "clientBrief",
9143
+ "geographicFocus",
9144
+ "timeZone"
9145
+ ];
9146
+ var BRANDING_KNOWN_KEYS2 = ["voice", "tagline", "values", "palette", "typography"];
9147
+ var PROMPTS_KNOWN_KEYS = ["defaultContext"];
9079
9148
  function formatLabel(value) {
9080
9149
  return value.split(/[-_]/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
9081
9150
  }
9082
- function ClientsPanel({ model, filterToItemId }) {
9151
+ function ClientDetail({ client, onNavigateToNode }) {
9152
+ const identity = client.identity;
9153
+ const branding = client.branding;
9154
+ const prompts = client.prompts;
9155
+ const links = client.links;
9156
+ const brandingRecord = branding;
9157
+ const palette = brandingRecord["palette"];
9158
+ const typography = brandingRecord["typography"];
9159
+ const hasBrandingSection = branding.tagline || branding.voice || branding.values && branding.values.length > 0 || palette || typography;
9160
+ const hasLinksSection = links.projectIds && links.projectIds.length > 0 || links.primaryCompanyId || links.primaryContactId || links.sourceDealId;
9161
+ return /* @__PURE__ */ jsxs(Stack, { p: "md", gap: "md", children: [
9162
+ /* @__PURE__ */ jsx(
9163
+ KnowledgePageHeader,
9164
+ {
9165
+ title: client.name,
9166
+ kind: "Client",
9167
+ tone: "subtle",
9168
+ copyCommand: getKnowledgeDomainFolderCommand("clients")
9169
+ }
9170
+ ),
9171
+ /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "wrap", children: [
9172
+ /* @__PURE__ */ jsx(Badge, { variant: "light", size: "sm", children: formatLabel(client.status) }),
9173
+ client.source ? /* @__PURE__ */ jsx(Badge, { variant: "outline", size: "sm", children: formatLabel(client.source) }) : null,
9174
+ /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", children: client.slug })
9175
+ ] }),
9176
+ /* @__PURE__ */ jsx(Divider, {}),
9177
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, c: "dimmed", tt: "uppercase", style: { letterSpacing: "0.05em" }, children: "Identity" }),
9178
+ /* @__PURE__ */ jsxs(Stack, { gap: "xs", children: [
9179
+ identity.organizationName ? /* @__PURE__ */ jsx(FieldRow, { label: "Organization", value: identity.organizationName }) : null,
9180
+ identity.shortName ? /* @__PURE__ */ jsx(FieldRow, { label: "Short Name", value: identity.shortName }) : null,
9181
+ identity.geographicFocus && identity.geographicFocus.length > 0 ? /* @__PURE__ */ jsx(FieldRow, { label: "Geographic Focus", value: identity.geographicFocus.join(", ") }) : null,
9182
+ identity.timeZone && identity.timeZone !== "UTC" ? /* @__PURE__ */ jsx(FieldRow, { label: "Time Zone", value: identity.timeZone }) : null,
9183
+ identity.clientBrief ? /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
9184
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", children: "Brief" }),
9185
+ /* @__PURE__ */ jsx(Card, { withBorder: true, padding: "sm", style: { background: "var(--color-surface)" }, children: /* @__PURE__ */ jsx(Text, { size: "sm", style: { whiteSpace: "pre-wrap", lineHeight: 1.6 }, children: identity.clientBrief }) })
9186
+ ] }) : null
9187
+ ] }),
9188
+ /* @__PURE__ */ jsx(AdditionalProperties, { domain: identity, knownKeys: IDENTITY_KNOWN_KEYS }),
9189
+ hasBrandingSection ? /* @__PURE__ */ jsxs(Fragment, { children: [
9190
+ /* @__PURE__ */ jsx(Divider, {}),
9191
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, c: "dimmed", tt: "uppercase", style: { letterSpacing: "0.05em" }, children: "Branding" }),
9192
+ /* @__PURE__ */ jsxs(Stack, { gap: "xs", children: [
9193
+ branding.tagline ? /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
9194
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", children: "Tagline" }),
9195
+ /* @__PURE__ */ jsx(Text, { size: "sm", children: branding.tagline })
9196
+ ] }) : null,
9197
+ branding.voice ? /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
9198
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", children: "Voice" }),
9199
+ /* @__PURE__ */ jsx(Text, { size: "sm", children: branding.voice })
9200
+ ] }) : null,
9201
+ branding.values && branding.values.length > 0 ? /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
9202
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", children: "Values" }),
9203
+ /* @__PURE__ */ jsx(Group, { gap: "xs", wrap: "wrap", children: branding.values.map((v) => /* @__PURE__ */ jsx(Badge, { variant: "light", size: "sm", children: v }, v)) })
9204
+ ] }) : null,
9205
+ palette ? /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
9206
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", children: "Palette" }),
9207
+ /* @__PURE__ */ jsx(PaletteSwatches, { palette })
9208
+ ] }) : null,
9209
+ typography ? /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
9210
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", children: "Typography" }),
9211
+ /* @__PURE__ */ jsx(TypographyRows, { typography })
9212
+ ] }) : null
9213
+ ] }),
9214
+ /* @__PURE__ */ jsx(AdditionalProperties, { domain: brandingRecord, knownKeys: BRANDING_KNOWN_KEYS2 })
9215
+ ] }) : null,
9216
+ prompts.defaultContext ? /* @__PURE__ */ jsxs(Fragment, { children: [
9217
+ /* @__PURE__ */ jsx(Divider, {}),
9218
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, c: "dimmed", tt: "uppercase", style: { letterSpacing: "0.05em" }, children: "Prompts" }),
9219
+ /* @__PURE__ */ jsx(Spoiler, { maxHeight: 200, showLabel: "Show more", hideLabel: "Show less", children: /* @__PURE__ */ jsx(Text, { size: "sm", style: { whiteSpace: "pre-wrap", lineHeight: 1.6 }, children: prompts.defaultContext }) }),
9220
+ /* @__PURE__ */ jsx(AdditionalProperties, { domain: prompts, knownKeys: PROMPTS_KNOWN_KEYS })
9221
+ ] }) : null,
9222
+ hasLinksSection ? /* @__PURE__ */ jsxs(Fragment, { children: [
9223
+ /* @__PURE__ */ jsx(Divider, {}),
9224
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, c: "dimmed", tt: "uppercase", style: { letterSpacing: "0.05em" }, children: "Links" }),
9225
+ /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
9226
+ links.projectIds && links.projectIds.length > 0 ? /* @__PURE__ */ jsx(
9227
+ EdgeGroup,
9228
+ {
9229
+ label: `Project IDs (${links.projectIds.length})`,
9230
+ ids: links.projectIds,
9231
+ onNavigateToNode
9232
+ }
9233
+ ) : null,
9234
+ links.primaryCompanyId ? /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
9235
+ /* @__PURE__ */ jsx(Text, { size: "xs", fw: 500, style: { color: "var(--color-text-subtle)" }, children: "Primary Company" }),
9236
+ /* @__PURE__ */ jsx(
9237
+ EdgeChip,
9238
+ {
9239
+ id: links.primaryCompanyId,
9240
+ onClick: onNavigateToNode ? () => onNavigateToNode(links.primaryCompanyId) : void 0
9241
+ }
9242
+ )
9243
+ ] }) : null,
9244
+ links.primaryContactId ? /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
9245
+ /* @__PURE__ */ jsx(Text, { size: "xs", fw: 500, style: { color: "var(--color-text-subtle)" }, children: "Primary Contact" }),
9246
+ /* @__PURE__ */ jsx(
9247
+ EdgeChip,
9248
+ {
9249
+ id: links.primaryContactId,
9250
+ onClick: onNavigateToNode ? () => onNavigateToNode(links.primaryContactId) : void 0
9251
+ }
9252
+ )
9253
+ ] }) : null,
9254
+ links.sourceDealId ? /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
9255
+ /* @__PURE__ */ jsx(Text, { size: "xs", fw: 500, style: { color: "var(--color-text-subtle)" }, children: "Source Deal" }),
9256
+ /* @__PURE__ */ jsx(
9257
+ EdgeChip,
9258
+ {
9259
+ id: links.sourceDealId,
9260
+ onClick: onNavigateToNode ? () => onNavigateToNode(links.sourceDealId) : void 0
9261
+ }
9262
+ )
9263
+ ] }) : null
9264
+ ] })
9265
+ ] }) : null,
9266
+ /* @__PURE__ */ jsx(RecordSection, { title: "Config", record: client.config }),
9267
+ /* @__PURE__ */ jsx(RecordSection, { title: "Custom Values", record: client.customValues })
9268
+ ] });
9269
+ }
9270
+ function ClientSummaryCard({ client }) {
9271
+ return /* @__PURE__ */ jsx(Card, { withBorder: true, padding: "md", style: { background: "var(--color-surface)" }, children: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
9272
+ /* @__PURE__ */ jsxs(Group, { gap: "xs", justify: "space-between", wrap: "nowrap", children: [
9273
+ /* @__PURE__ */ jsxs(Stack, { gap: 2, style: { minWidth: 0 }, children: [
9274
+ /* @__PURE__ */ jsx(Text, { fw: 600, size: "sm", lineClamp: 1, children: client.name }),
9275
+ /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", lineClamp: 1, children: client.slug })
9276
+ ] }),
9277
+ /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", style: { flexShrink: 0 }, children: [
9278
+ /* @__PURE__ */ jsx(Badge, { variant: "light", size: "sm", children: formatLabel(client.status) }),
9279
+ client.source ? /* @__PURE__ */ jsx(Badge, { variant: "outline", size: "sm", children: formatLabel(client.source) }) : null
9280
+ ] })
9281
+ ] }),
9282
+ client.identity.clientBrief ? /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: client.identity.clientBrief }) : null,
9283
+ /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "wrap", children: [
9284
+ client.workspace.kind ? /* @__PURE__ */ jsx(Badge, { variant: "light", color: "gray", size: "sm", children: formatLabel(client.workspace.kind) }) : null,
9285
+ client.workspace.owner ? /* @__PURE__ */ jsx(Badge, { variant: "light", color: "gray", size: "sm", children: formatLabel(client.workspace.owner) }) : null,
9286
+ client.workspace.projectId ? /* @__PURE__ */ jsx(Badge, { variant: "light", color: "gray", size: "sm", children: client.workspace.projectId }) : null
9287
+ ] })
9288
+ ] }) }, client.id);
9289
+ }
9290
+ function ClientsPanel({ model, filterToItemId, onNavigateToNode }) {
9083
9291
  const clients = Object.values(model.clients).filter((client) => !filterToItemId || client.id === filterToItemId).sort((left, right) => left.slug.localeCompare(right.slug));
9084
9292
  if (clients.length === 0) {
9085
9293
  return /* @__PURE__ */ jsxs(Stack, { p: "md", gap: "sm", children: [
@@ -9095,6 +9303,9 @@ function ClientsPanel({ model, filterToItemId }) {
9095
9303
  /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: filterToItemId ? "Client profile not found." : "No client profiles defined yet." })
9096
9304
  ] });
9097
9305
  }
9306
+ if (filterToItemId) {
9307
+ return /* @__PURE__ */ jsx(ClientDetail, { client: clients[0], onNavigateToNode });
9308
+ }
9098
9309
  return /* @__PURE__ */ jsxs(Stack, { p: "md", gap: "md", children: [
9099
9310
  /* @__PURE__ */ jsx(
9100
9311
  KnowledgePageHeader,
@@ -9112,26 +9323,43 @@ function ClientsPanel({ model, filterToItemId }) {
9112
9323
  " defined."
9113
9324
  ] }),
9114
9325
  /* @__PURE__ */ jsx(Divider, {}),
9115
- /* @__PURE__ */ jsx(Stack, { gap: "md", children: clients.map((client) => /* @__PURE__ */ jsx(Card, { withBorder: true, padding: "md", style: { background: "var(--color-surface)" }, children: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
9116
- /* @__PURE__ */ jsxs(Group, { gap: "xs", justify: "space-between", wrap: "nowrap", children: [
9117
- /* @__PURE__ */ jsxs(Stack, { gap: 2, style: { minWidth: 0 }, children: [
9118
- /* @__PURE__ */ jsx(Text, { fw: 600, size: "sm", lineClamp: 1, children: client.name }),
9119
- /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", lineClamp: 1, children: client.slug })
9120
- ] }),
9121
- /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", style: { flexShrink: 0 }, children: [
9122
- /* @__PURE__ */ jsx(Badge, { variant: "light", size: "sm", children: formatLabel(client.status) }),
9123
- client.source ? /* @__PURE__ */ jsx(Badge, { variant: "outline", size: "sm", children: formatLabel(client.source) }) : null
9124
- ] })
9125
- ] }),
9126
- client.identity.clientBrief ? /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: client.identity.clientBrief }) : null,
9127
- /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "wrap", children: [
9128
- client.workspace.kind ? /* @__PURE__ */ jsx(Badge, { variant: "light", color: "gray", size: "sm", children: formatLabel(client.workspace.kind) }) : null,
9129
- client.workspace.owner ? /* @__PURE__ */ jsx(Badge, { variant: "light", color: "gray", size: "sm", children: formatLabel(client.workspace.owner) }) : null,
9130
- client.workspace.projectId ? /* @__PURE__ */ jsx(Badge, { variant: "light", color: "gray", size: "sm", children: client.workspace.projectId }) : null
9131
- ] })
9132
- ] }) }, client.id)) })
9326
+ /* @__PURE__ */ jsx(Stack, { gap: "md", children: clients.map((client) => /* @__PURE__ */ jsx(ClientSummaryCard, { client }, client.id)) })
9133
9327
  ] });
9134
9328
  }
9329
+ function FieldRow({ label, value }) {
9330
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8 }, children: [
9331
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", style: { minWidth: 140, flexShrink: 0 }, children: label }),
9332
+ /* @__PURE__ */ jsx(Text, { size: "sm", children: value })
9333
+ ] });
9334
+ }
9335
+ function PaletteSwatches({ palette }) {
9336
+ const entries = Object.entries(palette).filter(([, v]) => typeof v === "string" && v.trim().length > 0);
9337
+ if (entries.length === 0) return null;
9338
+ return /* @__PURE__ */ jsx(Group, { gap: "sm", wrap: "wrap", children: entries.map(([name, color]) => /* @__PURE__ */ jsxs(Stack, { gap: 4, align: "center", style: { minWidth: 56 }, children: [
9339
+ /* @__PURE__ */ jsx(
9340
+ "div",
9341
+ {
9342
+ style: {
9343
+ width: 32,
9344
+ height: 32,
9345
+ borderRadius: 6,
9346
+ backgroundColor: color,
9347
+ border: "1px solid var(--color-border, rgba(0,0,0,0.12))"
9348
+ },
9349
+ title: color
9350
+ }
9351
+ ),
9352
+ /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", ta: "center", children: name })
9353
+ ] }, name)) });
9354
+ }
9355
+ function TypographyRows({ typography }) {
9356
+ const entries = Object.entries(typography).filter(([, v]) => typeof v === "string" && v.trim().length > 0);
9357
+ if (entries.length === 0) return null;
9358
+ return /* @__PURE__ */ jsx(Stack, { gap: "xs", children: entries.map(([name, fontValue]) => /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
9359
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", style: { minWidth: 140 }, children: name }),
9360
+ /* @__PURE__ */ jsx(Text, { size: "sm", style: { fontFamily: fontValue }, children: fontValue })
9361
+ ] }, name)) });
9362
+ }
9135
9363
  function CustomersPanel({ model, filterToItemId }) {
9136
9364
  const customers = model.customers;
9137
9365
  const segments = Object.values(customers).filter((segment) => !filterToItemId || segment.id === filterToItemId).sort((a, b) => a.order - b.order);
@@ -9276,7 +9504,7 @@ function GoalsPanel({ model, filterToItemId }) {
9276
9504
  ] });
9277
9505
  }
9278
9506
  var DAYS_OF_WEEK = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"];
9279
- var IDENTITY_KNOWN_KEYS = [
9507
+ var IDENTITY_KNOWN_KEYS2 = [
9280
9508
  "organizationName",
9281
9509
  "productName",
9282
9510
  "shortName",
@@ -9295,7 +9523,7 @@ var IDENTITY_KNOWN_KEYS = [
9295
9523
  function capitalize(s) {
9296
9524
  return s.charAt(0).toUpperCase() + s.slice(1);
9297
9525
  }
9298
- function FieldRow({ label, value }) {
9526
+ function FieldRow2({ label, value }) {
9299
9527
  return /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8 }, children: [
9300
9528
  /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "dimmed", style: { minWidth: 140, flexShrink: 0 }, children: label }),
9301
9529
  /* @__PURE__ */ jsx(Text, { size: "sm", children: value })
@@ -9321,7 +9549,7 @@ function IdentityPanel({ model }) {
9321
9549
  }
9322
9550
  ),
9323
9551
  /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: "No identity configured." }),
9324
- /* @__PURE__ */ jsx(AdditionalProperties, { domain: identity, knownKeys: IDENTITY_KNOWN_KEYS })
9552
+ /* @__PURE__ */ jsx(AdditionalProperties, { domain: identity, knownKeys: IDENTITY_KNOWN_KEYS2 })
9325
9553
  ] });
9326
9554
  }
9327
9555
  const businessHoursRows = DAYS_OF_WEEK.map((day) => {
@@ -9343,10 +9571,10 @@ function IdentityPanel({ model }) {
9343
9571
  (organizationName || productName || shortName || description) && /* @__PURE__ */ jsxs(Fragment, { children: [
9344
9572
  /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, c: "dimmed", tt: "uppercase", style: { letterSpacing: "0.05em" }, children: "Naming" }),
9345
9573
  /* @__PURE__ */ jsxs(Stack, { gap: "xs", children: [
9346
- organizationName && /* @__PURE__ */ jsx(FieldRow, { label: "Organization Name", value: organizationName }),
9347
- productName && /* @__PURE__ */ jsx(FieldRow, { label: "Product Name", value: productName }),
9348
- shortName && /* @__PURE__ */ jsx(FieldRow, { label: "Short Name", value: shortName }),
9349
- description && /* @__PURE__ */ jsx(FieldRow, { label: "Description", value: description })
9574
+ organizationName && /* @__PURE__ */ jsx(FieldRow2, { label: "Organization Name", value: organizationName }),
9575
+ productName && /* @__PURE__ */ jsx(FieldRow2, { label: "Product Name", value: productName }),
9576
+ shortName && /* @__PURE__ */ jsx(FieldRow2, { label: "Short Name", value: shortName }),
9577
+ description && /* @__PURE__ */ jsx(FieldRow2, { label: "Description", value: description })
9350
9578
  ] })
9351
9579
  ] }),
9352
9580
  /* @__PURE__ */ jsxs(Stack, { gap: "xs", children: [
@@ -9363,12 +9591,12 @@ function IdentityPanel({ model }) {
9363
9591
  /* @__PURE__ */ jsx(Divider, {}),
9364
9592
  /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, c: "dimmed", tt: "uppercase", style: { letterSpacing: "0.05em" }, children: "Legal & Operational" }),
9365
9593
  /* @__PURE__ */ jsxs(Stack, { gap: "xs", children: [
9366
- identity.legalName && /* @__PURE__ */ jsx(FieldRow, { label: "Legal Name", value: identity.legalName }),
9367
- identity.entityType && /* @__PURE__ */ jsx(FieldRow, { label: "Entity Type", value: identity.entityType }),
9368
- identity.jurisdiction && /* @__PURE__ */ jsx(FieldRow, { label: "Jurisdiction", value: identity.jurisdiction }),
9369
- identity.industryCategory && /* @__PURE__ */ jsx(FieldRow, { label: "Industry", value: identity.industryCategory }),
9370
- identity.geographicFocus && /* @__PURE__ */ jsx(FieldRow, { label: "Geographic Focus", value: identity.geographicFocus }),
9371
- identity.timeZone && /* @__PURE__ */ jsx(FieldRow, { label: "Timezone", value: identity.timeZone })
9594
+ identity.legalName && /* @__PURE__ */ jsx(FieldRow2, { label: "Legal Name", value: identity.legalName }),
9595
+ identity.entityType && /* @__PURE__ */ jsx(FieldRow2, { label: "Entity Type", value: identity.entityType }),
9596
+ identity.jurisdiction && /* @__PURE__ */ jsx(FieldRow2, { label: "Jurisdiction", value: identity.jurisdiction }),
9597
+ identity.industryCategory && /* @__PURE__ */ jsx(FieldRow2, { label: "Industry", value: identity.industryCategory }),
9598
+ identity.geographicFocus && /* @__PURE__ */ jsx(FieldRow2, { label: "Geographic Focus", value: identity.geographicFocus }),
9599
+ identity.timeZone && /* @__PURE__ */ jsx(FieldRow2, { label: "Timezone", value: identity.timeZone })
9372
9600
  ] })
9373
9601
  ] }),
9374
9602
  hasBusinessHours && /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -9392,7 +9620,7 @@ function IdentityPanel({ model }) {
9392
9620
  /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, c: "dimmed", tt: "uppercase", style: { letterSpacing: "0.05em" }, children: "Client Brief" }),
9393
9621
  /* @__PURE__ */ jsx(Card, { withBorder: true, padding: "sm", style: { background: "var(--color-surface)" }, children: /* @__PURE__ */ jsx(Text, { size: "sm", style: { whiteSpace: "pre-wrap", lineHeight: 1.6 }, children: identity.clientBrief }) })
9394
9622
  ] }),
9395
- /* @__PURE__ */ jsx(AdditionalProperties, { domain: identity, knownKeys: IDENTITY_KNOWN_KEYS })
9623
+ /* @__PURE__ */ jsx(AdditionalProperties, { domain: identity, knownKeys: IDENTITY_KNOWN_KEYS2 })
9396
9624
  ] });
9397
9625
  }
9398
9626
  var SURFACE_TYPE_COLORS = {
@@ -9969,16 +10197,14 @@ var SOURCE_COLORS = {
9969
10197
  function formatSource(source) {
9970
10198
  return source === "legacy-bridge" ? "legacy bridge" : source;
9971
10199
  }
9972
- function OntologyStats({
9973
- projection
9974
- }) {
10200
+ function OntologyStats({ projection }) {
9975
10201
  const primaryStats = [
9976
10202
  "ontology-objects",
9977
10203
  "ontology-links",
9978
10204
  "ontology-actions",
9979
10205
  "ontology-catalogs",
9980
10206
  "ontology-events",
9981
- "ontology-surfaces"
10207
+ "ontology-endpoints"
9982
10208
  ];
9983
10209
  const optionalStats = [
9984
10210
  "ontology-interfaces",
@@ -10016,9 +10242,24 @@ function MetadataSummary({ item }) {
10016
10242
  function OntologyPanel({ model, domainKey, filterToItemId }) {
10017
10243
  const projection = getKnowledgeOntologyProjection(model);
10018
10244
  const label = getOntologyDomainLabel(domainKey);
10019
- const items = getPrimaryOntologyItemsForDomain(projection, domainKey).filter(
10020
- (item) => !filterToItemId || item.id === filterToItemId
10021
- );
10245
+ const decodedFilterId = filterToItemId ? (() => {
10246
+ try {
10247
+ return decodeURIComponent(filterToItemId);
10248
+ } catch {
10249
+ return filterToItemId;
10250
+ }
10251
+ })() : void 0;
10252
+ const items = getPrimaryOntologyItemsForDomain(projection, domainKey).filter((item) => {
10253
+ if (!decodedFilterId) return true;
10254
+ const decodedItemId = (() => {
10255
+ try {
10256
+ return decodeURIComponent(item.id);
10257
+ } catch {
10258
+ return item.id;
10259
+ }
10260
+ })();
10261
+ return item.id === decodedFilterId || decodedItemId === decodedFilterId;
10262
+ });
10022
10263
  return /* @__PURE__ */ jsxs(Stack, { p: "md", gap: "md", children: [
10023
10264
  /* @__PURE__ */ jsx(
10024
10265
  KnowledgePageHeader,
@@ -10118,7 +10359,7 @@ function DomainPanel({
10118
10359
  case "ontology-value-types":
10119
10360
  case "ontology-properties":
10120
10361
  case "ontology-groups":
10121
- case "ontology-surfaces":
10362
+ case "ontology-endpoints":
10122
10363
  case "ontology-resources":
10123
10364
  return /* @__PURE__ */ jsx(OntologyPanel, { model, domainKey, filterToItemId });
10124
10365
  default:
@@ -10139,7 +10380,10 @@ function childSummary(child) {
10139
10380
  const count = child.children?.length ?? 0;
10140
10381
  return count > 0 ? `${count} child${count === 1 ? "" : "ren"}` : "No child nodes";
10141
10382
  }
10142
- function GroupOverviewPanel({ node }) {
10383
+ function GroupOverviewPanel({
10384
+ node,
10385
+ onNavigateToNode
10386
+ }) {
10143
10387
  const children = node.children ?? [];
10144
10388
  const copyCommand = node.value ? getKnowledgeTreeFolderCommand(node.value) : void 0;
10145
10389
  return /* @__PURE__ */ jsxs(Stack, { p: "md", gap: "md", children: [
@@ -10154,13 +10398,38 @@ function GroupOverviewPanel({ node }) {
10154
10398
  }
10155
10399
  ),
10156
10400
  /* @__PURE__ */ jsx(Divider, {}),
10157
- children.length === 0 ? /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: "No child branches available." }) : /* @__PURE__ */ jsx(Stack, { gap: "sm", children: children.map((child) => /* @__PURE__ */ jsx(Card, { withBorder: true, padding: "md", children: /* @__PURE__ */ jsxs(Group, { justify: "space-between", align: "start", gap: "md", wrap: "nowrap", children: [
10158
- /* @__PURE__ */ jsxs(Stack, { gap: 4, style: { minWidth: 0 }, children: [
10159
- /* @__PURE__ */ jsx(Text, { fw: 650, size: "sm", lineClamp: 1, children: child.label }),
10160
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", lineClamp: 2, children: childSummary(child) })
10161
- ] }),
10162
- /* @__PURE__ */ jsx(Badge, { variant: "light", color: "gray", style: { flexShrink: 0 }, children: child.nodeType })
10163
- ] }) }, child.value ?? child.id ?? `${child.nodeType}:${child.label}`)) })
10401
+ children.length === 0 ? /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: "No child branches available." }) : /* @__PURE__ */ jsx(Stack, { gap: "sm", children: children.map((child) => {
10402
+ const routeId = child.value;
10403
+ const navigable = Boolean(routeId && onNavigateToNode);
10404
+ const cardKey = routeId ?? child.id ?? `${child.nodeType}:${child.label}`;
10405
+ const cardBody = /* @__PURE__ */ jsxs(Group, { justify: "space-between", align: "start", gap: "md", wrap: "nowrap", children: [
10406
+ /* @__PURE__ */ jsxs(Stack, { gap: 4, style: { minWidth: 0 }, children: [
10407
+ /* @__PURE__ */ jsx(Text, { fw: 650, size: "sm", lineClamp: 1, children: child.label }),
10408
+ /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", lineClamp: 2, children: childSummary(child) })
10409
+ ] }),
10410
+ /* @__PURE__ */ jsx(Badge, { variant: "light", color: "gray", style: { flexShrink: 0 }, children: child.nodeType })
10411
+ ] });
10412
+ if (navigable) {
10413
+ return /* @__PURE__ */ jsx(
10414
+ UnstyledButton,
10415
+ {
10416
+ role: "button",
10417
+ tabIndex: 0,
10418
+ onClick: () => onNavigateToNode(routeId),
10419
+ onKeyDown: (e) => {
10420
+ if (e.key === "Enter" || e.key === " ") {
10421
+ e.preventDefault();
10422
+ onNavigateToNode(routeId);
10423
+ }
10424
+ },
10425
+ style: { cursor: "pointer", width: "100%", textAlign: "left", display: "block" },
10426
+ children: /* @__PURE__ */ jsx(Card, { withBorder: true, padding: "md", children: cardBody })
10427
+ },
10428
+ cardKey
10429
+ );
10430
+ }
10431
+ return /* @__PURE__ */ jsx(Card, { withBorder: true, padding: "md", children: cardBody }, cardKey);
10432
+ }) })
10164
10433
  ] });
10165
10434
  }
10166
10435
  function OntologyDescribeView({
@@ -10213,7 +10482,7 @@ function OntologyDescribeView({
10213
10482
  }
10214
10483
  function renderTreeSelection(node, organizationModel, onNavigateToNode) {
10215
10484
  if (node.nodeType === "group") {
10216
- return /* @__PURE__ */ jsx(GroupOverviewPanel, { node });
10485
+ return /* @__PURE__ */ jsx(GroupOverviewPanel, { node, onNavigateToNode });
10217
10486
  }
10218
10487
  if ((node.nodeType === "domain-collection" || node.nodeType === "domain") && node.domainKey) {
10219
10488
  return /* @__PURE__ */ jsx(DomainPanel, { domainKey: node.domainKey, model: organizationModel, onNavigateToNode });
@@ -10803,7 +11072,7 @@ function DomainPanelDispatcher({
10803
11072
  case "ontology-value-types":
10804
11073
  case "ontology-properties":
10805
11074
  case "ontology-groups":
10806
- case "ontology-surfaces":
11075
+ case "ontology-endpoints":
10807
11076
  case "ontology-resources":
10808
11077
  return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(OntologyPanel, { model, domainKey, filterToItemId }) });
10809
11078
  default: