@ai-matrx/agents 0.38.4 → 0.40.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 +21 -0
- package/dist/catalog/index.cjs +3 -1
- package/dist/catalog/index.cjs.map +1 -1
- package/dist/catalog/index.d.cts +2 -2
- package/dist/catalog/index.d.ts +2 -2
- package/dist/catalog/index.js +3 -1
- package/dist/catalog/index.js.map +1 -1
- package/dist/catalog/native/index.cjs +4 -1
- package/dist/catalog/native/index.cjs.map +1 -1
- package/dist/catalog/native/index.d.cts +8 -3
- package/dist/catalog/native/index.d.ts +8 -3
- package/dist/catalog/native/index.js +4 -1
- package/dist/catalog/native/index.js.map +1 -1
- package/dist/catalog/react/index.cjs +1 -0
- package/dist/catalog/react/index.cjs.map +1 -1
- package/dist/catalog/react/index.d.cts +13 -1
- package/dist/catalog/react/index.d.ts +13 -1
- package/dist/catalog/react/index.js +1 -0
- package/dist/catalog/react/index.js.map +1 -1
- package/dist/content-transfer/index.cjs.map +1 -1
- package/dist/content-transfer/index.js.map +1 -1
- package/dist/content-transfer/react/index.cjs.map +1 -1
- package/dist/content-transfer/react/index.js.map +1 -1
- package/dist/context/index.cjs +3 -23
- package/dist/context/index.cjs.map +1 -1
- package/dist/context/index.d.cts +10 -13
- package/dist/context/index.d.ts +10 -13
- package/dist/context/index.js +5 -23
- package/dist/context/index.js.map +1 -1
- package/dist/context/react/index.cjs +263 -97
- package/dist/context/react/index.cjs.map +1 -1
- package/dist/context/react/index.d.cts +140 -15
- package/dist/context/react/index.d.ts +140 -15
- package/dist/context/react/index.js +266 -100
- package/dist/context/react/index.js.map +1 -1
- package/dist/index.cjs +6 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -6
- package/dist/index.d.ts +9 -6
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/{keys.generated-DxG5tgWt.d.cts → keys.generated-myjGAtI0.d.cts} +4 -4
- package/dist/{keys.generated-DxG5tgWt.d.ts → keys.generated-myjGAtI0.d.ts} +4 -4
- package/dist/mandates/index.cjs +2 -2
- package/dist/mandates/index.cjs.map +1 -1
- package/dist/mandates/index.d.cts +2 -2
- package/dist/mandates/index.d.ts +2 -2
- package/dist/mandates/index.js +2 -2
- package/dist/mandates/index.js.map +1 -1
- package/dist/matrx/index.d.cts +1 -1
- package/dist/matrx/index.d.ts +1 -1
- package/dist/{orchestra-zpGHwOag.d.cts → orchestra-CiaTu58J.d.cts} +7 -0
- package/dist/{orchestra-zpGHwOag.d.ts → orchestra-CiaTu58J.d.ts} +7 -0
- package/mandates/snapshots/keys.0.39.0.json +653 -0
- package/mandates/snapshots/keys.0.40.0.json +653 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../catalog/native/index.ts","../../../catalog/native/context.tsx","../../../catalog/shared/context.tsx","../../../catalog/native/theme.ts","../../../catalog/native/AgentListSheet.tsx","../../../catalog/native/AgentPickerBody.tsx","../../../catalog/shared/useAgentListCore.ts","../../../catalog/shared/useAgentConsumer.ts","../../../catalog/types.ts","../../../catalog/labels.ts","../../../catalog/score.ts","../../../catalog/selectors.ts","../../../catalog/native/AgentDetailCard.tsx","../../../catalog/orchestra.ts","../../../catalog/native/icons.tsx","../../../catalog/shared/icon-paths.ts","../../../catalog/native/FavoriteAgentButton.tsx","../../../catalog/native/AgentListContent.tsx","../../../catalog/native/AgentFilterBar.tsx","../../../catalog/native/primitives.tsx","../../../catalog/native/AgentListTabs.tsx","../../../catalog/native/AgentRow.tsx","../../../catalog/native/AgentSubView.tsx","../../../catalog/native/AgentListInlinePicker.tsx"],"sourcesContent":["/**\n * `@ai-matrx/agents/catalog/native` — THE agent picker, on React Native.\n *\n * ONE agent picker exists on this platform. This entry renders it with React\n * Native primitives over the SAME headless kernel and the SAME hooks the web\n * entry uses (`catalog/shared/*`), so a mobile app's list is the same rows in\n * the same order with the same tabs, counts and filters as the browser's.\n *\n * ```tsx\n * import { createAgentCatalog } from \"@ai-matrx/agents/catalog\";\n * import { AgentCatalogProvider, AgentListSheet } from \"@ai-matrx/agents/catalog/native\";\n * import AsyncStorage from \"@react-native-async-storage/async-storage\";\n *\n * const catalog = createAgentCatalog({\n * client: supabase,\n * identity: { requireUserId: () => requireUserId() },\n * storage: AsyncStorage, // the async storage seam (0.9.0)\n * transport, // only when a picker passes defaultMandateKey\n * errorSink: reportToYourDiagnostics,\n * });\n *\n * <AgentCatalogProvider catalog={catalog} navigate={(href) => router.push(href)}>\n * <AgentListSheet onSelect={setAgentId} activeAgentId={agentId} consumerId=\"chat\" />\n * </AgentCatalogProvider>\n * ```\n *\n * 🚨 NO `\"use client\"` ON THIS ENTRY. React Native has no React Server\n * Components; the stamp would be meaningless here and harmful anywhere else it\n * travelled. The tarball canary proves its absence on all four artefacts.\n *\n * `react-native` is an OPTIONAL peer (this entry needs it; no other entry\n * does). `react-native-svg` is an OPTIONAL peer too — without it the icons\n * degrade to text glyphs and say so once, through the errorSink.\n */\n\nexport {\n AgentCatalogProvider,\n useAgentCatalog,\n useAgentCatalogNativeTheme,\n useAgentCatalogRows,\n useAgentCatalogState,\n useAgentCatalogUiPorts,\n type AgentCatalogLinkComponent,\n type AgentCatalogNativeProviderProps,\n type AgentCatalogPlatformDefaults,\n type AgentCatalogRenderModelRef,\n type AgentCatalogUiPorts,\n} from \"./context\";\n\nexport {\n DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n LIGHT_AGENT_CATALOG_NATIVE_THEME,\n resolveAgentCatalogNativeTheme,\n type AgentCatalogNativeColors,\n type AgentCatalogNativeTheme,\n type AgentCatalogNativeThemeOverride,\n} from \"./theme\";\n\nexport { AgentListSheet, type AgentListSheetProps } from \"./AgentListSheet\";\nexport {\n AgentListInlinePicker,\n type AgentListInlinePickerProps,\n} from \"./AgentListInlinePicker\";\nexport { AgentPickerBody, type AgentPickerProps } from \"./AgentPickerBody\";\n\nexport {\n AgentListContent,\n type AgentListContentProps,\n} from \"./AgentListContent\";\nexport { AgentListTabs, type AgentListTabsProps } from \"./AgentListTabs\";\nexport { AgentFilterBar, type AgentFilterBarProps } from \"./AgentFilterBar\";\nexport { AgentRow, type AgentRowProps } from \"./AgentRow\";\nexport { AgentDetailCard, type AgentDetailCardProps } from \"./AgentDetailCard\";\nexport {\n AgentSubView,\n type AgentSubViewName,\n type AgentSubViewProps,\n} from \"./AgentSubView\";\nexport {\n FavoriteAgentButton,\n type FavoriteAgentButtonProps,\n} from \"./FavoriteAgentButton\";\nexport {\n CheckRow,\n FilterChip,\n OptionRow,\n SearchInput,\n SidePanelHeader,\n} from \"./primitives\";\n\nexport {\n AgentIcon,\n announceMissingSvgOnce,\n resolveSvgModule,\n _resetNativeIconState,\n type AgentCatalogIconName,\n type AgentIconProps,\n} from \"./icons\";\n\nexport {\n useAgentConsumer,\n type UseAgentConsumerReturn,\n} from \"../shared/useAgentConsumer\";\nexport {\n HOVER_GRACE_MS,\n coerceVisibleTab,\n useAgentListCore,\n type AgentListCoreOptions,\n type AgentListTabCounts,\n} from \"../shared/useAgentListCore\";\n\n/**\n * The Orchestra marker's words, re-exported so a host rendering its OWN\n * summary of a chosen agent shows the same sentence as the picker it chose\n * from — never a second vocabulary for the same badge.\n */\nexport {\n orchestraDelegatesLine,\n orchestraDepthLine,\n orchestraLabel,\n orchestraModeLabel,\n} from \"../orchestra\";\nexport type { OrchestraBadge } from \"../types\";\n","/**\n * catalog/native/context.tsx — @ai-matrx/agents/catalog/native\n *\n * THE REACT NATIVE BINDING of the one provider. The context, the store\n * subscription and every hook come from `../shared/context` — the SAME code\n * the web picker runs. This file adds only what a platform owes: the three\n * native defaults, and the theme object that replaces CSS custom properties\n * on a platform that has no cascade (C26 — see `./theme`).\n *\n * 🚨 NO `\"use client\"` HERE, and none on the built `catalog/native` entry.\n * React Native has no React Server Components, and a `\"use client\"` prologue\n * on a native module turns its exports into client references for any RSC\n * bundler that later sees them — a stamp that means nothing where it lands and\n * breaks where it does not belong. The banner canary in\n * `scripts/verify-tarball.mjs` proves its absence on all four native artefacts.\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { Pressable, Text } from \"react-native\";\n\nimport {\n AgentCatalogProviderCore,\n type AgentCatalogLinkComponent,\n type AgentCatalogPlatformDefaults,\n type AgentCatalogRenderModelRef,\n type AgentCatalogUiPorts,\n} from \"../shared/context\";\nimport type { AgentCatalog } from \"../store\";\nimport {\n DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n resolveAgentCatalogNativeTheme,\n type AgentCatalogNativeTheme,\n type AgentCatalogNativeThemeOverride,\n} from \"./theme\";\n\nexport {\n useAgentCatalog,\n useAgentCatalogRows,\n useAgentCatalogState,\n useAgentCatalogUiPorts,\n type AgentCatalogLinkComponent,\n type AgentCatalogPlatformDefaults,\n type AgentCatalogRenderModelRef,\n type AgentCatalogUiPorts,\n} from \"../shared/context\";\n\nconst ThemeContext = createContext<AgentCatalogNativeTheme>(\n DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n);\n\n/** The resolved theme for this tree. Never throws — there is always a default. */\nexport function useAgentCatalogNativeTheme(): AgentCatalogNativeTheme {\n return useContext(ThemeContext);\n}\n\nexport interface AgentCatalogNativeProviderProps extends AgentCatalogUiPorts {\n catalog: AgentCatalog;\n /**\n * Brand overrides for the picker's token values (C26). Anything omitted\n * keeps the shipped default, so an unthemed app still renders correctly.\n */\n theme?: AgentCatalogNativeThemeOverride;\n children: ReactNode;\n}\n\n/**\n * The native default link. React Native has no `<a>` and no cmd-click, so the\n * default is an ordinary pressable that runs the row's own handler — a REAL,\n * working control rather than a web affordance that would do nothing here.\n */\nconst NativeLink: AgentCatalogLinkComponent = ({ children, onClick, title }) => (\n <Pressable\n accessibilityRole=\"link\"\n {...(title ? { accessibilityLabel: title } : {})}\n onPress={() =>\n onClick?.({\n preventDefault: () => {},\n stopPropagation: () => {},\n })\n }\n >\n {children}\n </Pressable>\n);\n\n/** The native default model reference: the id as plain, themed text. */\nconst nativeRenderModelRef: AgentCatalogRenderModelRef = ({ modelId }) => (\n <Text>{modelId}</Text>\n);\n\nexport function AgentCatalogProvider({\n catalog,\n theme,\n children,\n ...ports\n}: AgentCatalogNativeProviderProps) {\n const resolvedTheme = useMemo(\n () => resolveAgentCatalogNativeTheme(theme),\n // A theme object is declared once by a host; re-resolving on identity\n // change is correct and cheap.\n [theme],\n );\n\n const platform = useMemo<AgentCatalogPlatformDefaults>(\n () => ({\n /**\n * 🚨 THE NATIVE `navigate` DEFAULT. There is no `window.location` to\n * assign, and there is no router this package may assume — Expo Router,\n * React Navigation and a custom stack all differ. So the default is a\n * no-op that REPORTS, with the remedy, through the catalog's own\n * errorSink. It never fails silently, and it never pretends to have\n * navigated. A host that wants working links passes `navigate`.\n */\n navigate: (href: string) => {\n catalog.errorSink({\n code: \"native_navigate_not_bound\",\n message:\n \"the agent picker was asked to navigate, but this native host \" +\n \"bound no `navigate` port, so nothing moved.\",\n context: {\n href,\n remedy:\n \"pass navigate={(href) => router.push(href)} (Expo Router) or \" +\n \"your navigator's equivalent to <AgentCatalogProvider>\",\n },\n });\n },\n LinkComponent: NativeLink,\n renderModelRef: nativeRenderModelRef,\n }),\n [catalog],\n );\n\n return (\n <ThemeContext.Provider value={resolvedTheme}>\n <AgentCatalogProviderCore\n catalog={catalog}\n platform={platform}\n {...ports}\n >\n {children}\n </AgentCatalogProviderCore>\n </ThemeContext.Provider>\n );\n}\n","/**\n * catalog/shared/context.tsx — THE ONE React binding point, platform-neutral.\n *\n * 0.9.0 moved the provider, the context and the three subscription hooks OUT\n * of `catalog/react/context.tsx` and into this file so the React Native entry\n * (`@ai-matrx/agents/catalog/native`) reuses the SAME provider, the SAME store\n * subscription and the SAME hooks as the web picker. Only the VIEW layer, and\n * the three platform DEFAULTS below, differ between the two entries.\n *\n * 🚨 NOTHING IN THIS FILE MAY TOUCH THE DOM OR react-native. A default that\n * renders `<a>` is a web default and a default that renders `<Text>` is a\n * native default; both arrive through `platform`, which each entry's own\n * `AgentCatalogProvider` supplies. That is why `useAgentCatalogUiPorts()`\n * still answers with every default already applied on both platforms, and why\n * an unset port is never `undefined` on either.\n *\n * This file carries NO `\"use client\"` source directive on purpose: the stamp\n * is applied per BUILT ENTRY by tsup (the web entry gets it, the native entry\n * must not — React Native has no RSC and a stamped native module is a lie).\n */\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useSyncExternalStore,\n type ComponentType,\n type ReactNode,\n} from \"react\";\n\nimport type { AgentCatalog, AgentCatalogState } from \"../store\";\nimport type {\n AgentCatalogNavigate,\n AgentCatalogOpenPeek,\n} from \"../ports\";\nimport type { AgentSummary } from \"../types\";\n\n/**\n * The anchor a row renders for cmd/ctrl-click. DEFAULT (web): a plain `<a>` —\n * which is a REAL, working link in every framework. A Next.js host passes\n * `next/link`; a TanStack host passes its own `Link`. On React Native the\n * default is a pressable `Text` that routes through `navigate`.\n */\n/**\n * What a row's link handler receives. A DOM `React.MouseEvent` satisfies this\n * structurally, and the native default link supplies the two methods itself —\n * so a shared component can call `preventDefault()` on either platform\n * without a platform check.\n */\nexport interface AgentCatalogLinkClickEvent {\n metaKey?: boolean;\n ctrlKey?: boolean;\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport type AgentCatalogLinkComponent = ComponentType<{\n href: string;\n className?: string;\n target?: string;\n rel?: string;\n title?: string;\n \"aria-label\"?: string;\n onClick?: (e: AgentCatalogLinkClickEvent) => void;\n children: ReactNode;\n}>;\n\n/** Render a model id as whatever door the host has. DEFAULT: plain text. */\nexport type AgentCatalogRenderModelRef = (args: {\n modelId: string;\n className?: string;\n}) => ReactNode;\n\nexport interface AgentCatalogUiPorts {\n /** DEFAULT (web): `window.location.assign`. DEFAULT (native): a reporting no-op. */\n navigate?: AgentCatalogNavigate;\n /** DEFAULT: a plain `<a>` (web) / a pressable `Text` (native). */\n LinkComponent?: AgentCatalogLinkComponent;\n /** DEFAULT: the model id as plain text. */\n renderModelRef?: AgentCatalogRenderModelRef;\n /** ABSENT: the sneak-peek affordance is HIDDEN — never a dead button. */\n openPeek?: AgentCatalogOpenPeek;\n /**\n * Portal container for the desktop popover, when the picker is mounted\n * inside a dialog. DEFAULT: the document body (Radix's own default).\n * Web only — the native entry ignores it.\n */\n popoverContainer?: HTMLElement | null;\n}\n\n/**\n * The three defaults a PLATFORM supplies. Never a host concern: a host\n * overrides an individual port through `AgentCatalogUiPorts`, and whatever it\n * leaves unset falls back to the platform's own working answer.\n */\nexport interface AgentCatalogPlatformDefaults {\n navigate: AgentCatalogNavigate;\n LinkComponent: AgentCatalogLinkComponent;\n renderModelRef: AgentCatalogRenderModelRef;\n}\n\ninterface AgentCatalogBinding extends AgentCatalogUiPorts {\n catalog: AgentCatalog;\n platform: AgentCatalogPlatformDefaults;\n}\n\nconst AgentCatalogContext = createContext<AgentCatalogBinding | null>(null);\n\nexport interface AgentCatalogProviderCoreProps extends AgentCatalogUiPorts {\n catalog: AgentCatalog;\n platform: AgentCatalogPlatformDefaults;\n children: ReactNode;\n}\n\n/**\n * The provider itself. Each entry wraps this with its own platform defaults\n * and re-exports it as `AgentCatalogProvider`; hosts never see this name.\n */\nexport function AgentCatalogProviderCore({\n catalog,\n platform,\n children,\n ...ports\n}: AgentCatalogProviderCoreProps) {\n const value = useMemo<AgentCatalogBinding>(\n () => ({ catalog, platform, ...ports }),\n // The ports are plain values a host declares once; re-binding on identity\n // change is correct and cheap.\n [\n catalog,\n platform,\n ports.navigate,\n ports.LinkComponent,\n ports.renderModelRef,\n ports.openPeek,\n ports.popoverContainer,\n ],\n );\n return (\n <AgentCatalogContext.Provider value={value}>\n {children}\n </AgentCatalogContext.Provider>\n );\n}\n\nfunction useBinding(): AgentCatalogBinding {\n const binding = useContext(AgentCatalogContext);\n if (!binding) {\n throw new Error(\n \"@ai-matrx/agents/catalog: no <AgentCatalogProvider> is mounted \" +\n \"above this component. Create the catalog once with \" +\n \"createAgentCatalog({ client, identity }) and mount \" +\n \"<AgentCatalogProvider catalog={catalog}> at the top of your tree.\",\n );\n }\n return binding;\n}\n\n/** The headless catalog this tree is bound to. Throws with no provider. */\nexport function useAgentCatalog(): AgentCatalog {\n return useBinding().catalog;\n}\n\n/** The UI ports this tree is bound to, with every default already applied. */\nexport function useAgentCatalogUiPorts(): Required<\n Pick<AgentCatalogUiPorts, \"navigate\" | \"LinkComponent\" | \"renderModelRef\">\n> & {\n openPeek: AgentCatalogOpenPeek | undefined;\n popoverContainer: HTMLElement | null | undefined;\n} {\n const binding = useBinding();\n const hostNavigate = binding.navigate;\n const platformNavigate = binding.platform.navigate;\n const navigate = useCallback<AgentCatalogNavigate>(\n (href) => {\n if (hostNavigate) {\n hostNavigate(href);\n return;\n }\n platformNavigate(href);\n },\n [hostNavigate, platformNavigate],\n );\n return {\n navigate,\n LinkComponent: binding.LinkComponent ?? binding.platform.LinkComponent,\n renderModelRef:\n binding.renderModelRef ?? binding.platform.renderModelRef,\n openPeek: binding.openPeek,\n popoverContainer: binding.popoverContainer,\n };\n}\n\n/**\n * Subscribe to a slice of catalog state. `useSyncExternalStore` because the\n * catalog is an external store and React 18/19 concurrency must not tear it.\n * `select` MUST return a stable reference for unchanged state — every\n * selector in `../selectors` does.\n */\nexport function useAgentCatalogState<T>(\n select: (state: AgentCatalogState) => T,\n): T {\n const catalog = useAgentCatalog();\n const getSnapshot = useCallback(\n () => select(catalog.getState()),\n [catalog, select],\n );\n return useSyncExternalStore(catalog.subscribe, getSnapshot, getSnapshot);\n}\n\n/** Every row currently in the catalogue, as one stable array. */\nexport function useAgentCatalogRows(): AgentSummary[] {\n return useAgentCatalogState(selectRows);\n}\n\nconst selectRows = (state: AgentCatalogState): AgentSummary[] => state.rows;\n","/**\n * catalog/native/theme.ts — @ai-matrx/agents/catalog/native\n *\n * 🚨 C26 ON A PLATFORM WITH NO CSS. The web picker consumes colour ONLY\n * through named semantic tokens (`--matrx-agent-*` plus the design system's\n * `--primary`, `--muted-foreground`, …), and `catalog/styles.css` ships their\n * DEFAULT VALUES so the picker renders correctly unthemed in a fresh app.\n * React Native has no custom properties and no cascade, so the identical\n * contract is expressed as a plain object: the package ships every default\n * value, and a host re-brands by passing `theme` to `AgentCatalogProvider`.\n *\n * Every name below is the native twin of a token the web sheet defines, so a\n * colour changed in one place is findable in the other. NOTHING in the native\n * components hardcodes a colour — they read this object and nothing else.\n */\n\n/** The colour half of the contract. Every value is host-overridable. */\nexport interface AgentCatalogNativeColors {\n /** Sheet / list background. Web twin: `--background`. */\n background: string;\n /** Cards, inputs and chips sitting on the background. Web twin: `--muted`. */\n surface: string;\n /** A pressed/hovered row. Web twin: `bg-muted/50`. */\n surfacePressed: string;\n /** Primary text. Web twin: `--foreground`. */\n text: string;\n /** Secondary text. Web twin: `--muted-foreground`. */\n textMuted: string;\n /** Tertiary text (timestamps, hints). Web twin: `--muted-foreground/70`. */\n textFaint: string;\n /** Hairlines. Web twin: `--border`. */\n border: string;\n /** The accent. Web twin: `--primary`. */\n primary: string;\n /** Text ON the accent. Web twin: `--primary-foreground`. */\n primaryForeground: string;\n /** A tinted accent surface (active tab, badges). Web twin: `bg-primary/10`. */\n primarySoft: string;\n /** The favourite star. Web twin: `--matrx-agent-favorite`. */\n favorite: string;\n /** The drift banner. Web twins: `--matrx-agent-drift-{bg,fg,border}`. */\n driftBackground: string;\n driftForeground: string;\n driftBorder: string;\n}\n\nexport interface AgentCatalogNativeTheme {\n colors: AgentCatalogNativeColors;\n /** Corner radii, in points. */\n radius: { sm: number; md: number; lg: number };\n /** The one spacing scale the picker uses, in points. */\n spacing: { xs: number; sm: number; md: number; lg: number };\n /** Font sizes, in points. The web picker's 10/11/12/13px ladder. */\n fontSize: { xs: number; sm: number; md: number; lg: number };\n}\n\n/**\n * The DEFAULT theme, mirroring `catalog/styles.css` plus the dark palette the\n * web picker inherits from the design system. Dark by default is deliberate:\n * it is what every Matrx mobile surface renders, and a light host overrides\n * `theme` rather than fighting a half-applied palette.\n */\nexport const DEFAULT_AGENT_CATALOG_NATIVE_THEME: AgentCatalogNativeTheme = {\n colors: {\n background: \"#0b0b0f\",\n surface: \"#17171d\",\n surfacePressed: \"#22222b\",\n text: \"#f5f5f7\",\n textMuted: \"#9b9ba5\",\n textFaint: \"#6e6e78\",\n border: \"#2a2a33\",\n primary: \"#3b82f6\",\n primaryForeground: \"#ffffff\",\n primarySoft: \"#1c2a44\",\n // The web sheet's dark value for --matrx-agent-favorite.\n favorite: \"#fbbf24\",\n driftBackground: \"#451a03\",\n driftForeground: \"#fcd34d\",\n driftBorder: \"#78350f\",\n },\n radius: { sm: 4, md: 8, lg: 12 },\n spacing: { xs: 4, sm: 8, md: 12, lg: 16 },\n fontSize: { xs: 10, sm: 11, md: 13, lg: 15 },\n};\n\n/**\n * The light default, offered so a light host is one prop away rather than a\n * fifteen-value object away. Values mirror `catalog/styles.css`'s `:root`.\n */\nexport const LIGHT_AGENT_CATALOG_NATIVE_THEME: AgentCatalogNativeTheme = {\n ...DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n colors: {\n background: \"#ffffff\",\n surface: \"#f4f4f6\",\n surfacePressed: \"#e9e9ee\",\n text: \"#0b0b0f\",\n textMuted: \"#61616b\",\n textFaint: \"#8c8c96\",\n border: \"#e2e2e8\",\n primary: \"#2563eb\",\n primaryForeground: \"#ffffff\",\n primarySoft: \"#e5edfd\",\n favorite: \"#f59e0b\",\n driftBackground: \"#fef3c7\",\n driftForeground: \"#92400e\",\n driftBorder: \"#fcd34d\",\n },\n};\n\n/** A host may override any subset; everything it omits keeps its default. */\nexport type AgentCatalogNativeThemeOverride = {\n colors?: Partial<AgentCatalogNativeColors>;\n radius?: Partial<AgentCatalogNativeTheme[\"radius\"]>;\n spacing?: Partial<AgentCatalogNativeTheme[\"spacing\"]>;\n fontSize?: Partial<AgentCatalogNativeTheme[\"fontSize\"]>;\n};\n\n/** Merge a host override onto a base theme. Pure; never mutates either. */\nexport function resolveAgentCatalogNativeTheme(\n override?: AgentCatalogNativeThemeOverride,\n base: AgentCatalogNativeTheme = DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n): AgentCatalogNativeTheme {\n if (!override) return base;\n return {\n colors: { ...base.colors, ...(override.colors ?? {}) },\n radius: { ...base.radius, ...(override.radius ?? {}) },\n spacing: { ...base.spacing, ...(override.spacing ?? {}) },\n fontSize: { ...base.fontSize, ...(override.fontSize ?? {}) },\n };\n}\n","/**\n * catalog/native/AgentListSheet.tsx — THE agent picker for React Native.\n *\n * The BODY of a bottom sheet, not the sheet itself: a host keeps whatever\n * sheet chrome it already has (`@gorhom/bottom-sheet`, a modal, a drawer) and\n * drops this inside. Owning the chrome would force one gesture library on\n * every Matrx app; owning the CONTENT is the point — every client renders the\n * same rows in the same order with the same tabs and the same filters.\n */\n\nimport { StyleSheet, Text, View } from \"react-native\";\n\nimport { AgentPickerBody, type AgentPickerProps } from \"./AgentPickerBody\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\n\nexport interface AgentListSheetProps extends AgentPickerProps {\n /**\n * Heading above the picker. Omit it when the host's sheet chrome already\n * prints one — two titles is worse than none.\n */\n title?: string;\n}\n\nexport function AgentListSheet({ title, ...props }: AgentListSheetProps) {\n const theme = useAgentCatalogNativeTheme();\n return (\n <View style={[styles.sheet, { backgroundColor: theme.colors.background }]}>\n {title ? (\n <Text\n accessibilityRole=\"header\"\n style={{\n color: theme.colors.text,\n fontSize: theme.fontSize.lg + 3,\n fontWeight: \"700\",\n paddingHorizontal: theme.spacing.md,\n paddingTop: theme.spacing.sm,\n paddingBottom: theme.spacing.sm,\n }}\n >\n {title}\n </Text>\n ) : null}\n <AgentPickerBody {...props} />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n sheet: { flex: 1, minHeight: 0 },\n});\n","/**\n * catalog/native/AgentPickerBody.tsx — the ONE native picker body.\n *\n * `AgentListSheet` and `AgentListInlinePicker` are both thin shells over this\n * file, exactly as `AgentListDropdown` and `AgentListInlinePicker` are both\n * thin shells over `useAgentListCore` + `AgentListContent` on the web. The\n * three-view stack (list → detail peek → sort/categories/tags sub-view) is the\n * mobile shape the web `AgentListInlinePicker` already used.\n *\n * The prop surface below is the web shells' prop surface, name for name.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { StyleSheet, View } from \"react-native\";\n\nimport { useAgentListCore } from \"../shared/useAgentListCore\";\nimport type { AgentSummary, AgentTab } from \"../types\";\nimport { AgentDetailCard } from \"./AgentDetailCard\";\nimport { AgentListContent } from \"./AgentListContent\";\nimport { AgentSubView, type AgentSubViewName } from \"./AgentSubView\";\n\nexport interface AgentPickerProps {\n /** Unique consumer id for filter/tab state (see `useAgentConsumer`). */\n consumerId: string;\n /** THE ONLY CONTRACT BACK TO THE HOST (ruling D1). */\n onSelect: (agentId: string) => void;\n activeAgentId?: string | null;\n /** Focus the search field on mount. Default false on native — a keyboard\n * that opens with the sheet covers the list it was meant to filter. */\n autoFocusSearch?: boolean;\n /** Tab to open on. Admin surfaces that manage system agents pass `\"system\"`. */\n initialTab?: AgentTab;\n /** ADMIN variant: blend system agents into the \"All\" tab. */\n includeSystemInAll?: boolean;\n /** Restrict which ownership tabs this call site may reach. Enforced, not decorated. */\n visibleTabs?: readonly AgentTab[];\n /** Label override for the builtin-agent tab. Admin surfaces use \"System\". */\n systemTabLabel?: string;\n /** Show the host's active agent above the filtered list. Default true. */\n showPinnedAgent?: boolean;\n /** Hide records that are invalid for this call site. */\n excludeAgentIds?: readonly string[];\n /** Offer the mandate's live-resolved default agent at the top of the list. */\n defaultMandateKey?: string;\n /** Compact spacing for a short sheet. */\n compact?: boolean;\n /** Called after a selection, so a sheet shell can close itself. */\n onAfterSelect?: () => void;\n}\n\nexport function AgentPickerBody({\n consumerId,\n onSelect,\n activeAgentId = null,\n autoFocusSearch = false,\n initialTab,\n includeSystemInAll = false,\n visibleTabs,\n systemTabLabel,\n showPinnedAgent = true,\n excludeAgentIds,\n defaultMandateKey,\n compact = false,\n onAfterSelect,\n}: AgentPickerProps) {\n const [detailAgent, setDetailAgent] = useState<AgentSummary | null>(null);\n const [subView, setSubView] = useState<AgentSubViewName | null>(null);\n const [panelSearch, setPanelSearch] = useState(\"\");\n\n const {\n agents,\n archivedHiddenCount,\n isLoading,\n allCategories,\n allTags,\n consumer,\n tabCounts,\n activeFilterCount,\n pinnedAgent,\n defaultRow,\n ensureLoaded,\n handleSelectAgent: coreSelectAgent,\n } = useAgentListCore({\n consumerId,\n onSelect,\n activeAgentIdOverride: activeAgentId,\n ...(initialTab ? { initialTab } : {}),\n includeSystemInAll,\n // The restriction has to reach the CORE, not just the tab strip.\n ...(visibleTabs ? { visibleTabs } : {}),\n ...(excludeAgentIds ? { excludeAgentIds } : {}),\n ...(defaultMandateKey ? { defaultMandateKey } : {}),\n });\n\n useEffect(() => {\n ensureLoaded();\n }, [ensureLoaded]);\n\n const selectAgent = (agent: AgentSummary) => {\n coreSelectAgent(agent);\n setDetailAgent(null);\n setSubView(null);\n onAfterSelect?.();\n };\n\n if (detailAgent) {\n return (\n <View style={styles.fill}>\n <AgentDetailCard\n agent={detailAgent}\n onSelect={() => selectAgent(detailAgent)}\n />\n </View>\n );\n }\n\n if (subView) {\n return (\n <View style={styles.fill}>\n <AgentSubView\n view={subView}\n consumer={consumer}\n allCategories={allCategories}\n allTags={allTags}\n search={panelSearch}\n setSearch={setPanelSearch}\n onBack={() => {\n setSubView(null);\n setPanelSearch(\"\");\n }}\n />\n </View>\n );\n }\n\n return (\n <View style={[styles.fill, compact ? styles.compact : null]}>\n <AgentListContent\n agents={agents}\n isLoading={isLoading}\n consumer={consumer}\n activeAgentId={activeAgentId}\n allCategories={allCategories}\n allTags={allTags}\n onSelectAgent={selectAgent}\n onDetailPress={setDetailAgent}\n onFilterChipPress={setSubView}\n onReset={consumer.resetFilters}\n activeFilterCount={activeFilterCount}\n tabCounts={tabCounts}\n archivedHiddenCount={archivedHiddenCount}\n {...(visibleTabs ? { visibleTabs } : {})}\n {...(systemTabLabel ?? (includeSystemInAll ? \"System\" : undefined)\n ? {\n systemTabLabel:\n systemTabLabel ?? (includeSystemInAll ? \"System\" : undefined),\n }\n : {})}\n pinnedAgent={showPinnedAgent ? pinnedAgent : null}\n defaultRow={defaultRow}\n autoFocusSearch={autoFocusSearch}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1, minHeight: 0 },\n compact: { paddingTop: 0 },\n});\n","/**\n * catalog/shared/useAgentListCore.ts — VERBATIM port of matrx-frontend\n * `features/agents/components/agent-listings/useAgentListCore.ts`.\n *\n * Seams inverted:\n * - Redux (`useAppSelector`/`useAppDispatch`/`createSelector`) → the catalog\n * store and the plain memoized selectors in `../selectors`.\n * - `useRouter().push` → the `navigate` port (default `window.location.assign`).\n *\n * TWO BEHAVIOURAL DELTAS, recorded in the CHANGELOG rather than hidden:\n * 1. There is no app-wide \"active agent\" store in this package (that is host\n * state by ruling D1 — the picker's contract is `onSelect(agentId)`), so\n * the pinned row comes from the `activeAgentId` PROP alone. The\n * frontend's fallback to a Redux `activeAgentId` has no package twin.\n * 2. For the same reason, a call site that passes NEITHER `onSelect` NOR\n * `navigateTo` gets a loud `errorSink` report instead of the frontend's\n * `dispatch(setActiveAgentId(...))`. A click that does nothing silently\n * is the exact failure this package exists to stop.\n */\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { useAgentCatalog, useAgentCatalogRows, useAgentCatalogState, useAgentCatalogUiPorts } from \"./context\";\nimport { useAgentConsumer } from \"./useAgentConsumer\";\nimport { agentListFooterLabel, shouldDefaultAgentListToPublicTab } from \"../labels\";\nimport {\n makeSelectFilteredAgents,\n selectAllAgentCategories,\n selectAllAgentTags,\n selectAllSystemAgentCategories,\n selectAllSystemAgentTags,\n selectAgentTabCounts,\n} from \"../selectors\";\nimport type { AgentCatalogState } from \"../store\";\nimport type { DefaultRowState } from \"../default-row-types\";\nimport type { AgentArchFilter, AgentSummary, AgentTab } from \"../types\";\n\n/**\n * The four ownership counts a tab strip prints. Declared HERE, beside the code\n * that computes them, so both the web tab strip and the native one name the\n * same shape (0.9.0 — it used to live in the web-only `AgentListTabs`).\n *\n * 🚨 These are the numbers on the BADGES, and since 0.9.1 they count exactly\n * the rows the tab renders under the consumer's own archive filter. A badge\n * that counted rows the list hid was the screen telling the user something\n * untrue about her own agents.\n */\nexport interface AgentListTabCounts {\n mine: number;\n shared: number;\n all: number;\n system: number;\n}\n\nexport interface AgentListCoreOptions {\n consumerId: string;\n onSelect?: (agentId: string) => void;\n navigateTo?: string;\n /** Route-scoped agent id (chat/builder headers). `undefined` = nothing pinned. */\n activeAgentIdOverride?: string | null;\n /**\n * Tab this surface opens on, applied once on first mount. Admin surfaces\n * that manage system agents pass `\"system\"`. When omitted the normal\n * user heuristic applies (a user with no agents of their own lands on the\n * public/system catalogue).\n */\n initialTab?: AgentTab;\n /**\n * ADMIN reading of the \"All\" tab: blend system agents into it instead of\n * keeping them to their own tab. See `makeSelectFilteredAgents`.\n */\n includeSystemInAll?: boolean;\n /**\n * 🚨 THE OWNERSHIP TABS THIS CALL SITE MAY REACH — a HARD restriction, not a\n * default.\n *\n * `AgentListTabs` already hides the buttons this list omits, but hiding a\n * button never emptied the list behind it: the active tab lives in the\n * consumer's REMEMBERED state, and `initialTab` is applied exactly once per\n * mount (`defaultTabAppliedRef`). So a person who had been on \"Mine\" and\n * then moved a control that narrows the picker got the personal catalogue\n * with the tab bar removed — the forbidden list, and no way to see that it\n * was forbidden. That is the defect Arman named on the mandate binding\n * screen's global rung (VISION-RECONCILIATION D2, 2026-08-31: the picker\n * opened on \"Mine · 40\").\n *\n * Given here, the tab is COERCED into the allowed set on every change of it,\n * not just at mount — so a restriction that arrives later is enforced later.\n */\n visibleTabs?: readonly AgentTab[];\n /**\n * THE ARCHIVED-ITEMS LAW's per-consumer override of the catalog-wide\n * `defaults.archiveFilter` knob, applied once at first registration. Almost\n * nothing should pass it: the platform answer is \"hide archived\", and the\n * person reveals the archive from the control on the filter bar.\n */\n initialArchFilter?: AgentArchFilter;\n /** Hide records that are invalid for this call site. */\n excludeAgentIds?: readonly string[];\n /**\n * Show the platform DEFAULT agent for this mandate key at the top of the\n * list, resolved live through the server (never a hardcoded name). Requires\n * the catalog to have been built with a `transport`.\n */\n defaultMandateKey?: string;\n}\n\n/**\n * How long the hover-preview detail panel stays open after the cursor leaves\n * an agent row (or the panel itself) before it closes. Generous on purpose:\n * the panel renders to the side of the list, so the user needs ample time to\n * travel the cursor across the gap to reach it without it vanishing. Paired\n * with a reserved, non-resizing popover width so the target never moves.\n */\nexport const HOVER_GRACE_MS = 900;\n\n/**\n * THE RULE, ALONE AND TESTABLE: which tab a restricted picker must land on.\n *\n * Returns `null` when the current tab is already allowed (nothing to do), and\n * otherwise the tab to switch to — `initialTab` when that is itself allowed,\n * else the first allowed tab.\n */\nexport function coerceVisibleTab(\n current: AgentTab,\n allowed: readonly AgentTab[],\n initialTab?: AgentTab,\n): AgentTab | null {\n if (allowed.length === 0) return null;\n if (allowed.includes(current)) return null;\n return initialTab && allowed.includes(initialTab)\n ? initialTab\n : (allowed[0] ?? null);\n}\n\nconst EMPTY_EXCLUDES: readonly string[] = [];\n\nexport function useAgentListCore({\n consumerId,\n onSelect,\n navigateTo,\n activeAgentIdOverride,\n initialTab,\n includeSystemInAll = false,\n visibleTabs,\n initialArchFilter,\n excludeAgentIds = EMPTY_EXCLUDES,\n defaultMandateKey,\n}: AgentListCoreOptions) {\n const catalog = useAgentCatalog();\n const { navigate } = useAgentCatalogUiPorts();\n\n const hasFetchedRef = useRef(false);\n const [hoveredAgent, setHoveredAgent] = useState<AgentSummary | null>(null);\n const hoverLeaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const defaultTabAppliedRef = useRef(false);\n\n const consumer = useAgentConsumer(consumerId, {\n unregisterOnUnmount: true,\n ...(initialArchFilter ? { initialArchFilter } : {}),\n });\n const rows = useAgentCatalogRows();\n const userId = catalog.getUserIdOrNull();\n const tabCountsForFilter = selectAgentTabCounts(rows, consumer.state.archFilter);\n const ownedCount = tabCountsForFilter.mine;\n\n const selectFiltered = useMemo(\n () => makeSelectFilteredAgents(includeSystemInAll),\n [includeSystemInAll],\n );\n const filteredAgents = selectFiltered(rows, consumer.state);\n const excludedAgentIds = useMemo(\n () => new Set(excludeAgentIds),\n [excludeAgentIds],\n );\n const applyExcludes = useCallback(\n (list: AgentSummary[]): AgentSummary[] =>\n excludedAgentIds.size === 0\n ? list\n : list.filter((agent) => !excludedAgentIds.has(agent.id)),\n [excludedAgentIds],\n );\n const agents = applyExcludes(filteredAgents);\n\n // ── THE ARCHIVE PROBE — what the default state is keeping off the screen ──\n //\n // Clause 2 of THE ARCHIVED-ITEMS LAW: a footer counts what the list renders\n // and never implies the list is everything. So while archived rows are\n // hidden we also measure how many there ARE behind this exact tab, search,\n // category and tag selection — the same pipeline, one value changed — and\n // the footer says so. A second memoized selector instance keeps this off\n // the main one's memo slot, so the two never evict each other.\n const selectArchivedProbe = useMemo(\n () => makeSelectFilteredAgents(includeSystemInAll),\n [includeSystemInAll],\n );\n const archiveProbeState = useMemo(\n () => ({ ...consumer.state, archFilter: \"archived\" as const }),\n [consumer.state],\n );\n const archivedHiddenCount =\n consumer.archFilter === \"active\"\n ? applyExcludes(selectArchivedProbe(rows, archiveProbeState)).length\n : 0;\n\n const status = useAgentCatalogState(selectStatus);\n // `null` is an intentional \"nothing selected\" value for assignment\n // dropdowns. There is no app-wide active agent in this package (D1) — the\n // pinned row is whatever the host passes and nothing else.\n const activeAgentId = activeAgentIdOverride ?? null;\n const pinnedAgent = activeAgentId ? catalog.getAgent(activeAgentId) : undefined;\n\n // Category/tag options follow the ACTIVE TAB's population: user agents on\n // mine/shared/all, builtins on system. Same controls either way.\n const onSystemTab = consumer.tab === \"system\";\n const allCategories = onSystemTab\n ? selectAllSystemAgentCategories(rows)\n : selectAllAgentCategories(rows);\n const allTags = onSystemTab\n ? selectAllSystemAgentTags(rows)\n : selectAllAgentTags(rows);\n\n const tabCounts: AgentListTabCounts = tabCountsForFilter;\n\n const isLoading = status === \"loading\";\n const agentsLoaded = status === \"succeeded\" || status === \"failed\";\n\n const ensureLoaded = useCallback(() => {\n if (!hasFetchedRef.current) {\n hasFetchedRef.current = true;\n void catalog.ensureLoaded().catch(() => {\n // Already reported through the errorSink and reflected in `status`;\n // this catch only stops an unhandled rejection.\n });\n }\n }, [catalog]);\n\n // ── The mandate default row ─────────────────────────────────────────────\n const selectDefaultRow = useCallback(\n (state: AgentCatalogState): DefaultRowState | undefined =>\n defaultMandateKey ? state.defaultRows[defaultMandateKey] : undefined,\n [defaultMandateKey],\n );\n const defaultRow = useAgentCatalogState(selectDefaultRow);\n useEffect(() => {\n if (!defaultMandateKey) return;\n catalog.ensureDefaultRow(defaultMandateKey);\n }, [catalog, defaultMandateKey]);\n\n useEffect(() => {\n if (defaultTabAppliedRef.current) return;\n\n // An explicit surface default wins over the heuristic below, but only\n // once — after that the tab belongs to the user.\n if (initialTab) {\n defaultTabAppliedRef.current = true;\n if (consumer.tab !== initialTab) consumer.setTab(initialTab);\n return;\n }\n\n if (consumer.tab !== \"mine\") {\n defaultTabAppliedRef.current = true;\n return;\n }\n\n const wantsPublic = shouldDefaultAgentListToPublicTab({\n userId,\n ownedCount,\n agentsLoaded,\n });\n\n if (!wantsPublic) {\n if (!userId || agentsLoaded) {\n defaultTabAppliedRef.current = true;\n }\n return;\n }\n\n consumer.setTab(\"system\");\n defaultTabAppliedRef.current = true;\n }, [\n userId,\n ownedCount,\n agentsLoaded,\n initialTab,\n consumer.tab,\n consumer.setTab,\n ]);\n\n // 🚨 THE RESTRICTION IS ENFORCED, NOT DECORATED. A hidden tab whose rows are\n // still the ones being listed is worse than an offered one: the person sees a\n // catalogue this call site forbids and no control that explains why. The tab\n // is therefore coerced into the allowed set whenever it falls outside it —\n // including long after mount, when a control elsewhere on the page narrows\n // what this picker may reach. Keyed by the joined list so an inline array\n // literal does not re-fire this every render.\n const allowedTabsKey = visibleTabs ? visibleTabs.join(\",\") : \"\";\n useEffect(() => {\n if (!allowedTabsKey) return;\n const next = coerceVisibleTab(\n consumer.tab,\n allowedTabsKey.split(\",\") as AgentTab[],\n initialTab,\n );\n if (next) consumer.setTab(next);\n }, [allowedTabsKey, initialTab, consumer.tab, consumer.setTab]);\n\n useEffect(() => {\n ensureLoaded();\n }, [ensureLoaded]);\n\n const handleSelectAgent = useCallback(\n (agent: AgentSummary) => {\n if (onSelect) {\n onSelect(agent.id);\n } else if (navigateTo) {\n navigate(navigateTo.replace(\"{id}\", agent.id));\n } else {\n // Never a silent no-op — see the file header's delta 2.\n catalog.errorSink({\n code: \"select_has_nowhere_to_go\",\n message:\n \"an agent was chosen but this picker was given neither onSelect \" +\n \"nor navigateTo, so the choice went nowhere.\",\n context: { consumerId, agentId: agent.id },\n });\n }\n },\n [onSelect, navigateTo, navigate, catalog, consumerId],\n );\n\n const activeFilterCount =\n (consumer.sortBy !== \"updated-desc\" ? 1 : 0) +\n (consumer.includedCats.length > 0 ? 1 : 0) +\n (consumer.includedTags.length > 0 ? 1 : 0) +\n (consumer.favFilter !== \"all\" ? 1 : 0) +\n // The archive filter counts like every other filter, so a list showing\n // archived rows offers the reset control that puts them away again.\n (consumer.archFilter !== consumer.archFilterDefault ? 1 : 0);\n\n const handleAgentHover = useCallback(\n (agent: AgentSummary, panelOpen: boolean) => {\n if (panelOpen) return;\n if (hoverLeaveTimerRef.current) {\n clearTimeout(hoverLeaveTimerRef.current);\n hoverLeaveTimerRef.current = null;\n }\n setHoveredAgent(agent);\n },\n [],\n );\n\n const handleAgentHoverEnd = useCallback(\n (agent: AgentSummary, onClear: () => void) => {\n if (hoveredAgent?.id === agent.id) {\n hoverLeaveTimerRef.current = setTimeout(() => {\n setHoveredAgent(null);\n onClear();\n }, HOVER_GRACE_MS);\n }\n },\n [hoveredAgent],\n );\n\n const handleDetailPanelMouseEnter = useCallback(() => {\n if (hoverLeaveTimerRef.current) {\n clearTimeout(hoverLeaveTimerRef.current);\n hoverLeaveTimerRef.current = null;\n }\n }, []);\n\n const handleDetailPanelMouseLeave = useCallback((onClear: () => void) => {\n hoverLeaveTimerRef.current = setTimeout(() => {\n setHoveredAgent(null);\n onClear();\n }, HOVER_GRACE_MS);\n }, []);\n\n useEffect(\n () => () => {\n if (hoverLeaveTimerRef.current) clearTimeout(hoverLeaveTimerRef.current);\n },\n [],\n );\n\n /**\n * The footer's words, computed once from the numbers the list actually\n * rendered — identical on web and native because neither shell formats it\n * itself. See `agentListFooterLabel`.\n */\n const footerLabel = agentListFooterLabel({\n count: agents.length,\n archFilter: consumer.archFilter,\n archivedHiddenCount,\n });\n\n return {\n agents,\n archivedHiddenCount,\n footerLabel,\n isLoading,\n activeAgentId,\n pinnedAgent: pinnedAgent ?? null,\n defaultRow: defaultRow ?? null,\n allCategories,\n allTags,\n consumer,\n tabCounts,\n activeFilterCount,\n hoveredAgent,\n setHoveredAgent,\n ensureLoaded,\n handleSelectAgent,\n handleAgentHover,\n handleAgentHoverEnd,\n handleDetailPanelMouseEnter,\n handleDetailPanelMouseLeave,\n };\n}\n\nconst selectStatus = (state: AgentCatalogState) => state.status;\n","/**\n * catalog/shared/useAgentConsumer.ts — VERBATIM port of matrx-frontend\n * `features/agents/hooks/useAgentConsumer.ts`.\n *\n * Wraps a single consumer slot identified by `consumerId`. Registers the slot\n * on mount, optionally unregisters on unmount, and returns every filter/sort/\n * pagination value plus stable write helpers.\n *\n * Two seams inverted, nothing else:\n * - `useAppSelector`/`useAppDispatch` → `useAgentCatalog()` + the store's\n * own methods.\n * - `useServerAgentSearch` (a separate frontend hook) is folded IN, because\n * it was already wired here and nowhere else: EVERY agent surface that\n * uses a consumer searches the full server-side set. A local-only search\n * over a paginated list reports \"no results\" for agents that were merely\n * never fetched — a wrong answer, not a missing feature.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useAgentCatalog, useAgentCatalogState } from \"./context\";\nimport type {\n AgentAccessFilter,\n AgentArchFilter,\n AgentFavFilter,\n AgentSortOption,\n AgentTab,\n AgentConsumerPatch,\n AgentConsumerState,\n} from \"../types\";\nimport type { AgentCatalogState } from \"../store\";\n\nconst DEBOUNCE_MS = 250;\n\n/** Below this length a query matches too much to be worth a round trip. */\nconst MIN_QUERY_LENGTH = 2;\n\nexport interface UseAgentConsumerReturn {\n // ── Read ────────────────────────────────────────────────────────────────\n tab: AgentTab;\n sortBy: AgentSortOption;\n searchTerm: string;\n includedCats: string[];\n includedTags: string[];\n favFilter: AgentFavFilter;\n archFilter: AgentArchFilter;\n /**\n * The archive-filter state this catalog starts consumers in — the platform\n * default `\"active\"` unless the host set the knob. What \"not the default\n * state\" means on this surface, so the control and the footer can both say\n * it honestly.\n */\n archFilterDefault: AgentArchFilter;\n accessFilter: AgentAccessFilter;\n favoritesFirst: boolean;\n listPage: number;\n sharedPage: number;\n\n /** The whole slot, for the selectors that take a consumer state. */\n state: AgentConsumerState;\n\n /** True if any filter differs from its default value. */\n hasActiveFilters: boolean;\n\n /** Tier 2 search — also match against agent prompt content. */\n deepSearch: boolean;\n\n /** True while a server-side search is in flight. */\n isServerSearching: boolean;\n\n // ── Write ───────────────────────────────────────────────────────────────\n setSearchTerm: (value: string) => void;\n setDeepSearch: (value: boolean) => void;\n setSortBy: (value: AgentSortOption) => void;\n setTab: (value: AgentTab) => void;\n setFavFilter: (value: AgentFavFilter) => void;\n setArchFilter: (value: AgentArchFilter) => void;\n setAccessFilter: (value: AgentAccessFilter) => void;\n\n /** Add category to inclusion set; if already present, remove (toggle). */\n toggleCategory: (cat: string) => void;\n /** Add tag to inclusion set; if already present, remove (toggle). */\n toggleTag: (tag: string) => void;\n\n /**\n * Replace the WHOLE category inclusion set in one write.\n *\n * Prefer this over looping `toggleCategory` whenever more than one value\n * changes. Each `toggleCategory` call computes its next array from the\n * `includedCats` captured in the CURRENT render, so two toggles fired in the\n * same tick both start from the same snapshot and the second one's patch\n * overwrites the first — a \"Clear filter\" click with three categories active\n * removes only one. One write of the final set cannot drift that way.\n */\n setIncludedCats: (next: string[]) => void;\n /** Replace the WHOLE tag inclusion set in one write. See setIncludedCats. */\n setIncludedTags: (next: string[]) => void;\n\n toggleFavoritesFirst: () => void;\n\n loadMoreList: () => void;\n loadMoreShared: () => void;\n\n resetFilters: () => void;\n}\n\nexport function useAgentConsumer(\n consumerId: string,\n options?: {\n /** Delete the slot on unmount. Default false — persistent consumers keep state. */\n unregisterOnUnmount?: boolean;\n /** Applied only when the consumer is first registered (idempotent). */\n initialTab?: AgentTab;\n /**\n * THE ARCHIVED-ITEMS LAW's per-consumer override of the catalog-wide\n * `defaults.archiveFilter` knob. Applied only at first registration — the\n * state belongs to the person after that.\n */\n initialArchFilter?: AgentArchFilter;\n },\n): UseAgentConsumerReturn {\n const catalog = useAgentCatalog();\n const defaults = catalog.consumerDefaults;\n const selectConsumer = useCallback(\n (state: AgentCatalogState): AgentConsumerState =>\n state.consumers[consumerId] ?? defaults,\n [consumerId, defaults],\n );\n const consumer = useAgentCatalogState(selectConsumer);\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n const opts = optionsRef.current;\n const initial: AgentConsumerPatch = {\n ...(opts?.initialTab ? { tab: opts.initialTab } : {}),\n ...(opts?.initialArchFilter\n ? { archFilter: opts.initialArchFilter }\n : {}),\n };\n catalog.registerConsumer(\n consumerId,\n Object.keys(initial).length > 0 ? initial : undefined,\n );\n return () => {\n if (optionsRef.current?.unregisterOnUnmount) {\n catalog.unregisterConsumer(consumerId);\n }\n };\n }, [consumerId, catalog]);\n\n // ── Write helpers (stable references) ───────────────────────────────────\n\n const setSearchTerm = useCallback(\n (value: string) => catalog.setConsumerFilter(consumerId, { searchTerm: value }),\n [consumerId, catalog],\n );\n const setDeepSearch = useCallback(\n (value: boolean) => catalog.setConsumerFilter(consumerId, { deepSearch: value }),\n [consumerId, catalog],\n );\n const setSortBy = useCallback(\n (value: AgentSortOption) =>\n catalog.setConsumerFilter(consumerId, { sortBy: value }),\n [consumerId, catalog],\n );\n const setTab = useCallback(\n (value: AgentTab) => catalog.setConsumerFilter(consumerId, { tab: value }),\n [consumerId, catalog],\n );\n const setFavFilter = useCallback(\n (value: AgentFavFilter) =>\n catalog.setConsumerFilter(consumerId, { favFilter: value }),\n [consumerId, catalog],\n );\n const setArchFilter = useCallback(\n (value: AgentArchFilter) =>\n catalog.setConsumerFilter(consumerId, { archFilter: value }),\n [consumerId, catalog],\n );\n const setAccessFilter = useCallback(\n (value: AgentAccessFilter) =>\n catalog.setConsumerFilter(consumerId, { accessFilter: value }),\n [consumerId, catalog],\n );\n\n const toggleCategory = useCallback(\n (cat: string) => {\n const current = catalog.getConsumer(consumerId).includedCats;\n const next = current.includes(cat)\n ? current.filter((c) => c !== cat)\n : [...current, cat];\n catalog.setConsumerFilter(consumerId, { includedCats: next });\n },\n [consumerId, catalog],\n );\n\n const toggleTag = useCallback(\n (tag: string) => {\n const current = catalog.getConsumer(consumerId).includedTags;\n const next = current.includes(tag)\n ? current.filter((t) => t !== tag)\n : [...current, tag];\n catalog.setConsumerFilter(consumerId, { includedTags: next });\n },\n [consumerId, catalog],\n );\n\n const setIncludedCats = useCallback(\n (next: string[]) => catalog.setConsumerFilter(consumerId, { includedCats: next }),\n [consumerId, catalog],\n );\n const setIncludedTags = useCallback(\n (next: string[]) => catalog.setConsumerFilter(consumerId, { includedTags: next }),\n [consumerId, catalog],\n );\n\n const toggleFavoritesFirst = useCallback(\n () =>\n catalog.setConsumerFilter(consumerId, {\n favoritesFirst: !catalog.getConsumer(consumerId).favoritesFirst,\n }),\n [consumerId, catalog],\n );\n\n const loadMoreList = useCallback(\n () =>\n catalog.setConsumerPage(\n consumerId,\n \"list\",\n catalog.getConsumer(consumerId).listPage + 1,\n ),\n [consumerId, catalog],\n );\n const loadMoreShared = useCallback(\n () =>\n catalog.setConsumerPage(\n consumerId,\n \"shared\",\n catalog.getConsumer(consumerId).sharedPage + 1,\n ),\n [consumerId, catalog],\n );\n\n const resetFilters = useCallback(\n () => catalog.resetConsumerFilters(consumerId),\n [consumerId, catalog],\n );\n\n // ── Server-side search (folded in — see the file header) ────────────────\n //\n // Debounced, and stale responses are ignored so a slow reply for an old\n // query can never land after a newer one. Purely additive: local matches\n // keep rendering the whole time; server results merge in and simply appear.\n\n const [isSearching, setIsSearching] = useState(false);\n const [matchedIds, setMatchedIds] = useState<string[] | null>(null);\n const requestSeq = useRef(0);\n const query = consumer.searchTerm;\n const deep = consumer.deepSearch;\n\n useEffect(() => {\n const q = query.trim();\n if (q.length < MIN_QUERY_LENGTH) {\n setIsSearching(false);\n setMatchedIds(null);\n return undefined;\n }\n\n const seq = ++requestSeq.current;\n setIsSearching(true);\n\n const timer = setTimeout(() => {\n void catalog\n .searchServer(q, deep)\n .then((ids) => {\n if (seq !== requestSeq.current) return; // superseded\n setMatchedIds(ids);\n setIsSearching(false);\n })\n .catch((e: unknown) => {\n if (seq !== requestSeq.current) return; // superseded\n // Loud, but never destructive: local results stay on screen.\n catalog.errorSink({\n code: \"server_search_failed\",\n message: `agent search failed: ${e instanceof Error ? e.message : String(e)}`,\n context: { query: q, deep },\n });\n setIsSearching(false);\n });\n }, DEBOUNCE_MS);\n\n return () => clearTimeout(timer);\n }, [query, deep, catalog]);\n\n useEffect(() => {\n catalog.setConsumerServerSearch(consumerId, {\n matchedIds: matchedIds ?? [],\n isSearching,\n });\n }, [consumerId, catalog, matchedIds, isSearching]);\n\n // ── hasActiveFilters (verbatim) ─────────────────────────────────────────\n const hasActiveFilters =\n consumer.searchTerm !== \"\" ||\n consumer.includedCats.length > 0 ||\n consumer.includedTags.length > 0 ||\n consumer.favFilter !== \"all\" ||\n // The archive filter is compared to THIS CATALOG'S default, not to the\n // hardcoded platform one: a host that legitimately defaults to \"show all\"\n // must not have the reset control permanently lit.\n consumer.archFilter !== defaults.archFilter ||\n consumer.accessFilter !== \"any\" ||\n !consumer.favoritesFirst;\n\n return {\n tab: consumer.tab,\n sortBy: consumer.sortBy,\n searchTerm: consumer.searchTerm,\n includedCats: consumer.includedCats,\n includedTags: consumer.includedTags,\n favFilter: consumer.favFilter,\n archFilter: consumer.archFilter,\n archFilterDefault: defaults.archFilter,\n accessFilter: consumer.accessFilter,\n favoritesFirst: consumer.favoritesFirst,\n listPage: consumer.listPage,\n sharedPage: consumer.sharedPage,\n state: consumer,\n hasActiveFilters,\n deepSearch: consumer.deepSearch,\n isServerSearching: consumer.isServerSearching,\n setSearchTerm,\n setDeepSearch,\n setSortBy,\n setTab,\n setFavFilter,\n setArchFilter,\n setAccessFilter,\n toggleCategory,\n toggleTag,\n setIncludedCats,\n setIncludedTags,\n toggleFavoritesFirst,\n loadMoreList,\n loadMoreShared,\n resetFilters,\n };\n}\n","/**\n * `@ai-matrx/agents/catalog` — the row shape and the per-consumer view state.\n *\n * `AgentSummary` is the 19-column row `agx_get_list_full()` returns, camelCased.\n * It is deliberately NOT the editable agent record: dirty tracking, undo,\n * messages, tools and `_fetchStatus` stay in whichever host owns the editor.\n * A list row is a list row.\n *\n * The view-state types are a VERBATIM port of matrx-frontend\n * `features/agents/redux/agent-consumers/slice.ts` — only the coupling seam\n * inverts (Redux reducers become store actions in `./store`).\n */\n\n/**\n * A branded agent id. Every id that reaches `onSelect` is one of these:\n * either a `agent.definition` UUID, or the `mandate:<key>` reference a\n * default row carries (byte-identical to the ref shape matrx-extend\n * `src/lib/mandates.ts` and matrx-local `desktop/src/lib/mandates.ts`\n * already hand back to their hosts).\n *\n * 🚨 The brand is a STRING LITERAL, never `unique symbol`. This package emits\n * `./catalog` and `./catalog/react` as two separate bundles, so each `.d.ts`\n * carries its own copy of these declarations. A `unique symbol` brand is\n * NOMINAL: two copies of it are unrelated types, so `createAgentCatalog()`\n * from `./catalog` was not assignable to `<AgentCatalogProvider catalog=…>`\n * from `./catalog/react` — the exact two-import wiring the README, the\n * CHANGELOG and every consumer use. A literal brand is structural, so the two\n * copies unify, while a bare `string` still cannot be passed where an\n * `AgentId` is required (which is the whole point of branding). Any future\n * brand in this package follows the same rule.\n */\nexport type AgentId = string & { readonly __agentId: \"ai-matrx.agent-id\" };\n\n/** Brand a raw string as an `AgentId`. */\nexport function asAgentId(value: string): AgentId {\n return value as AgentId;\n}\n\n/** The `mandate:<key>` ref shape every client already speaks. */\nexport function mandateAgentId(mandateKey: string): AgentId {\n return `mandate:${mandateKey}` as AgentId;\n}\n\n/** True when an id is a mandate default row rather than a stored agent. */\nexport function isMandateAgentId(id: string): boolean {\n return id.startsWith(\"mandate:\");\n}\n\n/** `agent_type` verbatim. Only `builtin` changes how a row is grouped. */\nexport type AgentCatalogAgentType = \"user\" | \"builtin\";\n\n/**\n * `access_level` verbatim from `agx_get_list_full`. Widened over the raw\n * string because it is a DB-owned vocabulary: an unknown level renders as\n * itself rather than being coerced into a wrong one.\n */\nexport type AgentAccessLevel =\n | \"owner\"\n | \"admin\"\n | \"editor\"\n | \"viewer\"\n | \"system\"\n | (string & {});\n\n/**\n * Present on a catalog row ONLY when that agent is an **Orchestra** — a\n * conductor that delegates to member agents at run time. Choosing one for a\n * step, a chat or a workflow node runs the whole ensemble, so a person has to\n * be able to SEE that before choosing, not discover it from the run.\n *\n * The DB decides. `agx_get_list_full` / `agx_get_list` / `agx_search` build\n * this from `platform.associations` (the conductor self-edge plus its member\n * edges) in one `agx_orchestra_badges()` join — never a second fetch, and\n * never a per-row read. `null` for every ordinary agent.\n *\n * History: the badge lived only in the Python `GET /agents` route, so every\n * client lost it when the pickers moved to the RPC. It is a ROW FIELD now, in\n * the one read every client shares.\n */\nexport interface OrchestraBadge {\n /** How the ensemble runs: `supervisor` | `sequential` | `parallel` | `dag`, or a future mode verbatim. */\n mode: string;\n /** The composition's one-line description, when its author wrote one. */\n tagline: string | null;\n /**\n * The per-composition delegation-depth budget AS DECLARED, or `null` when\n * the composition declares none. Deliberately NOT defaulted here: the\n * platform's fallback ceiling is enforced by the server that runs the\n * ensemble, and a badge that invented a number would be reporting a promise\n * nobody made.\n */\n depthBudget: number | null;\n /** Member edges. From the ROW count, so an unlabelled ensemble still counts. */\n memberCount: number;\n /** Only REAL role titles — an ensemble with unlabelled edges yields `[]`. */\n memberTitles: string[];\n}\n\n/**\n * One `agx_get_list_full()` row, camelCased. Nineteen columns, no more:\n * anything richer needs a different read and is a different type.\n */\nexport interface AgentSummary {\n id: AgentId;\n name: string | null;\n description: string | null;\n category: string | null;\n tags: string[];\n agentType: AgentCatalogAgentType;\n modelId: string | null;\n isActive: boolean;\n isArchived: boolean;\n isFavorite: boolean;\n createdBy: string | null;\n organizationId: string | null;\n taskId: string | null;\n sourceAgentId: string | null;\n createdAt: string | null;\n updatedAt: string | null;\n // Access metadata\n isOwner: boolean | null;\n accessLevel: AgentAccessLevel | null;\n sharedByEmail: string | null;\n /**\n * The Orchestra badge, or `null` for an ordinary agent. Strict: every row\n * carries the key, so a surface reads `agent.orchestra` and never has to ask\n * whether the column existed.\n */\n orchestra: OrchestraBadge | null;\n /**\n * Set only on a mandate default row — the key it resolved through, so a\n * host can tell \"the default\" from a stored agent without parsing the id.\n */\n mandateKey?: string;\n}\n\n// ── Per-consumer view state (verbatim port of the agent-consumers slice) ─────\n\nexport type AgentSortOption =\n | \"updated-desc\"\n | \"created-desc\"\n | \"name-asc\"\n | \"name-desc\"\n | \"category-asc\";\n\n/**\n * The sort choices a picker offers, in order. PURE DATA, so it lives in the\n * pure entry: a server-reachable manifest reads it at module scope, and\n * importing it from the client-stamped `./catalog/react` bundle dragged React\n * into a server graph for the sake of five string pairs. `./catalog/react`\n * re-exports it unchanged, so no consumer has to move.\n *\n * (Written \"client-stamped\", never with the literal directive: this comment is\n * emitted into `dist/catalog/index.d.ts`, and the tarball canary rightly\n * refuses that directive anywhere in a PURE entry.)\n */\nexport const SORT_OPTIONS: { value: AgentSortOption; label: string }[] = [\n { value: \"updated-desc\", label: \"Recent\" },\n { value: \"created-desc\", label: \"Created\" },\n { value: \"name-asc\", label: \"A → Z\" },\n { value: \"name-desc\", label: \"Z → A\" },\n { value: \"category-asc\", label: \"Category\" },\n];\n\n/** Which ownership tab is active in the agent list. */\nexport type AgentTab = \"mine\" | \"shared\" | \"all\" | \"system\";\n\n/** Favorite filter. */\nexport type AgentFavFilter = \"all\" | \"yes\" | \"no\";\n\n/**\n * The archive filter — THE ARCHIVED-ITEMS LAW's ONE control, in this\n * package's existing vocabulary.\n *\n * > \"everything should have an archive filter, and the default should always\n * > hide archived, but seeing archived items should be one or two clicks\n * > away.\" — Arman, 2026-09-09 (`common-docs/policies/archived-items.md`)\n *\n * Three states and no more, identical for every entity on the platform:\n *\n * | value | the platform's words | what the list shows |\n * |------------|----------------------|--------------------------|\n * | `active` | hide archived | only un-archived rows |\n * | `both` | show all | every row |\n * | `archived` | archived only | only archived rows |\n *\n * `active` is the platform default, and it is a KNOB — see\n * `AgentCatalogConfig.defaults.archiveFilter`.\n */\nexport type AgentArchFilter = \"active\" | \"archived\" | \"both\";\n\n/** Every legal archive-filter value, in the order the control cycles them. */\nexport const ARCHIVE_FILTER_ORDER: readonly AgentArchFilter[] = [\n \"active\",\n \"both\",\n \"archived\",\n];\n\nexport interface AgentArchFilterOption {\n value: AgentArchFilter;\n /** The platform's own words for the state — what a menu row would read. */\n label: string;\n /** What the filter-bar chip reads while this state is the active one. */\n chip: string;\n}\n\n/**\n * 🚨 ONE CONTROL, THREE STATES, SAME WORDS EVERYWHERE. A surface that invents\n * its own archive vocabulary breaks clause 3 of the law (\"the same primitive\n * everywhere … not a per-feature invention\").\n */\nexport const ARCHIVE_FILTER_OPTIONS: readonly AgentArchFilterOption[] = [\n { value: \"active\", label: \"Hide archived\", chip: \"Archive\" },\n { value: \"both\", label: \"Show all\", chip: \"All + archived\" },\n { value: \"archived\", label: \"Archived only\", chip: \"Archived only\" },\n];\n\n/**\n * The next state of the cycling control: hide archived → show all → archived\n * only → hide archived. Pure, so the web chip and the native chip cannot\n * drift apart, and so \"the control reveals archived rows in ONE action\" is a\n * testable claim rather than a UI opinion.\n */\nexport function nextArchFilter(current: AgentArchFilter): AgentArchFilter {\n const index = ARCHIVE_FILTER_ORDER.indexOf(current);\n if (index < 0) return ARCHIVE_FILTER_ORDER[0] as AgentArchFilter;\n return ARCHIVE_FILTER_ORDER[\n (index + 1) % ARCHIVE_FILTER_ORDER.length\n ] as AgentArchFilter;\n}\n\n/** True when `value` is one of the three legal states. */\nexport function isAgentArchFilter(value: unknown): value is AgentArchFilter {\n return value === \"active\" || value === \"archived\" || value === \"both\";\n}\n\n/**\n * Access level filter.\n * 'any' = no restriction (default).\n * 'owned' = only agents the user owns (isOwner = true).\n * 'shared' = only agents shared with the user (isOwner = false).\n * 'editable' = owner + admin + editor.\n */\nexport type AgentAccessFilter = \"any\" | \"owned\" | \"shared\" | \"editable\";\n\n/** Sentinel meaning \"include uncategorized / untagged\" items. */\nexport const AGENT_NONE_SENTINEL = \"__none__\";\n\nexport interface AgentConsumerState {\n tab: AgentTab;\n sortBy: AgentSortOption;\n searchTerm: string;\n\n /** INCLUSION model: empty = show all; non-empty = only matching. */\n includedCats: string[];\n\n /** INCLUSION model: empty = show all; non-empty = only matching. */\n includedTags: string[];\n\n favFilter: AgentFavFilter;\n archFilter: AgentArchFilter;\n accessFilter: AgentAccessFilter;\n favoritesFirst: boolean;\n\n /** Current page for owned-agent list items (after the card section). */\n listPage: number;\n\n /** Current page for shared-agent list items. */\n sharedPage: number;\n\n /**\n * Ids returned by the last server-side search (`agx_search`), in server rank\n * order. Additive: an agent in this list survives the search filter even\n * when the local scorer gives it 0.\n *\n * That is load-bearing for tier 2. A deep search matches an agent's prompt\n * content, which the client never loads — so the local scorer cannot see it.\n * Without this list the server would return prompt matches and the UI would\n * immediately filter them back out.\n *\n * Server-only matches sort BELOW every locally-scored match, in server rank\n * order, so obvious matches always come first.\n */\n serverMatchedIds: string[];\n\n /** True while a server search is in flight — drives the search spinner. */\n isServerSearching: boolean;\n\n /** Tier 2: also search agent prompt content. Opt-in, per consumer. */\n deepSearch: boolean;\n}\n\nexport const DEFAULT_AGENT_CONSUMER_STATE: AgentConsumerState = {\n tab: \"mine\",\n sortBy: \"updated-desc\",\n searchTerm: \"\",\n includedCats: [],\n includedTags: [],\n favFilter: \"all\",\n archFilter: \"active\",\n accessFilter: \"any\",\n favoritesFirst: true,\n listPage: 1,\n sharedPage: 1,\n serverMatchedIds: [],\n isServerSearching: false,\n deepSearch: false,\n};\n\n/** The subset of consumer state a caller may patch (paging is derived). */\nexport type AgentConsumerPatch = Partial<\n Omit<AgentConsumerState, \"listPage\" | \"sharedPage\">\n>;\n\n// ── Loud configuration failure ───────────────────────────────────────────────\n\n/**\n * Thrown by `createAgentCatalog` when a REQUIRED port is missing or an\n * optional feature was asked for without the port it needs. Never a warning,\n * never a degraded catalog: a picker that cannot read is not a picker.\n */\nexport class AgentCatalogConfigError extends Error {\n override readonly name = \"AgentCatalogConfigError\";\n /** Machine code, for a host that routes config failures. */\n readonly code: string;\n /** What the host must do, in a sentence a person can act on. */\n readonly remedy: string;\n\n constructor(args: { code: string; message: string; remedy: string }) {\n super(`${args.message} — ${args.remedy}`);\n this.code = args.code;\n this.remedy = args.remedy;\n }\n}\n","/**\n * catalog/labels.ts — @ai-matrx/agents/catalog\n *\n * VERBATIM port of matrx-frontend `features/agents/constants/agent-list-labels.ts`.\n * The only seam inverted: the two label constants moved into the `labels` port\n * (`DEFAULT_AGENT_CATALOG_LABELS.publicTab` / `.publicBadge`) so a host can\n * override them; the FUNCTIONS below keep their exact behaviour.\n */\n\nimport type { AgentCatalogLabels } from \"./ports\";\nimport { ARCHIVE_FILTER_OPTIONS, nextArchFilter } from \"./types\";\nimport type { AgentArchFilter, AgentTab } from \"./types\";\n\nexport function agentListEmptyLabel(\n tab: AgentTab,\n labels: AgentCatalogLabels,\n): string {\n switch (tab) {\n case \"system\":\n // 🚨 The tab IS the system tab, and the surfaces that mount this picker\n // call that rung \"System\" (V1 round 3). Saying \"public\" here made the\n // empty state name a different thing from the rung the person had just\n // chosen. The tab's own LABEL is a wider vocabulary question and is left\n // alone — this only stops the empty state contradicting its own case.\n return labels.emptySystem;\n case \"shared\":\n return labels.emptyShared;\n default:\n return labels.emptyDefault;\n }\n}\n\n/** Whether a list picker should default to the public (`system`) tab instead of Mine. */\nexport function shouldDefaultAgentListToPublicTab(args: {\n userId: string | null;\n ownedCount: number;\n agentsLoaded: boolean;\n}): boolean {\n if (!args.userId) return true;\n if (!args.agentsLoaded) return false;\n return args.ownedCount === 0;\n}\n\n// ── THE ARCHIVED-ITEMS LAW — the control's words, and the honest footer ─────\n//\n// `common-docs/policies/archived-items.md`, Arman 2026-09-09:\n//\n// \"everything should have an archive filter, and the default should always\n// hide archived, but seeing archived items should be one or two clicks\n// away.\"\n//\n// Clause 2 of that law is why these live here rather than inside a component:\n// \"Counts, badges, footers and pagination count what the list renders — a\n// screen never lies.\" The footer string is computed ONCE, from the same\n// numbers the list rendered, for both platforms.\n\n/** What the filter-bar chip reads in each state. */\nexport function agentArchiveFilterChipLabel(archFilter: AgentArchFilter): string {\n return (\n ARCHIVE_FILTER_OPTIONS.find((o) => o.value === archFilter)?.chip ?? \"Archive\"\n );\n}\n\n/** The platform's words for the state — menus, aria-labels, help text. */\nexport function agentArchiveFilterStateLabel(\n archFilter: AgentArchFilter,\n): string {\n return (\n ARCHIVE_FILTER_OPTIONS.find((o) => o.value === archFilter)?.label ??\n \"Hide archived\"\n );\n}\n\n/**\n * The accessible name of the ONE control, always naming the state it is IN\n * and the state one click moves it to. A control whose label does not say\n * what it currently does is the \"dead or dishonest\" shape the platform bans.\n */\nexport function agentArchiveFilterControlLabel(\n archFilter: AgentArchFilter,\n): string {\n return `Archive filter: ${agentArchiveFilterStateLabel(\n archFilter,\n ).toLowerCase()}. Click for ${agentArchiveFilterStateLabel(\n nextArchFilter(archFilter),\n ).toLowerCase()}`;\n}\n\n/**\n * THE FOOTER. It counts exactly what the list rendered and, whenever archived\n * rows are involved, says so — hidden ones included.\n *\n * hide archived, nothing archived behind it → \"412 agents\"\n * hide archived, 4 archived behind it → \"412 agents · 4 archived hidden\"\n * show all → \"416 agents · archived shown\"\n * archived only → \"4 archived shown\"\n */\nexport function agentListFooterLabel(args: {\n /** Rows actually rendered. */\n count: number;\n archFilter: AgentArchFilter;\n /**\n * Rows this view WOULD render if the filter were flipped to \"archived only\"\n * — exactly what the default state is keeping off the screen. Only ever\n * read in the `active` state.\n */\n archivedHiddenCount: number;\n}): string {\n const { count, archFilter, archivedHiddenCount } = args;\n if (archFilter === \"archived\") return `${count} archived shown`;\n const base = `${count} agent${count !== 1 ? \"s\" : \"\"}`;\n if (archFilter === \"both\") return `${base} · archived shown`;\n return archivedHiddenCount > 0\n ? `${base} · ${archivedHiddenCount} archived hidden`\n : base;\n}\n","// catalog/score.ts — @ai-matrx/agents/catalog\n//\n// THE canonical agent relevance scorer. One implementation, every surface,\n// every APP. Ported VERBATIM (behaviour byte-for-byte) from matrx-frontend\n// `features/agents/search/score.ts`; only the file header changed.\n//\n// This existed twice with drifted weights — the gallery copy in\n// `features/agents/redux/agent-consumers/selectors.ts` and a chat-side copy in\n// the (deleted 2026-08) legacy agentCache selectors. The chat copy scored an id\n// match at 50 with no exact-id bonus, so searching a chat-side picker by UUID\n// was effectively dead. Everything now delegates here.\n//\n// Pure: no Redux, no store types, no imports. Anything that can describe an\n// agent structurally can be scored.\n//\n// Adding a field? Add it here and it lights up on every surface at once.\n// Never fork this function.\n//\n// ── SQL PARITY (load-bearing) ───────────────────────────────────────────────\n// `public.agx_search_score` in migrations/agx_search_score.sql is the SQL\n// mirror of this function. Server-side paging FORCES a second implementation —\n// relevance has to be computed before LIMIT, which the browser cannot do — but\n// the two must stay in lockstep.\n//\n// CHANGE ONE, CHANGE THE OTHER IN THE SAME COMMIT, and keep the weights below\n// identical to the SQL constants. Guarded by score.parity.test.ts against the\n// shared fixture in __fixtures__/search-score-parity.json.\n//\n// This is not hypothetical: /agents/all shipped with a flat SQL `ILIKE OR` and\n// no ranking at all, so a description match tied with a name match and\n// searching \"image\" buried every image agent under unrelated ones.\n\n/**\n * The structural shape a record needs to be searchable. Every field except\n * `id` is optional so both the full gallery record and the slim chat record\n * satisfy it without adapters.\n */\nexport interface AgentSearchable {\n id: string;\n name?: string | null;\n description?: string | null;\n category?: string | null;\n tags?: string[] | null;\n modelId?: string | null;\n agentType?: string | null;\n outputFormat?: string | null;\n sharedByEmail?: string | null;\n}\n\n/**\n * Relevance score for an agent against a query. Higher = more relevant.\n * Returns 0 when nothing matches (0 is the \"no match\" contract — see\n * `agentMatchesSearch`).\n *\n * Scores only fields carried by the list-level fetches. Message content and\n * variable definitions are deliberately excluded: they are not loaded by the\n * list RPCs, so matching them here would be a false promise. Server-side\n * search owns deep content matching.\n */\nexport function computeAgentSearchScore(\n agent: AgentSearchable,\n query: string,\n): number {\n const q = query.trim().toLowerCase();\n if (!q) return 0;\n\n let score = 0;\n\n const name = (agent.name ?? \"\").toLowerCase();\n const desc = (agent.description ?? \"\").toLowerCase();\n\n if (name === q) score += 10000;\n else if (name.startsWith(q)) score += 5000;\n // Word-boundary beats a mid-word substring: \"image\" ranks\n // \"Basic Image Generator\" above \"Reimagine Helper\".\n else if (matchesWholeWord(name, q)) score += 3000;\n else if (name.includes(q)) score += 2000;\n\n if (desc === q) score += 1000;\n else if (desc.includes(q)) score += 500;\n\n if (agent.category?.toLowerCase().includes(q)) score += 300;\n if (agent.tags?.some((t) => t.toLowerCase().includes(q))) score += 300;\n if (agent.modelId?.toLowerCase().includes(q)) score += 100;\n if (agent.agentType?.toLowerCase().includes(q)) score += 100;\n if (agent.outputFormat?.toLowerCase().includes(q)) score += 100;\n\n // Id search — an exact UUID always wins outright so you can paste an id from\n // a URL or a log line and land on that agent, on any surface.\n const id = agent.id.toLowerCase();\n if (id === q) score += 100000;\n else if (id.includes(q)) score += 5000;\n\n // Helps find agents shared by a specific person.\n if (agent.sharedByEmail?.toLowerCase().includes(q)) score += 200;\n\n // Multi-term fallback: \"image gen\" matches nothing as a phrase. Score per\n // TERM, and only when EVERY term lands somewhere — so multi-word searches\n // work without degrading into a loose OR that matches half the list.\n if (score === 0 && q.includes(\" \")) {\n const terms = q.split(/\\s+/).filter(Boolean);\n let hits = 0;\n let termScore = 0;\n for (const term of terms) {\n const inName = name.includes(term);\n const matched =\n inName ||\n desc.includes(term) ||\n (agent.category?.toLowerCase().includes(term) ?? false) ||\n (agent.tags?.some((t) => t.toLowerCase().includes(term)) ?? false);\n if (matched) {\n hits += 1;\n termScore += inName ? 400 : 100;\n }\n }\n // All-or-nothing: a partial term match is not a match.\n if (hits === terms.length) score += termScore;\n }\n\n return score;\n}\n\n/** True when `q` appears in `haystack` on word boundaries. */\nfunction matchesWholeWord(haystack: string, q: string): boolean {\n const escaped = q.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`\\\\b${escaped}\\\\b`).test(haystack);\n}\n\n/** True when the agent matches the query at all. */\nexport function agentMatchesSearch(\n agent: AgentSearchable,\n query: string,\n): boolean {\n return computeAgentSearchScore(agent, query) > 0;\n}\n","/**\n * catalog/selectors.ts — @ai-matrx/agents/catalog\n *\n * VERBATIM port of matrx-frontend\n * `features/agents/redux/agent-consumers/selectors.ts`.\n *\n * ALL filter, sort, search-scoring, category/tag extraction and pagination\n * logic lives here — not in components. Two coupling seams inverted, nothing\n * else:\n *\n * 1. `createSelector` (reselect) → `memoize1`/`memoize2`/`memoize3` below,\n * the same last-arguments reference-equality memoization reselect\n * defaults to. No Redux, no store types.\n * 2. `AgentDefinitionRecord` → `AgentSummary`, the list-row shape\n * `agx_get_list_full` actually returns.\n *\n * One structural consequence of (2), recorded rather than hidden: the\n * frontend's `selectLiveAgents` filters `isVersion` snapshots out of a store\n * that also holds them. This catalog only ever holds list rows — a version\n * snapshot cannot enter it — so that filter is a no-op here and is not\n * ported.\n *\n * 🚨 TWO DELIBERATE DEPARTURES FROM THE ORIGINAL, both defects the port\n * inherited and 0.9.1 fixes at the class (see CHANGELOG 0.9.1):\n *\n * F1 — every sort now ends on `id` ASC, the same final key `agx_get_list`\n * ends on, so the order of TIED rows is defined by the rows instead of\n * by whichever transport the host used to fetch them.\n * F5 — the tab-badge counts honour the archive filter, so the badge, the\n * footer and the rendered rows are the same number.\n *\n * Everything else below is byte-identical to the original.\n */\n\nimport {\n agentMatchesSearch,\n computeAgentSearchScore,\n} from \"./score\";\nimport {\n AGENT_NONE_SENTINEL,\n type AgentArchFilter,\n type AgentConsumerState,\n type AgentSortOption,\n type AgentSummary,\n} from \"./types\";\n\nexport { computeAgentSearchScore, agentMatchesSearch };\nexport { AGENT_NONE_SENTINEL };\n\n// ── Constants (verbatim) ─────────────────────────────────────────────────────\n\nexport const AGENT_CARDS_LIMIT_DESKTOP = 8;\nexport const AGENT_CARDS_LIMIT_MOBILE = 4;\nexport const AGENT_LIST_ITEMS_PER_PAGE = 20;\n\n// ── Memoization (the reselect seam, inverted) ───────────────────────────────\n\n/**\n * Last-arguments memoization on reference equality — reselect's default\n * `defaultMemoize` behaviour, in eleven lines and with no dependency. A\n * selector built here is memoized PER INSTANCE, exactly like a\n * `createSelector` result, so the factories below keep their contract:\n * build the selector once per (consumerId, …) and reuse it.\n */\nexport function memoize1<A, R>(fn: (a: A) => R): (a: A) => R {\n let lastA: A | undefined;\n let last: R;\n let has = false;\n return (a: A): R => {\n if (!has || lastA !== a) {\n last = fn(a);\n lastA = a;\n has = true;\n }\n return last;\n };\n}\n\nexport function memoize2<A, B, R>(fn: (a: A, b: B) => R): (a: A, b: B) => R {\n let lastA: A | undefined;\n let lastB: B | undefined;\n let last: R;\n let has = false;\n return (a: A, b: B): R => {\n if (!has || lastA !== a || lastB !== b) {\n last = fn(a, b);\n lastA = a;\n lastB = b;\n has = true;\n }\n return last;\n };\n}\n\nexport function memoize3<A, B, C, R>(\n fn: (a: A, b: B, c: C) => R,\n): (a: A, b: B, c: C) => R {\n let lastA: A | undefined;\n let lastB: B | undefined;\n let lastC: C | undefined;\n let last: R;\n let has = false;\n return (a: A, b: B, c: C): R => {\n if (!has || lastA !== a || lastB !== b || lastC !== c) {\n last = fn(a, b, c);\n lastA = a;\n lastB = b;\n lastC = c;\n has = true;\n }\n return last;\n };\n}\n\n// ── Pure sort comparator ────────────────────────────────────────────────────\n\n/**\n * 🚨 THE FINAL TIEBREAKER. `agx_get_list` orders\n * `is_favorite DESC, updated_at DESC, id` — `id` ASCENDING is the unique key\n * that makes the SERVER's order TOTAL. Every sort in this file ends on the\n * same key, so the rendered order is a function of the ROWS and never of the\n * order they happened to arrive in.\n *\n * Why a raw `<` / `>` and not `localeCompare`: Postgres orders `uuid` by its\n * 16 raw bytes. The canonical text form is lowercase hex with dashes at fixed\n * positions, so a codepoint comparison of those strings reproduces the\n * database's order exactly. A locale collator does not — it is free to fold\n * case or ignore punctuation, and would silently diverge from the server on\n * precisely the ties this key exists to settle.\n */\nexport function compareAgentIds(a: AgentSummary, b: AgentSummary): number {\n const idA = a.id ?? \"\";\n const idB = b.id ?? \"\";\n if (idA < idB) return -1;\n if (idA > idB) return 1;\n return 0;\n}\n\n/**\n * The chosen sort key, then `id`. TOTAL for every option.\n *\n * Before 0.9.1 each branch below returned 0 for tied rows, which left their\n * relative order to whatever `Array.prototype.sort` had been handed — i.e. to\n * the transport. A host that fetched the RPC in one shot kept the server's\n * favourites-first/`updated_at DESC` order for ties; a host that paged it with\n * `order=id.asc` kept id-ASC. Same rows, same filters, two different screens.\n * The key below is the server's own, so both now render the server's answer.\n */\nexport function applyAgentSortComparator(\n a: AgentSummary,\n b: AgentSummary,\n sortBy: AgentSortOption,\n): number {\n const primary = compareAgentSortKey(a, b, sortBy);\n // An unparseable timestamp yields NaN, which `sort` reads as \"equal\" while\n // defeating `!== 0`. Collapse it to a tie so the id key still decides — a\n // total order must not depend on the data being clean.\n if (!Number.isFinite(primary) || primary === 0) return compareAgentIds(a, b);\n return primary;\n}\n\n/** The chosen key ALONE — no tiebreaker. Not total; not for rendering. */\nfunction compareAgentSortKey(\n a: AgentSummary,\n b: AgentSummary,\n sortBy: AgentSortOption,\n): number {\n switch (sortBy) {\n case \"name-asc\":\n return (a.name ?? \"\").localeCompare(b.name ?? \"\");\n case \"name-desc\":\n return (b.name ?? \"\").localeCompare(a.name ?? \"\");\n case \"created-desc\":\n return +new Date(b.createdAt ?? 0) - +new Date(a.createdAt ?? 0);\n case \"category-asc\":\n return (a.category ?? \"\").localeCompare(b.category ?? \"\");\n case \"updated-desc\":\n default:\n return +new Date(b.updatedAt ?? 0) - +new Date(a.updatedAt ?? 0);\n }\n}\n\n// ── Category / tag metadata (derived from live agents) ──────────────────────\n\n/** All unique categories across live USER agents, sorted alphabetically. */\nexport const selectAllAgentCategories = memoize1(\n (agents: readonly AgentSummary[]): string[] => {\n const cats = new Set<string>();\n for (const a of agents) {\n if (a.agentType === \"user\" && a.category) cats.add(a.category);\n }\n return Array.from(cats).sort();\n },\n);\n\n/**\n * All unique categories across live SYSTEM (builtin) agents. The system tab\n * gets the same category filter every other tab has — its options just come\n * from a different population.\n */\nexport const selectAllSystemAgentCategories = memoize1(\n (agents: readonly AgentSummary[]): string[] => {\n const cats = new Set<string>();\n for (const a of agents) {\n if (a.agentType === \"builtin\" && a.category) cats.add(a.category);\n }\n return Array.from(cats).sort();\n },\n);\n\n/** All unique tags across live user agents, sorted alphabetically. */\nexport const selectAllAgentTags = memoize1(\n (agents: readonly AgentSummary[]): string[] => {\n const tags = new Set<string>();\n for (const a of agents) {\n if (a.agentType === \"user\") a.tags?.forEach((t) => tags.add(t));\n }\n return Array.from(tags).sort();\n },\n);\n\n/** All unique tags across live SYSTEM (builtin) agents. */\nexport const selectAllSystemAgentTags = memoize1(\n (agents: readonly AgentSummary[]): string[] => {\n const tags = new Set<string>();\n for (const a of agents) {\n if (a.agentType === \"builtin\") a.tags?.forEach((t) => tags.add(t));\n }\n return Array.from(tags).sort();\n },\n);\n\n// ── User-owned + shared agents (excludes builtins) ─────────────────────────\n\n/** Live user-type agents (excludes builtins). */\nexport const selectUserTypeAgents = memoize1(\n (agents: readonly AgentSummary[]): AgentSummary[] =>\n agents.filter((a) => a.agentType === \"user\"),\n);\n\n/** Builtin/system agents only. For chat pickers and full catalogues. */\nexport const selectBuiltinTypeAgents = memoize1(\n (agents: readonly AgentSummary[]): AgentSummary[] =>\n agents.filter((a) => a.agentType === \"builtin\"),\n);\n\n// ── Pure filter pipelines (verbatim) ───────────────────────────────────────\n\n/**\n * The ONE ordering rule, and it is TOTAL on every path.\n *\n * searching: score DESC → server rank ASC → sort key → id ASC\n * not searching: favourites first (when asked) → sort key → id ASC\n *\n * `id` ASC is the final key `agx_get_list` itself ends on, so two hosts that\n * fetched the same rows through different transports render the same screen.\n */\nexport function sortFilteredAgents(\n filtered: AgentSummary[],\n consumer: AgentConsumerState,\n): AgentSummary[] {\n const { searchTerm, sortBy, favFilter, favoritesFirst } = consumer;\n\n if (searchTerm) {\n const scores = new Map<string, number>();\n filtered.forEach((a) => {\n scores.set(a.id, computeAgentSearchScore(a, searchTerm));\n });\n\n // Server rank, used only to order matches the local scorer cannot see\n // (tier-2 prompt hits). Locally-scored matches all have score > 0, so\n // they sort above this group unconditionally — obvious matches first.\n const serverRank = new Map<string, number>();\n consumer.serverMatchedIds.forEach((id, i) => serverRank.set(id, i));\n\n return [...filtered].sort((a, b) => {\n const sa = scores.get(a.id) ?? 0;\n const sb = scores.get(b.id) ?? 0;\n if (sb !== sa) return sb - sa;\n if (sa === 0) {\n const ra = serverRank.get(a.id);\n const rb = serverRank.get(b.id);\n if (ra !== undefined && rb !== undefined && ra !== rb) return ra - rb;\n }\n return applyAgentSortComparator(a, b, sortBy);\n });\n }\n\n return [...filtered].sort((a, b) => {\n if (favoritesFirst && favFilter === \"all\") {\n const aFav = a.isFavorite ? 1 : 0;\n const bFav = b.isFavorite ? 1 : 0;\n if (bFav !== aFav) return bFav - aFav;\n }\n return applyAgentSortComparator(a, b, sortBy);\n });\n}\n\n/** User-type agents — mine / shared / all tabs with full consumer filters. */\nexport function filterUserTypeAgents(\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n): AgentSummary[] {\n const {\n searchTerm,\n includedCats,\n includedTags,\n favFilter,\n archFilter,\n accessFilter,\n tab,\n } = consumer;\n\n // Built once, not per row — this runs on every keystroke over the full list.\n const serverMatched = new Set(consumer.serverMatchedIds);\n\n const filtered = agents.filter((agent) => {\n if (tab === \"mine\" && agent.isOwner !== true) return false;\n if (\n tab === \"shared\" &&\n !(agent.isOwner === false && agent.accessLevel != null)\n )\n return false;\n\n // THE ARCHIVED-ITEMS LAW, through the ONE predicate every tab, badge and\n // footer in this package shares.\n if (!agentMatchesArchiveFilter(agent, archFilter)) return false;\n\n if (favFilter === \"yes\" && !agent.isFavorite) return false;\n if (favFilter === \"no\" && agent.isFavorite) return false;\n\n if (accessFilter === \"owned\" && agent.isOwner !== true) return false;\n if (accessFilter === \"shared\" && agent.isOwner !== false) return false;\n if (\n accessFilter === \"editable\" &&\n agent.accessLevel !== \"owner\" &&\n agent.accessLevel !== \"admin\" &&\n agent.accessLevel !== \"editor\"\n )\n return false;\n\n if (includedCats.length > 0) {\n const category = agent.category;\n if (!category) {\n if (!includedCats.includes(AGENT_NONE_SENTINEL)) return false;\n } else if (!includedCats.includes(category)) {\n return false;\n }\n }\n\n if (includedTags.length > 0) {\n const isUntagged = !agent.tags?.length;\n if (isUntagged) {\n if (!includedTags.includes(AGENT_NONE_SENTINEL)) return false;\n } else if (!agent.tags?.some((t) => includedTags.includes(t))) {\n return false;\n }\n }\n\n // A server hit counts as a match even when the local scorer scores 0 —\n // that is the only way tier-2 prompt matches can reach the screen, since\n // the client never loads prompt content to score against.\n if (\n searchTerm &&\n !agentMatchesSearch(agent, searchTerm) &&\n !serverMatched.has(agent.id)\n )\n return false;\n\n return true;\n });\n\n return sortFilteredAgents(filtered, consumer);\n}\n\n/**\n * Builtin/system agents (tab === \"system\").\n *\n * Gets the SAME filter surface every other tab has — search, favorites,\n * category, tags, sort, AND THE ARCHIVE FILTER. Only the ownership/access\n * filters are skipped, because a builtin has no owner to filter on. A picker\n * that offers less on one tab than another is the exact half-built shape this\n * list exists to prevent.\n *\n * 🚨 0.9.2 — THE BUILTIN ARCHIVE EXEMPTION IS GONE, AND IT IS NOW ILLEGAL.\n *\n * Until 0.9.1 this function applied no archive filter, on the theory that \"a\n * builtin belongs to the platform and is never the user's to archive\". The\n * database disagreed: `Foundry Planner`\n * (`001b22f6-fa4d-40c6-a1a4-8575d4d04379`) is an ARCHIVED builtin, and it\n * rendered at Public index 216 and was pickable — while Mine / Shared / All\n * hid their archived rows. One picker, two rules, and a person could choose a\n * retired agent from the one tab that did not obey.\n *\n * THE ARCHIVED-ITEMS LAW (`common-docs/policies/archived-items.md`, Arman\n * 2026-09-09) closed the question for every entity at once: \"everything should\n * have an archive filter, and the default should always hide archived… all\n * archived items should always be treated the same.\" Clause 4 makes it a\n * class, not an instance — so there is no per-tab, per-entity or per-surface\n * exemption left to grant, here or anywhere.\n */\nexport function filterBuiltinTypeAgents(\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n): AgentSummary[] {\n const { searchTerm, favFilter, archFilter, includedCats, includedTags } =\n consumer;\n const serverMatched = new Set(consumer.serverMatchedIds);\n\n const filtered = agents.filter((agent) => {\n // THE LAW, first and unconditional — identical to the user-tab rule above.\n if (!agentMatchesArchiveFilter(agent, archFilter)) return false;\n\n if (favFilter === \"yes\" && !agent.isFavorite) return false;\n if (favFilter === \"no\" && agent.isFavorite) return false;\n\n if (includedCats.length > 0) {\n const category = agent.category;\n if (!category) {\n if (!includedCats.includes(AGENT_NONE_SENTINEL)) return false;\n } else if (!includedCats.includes(category)) {\n return false;\n }\n }\n\n if (includedTags.length > 0) {\n const isUntagged = !agent.tags?.length;\n if (isUntagged) {\n if (!includedTags.includes(AGENT_NONE_SENTINEL)) return false;\n } else if (!agent.tags?.some((t) => includedTags.includes(t))) {\n return false;\n }\n }\n\n if (\n searchTerm &&\n !agentMatchesSearch(agent, searchTerm) &&\n !serverMatched.has(agent.id)\n )\n return false;\n\n return true;\n });\n\n return sortFilteredAgents(filtered, consumer);\n}\n\n// ── Filtered agents (user + system tabs) ───────────────────────────────────\n\n/** Factory: owned user-type agents with consumer filters applied (ignores tab). */\nexport const makeSelectFilteredOwnedAgents = () =>\n memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] =>\n filterUserTypeAgents(selectUserTypeAgents(agents), {\n ...consumer,\n tab: \"mine\",\n }),\n );\n\n/** Factory: shared user-type agents with consumer filters applied (ignores tab). */\nexport const makeSelectFilteredSharedAgents = () =>\n memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] =>\n filterUserTypeAgents(selectUserTypeAgents(agents), {\n ...consumer,\n tab: \"shared\",\n }),\n );\n\n/**\n * Factory: filters and sorts agents for a consumer. User tabs (mine / shared /\n * all) draw from user-type agents; the system tab draws from builtins.\n *\n * `includeSystemInAll` is the ADMIN reading of the \"All\" tab. For a normal\n * user, system agents are a separate catalogue and \"All\" means \"all of MY\n * agents\". For an admin surface, system agents ARE their agents — so \"All\"\n * must be a single blended list, with each row still labelled (the `system`\n * badge on `AgentRow`) so the two are never confused.\n */\nexport const makeSelectFilteredAgents = (includeSystemInAll = false) =>\n memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] => {\n const userAgents = selectUserTypeAgents(agents);\n const builtinAgents = selectBuiltinTypeAgents(agents);\n if (consumer.tab === \"system\") {\n return filterBuiltinTypeAgents(builtinAgents, consumer);\n }\n if (includeSystemInAll && consumer.tab === \"all\") {\n return [\n ...filterUserTypeAgents(userAgents, consumer),\n ...filterBuiltinTypeAgents(builtinAgents, consumer),\n ];\n }\n return filterUserTypeAgents(userAgents, consumer);\n },\n );\n\n/** Factory: filters and sorts builtin agents for the chat agent picker. */\nexport const makeSelectFilteredBuiltinAgents = () =>\n memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] =>\n filterBuiltinTypeAgents(selectBuiltinTypeAgents(agents), consumer),\n );\n\n// ── Card / list split (verbatim) ───────────────────────────────────────────\n\nexport interface AgentListPage {\n items: AgentSummary[];\n hasMore: boolean;\n totalAfterCards: number;\n}\n\nfunction pageAfterCards(\n filtered: AgentSummary[],\n limit: number,\n page: number,\n): AgentListPage {\n const afterCards = filtered.slice(limit);\n const pageEnd = page * AGENT_LIST_ITEMS_PER_PAGE;\n const items = afterCards.slice(0, pageEnd);\n return {\n items,\n hasMore: items.length < afterCards.length,\n totalAfterCards: afterCards.length,\n };\n}\n\n/** Factory: slices filtered owned agents into the \"cards\" hero section. */\nexport const makeSelectOwnedAgentCards = (isMobile: boolean) => {\n const selectFiltered = makeSelectFilteredOwnedAgents();\n const limit = isMobile ? AGENT_CARDS_LIMIT_MOBILE : AGENT_CARDS_LIMIT_DESKTOP;\n return memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] => selectFiltered(agents, consumer).slice(0, limit),\n );\n};\n\n/** Factory: paginated list items for owned agents (everything after cards). */\nexport const makeSelectOwnedAgentListItems = (isMobile: boolean) => {\n const selectFiltered = makeSelectFilteredOwnedAgents();\n const limit = isMobile ? AGENT_CARDS_LIMIT_MOBILE : AGENT_CARDS_LIMIT_DESKTOP;\n return memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentListPage =>\n pageAfterCards(selectFiltered(agents, consumer), limit, consumer.listPage),\n );\n};\n\n/** Factory: slices filtered shared agents into the \"cards\" hero section. */\nexport const makeSelectSharedAgentCards = (isMobile: boolean) => {\n const selectFiltered = makeSelectFilteredSharedAgents();\n const limit = isMobile ? AGENT_CARDS_LIMIT_MOBILE : AGENT_CARDS_LIMIT_DESKTOP;\n return memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] => selectFiltered(agents, consumer).slice(0, limit),\n );\n};\n\n/** Factory: paginated list items for shared agents (everything after cards). */\nexport const makeSelectSharedAgentListItems = (isMobile: boolean) => {\n const selectFiltered = makeSelectFilteredSharedAgents();\n const limit = isMobile ? AGENT_CARDS_LIMIT_MOBILE : AGENT_CARDS_LIMIT_DESKTOP;\n return memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentListPage =>\n pageAfterCards(\n selectFiltered(agents, consumer),\n limit,\n consumer.sharedPage,\n ),\n );\n};\n\n// ── Convenience count selectors ────────────────────────────────────────────\n\n/** Factory: total count of filtered agents for a consumer. */\nexport const makeSelectFilteredAgentsCount = () => {\n const selectFiltered = makeSelectFilteredAgents();\n return memoize2(\n (agents: readonly AgentSummary[], consumer: AgentConsumerState): number =>\n selectFiltered(agents, consumer).length,\n );\n};\n\n/** Factory: total count of filtered builtin agents for a consumer. */\nexport const makeSelectFilteredBuiltinAgentsCount = () => {\n const selectFiltered = makeSelectFilteredBuiltinAgents();\n return memoize2(\n (agents: readonly AgentSummary[], consumer: AgentConsumerState): number =>\n selectFiltered(agents, consumer).length,\n );\n};\n\n// ── Consumer state convenience selectors ──────────────────────────────────\n\n/** Returns whether a consumer has any non-default filters active. */\nexport function agentConsumerHasActiveFilters(\n consumer: AgentConsumerState,\n defaults: AgentConsumerState,\n): boolean {\n return (\n consumer.tab !== defaults.tab ||\n consumer.sortBy !== defaults.sortBy ||\n consumer.searchTerm !== \"\" ||\n consumer.includedCats.length > 0 ||\n consumer.includedTags.length > 0 ||\n consumer.favFilter !== defaults.favFilter ||\n consumer.archFilter !== defaults.archFilter ||\n consumer.accessFilter !== defaults.accessFilter ||\n consumer.favoritesFirst !== defaults.favoritesFirst\n );\n}\n\n// ── Aggregate counts (for tab badges) ─────────────────────────────────────\n\n/**\n * 🚨 A BADGE COUNTS WHAT THE TAB RENDERS. Nothing else.\n *\n * Before 0.9.1 these five counted every user-type row, archived included,\n * while `filterUserTypeAgents` (archive filter `active`, the default) hid the\n * archived ones. The badge said \"Mine 416\", the list showed 412 rows and the\n * footer said \"412 agents\" — one screen, three numbers, one of them a lie\n * about agents the user cannot see or reach from there.\n *\n * `is_archived` is now honoured by the same rule the list uses, so the badge,\n * the footer and the rows agree on every tab and under every archive filter.\n *\n * 🚨 0.9.2 — AND THERE IS NO LONGER AN EXCEPTION. The system tab used to be\n * one (\"a builtin is never the user's to archive\"), which was false in the\n * database and illegal under THE ARCHIVED-ITEMS LAW. Its badge now counts\n * under the same archive rule its rows render under, so `Foundry Planner`\n * leaves the Public badge and the Public list together, or returns to both\n * together — never one without the other.\n */\nexport function agentMatchesArchiveFilter(\n agent: AgentSummary,\n archFilter: AgentArchFilter,\n): boolean {\n if (archFilter === \"active\") return !agent.isArchived;\n if (archFilter === \"archived\") return Boolean(agent.isArchived);\n return true;\n}\n\n/** Builtin rows matching an archive filter — the Public tab's badge. */\nfunction countBuiltinRows(\n agents: readonly AgentSummary[],\n archFilter: AgentArchFilter,\n): number {\n let n = 0;\n for (const a of agents) {\n if (a.agentType !== \"builtin\") continue;\n if (!agentMatchesArchiveFilter(a, archFilter)) continue;\n n += 1;\n }\n return n;\n}\n\nfunction countUserRows(\n agents: readonly AgentSummary[],\n archFilter: AgentArchFilter,\n predicate: (a: AgentSummary) => boolean,\n): number {\n let n = 0;\n for (const a of agents) {\n if (a.agentType !== \"user\") continue;\n if (!agentMatchesArchiveFilter(a, archFilter)) continue;\n if (predicate(a)) n += 1;\n }\n return n;\n}\n\nconst isOwned = (a: AgentSummary) => a.isOwner === true;\nconst isShared = (a: AgentSummary) =>\n a.isOwner === false && a.accessLevel != null;\nconst isAny = () => true;\nconst isFavorite = (a: AgentSummary) => Boolean(a.isFavorite);\n\n/**\n * The four tab badges for a consumer's CURRENT archive filter — the numbers\n * `useAgentListCore` puts on the tab strip. Flip the archive filter to\n * \"archived\" and the badges follow the list into the archive.\n */\nexport const selectAgentTabCounts = memoize2(\n (\n agents: readonly AgentSummary[],\n archFilter: AgentArchFilter,\n ): { mine: number; shared: number; all: number; system: number } => ({\n mine: countUserRows(agents, archFilter, isOwned),\n shared: countUserRows(agents, archFilter, isShared),\n all: countUserRows(agents, archFilter, isAny),\n system: countBuiltinRows(agents, archFilter),\n }),\n);\n\n/** Live user-type agents the default (`active`) list renders. */\nexport const selectTotalUserAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number =>\n countUserRows(agents, \"active\", isAny),\n);\n\nexport const selectTotalOwnedAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number =>\n countUserRows(agents, \"active\", isOwned),\n);\n\nexport const selectTotalSharedAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number =>\n countUserRows(agents, \"active\", isShared),\n);\n\n/**\n * Live builtin agents the DEFAULT (`active`) list renders — archived builtins\n * excluded, exactly like every other \"total\" beside it. Before 0.9.2 this\n * counted archived builtins too, which is how an archived `Foundry Planner`\n * reached the Public badge.\n */\nexport const selectTotalBuiltinAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number => countBuiltinRows(agents, \"active\"),\n);\n\nexport const selectTotalFavoriteAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number =>\n countUserRows(agents, \"active\", isFavorite),\n);\n","/**\n * catalog/native/AgentDetailCard.tsx — the native twin of\n * `catalog/react/AgentDetailCard.tsx` (the picker's DETAIL PEEK).\n *\n * Same blocks, same order: the Orchestra block first (choosing a conductor\n * runs an ensemble, which changes what selecting it means), then description,\n * category, tags, access, model, dates — then Select, and the optional peek\n * affordance. `openPeek` absent → the affordance is HIDDEN, never a dead\n * button. A mandate default row has no agent door and no favourite, exactly as\n * on the web.\n */\n\nimport { Pressable, ScrollView, StyleSheet, Text, View } from \"react-native\";\n\nimport { useAgentCatalog, useAgentCatalogUiPorts } from \"../shared/context\";\nimport {\n orchestraDelegatesLine,\n orchestraDepthLine,\n orchestraLabel,\n} from \"../orchestra\";\nimport { isMandateAgentId, type AgentSummary } from \"../types\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\nimport { FavoriteAgentButton } from \"./FavoriteAgentButton\";\n\nexport interface AgentDetailCardProps {\n agent: AgentSummary;\n onSelect: () => void;\n}\n\nfunction formatDate(value: string | null): string | null {\n if (!value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nexport function AgentDetailCard({ agent, onSelect }: AgentDetailCardProps) {\n const { errorSink } = useAgentCatalog();\n const { renderModelRef, openPeek } = useAgentCatalogUiPorts();\n const theme = useAgentCatalogNativeTheme();\n const isDefaultRow = isMandateAgentId(agent.id);\n const updated = formatDate(agent.updatedAt);\n const created = formatDate(agent.createdAt);\n\n return (\n <View style={styles.container}>\n <View style={[styles.header, { padding: theme.spacing.md }]}>\n <View style={{ flex: 1, minWidth: 0 }}>\n <Text\n numberOfLines={2}\n style={{\n color: theme.colors.text,\n fontSize: theme.fontSize.lg,\n fontWeight: \"600\",\n }}\n >\n {agent.name || \"Untitled\"}\n </Text>\n {agent.isFavorite && (\n <Text\n style={{ color: theme.colors.favorite, fontSize: theme.fontSize.sm }}\n >\n Pinned to favorites\n </Text>\n )}\n </View>\n {!isDefaultRow && <FavoriteAgentButton id={agent.id} />}\n </View>\n\n <View style={{ height: StyleSheet.hairlineWidth, backgroundColor: theme.colors.border }} />\n\n <ScrollView\n style={styles.body}\n contentContainerStyle={{ padding: theme.spacing.md, gap: theme.spacing.md }}\n >\n {agent.orchestra && (\n <View\n style={[\n styles.orchestra,\n {\n borderColor: theme.colors.primary,\n backgroundColor: theme.colors.primarySoft,\n borderRadius: theme.radius.md,\n padding: theme.spacing.sm,\n },\n ]}\n >\n <View style={styles.inline}>\n <AgentIcon\n name=\"music4\"\n size={14}\n color={theme.colors.primary}\n report={errorSink}\n />\n <Text\n style={{\n color: theme.colors.primary,\n fontSize: theme.fontSize.sm,\n fontWeight: \"600\",\n }}\n >\n {orchestraLabel(agent.orchestra)}\n </Text>\n </View>\n {agent.orchestra.tagline && (\n <Text style={{ color: theme.colors.text, fontSize: theme.fontSize.md }}>\n {agent.orchestra.tagline}\n </Text>\n )}\n {orchestraDelegatesLine(agent.orchestra) && (\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.sm }}\n >\n {orchestraDelegatesLine(agent.orchestra)}\n </Text>\n )}\n {orchestraDepthLine(agent.orchestra) && (\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.sm }}\n >\n {orchestraDepthLine(agent.orchestra)}\n </Text>\n )}\n </View>\n )}\n\n {agent.description && (\n <View style={{ gap: 4 }}>\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.sm,\n fontWeight: \"600\",\n textTransform: \"uppercase\",\n }}\n >\n Description\n </Text>\n <Text style={{ color: theme.colors.text, fontSize: theme.fontSize.md }}>\n {agent.description}\n </Text>\n </View>\n )}\n\n {agent.category && (\n <View style={styles.inline}>\n <AgentIcon\n name=\"folder\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <Text style={{ color: theme.colors.text, fontSize: theme.fontSize.md }}>\n {agent.category}\n </Text>\n </View>\n )}\n\n {agent.tags.length > 0 && (\n <View style={{ gap: 6 }}>\n <View style={styles.inline}>\n <AgentIcon\n name=\"tag\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.sm }}\n >\n Tags\n </Text>\n </View>\n <View style={styles.tagWrap}>\n {agent.tags.map((tag) => (\n <Text\n key={tag}\n style={{\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.sm,\n overflow: \"hidden\",\n paddingHorizontal: 6,\n paddingVertical: 2,\n fontSize: theme.fontSize.xs,\n }}\n >\n {tag}\n </Text>\n ))}\n </View>\n </View>\n )}\n\n {agent.accessLevel && (\n <View style={styles.inline}>\n <AgentIcon\n name={agent.isOwner === false ? \"users\" : \"globe\"}\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <View>\n <Text style={{ color: theme.colors.text, fontSize: theme.fontSize.md }}>\n {agent.accessLevel === \"owner\"\n ? \"You own this\"\n : `Shared — ${agent.accessLevel}`}\n </Text>\n {agent.sharedByEmail && (\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.xs }}\n >\n by {agent.sharedByEmail}\n </Text>\n )}\n </View>\n </View>\n )}\n\n {agent.modelId && <View>{renderModelRef({ modelId: agent.modelId })}</View>}\n\n {(updated || created) && (\n <View style={{ gap: 4 }}>\n {updated && (\n <View style={styles.inline}>\n <AgentIcon\n name=\"clock\"\n size={13}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.sm }}\n >\n Updated {updated}\n </Text>\n </View>\n )}\n {created && (\n <View style={styles.inline}>\n <AgentIcon\n name=\"clock\"\n size={13}\n color={theme.colors.textFaint}\n report={errorSink}\n />\n <Text\n style={{ color: theme.colors.textFaint, fontSize: theme.fontSize.sm }}\n >\n Created {created}\n </Text>\n </View>\n )}\n </View>\n )}\n </ScrollView>\n\n <View style={{ height: StyleSheet.hairlineWidth, backgroundColor: theme.colors.border }} />\n <View style={[styles.footer, { padding: theme.spacing.sm }]}>\n <Pressable\n onPress={onSelect}\n accessibilityRole=\"button\"\n accessibilityLabel={`Select ${agent.name || \"Untitled\"}`}\n style={({ pressed }) => [\n styles.selectButton,\n {\n borderRadius: theme.radius.md,\n backgroundColor: theme.colors.primary,\n opacity: pressed ? 0.85 : 1,\n },\n ]}\n >\n <Text\n style={{\n color: theme.colors.primaryForeground,\n fontSize: theme.fontSize.md,\n fontWeight: \"600\",\n }}\n >\n Select\n </Text>\n </Pressable>\n {/* ABSENT openPeek → the affordance is HIDDEN, never a dead button. */}\n {openPeek && (\n <Pressable\n onPress={() => openPeek(agent)}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Sneak Peek\"\n style={({ pressed }) => [\n styles.iconButton,\n {\n borderRadius: theme.radius.md,\n borderColor: theme.colors.border,\n backgroundColor: pressed\n ? theme.colors.surfacePressed\n : theme.colors.surface,\n },\n ]}\n >\n <AgentIcon\n name=\"rocket\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n </Pressable>\n )}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, minHeight: 0 },\n header: { flexDirection: \"row\", alignItems: \"flex-start\", gap: 12 },\n body: { flex: 1, minHeight: 0 },\n inline: { flexDirection: \"row\", alignItems: \"center\", gap: 8 },\n orchestra: { borderWidth: StyleSheet.hairlineWidth, gap: 4 },\n tagWrap: { flexDirection: \"row\", flexWrap: \"wrap\", gap: 4 },\n footer: { flexDirection: \"row\", alignItems: \"center\", gap: 8 },\n selectButton: {\n flex: 1,\n height: 40,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n iconButton: {\n width: 40,\n height: 40,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: StyleSheet.hairlineWidth,\n },\n});\n","/**\n * catalog/orchestra.ts — @ai-matrx/agents/catalog\n *\n * Creator words for an Orchestra badge. A VERBATIM port of the helpers the\n * Workflow Studio's hand-rolled picker carried (`apps/workflow-studio/src/\n * hooks/use-agents.ts` before `c0f958b43`), lifted here so every client says\n * the same sentence about the same ensemble.\n *\n * Pure — no React, no DOM. The row shape is `OrchestraBadge` in `./types`.\n */\n\nimport type { OrchestraBadge } from \"./types\";\n\n/**\n * Creator words for an Orchestra's run mode. \"supervisor\" is already plain\n * English; the structural modes get humanized (never \"sequential/parallel/dag\"\n * at eye level). An unknown future mode falls through as its own word rather\n * than hiding — visible-but-unpolished beats invisible.\n */\nconst ORCHESTRA_MODE_LABEL: Record<string, string> = {\n supervisor: \"supervisor\",\n sequential: \"in order\",\n parallel: \"together\",\n dag: \"custom flow\",\n};\n\nexport function orchestraModeLabel(mode: string): string {\n return ORCHESTRA_MODE_LABEL[mode] ?? mode;\n}\n\n/** Human label for a badge: \"Orchestra · supervisor · 3 members\" (singular-safe). */\nexport function orchestraLabel(badge: OrchestraBadge): string {\n const n = badge.memberCount;\n return `Orchestra · ${orchestraModeLabel(badge.mode)} · ${n} ${\n n === 1 ? \"member\" : \"members\"\n }`;\n}\n\n/**\n * The member-call ceiling in Creator language (\"Team members can call helpers\n * up to 2 levels deep\"), or `null` when the composition declared none. A badge\n * never invents the platform default: the server that runs the ensemble owns\n * that number, and printing a promise nobody made is worse than printing\n * nothing.\n */\nexport function orchestraDepthLine(badge: OrchestraBadge): string | null {\n const n = badge.depthBudget;\n if (typeof n !== \"number\" || n <= 0) return null;\n return `Team members can call helpers up to ${n} ${\n n === 1 ? \"level\" : \"levels\"\n } deep`;\n}\n\n/**\n * One visible line naming who the Orchestra delegates to, collapsing past\n * `limit` into \"+N more\". `null` when no member carries a real role title —\n * \"Member, Member, Member\" is noise that reads like data.\n */\nexport function orchestraDelegatesLine(\n badge: OrchestraBadge,\n limit = 3,\n): string | null {\n const titles = badge.memberTitles;\n if (titles.length === 0) return null;\n const shown = titles.slice(0, limit);\n const extra = titles.length - shown.length;\n return `Delegates to: ${shown.join(\", \")}${\n extra > 0 ? ` +${extra} more` : \"\"\n }`;\n}\n","/**\n * catalog/native/icons.tsx — @ai-matrx/agents/catalog/native\n *\n * 🚨 C19 — NO ICON-LIBRARY DEPENDENCY, EVER. The picker's glyphs are the SAME\n * inlined 24×24 Lucide-derived paths the web entry ships in\n * `catalog/react/icons.tsx`; the path data lives in ONE place\n * (`../shared/icon-paths.ts`)\n * and the two entries differ only in what draws it — `<svg>` on the web,\n * `react-native-svg` here.\n *\n * `react-native-svg` is an OPTIONAL peer. When it is absent the icons degrade\n * to text glyphs and the degradation ANNOUNCES ITSELF ONCE through the\n * catalog's `errorSink` with the remedy — never a blank square, never silence.\n * The announcement flag lives on `globalThis` (module-level mutable state is\n * banned: a dual ESM+CJS bundle instantiates each module twice and would\n * announce twice).\n *\n * Colour arrives as an explicit `color` prop from `../native/theme` — never a\n * hardcoded value, on either path.\n */\n\nimport { Text } from \"react-native\";\n\nimport { ICON_PATHS, type AgentCatalogIconName } from \"../shared/icon-paths\";\n\nexport type { AgentCatalogIconName } from \"../shared/icon-paths\";\n\n/** The `react-native-svg` surface this package uses, structurally. */\ninterface SvgModuleLike {\n default: unknown;\n Svg?: unknown;\n Path: unknown;\n Circle: unknown;\n}\n\ninterface NativeIconsGlobalState {\n /** `undefined` = not probed yet; `null` = probed and absent. */\n svg: SvgModuleLike | null | undefined;\n announced: boolean;\n}\n\nconst STATE_KEY = Symbol.for(\"ai-matrx.agents.catalog.native.icons\");\n\nfunction getIconsGlobalState(): NativeIconsGlobalState {\n const store = globalThis as unknown as Record<symbol, unknown>;\n const existing = store[STATE_KEY] as NativeIconsGlobalState | undefined;\n if (existing) return existing;\n const created: NativeIconsGlobalState = { svg: undefined, announced: false };\n store[STATE_KEY] = created;\n return created;\n}\n\n/** Test seam: forget the probe so a test can exercise both paths. */\nexport function _resetNativeIconState(svg?: SvgModuleLike | null): void {\n const state = getIconsGlobalState();\n state.svg = svg === undefined ? undefined : svg;\n state.announced = false;\n}\n\nfunction isSvgModule(value: unknown): value is SvgModuleLike {\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Record<string, unknown>;\n return Boolean(record[\"Path\"] && record[\"Circle\"] && record[\"default\"]);\n}\n\n/**\n * Resolve `react-native-svg` once. Kept inside a function (not at module\n * scope) so importing this file never throws in an environment that has no\n * such module — an import-time throw would take the whole picker down instead\n * of degrading it.\n */\nexport function resolveSvgModule(): SvgModuleLike | null {\n const state = getIconsGlobalState();\n if (state.svg !== undefined) return state.svg;\n let resolved: SvgModuleLike | null = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const required: unknown = (\n globalThis as unknown as { require?: (id: string) => unknown }\n ).require?.(\"react-native-svg\");\n if (isSvgModule(required)) resolved = required;\n else {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const viaModule: unknown = require(\"react-native-svg\");\n if (isSvgModule(viaModule)) resolved = viaModule;\n }\n } catch {\n resolved = null;\n }\n state.svg = resolved;\n return resolved;\n}\n\n/**\n * The degradation announcement. Fires ONCE per process, with the remedy.\n * `report` is the catalog's own `errorSink` — the picker passes it down so\n * this file never reaches for a console of its own.\n */\nexport function announceMissingSvgOnce(\n report: (event: { code: string; message: string; context?: object }) => void,\n): void {\n const state = getIconsGlobalState();\n if (state.announced) return;\n state.announced = true;\n report({\n code: \"native_icons_degraded_to_text\",\n message:\n \"react-native-svg is not installed, so the agent picker is drawing its \" +\n \"icons as text glyphs. Every control still works and every label is \" +\n \"still correct — only the glyphs are plainer.\",\n context: {\n remedy:\n \"run `npx expo install react-native-svg` (it is an optional peer of \" +\n \"@ai-matrx/agents) and reload to get the real icons\",\n },\n });\n}\n\n/** The text stand-in for each glyph, used when react-native-svg is absent. */\nconst TEXT_GLYPHS: Record<AgentCatalogIconName, string> = {\n star: \"★\",\n chevronRight: \"›\",\n chevronDown: \"⌄\",\n search: \"⌕\",\n x: \"✕\",\n check: \"✓\",\n arrowUpDown: \"⇅\",\n folder: \"▤\",\n tag: \"⌗\",\n rotateCcw: \"↺\",\n archive: \"▣\",\n loader: \"◌\",\n alertTriangle: \"⚠\",\n music4: \"♪\",\n clock: \"◷\",\n globe: \"⊕\",\n users: \"⚇\",\n externalLink: \"↗\",\n messageCircle: \"✉\",\n rocket: \"➤\",\n circleCheck: \"✓\",\n};\n\nexport interface AgentIconProps {\n name: AgentCatalogIconName;\n /** Points. Default 14 — the web picker's `w-3.5`. */\n size?: number;\n color: string;\n /** Paint the shape (the favourite star's \"on\" state). */\n filled?: boolean;\n /**\n * Where the degradation is reported. REQUIRED so nothing here can fail\n * silently; every call site already holds the catalog's `errorSink`.\n */\n report: (event: { code: string; message: string; context?: object }) => void;\n}\n\n/**\n * ONE icon component. `name` picks the shape from the shared path table, so\n * the native picker can never wear a glyph the web picker does not have.\n */\nexport function AgentIcon({\n name,\n size = 14,\n color,\n filled = false,\n report,\n}: AgentIconProps) {\n const svg = resolveSvgModule();\n if (!svg) {\n announceMissingSvgOnce(report);\n return (\n <Text\n accessible={false}\n style={{ color, fontSize: size, lineHeight: size * 1.2 }}\n >\n {TEXT_GLYPHS[name]}\n </Text>\n );\n }\n\n const Svg = svg.default as React.ComponentType<Record<string, unknown>>;\n const Path = svg.Path as React.ComponentType<Record<string, unknown>>;\n const Circle = svg.Circle as React.ComponentType<Record<string, unknown>>;\n const shape = ICON_PATHS[name];\n\n return (\n <Svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {shape.paths.map((d, index) => (\n <Path\n key={`p${index}`}\n d={d}\n {...(filled && shape.fillable ? { fill: color } : {})}\n />\n ))}\n {(shape.circles ?? []).map((circle, index) => (\n <Circle\n key={`c${index}`}\n cx={circle.cx}\n cy={circle.cy}\n r={circle.r}\n {...(circle.filled ? { fill: color } : {})}\n />\n ))}\n </Svg>\n );\n}\n","/**\n * catalog/shared/icon-paths.ts — THE picker's glyph geometry, once.\n *\n * 🚨 C19: the package ships its OWN inlined SVGs (adapted from the Lucide\n * shapes the matrx-frontend originals used — same 24×24 grid, same 2px\n * stroke) rather than depending on an icon library. 0.9.0 lifted the path\n * data out of `catalog/react/icons.tsx` into this pure module so the React\n * Native entry draws the IDENTICAL shapes through `react-native-svg`: an\n * agent row wears the same star, and an Orchestra the same conductor mark, in\n * every Matrx client. A glyph added here appears on both platforms or on\n * neither; there is no way to give one platform a shape the other lacks.\n *\n * Pure data — no React, no DOM, no react-native.\n */\n\nexport interface AgentCatalogIconCircle {\n cx: number;\n cy: number;\n r: number;\n /** Painted with `currentColor` regardless of the icon's `filled` state. */\n filled?: boolean;\n}\n\nexport interface AgentCatalogIconShape {\n paths: readonly string[];\n circles?: readonly AgentCatalogIconCircle[];\n /** True when the icon supports a `filled` variant (only the star does). */\n fillable?: boolean;\n}\n\nconst SHAPES = {\n star: {\n paths: [\n \"M11.5 3.2a.6.6 0 0 1 1 0l2.3 4.7 5.2.8a.6.6 0 0 1 .3 1l-3.8 3.7.9 5.2a.6.6 0 0 1-.9.6L12 16.8l-4.6 2.4a.6.6 0 0 1-.9-.6l.9-5.2-3.8-3.7a.6.6 0 0 1 .3-1l5.2-.8Z\",\n ],\n fillable: true,\n },\n chevronRight: { paths: [\"m9 18 6-6-6-6\"] },\n chevronDown: { paths: [\"m6 9 6 6 6-6\"] },\n search: {\n paths: [\"m21 21-4.3-4.3\"],\n circles: [{ cx: 11, cy: 11, r: 8 }],\n },\n x: { paths: [\"M18 6 6 18\", \"m6 6 12 12\"] },\n check: { paths: [\"M20 6 9 17l-5-5\"] },\n arrowUpDown: {\n paths: [\"m21 16-4 4-4-4\", \"M17 20V4\", \"m3 8 4-4 4 4\", \"M7 4v16\"],\n },\n folder: {\n paths: [\n \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n ],\n },\n tag: {\n paths: [\n \"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\",\n ],\n circles: [{ cx: 7.5, cy: 7.5, r: 0.5, filled: true }],\n },\n rotateCcw: {\n paths: [\n \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\",\n \"M3 3v5h5\",\n ],\n },\n loader: { paths: [\"M21 12a9 9 0 1 1-6.219-8.56\"] },\n alertTriangle: {\n paths: [\n \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n \"M12 9v4\",\n \"M12 17h.01\",\n ],\n },\n /**\n * The Orchestra marker (Lucide `music-4`): the glyph the Workflow Studio's\n * picker used for a conductor, kept identical so the same agent wears the\n * same mark in every client.\n */\n music4: {\n paths: [\"M9 18V5l12-2v13\", \"m9 9 12-2\"],\n circles: [\n { cx: 6, cy: 18, r: 3 },\n { cx: 18, cy: 16, r: 3 },\n ],\n },\n clock: {\n paths: [\"M12 6v6l4 2\"],\n circles: [{ cx: 12, cy: 12, r: 10 }],\n },\n globe: {\n paths: [\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", \"M2 12h20\"],\n circles: [{ cx: 12, cy: 12, r: 10 }],\n },\n users: {\n paths: [\n \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\n \"M22 21v-2a4 4 0 0 0-3-3.87\",\n \"M16 3.13a4 4 0 0 1 0 7.75\",\n ],\n circles: [{ cx: 9, cy: 7, r: 4 }],\n },\n externalLink: {\n paths: [\n \"M15 3h6v6\",\n \"M10 14 21 3\",\n \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\",\n ],\n },\n messageCircle: { paths: [\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\"] },\n rocket: {\n paths: [\n \"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91 0\",\n \"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2\",\n \"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\",\n \"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\",\n ],\n },\n /**\n * THE ARCHIVE GLYPH (Lucide `archive`) — the ONE mark of the platform\n * archive filter, drawn identically in every Matrx client so the control a\n * person learns on one surface is recognisable on all of them.\n */\n archive: {\n paths: [\n \"M3 3h18a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z\",\n \"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\",\n \"M10 12h4\",\n ],\n },\n circleCheck: {\n paths: [\"m9 12 2 2 4-4\"],\n circles: [{ cx: 12, cy: 12, r: 10 }],\n },\n} satisfies Record<string, AgentCatalogIconShape>;\n\nexport type AgentCatalogIconName = keyof typeof SHAPES;\n\n/** The glyph table, widened so every shape reads uniformly at a call site. */\nexport const ICON_PATHS: Record<AgentCatalogIconName, AgentCatalogIconShape> =\n SHAPES;\n\n/** Every glyph the picker can draw. Both entries must cover all of them. */\nexport const ICON_NAMES = Object.keys(ICON_PATHS) as AgentCatalogIconName[];\n","/**\n * catalog/native/FavoriteAgentButton.tsx — the native twin of\n * `catalog/react/FavoriteAgentButton.tsx`. Same one write\n * (`catalog.setFavorite` → `platform.user_entity_state`, optimistic and\n * rolled back by the store). A star is per-person, so every row is starrable.\n */\n\nimport { useCallback } from \"react\";\nimport { Pressable } from \"react-native\";\n\nimport { useAgentCatalog, useAgentCatalogState } from \"../shared/context\";\nimport type { AgentCatalogState } from \"../store\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\n\nexport interface FavoriteAgentButtonProps {\n id: string;\n size?: number;\n disabled?: boolean;\n}\n\nexport function FavoriteAgentButton({\n id,\n size = 18,\n disabled,\n}: FavoriteAgentButtonProps) {\n const catalog = useAgentCatalog();\n const theme = useAgentCatalogNativeTheme();\n const select = useCallback((state: AgentCatalogState) => state.byId[id], [id]);\n const record = useAgentCatalogState(select);\n const isFavorite = record?.isFavorite ?? false;\n // Per-person star (platform.user_entity_state): every visible agent is\n // starrable, shared and system agents included.\n const inert = Boolean(disabled);\n\n const title = isFavorite ? \"Remove from favorites\" : \"Add to favorites\";\n\n return (\n <Pressable\n onPress={() => {\n if (inert) return;\n void catalog.setFavorite(id, !isFavorite).catch(() => {\n // Already rolled back and screamed by the store.\n });\n }}\n disabled={inert}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={title}\n accessibilityState={{ disabled: inert, selected: isFavorite }}\n style={{ opacity: inert ? 0.4 : 1 }}\n >\n <AgentIcon\n name=\"star\"\n size={size}\n filled={isFavorite}\n color={isFavorite ? theme.colors.favorite : theme.colors.textFaint}\n report={catalog.errorSink}\n />\n </Pressable>\n );\n}\n","/**\n * catalog/native/AgentListContent.tsx — the native twin of\n * `catalog/react/AgentListContent.tsx`.\n *\n * Same body, in the same order: search, the ownership tabs with counts, the\n * filter bar, the PERSISTENT drift banner, the mandate Default row, the\n * pinned Current agent row, the filtered list, and the footer count with its\n * \"Clear search\" control.\n *\n * 🚨 THE DRIFT SCREAM is a banner here too — not a toast, not a console line.\n * It holds its space until a person dismisses it, exactly as on the web; the\n * `notifier` port fires beside it, never instead of it.\n */\n\nimport { FlatList, Pressable, StyleSheet, Text, View } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport type { AgentListTabCounts } from \"../shared/useAgentListCore\";\nimport type { UseAgentConsumerReturn } from \"../shared/useAgentConsumer\";\nimport type { DefaultRowState } from \"../default-row-types\";\nimport { agentListEmptyLabel, agentListFooterLabel } from \"../labels\";\nimport type { AgentSummary, AgentTab } from \"../types\";\nimport { AgentFilterBar } from \"./AgentFilterBar\";\nimport { AgentListTabs } from \"./AgentListTabs\";\nimport { AgentRow } from \"./AgentRow\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\nimport { SearchInput } from \"./primitives\";\n\ntype ListItem =\n | { key: string; kind: \"label\"; text: string }\n | { key: string; kind: \"divider\" }\n | { key: string; kind: \"row\"; agent: AgentSummary; forceActive: boolean };\n\nexport interface AgentListContentProps {\n agents: AgentSummary[];\n isLoading: boolean;\n consumer: UseAgentConsumerReturn;\n activeAgentId: string | null;\n allCategories: string[];\n allTags: string[];\n onSelectAgent: (agent: AgentSummary) => void;\n onDetailPress: (agent: AgentSummary) => void;\n onFilterChipPress: (panel: \"sort\" | \"categories\" | \"tags\") => void;\n onReset: () => void;\n activeFilterCount: number;\n tabCounts: AgentListTabCounts;\n visibleTabs?: readonly AgentTab[] | undefined;\n systemTabLabel?: string | undefined;\n pinnedAgent?: AgentSummary | null | undefined;\n defaultRow?: DefaultRowState | null | undefined;\n autoFocusSearch?: boolean;\n /**\n * Rows the ARCHIVE FILTER is keeping off this screen — from\n * `useAgentListCore`. The footer names them, exactly as on the web.\n */\n archivedHiddenCount?: number | undefined;\n}\n\nexport function AgentListContent({\n agents,\n isLoading,\n consumer,\n activeAgentId,\n allCategories,\n allTags,\n onSelectAgent,\n onDetailPress,\n onFilterChipPress,\n onReset,\n activeFilterCount,\n tabCounts,\n visibleTabs,\n systemTabLabel,\n pinnedAgent = null,\n defaultRow = null,\n autoFocusSearch = false,\n archivedHiddenCount = 0,\n}: AgentListContentProps) {\n const catalog = useAgentCatalog();\n const theme = useAgentCatalogNativeTheme();\n const { labels, errorSink } = catalog;\n const emptyLabel =\n catalog.getUserIdOrNull() === null\n ? labels.emptySignedOut\n : agentListEmptyLabel(consumer.tab, labels);\n const defaultAgent = defaultRow?.row ?? null;\n\n const items: ListItem[] = [];\n if (defaultAgent) {\n items.push({ key: \"label-default\", kind: \"label\", text: \"Default\" });\n items.push({\n key: `default-${defaultAgent.id}`,\n kind: \"row\",\n agent: defaultAgent,\n forceActive: defaultAgent.id === activeAgentId,\n });\n items.push({ key: \"divider-default\", kind: \"divider\" });\n }\n if (pinnedAgent) {\n items.push({\n key: \"label-pinned\",\n kind: \"label\",\n text: labels.currentAgentHeading,\n });\n items.push({\n key: `pinned-${pinnedAgent.id}`,\n kind: \"row\",\n agent: pinnedAgent,\n forceActive: true,\n });\n items.push({ key: \"divider-pinned\", kind: \"divider\" });\n }\n for (const agent of agents) {\n items.push({\n key: agent.id,\n kind: \"row\",\n agent,\n forceActive: agent.id === activeAgentId,\n });\n }\n\n const hairline = {\n height: StyleSheet.hairlineWidth,\n backgroundColor: theme.colors.border,\n };\n\n return (\n <View style={[styles.container, { backgroundColor: theme.colors.background }]}>\n <View style={{ paddingHorizontal: theme.spacing.sm, paddingBottom: 6 }}>\n <SearchInput\n value={consumer.searchTerm}\n onChange={consumer.setSearchTerm}\n placeholder={labels.searchPlaceholder}\n autoFocus={autoFocusSearch}\n />\n </View>\n\n <AgentListTabs\n consumer={consumer}\n tabCounts={tabCounts}\n visibleTabs={visibleTabs}\n systemTabLabel={systemTabLabel}\n />\n\n <AgentFilterBar\n consumer={consumer}\n allCategories={allCategories}\n allTags={allTags}\n activeFilterCount={activeFilterCount}\n onFilterChipPress={onFilterChipPress}\n onReset={onReset}\n />\n\n {defaultRow?.drift && (\n <View\n accessibilityRole=\"alert\"\n style={[\n styles.banner,\n {\n marginHorizontal: theme.spacing.sm,\n borderRadius: theme.radius.md,\n backgroundColor: theme.colors.driftBackground,\n borderColor: theme.colors.driftBorder,\n },\n ]}\n >\n <AgentIcon\n name=\"alertTriangle\"\n size={14}\n color={theme.colors.driftForeground}\n report={errorSink}\n />\n <Text\n style={{\n flex: 1,\n color: theme.colors.driftForeground,\n fontSize: theme.fontSize.sm,\n }}\n >\n {defaultRow.drift}\n </Text>\n <Pressable\n onPress={() => catalog.dismissDefaultRowDrift(defaultRow.mandateKey)}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Dismiss\"\n hitSlop={8}\n >\n <AgentIcon\n name=\"x\"\n size={12}\n color={theme.colors.driftForeground}\n report={errorSink}\n />\n </Pressable>\n </View>\n )}\n {defaultRow?.error && (\n <View\n accessibilityRole=\"alert\"\n style={[\n styles.banner,\n {\n marginHorizontal: theme.spacing.sm,\n borderRadius: theme.radius.md,\n backgroundColor: theme.colors.driftBackground,\n borderColor: theme.colors.driftBorder,\n },\n ]}\n >\n <AgentIcon\n name=\"alertTriangle\"\n size={14}\n color={theme.colors.driftForeground}\n report={errorSink}\n />\n <Text\n style={{\n flex: 1,\n color: theme.colors.driftForeground,\n fontSize: theme.fontSize.sm,\n }}\n >\n {defaultRow.error}\n </Text>\n </View>\n )}\n\n <View style={hairline} />\n\n {isLoading ? (\n <View style={styles.centered}>\n <AgentIcon\n name=\"loader\"\n size={16}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <Text style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.md }}>\n {labels.loading}\n </Text>\n </View>\n ) : items.length === 0 ? (\n <View style={styles.centered}>\n <Text style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.md }}>\n {emptyLabel}\n </Text>\n </View>\n ) : (\n <FlatList\n style={styles.list}\n data={items}\n keyExtractor={(item) => item.key}\n keyboardShouldPersistTaps=\"handled\"\n renderItem={({ item }) => {\n if (item.kind === \"divider\") return <View style={hairline} />;\n if (item.kind === \"label\") {\n return (\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.xs,\n fontWeight: \"600\",\n textTransform: \"uppercase\",\n paddingHorizontal: theme.spacing.md,\n paddingTop: 8,\n paddingBottom: 2,\n }}\n >\n {item.text}\n </Text>\n );\n }\n return (\n <AgentRow\n agent={item.agent}\n isActive={item.forceActive}\n onPress={() => onSelectAgent(item.agent)}\n onDetailPress={() => onDetailPress(item.agent)}\n />\n );\n }}\n ListFooterComponent={\n agents.length === 0 && (pinnedAgent || defaultAgent) ? (\n <View style={styles.centered}>\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.md,\n }}\n >\n {emptyLabel}\n </Text>\n </View>\n ) : undefined\n }\n />\n )}\n\n <View style={hairline} />\n <View style={[styles.footer, { paddingHorizontal: theme.spacing.md }]}>\n <Text\n testID=\"agent-list-footer\"\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.xs,\n fontVariant: [\"tabular-nums\"],\n }}\n >\n {agentListFooterLabel({\n count: agents.length,\n archFilter: consumer.archFilter,\n archivedHiddenCount,\n })}\n </Text>\n {consumer.searchTerm.length > 0 && (\n <Pressable\n onPress={() => consumer.setSearchTerm(\"\")}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear search\"\n hitSlop={8}\n >\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.xs }}\n >\n Clear search\n </Text>\n </Pressable>\n )}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, minHeight: 0 },\n list: { flex: 1, minHeight: 0 },\n banner: {\n flexDirection: \"row\",\n alignItems: \"flex-start\",\n gap: 8,\n marginBottom: 6,\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderWidth: StyleSheet.hairlineWidth,\n },\n centered: {\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n paddingVertical: 32,\n },\n footer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n paddingVertical: 8,\n },\n});\n","/**\n * catalog/native/AgentFilterBar.tsx — the native twin of\n * `catalog/react/AgentFilterBar.tsx`.\n *\n * The filter bar is IDENTICAL on every tab, system included, and identical to\n * the web bar: sort, the three-state favourites cycle (all → yes → no), THE\n * THREE-STATE ARCHIVE FILTER (hide archived → show all → archived only), the\n * category chip when there are categories, the tag chip when there are tags,\n * and the reset control once anything is active.\n *\n * 🚨 The archive control is not optional here either — THE ARCHIVED-ITEMS LAW\n * clause 4 makes it a class across \"every client (web, studio, dashboard,\n * extension, desktop, VS Code, and any future one)\". Native gets the same\n * control, the same three states, the same words.\n */\n\nimport { Pressable, ScrollView, StyleSheet } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport { SORT_OPTIONS, nextArchFilter } from \"../types\";\nimport {\n agentArchiveFilterChipLabel,\n agentArchiveFilterControlLabel,\n} from \"../labels\";\nimport type { UseAgentConsumerReturn } from \"../shared/useAgentConsumer\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\nimport { FilterChip } from \"./primitives\";\n\nexport interface AgentFilterBarProps {\n consumer: UseAgentConsumerReturn;\n allCategories: string[];\n allTags: string[];\n activeFilterCount: number;\n onFilterChipPress: (panel: \"sort\" | \"categories\" | \"tags\") => void;\n onReset: () => void;\n}\n\nexport function AgentFilterBar({\n consumer,\n allCategories,\n allTags,\n activeFilterCount,\n onFilterChipPress,\n onReset,\n}: AgentFilterBarProps) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={[\n styles.bar,\n { paddingHorizontal: theme.spacing.sm },\n ]}\n >\n <FilterChip\n icon=\"arrowUpDown\"\n label={\n SORT_OPTIONS.find((o) => o.value === consumer.sortBy)?.label ?? \"Sort\"\n }\n active={consumer.sortBy !== \"updated-desc\"}\n onPress={() => onFilterChipPress(\"sort\")}\n />\n <FilterChip\n icon=\"star\"\n label={consumer.favFilter === \"no\" ? \"No Favs\" : \"Favs\"}\n active={consumer.favFilter !== \"all\"}\n onPress={() => {\n const next =\n consumer.favFilter === \"all\"\n ? \"yes\"\n : consumer.favFilter === \"yes\"\n ? \"no\"\n : \"all\";\n consumer.setFavFilter(next);\n }}\n />\n <FilterChip\n icon=\"archive\"\n label={agentArchiveFilterChipLabel(consumer.archFilter)}\n active={consumer.archFilter !== consumer.archFilterDefault}\n accessibilityLabel={agentArchiveFilterControlLabel(consumer.archFilter)}\n testID=\"agent-archive-filter\"\n onPress={() => consumer.setArchFilter(nextArchFilter(consumer.archFilter))}\n />\n {allCategories.length > 0 && (\n <FilterChip\n icon=\"folder\"\n label={\n consumer.includedCats.length > 0\n ? `${consumer.includedCats.length}`\n : \"Category\"\n }\n active={consumer.includedCats.length > 0}\n onPress={() => onFilterChipPress(\"categories\")}\n />\n )}\n {allTags.length > 0 && (\n <FilterChip\n icon=\"tag\"\n label={\n consumer.includedTags.length > 0\n ? `${consumer.includedTags.length}`\n : \"Tags\"\n }\n active={consumer.includedTags.length > 0}\n onPress={() => onFilterChipPress(\"tags\")}\n />\n )}\n {activeFilterCount > 0 && (\n <Pressable\n onPress={onReset}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Reset filters\"\n hitSlop={8}\n style={({ pressed }) => [\n styles.reset,\n {\n borderRadius: theme.radius.sm,\n backgroundColor: pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n },\n ]}\n >\n <AgentIcon\n name=\"rotateCcw\"\n size={12}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n </Pressable>\n )}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n bar: { flexDirection: \"row\", alignItems: \"center\", gap: 4, paddingBottom: 6 },\n reset: {\n height: 28,\n paddingHorizontal: 8,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n});\n","/**\n * catalog/native/primitives.tsx — @ai-matrx/agents/catalog/native\n *\n * The native twins of `catalog/react/primitives.tsx`: the same five controls\n * (`SearchInput`, `FilterChip`, `OptionRow`, `CheckRow`, `SidePanelHeader`),\n * the same props, the same behaviour — drawn with React Native primitives and\n * `StyleSheet` instead of DOM elements and Tailwind classes.\n *\n * Colour comes ONLY from the theme (C26); there is not one literal in here.\n */\n\nimport { Pressable, StyleSheet, Text, TextInput, View } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport { AgentIcon, type AgentCatalogIconName } from \"./icons\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\n\nexport function SearchInput({\n value,\n onChange,\n placeholder,\n autoFocus = false,\n}: {\n value: string;\n onChange: (v: string) => void;\n placeholder: string;\n autoFocus?: boolean;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n return (\n <View\n style={[\n styles.searchWrap,\n {\n backgroundColor: theme.colors.surface,\n borderColor: theme.colors.border,\n borderRadius: theme.radius.md,\n paddingHorizontal: theme.spacing.sm,\n },\n ]}\n >\n <AgentIcon\n name=\"search\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <TextInput\n value={value}\n onChangeText={onChange}\n placeholder={placeholder}\n placeholderTextColor={theme.colors.textFaint}\n autoFocus={autoFocus}\n autoCorrect={false}\n autoCapitalize=\"none\"\n returnKeyType=\"search\"\n accessibilityLabel={placeholder}\n style={[styles.searchInput, { color: theme.colors.text }]}\n />\n {value.length > 0 && (\n <Pressable\n onPress={() => onChange(\"\")}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear search\"\n hitSlop={8}\n >\n <AgentIcon\n name=\"x\"\n size={13}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n </Pressable>\n )}\n </View>\n );\n}\n\nexport function FilterChip({\n icon,\n label,\n active,\n onPress,\n accessibilityLabel,\n testID,\n}: {\n icon: AgentCatalogIconName;\n label: string;\n active: boolean;\n onPress: () => void;\n /** Accessible name when the visible label alone would not say the state. */\n accessibilityLabel?: string;\n /** Stable hook so a shell test can measure the control, not a style. */\n testID?: string;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n const tint = active ? theme.colors.primary : theme.colors.textMuted;\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active }}\n accessibilityLabel={accessibilityLabel ?? label}\n {...(testID ? { testID } : {})}\n style={({ pressed }) => [\n styles.chip,\n {\n borderRadius: theme.radius.sm,\n backgroundColor: active\n ? theme.colors.primarySoft\n : pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n borderColor: active ? theme.colors.primary : \"transparent\",\n },\n ]}\n >\n <AgentIcon name={icon} size={12} color={tint} report={errorSink} />\n <Text style={{ color: tint, fontSize: theme.fontSize.sm, fontWeight: \"500\" }}>\n {label}\n </Text>\n </Pressable>\n );\n}\n\nexport function OptionRow({\n label,\n selected,\n onPress,\n}: {\n label: string;\n selected: boolean;\n onPress: () => void;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityState={{ selected }}\n style={({ pressed }) => [\n styles.optionRow,\n {\n paddingHorizontal: theme.spacing.md,\n backgroundColor: pressed ? theme.colors.surfacePressed : \"transparent\",\n },\n ]}\n >\n <Text\n style={{\n flex: 1,\n color: selected ? theme.colors.primary : theme.colors.text,\n fontSize: theme.fontSize.md,\n fontWeight: selected ? \"600\" : \"400\",\n }}\n >\n {label}\n </Text>\n {selected && (\n <AgentIcon\n name=\"check\"\n size={14}\n color={theme.colors.primary}\n report={errorSink}\n />\n )}\n </Pressable>\n );\n}\n\nexport function CheckRow({\n label,\n checked,\n onPress,\n}: {\n label: string;\n checked: boolean;\n onPress: () => void;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"checkbox\"\n accessibilityState={{ checked }}\n style={({ pressed }) => [\n styles.checkRow,\n {\n paddingHorizontal: theme.spacing.md,\n backgroundColor: pressed ? theme.colors.surfacePressed : \"transparent\",\n },\n ]}\n >\n <View\n style={[\n styles.checkBox,\n {\n borderRadius: theme.radius.sm,\n borderColor: checked ? theme.colors.primary : theme.colors.border,\n backgroundColor: checked ? theme.colors.primary : \"transparent\",\n },\n ]}\n >\n {checked && (\n <AgentIcon\n name=\"check\"\n size={10}\n color={theme.colors.primaryForeground}\n report={errorSink}\n />\n )}\n </View>\n <Text\n numberOfLines={1}\n style={{ flex: 1, color: theme.colors.text, fontSize: theme.fontSize.md }}\n >\n {label}\n </Text>\n </Pressable>\n );\n}\n\nexport function SidePanelHeader({\n title,\n onClose,\n}: {\n title: string;\n onClose: () => void;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n return (\n <View\n style={[\n styles.panelHeader,\n {\n paddingHorizontal: theme.spacing.md,\n borderBottomColor: theme.colors.border,\n },\n ]}\n >\n <Text\n style={{\n color: theme.colors.text,\n fontSize: theme.fontSize.md,\n fontWeight: \"600\",\n }}\n >\n {title}\n </Text>\n <Pressable\n onPress={onClose}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close\"\n hitSlop={8}\n >\n <AgentIcon\n name=\"x\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n searchWrap: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 6,\n height: 36,\n borderWidth: StyleSheet.hairlineWidth,\n },\n searchInput: {\n flex: 1,\n minWidth: 0,\n padding: 0,\n fontSize: 15,\n },\n chip: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 4,\n height: 28,\n paddingHorizontal: 8,\n borderWidth: StyleSheet.hairlineWidth,\n },\n optionRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingVertical: 10,\n },\n checkRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n paddingVertical: 8,\n },\n checkBox: {\n width: 18,\n height: 18,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: 1,\n },\n panelHeader: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n});\n","/**\n * catalog/native/AgentListTabs.tsx — the native twin of\n * `catalog/react/AgentListTabs.tsx`. Same four tabs, same order, same labels\n * (`labels.publicTab` / `systemTabLabel`), same counts, same `visibleTabs`\n * restriction. A tab strip that offered a different set on mobile than on the\n * web is exactly the drift this package exists to end.\n */\n\nimport { Pressable, ScrollView, StyleSheet, Text } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport type { AgentListTabCounts } from \"../shared/useAgentListCore\";\nimport type { UseAgentConsumerReturn } from \"../shared/useAgentConsumer\";\nimport type { AgentTab } from \"../types\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\n\nexport interface AgentListTabsProps {\n consumer: UseAgentConsumerReturn;\n tabCounts: AgentListTabCounts;\n visibleTabs?: readonly AgentTab[] | undefined;\n /** Label for the builtin tab. Users see \"Public\"; admin surfaces \"System\". */\n systemTabLabel?: string | undefined;\n}\n\nexport function AgentListTabs({\n consumer,\n tabCounts,\n visibleTabs,\n systemTabLabel,\n}: AgentListTabsProps) {\n const { labels } = useAgentCatalog();\n const theme = useAgentCatalogNativeTheme();\n\n const tabs: {\n value: AgentTab;\n label: string;\n countKey: keyof AgentListTabCounts;\n }[] = [\n { value: \"mine\", label: \"Mine\", countKey: \"mine\" },\n { value: \"shared\", label: \"Shared\", countKey: \"shared\" },\n { value: \"all\", label: \"All\", countKey: \"all\" },\n { value: \"system\", label: labels.publicTab, countKey: \"system\" },\n ];\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n accessibilityRole=\"tablist\"\n accessibilityLabel=\"Agent ownership\"\n contentContainerStyle={[\n styles.strip,\n { paddingHorizontal: theme.spacing.sm },\n ]}\n >\n {tabs\n .filter(({ value }) => !visibleTabs || visibleTabs.includes(value))\n .map(({ value, label: baseLabel, countKey }) => {\n const label =\n value === \"system\" ? (systemTabLabel ?? baseLabel) : baseLabel;\n const active = consumer.tab === value;\n const count = tabCounts[countKey];\n return (\n <Pressable\n key={value}\n onPress={() => consumer.setTab(value)}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: active }}\n accessibilityLabel={`${label}, ${count}`}\n style={({ pressed }) => [\n styles.tab,\n {\n borderRadius: theme.radius.md,\n backgroundColor: active\n ? theme.colors.primary\n : pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n },\n ]}\n >\n <Text\n style={{\n color: active\n ? theme.colors.primaryForeground\n : theme.colors.textMuted,\n fontSize: theme.fontSize.sm,\n fontWeight: \"500\",\n }}\n >\n {label}\n </Text>\n <Text\n style={{\n color: active\n ? theme.colors.primaryForeground\n : theme.colors.textMuted,\n fontSize: theme.fontSize.sm,\n opacity: 0.8,\n fontVariant: [\"tabular-nums\"],\n }}\n >\n {count}\n </Text>\n </Pressable>\n );\n })}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n strip: { flexDirection: \"row\", alignItems: \"center\", gap: 4, paddingBottom: 6 },\n tab: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 4,\n paddingHorizontal: 10,\n paddingVertical: 6,\n },\n});\n","/**\n * catalog/native/AgentRow.tsx — the native twin of `catalog/react/AgentRow.tsx`.\n *\n * Same content, same order, same badges: favourite star, name, the Orchestra\n * conductor marker with its member count, and the origin badge (`system` for a\n * builtin, `shared` for a row you do not own). Seams: the web row's\n * `LinkComponent` anchor (which exists for cmd-click, an affordance React\n * Native does not have) becomes an ordinary `Pressable`; Tailwind classes\n * become themed styles.\n */\n\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport { orchestraDelegatesLine, orchestraLabel } from \"../orchestra\";\nimport type { AgentSummary } from \"../types\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\n\nexport interface AgentRowProps {\n agent: AgentSummary;\n isActive: boolean;\n onPress: () => void;\n onDetailPress: () => void;\n}\n\nexport function AgentRow({\n agent,\n isActive,\n onPress,\n onDetailPress,\n}: AgentRowProps) {\n const { labels, errorSink } = useAgentCatalog();\n const theme = useAgentCatalogNativeTheme();\n\n return (\n <View\n testID={`agent-row-${agent.id}`}\n style={[\n styles.row,\n isActive ? { backgroundColor: theme.colors.primarySoft } : null,\n ]}\n >\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: isActive }}\n accessibilityLabel={agent.name || \"Untitled\"}\n style={({ pressed }) => [\n styles.main,\n {\n paddingHorizontal: theme.spacing.md,\n backgroundColor: pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n },\n ]}\n >\n {agent.isFavorite && (\n <AgentIcon\n name=\"star\"\n size={12}\n filled\n color={theme.colors.favorite}\n report={errorSink}\n />\n )}\n <Text\n numberOfLines={1}\n style={{\n flexShrink: 1,\n color: isActive ? theme.colors.primary : theme.colors.text,\n fontSize: theme.fontSize.md,\n fontWeight: \"500\",\n }}\n >\n {agent.name || \"Untitled\"}\n </Text>\n {/* The conductor marker. An Orchestra runs its WHOLE ensemble from\n this one choice, so the row says so where the choice is made. */}\n {agent.orchestra && (\n <View\n accessibilityLabel={\n orchestraDelegatesLine(agent.orchestra) ??\n orchestraLabel(agent.orchestra)\n }\n style={[\n styles.badge,\n {\n backgroundColor: theme.colors.primarySoft,\n borderRadius: theme.radius.sm,\n },\n ]}\n >\n <AgentIcon\n name=\"music4\"\n size={10}\n color={theme.colors.primary}\n report={errorSink}\n />\n <Text\n style={{ color: theme.colors.primary, fontSize: theme.fontSize.xs }}\n >\n {agent.orchestra.memberCount}\n </Text>\n </View>\n )}\n <View style={styles.spacer} />\n {/* ARCHIVED rows stay offered (the archived-items law) and say so. */}\n {agent.isArchived ? (\n <Text\n testID={`agent-archived-badge-${agent.id}`}\n style={[\n styles.originBadge,\n {\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.sm,\n fontSize: theme.fontSize.xs,\n },\n ]}\n >\n {labels.archivedBadge}\n </Text>\n ) : null}\n {/* Origin badge. On a blended list this is the only thing that tells\n a system agent from your own. */}\n {agent.agentType === \"builtin\" ? (\n <Text\n style={[\n styles.originBadge,\n {\n color: theme.colors.primary,\n backgroundColor: theme.colors.primarySoft,\n borderRadius: theme.radius.sm,\n fontSize: theme.fontSize.xs,\n },\n ]}\n >\n {labels.systemBadge}\n </Text>\n ) : agent.isOwner === false ? (\n <Text\n style={[\n styles.originBadge,\n {\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.sm,\n fontSize: theme.fontSize.xs,\n },\n ]}\n >\n shared\n </Text>\n ) : null}\n </Pressable>\n <Pressable\n onPress={onDetailPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`Show details for ${agent.name || \"Untitled\"}`}\n hitSlop={6}\n style={({ pressed }) => [\n styles.detailButton,\n {\n backgroundColor: pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n },\n ]}\n >\n <AgentIcon\n name=\"chevronRight\"\n size={16}\n color={theme.colors.textFaint}\n report={errorSink}\n />\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: { flexDirection: \"row\", alignItems: \"stretch\" },\n main: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 6,\n paddingVertical: 10,\n minWidth: 0,\n },\n spacer: { flex: 1 },\n badge: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 2,\n paddingHorizontal: 4,\n paddingVertical: 1,\n },\n originBadge: {\n overflow: \"hidden\",\n paddingHorizontal: 4,\n paddingVertical: 1,\n fontWeight: \"500\",\n },\n detailButton: {\n width: 40,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n});\n","/**\n * catalog/native/AgentSubView.tsx — the native twin of\n * `catalog/react/AgentMobileSubView.tsx`: the sort / categories / tags panels\n * the filter chips open.\n *\n * Carries the SAME \"Clear (n)\" fix the web panels carry (C22): the clear\n * control writes the WHOLE inclusion set in one call (`setIncludedCats` /\n * `setIncludedTags`) rather than looping a toggle that recomputes from a stale\n * render snapshot and therefore removes exactly one value.\n */\n\nimport { Pressable, ScrollView, StyleSheet, Text, View } from \"react-native\";\n\nimport { SORT_OPTIONS } from \"../types\";\nimport type { UseAgentConsumerReturn } from \"../shared/useAgentConsumer\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { CheckRow, OptionRow, SearchInput, SidePanelHeader } from \"./primitives\";\n\nexport type AgentSubViewName = \"sort\" | \"categories\" | \"tags\";\n\nexport interface AgentSubViewProps {\n view: AgentSubViewName;\n consumer: UseAgentConsumerReturn;\n allCategories: string[];\n allTags: string[];\n search: string;\n setSearch: (value: string) => void;\n onBack: () => void;\n}\n\nexport function AgentSubView({\n view,\n consumer,\n allCategories,\n allTags,\n search,\n setSearch,\n onBack,\n}: AgentSubViewProps) {\n const theme = useAgentCatalogNativeTheme();\n const title =\n view === \"sort\" ? \"Sort\" : view === \"categories\" ? \"Categories\" : \"Tags\";\n\n const values = view === \"categories\" ? allCategories : allTags;\n const included =\n view === \"categories\" ? consumer.includedCats : consumer.includedTags;\n const filtered = values.filter(\n (value) => !search || value.toLowerCase().includes(search.toLowerCase()),\n );\n\n return (\n <View style={styles.container}>\n <SidePanelHeader title={title} onClose={onBack} />\n {view === \"sort\" ? (\n <ScrollView style={styles.list}>\n {SORT_OPTIONS.map((option) => (\n <OptionRow\n key={option.value}\n label={option.label}\n selected={consumer.sortBy === option.value}\n onPress={() => {\n consumer.setSortBy(option.value);\n onBack();\n }}\n />\n ))}\n </ScrollView>\n ) : (\n <>\n <View style={{ paddingHorizontal: theme.spacing.sm, paddingVertical: 6 }}>\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder={\n view === \"categories\" ? \"Filter categories...\" : \"Filter tags...\"\n }\n />\n </View>\n {included.length > 0 && (\n <Pressable\n onPress={() =>\n view === \"categories\"\n ? consumer.setIncludedCats([])\n : consumer.setIncludedTags([])\n }\n accessibilityRole=\"button\"\n accessibilityLabel={`Clear ${included.length} filters`}\n style={{\n marginHorizontal: theme.spacing.sm,\n marginBottom: 4,\n paddingVertical: 6,\n }}\n >\n <Text\n style={{\n color: theme.colors.primary,\n fontSize: theme.fontSize.sm,\n fontWeight: \"600\",\n }}\n >\n Clear ({included.length})\n </Text>\n </Pressable>\n )}\n <ScrollView style={styles.list}>\n {filtered.length === 0 ? (\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.md,\n textAlign: \"center\",\n paddingVertical: 24,\n }}\n >\n {view === \"categories\" ? \"No categories\" : \"No tags\"}\n </Text>\n ) : (\n filtered.map((value) => (\n <CheckRow\n key={value}\n label={value}\n checked={included.includes(value)}\n onPress={() =>\n view === \"categories\"\n ? consumer.toggleCategory(value)\n : consumer.toggleTag(value)\n }\n />\n ))\n )}\n </ScrollView>\n </>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, minHeight: 0 },\n list: { flex: 1, minHeight: 0 },\n});\n","/**\n * catalog/native/AgentListInlinePicker.tsx — the embedded native picker.\n *\n * Identical content to `AgentListSheet`, with no sheet chrome and no heading:\n * for a screen that dedicates a region to agent selection. Same core, same\n * rows, same order — the two shells differ only in what wraps them.\n */\n\nimport { StyleSheet, View } from \"react-native\";\n\nimport { AgentPickerBody, type AgentPickerProps } from \"./AgentPickerBody\";\n\nexport type AgentListInlinePickerProps = AgentPickerProps;\n\nexport function AgentListInlinePicker(props: AgentListInlinePickerProps) {\n return (\n <View style={styles.fill}>\n <AgentPickerBody {...props} />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1, minHeight: 0 },\n});\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react_native","import_react","import_react_native","import_react","import_react","import_react_native","import_react_native","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","isFavorite","import_jsx_runtime","import_react_native","import_react_native","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","styles"]}
|
|
1
|
+
{"version":3,"sources":["../../../catalog/native/index.ts","../../../catalog/native/context.tsx","../../../catalog/shared/context.tsx","../../../catalog/native/theme.ts","../../../catalog/native/AgentListSheet.tsx","../../../catalog/native/AgentPickerBody.tsx","../../../catalog/shared/useAgentListCore.ts","../../../catalog/shared/useAgentConsumer.ts","../../../catalog/types.ts","../../../catalog/labels.ts","../../../catalog/score.ts","../../../catalog/selectors.ts","../../../catalog/native/AgentDetailCard.tsx","../../../catalog/orchestra.ts","../../../catalog/native/icons.tsx","../../../catalog/shared/icon-paths.ts","../../../catalog/native/FavoriteAgentButton.tsx","../../../catalog/native/AgentListContent.tsx","../../../catalog/native/AgentFilterBar.tsx","../../../catalog/native/primitives.tsx","../../../catalog/native/AgentListTabs.tsx","../../../catalog/native/AgentRow.tsx","../../../catalog/native/AgentSubView.tsx","../../../catalog/native/AgentListInlinePicker.tsx"],"sourcesContent":["/**\n * `@ai-matrx/agents/catalog/native` — THE agent picker, on React Native.\n *\n * ONE agent picker exists on this platform. This entry renders it with React\n * Native primitives over the SAME headless kernel and the SAME hooks the web\n * entry uses (`catalog/shared/*`), so a mobile app's list is the same rows in\n * the same order with the same tabs, counts and filters as the browser's.\n *\n * ```tsx\n * import { createAgentCatalog } from \"@ai-matrx/agents/catalog\";\n * import { AgentCatalogProvider, AgentListSheet } from \"@ai-matrx/agents/catalog/native\";\n * import AsyncStorage from \"@react-native-async-storage/async-storage\";\n *\n * const catalog = createAgentCatalog({\n * client: supabase,\n * identity: { requireUserId: () => requireUserId() },\n * storage: AsyncStorage, // the async storage seam (0.9.0)\n * transport, // only when a picker passes defaultMandateKey\n * errorSink: reportToYourDiagnostics,\n * });\n *\n * <AgentCatalogProvider catalog={catalog} navigate={(href) => router.push(href)}>\n * <AgentListSheet onSelect={setAgentId} activeAgentId={agentId} consumerId=\"chat\" />\n * </AgentCatalogProvider>\n * ```\n *\n * 🚨 NO `\"use client\"` ON THIS ENTRY. React Native has no React Server\n * Components; the stamp would be meaningless here and harmful anywhere else it\n * travelled. The tarball canary proves its absence on all four artefacts.\n *\n * `react-native` is an OPTIONAL peer (this entry needs it; no other entry\n * does). `react-native-svg` is an OPTIONAL peer too — without it the icons\n * degrade to text glyphs and say so once, through the errorSink.\n */\n\nexport {\n AgentCatalogProvider,\n useAgentCatalog,\n useAgentCatalogNativeTheme,\n useAgentCatalogRows,\n useAgentCatalogState,\n useAgentCatalogUiPorts,\n type AgentCatalogLinkComponent,\n type AgentCatalogNativeProviderProps,\n type AgentCatalogPlatformDefaults,\n type AgentCatalogRenderModelRef,\n type AgentCatalogUiPorts,\n} from \"./context\";\n\nexport {\n DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n LIGHT_AGENT_CATALOG_NATIVE_THEME,\n resolveAgentCatalogNativeTheme,\n type AgentCatalogNativeColors,\n type AgentCatalogNativeTheme,\n type AgentCatalogNativeThemeOverride,\n} from \"./theme\";\n\nexport { AgentListSheet, type AgentListSheetProps } from \"./AgentListSheet\";\nexport {\n AgentListInlinePicker,\n type AgentListInlinePickerProps,\n} from \"./AgentListInlinePicker\";\nexport { AgentPickerBody, type AgentPickerProps } from \"./AgentPickerBody\";\n\nexport {\n AgentListContent,\n type AgentListContentProps,\n} from \"./AgentListContent\";\nexport { AgentListTabs, type AgentListTabsProps } from \"./AgentListTabs\";\nexport { AgentFilterBar, type AgentFilterBarProps } from \"./AgentFilterBar\";\nexport { AgentRow, type AgentRowProps } from \"./AgentRow\";\nexport { AgentDetailCard, type AgentDetailCardProps } from \"./AgentDetailCard\";\nexport {\n AgentSubView,\n type AgentSubViewName,\n type AgentSubViewProps,\n} from \"./AgentSubView\";\nexport {\n FavoriteAgentButton,\n type FavoriteAgentButtonProps,\n} from \"./FavoriteAgentButton\";\nexport {\n CheckRow,\n FilterChip,\n OptionRow,\n SearchInput,\n SidePanelHeader,\n} from \"./primitives\";\n\nexport {\n AgentIcon,\n announceMissingSvgOnce,\n resolveSvgModule,\n _resetNativeIconState,\n type AgentCatalogIconName,\n type AgentIconProps,\n} from \"./icons\";\n\nexport {\n useAgentConsumer,\n type UseAgentConsumerReturn,\n} from \"../shared/useAgentConsumer\";\nexport {\n HOVER_GRACE_MS,\n coerceVisibleTab,\n useAgentListCore,\n type AgentListCoreOptions,\n type AgentListTabCounts,\n} from \"../shared/useAgentListCore\";\n\n/**\n * The Orchestra marker's words, re-exported so a host rendering its OWN\n * summary of a chosen agent shows the same sentence as the picker it chose\n * from — never a second vocabulary for the same badge.\n */\nexport {\n orchestraDelegatesLine,\n orchestraDepthLine,\n orchestraLabel,\n orchestraModeLabel,\n} from \"../orchestra\";\nexport type { OrchestraBadge } from \"../types\";\n","/**\n * catalog/native/context.tsx — @ai-matrx/agents/catalog/native\n *\n * THE REACT NATIVE BINDING of the one provider. The context, the store\n * subscription and every hook come from `../shared/context` — the SAME code\n * the web picker runs. This file adds only what a platform owes: the three\n * native defaults, and the theme object that replaces CSS custom properties\n * on a platform that has no cascade (C26 — see `./theme`).\n *\n * 🚨 NO `\"use client\"` HERE, and none on the built `catalog/native` entry.\n * React Native has no React Server Components, and a `\"use client\"` prologue\n * on a native module turns its exports into client references for any RSC\n * bundler that later sees them — a stamp that means nothing where it lands and\n * breaks where it does not belong. The banner canary in\n * `scripts/verify-tarball.mjs` proves its absence on all four native artefacts.\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { Pressable, Text } from \"react-native\";\n\nimport {\n AgentCatalogProviderCore,\n type AgentCatalogLinkComponent,\n type AgentCatalogPlatformDefaults,\n type AgentCatalogRenderModelRef,\n type AgentCatalogUiPorts,\n} from \"../shared/context\";\nimport type { AgentCatalog } from \"../store\";\nimport {\n DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n resolveAgentCatalogNativeTheme,\n type AgentCatalogNativeTheme,\n type AgentCatalogNativeThemeOverride,\n} from \"./theme\";\n\nexport {\n useAgentCatalog,\n useAgentCatalogRows,\n useAgentCatalogState,\n useAgentCatalogUiPorts,\n type AgentCatalogLinkComponent,\n type AgentCatalogPlatformDefaults,\n type AgentCatalogRenderModelRef,\n type AgentCatalogUiPorts,\n} from \"../shared/context\";\n\nconst ThemeContext = createContext<AgentCatalogNativeTheme>(\n DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n);\n\n/** The resolved theme for this tree. Never throws — there is always a default. */\nexport function useAgentCatalogNativeTheme(): AgentCatalogNativeTheme {\n return useContext(ThemeContext);\n}\n\nexport interface AgentCatalogNativeProviderProps extends AgentCatalogUiPorts {\n catalog: AgentCatalog;\n /**\n * Brand overrides for the picker's token values (C26). Anything omitted\n * keeps the shipped default, so an unthemed app still renders correctly.\n */\n theme?: AgentCatalogNativeThemeOverride;\n children: ReactNode;\n}\n\n/**\n * The native default link. React Native has no `<a>` and no cmd-click, so the\n * default is an ordinary pressable that runs the row's own handler — a REAL,\n * working control rather than a web affordance that would do nothing here.\n */\nconst NativeLink: AgentCatalogLinkComponent = ({ children, onClick, title }) => (\n <Pressable\n accessibilityRole=\"link\"\n {...(title ? { accessibilityLabel: title } : {})}\n onPress={() =>\n onClick?.({\n preventDefault: () => {},\n stopPropagation: () => {},\n })\n }\n >\n {children}\n </Pressable>\n);\n\n/** The native default model reference: the id as plain, themed text. */\nconst nativeRenderModelRef: AgentCatalogRenderModelRef = ({ modelId }) => (\n <Text>{modelId}</Text>\n);\n\nexport function AgentCatalogProvider({\n catalog,\n theme,\n children,\n ...ports\n}: AgentCatalogNativeProviderProps) {\n const resolvedTheme = useMemo(\n () => resolveAgentCatalogNativeTheme(theme),\n // A theme object is declared once by a host; re-resolving on identity\n // change is correct and cheap.\n [theme],\n );\n\n const platform = useMemo<AgentCatalogPlatformDefaults>(\n () => ({\n /**\n * 🚨 THE NATIVE `navigate` DEFAULT. There is no `window.location` to\n * assign, and there is no router this package may assume — Expo Router,\n * React Navigation and a custom stack all differ. So the default is a\n * no-op that REPORTS, with the remedy, through the catalog's own\n * errorSink. It never fails silently, and it never pretends to have\n * navigated. A host that wants working links passes `navigate`.\n */\n navigate: (href: string) => {\n catalog.errorSink({\n code: \"native_navigate_not_bound\",\n message:\n \"the agent picker was asked to navigate, but this native host \" +\n \"bound no `navigate` port, so nothing moved.\",\n context: {\n href,\n remedy:\n \"pass navigate={(href) => router.push(href)} (Expo Router) or \" +\n \"your navigator's equivalent to <AgentCatalogProvider>\",\n },\n });\n },\n LinkComponent: NativeLink,\n renderModelRef: nativeRenderModelRef,\n }),\n [catalog],\n );\n\n return (\n <ThemeContext.Provider value={resolvedTheme}>\n <AgentCatalogProviderCore\n catalog={catalog}\n platform={platform}\n {...ports}\n >\n {children}\n </AgentCatalogProviderCore>\n </ThemeContext.Provider>\n );\n}\n","/**\n * catalog/shared/context.tsx — THE ONE React binding point, platform-neutral.\n *\n * 0.9.0 moved the provider, the context and the three subscription hooks OUT\n * of `catalog/react/context.tsx` and into this file so the React Native entry\n * (`@ai-matrx/agents/catalog/native`) reuses the SAME provider, the SAME store\n * subscription and the SAME hooks as the web picker. Only the VIEW layer, and\n * the three platform DEFAULTS below, differ between the two entries.\n *\n * 🚨 NOTHING IN THIS FILE MAY TOUCH THE DOM OR react-native. A default that\n * renders `<a>` is a web default and a default that renders `<Text>` is a\n * native default; both arrive through `platform`, which each entry's own\n * `AgentCatalogProvider` supplies. That is why `useAgentCatalogUiPorts()`\n * still answers with every default already applied on both platforms, and why\n * an unset port is never `undefined` on either.\n *\n * This file carries NO `\"use client\"` source directive on purpose: the stamp\n * is applied per BUILT ENTRY by tsup (the web entry gets it, the native entry\n * must not — React Native has no RSC and a stamped native module is a lie).\n */\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useSyncExternalStore,\n type ComponentType,\n type ReactNode,\n} from \"react\";\n\nimport type { AgentCatalog, AgentCatalogState } from \"../store\";\nimport type {\n AgentCatalogNavigate,\n AgentCatalogOpenPeek,\n} from \"../ports\";\nimport type { AgentSummary } from \"../types\";\n\n/**\n * The anchor a row renders for cmd/ctrl-click. DEFAULT (web): a plain `<a>` —\n * which is a REAL, working link in every framework. A Next.js host passes\n * `next/link`; a TanStack host passes its own `Link`. On React Native the\n * default is a pressable `Text` that routes through `navigate`.\n */\n/**\n * What a row's link handler receives. A DOM `React.MouseEvent` satisfies this\n * structurally, and the native default link supplies the two methods itself —\n * so a shared component can call `preventDefault()` on either platform\n * without a platform check.\n */\nexport interface AgentCatalogLinkClickEvent {\n metaKey?: boolean;\n ctrlKey?: boolean;\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport type AgentCatalogLinkComponent = ComponentType<{\n href: string;\n className?: string;\n target?: string;\n rel?: string;\n title?: string;\n \"aria-label\"?: string;\n onClick?: (e: AgentCatalogLinkClickEvent) => void;\n children: ReactNode;\n}>;\n\n/**\n * Render a model id as whatever door the host has. DEFAULT: plain text.\n * `offeringId` is the agent's class pin when the row carries it (`null` = no\n * pin, the preferred class runs); ABSENT = unknown — name the model alone.\n */\nexport type AgentCatalogRenderModelRef = (args: {\n modelId: string;\n offeringId?: string | null;\n className?: string;\n}) => ReactNode;\n\nexport interface AgentCatalogUiPorts {\n /** DEFAULT (web): `window.location.assign`. DEFAULT (native): a reporting no-op. */\n navigate?: AgentCatalogNavigate;\n /** DEFAULT: a plain `<a>` (web) / a pressable `Text` (native). */\n LinkComponent?: AgentCatalogLinkComponent;\n /** DEFAULT: the model id as plain text. */\n renderModelRef?: AgentCatalogRenderModelRef;\n /** ABSENT: the sneak-peek affordance is HIDDEN — never a dead button. */\n openPeek?: AgentCatalogOpenPeek;\n /**\n * Portal container for the desktop popover, when the picker is mounted\n * inside a dialog. DEFAULT: the document body (Radix's own default).\n * Web only — the native entry ignores it.\n */\n popoverContainer?: HTMLElement | null;\n}\n\n/**\n * The three defaults a PLATFORM supplies. Never a host concern: a host\n * overrides an individual port through `AgentCatalogUiPorts`, and whatever it\n * leaves unset falls back to the platform's own working answer.\n */\nexport interface AgentCatalogPlatformDefaults {\n navigate: AgentCatalogNavigate;\n LinkComponent: AgentCatalogLinkComponent;\n renderModelRef: AgentCatalogRenderModelRef;\n}\n\ninterface AgentCatalogBinding extends AgentCatalogUiPorts {\n catalog: AgentCatalog;\n platform: AgentCatalogPlatformDefaults;\n}\n\nconst AgentCatalogContext = createContext<AgentCatalogBinding | null>(null);\n\nexport interface AgentCatalogProviderCoreProps extends AgentCatalogUiPorts {\n catalog: AgentCatalog;\n platform: AgentCatalogPlatformDefaults;\n children: ReactNode;\n}\n\n/**\n * The provider itself. Each entry wraps this with its own platform defaults\n * and re-exports it as `AgentCatalogProvider`; hosts never see this name.\n */\nexport function AgentCatalogProviderCore({\n catalog,\n platform,\n children,\n ...ports\n}: AgentCatalogProviderCoreProps) {\n const value = useMemo<AgentCatalogBinding>(\n () => ({ catalog, platform, ...ports }),\n // The ports are plain values a host declares once; re-binding on identity\n // change is correct and cheap.\n [\n catalog,\n platform,\n ports.navigate,\n ports.LinkComponent,\n ports.renderModelRef,\n ports.openPeek,\n ports.popoverContainer,\n ],\n );\n return (\n <AgentCatalogContext.Provider value={value}>\n {children}\n </AgentCatalogContext.Provider>\n );\n}\n\nfunction useBinding(): AgentCatalogBinding {\n const binding = useContext(AgentCatalogContext);\n if (!binding) {\n throw new Error(\n \"@ai-matrx/agents/catalog: no <AgentCatalogProvider> is mounted \" +\n \"above this component. Create the catalog once with \" +\n \"createAgentCatalog({ client, identity }) and mount \" +\n \"<AgentCatalogProvider catalog={catalog}> at the top of your tree.\",\n );\n }\n return binding;\n}\n\n/** The headless catalog this tree is bound to. Throws with no provider. */\nexport function useAgentCatalog(): AgentCatalog {\n return useBinding().catalog;\n}\n\n/** The UI ports this tree is bound to, with every default already applied. */\nexport function useAgentCatalogUiPorts(): Required<\n Pick<AgentCatalogUiPorts, \"navigate\" | \"LinkComponent\" | \"renderModelRef\">\n> & {\n openPeek: AgentCatalogOpenPeek | undefined;\n popoverContainer: HTMLElement | null | undefined;\n} {\n const binding = useBinding();\n const hostNavigate = binding.navigate;\n const platformNavigate = binding.platform.navigate;\n const navigate = useCallback<AgentCatalogNavigate>(\n (href) => {\n if (hostNavigate) {\n hostNavigate(href);\n return;\n }\n platformNavigate(href);\n },\n [hostNavigate, platformNavigate],\n );\n return {\n navigate,\n LinkComponent: binding.LinkComponent ?? binding.platform.LinkComponent,\n renderModelRef:\n binding.renderModelRef ?? binding.platform.renderModelRef,\n openPeek: binding.openPeek,\n popoverContainer: binding.popoverContainer,\n };\n}\n\n/**\n * Subscribe to a slice of catalog state. `useSyncExternalStore` because the\n * catalog is an external store and React 18/19 concurrency must not tear it.\n * `select` MUST return a stable reference for unchanged state — every\n * selector in `../selectors` does.\n */\nexport function useAgentCatalogState<T>(\n select: (state: AgentCatalogState) => T,\n): T {\n const catalog = useAgentCatalog();\n const getSnapshot = useCallback(\n () => select(catalog.getState()),\n [catalog, select],\n );\n return useSyncExternalStore(catalog.subscribe, getSnapshot, getSnapshot);\n}\n\n/** Every row currently in the catalogue, as one stable array. */\nexport function useAgentCatalogRows(): AgentSummary[] {\n return useAgentCatalogState(selectRows);\n}\n\nconst selectRows = (state: AgentCatalogState): AgentSummary[] => state.rows;\n","/**\n * catalog/native/theme.ts — @ai-matrx/agents/catalog/native\n *\n * 🚨 C26 ON A PLATFORM WITH NO CSS. The web picker consumes colour ONLY\n * through named semantic tokens (`--matrx-agent-*` plus the design system's\n * `--primary`, `--muted-foreground`, …), and `catalog/styles.css` ships their\n * DEFAULT VALUES so the picker renders correctly unthemed in a fresh app.\n * React Native has no custom properties and no cascade, so the identical\n * contract is expressed as a plain object: the package ships every default\n * value, and a host re-brands by passing `theme` to `AgentCatalogProvider`.\n *\n * Every name below is the native twin of a token the web sheet defines, so a\n * colour changed in one place is findable in the other. NOTHING in the native\n * components hardcodes a colour — they read this object and nothing else.\n */\n\n/** The colour half of the contract. Every value is host-overridable. */\nexport interface AgentCatalogNativeColors {\n /** Sheet / list background. Web twin: `--background`. */\n background: string;\n /** Cards, inputs and chips sitting on the background. Web twin: `--muted`. */\n surface: string;\n /** A pressed/hovered row. Web twin: `bg-muted/50`. */\n surfacePressed: string;\n /** Primary text. Web twin: `--foreground`. */\n text: string;\n /** Secondary text. Web twin: `--muted-foreground`. */\n textMuted: string;\n /** Tertiary text (timestamps, hints). Web twin: `--muted-foreground/70`. */\n textFaint: string;\n /** Hairlines. Web twin: `--border`. */\n border: string;\n /** The accent. Web twin: `--primary`. */\n primary: string;\n /** Text ON the accent. Web twin: `--primary-foreground`. */\n primaryForeground: string;\n /** A tinted accent surface (active tab, badges). Web twin: `bg-primary/10`. */\n primarySoft: string;\n /** The favourite star. Web twin: `--matrx-agent-favorite`. */\n favorite: string;\n /** The drift banner. Web twins: `--matrx-agent-drift-{bg,fg,border}`. */\n driftBackground: string;\n driftForeground: string;\n driftBorder: string;\n}\n\nexport interface AgentCatalogNativeTheme {\n colors: AgentCatalogNativeColors;\n /** Corner radii, in points. */\n radius: { sm: number; md: number; lg: number };\n /** The one spacing scale the picker uses, in points. */\n spacing: { xs: number; sm: number; md: number; lg: number };\n /** Font sizes, in points. The web picker's 10/11/12/13px ladder. */\n fontSize: { xs: number; sm: number; md: number; lg: number };\n}\n\n/**\n * The DEFAULT theme, mirroring `catalog/styles.css` plus the dark palette the\n * web picker inherits from the design system. Dark by default is deliberate:\n * it is what every Matrx mobile surface renders, and a light host overrides\n * `theme` rather than fighting a half-applied palette.\n */\nexport const DEFAULT_AGENT_CATALOG_NATIVE_THEME: AgentCatalogNativeTheme = {\n colors: {\n background: \"#0b0b0f\",\n surface: \"#17171d\",\n surfacePressed: \"#22222b\",\n text: \"#f5f5f7\",\n textMuted: \"#9b9ba5\",\n textFaint: \"#6e6e78\",\n border: \"#2a2a33\",\n primary: \"#3b82f6\",\n primaryForeground: \"#ffffff\",\n primarySoft: \"#1c2a44\",\n // The web sheet's dark value for --matrx-agent-favorite.\n favorite: \"#fbbf24\",\n driftBackground: \"#451a03\",\n driftForeground: \"#fcd34d\",\n driftBorder: \"#78350f\",\n },\n radius: { sm: 4, md: 8, lg: 12 },\n spacing: { xs: 4, sm: 8, md: 12, lg: 16 },\n fontSize: { xs: 10, sm: 11, md: 13, lg: 15 },\n};\n\n/**\n * The light default, offered so a light host is one prop away rather than a\n * fifteen-value object away. Values mirror `catalog/styles.css`'s `:root`.\n */\nexport const LIGHT_AGENT_CATALOG_NATIVE_THEME: AgentCatalogNativeTheme = {\n ...DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n colors: {\n background: \"#ffffff\",\n surface: \"#f4f4f6\",\n surfacePressed: \"#e9e9ee\",\n text: \"#0b0b0f\",\n textMuted: \"#61616b\",\n textFaint: \"#8c8c96\",\n border: \"#e2e2e8\",\n primary: \"#2563eb\",\n primaryForeground: \"#ffffff\",\n primarySoft: \"#e5edfd\",\n favorite: \"#f59e0b\",\n driftBackground: \"#fef3c7\",\n driftForeground: \"#92400e\",\n driftBorder: \"#fcd34d\",\n },\n};\n\n/** A host may override any subset; everything it omits keeps its default. */\nexport type AgentCatalogNativeThemeOverride = {\n colors?: Partial<AgentCatalogNativeColors>;\n radius?: Partial<AgentCatalogNativeTheme[\"radius\"]>;\n spacing?: Partial<AgentCatalogNativeTheme[\"spacing\"]>;\n fontSize?: Partial<AgentCatalogNativeTheme[\"fontSize\"]>;\n};\n\n/** Merge a host override onto a base theme. Pure; never mutates either. */\nexport function resolveAgentCatalogNativeTheme(\n override?: AgentCatalogNativeThemeOverride,\n base: AgentCatalogNativeTheme = DEFAULT_AGENT_CATALOG_NATIVE_THEME,\n): AgentCatalogNativeTheme {\n if (!override) return base;\n return {\n colors: { ...base.colors, ...(override.colors ?? {}) },\n radius: { ...base.radius, ...(override.radius ?? {}) },\n spacing: { ...base.spacing, ...(override.spacing ?? {}) },\n fontSize: { ...base.fontSize, ...(override.fontSize ?? {}) },\n };\n}\n","/**\n * catalog/native/AgentListSheet.tsx — THE agent picker for React Native.\n *\n * The BODY of a bottom sheet, not the sheet itself: a host keeps whatever\n * sheet chrome it already has (`@gorhom/bottom-sheet`, a modal, a drawer) and\n * drops this inside. Owning the chrome would force one gesture library on\n * every Matrx app; owning the CONTENT is the point — every client renders the\n * same rows in the same order with the same tabs and the same filters.\n */\n\nimport { StyleSheet, Text, View } from \"react-native\";\n\nimport { AgentPickerBody, type AgentPickerProps } from \"./AgentPickerBody\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\n\nexport interface AgentListSheetProps extends AgentPickerProps {\n /**\n * Heading above the picker. Omit it when the host's sheet chrome already\n * prints one — two titles is worse than none.\n */\n title?: string;\n}\n\nexport function AgentListSheet({ title, ...props }: AgentListSheetProps) {\n const theme = useAgentCatalogNativeTheme();\n return (\n <View style={[styles.sheet, { backgroundColor: theme.colors.background }]}>\n {title ? (\n <Text\n accessibilityRole=\"header\"\n style={{\n color: theme.colors.text,\n fontSize: theme.fontSize.lg + 3,\n fontWeight: \"700\",\n paddingHorizontal: theme.spacing.md,\n paddingTop: theme.spacing.sm,\n paddingBottom: theme.spacing.sm,\n }}\n >\n {title}\n </Text>\n ) : null}\n <AgentPickerBody {...props} />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n sheet: { flex: 1, minHeight: 0 },\n});\n","/**\n * catalog/native/AgentPickerBody.tsx — the ONE native picker body.\n *\n * `AgentListSheet` and `AgentListInlinePicker` are both thin shells over this\n * file, exactly as `AgentListDropdown` and `AgentListInlinePicker` are both\n * thin shells over `useAgentListCore` + `AgentListContent` on the web. The\n * three-view stack (list → detail peek → sort/categories/tags sub-view) is the\n * mobile shape the web `AgentListInlinePicker` already used.\n *\n * The prop surface below is the web shells' prop surface, name for name.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { StyleSheet, View } from \"react-native\";\n\nimport { useAgentListCore } from \"../shared/useAgentListCore\";\nimport type { AgentSummary, AgentTab } from \"../types\";\nimport { AgentDetailCard } from \"./AgentDetailCard\";\nimport { AgentListContent } from \"./AgentListContent\";\nimport { AgentSubView, type AgentSubViewName } from \"./AgentSubView\";\n\nexport interface AgentPickerProps {\n /** Unique consumer id for filter/tab state (see `useAgentConsumer`). */\n consumerId: string;\n /** THE ONLY CONTRACT BACK TO THE HOST (ruling D1). */\n onSelect: (agentId: string) => void;\n activeAgentId?: string | null;\n /** Focus the search field on mount. Default false on native — a keyboard\n * that opens with the sheet covers the list it was meant to filter. */\n autoFocusSearch?: boolean;\n /** Tab to open on. Admin surfaces that manage system agents pass `\"system\"`. */\n initialTab?: AgentTab;\n /** ADMIN variant: blend system agents into the \"All\" tab. */\n includeSystemInAll?: boolean;\n /** Restrict which ownership tabs this call site may reach. Enforced, not decorated. */\n visibleTabs?: readonly AgentTab[];\n /** Label override for the builtin-agent tab. Admin surfaces use \"System\". */\n systemTabLabel?: string;\n /** Show the host's active agent above the filtered list. Default true. */\n showPinnedAgent?: boolean;\n /** Hide records that are invalid for this call site. */\n excludeAgentIds?: readonly string[];\n /** Offer the mandate's live-resolved default agent at the top of the list. */\n defaultMandateKey?: string;\n /** Compact spacing for a short sheet. */\n compact?: boolean;\n /** Called after a selection, so a sheet shell can close itself. */\n onAfterSelect?: () => void;\n}\n\nexport function AgentPickerBody({\n consumerId,\n onSelect,\n activeAgentId = null,\n autoFocusSearch = false,\n initialTab,\n includeSystemInAll = false,\n visibleTabs,\n systemTabLabel,\n showPinnedAgent = true,\n excludeAgentIds,\n defaultMandateKey,\n compact = false,\n onAfterSelect,\n}: AgentPickerProps) {\n const [detailAgent, setDetailAgent] = useState<AgentSummary | null>(null);\n const [subView, setSubView] = useState<AgentSubViewName | null>(null);\n const [panelSearch, setPanelSearch] = useState(\"\");\n\n const {\n agents,\n archivedHiddenCount,\n isLoading,\n allCategories,\n allTags,\n consumer,\n tabCounts,\n activeFilterCount,\n pinnedAgent,\n defaultRow,\n ensureLoaded,\n handleSelectAgent: coreSelectAgent,\n } = useAgentListCore({\n consumerId,\n onSelect,\n activeAgentIdOverride: activeAgentId,\n ...(initialTab ? { initialTab } : {}),\n includeSystemInAll,\n // The restriction has to reach the CORE, not just the tab strip.\n ...(visibleTabs ? { visibleTabs } : {}),\n ...(excludeAgentIds ? { excludeAgentIds } : {}),\n ...(defaultMandateKey ? { defaultMandateKey } : {}),\n });\n\n useEffect(() => {\n ensureLoaded();\n }, [ensureLoaded]);\n\n const selectAgent = (agent: AgentSummary) => {\n coreSelectAgent(agent);\n setDetailAgent(null);\n setSubView(null);\n onAfterSelect?.();\n };\n\n if (detailAgent) {\n return (\n <View style={styles.fill}>\n <AgentDetailCard\n agent={detailAgent}\n onSelect={() => selectAgent(detailAgent)}\n />\n </View>\n );\n }\n\n if (subView) {\n return (\n <View style={styles.fill}>\n <AgentSubView\n view={subView}\n consumer={consumer}\n allCategories={allCategories}\n allTags={allTags}\n search={panelSearch}\n setSearch={setPanelSearch}\n onBack={() => {\n setSubView(null);\n setPanelSearch(\"\");\n }}\n />\n </View>\n );\n }\n\n return (\n <View style={[styles.fill, compact ? styles.compact : null]}>\n <AgentListContent\n agents={agents}\n isLoading={isLoading}\n consumer={consumer}\n activeAgentId={activeAgentId}\n allCategories={allCategories}\n allTags={allTags}\n onSelectAgent={selectAgent}\n onDetailPress={setDetailAgent}\n onFilterChipPress={setSubView}\n onReset={consumer.resetFilters}\n activeFilterCount={activeFilterCount}\n tabCounts={tabCounts}\n archivedHiddenCount={archivedHiddenCount}\n {...(visibleTabs ? { visibleTabs } : {})}\n {...(systemTabLabel ?? (includeSystemInAll ? \"System\" : undefined)\n ? {\n systemTabLabel:\n systemTabLabel ?? (includeSystemInAll ? \"System\" : undefined),\n }\n : {})}\n pinnedAgent={showPinnedAgent ? pinnedAgent : null}\n defaultRow={defaultRow}\n autoFocusSearch={autoFocusSearch}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1, minHeight: 0 },\n compact: { paddingTop: 0 },\n});\n","/**\n * catalog/shared/useAgentListCore.ts — VERBATIM port of matrx-frontend\n * `features/agents/components/agent-listings/useAgentListCore.ts`.\n *\n * Seams inverted:\n * - Redux (`useAppSelector`/`useAppDispatch`/`createSelector`) → the catalog\n * store and the plain memoized selectors in `../selectors`.\n * - `useRouter().push` → the `navigate` port (default `window.location.assign`).\n *\n * TWO BEHAVIOURAL DELTAS, recorded in the CHANGELOG rather than hidden:\n * 1. There is no app-wide \"active agent\" store in this package (that is host\n * state by ruling D1 — the picker's contract is `onSelect(agentId)`), so\n * the pinned row comes from the `activeAgentId` PROP alone. The\n * frontend's fallback to a Redux `activeAgentId` has no package twin.\n * 2. For the same reason, a call site that passes NEITHER `onSelect` NOR\n * `navigateTo` gets a loud `errorSink` report instead of the frontend's\n * `dispatch(setActiveAgentId(...))`. A click that does nothing silently\n * is the exact failure this package exists to stop.\n */\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { useAgentCatalog, useAgentCatalogRows, useAgentCatalogState, useAgentCatalogUiPorts } from \"./context\";\nimport { useAgentConsumer } from \"./useAgentConsumer\";\nimport { agentListFooterLabel, shouldDefaultAgentListToPublicTab } from \"../labels\";\nimport {\n makeSelectFilteredAgents,\n selectAllAgentCategories,\n selectAllAgentTags,\n selectAllSystemAgentCategories,\n selectAllSystemAgentTags,\n selectAgentTabCounts,\n} from \"../selectors\";\nimport type { AgentCatalogState } from \"../store\";\nimport type { DefaultRowState } from \"../default-row-types\";\nimport type { AgentArchFilter, AgentSummary, AgentTab } from \"../types\";\n\n/**\n * The four ownership counts a tab strip prints. Declared HERE, beside the code\n * that computes them, so both the web tab strip and the native one name the\n * same shape (0.9.0 — it used to live in the web-only `AgentListTabs`).\n *\n * 🚨 These are the numbers on the BADGES, and since 0.9.1 they count exactly\n * the rows the tab renders under the consumer's own archive filter. A badge\n * that counted rows the list hid was the screen telling the user something\n * untrue about her own agents.\n */\nexport interface AgentListTabCounts {\n mine: number;\n shared: number;\n all: number;\n system: number;\n}\n\nexport interface AgentListCoreOptions {\n consumerId: string;\n onSelect?: (agentId: string) => void;\n navigateTo?: string;\n /** Route-scoped agent id (chat/builder headers). `undefined` = nothing pinned. */\n activeAgentIdOverride?: string | null;\n /**\n * Tab this surface opens on, applied once on first mount. Admin surfaces\n * that manage system agents pass `\"system\"`. When omitted the normal\n * user heuristic applies (a user with no agents of their own lands on the\n * public/system catalogue).\n */\n initialTab?: AgentTab;\n /**\n * ADMIN reading of the \"All\" tab: blend system agents into it instead of\n * keeping them to their own tab. See `makeSelectFilteredAgents`.\n */\n includeSystemInAll?: boolean;\n /**\n * 🚨 THE OWNERSHIP TABS THIS CALL SITE MAY REACH — a HARD restriction, not a\n * default.\n *\n * `AgentListTabs` already hides the buttons this list omits, but hiding a\n * button never emptied the list behind it: the active tab lives in the\n * consumer's REMEMBERED state, and `initialTab` is applied exactly once per\n * mount (`defaultTabAppliedRef`). So a person who had been on \"Mine\" and\n * then moved a control that narrows the picker got the personal catalogue\n * with the tab bar removed — the forbidden list, and no way to see that it\n * was forbidden. That is the defect Arman named on the mandate binding\n * screen's global rung (VISION-RECONCILIATION D2, 2026-08-31: the picker\n * opened on \"Mine · 40\").\n *\n * Given here, the tab is COERCED into the allowed set on every change of it,\n * not just at mount — so a restriction that arrives later is enforced later.\n */\n visibleTabs?: readonly AgentTab[];\n /**\n * THE ARCHIVED-ITEMS LAW's per-consumer override of the catalog-wide\n * `defaults.archiveFilter` knob, applied once at first registration. Almost\n * nothing should pass it: the platform answer is \"hide archived\", and the\n * person reveals the archive from the control on the filter bar.\n */\n initialArchFilter?: AgentArchFilter;\n /** Hide records that are invalid for this call site. */\n excludeAgentIds?: readonly string[];\n /**\n * Show the platform DEFAULT agent for this mandate key at the top of the\n * list, resolved live through the server (never a hardcoded name). Requires\n * the catalog to have been built with a `transport`.\n */\n defaultMandateKey?: string;\n}\n\n/**\n * How long the hover-preview detail panel stays open after the cursor leaves\n * an agent row (or the panel itself) before it closes. Generous on purpose:\n * the panel renders to the side of the list, so the user needs ample time to\n * travel the cursor across the gap to reach it without it vanishing. Paired\n * with a reserved, non-resizing popover width so the target never moves.\n */\nexport const HOVER_GRACE_MS = 900;\n\n/**\n * THE RULE, ALONE AND TESTABLE: which tab a restricted picker must land on.\n *\n * Returns `null` when the current tab is already allowed (nothing to do), and\n * otherwise the tab to switch to — `initialTab` when that is itself allowed,\n * else the first allowed tab.\n */\nexport function coerceVisibleTab(\n current: AgentTab,\n allowed: readonly AgentTab[],\n initialTab?: AgentTab,\n): AgentTab | null {\n if (allowed.length === 0) return null;\n if (allowed.includes(current)) return null;\n return initialTab && allowed.includes(initialTab)\n ? initialTab\n : (allowed[0] ?? null);\n}\n\nconst EMPTY_EXCLUDES: readonly string[] = [];\n\nexport function useAgentListCore({\n consumerId,\n onSelect,\n navigateTo,\n activeAgentIdOverride,\n initialTab,\n includeSystemInAll = false,\n visibleTabs,\n initialArchFilter,\n excludeAgentIds = EMPTY_EXCLUDES,\n defaultMandateKey,\n}: AgentListCoreOptions) {\n const catalog = useAgentCatalog();\n const { navigate } = useAgentCatalogUiPorts();\n\n const hasFetchedRef = useRef(false);\n const [hoveredAgent, setHoveredAgent] = useState<AgentSummary | null>(null);\n const hoverLeaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const defaultTabAppliedRef = useRef(false);\n\n const consumer = useAgentConsumer(consumerId, {\n unregisterOnUnmount: true,\n ...(initialArchFilter ? { initialArchFilter } : {}),\n });\n const rows = useAgentCatalogRows();\n const userId = catalog.getUserIdOrNull();\n const tabCountsForFilter = selectAgentTabCounts(rows, consumer.state.archFilter);\n const ownedCount = tabCountsForFilter.mine;\n\n const selectFiltered = useMemo(\n () => makeSelectFilteredAgents(includeSystemInAll),\n [includeSystemInAll],\n );\n const filteredAgents = selectFiltered(rows, consumer.state);\n const excludedAgentIds = useMemo(\n () => new Set(excludeAgentIds),\n [excludeAgentIds],\n );\n const applyExcludes = useCallback(\n (list: AgentSummary[]): AgentSummary[] =>\n excludedAgentIds.size === 0\n ? list\n : list.filter((agent) => !excludedAgentIds.has(agent.id)),\n [excludedAgentIds],\n );\n const agents = applyExcludes(filteredAgents);\n\n // ── THE ARCHIVE PROBE — what the default state is keeping off the screen ──\n //\n // Clause 2 of THE ARCHIVED-ITEMS LAW: a footer counts what the list renders\n // and never implies the list is everything. So while archived rows are\n // hidden we also measure how many there ARE behind this exact tab, search,\n // category and tag selection — the same pipeline, one value changed — and\n // the footer says so. A second memoized selector instance keeps this off\n // the main one's memo slot, so the two never evict each other.\n const selectArchivedProbe = useMemo(\n () => makeSelectFilteredAgents(includeSystemInAll),\n [includeSystemInAll],\n );\n const archiveProbeState = useMemo(\n () => ({ ...consumer.state, archFilter: \"archived\" as const }),\n [consumer.state],\n );\n const archivedHiddenCount =\n consumer.archFilter === \"active\"\n ? applyExcludes(selectArchivedProbe(rows, archiveProbeState)).length\n : 0;\n\n const status = useAgentCatalogState(selectStatus);\n // `null` is an intentional \"nothing selected\" value for assignment\n // dropdowns. There is no app-wide active agent in this package (D1) — the\n // pinned row is whatever the host passes and nothing else.\n const activeAgentId = activeAgentIdOverride ?? null;\n const pinnedAgent = activeAgentId ? catalog.getAgent(activeAgentId) : undefined;\n\n // Category/tag options follow the ACTIVE TAB's population: user agents on\n // mine/shared/all, builtins on system. Same controls either way.\n const onSystemTab = consumer.tab === \"system\";\n const allCategories = onSystemTab\n ? selectAllSystemAgentCategories(rows)\n : selectAllAgentCategories(rows);\n const allTags = onSystemTab\n ? selectAllSystemAgentTags(rows)\n : selectAllAgentTags(rows);\n\n const tabCounts: AgentListTabCounts = tabCountsForFilter;\n\n const isLoading = status === \"loading\";\n const agentsLoaded = status === \"succeeded\" || status === \"failed\";\n\n const ensureLoaded = useCallback(() => {\n if (!hasFetchedRef.current) {\n hasFetchedRef.current = true;\n void catalog.ensureLoaded().catch(() => {\n // Already reported through the errorSink and reflected in `status`;\n // this catch only stops an unhandled rejection.\n });\n }\n }, [catalog]);\n\n // ── The mandate default row ─────────────────────────────────────────────\n const selectDefaultRow = useCallback(\n (state: AgentCatalogState): DefaultRowState | undefined =>\n defaultMandateKey ? state.defaultRows[defaultMandateKey] : undefined,\n [defaultMandateKey],\n );\n const defaultRow = useAgentCatalogState(selectDefaultRow);\n useEffect(() => {\n if (!defaultMandateKey) return;\n catalog.ensureDefaultRow(defaultMandateKey);\n }, [catalog, defaultMandateKey]);\n\n useEffect(() => {\n if (defaultTabAppliedRef.current) return;\n\n // An explicit surface default wins over the heuristic below, but only\n // once — after that the tab belongs to the user.\n if (initialTab) {\n defaultTabAppliedRef.current = true;\n if (consumer.tab !== initialTab) consumer.setTab(initialTab);\n return;\n }\n\n if (consumer.tab !== \"mine\") {\n defaultTabAppliedRef.current = true;\n return;\n }\n\n const wantsPublic = shouldDefaultAgentListToPublicTab({\n userId,\n ownedCount,\n agentsLoaded,\n });\n\n if (!wantsPublic) {\n if (!userId || agentsLoaded) {\n defaultTabAppliedRef.current = true;\n }\n return;\n }\n\n consumer.setTab(\"system\");\n defaultTabAppliedRef.current = true;\n }, [\n userId,\n ownedCount,\n agentsLoaded,\n initialTab,\n consumer.tab,\n consumer.setTab,\n ]);\n\n // 🚨 THE RESTRICTION IS ENFORCED, NOT DECORATED. A hidden tab whose rows are\n // still the ones being listed is worse than an offered one: the person sees a\n // catalogue this call site forbids and no control that explains why. The tab\n // is therefore coerced into the allowed set whenever it falls outside it —\n // including long after mount, when a control elsewhere on the page narrows\n // what this picker may reach. Keyed by the joined list so an inline array\n // literal does not re-fire this every render.\n const allowedTabsKey = visibleTabs ? visibleTabs.join(\",\") : \"\";\n useEffect(() => {\n if (!allowedTabsKey) return;\n const next = coerceVisibleTab(\n consumer.tab,\n allowedTabsKey.split(\",\") as AgentTab[],\n initialTab,\n );\n if (next) consumer.setTab(next);\n }, [allowedTabsKey, initialTab, consumer.tab, consumer.setTab]);\n\n useEffect(() => {\n ensureLoaded();\n }, [ensureLoaded]);\n\n const handleSelectAgent = useCallback(\n (agent: AgentSummary) => {\n if (onSelect) {\n onSelect(agent.id);\n } else if (navigateTo) {\n navigate(navigateTo.replace(\"{id}\", agent.id));\n } else {\n // Never a silent no-op — see the file header's delta 2.\n catalog.errorSink({\n code: \"select_has_nowhere_to_go\",\n message:\n \"an agent was chosen but this picker was given neither onSelect \" +\n \"nor navigateTo, so the choice went nowhere.\",\n context: { consumerId, agentId: agent.id },\n });\n }\n },\n [onSelect, navigateTo, navigate, catalog, consumerId],\n );\n\n const activeFilterCount =\n (consumer.sortBy !== \"updated-desc\" ? 1 : 0) +\n (consumer.includedCats.length > 0 ? 1 : 0) +\n (consumer.includedTags.length > 0 ? 1 : 0) +\n (consumer.favFilter !== \"all\" ? 1 : 0) +\n // The archive filter counts like every other filter, so a list showing\n // archived rows offers the reset control that puts them away again.\n (consumer.archFilter !== consumer.archFilterDefault ? 1 : 0);\n\n const handleAgentHover = useCallback(\n (agent: AgentSummary, panelOpen: boolean) => {\n if (panelOpen) return;\n if (hoverLeaveTimerRef.current) {\n clearTimeout(hoverLeaveTimerRef.current);\n hoverLeaveTimerRef.current = null;\n }\n setHoveredAgent(agent);\n },\n [],\n );\n\n const handleAgentHoverEnd = useCallback(\n (agent: AgentSummary, onClear: () => void) => {\n if (hoveredAgent?.id === agent.id) {\n hoverLeaveTimerRef.current = setTimeout(() => {\n setHoveredAgent(null);\n onClear();\n }, HOVER_GRACE_MS);\n }\n },\n [hoveredAgent],\n );\n\n const handleDetailPanelMouseEnter = useCallback(() => {\n if (hoverLeaveTimerRef.current) {\n clearTimeout(hoverLeaveTimerRef.current);\n hoverLeaveTimerRef.current = null;\n }\n }, []);\n\n const handleDetailPanelMouseLeave = useCallback((onClear: () => void) => {\n hoverLeaveTimerRef.current = setTimeout(() => {\n setHoveredAgent(null);\n onClear();\n }, HOVER_GRACE_MS);\n }, []);\n\n useEffect(\n () => () => {\n if (hoverLeaveTimerRef.current) clearTimeout(hoverLeaveTimerRef.current);\n },\n [],\n );\n\n /**\n * The footer's words, computed once from the numbers the list actually\n * rendered — identical on web and native because neither shell formats it\n * itself. See `agentListFooterLabel`.\n */\n const footerLabel = agentListFooterLabel({\n count: agents.length,\n archFilter: consumer.archFilter,\n archivedHiddenCount,\n });\n\n return {\n agents,\n archivedHiddenCount,\n footerLabel,\n isLoading,\n activeAgentId,\n pinnedAgent: pinnedAgent ?? null,\n defaultRow: defaultRow ?? null,\n allCategories,\n allTags,\n consumer,\n tabCounts,\n activeFilterCount,\n hoveredAgent,\n setHoveredAgent,\n ensureLoaded,\n handleSelectAgent,\n handleAgentHover,\n handleAgentHoverEnd,\n handleDetailPanelMouseEnter,\n handleDetailPanelMouseLeave,\n };\n}\n\nconst selectStatus = (state: AgentCatalogState) => state.status;\n","/**\n * catalog/shared/useAgentConsumer.ts — VERBATIM port of matrx-frontend\n * `features/agents/hooks/useAgentConsumer.ts`.\n *\n * Wraps a single consumer slot identified by `consumerId`. Registers the slot\n * on mount, optionally unregisters on unmount, and returns every filter/sort/\n * pagination value plus stable write helpers.\n *\n * Two seams inverted, nothing else:\n * - `useAppSelector`/`useAppDispatch` → `useAgentCatalog()` + the store's\n * own methods.\n * - `useServerAgentSearch` (a separate frontend hook) is folded IN, because\n * it was already wired here and nowhere else: EVERY agent surface that\n * uses a consumer searches the full server-side set. A local-only search\n * over a paginated list reports \"no results\" for agents that were merely\n * never fetched — a wrong answer, not a missing feature.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useAgentCatalog, useAgentCatalogState } from \"./context\";\nimport type {\n AgentAccessFilter,\n AgentArchFilter,\n AgentFavFilter,\n AgentSortOption,\n AgentTab,\n AgentConsumerPatch,\n AgentConsumerState,\n} from \"../types\";\nimport type { AgentCatalogState } from \"../store\";\n\nconst DEBOUNCE_MS = 250;\n\n/** Below this length a query matches too much to be worth a round trip. */\nconst MIN_QUERY_LENGTH = 2;\n\nexport interface UseAgentConsumerReturn {\n // ── Read ────────────────────────────────────────────────────────────────\n tab: AgentTab;\n sortBy: AgentSortOption;\n searchTerm: string;\n includedCats: string[];\n includedTags: string[];\n favFilter: AgentFavFilter;\n archFilter: AgentArchFilter;\n /**\n * The archive-filter state this catalog starts consumers in — the platform\n * default `\"active\"` unless the host set the knob. What \"not the default\n * state\" means on this surface, so the control and the footer can both say\n * it honestly.\n */\n archFilterDefault: AgentArchFilter;\n accessFilter: AgentAccessFilter;\n favoritesFirst: boolean;\n listPage: number;\n sharedPage: number;\n\n /** The whole slot, for the selectors that take a consumer state. */\n state: AgentConsumerState;\n\n /** True if any filter differs from its default value. */\n hasActiveFilters: boolean;\n\n /** Tier 2 search — also match against agent prompt content. */\n deepSearch: boolean;\n\n /** True while a server-side search is in flight. */\n isServerSearching: boolean;\n\n // ── Write ───────────────────────────────────────────────────────────────\n setSearchTerm: (value: string) => void;\n setDeepSearch: (value: boolean) => void;\n setSortBy: (value: AgentSortOption) => void;\n setTab: (value: AgentTab) => void;\n setFavFilter: (value: AgentFavFilter) => void;\n setArchFilter: (value: AgentArchFilter) => void;\n setAccessFilter: (value: AgentAccessFilter) => void;\n\n /** Add category to inclusion set; if already present, remove (toggle). */\n toggleCategory: (cat: string) => void;\n /** Add tag to inclusion set; if already present, remove (toggle). */\n toggleTag: (tag: string) => void;\n\n /**\n * Replace the WHOLE category inclusion set in one write.\n *\n * Prefer this over looping `toggleCategory` whenever more than one value\n * changes. Each `toggleCategory` call computes its next array from the\n * `includedCats` captured in the CURRENT render, so two toggles fired in the\n * same tick both start from the same snapshot and the second one's patch\n * overwrites the first — a \"Clear filter\" click with three categories active\n * removes only one. One write of the final set cannot drift that way.\n */\n setIncludedCats: (next: string[]) => void;\n /** Replace the WHOLE tag inclusion set in one write. See setIncludedCats. */\n setIncludedTags: (next: string[]) => void;\n\n toggleFavoritesFirst: () => void;\n\n loadMoreList: () => void;\n loadMoreShared: () => void;\n\n resetFilters: () => void;\n}\n\nexport function useAgentConsumer(\n consumerId: string,\n options?: {\n /** Delete the slot on unmount. Default false — persistent consumers keep state. */\n unregisterOnUnmount?: boolean;\n /** Applied only when the consumer is first registered (idempotent). */\n initialTab?: AgentTab;\n /**\n * THE ARCHIVED-ITEMS LAW's per-consumer override of the catalog-wide\n * `defaults.archiveFilter` knob. Applied only at first registration — the\n * state belongs to the person after that.\n */\n initialArchFilter?: AgentArchFilter;\n },\n): UseAgentConsumerReturn {\n const catalog = useAgentCatalog();\n const defaults = catalog.consumerDefaults;\n const selectConsumer = useCallback(\n (state: AgentCatalogState): AgentConsumerState =>\n state.consumers[consumerId] ?? defaults,\n [consumerId, defaults],\n );\n const consumer = useAgentCatalogState(selectConsumer);\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n const opts = optionsRef.current;\n const initial: AgentConsumerPatch = {\n ...(opts?.initialTab ? { tab: opts.initialTab } : {}),\n ...(opts?.initialArchFilter\n ? { archFilter: opts.initialArchFilter }\n : {}),\n };\n catalog.registerConsumer(\n consumerId,\n Object.keys(initial).length > 0 ? initial : undefined,\n );\n return () => {\n if (optionsRef.current?.unregisterOnUnmount) {\n catalog.unregisterConsumer(consumerId);\n }\n };\n }, [consumerId, catalog]);\n\n // ── Write helpers (stable references) ───────────────────────────────────\n\n const setSearchTerm = useCallback(\n (value: string) => catalog.setConsumerFilter(consumerId, { searchTerm: value }),\n [consumerId, catalog],\n );\n const setDeepSearch = useCallback(\n (value: boolean) => catalog.setConsumerFilter(consumerId, { deepSearch: value }),\n [consumerId, catalog],\n );\n const setSortBy = useCallback(\n (value: AgentSortOption) =>\n catalog.setConsumerFilter(consumerId, { sortBy: value }),\n [consumerId, catalog],\n );\n const setTab = useCallback(\n (value: AgentTab) => catalog.setConsumerFilter(consumerId, { tab: value }),\n [consumerId, catalog],\n );\n const setFavFilter = useCallback(\n (value: AgentFavFilter) =>\n catalog.setConsumerFilter(consumerId, { favFilter: value }),\n [consumerId, catalog],\n );\n const setArchFilter = useCallback(\n (value: AgentArchFilter) =>\n catalog.setConsumerFilter(consumerId, { archFilter: value }),\n [consumerId, catalog],\n );\n const setAccessFilter = useCallback(\n (value: AgentAccessFilter) =>\n catalog.setConsumerFilter(consumerId, { accessFilter: value }),\n [consumerId, catalog],\n );\n\n const toggleCategory = useCallback(\n (cat: string) => {\n const current = catalog.getConsumer(consumerId).includedCats;\n const next = current.includes(cat)\n ? current.filter((c) => c !== cat)\n : [...current, cat];\n catalog.setConsumerFilter(consumerId, { includedCats: next });\n },\n [consumerId, catalog],\n );\n\n const toggleTag = useCallback(\n (tag: string) => {\n const current = catalog.getConsumer(consumerId).includedTags;\n const next = current.includes(tag)\n ? current.filter((t) => t !== tag)\n : [...current, tag];\n catalog.setConsumerFilter(consumerId, { includedTags: next });\n },\n [consumerId, catalog],\n );\n\n const setIncludedCats = useCallback(\n (next: string[]) => catalog.setConsumerFilter(consumerId, { includedCats: next }),\n [consumerId, catalog],\n );\n const setIncludedTags = useCallback(\n (next: string[]) => catalog.setConsumerFilter(consumerId, { includedTags: next }),\n [consumerId, catalog],\n );\n\n const toggleFavoritesFirst = useCallback(\n () =>\n catalog.setConsumerFilter(consumerId, {\n favoritesFirst: !catalog.getConsumer(consumerId).favoritesFirst,\n }),\n [consumerId, catalog],\n );\n\n const loadMoreList = useCallback(\n () =>\n catalog.setConsumerPage(\n consumerId,\n \"list\",\n catalog.getConsumer(consumerId).listPage + 1,\n ),\n [consumerId, catalog],\n );\n const loadMoreShared = useCallback(\n () =>\n catalog.setConsumerPage(\n consumerId,\n \"shared\",\n catalog.getConsumer(consumerId).sharedPage + 1,\n ),\n [consumerId, catalog],\n );\n\n const resetFilters = useCallback(\n () => catalog.resetConsumerFilters(consumerId),\n [consumerId, catalog],\n );\n\n // ── Server-side search (folded in — see the file header) ────────────────\n //\n // Debounced, and stale responses are ignored so a slow reply for an old\n // query can never land after a newer one. Purely additive: local matches\n // keep rendering the whole time; server results merge in and simply appear.\n\n const [isSearching, setIsSearching] = useState(false);\n const [matchedIds, setMatchedIds] = useState<string[] | null>(null);\n const requestSeq = useRef(0);\n const query = consumer.searchTerm;\n const deep = consumer.deepSearch;\n\n useEffect(() => {\n const q = query.trim();\n if (q.length < MIN_QUERY_LENGTH) {\n setIsSearching(false);\n setMatchedIds(null);\n return undefined;\n }\n\n const seq = ++requestSeq.current;\n setIsSearching(true);\n\n const timer = setTimeout(() => {\n void catalog\n .searchServer(q, deep)\n .then((ids) => {\n if (seq !== requestSeq.current) return; // superseded\n setMatchedIds(ids);\n setIsSearching(false);\n })\n .catch((e: unknown) => {\n if (seq !== requestSeq.current) return; // superseded\n // Loud, but never destructive: local results stay on screen.\n catalog.errorSink({\n code: \"server_search_failed\",\n message: `agent search failed: ${e instanceof Error ? e.message : String(e)}`,\n context: { query: q, deep },\n });\n setIsSearching(false);\n });\n }, DEBOUNCE_MS);\n\n return () => clearTimeout(timer);\n }, [query, deep, catalog]);\n\n useEffect(() => {\n catalog.setConsumerServerSearch(consumerId, {\n matchedIds: matchedIds ?? [],\n isSearching,\n });\n }, [consumerId, catalog, matchedIds, isSearching]);\n\n // ── hasActiveFilters (verbatim) ─────────────────────────────────────────\n const hasActiveFilters =\n consumer.searchTerm !== \"\" ||\n consumer.includedCats.length > 0 ||\n consumer.includedTags.length > 0 ||\n consumer.favFilter !== \"all\" ||\n // The archive filter is compared to THIS CATALOG'S default, not to the\n // hardcoded platform one: a host that legitimately defaults to \"show all\"\n // must not have the reset control permanently lit.\n consumer.archFilter !== defaults.archFilter ||\n consumer.accessFilter !== \"any\" ||\n !consumer.favoritesFirst;\n\n return {\n tab: consumer.tab,\n sortBy: consumer.sortBy,\n searchTerm: consumer.searchTerm,\n includedCats: consumer.includedCats,\n includedTags: consumer.includedTags,\n favFilter: consumer.favFilter,\n archFilter: consumer.archFilter,\n archFilterDefault: defaults.archFilter,\n accessFilter: consumer.accessFilter,\n favoritesFirst: consumer.favoritesFirst,\n listPage: consumer.listPage,\n sharedPage: consumer.sharedPage,\n state: consumer,\n hasActiveFilters,\n deepSearch: consumer.deepSearch,\n isServerSearching: consumer.isServerSearching,\n setSearchTerm,\n setDeepSearch,\n setSortBy,\n setTab,\n setFavFilter,\n setArchFilter,\n setAccessFilter,\n toggleCategory,\n toggleTag,\n setIncludedCats,\n setIncludedTags,\n toggleFavoritesFirst,\n loadMoreList,\n loadMoreShared,\n resetFilters,\n };\n}\n","/**\n * `@ai-matrx/agents/catalog` — the row shape and the per-consumer view state.\n *\n * `AgentSummary` is the 19-column row `agx_get_list_full()` returns, camelCased.\n * It is deliberately NOT the editable agent record: dirty tracking, undo,\n * messages, tools and `_fetchStatus` stay in whichever host owns the editor.\n * A list row is a list row.\n *\n * The view-state types are a VERBATIM port of matrx-frontend\n * `features/agents/redux/agent-consumers/slice.ts` — only the coupling seam\n * inverts (Redux reducers become store actions in `./store`).\n */\n\n/**\n * A branded agent id. Every id that reaches `onSelect` is one of these:\n * either a `agent.definition` UUID, or the `mandate:<key>` reference a\n * default row carries (byte-identical to the ref shape matrx-extend\n * `src/lib/mandates.ts` and matrx-local `desktop/src/lib/mandates.ts`\n * already hand back to their hosts).\n *\n * 🚨 The brand is a STRING LITERAL, never `unique symbol`. This package emits\n * `./catalog` and `./catalog/react` as two separate bundles, so each `.d.ts`\n * carries its own copy of these declarations. A `unique symbol` brand is\n * NOMINAL: two copies of it are unrelated types, so `createAgentCatalog()`\n * from `./catalog` was not assignable to `<AgentCatalogProvider catalog=…>`\n * from `./catalog/react` — the exact two-import wiring the README, the\n * CHANGELOG and every consumer use. A literal brand is structural, so the two\n * copies unify, while a bare `string` still cannot be passed where an\n * `AgentId` is required (which is the whole point of branding). Any future\n * brand in this package follows the same rule.\n */\nexport type AgentId = string & { readonly __agentId: \"ai-matrx.agent-id\" };\n\n/** Brand a raw string as an `AgentId`. */\nexport function asAgentId(value: string): AgentId {\n return value as AgentId;\n}\n\n/** The `mandate:<key>` ref shape every client already speaks. */\nexport function mandateAgentId(mandateKey: string): AgentId {\n return `mandate:${mandateKey}` as AgentId;\n}\n\n/** True when an id is a mandate default row rather than a stored agent. */\nexport function isMandateAgentId(id: string): boolean {\n return id.startsWith(\"mandate:\");\n}\n\n/** `agent_type` verbatim. Only `builtin` changes how a row is grouped. */\nexport type AgentCatalogAgentType = \"user\" | \"builtin\";\n\n/**\n * `access_level` verbatim from `agx_get_list_full`. Widened over the raw\n * string because it is a DB-owned vocabulary: an unknown level renders as\n * itself rather than being coerced into a wrong one.\n */\nexport type AgentAccessLevel =\n | \"owner\"\n | \"admin\"\n | \"editor\"\n | \"viewer\"\n | \"system\"\n | (string & {});\n\n/**\n * Present on a catalog row ONLY when that agent is an **Orchestra** — a\n * conductor that delegates to member agents at run time. Choosing one for a\n * step, a chat or a workflow node runs the whole ensemble, so a person has to\n * be able to SEE that before choosing, not discover it from the run.\n *\n * The DB decides. `agx_get_list_full` / `agx_get_list` / `agx_search` build\n * this from `platform.associations` (the conductor self-edge plus its member\n * edges) in one `agx_orchestra_badges()` join — never a second fetch, and\n * never a per-row read. `null` for every ordinary agent.\n *\n * History: the badge lived only in the Python `GET /agents` route, so every\n * client lost it when the pickers moved to the RPC. It is a ROW FIELD now, in\n * the one read every client shares.\n */\nexport interface OrchestraBadge {\n /** How the ensemble runs: `supervisor` | `sequential` | `parallel` | `dag`, or a future mode verbatim. */\n mode: string;\n /** The composition's one-line description, when its author wrote one. */\n tagline: string | null;\n /**\n * The per-composition delegation-depth budget AS DECLARED, or `null` when\n * the composition declares none. Deliberately NOT defaulted here: the\n * platform's fallback ceiling is enforced by the server that runs the\n * ensemble, and a badge that invented a number would be reporting a promise\n * nobody made.\n */\n depthBudget: number | null;\n /** Member edges. From the ROW count, so an unlabelled ensemble still counts. */\n memberCount: number;\n /** Only REAL role titles — an ensemble with unlabelled edges yields `[]`. */\n memberTitles: string[];\n}\n\n/**\n * One `agx_get_list_full()` row, camelCased. Nineteen columns, no more:\n * anything richer needs a different read and is a different type.\n */\nexport interface AgentSummary {\n id: AgentId;\n name: string | null;\n description: string | null;\n category: string | null;\n tags: string[];\n agentType: AgentCatalogAgentType;\n modelId: string | null;\n /**\n * The agent's CLASS pin (`settings.offering_id` — which serving class of\n * the model runs, e.g. \"Matrx Lightning\"). `null` = no pin (the model's\n * preferred class runs). ABSENT = the read did not carry the column, so the\n * class is unknown and a display must name the model alone.\n */\n offeringId?: string | null;\n isActive: boolean;\n isArchived: boolean;\n isFavorite: boolean;\n createdBy: string | null;\n organizationId: string | null;\n taskId: string | null;\n sourceAgentId: string | null;\n createdAt: string | null;\n updatedAt: string | null;\n // Access metadata\n isOwner: boolean | null;\n accessLevel: AgentAccessLevel | null;\n sharedByEmail: string | null;\n /**\n * The Orchestra badge, or `null` for an ordinary agent. Strict: every row\n * carries the key, so a surface reads `agent.orchestra` and never has to ask\n * whether the column existed.\n */\n orchestra: OrchestraBadge | null;\n /**\n * Set only on a mandate default row — the key it resolved through, so a\n * host can tell \"the default\" from a stored agent without parsing the id.\n */\n mandateKey?: string;\n}\n\n// ── Per-consumer view state (verbatim port of the agent-consumers slice) ─────\n\nexport type AgentSortOption =\n | \"updated-desc\"\n | \"created-desc\"\n | \"name-asc\"\n | \"name-desc\"\n | \"category-asc\";\n\n/**\n * The sort choices a picker offers, in order. PURE DATA, so it lives in the\n * pure entry: a server-reachable manifest reads it at module scope, and\n * importing it from the client-stamped `./catalog/react` bundle dragged React\n * into a server graph for the sake of five string pairs. `./catalog/react`\n * re-exports it unchanged, so no consumer has to move.\n *\n * (Written \"client-stamped\", never with the literal directive: this comment is\n * emitted into `dist/catalog/index.d.ts`, and the tarball canary rightly\n * refuses that directive anywhere in a PURE entry.)\n */\nexport const SORT_OPTIONS: { value: AgentSortOption; label: string }[] = [\n { value: \"updated-desc\", label: \"Recent\" },\n { value: \"created-desc\", label: \"Created\" },\n { value: \"name-asc\", label: \"A → Z\" },\n { value: \"name-desc\", label: \"Z → A\" },\n { value: \"category-asc\", label: \"Category\" },\n];\n\n/** Which ownership tab is active in the agent list. */\nexport type AgentTab = \"mine\" | \"shared\" | \"all\" | \"system\";\n\n/** Favorite filter. */\nexport type AgentFavFilter = \"all\" | \"yes\" | \"no\";\n\n/**\n * The archive filter — THE ARCHIVED-ITEMS LAW's ONE control, in this\n * package's existing vocabulary.\n *\n * > \"everything should have an archive filter, and the default should always\n * > hide archived, but seeing archived items should be one or two clicks\n * > away.\" — Arman, 2026-09-09 (`common-docs/policies/archived-items.md`)\n *\n * Three states and no more, identical for every entity on the platform:\n *\n * | value | the platform's words | what the list shows |\n * |------------|----------------------|--------------------------|\n * | `active` | hide archived | only un-archived rows |\n * | `both` | show all | every row |\n * | `archived` | archived only | only archived rows |\n *\n * `active` is the platform default, and it is a KNOB — see\n * `AgentCatalogConfig.defaults.archiveFilter`.\n */\nexport type AgentArchFilter = \"active\" | \"archived\" | \"both\";\n\n/** Every legal archive-filter value, in the order the control cycles them. */\nexport const ARCHIVE_FILTER_ORDER: readonly AgentArchFilter[] = [\n \"active\",\n \"both\",\n \"archived\",\n];\n\nexport interface AgentArchFilterOption {\n value: AgentArchFilter;\n /** The platform's own words for the state — what a menu row would read. */\n label: string;\n /** What the filter-bar chip reads while this state is the active one. */\n chip: string;\n}\n\n/**\n * 🚨 ONE CONTROL, THREE STATES, SAME WORDS EVERYWHERE. A surface that invents\n * its own archive vocabulary breaks clause 3 of the law (\"the same primitive\n * everywhere … not a per-feature invention\").\n */\nexport const ARCHIVE_FILTER_OPTIONS: readonly AgentArchFilterOption[] = [\n { value: \"active\", label: \"Hide archived\", chip: \"Archive\" },\n { value: \"both\", label: \"Show all\", chip: \"All + archived\" },\n { value: \"archived\", label: \"Archived only\", chip: \"Archived only\" },\n];\n\n/**\n * The next state of the cycling control: hide archived → show all → archived\n * only → hide archived. Pure, so the web chip and the native chip cannot\n * drift apart, and so \"the control reveals archived rows in ONE action\" is a\n * testable claim rather than a UI opinion.\n */\nexport function nextArchFilter(current: AgentArchFilter): AgentArchFilter {\n const index = ARCHIVE_FILTER_ORDER.indexOf(current);\n if (index < 0) return ARCHIVE_FILTER_ORDER[0] as AgentArchFilter;\n return ARCHIVE_FILTER_ORDER[\n (index + 1) % ARCHIVE_FILTER_ORDER.length\n ] as AgentArchFilter;\n}\n\n/** True when `value` is one of the three legal states. */\nexport function isAgentArchFilter(value: unknown): value is AgentArchFilter {\n return value === \"active\" || value === \"archived\" || value === \"both\";\n}\n\n/**\n * Access level filter.\n * 'any' = no restriction (default).\n * 'owned' = only agents the user owns (isOwner = true).\n * 'shared' = only agents shared with the user (isOwner = false).\n * 'editable' = owner + admin + editor.\n */\nexport type AgentAccessFilter = \"any\" | \"owned\" | \"shared\" | \"editable\";\n\n/** Sentinel meaning \"include uncategorized / untagged\" items. */\nexport const AGENT_NONE_SENTINEL = \"__none__\";\n\nexport interface AgentConsumerState {\n tab: AgentTab;\n sortBy: AgentSortOption;\n searchTerm: string;\n\n /** INCLUSION model: empty = show all; non-empty = only matching. */\n includedCats: string[];\n\n /** INCLUSION model: empty = show all; non-empty = only matching. */\n includedTags: string[];\n\n favFilter: AgentFavFilter;\n archFilter: AgentArchFilter;\n accessFilter: AgentAccessFilter;\n favoritesFirst: boolean;\n\n /** Current page for owned-agent list items (after the card section). */\n listPage: number;\n\n /** Current page for shared-agent list items. */\n sharedPage: number;\n\n /**\n * Ids returned by the last server-side search (`agx_search`), in server rank\n * order. Additive: an agent in this list survives the search filter even\n * when the local scorer gives it 0.\n *\n * That is load-bearing for tier 2. A deep search matches an agent's prompt\n * content, which the client never loads — so the local scorer cannot see it.\n * Without this list the server would return prompt matches and the UI would\n * immediately filter them back out.\n *\n * Server-only matches sort BELOW every locally-scored match, in server rank\n * order, so obvious matches always come first.\n */\n serverMatchedIds: string[];\n\n /** True while a server search is in flight — drives the search spinner. */\n isServerSearching: boolean;\n\n /** Tier 2: also search agent prompt content. Opt-in, per consumer. */\n deepSearch: boolean;\n}\n\nexport const DEFAULT_AGENT_CONSUMER_STATE: AgentConsumerState = {\n tab: \"mine\",\n sortBy: \"updated-desc\",\n searchTerm: \"\",\n includedCats: [],\n includedTags: [],\n favFilter: \"all\",\n archFilter: \"active\",\n accessFilter: \"any\",\n favoritesFirst: true,\n listPage: 1,\n sharedPage: 1,\n serverMatchedIds: [],\n isServerSearching: false,\n deepSearch: false,\n};\n\n/** The subset of consumer state a caller may patch (paging is derived). */\nexport type AgentConsumerPatch = Partial<\n Omit<AgentConsumerState, \"listPage\" | \"sharedPage\">\n>;\n\n// ── Loud configuration failure ───────────────────────────────────────────────\n\n/**\n * Thrown by `createAgentCatalog` when a REQUIRED port is missing or an\n * optional feature was asked for without the port it needs. Never a warning,\n * never a degraded catalog: a picker that cannot read is not a picker.\n */\nexport class AgentCatalogConfigError extends Error {\n override readonly name = \"AgentCatalogConfigError\";\n /** Machine code, for a host that routes config failures. */\n readonly code: string;\n /** What the host must do, in a sentence a person can act on. */\n readonly remedy: string;\n\n constructor(args: { code: string; message: string; remedy: string }) {\n super(`${args.message} — ${args.remedy}`);\n this.code = args.code;\n this.remedy = args.remedy;\n }\n}\n","/**\n * catalog/labels.ts — @ai-matrx/agents/catalog\n *\n * VERBATIM port of matrx-frontend `features/agents/constants/agent-list-labels.ts`.\n * The only seam inverted: the two label constants moved into the `labels` port\n * (`DEFAULT_AGENT_CATALOG_LABELS.publicTab` / `.publicBadge`) so a host can\n * override them; the FUNCTIONS below keep their exact behaviour.\n */\n\nimport type { AgentCatalogLabels } from \"./ports\";\nimport { ARCHIVE_FILTER_OPTIONS, nextArchFilter } from \"./types\";\nimport type { AgentArchFilter, AgentTab } from \"./types\";\n\nexport function agentListEmptyLabel(\n tab: AgentTab,\n labels: AgentCatalogLabels,\n): string {\n switch (tab) {\n case \"system\":\n // 🚨 The tab IS the system tab, and the surfaces that mount this picker\n // call that rung \"System\" (V1 round 3). Saying \"public\" here made the\n // empty state name a different thing from the rung the person had just\n // chosen. The tab's own LABEL is a wider vocabulary question and is left\n // alone — this only stops the empty state contradicting its own case.\n return labels.emptySystem;\n case \"shared\":\n return labels.emptyShared;\n default:\n return labels.emptyDefault;\n }\n}\n\n/** Whether a list picker should default to the public (`system`) tab instead of Mine. */\nexport function shouldDefaultAgentListToPublicTab(args: {\n userId: string | null;\n ownedCount: number;\n agentsLoaded: boolean;\n}): boolean {\n if (!args.userId) return true;\n if (!args.agentsLoaded) return false;\n return args.ownedCount === 0;\n}\n\n// ── THE ARCHIVED-ITEMS LAW — the control's words, and the honest footer ─────\n//\n// `common-docs/policies/archived-items.md`, Arman 2026-09-09:\n//\n// \"everything should have an archive filter, and the default should always\n// hide archived, but seeing archived items should be one or two clicks\n// away.\"\n//\n// Clause 2 of that law is why these live here rather than inside a component:\n// \"Counts, badges, footers and pagination count what the list renders — a\n// screen never lies.\" The footer string is computed ONCE, from the same\n// numbers the list rendered, for both platforms.\n\n/** What the filter-bar chip reads in each state. */\nexport function agentArchiveFilterChipLabel(archFilter: AgentArchFilter): string {\n return (\n ARCHIVE_FILTER_OPTIONS.find((o) => o.value === archFilter)?.chip ?? \"Archive\"\n );\n}\n\n/** The platform's words for the state — menus, aria-labels, help text. */\nexport function agentArchiveFilterStateLabel(\n archFilter: AgentArchFilter,\n): string {\n return (\n ARCHIVE_FILTER_OPTIONS.find((o) => o.value === archFilter)?.label ??\n \"Hide archived\"\n );\n}\n\n/**\n * The accessible name of the ONE control, always naming the state it is IN\n * and the state one click moves it to. A control whose label does not say\n * what it currently does is the \"dead or dishonest\" shape the platform bans.\n */\nexport function agentArchiveFilterControlLabel(\n archFilter: AgentArchFilter,\n): string {\n return `Archive filter: ${agentArchiveFilterStateLabel(\n archFilter,\n ).toLowerCase()}. Click for ${agentArchiveFilterStateLabel(\n nextArchFilter(archFilter),\n ).toLowerCase()}`;\n}\n\n/**\n * THE FOOTER. It counts exactly what the list rendered and, whenever archived\n * rows are involved, says so — hidden ones included.\n *\n * hide archived, nothing archived behind it → \"412 agents\"\n * hide archived, 4 archived behind it → \"412 agents · 4 archived hidden\"\n * show all → \"416 agents · archived shown\"\n * archived only → \"4 archived shown\"\n */\nexport function agentListFooterLabel(args: {\n /** Rows actually rendered. */\n count: number;\n archFilter: AgentArchFilter;\n /**\n * Rows this view WOULD render if the filter were flipped to \"archived only\"\n * — exactly what the default state is keeping off the screen. Only ever\n * read in the `active` state.\n */\n archivedHiddenCount: number;\n}): string {\n const { count, archFilter, archivedHiddenCount } = args;\n if (archFilter === \"archived\") return `${count} archived shown`;\n const base = `${count} agent${count !== 1 ? \"s\" : \"\"}`;\n if (archFilter === \"both\") return `${base} · archived shown`;\n return archivedHiddenCount > 0\n ? `${base} · ${archivedHiddenCount} archived hidden`\n : base;\n}\n","// catalog/score.ts — @ai-matrx/agents/catalog\n//\n// THE canonical agent relevance scorer. One implementation, every surface,\n// every APP. Ported VERBATIM (behaviour byte-for-byte) from matrx-frontend\n// `features/agents/search/score.ts`; only the file header changed.\n//\n// This existed twice with drifted weights — the gallery copy in\n// `features/agents/redux/agent-consumers/selectors.ts` and a chat-side copy in\n// the (deleted 2026-08) legacy agentCache selectors. The chat copy scored an id\n// match at 50 with no exact-id bonus, so searching a chat-side picker by UUID\n// was effectively dead. Everything now delegates here.\n//\n// Pure: no Redux, no store types, no imports. Anything that can describe an\n// agent structurally can be scored.\n//\n// Adding a field? Add it here and it lights up on every surface at once.\n// Never fork this function.\n//\n// ── SQL PARITY (load-bearing) ───────────────────────────────────────────────\n// `public.agx_search_score` in migrations/agx_search_score.sql is the SQL\n// mirror of this function. Server-side paging FORCES a second implementation —\n// relevance has to be computed before LIMIT, which the browser cannot do — but\n// the two must stay in lockstep.\n//\n// CHANGE ONE, CHANGE THE OTHER IN THE SAME COMMIT, and keep the weights below\n// identical to the SQL constants. Guarded by score.parity.test.ts against the\n// shared fixture in __fixtures__/search-score-parity.json.\n//\n// This is not hypothetical: /agents/all shipped with a flat SQL `ILIKE OR` and\n// no ranking at all, so a description match tied with a name match and\n// searching \"image\" buried every image agent under unrelated ones.\n\n/**\n * The structural shape a record needs to be searchable. Every field except\n * `id` is optional so both the full gallery record and the slim chat record\n * satisfy it without adapters.\n */\nexport interface AgentSearchable {\n id: string;\n name?: string | null;\n description?: string | null;\n category?: string | null;\n tags?: string[] | null;\n modelId?: string | null;\n agentType?: string | null;\n outputFormat?: string | null;\n sharedByEmail?: string | null;\n}\n\n/**\n * Relevance score for an agent against a query. Higher = more relevant.\n * Returns 0 when nothing matches (0 is the \"no match\" contract — see\n * `agentMatchesSearch`).\n *\n * Scores only fields carried by the list-level fetches. Message content and\n * variable definitions are deliberately excluded: they are not loaded by the\n * list RPCs, so matching them here would be a false promise. Server-side\n * search owns deep content matching.\n */\nexport function computeAgentSearchScore(\n agent: AgentSearchable,\n query: string,\n): number {\n const q = query.trim().toLowerCase();\n if (!q) return 0;\n\n let score = 0;\n\n const name = (agent.name ?? \"\").toLowerCase();\n const desc = (agent.description ?? \"\").toLowerCase();\n\n if (name === q) score += 10000;\n else if (name.startsWith(q)) score += 5000;\n // Word-boundary beats a mid-word substring: \"image\" ranks\n // \"Basic Image Generator\" above \"Reimagine Helper\".\n else if (matchesWholeWord(name, q)) score += 3000;\n else if (name.includes(q)) score += 2000;\n\n if (desc === q) score += 1000;\n else if (desc.includes(q)) score += 500;\n\n if (agent.category?.toLowerCase().includes(q)) score += 300;\n if (agent.tags?.some((t) => t.toLowerCase().includes(q))) score += 300;\n if (agent.modelId?.toLowerCase().includes(q)) score += 100;\n if (agent.agentType?.toLowerCase().includes(q)) score += 100;\n if (agent.outputFormat?.toLowerCase().includes(q)) score += 100;\n\n // Id search — an exact UUID always wins outright so you can paste an id from\n // a URL or a log line and land on that agent, on any surface.\n const id = agent.id.toLowerCase();\n if (id === q) score += 100000;\n else if (id.includes(q)) score += 5000;\n\n // Helps find agents shared by a specific person.\n if (agent.sharedByEmail?.toLowerCase().includes(q)) score += 200;\n\n // Multi-term fallback: \"image gen\" matches nothing as a phrase. Score per\n // TERM, and only when EVERY term lands somewhere — so multi-word searches\n // work without degrading into a loose OR that matches half the list.\n if (score === 0 && q.includes(\" \")) {\n const terms = q.split(/\\s+/).filter(Boolean);\n let hits = 0;\n let termScore = 0;\n for (const term of terms) {\n const inName = name.includes(term);\n const matched =\n inName ||\n desc.includes(term) ||\n (agent.category?.toLowerCase().includes(term) ?? false) ||\n (agent.tags?.some((t) => t.toLowerCase().includes(term)) ?? false);\n if (matched) {\n hits += 1;\n termScore += inName ? 400 : 100;\n }\n }\n // All-or-nothing: a partial term match is not a match.\n if (hits === terms.length) score += termScore;\n }\n\n return score;\n}\n\n/** True when `q` appears in `haystack` on word boundaries. */\nfunction matchesWholeWord(haystack: string, q: string): boolean {\n const escaped = q.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`\\\\b${escaped}\\\\b`).test(haystack);\n}\n\n/** True when the agent matches the query at all. */\nexport function agentMatchesSearch(\n agent: AgentSearchable,\n query: string,\n): boolean {\n return computeAgentSearchScore(agent, query) > 0;\n}\n","/**\n * catalog/selectors.ts — @ai-matrx/agents/catalog\n *\n * VERBATIM port of matrx-frontend\n * `features/agents/redux/agent-consumers/selectors.ts`.\n *\n * ALL filter, sort, search-scoring, category/tag extraction and pagination\n * logic lives here — not in components. Two coupling seams inverted, nothing\n * else:\n *\n * 1. `createSelector` (reselect) → `memoize1`/`memoize2`/`memoize3` below,\n * the same last-arguments reference-equality memoization reselect\n * defaults to. No Redux, no store types.\n * 2. `AgentDefinitionRecord` → `AgentSummary`, the list-row shape\n * `agx_get_list_full` actually returns.\n *\n * One structural consequence of (2), recorded rather than hidden: the\n * frontend's `selectLiveAgents` filters `isVersion` snapshots out of a store\n * that also holds them. This catalog only ever holds list rows — a version\n * snapshot cannot enter it — so that filter is a no-op here and is not\n * ported.\n *\n * 🚨 TWO DELIBERATE DEPARTURES FROM THE ORIGINAL, both defects the port\n * inherited and 0.9.1 fixes at the class (see CHANGELOG 0.9.1):\n *\n * F1 — every sort now ends on `id` ASC, the same final key `agx_get_list`\n * ends on, so the order of TIED rows is defined by the rows instead of\n * by whichever transport the host used to fetch them.\n * F5 — the tab-badge counts honour the archive filter, so the badge, the\n * footer and the rendered rows are the same number.\n *\n * Everything else below is byte-identical to the original.\n */\n\nimport {\n agentMatchesSearch,\n computeAgentSearchScore,\n} from \"./score\";\nimport {\n AGENT_NONE_SENTINEL,\n type AgentArchFilter,\n type AgentConsumerState,\n type AgentSortOption,\n type AgentSummary,\n} from \"./types\";\n\nexport { computeAgentSearchScore, agentMatchesSearch };\nexport { AGENT_NONE_SENTINEL };\n\n// ── Constants (verbatim) ─────────────────────────────────────────────────────\n\nexport const AGENT_CARDS_LIMIT_DESKTOP = 8;\nexport const AGENT_CARDS_LIMIT_MOBILE = 4;\nexport const AGENT_LIST_ITEMS_PER_PAGE = 20;\n\n// ── Memoization (the reselect seam, inverted) ───────────────────────────────\n\n/**\n * Last-arguments memoization on reference equality — reselect's default\n * `defaultMemoize` behaviour, in eleven lines and with no dependency. A\n * selector built here is memoized PER INSTANCE, exactly like a\n * `createSelector` result, so the factories below keep their contract:\n * build the selector once per (consumerId, …) and reuse it.\n */\nexport function memoize1<A, R>(fn: (a: A) => R): (a: A) => R {\n let lastA: A | undefined;\n let last: R;\n let has = false;\n return (a: A): R => {\n if (!has || lastA !== a) {\n last = fn(a);\n lastA = a;\n has = true;\n }\n return last;\n };\n}\n\nexport function memoize2<A, B, R>(fn: (a: A, b: B) => R): (a: A, b: B) => R {\n let lastA: A | undefined;\n let lastB: B | undefined;\n let last: R;\n let has = false;\n return (a: A, b: B): R => {\n if (!has || lastA !== a || lastB !== b) {\n last = fn(a, b);\n lastA = a;\n lastB = b;\n has = true;\n }\n return last;\n };\n}\n\nexport function memoize3<A, B, C, R>(\n fn: (a: A, b: B, c: C) => R,\n): (a: A, b: B, c: C) => R {\n let lastA: A | undefined;\n let lastB: B | undefined;\n let lastC: C | undefined;\n let last: R;\n let has = false;\n return (a: A, b: B, c: C): R => {\n if (!has || lastA !== a || lastB !== b || lastC !== c) {\n last = fn(a, b, c);\n lastA = a;\n lastB = b;\n lastC = c;\n has = true;\n }\n return last;\n };\n}\n\n// ── Pure sort comparator ────────────────────────────────────────────────────\n\n/**\n * 🚨 THE FINAL TIEBREAKER. `agx_get_list` orders\n * `is_favorite DESC, updated_at DESC, id` — `id` ASCENDING is the unique key\n * that makes the SERVER's order TOTAL. Every sort in this file ends on the\n * same key, so the rendered order is a function of the ROWS and never of the\n * order they happened to arrive in.\n *\n * Why a raw `<` / `>` and not `localeCompare`: Postgres orders `uuid` by its\n * 16 raw bytes. The canonical text form is lowercase hex with dashes at fixed\n * positions, so a codepoint comparison of those strings reproduces the\n * database's order exactly. A locale collator does not — it is free to fold\n * case or ignore punctuation, and would silently diverge from the server on\n * precisely the ties this key exists to settle.\n */\nexport function compareAgentIds(a: AgentSummary, b: AgentSummary): number {\n const idA = a.id ?? \"\";\n const idB = b.id ?? \"\";\n if (idA < idB) return -1;\n if (idA > idB) return 1;\n return 0;\n}\n\n/**\n * The chosen sort key, then `id`. TOTAL for every option.\n *\n * Before 0.9.1 each branch below returned 0 for tied rows, which left their\n * relative order to whatever `Array.prototype.sort` had been handed — i.e. to\n * the transport. A host that fetched the RPC in one shot kept the server's\n * favourites-first/`updated_at DESC` order for ties; a host that paged it with\n * `order=id.asc` kept id-ASC. Same rows, same filters, two different screens.\n * The key below is the server's own, so both now render the server's answer.\n */\nexport function applyAgentSortComparator(\n a: AgentSummary,\n b: AgentSummary,\n sortBy: AgentSortOption,\n): number {\n const primary = compareAgentSortKey(a, b, sortBy);\n // An unparseable timestamp yields NaN, which `sort` reads as \"equal\" while\n // defeating `!== 0`. Collapse it to a tie so the id key still decides — a\n // total order must not depend on the data being clean.\n if (!Number.isFinite(primary) || primary === 0) return compareAgentIds(a, b);\n return primary;\n}\n\n/** The chosen key ALONE — no tiebreaker. Not total; not for rendering. */\nfunction compareAgentSortKey(\n a: AgentSummary,\n b: AgentSummary,\n sortBy: AgentSortOption,\n): number {\n switch (sortBy) {\n case \"name-asc\":\n return (a.name ?? \"\").localeCompare(b.name ?? \"\");\n case \"name-desc\":\n return (b.name ?? \"\").localeCompare(a.name ?? \"\");\n case \"created-desc\":\n return +new Date(b.createdAt ?? 0) - +new Date(a.createdAt ?? 0);\n case \"category-asc\":\n return (a.category ?? \"\").localeCompare(b.category ?? \"\");\n case \"updated-desc\":\n default:\n return +new Date(b.updatedAt ?? 0) - +new Date(a.updatedAt ?? 0);\n }\n}\n\n// ── Category / tag metadata (derived from live agents) ──────────────────────\n\n/** All unique categories across live USER agents, sorted alphabetically. */\nexport const selectAllAgentCategories = memoize1(\n (agents: readonly AgentSummary[]): string[] => {\n const cats = new Set<string>();\n for (const a of agents) {\n if (a.agentType === \"user\" && a.category) cats.add(a.category);\n }\n return Array.from(cats).sort();\n },\n);\n\n/**\n * All unique categories across live SYSTEM (builtin) agents. The system tab\n * gets the same category filter every other tab has — its options just come\n * from a different population.\n */\nexport const selectAllSystemAgentCategories = memoize1(\n (agents: readonly AgentSummary[]): string[] => {\n const cats = new Set<string>();\n for (const a of agents) {\n if (a.agentType === \"builtin\" && a.category) cats.add(a.category);\n }\n return Array.from(cats).sort();\n },\n);\n\n/** All unique tags across live user agents, sorted alphabetically. */\nexport const selectAllAgentTags = memoize1(\n (agents: readonly AgentSummary[]): string[] => {\n const tags = new Set<string>();\n for (const a of agents) {\n if (a.agentType === \"user\") a.tags?.forEach((t) => tags.add(t));\n }\n return Array.from(tags).sort();\n },\n);\n\n/** All unique tags across live SYSTEM (builtin) agents. */\nexport const selectAllSystemAgentTags = memoize1(\n (agents: readonly AgentSummary[]): string[] => {\n const tags = new Set<string>();\n for (const a of agents) {\n if (a.agentType === \"builtin\") a.tags?.forEach((t) => tags.add(t));\n }\n return Array.from(tags).sort();\n },\n);\n\n// ── User-owned + shared agents (excludes builtins) ─────────────────────────\n\n/** Live user-type agents (excludes builtins). */\nexport const selectUserTypeAgents = memoize1(\n (agents: readonly AgentSummary[]): AgentSummary[] =>\n agents.filter((a) => a.agentType === \"user\"),\n);\n\n/** Builtin/system agents only. For chat pickers and full catalogues. */\nexport const selectBuiltinTypeAgents = memoize1(\n (agents: readonly AgentSummary[]): AgentSummary[] =>\n agents.filter((a) => a.agentType === \"builtin\"),\n);\n\n// ── Pure filter pipelines (verbatim) ───────────────────────────────────────\n\n/**\n * The ONE ordering rule, and it is TOTAL on every path.\n *\n * searching: score DESC → server rank ASC → sort key → id ASC\n * not searching: favourites first (when asked) → sort key → id ASC\n *\n * `id` ASC is the final key `agx_get_list` itself ends on, so two hosts that\n * fetched the same rows through different transports render the same screen.\n */\nexport function sortFilteredAgents(\n filtered: AgentSummary[],\n consumer: AgentConsumerState,\n): AgentSummary[] {\n const { searchTerm, sortBy, favFilter, favoritesFirst } = consumer;\n\n if (searchTerm) {\n const scores = new Map<string, number>();\n filtered.forEach((a) => {\n scores.set(a.id, computeAgentSearchScore(a, searchTerm));\n });\n\n // Server rank, used only to order matches the local scorer cannot see\n // (tier-2 prompt hits). Locally-scored matches all have score > 0, so\n // they sort above this group unconditionally — obvious matches first.\n const serverRank = new Map<string, number>();\n consumer.serverMatchedIds.forEach((id, i) => serverRank.set(id, i));\n\n return [...filtered].sort((a, b) => {\n const sa = scores.get(a.id) ?? 0;\n const sb = scores.get(b.id) ?? 0;\n if (sb !== sa) return sb - sa;\n if (sa === 0) {\n const ra = serverRank.get(a.id);\n const rb = serverRank.get(b.id);\n if (ra !== undefined && rb !== undefined && ra !== rb) return ra - rb;\n }\n return applyAgentSortComparator(a, b, sortBy);\n });\n }\n\n return [...filtered].sort((a, b) => {\n if (favoritesFirst && favFilter === \"all\") {\n const aFav = a.isFavorite ? 1 : 0;\n const bFav = b.isFavorite ? 1 : 0;\n if (bFav !== aFav) return bFav - aFav;\n }\n return applyAgentSortComparator(a, b, sortBy);\n });\n}\n\n/** User-type agents — mine / shared / all tabs with full consumer filters. */\nexport function filterUserTypeAgents(\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n): AgentSummary[] {\n const {\n searchTerm,\n includedCats,\n includedTags,\n favFilter,\n archFilter,\n accessFilter,\n tab,\n } = consumer;\n\n // Built once, not per row — this runs on every keystroke over the full list.\n const serverMatched = new Set(consumer.serverMatchedIds);\n\n const filtered = agents.filter((agent) => {\n if (tab === \"mine\" && agent.isOwner !== true) return false;\n if (\n tab === \"shared\" &&\n !(agent.isOwner === false && agent.accessLevel != null)\n )\n return false;\n\n // THE ARCHIVED-ITEMS LAW, through the ONE predicate every tab, badge and\n // footer in this package shares.\n if (!agentMatchesArchiveFilter(agent, archFilter)) return false;\n\n if (favFilter === \"yes\" && !agent.isFavorite) return false;\n if (favFilter === \"no\" && agent.isFavorite) return false;\n\n if (accessFilter === \"owned\" && agent.isOwner !== true) return false;\n if (accessFilter === \"shared\" && agent.isOwner !== false) return false;\n if (\n accessFilter === \"editable\" &&\n agent.accessLevel !== \"owner\" &&\n agent.accessLevel !== \"admin\" &&\n agent.accessLevel !== \"editor\"\n )\n return false;\n\n if (includedCats.length > 0) {\n const category = agent.category;\n if (!category) {\n if (!includedCats.includes(AGENT_NONE_SENTINEL)) return false;\n } else if (!includedCats.includes(category)) {\n return false;\n }\n }\n\n if (includedTags.length > 0) {\n const isUntagged = !agent.tags?.length;\n if (isUntagged) {\n if (!includedTags.includes(AGENT_NONE_SENTINEL)) return false;\n } else if (!agent.tags?.some((t) => includedTags.includes(t))) {\n return false;\n }\n }\n\n // A server hit counts as a match even when the local scorer scores 0 —\n // that is the only way tier-2 prompt matches can reach the screen, since\n // the client never loads prompt content to score against.\n if (\n searchTerm &&\n !agentMatchesSearch(agent, searchTerm) &&\n !serverMatched.has(agent.id)\n )\n return false;\n\n return true;\n });\n\n return sortFilteredAgents(filtered, consumer);\n}\n\n/**\n * Builtin/system agents (tab === \"system\").\n *\n * Gets the SAME filter surface every other tab has — search, favorites,\n * category, tags, sort, AND THE ARCHIVE FILTER. Only the ownership/access\n * filters are skipped, because a builtin has no owner to filter on. A picker\n * that offers less on one tab than another is the exact half-built shape this\n * list exists to prevent.\n *\n * 🚨 0.9.2 — THE BUILTIN ARCHIVE EXEMPTION IS GONE, AND IT IS NOW ILLEGAL.\n *\n * Until 0.9.1 this function applied no archive filter, on the theory that \"a\n * builtin belongs to the platform and is never the user's to archive\". The\n * database disagreed: `Foundry Planner`\n * (`001b22f6-fa4d-40c6-a1a4-8575d4d04379`) is an ARCHIVED builtin, and it\n * rendered at Public index 216 and was pickable — while Mine / Shared / All\n * hid their archived rows. One picker, two rules, and a person could choose a\n * retired agent from the one tab that did not obey.\n *\n * THE ARCHIVED-ITEMS LAW (`common-docs/policies/archived-items.md`, Arman\n * 2026-09-09) closed the question for every entity at once: \"everything should\n * have an archive filter, and the default should always hide archived… all\n * archived items should always be treated the same.\" Clause 4 makes it a\n * class, not an instance — so there is no per-tab, per-entity or per-surface\n * exemption left to grant, here or anywhere.\n */\nexport function filterBuiltinTypeAgents(\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n): AgentSummary[] {\n const { searchTerm, favFilter, archFilter, includedCats, includedTags } =\n consumer;\n const serverMatched = new Set(consumer.serverMatchedIds);\n\n const filtered = agents.filter((agent) => {\n // THE LAW, first and unconditional — identical to the user-tab rule above.\n if (!agentMatchesArchiveFilter(agent, archFilter)) return false;\n\n if (favFilter === \"yes\" && !agent.isFavorite) return false;\n if (favFilter === \"no\" && agent.isFavorite) return false;\n\n if (includedCats.length > 0) {\n const category = agent.category;\n if (!category) {\n if (!includedCats.includes(AGENT_NONE_SENTINEL)) return false;\n } else if (!includedCats.includes(category)) {\n return false;\n }\n }\n\n if (includedTags.length > 0) {\n const isUntagged = !agent.tags?.length;\n if (isUntagged) {\n if (!includedTags.includes(AGENT_NONE_SENTINEL)) return false;\n } else if (!agent.tags?.some((t) => includedTags.includes(t))) {\n return false;\n }\n }\n\n if (\n searchTerm &&\n !agentMatchesSearch(agent, searchTerm) &&\n !serverMatched.has(agent.id)\n )\n return false;\n\n return true;\n });\n\n return sortFilteredAgents(filtered, consumer);\n}\n\n// ── Filtered agents (user + system tabs) ───────────────────────────────────\n\n/** Factory: owned user-type agents with consumer filters applied (ignores tab). */\nexport const makeSelectFilteredOwnedAgents = () =>\n memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] =>\n filterUserTypeAgents(selectUserTypeAgents(agents), {\n ...consumer,\n tab: \"mine\",\n }),\n );\n\n/** Factory: shared user-type agents with consumer filters applied (ignores tab). */\nexport const makeSelectFilteredSharedAgents = () =>\n memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] =>\n filterUserTypeAgents(selectUserTypeAgents(agents), {\n ...consumer,\n tab: \"shared\",\n }),\n );\n\n/**\n * Factory: filters and sorts agents for a consumer. User tabs (mine / shared /\n * all) draw from user-type agents; the system tab draws from builtins.\n *\n * `includeSystemInAll` is the ADMIN reading of the \"All\" tab. For a normal\n * user, system agents are a separate catalogue and \"All\" means \"all of MY\n * agents\". For an admin surface, system agents ARE their agents — so \"All\"\n * must be a single blended list, with each row still labelled (the `system`\n * badge on `AgentRow`) so the two are never confused.\n */\nexport const makeSelectFilteredAgents = (includeSystemInAll = false) =>\n memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] => {\n const userAgents = selectUserTypeAgents(agents);\n const builtinAgents = selectBuiltinTypeAgents(agents);\n if (consumer.tab === \"system\") {\n return filterBuiltinTypeAgents(builtinAgents, consumer);\n }\n if (includeSystemInAll && consumer.tab === \"all\") {\n return [\n ...filterUserTypeAgents(userAgents, consumer),\n ...filterBuiltinTypeAgents(builtinAgents, consumer),\n ];\n }\n return filterUserTypeAgents(userAgents, consumer);\n },\n );\n\n/** Factory: filters and sorts builtin agents for the chat agent picker. */\nexport const makeSelectFilteredBuiltinAgents = () =>\n memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] =>\n filterBuiltinTypeAgents(selectBuiltinTypeAgents(agents), consumer),\n );\n\n// ── Card / list split (verbatim) ───────────────────────────────────────────\n\nexport interface AgentListPage {\n items: AgentSummary[];\n hasMore: boolean;\n totalAfterCards: number;\n}\n\nfunction pageAfterCards(\n filtered: AgentSummary[],\n limit: number,\n page: number,\n): AgentListPage {\n const afterCards = filtered.slice(limit);\n const pageEnd = page * AGENT_LIST_ITEMS_PER_PAGE;\n const items = afterCards.slice(0, pageEnd);\n return {\n items,\n hasMore: items.length < afterCards.length,\n totalAfterCards: afterCards.length,\n };\n}\n\n/** Factory: slices filtered owned agents into the \"cards\" hero section. */\nexport const makeSelectOwnedAgentCards = (isMobile: boolean) => {\n const selectFiltered = makeSelectFilteredOwnedAgents();\n const limit = isMobile ? AGENT_CARDS_LIMIT_MOBILE : AGENT_CARDS_LIMIT_DESKTOP;\n return memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] => selectFiltered(agents, consumer).slice(0, limit),\n );\n};\n\n/** Factory: paginated list items for owned agents (everything after cards). */\nexport const makeSelectOwnedAgentListItems = (isMobile: boolean) => {\n const selectFiltered = makeSelectFilteredOwnedAgents();\n const limit = isMobile ? AGENT_CARDS_LIMIT_MOBILE : AGENT_CARDS_LIMIT_DESKTOP;\n return memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentListPage =>\n pageAfterCards(selectFiltered(agents, consumer), limit, consumer.listPage),\n );\n};\n\n/** Factory: slices filtered shared agents into the \"cards\" hero section. */\nexport const makeSelectSharedAgentCards = (isMobile: boolean) => {\n const selectFiltered = makeSelectFilteredSharedAgents();\n const limit = isMobile ? AGENT_CARDS_LIMIT_MOBILE : AGENT_CARDS_LIMIT_DESKTOP;\n return memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentSummary[] => selectFiltered(agents, consumer).slice(0, limit),\n );\n};\n\n/** Factory: paginated list items for shared agents (everything after cards). */\nexport const makeSelectSharedAgentListItems = (isMobile: boolean) => {\n const selectFiltered = makeSelectFilteredSharedAgents();\n const limit = isMobile ? AGENT_CARDS_LIMIT_MOBILE : AGENT_CARDS_LIMIT_DESKTOP;\n return memoize2(\n (\n agents: readonly AgentSummary[],\n consumer: AgentConsumerState,\n ): AgentListPage =>\n pageAfterCards(\n selectFiltered(agents, consumer),\n limit,\n consumer.sharedPage,\n ),\n );\n};\n\n// ── Convenience count selectors ────────────────────────────────────────────\n\n/** Factory: total count of filtered agents for a consumer. */\nexport const makeSelectFilteredAgentsCount = () => {\n const selectFiltered = makeSelectFilteredAgents();\n return memoize2(\n (agents: readonly AgentSummary[], consumer: AgentConsumerState): number =>\n selectFiltered(agents, consumer).length,\n );\n};\n\n/** Factory: total count of filtered builtin agents for a consumer. */\nexport const makeSelectFilteredBuiltinAgentsCount = () => {\n const selectFiltered = makeSelectFilteredBuiltinAgents();\n return memoize2(\n (agents: readonly AgentSummary[], consumer: AgentConsumerState): number =>\n selectFiltered(agents, consumer).length,\n );\n};\n\n// ── Consumer state convenience selectors ──────────────────────────────────\n\n/** Returns whether a consumer has any non-default filters active. */\nexport function agentConsumerHasActiveFilters(\n consumer: AgentConsumerState,\n defaults: AgentConsumerState,\n): boolean {\n return (\n consumer.tab !== defaults.tab ||\n consumer.sortBy !== defaults.sortBy ||\n consumer.searchTerm !== \"\" ||\n consumer.includedCats.length > 0 ||\n consumer.includedTags.length > 0 ||\n consumer.favFilter !== defaults.favFilter ||\n consumer.archFilter !== defaults.archFilter ||\n consumer.accessFilter !== defaults.accessFilter ||\n consumer.favoritesFirst !== defaults.favoritesFirst\n );\n}\n\n// ── Aggregate counts (for tab badges) ─────────────────────────────────────\n\n/**\n * 🚨 A BADGE COUNTS WHAT THE TAB RENDERS. Nothing else.\n *\n * Before 0.9.1 these five counted every user-type row, archived included,\n * while `filterUserTypeAgents` (archive filter `active`, the default) hid the\n * archived ones. The badge said \"Mine 416\", the list showed 412 rows and the\n * footer said \"412 agents\" — one screen, three numbers, one of them a lie\n * about agents the user cannot see or reach from there.\n *\n * `is_archived` is now honoured by the same rule the list uses, so the badge,\n * the footer and the rows agree on every tab and under every archive filter.\n *\n * 🚨 0.9.2 — AND THERE IS NO LONGER AN EXCEPTION. The system tab used to be\n * one (\"a builtin is never the user's to archive\"), which was false in the\n * database and illegal under THE ARCHIVED-ITEMS LAW. Its badge now counts\n * under the same archive rule its rows render under, so `Foundry Planner`\n * leaves the Public badge and the Public list together, or returns to both\n * together — never one without the other.\n */\nexport function agentMatchesArchiveFilter(\n agent: AgentSummary,\n archFilter: AgentArchFilter,\n): boolean {\n if (archFilter === \"active\") return !agent.isArchived;\n if (archFilter === \"archived\") return Boolean(agent.isArchived);\n return true;\n}\n\n/** Builtin rows matching an archive filter — the Public tab's badge. */\nfunction countBuiltinRows(\n agents: readonly AgentSummary[],\n archFilter: AgentArchFilter,\n): number {\n let n = 0;\n for (const a of agents) {\n if (a.agentType !== \"builtin\") continue;\n if (!agentMatchesArchiveFilter(a, archFilter)) continue;\n n += 1;\n }\n return n;\n}\n\nfunction countUserRows(\n agents: readonly AgentSummary[],\n archFilter: AgentArchFilter,\n predicate: (a: AgentSummary) => boolean,\n): number {\n let n = 0;\n for (const a of agents) {\n if (a.agentType !== \"user\") continue;\n if (!agentMatchesArchiveFilter(a, archFilter)) continue;\n if (predicate(a)) n += 1;\n }\n return n;\n}\n\nconst isOwned = (a: AgentSummary) => a.isOwner === true;\nconst isShared = (a: AgentSummary) =>\n a.isOwner === false && a.accessLevel != null;\nconst isAny = () => true;\nconst isFavorite = (a: AgentSummary) => Boolean(a.isFavorite);\n\n/**\n * The four tab badges for a consumer's CURRENT archive filter — the numbers\n * `useAgentListCore` puts on the tab strip. Flip the archive filter to\n * \"archived\" and the badges follow the list into the archive.\n */\nexport const selectAgentTabCounts = memoize2(\n (\n agents: readonly AgentSummary[],\n archFilter: AgentArchFilter,\n ): { mine: number; shared: number; all: number; system: number } => ({\n mine: countUserRows(agents, archFilter, isOwned),\n shared: countUserRows(agents, archFilter, isShared),\n all: countUserRows(agents, archFilter, isAny),\n system: countBuiltinRows(agents, archFilter),\n }),\n);\n\n/** Live user-type agents the default (`active`) list renders. */\nexport const selectTotalUserAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number =>\n countUserRows(agents, \"active\", isAny),\n);\n\nexport const selectTotalOwnedAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number =>\n countUserRows(agents, \"active\", isOwned),\n);\n\nexport const selectTotalSharedAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number =>\n countUserRows(agents, \"active\", isShared),\n);\n\n/**\n * Live builtin agents the DEFAULT (`active`) list renders — archived builtins\n * excluded, exactly like every other \"total\" beside it. Before 0.9.2 this\n * counted archived builtins too, which is how an archived `Foundry Planner`\n * reached the Public badge.\n */\nexport const selectTotalBuiltinAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number => countBuiltinRows(agents, \"active\"),\n);\n\nexport const selectTotalFavoriteAgentsCount = memoize1(\n (agents: readonly AgentSummary[]): number =>\n countUserRows(agents, \"active\", isFavorite),\n);\n","/**\n * catalog/native/AgentDetailCard.tsx — the native twin of\n * `catalog/react/AgentDetailCard.tsx` (the picker's DETAIL PEEK).\n *\n * Same blocks, same order: the Orchestra block first (choosing a conductor\n * runs an ensemble, which changes what selecting it means), then description,\n * category, tags, access, model, dates — then Select, and the optional peek\n * affordance. `openPeek` absent → the affordance is HIDDEN, never a dead\n * button. A mandate default row has no agent door and no favourite, exactly as\n * on the web.\n */\n\nimport { Pressable, ScrollView, StyleSheet, Text, View } from \"react-native\";\n\nimport { useAgentCatalog, useAgentCatalogUiPorts } from \"../shared/context\";\nimport {\n orchestraDelegatesLine,\n orchestraDepthLine,\n orchestraLabel,\n} from \"../orchestra\";\nimport { isMandateAgentId, type AgentSummary } from \"../types\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\nimport { FavoriteAgentButton } from \"./FavoriteAgentButton\";\n\nexport interface AgentDetailCardProps {\n agent: AgentSummary;\n onSelect: () => void;\n}\n\nfunction formatDate(value: string | null): string | null {\n if (!value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nexport function AgentDetailCard({ agent, onSelect }: AgentDetailCardProps) {\n const { errorSink } = useAgentCatalog();\n const { renderModelRef, openPeek } = useAgentCatalogUiPorts();\n const theme = useAgentCatalogNativeTheme();\n const isDefaultRow = isMandateAgentId(agent.id);\n const updated = formatDate(agent.updatedAt);\n const created = formatDate(agent.createdAt);\n\n return (\n <View style={styles.container}>\n <View style={[styles.header, { padding: theme.spacing.md }]}>\n <View style={{ flex: 1, minWidth: 0 }}>\n <Text\n numberOfLines={2}\n style={{\n color: theme.colors.text,\n fontSize: theme.fontSize.lg,\n fontWeight: \"600\",\n }}\n >\n {agent.name || \"Untitled\"}\n </Text>\n {agent.isFavorite && (\n <Text\n style={{ color: theme.colors.favorite, fontSize: theme.fontSize.sm }}\n >\n Pinned to favorites\n </Text>\n )}\n </View>\n {!isDefaultRow && <FavoriteAgentButton id={agent.id} />}\n </View>\n\n <View style={{ height: StyleSheet.hairlineWidth, backgroundColor: theme.colors.border }} />\n\n <ScrollView\n style={styles.body}\n contentContainerStyle={{ padding: theme.spacing.md, gap: theme.spacing.md }}\n >\n {agent.orchestra && (\n <View\n style={[\n styles.orchestra,\n {\n borderColor: theme.colors.primary,\n backgroundColor: theme.colors.primarySoft,\n borderRadius: theme.radius.md,\n padding: theme.spacing.sm,\n },\n ]}\n >\n <View style={styles.inline}>\n <AgentIcon\n name=\"music4\"\n size={14}\n color={theme.colors.primary}\n report={errorSink}\n />\n <Text\n style={{\n color: theme.colors.primary,\n fontSize: theme.fontSize.sm,\n fontWeight: \"600\",\n }}\n >\n {orchestraLabel(agent.orchestra)}\n </Text>\n </View>\n {agent.orchestra.tagline && (\n <Text style={{ color: theme.colors.text, fontSize: theme.fontSize.md }}>\n {agent.orchestra.tagline}\n </Text>\n )}\n {orchestraDelegatesLine(agent.orchestra) && (\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.sm }}\n >\n {orchestraDelegatesLine(agent.orchestra)}\n </Text>\n )}\n {orchestraDepthLine(agent.orchestra) && (\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.sm }}\n >\n {orchestraDepthLine(agent.orchestra)}\n </Text>\n )}\n </View>\n )}\n\n {agent.description && (\n <View style={{ gap: 4 }}>\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.sm,\n fontWeight: \"600\",\n textTransform: \"uppercase\",\n }}\n >\n Description\n </Text>\n <Text style={{ color: theme.colors.text, fontSize: theme.fontSize.md }}>\n {agent.description}\n </Text>\n </View>\n )}\n\n {agent.category && (\n <View style={styles.inline}>\n <AgentIcon\n name=\"folder\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <Text style={{ color: theme.colors.text, fontSize: theme.fontSize.md }}>\n {agent.category}\n </Text>\n </View>\n )}\n\n {agent.tags.length > 0 && (\n <View style={{ gap: 6 }}>\n <View style={styles.inline}>\n <AgentIcon\n name=\"tag\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.sm }}\n >\n Tags\n </Text>\n </View>\n <View style={styles.tagWrap}>\n {agent.tags.map((tag) => (\n <Text\n key={tag}\n style={{\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.sm,\n overflow: \"hidden\",\n paddingHorizontal: 6,\n paddingVertical: 2,\n fontSize: theme.fontSize.xs,\n }}\n >\n {tag}\n </Text>\n ))}\n </View>\n </View>\n )}\n\n {agent.accessLevel && (\n <View style={styles.inline}>\n <AgentIcon\n name={agent.isOwner === false ? \"users\" : \"globe\"}\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <View>\n <Text style={{ color: theme.colors.text, fontSize: theme.fontSize.md }}>\n {agent.accessLevel === \"owner\"\n ? \"You own this\"\n : `Shared — ${agent.accessLevel}`}\n </Text>\n {agent.sharedByEmail && (\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.xs }}\n >\n by {agent.sharedByEmail}\n </Text>\n )}\n </View>\n </View>\n )}\n\n {agent.modelId && <View>{renderModelRef({\n modelId: agent.modelId,\n ...(agent.offeringId !== undefined ? { offeringId: agent.offeringId } : {}),\n })}</View>}\n\n {(updated || created) && (\n <View style={{ gap: 4 }}>\n {updated && (\n <View style={styles.inline}>\n <AgentIcon\n name=\"clock\"\n size={13}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.sm }}\n >\n Updated {updated}\n </Text>\n </View>\n )}\n {created && (\n <View style={styles.inline}>\n <AgentIcon\n name=\"clock\"\n size={13}\n color={theme.colors.textFaint}\n report={errorSink}\n />\n <Text\n style={{ color: theme.colors.textFaint, fontSize: theme.fontSize.sm }}\n >\n Created {created}\n </Text>\n </View>\n )}\n </View>\n )}\n </ScrollView>\n\n <View style={{ height: StyleSheet.hairlineWidth, backgroundColor: theme.colors.border }} />\n <View style={[styles.footer, { padding: theme.spacing.sm }]}>\n <Pressable\n onPress={onSelect}\n accessibilityRole=\"button\"\n accessibilityLabel={`Select ${agent.name || \"Untitled\"}`}\n style={({ pressed }) => [\n styles.selectButton,\n {\n borderRadius: theme.radius.md,\n backgroundColor: theme.colors.primary,\n opacity: pressed ? 0.85 : 1,\n },\n ]}\n >\n <Text\n style={{\n color: theme.colors.primaryForeground,\n fontSize: theme.fontSize.md,\n fontWeight: \"600\",\n }}\n >\n Select\n </Text>\n </Pressable>\n {/* ABSENT openPeek → the affordance is HIDDEN, never a dead button. */}\n {openPeek && (\n <Pressable\n onPress={() => openPeek(agent)}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Sneak Peek\"\n style={({ pressed }) => [\n styles.iconButton,\n {\n borderRadius: theme.radius.md,\n borderColor: theme.colors.border,\n backgroundColor: pressed\n ? theme.colors.surfacePressed\n : theme.colors.surface,\n },\n ]}\n >\n <AgentIcon\n name=\"rocket\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n </Pressable>\n )}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, minHeight: 0 },\n header: { flexDirection: \"row\", alignItems: \"flex-start\", gap: 12 },\n body: { flex: 1, minHeight: 0 },\n inline: { flexDirection: \"row\", alignItems: \"center\", gap: 8 },\n orchestra: { borderWidth: StyleSheet.hairlineWidth, gap: 4 },\n tagWrap: { flexDirection: \"row\", flexWrap: \"wrap\", gap: 4 },\n footer: { flexDirection: \"row\", alignItems: \"center\", gap: 8 },\n selectButton: {\n flex: 1,\n height: 40,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n iconButton: {\n width: 40,\n height: 40,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: StyleSheet.hairlineWidth,\n },\n});\n","/**\n * catalog/orchestra.ts — @ai-matrx/agents/catalog\n *\n * Creator words for an Orchestra badge. A VERBATIM port of the helpers the\n * Workflow Studio's hand-rolled picker carried (`apps/workflow-studio/src/\n * hooks/use-agents.ts` before `c0f958b43`), lifted here so every client says\n * the same sentence about the same ensemble.\n *\n * Pure — no React, no DOM. The row shape is `OrchestraBadge` in `./types`.\n */\n\nimport type { OrchestraBadge } from \"./types\";\n\n/**\n * Creator words for an Orchestra's run mode. \"supervisor\" is already plain\n * English; the structural modes get humanized (never \"sequential/parallel/dag\"\n * at eye level). An unknown future mode falls through as its own word rather\n * than hiding — visible-but-unpolished beats invisible.\n */\nconst ORCHESTRA_MODE_LABEL: Record<string, string> = {\n supervisor: \"supervisor\",\n sequential: \"in order\",\n parallel: \"together\",\n dag: \"custom flow\",\n};\n\nexport function orchestraModeLabel(mode: string): string {\n return ORCHESTRA_MODE_LABEL[mode] ?? mode;\n}\n\n/** Human label for a badge: \"Orchestra · supervisor · 3 members\" (singular-safe). */\nexport function orchestraLabel(badge: OrchestraBadge): string {\n const n = badge.memberCount;\n return `Orchestra · ${orchestraModeLabel(badge.mode)} · ${n} ${\n n === 1 ? \"member\" : \"members\"\n }`;\n}\n\n/**\n * The member-call ceiling in Creator language (\"Team members can call helpers\n * up to 2 levels deep\"), or `null` when the composition declared none. A badge\n * never invents the platform default: the server that runs the ensemble owns\n * that number, and printing a promise nobody made is worse than printing\n * nothing.\n */\nexport function orchestraDepthLine(badge: OrchestraBadge): string | null {\n const n = badge.depthBudget;\n if (typeof n !== \"number\" || n <= 0) return null;\n return `Team members can call helpers up to ${n} ${\n n === 1 ? \"level\" : \"levels\"\n } deep`;\n}\n\n/**\n * One visible line naming who the Orchestra delegates to, collapsing past\n * `limit` into \"+N more\". `null` when no member carries a real role title —\n * \"Member, Member, Member\" is noise that reads like data.\n */\nexport function orchestraDelegatesLine(\n badge: OrchestraBadge,\n limit = 3,\n): string | null {\n const titles = badge.memberTitles;\n if (titles.length === 0) return null;\n const shown = titles.slice(0, limit);\n const extra = titles.length - shown.length;\n return `Delegates to: ${shown.join(\", \")}${\n extra > 0 ? ` +${extra} more` : \"\"\n }`;\n}\n","/**\n * catalog/native/icons.tsx — @ai-matrx/agents/catalog/native\n *\n * 🚨 C19 — NO ICON-LIBRARY DEPENDENCY, EVER. The picker's glyphs are the SAME\n * inlined 24×24 Lucide-derived paths the web entry ships in\n * `catalog/react/icons.tsx`; the path data lives in ONE place\n * (`../shared/icon-paths.ts`)\n * and the two entries differ only in what draws it — `<svg>` on the web,\n * `react-native-svg` here.\n *\n * `react-native-svg` is an OPTIONAL peer. When it is absent the icons degrade\n * to text glyphs and the degradation ANNOUNCES ITSELF ONCE through the\n * catalog's `errorSink` with the remedy — never a blank square, never silence.\n * The announcement flag lives on `globalThis` (module-level mutable state is\n * banned: a dual ESM+CJS bundle instantiates each module twice and would\n * announce twice).\n *\n * Colour arrives as an explicit `color` prop from `../native/theme` — never a\n * hardcoded value, on either path.\n */\n\nimport { Text } from \"react-native\";\n\nimport { ICON_PATHS, type AgentCatalogIconName } from \"../shared/icon-paths\";\n\nexport type { AgentCatalogIconName } from \"../shared/icon-paths\";\n\n/** The `react-native-svg` surface this package uses, structurally. */\ninterface SvgModuleLike {\n default: unknown;\n Svg?: unknown;\n Path: unknown;\n Circle: unknown;\n}\n\ninterface NativeIconsGlobalState {\n /** `undefined` = not probed yet; `null` = probed and absent. */\n svg: SvgModuleLike | null | undefined;\n announced: boolean;\n}\n\nconst STATE_KEY = Symbol.for(\"ai-matrx.agents.catalog.native.icons\");\n\nfunction getIconsGlobalState(): NativeIconsGlobalState {\n const store = globalThis as unknown as Record<symbol, unknown>;\n const existing = store[STATE_KEY] as NativeIconsGlobalState | undefined;\n if (existing) return existing;\n const created: NativeIconsGlobalState = { svg: undefined, announced: false };\n store[STATE_KEY] = created;\n return created;\n}\n\n/** Test seam: forget the probe so a test can exercise both paths. */\nexport function _resetNativeIconState(svg?: SvgModuleLike | null): void {\n const state = getIconsGlobalState();\n state.svg = svg === undefined ? undefined : svg;\n state.announced = false;\n}\n\nfunction isSvgModule(value: unknown): value is SvgModuleLike {\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Record<string, unknown>;\n return Boolean(record[\"Path\"] && record[\"Circle\"] && record[\"default\"]);\n}\n\n/**\n * Resolve `react-native-svg` once. Kept inside a function (not at module\n * scope) so importing this file never throws in an environment that has no\n * such module — an import-time throw would take the whole picker down instead\n * of degrading it.\n */\nexport function resolveSvgModule(): SvgModuleLike | null {\n const state = getIconsGlobalState();\n if (state.svg !== undefined) return state.svg;\n let resolved: SvgModuleLike | null = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const required: unknown = (\n globalThis as unknown as { require?: (id: string) => unknown }\n ).require?.(\"react-native-svg\");\n if (isSvgModule(required)) resolved = required;\n else {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const viaModule: unknown = require(\"react-native-svg\");\n if (isSvgModule(viaModule)) resolved = viaModule;\n }\n } catch {\n resolved = null;\n }\n state.svg = resolved;\n return resolved;\n}\n\n/**\n * The degradation announcement. Fires ONCE per process, with the remedy.\n * `report` is the catalog's own `errorSink` — the picker passes it down so\n * this file never reaches for a console of its own.\n */\nexport function announceMissingSvgOnce(\n report: (event: { code: string; message: string; context?: object }) => void,\n): void {\n const state = getIconsGlobalState();\n if (state.announced) return;\n state.announced = true;\n report({\n code: \"native_icons_degraded_to_text\",\n message:\n \"react-native-svg is not installed, so the agent picker is drawing its \" +\n \"icons as text glyphs. Every control still works and every label is \" +\n \"still correct — only the glyphs are plainer.\",\n context: {\n remedy:\n \"run `npx expo install react-native-svg` (it is an optional peer of \" +\n \"@ai-matrx/agents) and reload to get the real icons\",\n },\n });\n}\n\n/** The text stand-in for each glyph, used when react-native-svg is absent. */\nconst TEXT_GLYPHS: Record<AgentCatalogIconName, string> = {\n star: \"★\",\n chevronRight: \"›\",\n chevronDown: \"⌄\",\n search: \"⌕\",\n x: \"✕\",\n check: \"✓\",\n arrowUpDown: \"⇅\",\n folder: \"▤\",\n tag: \"⌗\",\n rotateCcw: \"↺\",\n archive: \"▣\",\n loader: \"◌\",\n alertTriangle: \"⚠\",\n music4: \"♪\",\n clock: \"◷\",\n globe: \"⊕\",\n users: \"⚇\",\n externalLink: \"↗\",\n messageCircle: \"✉\",\n rocket: \"➤\",\n circleCheck: \"✓\",\n};\n\nexport interface AgentIconProps {\n name: AgentCatalogIconName;\n /** Points. Default 14 — the web picker's `w-3.5`. */\n size?: number;\n color: string;\n /** Paint the shape (the favourite star's \"on\" state). */\n filled?: boolean;\n /**\n * Where the degradation is reported. REQUIRED so nothing here can fail\n * silently; every call site already holds the catalog's `errorSink`.\n */\n report: (event: { code: string; message: string; context?: object }) => void;\n}\n\n/**\n * ONE icon component. `name` picks the shape from the shared path table, so\n * the native picker can never wear a glyph the web picker does not have.\n */\nexport function AgentIcon({\n name,\n size = 14,\n color,\n filled = false,\n report,\n}: AgentIconProps) {\n const svg = resolveSvgModule();\n if (!svg) {\n announceMissingSvgOnce(report);\n return (\n <Text\n accessible={false}\n style={{ color, fontSize: size, lineHeight: size * 1.2 }}\n >\n {TEXT_GLYPHS[name]}\n </Text>\n );\n }\n\n const Svg = svg.default as React.ComponentType<Record<string, unknown>>;\n const Path = svg.Path as React.ComponentType<Record<string, unknown>>;\n const Circle = svg.Circle as React.ComponentType<Record<string, unknown>>;\n const shape = ICON_PATHS[name];\n\n return (\n <Svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {shape.paths.map((d, index) => (\n <Path\n key={`p${index}`}\n d={d}\n {...(filled && shape.fillable ? { fill: color } : {})}\n />\n ))}\n {(shape.circles ?? []).map((circle, index) => (\n <Circle\n key={`c${index}`}\n cx={circle.cx}\n cy={circle.cy}\n r={circle.r}\n {...(circle.filled ? { fill: color } : {})}\n />\n ))}\n </Svg>\n );\n}\n","/**\n * catalog/shared/icon-paths.ts — THE picker's glyph geometry, once.\n *\n * 🚨 C19: the package ships its OWN inlined SVGs (adapted from the Lucide\n * shapes the matrx-frontend originals used — same 24×24 grid, same 2px\n * stroke) rather than depending on an icon library. 0.9.0 lifted the path\n * data out of `catalog/react/icons.tsx` into this pure module so the React\n * Native entry draws the IDENTICAL shapes through `react-native-svg`: an\n * agent row wears the same star, and an Orchestra the same conductor mark, in\n * every Matrx client. A glyph added here appears on both platforms or on\n * neither; there is no way to give one platform a shape the other lacks.\n *\n * Pure data — no React, no DOM, no react-native.\n */\n\nexport interface AgentCatalogIconCircle {\n cx: number;\n cy: number;\n r: number;\n /** Painted with `currentColor` regardless of the icon's `filled` state. */\n filled?: boolean;\n}\n\nexport interface AgentCatalogIconShape {\n paths: readonly string[];\n circles?: readonly AgentCatalogIconCircle[];\n /** True when the icon supports a `filled` variant (only the star does). */\n fillable?: boolean;\n}\n\nconst SHAPES = {\n star: {\n paths: [\n \"M11.5 3.2a.6.6 0 0 1 1 0l2.3 4.7 5.2.8a.6.6 0 0 1 .3 1l-3.8 3.7.9 5.2a.6.6 0 0 1-.9.6L12 16.8l-4.6 2.4a.6.6 0 0 1-.9-.6l.9-5.2-3.8-3.7a.6.6 0 0 1 .3-1l5.2-.8Z\",\n ],\n fillable: true,\n },\n chevronRight: { paths: [\"m9 18 6-6-6-6\"] },\n chevronDown: { paths: [\"m6 9 6 6 6-6\"] },\n search: {\n paths: [\"m21 21-4.3-4.3\"],\n circles: [{ cx: 11, cy: 11, r: 8 }],\n },\n x: { paths: [\"M18 6 6 18\", \"m6 6 12 12\"] },\n check: { paths: [\"M20 6 9 17l-5-5\"] },\n arrowUpDown: {\n paths: [\"m21 16-4 4-4-4\", \"M17 20V4\", \"m3 8 4-4 4 4\", \"M7 4v16\"],\n },\n folder: {\n paths: [\n \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n ],\n },\n tag: {\n paths: [\n \"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\",\n ],\n circles: [{ cx: 7.5, cy: 7.5, r: 0.5, filled: true }],\n },\n rotateCcw: {\n paths: [\n \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\",\n \"M3 3v5h5\",\n ],\n },\n loader: { paths: [\"M21 12a9 9 0 1 1-6.219-8.56\"] },\n alertTriangle: {\n paths: [\n \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n \"M12 9v4\",\n \"M12 17h.01\",\n ],\n },\n /**\n * The Orchestra marker (Lucide `music-4`): the glyph the Workflow Studio's\n * picker used for a conductor, kept identical so the same agent wears the\n * same mark in every client.\n */\n music4: {\n paths: [\"M9 18V5l12-2v13\", \"m9 9 12-2\"],\n circles: [\n { cx: 6, cy: 18, r: 3 },\n { cx: 18, cy: 16, r: 3 },\n ],\n },\n clock: {\n paths: [\"M12 6v6l4 2\"],\n circles: [{ cx: 12, cy: 12, r: 10 }],\n },\n globe: {\n paths: [\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", \"M2 12h20\"],\n circles: [{ cx: 12, cy: 12, r: 10 }],\n },\n users: {\n paths: [\n \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\n \"M22 21v-2a4 4 0 0 0-3-3.87\",\n \"M16 3.13a4 4 0 0 1 0 7.75\",\n ],\n circles: [{ cx: 9, cy: 7, r: 4 }],\n },\n externalLink: {\n paths: [\n \"M15 3h6v6\",\n \"M10 14 21 3\",\n \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\",\n ],\n },\n messageCircle: { paths: [\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\"] },\n rocket: {\n paths: [\n \"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91 0\",\n \"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2\",\n \"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\",\n \"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\",\n ],\n },\n /**\n * THE ARCHIVE GLYPH (Lucide `archive`) — the ONE mark of the platform\n * archive filter, drawn identically in every Matrx client so the control a\n * person learns on one surface is recognisable on all of them.\n */\n archive: {\n paths: [\n \"M3 3h18a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z\",\n \"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\",\n \"M10 12h4\",\n ],\n },\n circleCheck: {\n paths: [\"m9 12 2 2 4-4\"],\n circles: [{ cx: 12, cy: 12, r: 10 }],\n },\n} satisfies Record<string, AgentCatalogIconShape>;\n\nexport type AgentCatalogIconName = keyof typeof SHAPES;\n\n/** The glyph table, widened so every shape reads uniformly at a call site. */\nexport const ICON_PATHS: Record<AgentCatalogIconName, AgentCatalogIconShape> =\n SHAPES;\n\n/** Every glyph the picker can draw. Both entries must cover all of them. */\nexport const ICON_NAMES = Object.keys(ICON_PATHS) as AgentCatalogIconName[];\n","/**\n * catalog/native/FavoriteAgentButton.tsx — the native twin of\n * `catalog/react/FavoriteAgentButton.tsx`. Same one write\n * (`catalog.setFavorite` → `platform.user_entity_state`, optimistic and\n * rolled back by the store). A star is per-person, so every row is starrable.\n */\n\nimport { useCallback } from \"react\";\nimport { Pressable } from \"react-native\";\n\nimport { useAgentCatalog, useAgentCatalogState } from \"../shared/context\";\nimport type { AgentCatalogState } from \"../store\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\n\nexport interface FavoriteAgentButtonProps {\n id: string;\n size?: number;\n disabled?: boolean;\n}\n\nexport function FavoriteAgentButton({\n id,\n size = 18,\n disabled,\n}: FavoriteAgentButtonProps) {\n const catalog = useAgentCatalog();\n const theme = useAgentCatalogNativeTheme();\n const select = useCallback((state: AgentCatalogState) => state.byId[id], [id]);\n const record = useAgentCatalogState(select);\n const isFavorite = record?.isFavorite ?? false;\n // Per-person star (platform.user_entity_state): every visible agent is\n // starrable, shared and system agents included.\n const inert = Boolean(disabled);\n\n const title = isFavorite ? \"Remove from favorites\" : \"Add to favorites\";\n\n return (\n <Pressable\n onPress={() => {\n if (inert) return;\n void catalog.setFavorite(id, !isFavorite).catch(() => {\n // Already rolled back and screamed by the store.\n });\n }}\n disabled={inert}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={title}\n accessibilityState={{ disabled: inert, selected: isFavorite }}\n style={{ opacity: inert ? 0.4 : 1 }}\n >\n <AgentIcon\n name=\"star\"\n size={size}\n filled={isFavorite}\n color={isFavorite ? theme.colors.favorite : theme.colors.textFaint}\n report={catalog.errorSink}\n />\n </Pressable>\n );\n}\n","/**\n * catalog/native/AgentListContent.tsx — the native twin of\n * `catalog/react/AgentListContent.tsx`.\n *\n * Same body, in the same order: search, the ownership tabs with counts, the\n * filter bar, the PERSISTENT drift banner, the mandate Default row, the\n * pinned Current agent row, the filtered list, and the footer count with its\n * \"Clear search\" control.\n *\n * 🚨 THE DRIFT SCREAM is a banner here too — not a toast, not a console line.\n * It holds its space until a person dismisses it, exactly as on the web; the\n * `notifier` port fires beside it, never instead of it.\n */\n\nimport { FlatList, Pressable, StyleSheet, Text, View } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport type { AgentListTabCounts } from \"../shared/useAgentListCore\";\nimport type { UseAgentConsumerReturn } from \"../shared/useAgentConsumer\";\nimport type { DefaultRowState } from \"../default-row-types\";\nimport { agentListEmptyLabel, agentListFooterLabel } from \"../labels\";\nimport type { AgentSummary, AgentTab } from \"../types\";\nimport { AgentFilterBar } from \"./AgentFilterBar\";\nimport { AgentListTabs } from \"./AgentListTabs\";\nimport { AgentRow } from \"./AgentRow\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\nimport { SearchInput } from \"./primitives\";\n\ntype ListItem =\n | { key: string; kind: \"label\"; text: string }\n | { key: string; kind: \"divider\" }\n | { key: string; kind: \"row\"; agent: AgentSummary; forceActive: boolean };\n\nexport interface AgentListContentProps {\n agents: AgentSummary[];\n isLoading: boolean;\n consumer: UseAgentConsumerReturn;\n activeAgentId: string | null;\n allCategories: string[];\n allTags: string[];\n onSelectAgent: (agent: AgentSummary) => void;\n onDetailPress: (agent: AgentSummary) => void;\n onFilterChipPress: (panel: \"sort\" | \"categories\" | \"tags\") => void;\n onReset: () => void;\n activeFilterCount: number;\n tabCounts: AgentListTabCounts;\n visibleTabs?: readonly AgentTab[] | undefined;\n systemTabLabel?: string | undefined;\n pinnedAgent?: AgentSummary | null | undefined;\n defaultRow?: DefaultRowState | null | undefined;\n autoFocusSearch?: boolean;\n /**\n * Rows the ARCHIVE FILTER is keeping off this screen — from\n * `useAgentListCore`. The footer names them, exactly as on the web.\n */\n archivedHiddenCount?: number | undefined;\n}\n\nexport function AgentListContent({\n agents,\n isLoading,\n consumer,\n activeAgentId,\n allCategories,\n allTags,\n onSelectAgent,\n onDetailPress,\n onFilterChipPress,\n onReset,\n activeFilterCount,\n tabCounts,\n visibleTabs,\n systemTabLabel,\n pinnedAgent = null,\n defaultRow = null,\n autoFocusSearch = false,\n archivedHiddenCount = 0,\n}: AgentListContentProps) {\n const catalog = useAgentCatalog();\n const theme = useAgentCatalogNativeTheme();\n const { labels, errorSink } = catalog;\n const emptyLabel =\n catalog.getUserIdOrNull() === null\n ? labels.emptySignedOut\n : agentListEmptyLabel(consumer.tab, labels);\n const defaultAgent = defaultRow?.row ?? null;\n\n const items: ListItem[] = [];\n if (defaultAgent) {\n items.push({ key: \"label-default\", kind: \"label\", text: \"Default\" });\n items.push({\n key: `default-${defaultAgent.id}`,\n kind: \"row\",\n agent: defaultAgent,\n forceActive: defaultAgent.id === activeAgentId,\n });\n items.push({ key: \"divider-default\", kind: \"divider\" });\n }\n if (pinnedAgent) {\n items.push({\n key: \"label-pinned\",\n kind: \"label\",\n text: labels.currentAgentHeading,\n });\n items.push({\n key: `pinned-${pinnedAgent.id}`,\n kind: \"row\",\n agent: pinnedAgent,\n forceActive: true,\n });\n items.push({ key: \"divider-pinned\", kind: \"divider\" });\n }\n for (const agent of agents) {\n items.push({\n key: agent.id,\n kind: \"row\",\n agent,\n forceActive: agent.id === activeAgentId,\n });\n }\n\n const hairline = {\n height: StyleSheet.hairlineWidth,\n backgroundColor: theme.colors.border,\n };\n\n return (\n <View style={[styles.container, { backgroundColor: theme.colors.background }]}>\n <View style={{ paddingHorizontal: theme.spacing.sm, paddingBottom: 6 }}>\n <SearchInput\n value={consumer.searchTerm}\n onChange={consumer.setSearchTerm}\n placeholder={labels.searchPlaceholder}\n autoFocus={autoFocusSearch}\n />\n </View>\n\n <AgentListTabs\n consumer={consumer}\n tabCounts={tabCounts}\n visibleTabs={visibleTabs}\n systemTabLabel={systemTabLabel}\n />\n\n <AgentFilterBar\n consumer={consumer}\n allCategories={allCategories}\n allTags={allTags}\n activeFilterCount={activeFilterCount}\n onFilterChipPress={onFilterChipPress}\n onReset={onReset}\n />\n\n {defaultRow?.drift && (\n <View\n accessibilityRole=\"alert\"\n style={[\n styles.banner,\n {\n marginHorizontal: theme.spacing.sm,\n borderRadius: theme.radius.md,\n backgroundColor: theme.colors.driftBackground,\n borderColor: theme.colors.driftBorder,\n },\n ]}\n >\n <AgentIcon\n name=\"alertTriangle\"\n size={14}\n color={theme.colors.driftForeground}\n report={errorSink}\n />\n <Text\n style={{\n flex: 1,\n color: theme.colors.driftForeground,\n fontSize: theme.fontSize.sm,\n }}\n >\n {defaultRow.drift}\n </Text>\n <Pressable\n onPress={() => catalog.dismissDefaultRowDrift(defaultRow.mandateKey)}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Dismiss\"\n hitSlop={8}\n >\n <AgentIcon\n name=\"x\"\n size={12}\n color={theme.colors.driftForeground}\n report={errorSink}\n />\n </Pressable>\n </View>\n )}\n {defaultRow?.error && (\n <View\n accessibilityRole=\"alert\"\n style={[\n styles.banner,\n {\n marginHorizontal: theme.spacing.sm,\n borderRadius: theme.radius.md,\n backgroundColor: theme.colors.driftBackground,\n borderColor: theme.colors.driftBorder,\n },\n ]}\n >\n <AgentIcon\n name=\"alertTriangle\"\n size={14}\n color={theme.colors.driftForeground}\n report={errorSink}\n />\n <Text\n style={{\n flex: 1,\n color: theme.colors.driftForeground,\n fontSize: theme.fontSize.sm,\n }}\n >\n {defaultRow.error}\n </Text>\n </View>\n )}\n\n <View style={hairline} />\n\n {isLoading ? (\n <View style={styles.centered}>\n <AgentIcon\n name=\"loader\"\n size={16}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <Text style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.md }}>\n {labels.loading}\n </Text>\n </View>\n ) : items.length === 0 ? (\n <View style={styles.centered}>\n <Text style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.md }}>\n {emptyLabel}\n </Text>\n </View>\n ) : (\n <FlatList\n style={styles.list}\n data={items}\n keyExtractor={(item) => item.key}\n keyboardShouldPersistTaps=\"handled\"\n renderItem={({ item }) => {\n if (item.kind === \"divider\") return <View style={hairline} />;\n if (item.kind === \"label\") {\n return (\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.xs,\n fontWeight: \"600\",\n textTransform: \"uppercase\",\n paddingHorizontal: theme.spacing.md,\n paddingTop: 8,\n paddingBottom: 2,\n }}\n >\n {item.text}\n </Text>\n );\n }\n return (\n <AgentRow\n agent={item.agent}\n isActive={item.forceActive}\n onPress={() => onSelectAgent(item.agent)}\n onDetailPress={() => onDetailPress(item.agent)}\n />\n );\n }}\n ListFooterComponent={\n agents.length === 0 && (pinnedAgent || defaultAgent) ? (\n <View style={styles.centered}>\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.md,\n }}\n >\n {emptyLabel}\n </Text>\n </View>\n ) : undefined\n }\n />\n )}\n\n <View style={hairline} />\n <View style={[styles.footer, { paddingHorizontal: theme.spacing.md }]}>\n <Text\n testID=\"agent-list-footer\"\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.xs,\n fontVariant: [\"tabular-nums\"],\n }}\n >\n {agentListFooterLabel({\n count: agents.length,\n archFilter: consumer.archFilter,\n archivedHiddenCount,\n })}\n </Text>\n {consumer.searchTerm.length > 0 && (\n <Pressable\n onPress={() => consumer.setSearchTerm(\"\")}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear search\"\n hitSlop={8}\n >\n <Text\n style={{ color: theme.colors.textMuted, fontSize: theme.fontSize.xs }}\n >\n Clear search\n </Text>\n </Pressable>\n )}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, minHeight: 0 },\n list: { flex: 1, minHeight: 0 },\n banner: {\n flexDirection: \"row\",\n alignItems: \"flex-start\",\n gap: 8,\n marginBottom: 6,\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderWidth: StyleSheet.hairlineWidth,\n },\n centered: {\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n paddingVertical: 32,\n },\n footer: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n paddingVertical: 8,\n },\n});\n","/**\n * catalog/native/AgentFilterBar.tsx — the native twin of\n * `catalog/react/AgentFilterBar.tsx`.\n *\n * The filter bar is IDENTICAL on every tab, system included, and identical to\n * the web bar: sort, the three-state favourites cycle (all → yes → no), THE\n * THREE-STATE ARCHIVE FILTER (hide archived → show all → archived only), the\n * category chip when there are categories, the tag chip when there are tags,\n * and the reset control once anything is active.\n *\n * 🚨 The archive control is not optional here either — THE ARCHIVED-ITEMS LAW\n * clause 4 makes it a class across \"every client (web, studio, dashboard,\n * extension, desktop, VS Code, and any future one)\". Native gets the same\n * control, the same three states, the same words.\n */\n\nimport { Pressable, ScrollView, StyleSheet } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport { SORT_OPTIONS, nextArchFilter } from \"../types\";\nimport {\n agentArchiveFilterChipLabel,\n agentArchiveFilterControlLabel,\n} from \"../labels\";\nimport type { UseAgentConsumerReturn } from \"../shared/useAgentConsumer\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\nimport { FilterChip } from \"./primitives\";\n\nexport interface AgentFilterBarProps {\n consumer: UseAgentConsumerReturn;\n allCategories: string[];\n allTags: string[];\n activeFilterCount: number;\n onFilterChipPress: (panel: \"sort\" | \"categories\" | \"tags\") => void;\n onReset: () => void;\n}\n\nexport function AgentFilterBar({\n consumer,\n allCategories,\n allTags,\n activeFilterCount,\n onFilterChipPress,\n onReset,\n}: AgentFilterBarProps) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={[\n styles.bar,\n { paddingHorizontal: theme.spacing.sm },\n ]}\n >\n <FilterChip\n icon=\"arrowUpDown\"\n label={\n SORT_OPTIONS.find((o) => o.value === consumer.sortBy)?.label ?? \"Sort\"\n }\n active={consumer.sortBy !== \"updated-desc\"}\n onPress={() => onFilterChipPress(\"sort\")}\n />\n <FilterChip\n icon=\"star\"\n label={consumer.favFilter === \"no\" ? \"No Favs\" : \"Favs\"}\n active={consumer.favFilter !== \"all\"}\n onPress={() => {\n const next =\n consumer.favFilter === \"all\"\n ? \"yes\"\n : consumer.favFilter === \"yes\"\n ? \"no\"\n : \"all\";\n consumer.setFavFilter(next);\n }}\n />\n <FilterChip\n icon=\"archive\"\n label={agentArchiveFilterChipLabel(consumer.archFilter)}\n active={consumer.archFilter !== consumer.archFilterDefault}\n accessibilityLabel={agentArchiveFilterControlLabel(consumer.archFilter)}\n testID=\"agent-archive-filter\"\n onPress={() => consumer.setArchFilter(nextArchFilter(consumer.archFilter))}\n />\n {allCategories.length > 0 && (\n <FilterChip\n icon=\"folder\"\n label={\n consumer.includedCats.length > 0\n ? `${consumer.includedCats.length}`\n : \"Category\"\n }\n active={consumer.includedCats.length > 0}\n onPress={() => onFilterChipPress(\"categories\")}\n />\n )}\n {allTags.length > 0 && (\n <FilterChip\n icon=\"tag\"\n label={\n consumer.includedTags.length > 0\n ? `${consumer.includedTags.length}`\n : \"Tags\"\n }\n active={consumer.includedTags.length > 0}\n onPress={() => onFilterChipPress(\"tags\")}\n />\n )}\n {activeFilterCount > 0 && (\n <Pressable\n onPress={onReset}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Reset filters\"\n hitSlop={8}\n style={({ pressed }) => [\n styles.reset,\n {\n borderRadius: theme.radius.sm,\n backgroundColor: pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n },\n ]}\n >\n <AgentIcon\n name=\"rotateCcw\"\n size={12}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n </Pressable>\n )}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n bar: { flexDirection: \"row\", alignItems: \"center\", gap: 4, paddingBottom: 6 },\n reset: {\n height: 28,\n paddingHorizontal: 8,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n});\n","/**\n * catalog/native/primitives.tsx — @ai-matrx/agents/catalog/native\n *\n * The native twins of `catalog/react/primitives.tsx`: the same five controls\n * (`SearchInput`, `FilterChip`, `OptionRow`, `CheckRow`, `SidePanelHeader`),\n * the same props, the same behaviour — drawn with React Native primitives and\n * `StyleSheet` instead of DOM elements and Tailwind classes.\n *\n * Colour comes ONLY from the theme (C26); there is not one literal in here.\n */\n\nimport { Pressable, StyleSheet, Text, TextInput, View } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport { AgentIcon, type AgentCatalogIconName } from \"./icons\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\n\nexport function SearchInput({\n value,\n onChange,\n placeholder,\n autoFocus = false,\n}: {\n value: string;\n onChange: (v: string) => void;\n placeholder: string;\n autoFocus?: boolean;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n return (\n <View\n style={[\n styles.searchWrap,\n {\n backgroundColor: theme.colors.surface,\n borderColor: theme.colors.border,\n borderRadius: theme.radius.md,\n paddingHorizontal: theme.spacing.sm,\n },\n ]}\n >\n <AgentIcon\n name=\"search\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n <TextInput\n value={value}\n onChangeText={onChange}\n placeholder={placeholder}\n placeholderTextColor={theme.colors.textFaint}\n autoFocus={autoFocus}\n autoCorrect={false}\n autoCapitalize=\"none\"\n returnKeyType=\"search\"\n accessibilityLabel={placeholder}\n style={[styles.searchInput, { color: theme.colors.text }]}\n />\n {value.length > 0 && (\n <Pressable\n onPress={() => onChange(\"\")}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear search\"\n hitSlop={8}\n >\n <AgentIcon\n name=\"x\"\n size={13}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n </Pressable>\n )}\n </View>\n );\n}\n\nexport function FilterChip({\n icon,\n label,\n active,\n onPress,\n accessibilityLabel,\n testID,\n}: {\n icon: AgentCatalogIconName;\n label: string;\n active: boolean;\n onPress: () => void;\n /** Accessible name when the visible label alone would not say the state. */\n accessibilityLabel?: string;\n /** Stable hook so a shell test can measure the control, not a style. */\n testID?: string;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n const tint = active ? theme.colors.primary : theme.colors.textMuted;\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active }}\n accessibilityLabel={accessibilityLabel ?? label}\n {...(testID ? { testID } : {})}\n style={({ pressed }) => [\n styles.chip,\n {\n borderRadius: theme.radius.sm,\n backgroundColor: active\n ? theme.colors.primarySoft\n : pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n borderColor: active ? theme.colors.primary : \"transparent\",\n },\n ]}\n >\n <AgentIcon name={icon} size={12} color={tint} report={errorSink} />\n <Text style={{ color: tint, fontSize: theme.fontSize.sm, fontWeight: \"500\" }}>\n {label}\n </Text>\n </Pressable>\n );\n}\n\nexport function OptionRow({\n label,\n selected,\n onPress,\n}: {\n label: string;\n selected: boolean;\n onPress: () => void;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityState={{ selected }}\n style={({ pressed }) => [\n styles.optionRow,\n {\n paddingHorizontal: theme.spacing.md,\n backgroundColor: pressed ? theme.colors.surfacePressed : \"transparent\",\n },\n ]}\n >\n <Text\n style={{\n flex: 1,\n color: selected ? theme.colors.primary : theme.colors.text,\n fontSize: theme.fontSize.md,\n fontWeight: selected ? \"600\" : \"400\",\n }}\n >\n {label}\n </Text>\n {selected && (\n <AgentIcon\n name=\"check\"\n size={14}\n color={theme.colors.primary}\n report={errorSink}\n />\n )}\n </Pressable>\n );\n}\n\nexport function CheckRow({\n label,\n checked,\n onPress,\n}: {\n label: string;\n checked: boolean;\n onPress: () => void;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"checkbox\"\n accessibilityState={{ checked }}\n style={({ pressed }) => [\n styles.checkRow,\n {\n paddingHorizontal: theme.spacing.md,\n backgroundColor: pressed ? theme.colors.surfacePressed : \"transparent\",\n },\n ]}\n >\n <View\n style={[\n styles.checkBox,\n {\n borderRadius: theme.radius.sm,\n borderColor: checked ? theme.colors.primary : theme.colors.border,\n backgroundColor: checked ? theme.colors.primary : \"transparent\",\n },\n ]}\n >\n {checked && (\n <AgentIcon\n name=\"check\"\n size={10}\n color={theme.colors.primaryForeground}\n report={errorSink}\n />\n )}\n </View>\n <Text\n numberOfLines={1}\n style={{ flex: 1, color: theme.colors.text, fontSize: theme.fontSize.md }}\n >\n {label}\n </Text>\n </Pressable>\n );\n}\n\nexport function SidePanelHeader({\n title,\n onClose,\n}: {\n title: string;\n onClose: () => void;\n}) {\n const theme = useAgentCatalogNativeTheme();\n const { errorSink } = useAgentCatalog();\n return (\n <View\n style={[\n styles.panelHeader,\n {\n paddingHorizontal: theme.spacing.md,\n borderBottomColor: theme.colors.border,\n },\n ]}\n >\n <Text\n style={{\n color: theme.colors.text,\n fontSize: theme.fontSize.md,\n fontWeight: \"600\",\n }}\n >\n {title}\n </Text>\n <Pressable\n onPress={onClose}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close\"\n hitSlop={8}\n >\n <AgentIcon\n name=\"x\"\n size={14}\n color={theme.colors.textMuted}\n report={errorSink}\n />\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n searchWrap: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 6,\n height: 36,\n borderWidth: StyleSheet.hairlineWidth,\n },\n searchInput: {\n flex: 1,\n minWidth: 0,\n padding: 0,\n fontSize: 15,\n },\n chip: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 4,\n height: 28,\n paddingHorizontal: 8,\n borderWidth: StyleSheet.hairlineWidth,\n },\n optionRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingVertical: 10,\n },\n checkRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n paddingVertical: 8,\n },\n checkBox: {\n width: 18,\n height: 18,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: 1,\n },\n panelHeader: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n});\n","/**\n * catalog/native/AgentListTabs.tsx — the native twin of\n * `catalog/react/AgentListTabs.tsx`. Same four tabs, same order, same labels\n * (`labels.publicTab` / `systemTabLabel`), same counts, same `visibleTabs`\n * restriction. A tab strip that offered a different set on mobile than on the\n * web is exactly the drift this package exists to end.\n */\n\nimport { Pressable, ScrollView, StyleSheet, Text } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport type { AgentListTabCounts } from \"../shared/useAgentListCore\";\nimport type { UseAgentConsumerReturn } from \"../shared/useAgentConsumer\";\nimport type { AgentTab } from \"../types\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\n\nexport interface AgentListTabsProps {\n consumer: UseAgentConsumerReturn;\n tabCounts: AgentListTabCounts;\n visibleTabs?: readonly AgentTab[] | undefined;\n /** Label for the builtin tab. Users see \"Public\"; admin surfaces \"System\". */\n systemTabLabel?: string | undefined;\n}\n\nexport function AgentListTabs({\n consumer,\n tabCounts,\n visibleTabs,\n systemTabLabel,\n}: AgentListTabsProps) {\n const { labels } = useAgentCatalog();\n const theme = useAgentCatalogNativeTheme();\n\n const tabs: {\n value: AgentTab;\n label: string;\n countKey: keyof AgentListTabCounts;\n }[] = [\n { value: \"mine\", label: \"Mine\", countKey: \"mine\" },\n { value: \"shared\", label: \"Shared\", countKey: \"shared\" },\n { value: \"all\", label: \"All\", countKey: \"all\" },\n { value: \"system\", label: labels.publicTab, countKey: \"system\" },\n ];\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n accessibilityRole=\"tablist\"\n accessibilityLabel=\"Agent ownership\"\n contentContainerStyle={[\n styles.strip,\n { paddingHorizontal: theme.spacing.sm },\n ]}\n >\n {tabs\n .filter(({ value }) => !visibleTabs || visibleTabs.includes(value))\n .map(({ value, label: baseLabel, countKey }) => {\n const label =\n value === \"system\" ? (systemTabLabel ?? baseLabel) : baseLabel;\n const active = consumer.tab === value;\n const count = tabCounts[countKey];\n return (\n <Pressable\n key={value}\n onPress={() => consumer.setTab(value)}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: active }}\n accessibilityLabel={`${label}, ${count}`}\n style={({ pressed }) => [\n styles.tab,\n {\n borderRadius: theme.radius.md,\n backgroundColor: active\n ? theme.colors.primary\n : pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n },\n ]}\n >\n <Text\n style={{\n color: active\n ? theme.colors.primaryForeground\n : theme.colors.textMuted,\n fontSize: theme.fontSize.sm,\n fontWeight: \"500\",\n }}\n >\n {label}\n </Text>\n <Text\n style={{\n color: active\n ? theme.colors.primaryForeground\n : theme.colors.textMuted,\n fontSize: theme.fontSize.sm,\n opacity: 0.8,\n fontVariant: [\"tabular-nums\"],\n }}\n >\n {count}\n </Text>\n </Pressable>\n );\n })}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n strip: { flexDirection: \"row\", alignItems: \"center\", gap: 4, paddingBottom: 6 },\n tab: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 4,\n paddingHorizontal: 10,\n paddingVertical: 6,\n },\n});\n","/**\n * catalog/native/AgentRow.tsx — the native twin of `catalog/react/AgentRow.tsx`.\n *\n * Same content, same order, same badges: favourite star, name, the Orchestra\n * conductor marker with its member count, and the origin badge (`system` for a\n * builtin, `shared` for a row you do not own). Seams: the web row's\n * `LinkComponent` anchor (which exists for cmd-click, an affordance React\n * Native does not have) becomes an ordinary `Pressable`; Tailwind classes\n * become themed styles.\n */\n\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\n\nimport { useAgentCatalog } from \"../shared/context\";\nimport { orchestraDelegatesLine, orchestraLabel } from \"../orchestra\";\nimport type { AgentSummary } from \"../types\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { AgentIcon } from \"./icons\";\n\nexport interface AgentRowProps {\n agent: AgentSummary;\n isActive: boolean;\n onPress: () => void;\n onDetailPress: () => void;\n}\n\nexport function AgentRow({\n agent,\n isActive,\n onPress,\n onDetailPress,\n}: AgentRowProps) {\n const { labels, errorSink } = useAgentCatalog();\n const theme = useAgentCatalogNativeTheme();\n\n return (\n <View\n testID={`agent-row-${agent.id}`}\n style={[\n styles.row,\n isActive ? { backgroundColor: theme.colors.primarySoft } : null,\n ]}\n >\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: isActive }}\n accessibilityLabel={agent.name || \"Untitled\"}\n style={({ pressed }) => [\n styles.main,\n {\n paddingHorizontal: theme.spacing.md,\n backgroundColor: pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n },\n ]}\n >\n {agent.isFavorite && (\n <AgentIcon\n name=\"star\"\n size={12}\n filled\n color={theme.colors.favorite}\n report={errorSink}\n />\n )}\n <Text\n numberOfLines={1}\n style={{\n flexShrink: 1,\n color: isActive ? theme.colors.primary : theme.colors.text,\n fontSize: theme.fontSize.md,\n fontWeight: \"500\",\n }}\n >\n {agent.name || \"Untitled\"}\n </Text>\n {/* The conductor marker. An Orchestra runs its WHOLE ensemble from\n this one choice, so the row says so where the choice is made. */}\n {agent.orchestra && (\n <View\n accessibilityLabel={\n orchestraDelegatesLine(agent.orchestra) ??\n orchestraLabel(agent.orchestra)\n }\n style={[\n styles.badge,\n {\n backgroundColor: theme.colors.primarySoft,\n borderRadius: theme.radius.sm,\n },\n ]}\n >\n <AgentIcon\n name=\"music4\"\n size={10}\n color={theme.colors.primary}\n report={errorSink}\n />\n <Text\n style={{ color: theme.colors.primary, fontSize: theme.fontSize.xs }}\n >\n {agent.orchestra.memberCount}\n </Text>\n </View>\n )}\n <View style={styles.spacer} />\n {/* ARCHIVED rows stay offered (the archived-items law) and say so. */}\n {agent.isArchived ? (\n <Text\n testID={`agent-archived-badge-${agent.id}`}\n style={[\n styles.originBadge,\n {\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.sm,\n fontSize: theme.fontSize.xs,\n },\n ]}\n >\n {labels.archivedBadge}\n </Text>\n ) : null}\n {/* Origin badge. On a blended list this is the only thing that tells\n a system agent from your own. */}\n {agent.agentType === \"builtin\" ? (\n <Text\n style={[\n styles.originBadge,\n {\n color: theme.colors.primary,\n backgroundColor: theme.colors.primarySoft,\n borderRadius: theme.radius.sm,\n fontSize: theme.fontSize.xs,\n },\n ]}\n >\n {labels.systemBadge}\n </Text>\n ) : agent.isOwner === false ? (\n <Text\n style={[\n styles.originBadge,\n {\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.sm,\n fontSize: theme.fontSize.xs,\n },\n ]}\n >\n shared\n </Text>\n ) : null}\n </Pressable>\n <Pressable\n onPress={onDetailPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`Show details for ${agent.name || \"Untitled\"}`}\n hitSlop={6}\n style={({ pressed }) => [\n styles.detailButton,\n {\n backgroundColor: pressed\n ? theme.colors.surfacePressed\n : \"transparent\",\n },\n ]}\n >\n <AgentIcon\n name=\"chevronRight\"\n size={16}\n color={theme.colors.textFaint}\n report={errorSink}\n />\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: { flexDirection: \"row\", alignItems: \"stretch\" },\n main: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 6,\n paddingVertical: 10,\n minWidth: 0,\n },\n spacer: { flex: 1 },\n badge: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 2,\n paddingHorizontal: 4,\n paddingVertical: 1,\n },\n originBadge: {\n overflow: \"hidden\",\n paddingHorizontal: 4,\n paddingVertical: 1,\n fontWeight: \"500\",\n },\n detailButton: {\n width: 40,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n});\n","/**\n * catalog/native/AgentSubView.tsx — the native twin of\n * `catalog/react/AgentMobileSubView.tsx`: the sort / categories / tags panels\n * the filter chips open.\n *\n * Carries the SAME \"Clear (n)\" fix the web panels carry (C22): the clear\n * control writes the WHOLE inclusion set in one call (`setIncludedCats` /\n * `setIncludedTags`) rather than looping a toggle that recomputes from a stale\n * render snapshot and therefore removes exactly one value.\n */\n\nimport { Pressable, ScrollView, StyleSheet, Text, View } from \"react-native\";\n\nimport { SORT_OPTIONS } from \"../types\";\nimport type { UseAgentConsumerReturn } from \"../shared/useAgentConsumer\";\nimport { useAgentCatalogNativeTheme } from \"./context\";\nimport { CheckRow, OptionRow, SearchInput, SidePanelHeader } from \"./primitives\";\n\nexport type AgentSubViewName = \"sort\" | \"categories\" | \"tags\";\n\nexport interface AgentSubViewProps {\n view: AgentSubViewName;\n consumer: UseAgentConsumerReturn;\n allCategories: string[];\n allTags: string[];\n search: string;\n setSearch: (value: string) => void;\n onBack: () => void;\n}\n\nexport function AgentSubView({\n view,\n consumer,\n allCategories,\n allTags,\n search,\n setSearch,\n onBack,\n}: AgentSubViewProps) {\n const theme = useAgentCatalogNativeTheme();\n const title =\n view === \"sort\" ? \"Sort\" : view === \"categories\" ? \"Categories\" : \"Tags\";\n\n const values = view === \"categories\" ? allCategories : allTags;\n const included =\n view === \"categories\" ? consumer.includedCats : consumer.includedTags;\n const filtered = values.filter(\n (value) => !search || value.toLowerCase().includes(search.toLowerCase()),\n );\n\n return (\n <View style={styles.container}>\n <SidePanelHeader title={title} onClose={onBack} />\n {view === \"sort\" ? (\n <ScrollView style={styles.list}>\n {SORT_OPTIONS.map((option) => (\n <OptionRow\n key={option.value}\n label={option.label}\n selected={consumer.sortBy === option.value}\n onPress={() => {\n consumer.setSortBy(option.value);\n onBack();\n }}\n />\n ))}\n </ScrollView>\n ) : (\n <>\n <View style={{ paddingHorizontal: theme.spacing.sm, paddingVertical: 6 }}>\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder={\n view === \"categories\" ? \"Filter categories...\" : \"Filter tags...\"\n }\n />\n </View>\n {included.length > 0 && (\n <Pressable\n onPress={() =>\n view === \"categories\"\n ? consumer.setIncludedCats([])\n : consumer.setIncludedTags([])\n }\n accessibilityRole=\"button\"\n accessibilityLabel={`Clear ${included.length} filters`}\n style={{\n marginHorizontal: theme.spacing.sm,\n marginBottom: 4,\n paddingVertical: 6,\n }}\n >\n <Text\n style={{\n color: theme.colors.primary,\n fontSize: theme.fontSize.sm,\n fontWeight: \"600\",\n }}\n >\n Clear ({included.length})\n </Text>\n </Pressable>\n )}\n <ScrollView style={styles.list}>\n {filtered.length === 0 ? (\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: theme.fontSize.md,\n textAlign: \"center\",\n paddingVertical: 24,\n }}\n >\n {view === \"categories\" ? \"No categories\" : \"No tags\"}\n </Text>\n ) : (\n filtered.map((value) => (\n <CheckRow\n key={value}\n label={value}\n checked={included.includes(value)}\n onPress={() =>\n view === \"categories\"\n ? consumer.toggleCategory(value)\n : consumer.toggleTag(value)\n }\n />\n ))\n )}\n </ScrollView>\n </>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, minHeight: 0 },\n list: { flex: 1, minHeight: 0 },\n});\n","/**\n * catalog/native/AgentListInlinePicker.tsx — the embedded native picker.\n *\n * Identical content to `AgentListSheet`, with no sheet chrome and no heading:\n * for a screen that dedicates a region to agent selection. Same core, same\n * rows, same order — the two shells differ only in what wraps them.\n */\n\nimport { StyleSheet, View } from \"react-native\";\n\nimport { AgentPickerBody, type AgentPickerProps } from \"./AgentPickerBody\";\n\nexport type AgentListInlinePickerProps = AgentPickerProps;\n\nexport function AgentListInlinePicker(props: AgentListInlinePickerProps) {\n return (\n <View style={styles.fill}>\n <AgentPickerBody {...props} />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1, minHeight: 0 },\n});\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react_native","import_react","import_react_native","import_react","import_react","import_react_native","import_react_native","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","isFavorite","import_jsx_runtime","import_react_native","import_react_native","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","styles"]}
|