@ai-matrx/agents 0.7.1 → 0.8.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.
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { ComponentType, ReactNode, Ref } from 'react';
2
+ import { ComponentType, ReactNode, Ref, SVGProps } from 'react';
3
3
 
4
4
  /**
5
5
  * `@ai-matrx/agents/catalog` — the row shape and the per-consumer view state.
@@ -42,6 +42,39 @@ type AgentCatalogAgentType = "user" | "builtin";
42
42
  * itself rather than being coerced into a wrong one.
43
43
  */
44
44
  type AgentAccessLevel = "owner" | "admin" | "editor" | "viewer" | "system" | (string & {});
45
+ /**
46
+ * Present on a catalog row ONLY when that agent is an **Orchestra** — a
47
+ * conductor that delegates to member agents at run time. Choosing one for a
48
+ * step, a chat or a workflow node runs the whole ensemble, so a person has to
49
+ * be able to SEE that before choosing, not discover it from the run.
50
+ *
51
+ * The DB decides. `agx_get_list_full` / `agx_get_list` / `agx_search` build
52
+ * this from `platform.associations` (the conductor self-edge plus its member
53
+ * edges) in one `agx_orchestra_badges()` join — never a second fetch, and
54
+ * never a per-row read. `null` for every ordinary agent.
55
+ *
56
+ * History: the badge lived only in the Python `GET /agents` route, so every
57
+ * client lost it when the pickers moved to the RPC. It is a ROW FIELD now, in
58
+ * the one read every client shares.
59
+ */
60
+ interface OrchestraBadge {
61
+ /** How the ensemble runs: `supervisor` | `sequential` | `parallel` | `dag`, or a future mode verbatim. */
62
+ mode: string;
63
+ /** The composition's one-line description, when its author wrote one. */
64
+ tagline: string | null;
65
+ /**
66
+ * The per-composition delegation-depth budget AS DECLARED, or `null` when
67
+ * the composition declares none. Deliberately NOT defaulted here: the
68
+ * platform's fallback ceiling is enforced by the server that runs the
69
+ * ensemble, and a badge that invented a number would be reporting a promise
70
+ * nobody made.
71
+ */
72
+ depthBudget: number | null;
73
+ /** Member edges. From the ROW count, so an unlabelled ensemble still counts. */
74
+ memberCount: number;
75
+ /** Only REAL role titles — an ensemble with unlabelled edges yields `[]`. */
76
+ memberTitles: string[];
77
+ }
45
78
  /**
46
79
  * One `agx_get_list_full()` row, camelCased. Nineteen columns, no more:
47
80
  * anything richer needs a different read and is a different type.
@@ -66,6 +99,12 @@ interface AgentSummary {
66
99
  isOwner: boolean | null;
67
100
  accessLevel: AgentAccessLevel | null;
68
101
  sharedByEmail: string | null;
102
+ /**
103
+ * The Orchestra badge, or `null` for an ordinary agent. Strict: every row
104
+ * carries the key, so a surface reads `agent.orchestra` and never has to ask
105
+ * whether the column existed.
106
+ */
107
+ orchestra: OrchestraBadge | null;
69
108
  /**
70
109
  * Set only on a mandate default row — the key it resolved through, so a
71
110
  * host can tell "the default" from a stored agent without parsing the id.
@@ -73,6 +112,21 @@ interface AgentSummary {
73
112
  mandateKey?: string;
74
113
  }
75
114
  type AgentSortOption = "updated-desc" | "created-desc" | "name-asc" | "name-desc" | "category-asc";
115
+ /**
116
+ * The sort choices a picker offers, in order. PURE DATA, so it lives in the
117
+ * pure entry: a server-reachable manifest reads it at module scope, and
118
+ * importing it from the client-stamped `./catalog/react` bundle dragged React
119
+ * into a server graph for the sake of five string pairs. `./catalog/react`
120
+ * re-exports it unchanged, so no consumer has to move.
121
+ *
122
+ * (Written "client-stamped", never with the literal directive: this comment is
123
+ * emitted into `dist/catalog/index.d.ts`, and the tarball canary rightly
124
+ * refuses that directive anywhere in a PURE entry.)
125
+ */
126
+ declare const SORT_OPTIONS: {
127
+ value: AgentSortOption;
128
+ label: string;
129
+ }[];
76
130
  /** Which ownership tab is active in the agent list. */
77
131
  type AgentTab = "mine" | "shared" | "all" | "system";
78
132
  /** Favorite filter. */
@@ -259,6 +313,18 @@ interface AgentCatalogSchemaReport {
259
313
  answered: string[];
260
314
  /** True when `agent.definition.is_favorite` is writable by this caller. */
261
315
  favoriteWritable: boolean | null;
316
+ /**
317
+ * Whether `agx_get_list_full` carries the `orchestra` badge column (added to
318
+ * the platform 2026-09-08).
319
+ *
320
+ * NOT a violation when absent — the picker degrades to no conductor marker,
321
+ * which is honest — but it is never SILENT either: a `false` here is the one
322
+ * signal that tells a host "this database predates the badge" instead of
323
+ * leaving someone to wonder why their Orchestra looks like a plain agent.
324
+ * `null` means the probe could not tell (the caller can see no agents at
325
+ * all), never "fine".
326
+ */
327
+ orchestraColumn: boolean | null;
262
328
  }
263
329
  interface AssertAgentCatalogSchemaOptions {
264
330
  /**
@@ -645,12 +711,8 @@ declare function AgentListInlinePicker({ consumerId, onSelect, activeAgentId, cl
645
711
  * catalog/react/types.ts — VERBATIM port of matrx-frontend
646
712
  * `features/agents/components/agent-listings/core/types.ts`.
647
713
  */
648
-
649
714
  type RightPanel = "detail" | "sort" | "categories" | "tags" | null;
650
- declare const SORT_OPTIONS: {
651
- value: AgentSortOption;
652
- label: string;
653
- }[];
715
+
654
716
  declare const PANEL_HEIGHT = "528px";
655
717
  /**
656
718
  * 🚨 THE PANEL NEVER OUTGROWS THE SPACE IT HAS.
@@ -816,4 +878,43 @@ declare function SidePanelHeader({ title, onClose, }: {
816
878
  onClose: () => void;
817
879
  }): react.JSX.Element;
818
880
 
819
- export { type AgentCatalogLinkComponent, AgentCatalogProvider, type AgentCatalogProviderProps, type AgentCatalogRenderModelRef, type AgentCatalogUiPorts, AgentCategoriesPanel, type AgentCategoriesPanelProps, AgentDetailCard, type AgentDetailCardProps, AgentFilterBar, type AgentFilterBarProps, AgentListContent, type AgentListContentProps, type AgentListCoreOptions, AgentListDropdown, type AgentListDropdownProps, AgentListInlinePicker, type AgentListInlinePickerProps, type AgentListTabCounts, AgentListTabs, AgentMobileSubView, type AgentMobileSubViewProps, AgentRow, type AgentRowProps, AgentSortPanel, type AgentSortPanelProps, AgentTagsPanel, type AgentTagsPanelProps, CheckRow, FavoriteAgentButton, FilterChip, HOVER_GRACE_MS, LIST_MAX_HEIGHT, OptionRow, PANEL_HEIGHT, type RightPanel, SORT_OPTIONS, SearchInput, SidePanelHeader, type UseAgentConsumerReturn, coerceVisibleTab, useAgentCatalog, useAgentCatalogRows, useAgentCatalogState, useAgentCatalogUiPorts, useAgentConsumer, useAgentListCore };
881
+ type IconProps = SVGProps<SVGSVGElement> & {
882
+ className?: string;
883
+ };
884
+ /**
885
+ * The Orchestra marker (Lucide `music-4`): the glyph the Workflow Studio's
886
+ * picker used for a conductor, kept identical so the same agent wears the same
887
+ * mark in every client.
888
+ */
889
+ declare function Music4Icon(props: IconProps): react.JSX.Element;
890
+
891
+ /**
892
+ * catalog/orchestra.ts — @ai-matrx/agents/catalog
893
+ *
894
+ * Creator words for an Orchestra badge. A VERBATIM port of the helpers the
895
+ * Workflow Studio's hand-rolled picker carried (`apps/workflow-studio/src/
896
+ * hooks/use-agents.ts` before `c0f958b43`), lifted here so every client says
897
+ * the same sentence about the same ensemble.
898
+ *
899
+ * Pure — no React, no DOM. The row shape is `OrchestraBadge` in `./types`.
900
+ */
901
+
902
+ declare function orchestraModeLabel(mode: string): string;
903
+ /** Human label for a badge: "Orchestra · supervisor · 3 members" (singular-safe). */
904
+ declare function orchestraLabel(badge: OrchestraBadge): string;
905
+ /**
906
+ * The member-call ceiling in Creator language ("Team members can call helpers
907
+ * up to 2 levels deep"), or `null` when the composition declared none. A badge
908
+ * never invents the platform default: the server that runs the ensemble owns
909
+ * that number, and printing a promise nobody made is worse than printing
910
+ * nothing.
911
+ */
912
+ declare function orchestraDepthLine(badge: OrchestraBadge): string | null;
913
+ /**
914
+ * One visible line naming who the Orchestra delegates to, collapsing past
915
+ * `limit` into "+N more". `null` when no member carries a real role title —
916
+ * "Member, Member, Member" is noise that reads like data.
917
+ */
918
+ declare function orchestraDelegatesLine(badge: OrchestraBadge, limit?: number): string | null;
919
+
920
+ export { type AgentCatalogLinkComponent, AgentCatalogProvider, type AgentCatalogProviderProps, type AgentCatalogRenderModelRef, type AgentCatalogUiPorts, AgentCategoriesPanel, type AgentCategoriesPanelProps, AgentDetailCard, type AgentDetailCardProps, AgentFilterBar, type AgentFilterBarProps, AgentListContent, type AgentListContentProps, type AgentListCoreOptions, AgentListDropdown, type AgentListDropdownProps, AgentListInlinePicker, type AgentListInlinePickerProps, type AgentListTabCounts, AgentListTabs, AgentMobileSubView, type AgentMobileSubViewProps, AgentRow, type AgentRowProps, AgentSortPanel, type AgentSortPanelProps, AgentTagsPanel, type AgentTagsPanelProps, CheckRow, FavoriteAgentButton, FilterChip, HOVER_GRACE_MS, type IconProps, LIST_MAX_HEIGHT, Music4Icon, OptionRow, type OrchestraBadge, PANEL_HEIGHT, type RightPanel, SORT_OPTIONS, SearchInput, SidePanelHeader, type UseAgentConsumerReturn, coerceVisibleTab, orchestraDelegatesLine, orchestraDepthLine, orchestraLabel, orchestraModeLabel, useAgentCatalog, useAgentCatalogRows, useAgentCatalogState, useAgentCatalogUiPorts, useAgentConsumer, useAgentListCore };
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { ComponentType, ReactNode, Ref } from 'react';
2
+ import { ComponentType, ReactNode, Ref, SVGProps } from 'react';
3
3
 
4
4
  /**
5
5
  * `@ai-matrx/agents/catalog` — the row shape and the per-consumer view state.
@@ -42,6 +42,39 @@ type AgentCatalogAgentType = "user" | "builtin";
42
42
  * itself rather than being coerced into a wrong one.
43
43
  */
44
44
  type AgentAccessLevel = "owner" | "admin" | "editor" | "viewer" | "system" | (string & {});
45
+ /**
46
+ * Present on a catalog row ONLY when that agent is an **Orchestra** — a
47
+ * conductor that delegates to member agents at run time. Choosing one for a
48
+ * step, a chat or a workflow node runs the whole ensemble, so a person has to
49
+ * be able to SEE that before choosing, not discover it from the run.
50
+ *
51
+ * The DB decides. `agx_get_list_full` / `agx_get_list` / `agx_search` build
52
+ * this from `platform.associations` (the conductor self-edge plus its member
53
+ * edges) in one `agx_orchestra_badges()` join — never a second fetch, and
54
+ * never a per-row read. `null` for every ordinary agent.
55
+ *
56
+ * History: the badge lived only in the Python `GET /agents` route, so every
57
+ * client lost it when the pickers moved to the RPC. It is a ROW FIELD now, in
58
+ * the one read every client shares.
59
+ */
60
+ interface OrchestraBadge {
61
+ /** How the ensemble runs: `supervisor` | `sequential` | `parallel` | `dag`, or a future mode verbatim. */
62
+ mode: string;
63
+ /** The composition's one-line description, when its author wrote one. */
64
+ tagline: string | null;
65
+ /**
66
+ * The per-composition delegation-depth budget AS DECLARED, or `null` when
67
+ * the composition declares none. Deliberately NOT defaulted here: the
68
+ * platform's fallback ceiling is enforced by the server that runs the
69
+ * ensemble, and a badge that invented a number would be reporting a promise
70
+ * nobody made.
71
+ */
72
+ depthBudget: number | null;
73
+ /** Member edges. From the ROW count, so an unlabelled ensemble still counts. */
74
+ memberCount: number;
75
+ /** Only REAL role titles — an ensemble with unlabelled edges yields `[]`. */
76
+ memberTitles: string[];
77
+ }
45
78
  /**
46
79
  * One `agx_get_list_full()` row, camelCased. Nineteen columns, no more:
47
80
  * anything richer needs a different read and is a different type.
@@ -66,6 +99,12 @@ interface AgentSummary {
66
99
  isOwner: boolean | null;
67
100
  accessLevel: AgentAccessLevel | null;
68
101
  sharedByEmail: string | null;
102
+ /**
103
+ * The Orchestra badge, or `null` for an ordinary agent. Strict: every row
104
+ * carries the key, so a surface reads `agent.orchestra` and never has to ask
105
+ * whether the column existed.
106
+ */
107
+ orchestra: OrchestraBadge | null;
69
108
  /**
70
109
  * Set only on a mandate default row — the key it resolved through, so a
71
110
  * host can tell "the default" from a stored agent without parsing the id.
@@ -73,6 +112,21 @@ interface AgentSummary {
73
112
  mandateKey?: string;
74
113
  }
75
114
  type AgentSortOption = "updated-desc" | "created-desc" | "name-asc" | "name-desc" | "category-asc";
115
+ /**
116
+ * The sort choices a picker offers, in order. PURE DATA, so it lives in the
117
+ * pure entry: a server-reachable manifest reads it at module scope, and
118
+ * importing it from the client-stamped `./catalog/react` bundle dragged React
119
+ * into a server graph for the sake of five string pairs. `./catalog/react`
120
+ * re-exports it unchanged, so no consumer has to move.
121
+ *
122
+ * (Written "client-stamped", never with the literal directive: this comment is
123
+ * emitted into `dist/catalog/index.d.ts`, and the tarball canary rightly
124
+ * refuses that directive anywhere in a PURE entry.)
125
+ */
126
+ declare const SORT_OPTIONS: {
127
+ value: AgentSortOption;
128
+ label: string;
129
+ }[];
76
130
  /** Which ownership tab is active in the agent list. */
77
131
  type AgentTab = "mine" | "shared" | "all" | "system";
78
132
  /** Favorite filter. */
@@ -259,6 +313,18 @@ interface AgentCatalogSchemaReport {
259
313
  answered: string[];
260
314
  /** True when `agent.definition.is_favorite` is writable by this caller. */
261
315
  favoriteWritable: boolean | null;
316
+ /**
317
+ * Whether `agx_get_list_full` carries the `orchestra` badge column (added to
318
+ * the platform 2026-09-08).
319
+ *
320
+ * NOT a violation when absent — the picker degrades to no conductor marker,
321
+ * which is honest — but it is never SILENT either: a `false` here is the one
322
+ * signal that tells a host "this database predates the badge" instead of
323
+ * leaving someone to wonder why their Orchestra looks like a plain agent.
324
+ * `null` means the probe could not tell (the caller can see no agents at
325
+ * all), never "fine".
326
+ */
327
+ orchestraColumn: boolean | null;
262
328
  }
263
329
  interface AssertAgentCatalogSchemaOptions {
264
330
  /**
@@ -645,12 +711,8 @@ declare function AgentListInlinePicker({ consumerId, onSelect, activeAgentId, cl
645
711
  * catalog/react/types.ts — VERBATIM port of matrx-frontend
646
712
  * `features/agents/components/agent-listings/core/types.ts`.
647
713
  */
648
-
649
714
  type RightPanel = "detail" | "sort" | "categories" | "tags" | null;
650
- declare const SORT_OPTIONS: {
651
- value: AgentSortOption;
652
- label: string;
653
- }[];
715
+
654
716
  declare const PANEL_HEIGHT = "528px";
655
717
  /**
656
718
  * 🚨 THE PANEL NEVER OUTGROWS THE SPACE IT HAS.
@@ -816,4 +878,43 @@ declare function SidePanelHeader({ title, onClose, }: {
816
878
  onClose: () => void;
817
879
  }): react.JSX.Element;
818
880
 
819
- export { type AgentCatalogLinkComponent, AgentCatalogProvider, type AgentCatalogProviderProps, type AgentCatalogRenderModelRef, type AgentCatalogUiPorts, AgentCategoriesPanel, type AgentCategoriesPanelProps, AgentDetailCard, type AgentDetailCardProps, AgentFilterBar, type AgentFilterBarProps, AgentListContent, type AgentListContentProps, type AgentListCoreOptions, AgentListDropdown, type AgentListDropdownProps, AgentListInlinePicker, type AgentListInlinePickerProps, type AgentListTabCounts, AgentListTabs, AgentMobileSubView, type AgentMobileSubViewProps, AgentRow, type AgentRowProps, AgentSortPanel, type AgentSortPanelProps, AgentTagsPanel, type AgentTagsPanelProps, CheckRow, FavoriteAgentButton, FilterChip, HOVER_GRACE_MS, LIST_MAX_HEIGHT, OptionRow, PANEL_HEIGHT, type RightPanel, SORT_OPTIONS, SearchInput, SidePanelHeader, type UseAgentConsumerReturn, coerceVisibleTab, useAgentCatalog, useAgentCatalogRows, useAgentCatalogState, useAgentCatalogUiPorts, useAgentConsumer, useAgentListCore };
881
+ type IconProps = SVGProps<SVGSVGElement> & {
882
+ className?: string;
883
+ };
884
+ /**
885
+ * The Orchestra marker (Lucide `music-4`): the glyph the Workflow Studio's
886
+ * picker used for a conductor, kept identical so the same agent wears the same
887
+ * mark in every client.
888
+ */
889
+ declare function Music4Icon(props: IconProps): react.JSX.Element;
890
+
891
+ /**
892
+ * catalog/orchestra.ts — @ai-matrx/agents/catalog
893
+ *
894
+ * Creator words for an Orchestra badge. A VERBATIM port of the helpers the
895
+ * Workflow Studio's hand-rolled picker carried (`apps/workflow-studio/src/
896
+ * hooks/use-agents.ts` before `c0f958b43`), lifted here so every client says
897
+ * the same sentence about the same ensemble.
898
+ *
899
+ * Pure — no React, no DOM. The row shape is `OrchestraBadge` in `./types`.
900
+ */
901
+
902
+ declare function orchestraModeLabel(mode: string): string;
903
+ /** Human label for a badge: "Orchestra · supervisor · 3 members" (singular-safe). */
904
+ declare function orchestraLabel(badge: OrchestraBadge): string;
905
+ /**
906
+ * The member-call ceiling in Creator language ("Team members can call helpers
907
+ * up to 2 levels deep"), or `null` when the composition declared none. A badge
908
+ * never invents the platform default: the server that runs the ensemble owns
909
+ * that number, and printing a promise nobody made is worse than printing
910
+ * nothing.
911
+ */
912
+ declare function orchestraDepthLine(badge: OrchestraBadge): string | null;
913
+ /**
914
+ * One visible line naming who the Orchestra delegates to, collapsing past
915
+ * `limit` into "+N more". `null` when no member carries a real role title —
916
+ * "Member, Member, Member" is noise that reads like data.
917
+ */
918
+ declare function orchestraDelegatesLine(badge: OrchestraBadge, limit?: number): string | null;
919
+
920
+ export { type AgentCatalogLinkComponent, AgentCatalogProvider, type AgentCatalogProviderProps, type AgentCatalogRenderModelRef, type AgentCatalogUiPorts, AgentCategoriesPanel, type AgentCategoriesPanelProps, AgentDetailCard, type AgentDetailCardProps, AgentFilterBar, type AgentFilterBarProps, AgentListContent, type AgentListContentProps, type AgentListCoreOptions, AgentListDropdown, type AgentListDropdownProps, AgentListInlinePicker, type AgentListInlinePickerProps, type AgentListTabCounts, AgentListTabs, AgentMobileSubView, type AgentMobileSubViewProps, AgentRow, type AgentRowProps, AgentSortPanel, type AgentSortPanelProps, AgentTagsPanel, type AgentTagsPanelProps, CheckRow, FavoriteAgentButton, FilterChip, HOVER_GRACE_MS, type IconProps, LIST_MAX_HEIGHT, Music4Icon, OptionRow, type OrchestraBadge, PANEL_HEIGHT, type RightPanel, SORT_OPTIONS, SearchInput, SidePanelHeader, type UseAgentConsumerReturn, coerceVisibleTab, orchestraDelegatesLine, orchestraDepthLine, orchestraLabel, orchestraModeLabel, useAgentCatalog, useAgentCatalogRows, useAgentCatalogState, useAgentCatalogUiPorts, useAgentConsumer, useAgentListCore };
@@ -88,6 +88,13 @@ import { useCallback as useCallback2, useEffect, useRef, useState } from "react"
88
88
  function isMandateAgentId(id) {
89
89
  return id.startsWith("mandate:");
90
90
  }
91
+ var SORT_OPTIONS = [
92
+ { value: "updated-desc", label: "Recent" },
93
+ { value: "created-desc", label: "Created" },
94
+ { value: "name-asc", label: "A \u2192 Z" },
95
+ { value: "name-desc", label: "Z \u2192 A" },
96
+ { value: "category-asc", label: "Category" }
97
+ ];
91
98
  var AGENT_NONE_SENTINEL = "__none__";
92
99
  var DEFAULT_AGENT_CONSUMER_STATE = {
93
100
  tab: "mine",
@@ -916,6 +923,14 @@ function AlertTriangleIcon(props) {
916
923
  /* @__PURE__ */ jsx2("path", { d: "M12 17h.01" })
917
924
  ] });
918
925
  }
926
+ function Music4Icon(props) {
927
+ return /* @__PURE__ */ jsxs(Svg, { ...props, children: [
928
+ /* @__PURE__ */ jsx2("path", { d: "M9 18V5l12-2v13" }),
929
+ /* @__PURE__ */ jsx2("path", { d: "m9 9 12-2" }),
930
+ /* @__PURE__ */ jsx2("circle", { cx: "6", cy: "18", r: "3" }),
931
+ /* @__PURE__ */ jsx2("circle", { cx: "18", cy: "16", r: "3" })
932
+ ] });
933
+ }
919
934
 
920
935
  // catalog/react/primitives.tsx
921
936
  import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
@@ -1160,6 +1175,33 @@ function FavoriteAgentButton({
1160
1175
  );
1161
1176
  }
1162
1177
 
1178
+ // catalog/orchestra.ts
1179
+ var ORCHESTRA_MODE_LABEL = {
1180
+ supervisor: "supervisor",
1181
+ sequential: "in order",
1182
+ parallel: "together",
1183
+ dag: "custom flow"
1184
+ };
1185
+ function orchestraModeLabel(mode) {
1186
+ return ORCHESTRA_MODE_LABEL[mode] ?? mode;
1187
+ }
1188
+ function orchestraLabel(badge) {
1189
+ const n = badge.memberCount;
1190
+ return `Orchestra \xB7 ${orchestraModeLabel(badge.mode)} \xB7 ${n} ${n === 1 ? "member" : "members"}`;
1191
+ }
1192
+ function orchestraDepthLine(badge) {
1193
+ const n = badge.depthBudget;
1194
+ if (typeof n !== "number" || n <= 0) return null;
1195
+ return `Team members can call helpers up to ${n} ${n === 1 ? "level" : "levels"} deep`;
1196
+ }
1197
+ function orchestraDelegatesLine(badge, limit = 3) {
1198
+ const titles = badge.memberTitles;
1199
+ if (titles.length === 0) return null;
1200
+ const shown = titles.slice(0, limit);
1201
+ const extra = titles.length - shown.length;
1202
+ return `Delegates to: ${shown.join(", ")}${extra > 0 ? ` +${extra} more` : ""}`;
1203
+ }
1204
+
1163
1205
  // catalog/react/AgentDetailCard.tsx
1164
1206
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
1165
1207
  function AgentDetailCard({ agent, onSelect }) {
@@ -1186,6 +1228,22 @@ function AgentDetailCard({ agent, onSelect }) {
1186
1228
  ] }) }),
1187
1229
  /* @__PURE__ */ jsx6("div", { className: "h-px bg-border mx-3" }),
1188
1230
  /* @__PURE__ */ jsxs4("div", { className: "flex-1 overflow-y-auto px-4 py-3 space-y-3", children: [
1231
+ agent.orchestra && /* @__PURE__ */ jsxs4("div", { className: "rounded-md border border-primary/20 bg-primary/5 px-2.5 py-2", children: [
1232
+ /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-1.5", children: [
1233
+ /* @__PURE__ */ jsx6(Music4Icon, { className: "w-3.5 h-3.5 text-primary shrink-0" }),
1234
+ /* @__PURE__ */ jsx6("span", { className: "text-[11px] font-medium text-primary", children: orchestraLabel(agent.orchestra) })
1235
+ ] }),
1236
+ agent.orchestra.tagline && /* @__PURE__ */ jsx6("p", { className: "mt-1 text-xs text-foreground/80 leading-relaxed", children: agent.orchestra.tagline }),
1237
+ orchestraDelegatesLine(agent.orchestra) && /* @__PURE__ */ jsx6(
1238
+ "p",
1239
+ {
1240
+ className: "mt-1 text-[11px] text-muted-foreground",
1241
+ title: `Delegates to: ${agent.orchestra.memberTitles.join(", ")}`,
1242
+ children: orchestraDelegatesLine(agent.orchestra)
1243
+ }
1244
+ ),
1245
+ orchestraDepthLine(agent.orchestra) && /* @__PURE__ */ jsx6("p", { className: "mt-0.5 text-[11px] text-muted-foreground", children: orchestraDepthLine(agent.orchestra) })
1246
+ ] }),
1189
1247
  agent.description && /* @__PURE__ */ jsxs4("div", { children: [
1190
1248
  /* @__PURE__ */ jsx6("p", { className: "text-[11px] font-medium text-muted-foreground uppercase tracking-wider mb-1", children: "Description" }),
1191
1249
  /* @__PURE__ */ jsx6("p", { className: "text-xs text-foreground/80 leading-relaxed", children: agent.description })
@@ -1302,13 +1360,6 @@ var iconButtonClass = "flex items-center justify-center h-7 w-7 rounded-md borde
1302
1360
  import { useEffect as useEffect3, useRef as useRef3 } from "react";
1303
1361
 
1304
1362
  // catalog/react/types.ts
1305
- var SORT_OPTIONS = [
1306
- { value: "updated-desc", label: "Recent" },
1307
- { value: "created-desc", label: "Created" },
1308
- { value: "name-asc", label: "A \u2192 Z" },
1309
- { value: "name-desc", label: "Z \u2192 A" },
1310
- { value: "category-asc", label: "Category" }
1311
- ];
1312
1363
  var PANEL_HEIGHT = "528px";
1313
1364
  var LIST_MAX_HEIGHT = "min(528px, var(--radix-popper-available-height, 528px))";
1314
1365
 
@@ -1486,6 +1537,17 @@ function AgentRow({
1486
1537
  children: agent.name || "Untitled"
1487
1538
  }
1488
1539
  ),
1540
+ agent.orchestra && /* @__PURE__ */ jsxs7(
1541
+ "span",
1542
+ {
1543
+ className: "flex shrink-0 items-center gap-0.5 rounded-sm bg-primary/10 px-1 py-px text-[9px] font-medium text-primary",
1544
+ title: orchestraDelegatesLine(agent.orchestra) ?? orchestraLabel(agent.orchestra),
1545
+ children: [
1546
+ /* @__PURE__ */ jsx9(Music4Icon, { className: "w-2.5 h-2.5" }),
1547
+ agent.orchestra.memberCount
1548
+ ]
1549
+ }
1550
+ ),
1489
1551
  agent.agentType === "builtin" ? /* @__PURE__ */ jsx9("span", { className: "text-[9px] font-medium text-primary bg-primary/10 px-1 py-px rounded shrink-0 ml-auto", children: labels.systemBadge }) : agent.isOwner === false ? /* @__PURE__ */ jsx9("span", { className: "text-[9px] text-muted-foreground bg-muted px-1 py-px rounded shrink-0 ml-auto", children: "shared" }) : null
1490
1552
  ]
1491
1553
  }
@@ -2324,12 +2386,17 @@ export {
2324
2386
  FilterChip,
2325
2387
  HOVER_GRACE_MS,
2326
2388
  LIST_MAX_HEIGHT,
2389
+ Music4Icon,
2327
2390
  OptionRow,
2328
2391
  PANEL_HEIGHT,
2329
2392
  SORT_OPTIONS,
2330
2393
  SearchInput,
2331
2394
  SidePanelHeader,
2332
2395
  coerceVisibleTab,
2396
+ orchestraDelegatesLine,
2397
+ orchestraDepthLine,
2398
+ orchestraLabel,
2399
+ orchestraModeLabel,
2333
2400
  useAgentCatalog,
2334
2401
  useAgentCatalogRows,
2335
2402
  useAgentCatalogState,