@ai-matrx/agents 0.7.0 → 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.
- package/CHANGELOG.md +130 -0
- package/dist/catalog/index.cjs +69 -3
- package/dist/catalog/index.cjs.map +1 -1
- package/dist/catalog/index.d.cts +114 -3
- package/dist/catalog/index.d.ts +114 -3
- package/dist/catalog/index.js +69 -3
- package/dist/catalog/index.js.map +1 -1
- package/dist/catalog/react/index.cjs +74 -7
- package/dist/catalog/react/index.cjs.map +1 -1
- package/dist/catalog/react/index.d.cts +120 -8
- package/dist/catalog/react/index.d.ts +120 -8
- package/dist/catalog/react/index.js +74 -7
- package/dist/catalog/react/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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.
|
|
@@ -19,9 +19,20 @@ import { ComponentType, ReactNode, Ref } from 'react';
|
|
|
19
19
|
* default row carries (byte-identical to the ref shape matrx-extend
|
|
20
20
|
* `src/lib/mandates.ts` and matrx-local `desktop/src/lib/mandates.ts`
|
|
21
21
|
* already hand back to their hosts).
|
|
22
|
+
*
|
|
23
|
+
* 🚨 The brand is a STRING LITERAL, never `unique symbol`. This package emits
|
|
24
|
+
* `./catalog` and `./catalog/react` as two separate bundles, so each `.d.ts`
|
|
25
|
+
* carries its own copy of these declarations. A `unique symbol` brand is
|
|
26
|
+
* NOMINAL: two copies of it are unrelated types, so `createAgentCatalog()`
|
|
27
|
+
* from `./catalog` was not assignable to `<AgentCatalogProvider catalog=…>`
|
|
28
|
+
* from `./catalog/react` — the exact two-import wiring the README, the
|
|
29
|
+
* CHANGELOG and every consumer use. A literal brand is structural, so the two
|
|
30
|
+
* copies unify, while a bare `string` still cannot be passed where an
|
|
31
|
+
* `AgentId` is required (which is the whole point of branding). Any future
|
|
32
|
+
* brand in this package follows the same rule.
|
|
22
33
|
*/
|
|
23
34
|
type AgentId = string & {
|
|
24
|
-
readonly __agentId:
|
|
35
|
+
readonly __agentId: "ai-matrx.agent-id";
|
|
25
36
|
};
|
|
26
37
|
/** `agent_type` verbatim. Only `builtin` changes how a row is grouped. */
|
|
27
38
|
type AgentCatalogAgentType = "user" | "builtin";
|
|
@@ -31,6 +42,39 @@ type AgentCatalogAgentType = "user" | "builtin";
|
|
|
31
42
|
* itself rather than being coerced into a wrong one.
|
|
32
43
|
*/
|
|
33
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
|
+
}
|
|
34
78
|
/**
|
|
35
79
|
* One `agx_get_list_full()` row, camelCased. Nineteen columns, no more:
|
|
36
80
|
* anything richer needs a different read and is a different type.
|
|
@@ -55,6 +99,12 @@ interface AgentSummary {
|
|
|
55
99
|
isOwner: boolean | null;
|
|
56
100
|
accessLevel: AgentAccessLevel | null;
|
|
57
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;
|
|
58
108
|
/**
|
|
59
109
|
* Set only on a mandate default row — the key it resolved through, so a
|
|
60
110
|
* host can tell "the default" from a stored agent without parsing the id.
|
|
@@ -62,6 +112,21 @@ interface AgentSummary {
|
|
|
62
112
|
mandateKey?: string;
|
|
63
113
|
}
|
|
64
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
|
+
}[];
|
|
65
130
|
/** Which ownership tab is active in the agent list. */
|
|
66
131
|
type AgentTab = "mine" | "shared" | "all" | "system";
|
|
67
132
|
/** Favorite filter. */
|
|
@@ -248,6 +313,18 @@ interface AgentCatalogSchemaReport {
|
|
|
248
313
|
answered: string[];
|
|
249
314
|
/** True when `agent.definition.is_favorite` is writable by this caller. */
|
|
250
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;
|
|
251
328
|
}
|
|
252
329
|
interface AssertAgentCatalogSchemaOptions {
|
|
253
330
|
/**
|
|
@@ -634,12 +711,8 @@ declare function AgentListInlinePicker({ consumerId, onSelect, activeAgentId, cl
|
|
|
634
711
|
* catalog/react/types.ts — VERBATIM port of matrx-frontend
|
|
635
712
|
* `features/agents/components/agent-listings/core/types.ts`.
|
|
636
713
|
*/
|
|
637
|
-
|
|
638
714
|
type RightPanel = "detail" | "sort" | "categories" | "tags" | null;
|
|
639
|
-
|
|
640
|
-
value: AgentSortOption;
|
|
641
|
-
label: string;
|
|
642
|
-
}[];
|
|
715
|
+
|
|
643
716
|
declare const PANEL_HEIGHT = "528px";
|
|
644
717
|
/**
|
|
645
718
|
* 🚨 THE PANEL NEVER OUTGROWS THE SPACE IT HAS.
|
|
@@ -805,4 +878,43 @@ declare function SidePanelHeader({ title, onClose, }: {
|
|
|
805
878
|
onClose: () => void;
|
|
806
879
|
}): react.JSX.Element;
|
|
807
880
|
|
|
808
|
-
|
|
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.
|
|
@@ -19,9 +19,20 @@ import { ComponentType, ReactNode, Ref } from 'react';
|
|
|
19
19
|
* default row carries (byte-identical to the ref shape matrx-extend
|
|
20
20
|
* `src/lib/mandates.ts` and matrx-local `desktop/src/lib/mandates.ts`
|
|
21
21
|
* already hand back to their hosts).
|
|
22
|
+
*
|
|
23
|
+
* 🚨 The brand is a STRING LITERAL, never `unique symbol`. This package emits
|
|
24
|
+
* `./catalog` and `./catalog/react` as two separate bundles, so each `.d.ts`
|
|
25
|
+
* carries its own copy of these declarations. A `unique symbol` brand is
|
|
26
|
+
* NOMINAL: two copies of it are unrelated types, so `createAgentCatalog()`
|
|
27
|
+
* from `./catalog` was not assignable to `<AgentCatalogProvider catalog=…>`
|
|
28
|
+
* from `./catalog/react` — the exact two-import wiring the README, the
|
|
29
|
+
* CHANGELOG and every consumer use. A literal brand is structural, so the two
|
|
30
|
+
* copies unify, while a bare `string` still cannot be passed where an
|
|
31
|
+
* `AgentId` is required (which is the whole point of branding). Any future
|
|
32
|
+
* brand in this package follows the same rule.
|
|
22
33
|
*/
|
|
23
34
|
type AgentId = string & {
|
|
24
|
-
readonly __agentId:
|
|
35
|
+
readonly __agentId: "ai-matrx.agent-id";
|
|
25
36
|
};
|
|
26
37
|
/** `agent_type` verbatim. Only `builtin` changes how a row is grouped. */
|
|
27
38
|
type AgentCatalogAgentType = "user" | "builtin";
|
|
@@ -31,6 +42,39 @@ type AgentCatalogAgentType = "user" | "builtin";
|
|
|
31
42
|
* itself rather than being coerced into a wrong one.
|
|
32
43
|
*/
|
|
33
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
|
+
}
|
|
34
78
|
/**
|
|
35
79
|
* One `agx_get_list_full()` row, camelCased. Nineteen columns, no more:
|
|
36
80
|
* anything richer needs a different read and is a different type.
|
|
@@ -55,6 +99,12 @@ interface AgentSummary {
|
|
|
55
99
|
isOwner: boolean | null;
|
|
56
100
|
accessLevel: AgentAccessLevel | null;
|
|
57
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;
|
|
58
108
|
/**
|
|
59
109
|
* Set only on a mandate default row — the key it resolved through, so a
|
|
60
110
|
* host can tell "the default" from a stored agent without parsing the id.
|
|
@@ -62,6 +112,21 @@ interface AgentSummary {
|
|
|
62
112
|
mandateKey?: string;
|
|
63
113
|
}
|
|
64
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
|
+
}[];
|
|
65
130
|
/** Which ownership tab is active in the agent list. */
|
|
66
131
|
type AgentTab = "mine" | "shared" | "all" | "system";
|
|
67
132
|
/** Favorite filter. */
|
|
@@ -248,6 +313,18 @@ interface AgentCatalogSchemaReport {
|
|
|
248
313
|
answered: string[];
|
|
249
314
|
/** True when `agent.definition.is_favorite` is writable by this caller. */
|
|
250
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;
|
|
251
328
|
}
|
|
252
329
|
interface AssertAgentCatalogSchemaOptions {
|
|
253
330
|
/**
|
|
@@ -634,12 +711,8 @@ declare function AgentListInlinePicker({ consumerId, onSelect, activeAgentId, cl
|
|
|
634
711
|
* catalog/react/types.ts — VERBATIM port of matrx-frontend
|
|
635
712
|
* `features/agents/components/agent-listings/core/types.ts`.
|
|
636
713
|
*/
|
|
637
|
-
|
|
638
714
|
type RightPanel = "detail" | "sort" | "categories" | "tags" | null;
|
|
639
|
-
|
|
640
|
-
value: AgentSortOption;
|
|
641
|
-
label: string;
|
|
642
|
-
}[];
|
|
715
|
+
|
|
643
716
|
declare const PANEL_HEIGHT = "528px";
|
|
644
717
|
/**
|
|
645
718
|
* 🚨 THE PANEL NEVER OUTGROWS THE SPACE IT HAS.
|
|
@@ -805,4 +878,43 @@ declare function SidePanelHeader({ title, onClose, }: {
|
|
|
805
878
|
onClose: () => void;
|
|
806
879
|
}): react.JSX.Element;
|
|
807
880
|
|
|
808
|
-
|
|
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,
|