@ai-matrx/agents 0.59.151 → 0.59.153
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 +11 -1
- package/README.md +3 -3
- package/dist/catalog/index.cjs +7 -7
- package/dist/catalog/index.d.cts +28 -28
- package/dist/catalog/index.d.ts +28 -28
- package/dist/catalog/index.js +7 -7
- package/dist/catalog/native/index.cjs +1 -1
- package/dist/catalog/native/index.d.cts +16 -16
- package/dist/catalog/native/index.d.ts +16 -16
- package/dist/catalog/native/index.js +1 -1
- package/dist/catalog/react/index.cjs +1 -1
- package/dist/catalog/react/index.d.cts +9 -9
- package/dist/catalog/react/index.d.ts +9 -9
- package/dist/catalog/react/index.js +1 -1
- package/dist/catalog/styles.css +5 -5
- package/dist/content-transfer/index.cjs +2 -2
- package/dist/content-transfer/index.js +2 -2
- package/dist/content-transfer/react/index.cjs +2 -2
- package/dist/content-transfer/react/index.js +2 -2
- package/dist/context/react/index.d.cts +3 -3
- package/dist/context/react/index.d.ts +3 -3
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/mandates/index.cjs +2 -2
- package/dist/mandates/index.d.cts +4 -4
- package/dist/mandates/index.d.ts +4 -4
- package/dist/mandates/index.js +2 -2
- package/dist/mandates/runs.d.cts +1 -1
- package/dist/mandates/runs.d.ts +1 -1
- package/dist/models/index.d.cts +2 -2
- package/dist/models/index.d.ts +2 -2
- package/dist/models/react/index.cjs +1 -1
- package/dist/models/react/index.js +1 -1
- package/dist/quick/index.d.cts +5 -5
- package/dist/quick/index.d.ts +5 -5
- package/dist/settings/index.d.cts +8 -8
- package/dist/settings/index.d.ts +8 -8
- package/dist/skills/index.d.cts +1 -1
- package/dist/skills/index.d.ts +1 -1
- package/dist/skills/react/index.d.cts +1 -1
- package/dist/skills/react/index.d.ts +1 -1
- package/dist/sources/index.d.cts +1 -1
- package/dist/sources/index.d.ts +1 -1
- package/dist/sources/runtime/index.d.cts +2 -2
- package/dist/sources/runtime/index.d.ts +2 -2
- package/dist/tools/index.d.cts +6 -6
- package/dist/tools/index.d.ts +6 -6
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.59.
|
|
3
|
+
## 0.59.153
|
|
4
4
|
|
|
5
5
|
UNVERIFIED: this release has no Unreleased entry and the source comparison could not be made (the caller supplied no source comparison). Whether source changed is unknown; consumer action is unknown.
|
|
6
6
|
Check the package's gitHead on npm against this version's gitHead: `git diff <previous gitHead> <this gitHead> -- apps/shared/matrx-agents/src`.
|
|
7
7
|
|
|
8
|
+
## 0.59.151
|
|
9
|
+
|
|
10
|
+
Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 0746898655 5f3243d496 -- apps/shared/matrx-agents/src`
|
|
11
|
+
has no shipped-source changes outside tests, fixtures and docs). No consumer action required.
|
|
12
|
+
|
|
13
|
+
## 0.59.150
|
|
14
|
+
|
|
15
|
+
Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 14c15decf1 0746898655 -- apps/shared/matrx-agents/src`
|
|
16
|
+
has no shipped-source changes outside tests, fixtures and docs). No consumer action required.
|
|
17
|
+
|
|
8
18
|
## 0.59.149
|
|
9
19
|
|
|
10
20
|
Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 62116d54f1 14c15decf1 -- apps/shared/matrx-agents/src`
|
package/README.md
CHANGED
|
@@ -197,9 +197,9 @@ import { AgentCatalogProvider, AgentListDropdown } from "@ai-matrx/agents/catalo
|
|
|
197
197
|
</AgentCatalogProvider>
|
|
198
198
|
```
|
|
199
199
|
|
|
200
|
-
You get, on every surface and in every app: the complete
|
|
200
|
+
You get, on every surface and in every app: the complete catalog read (owned
|
|
201
201
|
+ shared + org-shared + platform agents), Mine / Shared / All / Public tabs
|
|
202
|
-
with live counts, sort,
|
|
202
|
+
with live counts, sort, favorites (the caller's own stars, read and written in
|
|
203
203
|
`platform.user_entity_state`), category and tag filters,
|
|
204
204
|
local relevance scoring plus server-side search, the current agent pinned on
|
|
205
205
|
top, per-row origin badges, a hover detail panel, a mobile drawer, and a footer
|
|
@@ -215,7 +215,7 @@ utilities are generated:
|
|
|
215
215
|
|
|
216
216
|
**The default row.** Pass `defaultMandateKey` and the picker offers the
|
|
217
217
|
platform default for that Mandate, resolved LIVE through the server and
|
|
218
|
-
|
|
218
|
+
labeled with the Holder's real name — no client ever hardcodes an agent name
|
|
219
219
|
again. Its id is `mandate:<key>`. If the cached name and the live one disagree,
|
|
220
220
|
the picker shows a persistent banner and calls your `notifier`.
|
|
221
221
|
|
package/dist/catalog/index.cjs
CHANGED
|
@@ -295,7 +295,7 @@ async function readAgentCatalogRows(client) {
|
|
|
295
295
|
if (dropped > 0) {
|
|
296
296
|
throw new AgentCatalogReadError(
|
|
297
297
|
"agx_get_list_full",
|
|
298
|
-
`${dropped} row(s) came back without an id and were refused. A row that cannot be identified cannot be selected, so the
|
|
298
|
+
`${dropped} row(s) came back without an id and were refused. A row that cannot be identified cannot be selected, so the catalog is not trustworthy \u2014 check the RPC's return shape.`
|
|
299
299
|
);
|
|
300
300
|
}
|
|
301
301
|
return rows;
|
|
@@ -796,7 +796,7 @@ function createAgentCatalog(config) {
|
|
|
796
796
|
if (!config.client || typeof config.client.rpc !== "function") {
|
|
797
797
|
throw new AgentCatalogConfigError({
|
|
798
798
|
code: "missing_client",
|
|
799
|
-
message: "createAgentCatalog needs a Supabase client \u2014 it IS the
|
|
799
|
+
message: "createAgentCatalog needs a Supabase client \u2014 it IS the catalog read",
|
|
800
800
|
remedy: "pass `client` (a supabase-js client, or anything with rpc() and schema().from())"
|
|
801
801
|
});
|
|
802
802
|
}
|
|
@@ -836,7 +836,7 @@ function createAgentCatalog(config) {
|
|
|
836
836
|
function reportFavoriteReadFailure(message) {
|
|
837
837
|
errorSink({
|
|
838
838
|
code: "favorite_read_failed",
|
|
839
|
-
message: `your starred agents could not be read (${message}); every star is shown unset until the next
|
|
839
|
+
message: `your starred agents could not be read (${message}); every star is shown unset until the next catalog load`,
|
|
840
840
|
context: { catalogId }
|
|
841
841
|
});
|
|
842
842
|
}
|
|
@@ -886,7 +886,7 @@ function createAgentCatalog(config) {
|
|
|
886
886
|
anonymousReported = true;
|
|
887
887
|
errorSink({
|
|
888
888
|
code: "identity_unavailable",
|
|
889
|
-
message: "identity.requireUserId() threw, so the picker is treating this session as signed out and opening on the public
|
|
889
|
+
message: "identity.requireUserId() threw, so the picker is treating this session as signed out and opening on the public catalog. Favoriting is unavailable until a session exists.",
|
|
890
890
|
context: { detail: errorMessage(e) }
|
|
891
891
|
});
|
|
892
892
|
}
|
|
@@ -924,7 +924,7 @@ function createAgentCatalog(config) {
|
|
|
924
924
|
publish({ ...state, status: "failed", error: message });
|
|
925
925
|
errorSink({
|
|
926
926
|
code: "list_read_failed",
|
|
927
|
-
message: `the agent
|
|
927
|
+
message: `the agent catalog could not be read: ${message}`,
|
|
928
928
|
context: { catalogId }
|
|
929
929
|
});
|
|
930
930
|
throw e;
|
|
@@ -970,7 +970,7 @@ function createAgentCatalog(config) {
|
|
|
970
970
|
pinnedFallbackReported = true;
|
|
971
971
|
errorSink({
|
|
972
972
|
code: "pinned_read_unsupported",
|
|
973
|
-
message: `the pinned-agents read fell back to the whole
|
|
973
|
+
message: `the pinned-agents read fell back to the whole catalog (${e.message}); pass a favorites port with list() and a supabase-js client`,
|
|
974
974
|
context: { catalogId }
|
|
975
975
|
});
|
|
976
976
|
}
|
|
@@ -1079,7 +1079,7 @@ function createAgentCatalog(config) {
|
|
|
1079
1079
|
if (!existing) {
|
|
1080
1080
|
errorSink({
|
|
1081
1081
|
code: "favorite_unknown_agent",
|
|
1082
|
-
message: `cannot favorite ${agentId}: it is not in this
|
|
1082
|
+
message: `cannot favorite ${agentId}: it is not in this catalog`
|
|
1083
1083
|
});
|
|
1084
1084
|
return;
|
|
1085
1085
|
}
|
package/dist/catalog/index.d.cts
CHANGED
|
@@ -299,7 +299,7 @@ interface AgentCatalogRpcCall extends PromiseLike<PgResultLike> {
|
|
|
299
299
|
* PostgREST's `in` filter on the function's result rows — how the pinned
|
|
300
300
|
* read asks `agx_get_list_full` for just the starred ids (2026-10-09).
|
|
301
301
|
* OPTIONAL in the structural type: a host bridge without it gets the whole
|
|
302
|
-
*
|
|
302
|
+
* catalog instead, announced through the errorSink.
|
|
303
303
|
*/
|
|
304
304
|
in?(column: string, values: readonly string[]): AgentCatalogRpcCall;
|
|
305
305
|
}
|
|
@@ -313,7 +313,7 @@ interface AgentCatalogRpcCall extends PromiseLike<PgResultLike> {
|
|
|
313
313
|
* the public schema's functions, so a bridge never crashes the pickers.
|
|
314
314
|
*
|
|
315
315
|
* Absent → `createAgentCatalog` throws `AgentCatalogConfigError`. There is no
|
|
316
|
-
* degraded mode: the package IS the
|
|
316
|
+
* degraded mode: the package IS the catalog read.
|
|
317
317
|
*/
|
|
318
318
|
interface AgentCatalogClient {
|
|
319
319
|
schema?(name: string): {
|
|
@@ -367,8 +367,8 @@ interface AgentCatalogFavorites {
|
|
|
367
367
|
/**
|
|
368
368
|
* Every state row the caller owns of one kind (`ues_list`). The pinned read
|
|
369
369
|
* asks for `"favorite"` to learn WHICH agents to read, so a sidebar never
|
|
370
|
-
* pulls the whole
|
|
371
|
-
* without it makes the pinned read fall back to the whole
|
|
370
|
+
* pulls the whole catalog to show a handful of stars. OPTIONAL: a port
|
|
371
|
+
* without it makes the pinned read fall back to the whole catalog, loudly.
|
|
372
372
|
*/
|
|
373
373
|
list?(kind?: "favorite" | "pinned" | "hidden"): Promise<{
|
|
374
374
|
ok: true;
|
|
@@ -394,7 +394,7 @@ interface AgentCatalogFavorites {
|
|
|
394
394
|
* `requireUserId` THROWS when there is no session — never a silent anonymous
|
|
395
395
|
* read. The catalog catches that throw in exactly ONE place (the tab-default
|
|
396
396
|
* heuristic, where a signed-out visitor legitimately lands on the public
|
|
397
|
-
*
|
|
397
|
+
* catalog) and reports it to the `errorSink` the first time; every other
|
|
398
398
|
* caller lets it propagate.
|
|
399
399
|
*/
|
|
400
400
|
interface AgentCatalogIdentity {
|
|
@@ -485,7 +485,7 @@ interface AgentCatalogLabels {
|
|
|
485
485
|
emptyDefault: string;
|
|
486
486
|
emptyShared: string;
|
|
487
487
|
emptySystem: string;
|
|
488
|
-
/** Empty state for a signed-out visitor — there is no
|
|
488
|
+
/** Empty state for a signed-out visitor — there is no catalog to read. */
|
|
489
489
|
emptySignedOut: string;
|
|
490
490
|
loading: string;
|
|
491
491
|
triggerFallback: string;
|
|
@@ -604,7 +604,7 @@ interface ResolvedDefaultRow {
|
|
|
604
604
|
mandateKey: string;
|
|
605
605
|
/** The `agent.definition` id the mandate resolved to. */
|
|
606
606
|
holderId: string;
|
|
607
|
-
/** The holder's REAL name, read from the
|
|
607
|
+
/** The holder's REAL name, read from the catalog — never hardcoded. */
|
|
608
608
|
holderName: string;
|
|
609
609
|
holderDescription: string | null;
|
|
610
610
|
provenance: string;
|
|
@@ -716,7 +716,7 @@ interface AgentCatalogState {
|
|
|
716
716
|
/**
|
|
717
717
|
* The caller's starred rows (`ensureFavoriteRows`): `succeeded` once every
|
|
718
718
|
* starred agent the caller can see is in `byId` — by the narrow pinned read
|
|
719
|
-
* or by a complete
|
|
719
|
+
* or by a complete catalog load, whichever came first.
|
|
720
720
|
*/
|
|
721
721
|
favoriteRowsStatus: AgentCatalogStatus;
|
|
722
722
|
}
|
|
@@ -741,17 +741,17 @@ interface AgentCatalog {
|
|
|
741
741
|
/**
|
|
742
742
|
* The signed-in user id, or `null` when there is no session. The ONE place
|
|
743
743
|
* `identity.requireUserId()`'s throw is caught — a signed-out visitor
|
|
744
|
-
* legitimately lands on the public
|
|
744
|
+
* legitimately lands on the public catalog — and it is reported to the
|
|
745
745
|
* errorSink the first time so it is never silent.
|
|
746
746
|
*/
|
|
747
747
|
getUserIdOrNull(): string | null;
|
|
748
|
-
/** Load the
|
|
748
|
+
/** Load the catalog if it is not fresh. Safe to call on every mount. */
|
|
749
749
|
ensureLoaded(options?: {
|
|
750
750
|
force?: boolean;
|
|
751
751
|
}): Promise<void>;
|
|
752
752
|
/**
|
|
753
753
|
* Load ONLY the caller's starred agents into the registry (the pinned read —
|
|
754
|
-
* `ues_list` then `agx_get_list_full?id=in.(…)`), never the whole
|
|
754
|
+
* `ues_list` then `agx_get_list_full?id=in.(…)`), never the whole catalog.
|
|
755
755
|
* Answered at once when a complete load is fresh. Deduped; safe on every
|
|
756
756
|
* mount. For surfaces that show stars without being a picker (a sidebar's
|
|
757
757
|
* Pinned section): nothing loads the full list until a picker opens.
|
|
@@ -804,11 +804,11 @@ declare function getRegisteredAgentCatalog(catalogId?: string): AgentCatalog | u
|
|
|
804
804
|
*
|
|
805
805
|
* Every database call the catalog makes, and nothing else. Five of them:
|
|
806
806
|
*
|
|
807
|
-
* 1. `agx_get_list_full()` — the complete
|
|
807
|
+
* 1. `agx_get_list_full()` — the complete catalog (owned + directly-shared
|
|
808
808
|
* + org-shared user agents, unioned with active builtins).
|
|
809
809
|
* 2. `agx_search(p_query, p_deep, p_limit, p_offset)` — tier-2 server search.
|
|
810
810
|
* 3. `agx_resolve_agent_address(p_ids)` — the single-agent name read, used
|
|
811
|
-
* when a mandate's Holder is not in the caller's own
|
|
811
|
+
* when a mandate's Holder is not in the caller's own catalog.
|
|
812
812
|
* 4. The caller's stars: `ues_get_bulk('agent', ids)` through the
|
|
813
813
|
* favorites port (`platform.user_entity_state`), overlaid on every row
|
|
814
814
|
* set this module returns to the store.
|
|
@@ -817,12 +817,12 @@ declare function getRegisteredAgentCatalog(catalogId?: string): AgentCatalog | u
|
|
|
817
817
|
* 6. THE PINNED READ (2026-10-09): the caller's starred ids (`ues_list`
|
|
818
818
|
* through the favorites port), then `agx_get_list_full` filtered to
|
|
819
819
|
* exactly those ids (`?id=in.(…)`). A sidebar's Pinned section shows a
|
|
820
|
-
* handful of rows; it never pays for the whole
|
|
820
|
+
* handful of rows; it never pays for the whole catalog to find them.
|
|
821
821
|
*
|
|
822
822
|
* 🚨 THE LIST READ IS COMPLETE OR IT THROWS. PostgREST caps every response at
|
|
823
823
|
* `db-max-rows` (1000 on Matrx Main) and reports success — matrx-frontend's
|
|
824
824
|
* `fetchAgentsListFull` issued a bare `.rpc()` and would silently have
|
|
825
|
-
* returned 1000 rows of a larger
|
|
825
|
+
* returned 1000 rows of a larger catalog (the ~400-builtin truncation
|
|
826
826
|
* incident is the near-miss). Here the read goes through `readAllRows` with
|
|
827
827
|
* `{ count: "exact" }` and a stable `.order("id")`, so a truncation is a
|
|
828
828
|
* loud `IncompleteReadError` instead of a confidently short picker.
|
|
@@ -838,7 +838,7 @@ declare class AgentCatalogReadError extends Error {
|
|
|
838
838
|
constructor(source: string, detail: string);
|
|
839
839
|
}
|
|
840
840
|
/**
|
|
841
|
-
* Read the WHOLE agent
|
|
841
|
+
* Read the WHOLE agent catalog. Throws rather than returning a partial
|
|
842
842
|
* list — see the file header.
|
|
843
843
|
*/
|
|
844
844
|
declare function readAgentCatalogRows(client: AgentCatalogClient): Promise<AgentSummary[]>;
|
|
@@ -859,7 +859,7 @@ declare function searchAgentsOnServer(client: AgentCatalogClient, args: {
|
|
|
859
859
|
}): Promise<AgentServerSearchResult>;
|
|
860
860
|
/**
|
|
861
861
|
* The single-agent read, used when a mandate's resolved Holder is not in the
|
|
862
|
-
* caller's own
|
|
862
|
+
* caller's own catalog (a platform agent nobody has shared, most often).
|
|
863
863
|
*
|
|
864
864
|
* Two existing doors, in order — never a new RPC:
|
|
865
865
|
* 1. `agx_search` with the id as the query. The scorer awards an exact id
|
|
@@ -942,7 +942,7 @@ declare function orchestraDelegatesLine(badge: OrchestraBadge, limit?: number):
|
|
|
942
942
|
* What every client used to do: prepend a placeholder row whose id is
|
|
943
943
|
* `mandate:<key>` and whose name and description are HARDCODED, and let the
|
|
944
944
|
* server resolve the real Holder at run time. That is how matrx-local's row
|
|
945
|
-
* came to be
|
|
945
|
+
* came to be labeled "Matrx Desktop Agent" while `local.cloud_chat` actually
|
|
946
946
|
* resolves to General Chat — a label lying on screen, with nothing anywhere
|
|
947
947
|
* that could notice.
|
|
948
948
|
*
|
|
@@ -957,8 +957,8 @@ declare function orchestraDelegatesLine(badge: OrchestraBadge, limit?: number):
|
|
|
957
957
|
* itself. It asks. That is why a `defaultMandateKey` with no transport is
|
|
958
958
|
* a loud config error and not a DB read.
|
|
959
959
|
* - The row renders the Holder's REAL name and description, read from the
|
|
960
|
-
*
|
|
961
|
-
* read when the Holder is not in this caller's
|
|
960
|
+
* catalog rows already in hand, or through ONE existing single-agent
|
|
961
|
+
* read when the Holder is not in this caller's catalog.
|
|
962
962
|
* - The last resolution is cached in the `storage` port for first paint.
|
|
963
963
|
* - Whenever the cached row and the LIVE resolution disagree on holder id
|
|
964
964
|
* or holder name, the picker shows a PERSISTENT in-picker banner AND the
|
|
@@ -1038,7 +1038,7 @@ declare function resolveDefaultRow(args: ResolveDefaultRowArgs): Promise<Resolve
|
|
|
1038
1038
|
* VERBATIM port of matrx-frontend `features/agents/constants/agent-list-labels.ts`.
|
|
1039
1039
|
* The only seam inverted: the two label constants moved into the `labels` port
|
|
1040
1040
|
* (`DEFAULT_AGENT_CATALOG_LABELS.publicTab` / `.publicBadge`) so a host can
|
|
1041
|
-
* override them; the FUNCTIONS below keep their exact
|
|
1041
|
+
* override them; the FUNCTIONS below keep their exact behavior.
|
|
1042
1042
|
*/
|
|
1043
1043
|
|
|
1044
1044
|
declare function agentListEmptyLabel(tab: AgentTab, labels: AgentCatalogLabels): string;
|
|
@@ -1137,7 +1137,7 @@ declare function agentMatchesSearch(agent: AgentSearchable, query: string): bool
|
|
|
1137
1137
|
* F1 — every sort now ends on `id` ASC, the same final key `agx_get_list`
|
|
1138
1138
|
* ends on, so the order of TIED rows is defined by the rows instead of
|
|
1139
1139
|
* by whichever transport the host used to fetch them.
|
|
1140
|
-
* F5 — the tab-badge counts
|
|
1140
|
+
* F5 — the tab-badge counts honor the archive filter, so the badge, the
|
|
1141
1141
|
* footer and the rendered rows are the same number.
|
|
1142
1142
|
*
|
|
1143
1143
|
* Everything else below is byte-identical to the original.
|
|
@@ -1148,7 +1148,7 @@ declare const AGENT_CARDS_LIMIT_MOBILE = 4;
|
|
|
1148
1148
|
declare const AGENT_LIST_ITEMS_PER_PAGE = 20;
|
|
1149
1149
|
/**
|
|
1150
1150
|
* Last-arguments memoization on reference equality — reselect's default
|
|
1151
|
-
* `defaultMemoize`
|
|
1151
|
+
* `defaultMemoize` behavior, in eleven lines and with no dependency. A
|
|
1152
1152
|
* selector built here is memoized PER INSTANCE, exactly like a
|
|
1153
1153
|
* `createSelector` result, so the factories below keep their contract:
|
|
1154
1154
|
* build the selector once per (consumerId, …) and reuse it.
|
|
@@ -1196,13 +1196,13 @@ declare const selectAllAgentTags: (a: readonly AgentSummary[]) => string[];
|
|
|
1196
1196
|
declare const selectAllSystemAgentTags: (a: readonly AgentSummary[]) => string[];
|
|
1197
1197
|
/** Live user-type agents (excludes builtins). */
|
|
1198
1198
|
declare const selectUserTypeAgents: (a: readonly AgentSummary[]) => AgentSummary[];
|
|
1199
|
-
/** Builtin/system agents only. For chat pickers and full
|
|
1199
|
+
/** Builtin/system agents only. For chat pickers and full catalogs. */
|
|
1200
1200
|
declare const selectBuiltinTypeAgents: (a: readonly AgentSummary[]) => AgentSummary[];
|
|
1201
1201
|
/**
|
|
1202
1202
|
* The ONE ordering rule, and it is TOTAL on every path.
|
|
1203
1203
|
*
|
|
1204
1204
|
* searching: score DESC → server rank ASC → sort key → id ASC
|
|
1205
|
-
* not searching:
|
|
1205
|
+
* not searching: favorites first (when asked) → sort key → id ASC
|
|
1206
1206
|
*
|
|
1207
1207
|
* `id` ASC is the final key `agx_get_list` itself ends on, so two hosts that
|
|
1208
1208
|
* fetched the same rows through different transports render the same screen.
|
|
@@ -1246,9 +1246,9 @@ declare const makeSelectFilteredSharedAgents: () => (a: readonly AgentSummary[],
|
|
|
1246
1246
|
* all) draw from user-type agents; the system tab draws from builtins.
|
|
1247
1247
|
*
|
|
1248
1248
|
* `includeSystemInAll` is the ADMIN reading of the "All" tab. For a normal
|
|
1249
|
-
* user, system agents are a separate
|
|
1249
|
+
* user, system agents are a separate catalog and "All" means "all of MY
|
|
1250
1250
|
* agents". For an admin surface, system agents ARE their agents — so "All"
|
|
1251
|
-
* must be a single blended list, with each row still
|
|
1251
|
+
* must be a single blended list, with each row still labeled (the `system`
|
|
1252
1252
|
* badge on `AgentRow`) so the two are never confused.
|
|
1253
1253
|
*/
|
|
1254
1254
|
declare const makeSelectFilteredAgents: (includeSystemInAll?: boolean) => (a: readonly AgentSummary[], b: AgentConsumerState) => AgentSummary[];
|
|
@@ -1282,7 +1282,7 @@ declare function agentConsumerHasActiveFilters(consumer: AgentConsumerState, def
|
|
|
1282
1282
|
* footer said "412 agents" — one screen, three numbers, one of them a lie
|
|
1283
1283
|
* about agents the user cannot see or reach from there.
|
|
1284
1284
|
*
|
|
1285
|
-
* `is_archived` is now
|
|
1285
|
+
* `is_archived` is now honored by the same rule the list uses, so the badge,
|
|
1286
1286
|
* the footer and the rows agree on every tab and under every archive filter.
|
|
1287
1287
|
*
|
|
1288
1288
|
* 🚨 0.9.2 — AND THERE IS NO LONGER AN EXCEPTION. The system tab used to be
|
package/dist/catalog/index.d.ts
CHANGED
|
@@ -299,7 +299,7 @@ interface AgentCatalogRpcCall extends PromiseLike<PgResultLike> {
|
|
|
299
299
|
* PostgREST's `in` filter on the function's result rows — how the pinned
|
|
300
300
|
* read asks `agx_get_list_full` for just the starred ids (2026-10-09).
|
|
301
301
|
* OPTIONAL in the structural type: a host bridge without it gets the whole
|
|
302
|
-
*
|
|
302
|
+
* catalog instead, announced through the errorSink.
|
|
303
303
|
*/
|
|
304
304
|
in?(column: string, values: readonly string[]): AgentCatalogRpcCall;
|
|
305
305
|
}
|
|
@@ -313,7 +313,7 @@ interface AgentCatalogRpcCall extends PromiseLike<PgResultLike> {
|
|
|
313
313
|
* the public schema's functions, so a bridge never crashes the pickers.
|
|
314
314
|
*
|
|
315
315
|
* Absent → `createAgentCatalog` throws `AgentCatalogConfigError`. There is no
|
|
316
|
-
* degraded mode: the package IS the
|
|
316
|
+
* degraded mode: the package IS the catalog read.
|
|
317
317
|
*/
|
|
318
318
|
interface AgentCatalogClient {
|
|
319
319
|
schema?(name: string): {
|
|
@@ -367,8 +367,8 @@ interface AgentCatalogFavorites {
|
|
|
367
367
|
/**
|
|
368
368
|
* Every state row the caller owns of one kind (`ues_list`). The pinned read
|
|
369
369
|
* asks for `"favorite"` to learn WHICH agents to read, so a sidebar never
|
|
370
|
-
* pulls the whole
|
|
371
|
-
* without it makes the pinned read fall back to the whole
|
|
370
|
+
* pulls the whole catalog to show a handful of stars. OPTIONAL: a port
|
|
371
|
+
* without it makes the pinned read fall back to the whole catalog, loudly.
|
|
372
372
|
*/
|
|
373
373
|
list?(kind?: "favorite" | "pinned" | "hidden"): Promise<{
|
|
374
374
|
ok: true;
|
|
@@ -394,7 +394,7 @@ interface AgentCatalogFavorites {
|
|
|
394
394
|
* `requireUserId` THROWS when there is no session — never a silent anonymous
|
|
395
395
|
* read. The catalog catches that throw in exactly ONE place (the tab-default
|
|
396
396
|
* heuristic, where a signed-out visitor legitimately lands on the public
|
|
397
|
-
*
|
|
397
|
+
* catalog) and reports it to the `errorSink` the first time; every other
|
|
398
398
|
* caller lets it propagate.
|
|
399
399
|
*/
|
|
400
400
|
interface AgentCatalogIdentity {
|
|
@@ -485,7 +485,7 @@ interface AgentCatalogLabels {
|
|
|
485
485
|
emptyDefault: string;
|
|
486
486
|
emptyShared: string;
|
|
487
487
|
emptySystem: string;
|
|
488
|
-
/** Empty state for a signed-out visitor — there is no
|
|
488
|
+
/** Empty state for a signed-out visitor — there is no catalog to read. */
|
|
489
489
|
emptySignedOut: string;
|
|
490
490
|
loading: string;
|
|
491
491
|
triggerFallback: string;
|
|
@@ -604,7 +604,7 @@ interface ResolvedDefaultRow {
|
|
|
604
604
|
mandateKey: string;
|
|
605
605
|
/** The `agent.definition` id the mandate resolved to. */
|
|
606
606
|
holderId: string;
|
|
607
|
-
/** The holder's REAL name, read from the
|
|
607
|
+
/** The holder's REAL name, read from the catalog — never hardcoded. */
|
|
608
608
|
holderName: string;
|
|
609
609
|
holderDescription: string | null;
|
|
610
610
|
provenance: string;
|
|
@@ -716,7 +716,7 @@ interface AgentCatalogState {
|
|
|
716
716
|
/**
|
|
717
717
|
* The caller's starred rows (`ensureFavoriteRows`): `succeeded` once every
|
|
718
718
|
* starred agent the caller can see is in `byId` — by the narrow pinned read
|
|
719
|
-
* or by a complete
|
|
719
|
+
* or by a complete catalog load, whichever came first.
|
|
720
720
|
*/
|
|
721
721
|
favoriteRowsStatus: AgentCatalogStatus;
|
|
722
722
|
}
|
|
@@ -741,17 +741,17 @@ interface AgentCatalog {
|
|
|
741
741
|
/**
|
|
742
742
|
* The signed-in user id, or `null` when there is no session. The ONE place
|
|
743
743
|
* `identity.requireUserId()`'s throw is caught — a signed-out visitor
|
|
744
|
-
* legitimately lands on the public
|
|
744
|
+
* legitimately lands on the public catalog — and it is reported to the
|
|
745
745
|
* errorSink the first time so it is never silent.
|
|
746
746
|
*/
|
|
747
747
|
getUserIdOrNull(): string | null;
|
|
748
|
-
/** Load the
|
|
748
|
+
/** Load the catalog if it is not fresh. Safe to call on every mount. */
|
|
749
749
|
ensureLoaded(options?: {
|
|
750
750
|
force?: boolean;
|
|
751
751
|
}): Promise<void>;
|
|
752
752
|
/**
|
|
753
753
|
* Load ONLY the caller's starred agents into the registry (the pinned read —
|
|
754
|
-
* `ues_list` then `agx_get_list_full?id=in.(…)`), never the whole
|
|
754
|
+
* `ues_list` then `agx_get_list_full?id=in.(…)`), never the whole catalog.
|
|
755
755
|
* Answered at once when a complete load is fresh. Deduped; safe on every
|
|
756
756
|
* mount. For surfaces that show stars without being a picker (a sidebar's
|
|
757
757
|
* Pinned section): nothing loads the full list until a picker opens.
|
|
@@ -804,11 +804,11 @@ declare function getRegisteredAgentCatalog(catalogId?: string): AgentCatalog | u
|
|
|
804
804
|
*
|
|
805
805
|
* Every database call the catalog makes, and nothing else. Five of them:
|
|
806
806
|
*
|
|
807
|
-
* 1. `agx_get_list_full()` — the complete
|
|
807
|
+
* 1. `agx_get_list_full()` — the complete catalog (owned + directly-shared
|
|
808
808
|
* + org-shared user agents, unioned with active builtins).
|
|
809
809
|
* 2. `agx_search(p_query, p_deep, p_limit, p_offset)` — tier-2 server search.
|
|
810
810
|
* 3. `agx_resolve_agent_address(p_ids)` — the single-agent name read, used
|
|
811
|
-
* when a mandate's Holder is not in the caller's own
|
|
811
|
+
* when a mandate's Holder is not in the caller's own catalog.
|
|
812
812
|
* 4. The caller's stars: `ues_get_bulk('agent', ids)` through the
|
|
813
813
|
* favorites port (`platform.user_entity_state`), overlaid on every row
|
|
814
814
|
* set this module returns to the store.
|
|
@@ -817,12 +817,12 @@ declare function getRegisteredAgentCatalog(catalogId?: string): AgentCatalog | u
|
|
|
817
817
|
* 6. THE PINNED READ (2026-10-09): the caller's starred ids (`ues_list`
|
|
818
818
|
* through the favorites port), then `agx_get_list_full` filtered to
|
|
819
819
|
* exactly those ids (`?id=in.(…)`). A sidebar's Pinned section shows a
|
|
820
|
-
* handful of rows; it never pays for the whole
|
|
820
|
+
* handful of rows; it never pays for the whole catalog to find them.
|
|
821
821
|
*
|
|
822
822
|
* 🚨 THE LIST READ IS COMPLETE OR IT THROWS. PostgREST caps every response at
|
|
823
823
|
* `db-max-rows` (1000 on Matrx Main) and reports success — matrx-frontend's
|
|
824
824
|
* `fetchAgentsListFull` issued a bare `.rpc()` and would silently have
|
|
825
|
-
* returned 1000 rows of a larger
|
|
825
|
+
* returned 1000 rows of a larger catalog (the ~400-builtin truncation
|
|
826
826
|
* incident is the near-miss). Here the read goes through `readAllRows` with
|
|
827
827
|
* `{ count: "exact" }` and a stable `.order("id")`, so a truncation is a
|
|
828
828
|
* loud `IncompleteReadError` instead of a confidently short picker.
|
|
@@ -838,7 +838,7 @@ declare class AgentCatalogReadError extends Error {
|
|
|
838
838
|
constructor(source: string, detail: string);
|
|
839
839
|
}
|
|
840
840
|
/**
|
|
841
|
-
* Read the WHOLE agent
|
|
841
|
+
* Read the WHOLE agent catalog. Throws rather than returning a partial
|
|
842
842
|
* list — see the file header.
|
|
843
843
|
*/
|
|
844
844
|
declare function readAgentCatalogRows(client: AgentCatalogClient): Promise<AgentSummary[]>;
|
|
@@ -859,7 +859,7 @@ declare function searchAgentsOnServer(client: AgentCatalogClient, args: {
|
|
|
859
859
|
}): Promise<AgentServerSearchResult>;
|
|
860
860
|
/**
|
|
861
861
|
* The single-agent read, used when a mandate's resolved Holder is not in the
|
|
862
|
-
* caller's own
|
|
862
|
+
* caller's own catalog (a platform agent nobody has shared, most often).
|
|
863
863
|
*
|
|
864
864
|
* Two existing doors, in order — never a new RPC:
|
|
865
865
|
* 1. `agx_search` with the id as the query. The scorer awards an exact id
|
|
@@ -942,7 +942,7 @@ declare function orchestraDelegatesLine(badge: OrchestraBadge, limit?: number):
|
|
|
942
942
|
* What every client used to do: prepend a placeholder row whose id is
|
|
943
943
|
* `mandate:<key>` and whose name and description are HARDCODED, and let the
|
|
944
944
|
* server resolve the real Holder at run time. That is how matrx-local's row
|
|
945
|
-
* came to be
|
|
945
|
+
* came to be labeled "Matrx Desktop Agent" while `local.cloud_chat` actually
|
|
946
946
|
* resolves to General Chat — a label lying on screen, with nothing anywhere
|
|
947
947
|
* that could notice.
|
|
948
948
|
*
|
|
@@ -957,8 +957,8 @@ declare function orchestraDelegatesLine(badge: OrchestraBadge, limit?: number):
|
|
|
957
957
|
* itself. It asks. That is why a `defaultMandateKey` with no transport is
|
|
958
958
|
* a loud config error and not a DB read.
|
|
959
959
|
* - The row renders the Holder's REAL name and description, read from the
|
|
960
|
-
*
|
|
961
|
-
* read when the Holder is not in this caller's
|
|
960
|
+
* catalog rows already in hand, or through ONE existing single-agent
|
|
961
|
+
* read when the Holder is not in this caller's catalog.
|
|
962
962
|
* - The last resolution is cached in the `storage` port for first paint.
|
|
963
963
|
* - Whenever the cached row and the LIVE resolution disagree on holder id
|
|
964
964
|
* or holder name, the picker shows a PERSISTENT in-picker banner AND the
|
|
@@ -1038,7 +1038,7 @@ declare function resolveDefaultRow(args: ResolveDefaultRowArgs): Promise<Resolve
|
|
|
1038
1038
|
* VERBATIM port of matrx-frontend `features/agents/constants/agent-list-labels.ts`.
|
|
1039
1039
|
* The only seam inverted: the two label constants moved into the `labels` port
|
|
1040
1040
|
* (`DEFAULT_AGENT_CATALOG_LABELS.publicTab` / `.publicBadge`) so a host can
|
|
1041
|
-
* override them; the FUNCTIONS below keep their exact
|
|
1041
|
+
* override them; the FUNCTIONS below keep their exact behavior.
|
|
1042
1042
|
*/
|
|
1043
1043
|
|
|
1044
1044
|
declare function agentListEmptyLabel(tab: AgentTab, labels: AgentCatalogLabels): string;
|
|
@@ -1137,7 +1137,7 @@ declare function agentMatchesSearch(agent: AgentSearchable, query: string): bool
|
|
|
1137
1137
|
* F1 — every sort now ends on `id` ASC, the same final key `agx_get_list`
|
|
1138
1138
|
* ends on, so the order of TIED rows is defined by the rows instead of
|
|
1139
1139
|
* by whichever transport the host used to fetch them.
|
|
1140
|
-
* F5 — the tab-badge counts
|
|
1140
|
+
* F5 — the tab-badge counts honor the archive filter, so the badge, the
|
|
1141
1141
|
* footer and the rendered rows are the same number.
|
|
1142
1142
|
*
|
|
1143
1143
|
* Everything else below is byte-identical to the original.
|
|
@@ -1148,7 +1148,7 @@ declare const AGENT_CARDS_LIMIT_MOBILE = 4;
|
|
|
1148
1148
|
declare const AGENT_LIST_ITEMS_PER_PAGE = 20;
|
|
1149
1149
|
/**
|
|
1150
1150
|
* Last-arguments memoization on reference equality — reselect's default
|
|
1151
|
-
* `defaultMemoize`
|
|
1151
|
+
* `defaultMemoize` behavior, in eleven lines and with no dependency. A
|
|
1152
1152
|
* selector built here is memoized PER INSTANCE, exactly like a
|
|
1153
1153
|
* `createSelector` result, so the factories below keep their contract:
|
|
1154
1154
|
* build the selector once per (consumerId, …) and reuse it.
|
|
@@ -1196,13 +1196,13 @@ declare const selectAllAgentTags: (a: readonly AgentSummary[]) => string[];
|
|
|
1196
1196
|
declare const selectAllSystemAgentTags: (a: readonly AgentSummary[]) => string[];
|
|
1197
1197
|
/** Live user-type agents (excludes builtins). */
|
|
1198
1198
|
declare const selectUserTypeAgents: (a: readonly AgentSummary[]) => AgentSummary[];
|
|
1199
|
-
/** Builtin/system agents only. For chat pickers and full
|
|
1199
|
+
/** Builtin/system agents only. For chat pickers and full catalogs. */
|
|
1200
1200
|
declare const selectBuiltinTypeAgents: (a: readonly AgentSummary[]) => AgentSummary[];
|
|
1201
1201
|
/**
|
|
1202
1202
|
* The ONE ordering rule, and it is TOTAL on every path.
|
|
1203
1203
|
*
|
|
1204
1204
|
* searching: score DESC → server rank ASC → sort key → id ASC
|
|
1205
|
-
* not searching:
|
|
1205
|
+
* not searching: favorites first (when asked) → sort key → id ASC
|
|
1206
1206
|
*
|
|
1207
1207
|
* `id` ASC is the final key `agx_get_list` itself ends on, so two hosts that
|
|
1208
1208
|
* fetched the same rows through different transports render the same screen.
|
|
@@ -1246,9 +1246,9 @@ declare const makeSelectFilteredSharedAgents: () => (a: readonly AgentSummary[],
|
|
|
1246
1246
|
* all) draw from user-type agents; the system tab draws from builtins.
|
|
1247
1247
|
*
|
|
1248
1248
|
* `includeSystemInAll` is the ADMIN reading of the "All" tab. For a normal
|
|
1249
|
-
* user, system agents are a separate
|
|
1249
|
+
* user, system agents are a separate catalog and "All" means "all of MY
|
|
1250
1250
|
* agents". For an admin surface, system agents ARE their agents — so "All"
|
|
1251
|
-
* must be a single blended list, with each row still
|
|
1251
|
+
* must be a single blended list, with each row still labeled (the `system`
|
|
1252
1252
|
* badge on `AgentRow`) so the two are never confused.
|
|
1253
1253
|
*/
|
|
1254
1254
|
declare const makeSelectFilteredAgents: (includeSystemInAll?: boolean) => (a: readonly AgentSummary[], b: AgentConsumerState) => AgentSummary[];
|
|
@@ -1282,7 +1282,7 @@ declare function agentConsumerHasActiveFilters(consumer: AgentConsumerState, def
|
|
|
1282
1282
|
* footer said "412 agents" — one screen, three numbers, one of them a lie
|
|
1283
1283
|
* about agents the user cannot see or reach from there.
|
|
1284
1284
|
*
|
|
1285
|
-
* `is_archived` is now
|
|
1285
|
+
* `is_archived` is now honored by the same rule the list uses, so the badge,
|
|
1286
1286
|
* the footer and the rows agree on every tab and under every archive filter.
|
|
1287
1287
|
*
|
|
1288
1288
|
* 🚨 0.9.2 — AND THERE IS NO LONGER AN EXCEPTION. The system tab used to be
|
package/dist/catalog/index.js
CHANGED
|
@@ -189,7 +189,7 @@ async function readAgentCatalogRows(client) {
|
|
|
189
189
|
if (dropped > 0) {
|
|
190
190
|
throw new AgentCatalogReadError(
|
|
191
191
|
"agx_get_list_full",
|
|
192
|
-
`${dropped} row(s) came back without an id and were refused. A row that cannot be identified cannot be selected, so the
|
|
192
|
+
`${dropped} row(s) came back without an id and were refused. A row that cannot be identified cannot be selected, so the catalog is not trustworthy \u2014 check the RPC's return shape.`
|
|
193
193
|
);
|
|
194
194
|
}
|
|
195
195
|
return rows;
|
|
@@ -690,7 +690,7 @@ function createAgentCatalog(config) {
|
|
|
690
690
|
if (!config.client || typeof config.client.rpc !== "function") {
|
|
691
691
|
throw new AgentCatalogConfigError({
|
|
692
692
|
code: "missing_client",
|
|
693
|
-
message: "createAgentCatalog needs a Supabase client \u2014 it IS the
|
|
693
|
+
message: "createAgentCatalog needs a Supabase client \u2014 it IS the catalog read",
|
|
694
694
|
remedy: "pass `client` (a supabase-js client, or anything with rpc() and schema().from())"
|
|
695
695
|
});
|
|
696
696
|
}
|
|
@@ -730,7 +730,7 @@ function createAgentCatalog(config) {
|
|
|
730
730
|
function reportFavoriteReadFailure(message) {
|
|
731
731
|
errorSink({
|
|
732
732
|
code: "favorite_read_failed",
|
|
733
|
-
message: `your starred agents could not be read (${message}); every star is shown unset until the next
|
|
733
|
+
message: `your starred agents could not be read (${message}); every star is shown unset until the next catalog load`,
|
|
734
734
|
context: { catalogId }
|
|
735
735
|
});
|
|
736
736
|
}
|
|
@@ -780,7 +780,7 @@ function createAgentCatalog(config) {
|
|
|
780
780
|
anonymousReported = true;
|
|
781
781
|
errorSink({
|
|
782
782
|
code: "identity_unavailable",
|
|
783
|
-
message: "identity.requireUserId() threw, so the picker is treating this session as signed out and opening on the public
|
|
783
|
+
message: "identity.requireUserId() threw, so the picker is treating this session as signed out and opening on the public catalog. Favoriting is unavailable until a session exists.",
|
|
784
784
|
context: { detail: errorMessage(e) }
|
|
785
785
|
});
|
|
786
786
|
}
|
|
@@ -818,7 +818,7 @@ function createAgentCatalog(config) {
|
|
|
818
818
|
publish({ ...state, status: "failed", error: message });
|
|
819
819
|
errorSink({
|
|
820
820
|
code: "list_read_failed",
|
|
821
|
-
message: `the agent
|
|
821
|
+
message: `the agent catalog could not be read: ${message}`,
|
|
822
822
|
context: { catalogId }
|
|
823
823
|
});
|
|
824
824
|
throw e;
|
|
@@ -864,7 +864,7 @@ function createAgentCatalog(config) {
|
|
|
864
864
|
pinnedFallbackReported = true;
|
|
865
865
|
errorSink({
|
|
866
866
|
code: "pinned_read_unsupported",
|
|
867
|
-
message: `the pinned-agents read fell back to the whole
|
|
867
|
+
message: `the pinned-agents read fell back to the whole catalog (${e.message}); pass a favorites port with list() and a supabase-js client`,
|
|
868
868
|
context: { catalogId }
|
|
869
869
|
});
|
|
870
870
|
}
|
|
@@ -973,7 +973,7 @@ function createAgentCatalog(config) {
|
|
|
973
973
|
if (!existing) {
|
|
974
974
|
errorSink({
|
|
975
975
|
code: "favorite_unknown_agent",
|
|
976
|
-
message: `cannot favorite ${agentId}: it is not in this
|
|
976
|
+
message: `cannot favorite ${agentId}: it is not in this catalog`
|
|
977
977
|
});
|
|
978
978
|
return;
|
|
979
979
|
}
|
|
@@ -1205,7 +1205,7 @@ var SHAPES = {
|
|
|
1205
1205
|
/**
|
|
1206
1206
|
* THE ARCHIVE GLYPH (Lucide `archive`) — the ONE mark of the platform
|
|
1207
1207
|
* archive filter, drawn identically in every Matrx client so the control a
|
|
1208
|
-
* person learns on one surface is
|
|
1208
|
+
* person learns on one surface is recognizable on all of them.
|
|
1209
1209
|
*/
|
|
1210
1210
|
archive: {
|
|
1211
1211
|
paths: [
|