@burdenoff/microfe-botmanor 2026.1109.1 → 2026.1110.1
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/dist/botlit/BotlitRoutes.js +34 -45
- package/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/components/Badge.js +2 -2
- package/dist/botlit/components/Badge.js.map +1 -1
- package/dist/botlit/components/ChannelSelectorSheet.js +4 -4
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
- package/dist/botlit/components/LoadMore.d.ts +9 -0
- package/dist/botlit/components/LoadMore.js +22 -0
- package/dist/botlit/components/LoadMore.js.map +1 -0
- package/dist/botlit/components/index.d.ts +1 -0
- package/dist/botlit/hooks/index.d.ts +1 -2
- package/dist/botlit/hooks/index.js +15 -16
- package/dist/botlit/hooks/internal/workspaceGateway.d.ts +47 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +59 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useAgents.d.ts +2 -6
- package/dist/botlit/hooks/useAgents.js +71 -95
- package/dist/botlit/hooks/useAgents.js.map +1 -1
- package/dist/botlit/hooks/useBots.d.ts +2 -6
- package/dist/botlit/hooks/useBots.js +51 -75
- package/dist/botlit/hooks/useBots.js.map +1 -1
- package/dist/botlit/hooks/useBuckets.d.ts +5 -0
- package/dist/botlit/hooks/useBuckets.js +72 -38
- package/dist/botlit/hooks/useBuckets.js.map +1 -1
- package/dist/botlit/hooks/useExecutions.d.ts +2 -2
- package/dist/botlit/hooks/useExecutions.js +30 -34
- package/dist/botlit/hooks/useExecutions.js.map +1 -1
- package/dist/botlit/hooks/useStore.d.ts +3 -3
- package/dist/botlit/hooks/useStore.js +41 -50
- package/dist/botlit/hooks/useStore.js.map +1 -1
- package/dist/botlit/index.d.ts +0 -1
- package/dist/botlit/index.js +5 -6
- package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +1 -1
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +157 -156
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js +24 -24
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +147 -146
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketDetailPage.d.ts +2 -0
- package/dist/botlit/pages/BucketDetailPage.js +251 -0
- package/dist/botlit/pages/BucketDetailPage.js.map +1 -0
- package/dist/botlit/pages/BucketsPage.js +3 -3
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +2 -2
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +141 -134
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +43 -36
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +1 -1
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +2 -2
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.js +1 -1
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +150 -143
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/pages/index.d.ts +1 -2
- package/dist/generated/wspace-operations.js +67 -67
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/index.js +5 -6
- package/package.json +1 -1
- package/dist/botlit/hooks/useConversations.d.ts +0 -42
- package/dist/botlit/hooks/useConversations.js +0 -63
- package/dist/botlit/hooks/useConversations.js.map +0 -1
- package/dist/botlit/pages/ConversationDetailPage.d.ts +0 -2
- package/dist/botlit/pages/ConversationsPage.d.ts +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStore.js","names":["LIST_LIMIT","INSTALL_PACKAGE_FIELDS","fieldsOf","UPDATE_INSTALLED_FIELDS","NO_PACKAGES","NO_INSTALLED","manifestSection","section","pkg","key","manifestString","value","storePackageName","storePackageDescription","selectPackages","data","selectInstalled","useStorePackages","search","filter","kind","sortBy","variables","useMemo","select","useCallback","rows","sorted","a","b","useWorkspaceQuery","ListStorePackagesDocument","useStorePackage","slug","GetStorePackageBySlugDocument","useInstalledPackages","workspaceId","useWorkspaceId","ListInstalledPackagesDocument","useInstallPackage","buildMutationInput","input","install","state","useWorkspaceMutation","InstallPackageDocument","useUpdateInstalledPackage","update","UpdateInstalledPackageDocument","installedId","useUninstallPackage","uninstall","UninstallPackageDocument","usePinPackageVersion","pinnedByEnv","environment","version"],"sources":["../../../src/botlit/hooks/useStore.ts"],"sourcesContent":["/**\n * Store Hooks\n * @module botlit/hooks\n *\n * Backed by the live `listStorePackages` / `getStorePackageBySlug` /\n * `listInstalledPackages` operations and the install/update/uninstall/fork\n * mutations on wspace-botlit-svc.\n *\n * A `StorePackage` carries its human metadata (name, description, author,\n * tags…) inside the `manifest` JSON — the helpers below read it safely rather\n * than assuming top-level columns that the service does not expose.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n ForkInstalledPackageDocument,\n GetInstalledPackageDocument,\n GetStorePackageBySlugDocument,\n InstallPackageDocument,\n ListInstalledPackagesDocument,\n ListStorePackagesDocument,\n UninstallPackageDocument,\n UpdateInstalledPackageDocument,\n type ForkInstalledPackageMutation,\n type GetInstalledPackageQuery,\n type GetStorePackageBySlugQuery,\n type InstallPackageMutation,\n type ListInstalledPackagesQuery,\n type ListStorePackagesQuery,\n type UninstallPackageMutation,\n type UpdateInstalledPackageMutation,\n} from '../../generated/wspace-operations';\nimport type {\n ForkInstalledPackageInput,\n InstallPackageInput,\n UpdateInstalledPackageInput,\n} from '../../generated/wspace-types';\nimport { buildMutationInput, fieldsOf, type GraphQLInput } from './internal/mutationInput';\nimport {\n useWorkspaceId,\n useWorkspaceMutation,\n useWorkspaceQuery,\n type QueryResult,\n} from './internal/workspaceGateway';\n\nconst LIST_LIMIT = 100;\n\nexport interface StorePackageRecord {\n id: string;\n slug: string;\n kind: string;\n version: string;\n manifest: Record<string, unknown>;\n readme?: string | null;\n metadata?: Record<string, unknown> | null;\n publishedAt?: string | null;\n publishedBy?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface InstalledPackageRecord {\n id: string;\n packageId: string;\n installedVersion: string;\n mode: string;\n bindings?: Record<string, unknown> | null;\n pinnedByEnv?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n installedAt: string;\n installedBy: string;\n createdAt: string;\n updatedAt: string;\n workspaceId: string;\n package?: StorePackageRecord | null;\n}\n\n/** Sort orders the service data actually supports (no rating/downloads exist). */\nexport type StoreSortBy = 'recent' | 'name';\n\nexport interface StoreFilter {\n search?: string;\n kind?: string[];\n sortBy?: StoreSortBy;\n}\n\n/** `InstallPackageInput` minus the `workspaceId` the hook supplies. */\nexport type InstallPackageVariables = Omit<GraphQLInput<InstallPackageInput>, 'workspaceId'>;\n\nexport interface UpdateInstalledPackageVariables {\n installedId: string;\n input: GraphQLInput<UpdateInstalledPackageInput>;\n}\n\nconst INSTALL_PACKAGE_FIELDS = fieldsOf<InstallPackageInput>({\n bindings: true,\n metadata: true,\n mode: true,\n packageId: true,\n pinnedByEnv: true,\n version: true,\n workspaceId: true,\n});\n\nconst UPDATE_INSTALLED_FIELDS = fieldsOf<UpdateInstalledPackageInput>({\n bindings: true,\n installedVersion: true,\n metadata: true,\n mode: true,\n pinnedByEnv: true,\n});\n\nconst FORK_PACKAGE_FIELDS = fieldsOf<ForkInstalledPackageInput>({\n installedPackageId: true,\n metadata: true,\n newName: true,\n workspaceId: true,\n});\n\nexport interface PinPackageVersionVariables {\n installedId: string;\n environment: string;\n version: string;\n /** Existing pins — passed through so pinning one environment never drops the others. */\n pinnedByEnv?: Record<string, unknown> | null;\n}\n\n/** `ForkInstalledPackageInput` minus the `workspaceId` the hook supplies. */\nexport type ForkPackageVariables = Omit<GraphQLInput<ForkInstalledPackageInput>, 'workspaceId'>;\n\n/** An installed package whose store listing has moved on to a newer version. */\nexport interface OutdatedPackage {\n installed: InstalledPackageRecord;\n installedVersion: string;\n latestVersion: string;\n}\n\nconst NO_PACKAGES: StorePackageRecord[] = [];\nconst NO_INSTALLED: InstalledPackageRecord[] = [];\nconst NO_OUTDATED: OutdatedPackage[] = [];\n\nfunction manifestSection(\n pkg: Pick<StorePackageRecord, 'manifest'> | null | undefined,\n key: string\n): Record<string, unknown> | undefined {\n const section = pkg?.manifest?.[key];\n return section && typeof section === 'object' && !Array.isArray(section)\n ? (section as Record<string, unknown>)\n : undefined;\n}\n\nfunction manifestString(\n pkg: Pick<StorePackageRecord, 'manifest'> | null | undefined,\n key: string\n): string | undefined {\n const value = manifestSection(pkg, 'package')?.[key];\n return typeof value === 'string' ? value : undefined;\n}\n\n/** Display name from the package manifest, falling back to the slug. */\nexport function storePackageName(\n pkg: Pick<StorePackageRecord, 'manifest' | 'slug'> | null | undefined\n): string {\n return manifestString(pkg, 'name') ?? pkg?.slug ?? '';\n}\n\nexport function storePackageDescription(\n pkg: Pick<StorePackageRecord, 'manifest'> | null | undefined\n): string | undefined {\n return manifestString(pkg, 'description');\n}\n\nfunction selectPackages(data: ListStorePackagesQuery | undefined): StorePackageRecord[] {\n return data?.listStorePackages ?? NO_PACKAGES;\n}\n\nfunction selectInstalled(data: ListInstalledPackagesQuery | undefined): InstalledPackageRecord[] {\n return data?.listInstalledPackages ?? NO_INSTALLED;\n}\n\nexport const storeKeys = {\n all: ['store'] as const,\n packages: () => [...storeKeys.all, 'packages'] as const,\n packageList: (filter?: StoreFilter) => [...storeKeys.packages(), 'list', filter] as const,\n packageDetail: (slug: string) => [...storeKeys.packages(), 'detail', slug] as const,\n installed: () => [...storeKeys.all, 'installed'] as const,\n installedList: () => [...storeKeys.installed(), 'list'] as const,\n installedDetail: (id: string) => [...storeKeys.installed(), 'detail', id] as const,\n};\n\nexport function useStorePackages(filter?: StoreFilter): QueryResult<StorePackageRecord[]> {\n const search = filter?.search?.trim() ?? '';\n const kind = filter?.kind?.[0];\n const sortBy = filter?.sortBy ?? 'recent';\n\n const variables = useMemo(\n () => ({\n filters: { search: search || undefined, kind },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [search, kind]\n );\n\n const select = useCallback(\n (data: ListStorePackagesQuery | undefined): StorePackageRecord[] => {\n const rows = selectPackages(data);\n if (rows.length === 0) return rows;\n const sorted = [...rows];\n if (sortBy === 'name') {\n sorted.sort((a, b) => storePackageName(a).localeCompare(storePackageName(b)));\n } else {\n sorted.sort((a, b) => (b.publishedAt ?? '').localeCompare(a.publishedAt ?? ''));\n }\n return sorted;\n },\n [sortBy]\n );\n\n return useWorkspaceQuery<ListStorePackagesQuery, StorePackageRecord[]>({\n document: ListStorePackagesDocument,\n variables,\n select,\n fallback: NO_PACKAGES,\n // The store catalogue is workspace-independent.\n enabled: true,\n errorMessage: 'Failed to load store packages',\n });\n}\n\n/** Store packages are addressed by slug in the UI, so this resolves by slug. */\nexport function useStorePackage(slug: string | undefined): QueryResult<StorePackageRecord | null> {\n const variables = useMemo(() => ({ slug: slug ?? '' }), [slug]);\n\n return useWorkspaceQuery<GetStorePackageBySlugQuery, StorePackageRecord | null>({\n document: GetStorePackageBySlugDocument,\n variables,\n select: (data) => data?.getStorePackageBySlug ?? null,\n fallback: null,\n enabled: Boolean(slug),\n errorMessage: 'Failed to load store package',\n });\n}\n\nexport function useInstalledPackages(): QueryResult<InstalledPackageRecord[]> {\n const workspaceId = useWorkspaceId();\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId: workspaceId ?? '' },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId]\n );\n\n return useWorkspaceQuery<ListInstalledPackagesQuery, InstalledPackageRecord[]>({\n document: ListInstalledPackagesDocument,\n variables,\n select: selectInstalled,\n fallback: NO_INSTALLED,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load installed packages',\n });\n}\n\nexport function useInstalledPackage(\n packageId: string | undefined\n): QueryResult<InstalledPackageRecord | null> {\n const variables = useMemo(() => ({ id: packageId ?? '' }), [packageId]);\n\n return useWorkspaceQuery<GetInstalledPackageQuery, InstalledPackageRecord | null>({\n document: GetInstalledPackageDocument,\n variables,\n select: (data) => data?.getInstalledPackage ?? null,\n fallback: null,\n enabled: Boolean(packageId),\n errorMessage: 'Failed to load installed package',\n });\n}\n\n/**\n * Installed packages whose store listing now publishes a different version.\n * Derived from the store package returned alongside each install — the service\n * has no dedicated \"check for updates\" operation.\n */\nexport function useCheckPackageUpdates(): QueryResult<OutdatedPackage[]> {\n const workspaceId = useWorkspaceId();\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId: workspaceId ?? '' },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId]\n );\n\n const select = useCallback((data: ListInstalledPackagesQuery | undefined): OutdatedPackage[] => {\n const rows = selectInstalled(data);\n const outdated: OutdatedPackage[] = [];\n for (const installed of rows) {\n const latestVersion = installed.package?.version;\n if (latestVersion && latestVersion !== installed.installedVersion) {\n outdated.push({ installed, installedVersion: installed.installedVersion, latestVersion });\n }\n }\n return outdated;\n }, []);\n\n return useWorkspaceQuery<ListInstalledPackagesQuery, OutdatedPackage[]>({\n document: ListInstalledPackagesDocument,\n variables,\n select,\n fallback: NO_OUTDATED,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to check for package updates',\n });\n}\n\nexport function useInstallPackage() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: InstallPackageVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, INSTALL_PACKAGE_FIELDS),\n }),\n [workspaceId]\n );\n\n const [install, state] = useWorkspaceMutation<\n InstallPackageMutation,\n InstallPackageVariables,\n InstalledPackageRecord\n >({\n document: InstallPackageDocument,\n variables,\n select: (data) => data?.installPackage,\n errorMessage: 'Failed to install package',\n });\n\n return { install, loading: state.loading, error: state.error };\n}\n\nexport function useUpdateInstalledPackage() {\n const [update, state] = useWorkspaceMutation<\n UpdateInstalledPackageMutation,\n UpdateInstalledPackageVariables,\n InstalledPackageRecord\n >({\n document: UpdateInstalledPackageDocument,\n variables: ({ installedId, input }) => ({\n id: installedId,\n input: buildMutationInput(input, UPDATE_INSTALLED_FIELDS),\n }),\n select: (data) => data?.updateInstalledPackage,\n errorMessage: 'Failed to update installed package',\n });\n\n return { update, loading: state.loading, error: state.error };\n}\n\nexport function useUninstallPackage() {\n const [uninstall, state] = useWorkspaceMutation<UninstallPackageMutation, string, boolean>({\n document: UninstallPackageDocument,\n variables: (installedId) => ({ id: installedId }),\n select: (data) => data?.uninstallPackage,\n errorMessage: 'Failed to uninstall package',\n });\n\n return { uninstall, loading: state.loading, error: state.error };\n}\n\n/**\n * Pins one environment to a version. Implemented as a targeted merge into\n * `pinnedByEnv` via `updateInstalledPackage` — the service has no dedicated pin\n * mutation, and replacing the whole map would drop the other environments.\n */\nexport function usePinPackageVersion() {\n const [update, state] = useWorkspaceMutation<\n UpdateInstalledPackageMutation,\n PinPackageVersionVariables,\n InstalledPackageRecord\n >({\n document: UpdateInstalledPackageDocument,\n variables: ({ installedId, environment, version, pinnedByEnv }) => ({\n id: installedId,\n input: { pinnedByEnv: { ...(pinnedByEnv ?? {}), [environment]: version } },\n }),\n select: (data) => data?.updateInstalledPackage,\n errorMessage: 'Failed to pin package version',\n });\n\n return { pin: update, loading: state.loading, error: state.error };\n}\n\nexport function useForkPackage() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: ForkPackageVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, FORK_PACKAGE_FIELDS),\n }),\n [workspaceId]\n );\n\n const [fork, state] = useWorkspaceMutation<\n ForkInstalledPackageMutation,\n ForkPackageVariables,\n InstalledPackageRecord\n >({\n document: ForkInstalledPackageDocument,\n variables,\n select: (data) => data?.forkInstalledPackage,\n errorMessage: 'Failed to fork package',\n });\n\n return { fork, loading: state.loading, error: state.error };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useStore.js","names":["LIST_LIMIT","INSTALL_PACKAGE_FIELDS","fieldsOf","UPDATE_INSTALLED_FIELDS","NO_PACKAGES","NO_INSTALLED","manifestSection","section","pkg","key","manifestString","value","storePackageName","storePackageDescription","selectPackages","data","selectInstalled","useStorePackages","search","filter","kind","sortBy","variables","useMemo","select","useCallback","rows","sorted","a","b","useWorkspacePaginatedQuery","ListStorePackagesDocument","useStorePackage","slug","useWorkspaceQuery","GetStorePackageBySlugDocument","useInstalledPackages","workspaceId","useWorkspaceId","ListInstalledPackagesDocument","useInstallPackage","buildMutationInput","input","install","state","useWorkspaceMutation","InstallPackageDocument","useUpdateInstalledPackage","update","UpdateInstalledPackageDocument","installedId","useUninstallPackage","uninstall","UninstallPackageDocument","usePinPackageVersion","pinnedByEnv","environment","version"],"sources":["../../../src/botlit/hooks/useStore.ts"],"sourcesContent":["/**\n * Store Hooks\n * @module botlit/hooks\n *\n * Backed by the live `listStorePackages` / `getStorePackageBySlug` /\n * `listInstalledPackages` operations and the install/update/uninstall/fork\n * mutations on wspace-botlit-svc.\n *\n * A `StorePackage` carries its human metadata (name, description, author,\n * tags…) inside the `manifest` JSON — the helpers below read it safely rather\n * than assuming top-level columns that the service does not expose.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n ForkInstalledPackageDocument,\n GetInstalledPackageDocument,\n GetStorePackageBySlugDocument,\n InstallPackageDocument,\n ListInstalledPackagesDocument,\n ListStorePackagesDocument,\n UninstallPackageDocument,\n UpdateInstalledPackageDocument,\n type ForkInstalledPackageMutation,\n type GetInstalledPackageQuery,\n type GetStorePackageBySlugQuery,\n type InstallPackageMutation,\n type ListInstalledPackagesQuery,\n type ListStorePackagesQuery,\n type UninstallPackageMutation,\n type UpdateInstalledPackageMutation,\n} from '../../generated/wspace-operations';\nimport type {\n ForkInstalledPackageInput,\n InstallPackageInput,\n UpdateInstalledPackageInput,\n} from '../../generated/wspace-types';\nimport { buildMutationInput, fieldsOf, type GraphQLInput } from './internal/mutationInput';\nimport {\n useWorkspaceId,\n useWorkspaceMutation,\n useWorkspacePaginatedQuery,\n useWorkspaceQuery,\n type PaginatedQueryResult,\n type QueryResult,\n} from './internal/workspaceGateway';\n\nconst LIST_LIMIT = 100;\n\nexport interface StorePackageRecord {\n id: string;\n slug: string;\n kind: string;\n version: string;\n manifest: Record<string, unknown>;\n readme?: string | null;\n metadata?: Record<string, unknown> | null;\n publishedAt?: string | null;\n publishedBy?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface InstalledPackageRecord {\n id: string;\n packageId: string;\n installedVersion: string;\n mode: string;\n bindings?: Record<string, unknown> | null;\n pinnedByEnv?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n installedAt: string;\n installedBy: string;\n createdAt: string;\n updatedAt: string;\n workspaceId: string;\n package?: StorePackageRecord | null;\n}\n\n/** Sort orders the service data actually supports (no rating/downloads exist). */\nexport type StoreSortBy = 'recent' | 'name';\n\nexport interface StoreFilter {\n search?: string;\n kind?: string[];\n sortBy?: StoreSortBy;\n}\n\n/** `InstallPackageInput` minus the `workspaceId` the hook supplies. */\nexport type InstallPackageVariables = Omit<GraphQLInput<InstallPackageInput>, 'workspaceId'>;\n\nexport interface UpdateInstalledPackageVariables {\n installedId: string;\n input: GraphQLInput<UpdateInstalledPackageInput>;\n}\n\nconst INSTALL_PACKAGE_FIELDS = fieldsOf<InstallPackageInput>({\n bindings: true,\n metadata: true,\n mode: true,\n packageId: true,\n pinnedByEnv: true,\n version: true,\n workspaceId: true,\n});\n\nconst UPDATE_INSTALLED_FIELDS = fieldsOf<UpdateInstalledPackageInput>({\n bindings: true,\n installedVersion: true,\n metadata: true,\n mode: true,\n pinnedByEnv: true,\n});\n\nconst FORK_PACKAGE_FIELDS = fieldsOf<ForkInstalledPackageInput>({\n installedPackageId: true,\n metadata: true,\n newName: true,\n workspaceId: true,\n});\n\nexport interface PinPackageVersionVariables {\n installedId: string;\n environment: string;\n version: string;\n /** Existing pins — passed through so pinning one environment never drops the others. */\n pinnedByEnv?: Record<string, unknown> | null;\n}\n\n/** `ForkInstalledPackageInput` minus the `workspaceId` the hook supplies. */\nexport type ForkPackageVariables = Omit<GraphQLInput<ForkInstalledPackageInput>, 'workspaceId'>;\n\n/** An installed package whose store listing has moved on to a newer version. */\nexport interface OutdatedPackage {\n installed: InstalledPackageRecord;\n installedVersion: string;\n latestVersion: string;\n}\n\nconst NO_PACKAGES: StorePackageRecord[] = [];\nconst NO_INSTALLED: InstalledPackageRecord[] = [];\nconst NO_OUTDATED: OutdatedPackage[] = [];\n\nfunction manifestSection(\n pkg: Pick<StorePackageRecord, 'manifest'> | null | undefined,\n key: string\n): Record<string, unknown> | undefined {\n const section = pkg?.manifest?.[key];\n return section && typeof section === 'object' && !Array.isArray(section)\n ? (section as Record<string, unknown>)\n : undefined;\n}\n\nfunction manifestString(\n pkg: Pick<StorePackageRecord, 'manifest'> | null | undefined,\n key: string\n): string | undefined {\n const value = manifestSection(pkg, 'package')?.[key];\n return typeof value === 'string' ? value : undefined;\n}\n\n/** Display name from the package manifest, falling back to the slug. */\nexport function storePackageName(\n pkg: Pick<StorePackageRecord, 'manifest' | 'slug'> | null | undefined\n): string {\n return manifestString(pkg, 'name') ?? pkg?.slug ?? '';\n}\n\nexport function storePackageDescription(\n pkg: Pick<StorePackageRecord, 'manifest'> | null | undefined\n): string | undefined {\n return manifestString(pkg, 'description');\n}\n\nfunction selectPackages(data: ListStorePackagesQuery | undefined): StorePackageRecord[] {\n return data?.listStorePackages ?? NO_PACKAGES;\n}\n\nfunction selectInstalled(data: ListInstalledPackagesQuery | undefined): InstalledPackageRecord[] {\n return data?.listInstalledPackages ?? NO_INSTALLED;\n}\n\nexport const storeKeys = {\n all: ['store'] as const,\n packages: () => [...storeKeys.all, 'packages'] as const,\n packageList: (filter?: StoreFilter) => [...storeKeys.packages(), 'list', filter] as const,\n packageDetail: (slug: string) => [...storeKeys.packages(), 'detail', slug] as const,\n installed: () => [...storeKeys.all, 'installed'] as const,\n installedList: () => [...storeKeys.installed(), 'list'] as const,\n installedDetail: (id: string) => [...storeKeys.installed(), 'detail', id] as const,\n};\n\nexport function useStorePackages(filter?: StoreFilter): PaginatedQueryResult<StorePackageRecord[]> {\n const search = filter?.search?.trim() ?? '';\n const kind = filter?.kind?.[0];\n const sortBy = filter?.sortBy ?? 'recent';\n\n const variables = useMemo(\n () => ({\n filters: { search: search || undefined, kind },\n }),\n [search, kind]\n );\n\n const select = useCallback(\n (rows: StorePackageRecord[]): StorePackageRecord[] => {\n if (rows.length === 0) return rows;\n const sorted = [...rows];\n if (sortBy === 'name') {\n sorted.sort((a, b) => storePackageName(a).localeCompare(storePackageName(b)));\n } else {\n sorted.sort((a, b) => (b.publishedAt ?? '').localeCompare(a.publishedAt ?? ''));\n }\n return sorted;\n },\n [sortBy]\n );\n\n return useWorkspacePaginatedQuery<\n ListStorePackagesQuery,\n StorePackageRecord,\n StorePackageRecord[]\n >({\n document: ListStorePackagesDocument,\n variables,\n pageSize: LIST_LIMIT,\n extractRows: selectPackages,\n select,\n fallback: NO_PACKAGES,\n // The store catalogue is workspace-independent.\n enabled: true,\n errorMessage: 'Failed to load store packages',\n });\n}\n\n/** Store packages are addressed by slug in the UI, so this resolves by slug. */\nexport function useStorePackage(slug: string | undefined): QueryResult<StorePackageRecord | null> {\n const variables = useMemo(() => ({ slug: slug ?? '' }), [slug]);\n\n return useWorkspaceQuery<GetStorePackageBySlugQuery, StorePackageRecord | null>({\n document: GetStorePackageBySlugDocument,\n variables,\n select: (data) => data?.getStorePackageBySlug ?? null,\n fallback: null,\n enabled: Boolean(slug),\n errorMessage: 'Failed to load store package',\n });\n}\n\nexport function useInstalledPackages(): PaginatedQueryResult<InstalledPackageRecord[]> {\n const workspaceId = useWorkspaceId();\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId: workspaceId ?? '' },\n }),\n [workspaceId]\n );\n\n return useWorkspacePaginatedQuery<\n ListInstalledPackagesQuery,\n InstalledPackageRecord,\n InstalledPackageRecord[]\n >({\n document: ListInstalledPackagesDocument,\n variables,\n pageSize: LIST_LIMIT,\n extractRows: selectInstalled,\n select: (rows) => rows,\n fallback: NO_INSTALLED,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load installed packages',\n });\n}\n\nexport function useInstalledPackage(\n packageId: string | undefined\n): QueryResult<InstalledPackageRecord | null> {\n const variables = useMemo(() => ({ id: packageId ?? '' }), [packageId]);\n\n return useWorkspaceQuery<GetInstalledPackageQuery, InstalledPackageRecord | null>({\n document: GetInstalledPackageDocument,\n variables,\n select: (data) => data?.getInstalledPackage ?? null,\n fallback: null,\n enabled: Boolean(packageId),\n errorMessage: 'Failed to load installed package',\n });\n}\n\n/**\n * Installed packages whose store listing now publishes a different version.\n * Derived from the store package returned alongside each install — the service\n * has no dedicated \"check for updates\" operation.\n */\nexport function useCheckPackageUpdates(): QueryResult<OutdatedPackage[]> {\n const workspaceId = useWorkspaceId();\n\n const variables = useMemo(\n () => ({\n filters: { workspaceId: workspaceId ?? '' },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId]\n );\n\n const select = useCallback((data: ListInstalledPackagesQuery | undefined): OutdatedPackage[] => {\n const rows = selectInstalled(data);\n const outdated: OutdatedPackage[] = [];\n for (const installed of rows) {\n const latestVersion = installed.package?.version;\n if (latestVersion && latestVersion !== installed.installedVersion) {\n outdated.push({ installed, installedVersion: installed.installedVersion, latestVersion });\n }\n }\n return outdated;\n }, []);\n\n return useWorkspaceQuery<ListInstalledPackagesQuery, OutdatedPackage[]>({\n document: ListInstalledPackagesDocument,\n variables,\n select,\n fallback: NO_OUTDATED,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to check for package updates',\n });\n}\n\nexport function useInstallPackage() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: InstallPackageVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, INSTALL_PACKAGE_FIELDS),\n }),\n [workspaceId]\n );\n\n const [install, state] = useWorkspaceMutation<\n InstallPackageMutation,\n InstallPackageVariables,\n InstalledPackageRecord\n >({\n document: InstallPackageDocument,\n variables,\n select: (data) => data?.installPackage,\n errorMessage: 'Failed to install package',\n });\n\n return { install, loading: state.loading, error: state.error };\n}\n\nexport function useUpdateInstalledPackage() {\n const [update, state] = useWorkspaceMutation<\n UpdateInstalledPackageMutation,\n UpdateInstalledPackageVariables,\n InstalledPackageRecord\n >({\n document: UpdateInstalledPackageDocument,\n variables: ({ installedId, input }) => ({\n id: installedId,\n input: buildMutationInput(input, UPDATE_INSTALLED_FIELDS),\n }),\n select: (data) => data?.updateInstalledPackage,\n errorMessage: 'Failed to update installed package',\n });\n\n return { update, loading: state.loading, error: state.error };\n}\n\nexport function useUninstallPackage() {\n const [uninstall, state] = useWorkspaceMutation<UninstallPackageMutation, string, boolean>({\n document: UninstallPackageDocument,\n variables: (installedId) => ({ id: installedId }),\n select: (data) => data?.uninstallPackage,\n errorMessage: 'Failed to uninstall package',\n });\n\n return { uninstall, loading: state.loading, error: state.error };\n}\n\n/**\n * Pins one environment to a version. Implemented as a targeted merge into\n * `pinnedByEnv` via `updateInstalledPackage` — the service has no dedicated pin\n * mutation, and replacing the whole map would drop the other environments.\n */\nexport function usePinPackageVersion() {\n const [update, state] = useWorkspaceMutation<\n UpdateInstalledPackageMutation,\n PinPackageVersionVariables,\n InstalledPackageRecord\n >({\n document: UpdateInstalledPackageDocument,\n variables: ({ installedId, environment, version, pinnedByEnv }) => ({\n id: installedId,\n input: { pinnedByEnv: { ...(pinnedByEnv ?? {}), [environment]: version } },\n }),\n select: (data) => data?.updateInstalledPackage,\n errorMessage: 'Failed to pin package version',\n });\n\n return { pin: update, loading: state.loading, error: state.error };\n}\n\nexport function useForkPackage() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: ForkPackageVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, FORK_PACKAGE_FIELDS),\n }),\n [workspaceId]\n );\n\n const [fork, state] = useWorkspaceMutation<\n ForkInstalledPackageMutation,\n ForkPackageVariables,\n InstalledPackageRecord\n >({\n document: ForkInstalledPackageDocument,\n variables,\n select: (data) => data?.forkInstalledPackage,\n errorMessage: 'Failed to fork package',\n });\n\n return { fork, loading: state.loading, error: state.error };\n}\n"],"mappings":"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"}
|
package/dist/botlit/index.d.ts
CHANGED
|
@@ -9,7 +9,6 @@ export { useBotlitStore } from './store/botlitStore';
|
|
|
9
9
|
export { useBots, useBot, useCreateBot, useUpdateBot, useDeleteBot } from './hooks/useBots';
|
|
10
10
|
export { useAgents, useAgent, useCreateAgent, useUpdateAgent, useDeleteAgent, } from './hooks/useAgents';
|
|
11
11
|
export { useKnowledgeBases, useKnowledgeBase, useKnowledgeDocuments, useCreateKnowledgeBase, } from './hooks/useKnowledgeBases';
|
|
12
|
-
export { useConversations, useConversation, useSendMessage } from './hooks/useConversations';
|
|
13
12
|
export { useLLMProviders, useConfigureLLMProvider } from './hooks/useLLMProviders';
|
|
14
13
|
export { useMCPServers, useCreateMCPServer } from './hooks/useMCPServers';
|
|
15
14
|
export { cn } from './utils/cn';
|
package/dist/botlit/index.js
CHANGED
|
@@ -4,9 +4,8 @@ import { useBotlitStore as r } from "./store/botlitStore.js";
|
|
|
4
4
|
import { useBot as i, useBots as a, useCreateBot as o, useDeleteBot as s, useUpdateBot as c } from "./hooks/useBots.js";
|
|
5
5
|
import { useAgent as l, useAgents as u, useCreateAgent as d, useDeleteAgent as f, useUpdateAgent as p } from "./hooks/useAgents.js";
|
|
6
6
|
import { useCreateKnowledgeBase as m, useKnowledgeBase as h, useKnowledgeBases as g, useKnowledgeDocuments as _ } from "./hooks/useKnowledgeBases.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
export { t as BotlitProvider, e as BotmanorRoot, T as cn, E as formatDate, D as formatRelativeTime, l as useAgent, u as useAgents, i as useBot, n as useBotlit, r as useBotlitStore, a as useBots, x as useConfigureLLMProvider, v as useConversation, y as useConversations, d as useCreateAgent, o as useCreateBot, m as useCreateKnowledgeBase, C as useCreateMCPServer, f as useDeleteAgent, s as useDeleteBot, h as useKnowledgeBase, g as useKnowledgeBases, _ as useKnowledgeDocuments, S as useLLMProviders, w as useMCPServers, b as useSendMessage, p as useUpdateAgent, c as useUpdateBot };
|
|
7
|
+
import { useConfigureLLMProvider as v, useLLMProviders as y } from "./hooks/useLLMProviders.js";
|
|
8
|
+
import { useCreateMCPServer as b, useMCPServers as x } from "./hooks/useMCPServers.js";
|
|
9
|
+
import { cn as S } from "./utils/cn.js";
|
|
10
|
+
import { formatDate as C, formatRelativeTime as w } from "./utils/formatters.js";
|
|
11
|
+
export { t as BotlitProvider, e as BotmanorRoot, S as cn, C as formatDate, w as formatRelativeTime, l as useAgent, u as useAgents, i as useBot, n as useBotlit, r as useBotlitStore, a as useBots, v as useConfigureLLMProvider, d as useCreateAgent, o as useCreateBot, m as useCreateKnowledgeBase, b as useCreateMCPServer, f as useDeleteAgent, s as useDeleteBot, h as useKnowledgeBase, g as useKnowledgeBases, _ as useKnowledgeDocuments, y as useLLMProviders, x as useMCPServers, p as useUpdateAgent, c as useUpdateBot };
|
|
@@ -390,7 +390,7 @@ var U = ({ isNew: R = !1 }) => {
|
|
|
390
390
|
value: Q.capabilities.stateTransitionHistory
|
|
391
391
|
}
|
|
392
392
|
].map((e) => /* @__PURE__ */ O("div", {
|
|
393
|
-
className: `p-3 rounded-lg border ${e.value ? "border-
|
|
393
|
+
className: `p-3 rounded-lg border ${e.value ? "border-status-success-border bg-status-success-bg-subtle" : "border-border-subtle bg-bg-sunken"}`,
|
|
394
394
|
children: [/* @__PURE__ */ D("p", {
|
|
395
395
|
className: "font-medium",
|
|
396
396
|
children: e.label
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"A2AAgentDetailPage.js","names":["_Fragment","Textarea","Textarea$1","TRUST_LEVELS","DEFAULT_FORM","toTrustLevel","value","toForm","agent","parseAgentCard","parsed","json","A2AAgentDetailPage","useParams","useBotlit","a2aAgent","useA2AAgent","isNew","agentId","createA2AAgent","createA2AAgentResult","useRegisterA2AAgent","updateA2AAgent","updateA2AAgentResult","useUpdateA2AAgent","deleteA2AAgent","deleteA2AAgentResult","useDeleteA2AAgent","isEditing","setIsEditing","useState","showDeleteConfirm","setShowDeleteConfirm","formData","setFormData","agentCard","useMemo","readAgentCard","entitlements","readEntitlements","loading","PageLayout","EmptyState","Button","navigateTo","getTrustBadgeVariant","level","handleSave","validation","validateAgentCard","created","toast","err","handleDelete","isNative","nativeNotify","ArrowLeft","Share2","StatusBadge","Badge","Fragment","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Edit","nativeImpact","Trash2","PagePurpose","Globe","Card","CardHeader","CardTitle","CardContent","FormField","Input","CardDescription","ExternalLink","Zap","cap","mode","Key","scheme","skill","tag","ex","i","Shield","entitlement","s","formatRelativeTime"],"sources":["../../../src/botlit/pages/A2AAgentDetailPage.tsx"],"sourcesContent":["/**\n * A2A Agent Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Edit,\n Trash2,\n Share2,\n Shield,\n Globe,\n Key,\n Zap,\n ExternalLink,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport {\n useA2AAgent,\n useRegisterA2AAgent,\n useUpdateA2AAgent,\n useDeleteA2AAgent,\n readAgentCard,\n readEntitlements,\n validateAgentCard,\n type A2AAgentRecord,\n} from '../hooks/useA2A';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { TrustLevel } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\ninterface A2AAgentDetailPageProps {\n isNew?: boolean;\n}\n\n/** Editable subset of an A2A registry entry. */\ninterface A2AAgentForm {\n name: string;\n description: string;\n wellKnownUrl: string;\n trustLevel: TrustLevel;\n /** The `/.well-known/agent.json` document, edited as raw JSON. */\n agentCardJson: string;\n}\n\nconst TRUST_LEVELS: TrustLevel[] = ['UNVERIFIED', 'VERIFIED_PUBLISHER', 'INTERNAL'];\n\nconst EMPTY_AGENT_CARD_JSON = JSON.stringify(\n {\n name: '',\n description: '',\n url: '',\n version: '1.0.0',\n capabilities: { streaming: false, pushNotifications: false, stateTransitionHistory: false },\n authentication: { schemes: ['bearer'] },\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n skills: [],\n },\n null,\n 2\n);\n\nconst DEFAULT_FORM: A2AAgentForm = {\n name: '',\n description: '',\n wellKnownUrl: '',\n trustLevel: 'UNVERIFIED',\n agentCardJson: EMPTY_AGENT_CARD_JSON,\n};\n\nfunction toTrustLevel(value: string): TrustLevel {\n return TRUST_LEVELS.includes(value as TrustLevel) ? (value as TrustLevel) : 'UNVERIFIED';\n}\n\nfunction toForm(agent: A2AAgentRecord): A2AAgentForm {\n return {\n name: agent.name,\n description: agent.description ?? '',\n wellKnownUrl: agent.wellKnownUrl ?? '',\n trustLevel: toTrustLevel(agent.trustLevel),\n agentCardJson: JSON.stringify(agent.agentCard ?? {}, null, 2),\n };\n}\n\n/** Parses the edited agent card; returns undefined when the JSON is malformed. */\nfunction parseAgentCard(json: string): Record<string, unknown> | undefined {\n try {\n const parsed: unknown = JSON.parse(json);\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const A2AAgentDetailPage: FC<A2AAgentDetailPageProps> = ({ isNew = false }) => {\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: a2aAgent, loading } = useA2AAgent(isNew ? undefined : agentId);\n const [createA2AAgent, createA2AAgentResult] = useRegisterA2AAgent();\n const [updateA2AAgent, updateA2AAgentResult] = useUpdateA2AAgent();\n const [deleteA2AAgent, deleteA2AAgentResult] = useDeleteA2AAgent();\n\n const [isEditing, setIsEditing] = useState(isNew);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [formData, setFormData] = useState<A2AAgentForm>(DEFAULT_FORM);\n\n // Seed the form once the entry arrives so \"Edit\" opens on current values.\n useEffect(() => {\n if (a2aAgent && !isNew) {\n setFormData(toForm(a2aAgent));\n }\n }, [a2aAgent, isNew]);\n\n // While editing, preview the card being typed; otherwise the stored one.\n const agentCard = useMemo(\n () =>\n readAgentCard(\n isEditing ? parseAgentCard(formData.agentCardJson) : (a2aAgent?.agentCard ?? undefined)\n ),\n [isEditing, formData.agentCardJson, a2aAgent]\n );\n\n const entitlements = useMemo(\n () => readEntitlements(a2aAgent?.entitlements),\n [a2aAgent?.entitlements]\n );\n\n if (loading && !isNew) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!a2aAgent && !isNew) {\n return (\n <PageLayout title=\"A2A Agent Not Found\">\n <EmptyState\n illustration=\"empty-people\"\n title=\"A2A Agent Not Found\"\n description=\"The A2A agent doesn't exist.\"\n action={<Button onClick={() => navigateTo('a2a')}>Back to A2A Registry</Button>}\n />\n </PageLayout>\n );\n }\n\n const getTrustBadgeVariant = (level: TrustLevel) => {\n switch (level) {\n case 'INTERNAL':\n return 'success';\n case 'VERIFIED_PUBLISHER':\n return 'default';\n default:\n return 'secondary';\n }\n };\n\n const handleSave = async () => {\n if (!formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n\n // `agentCard` is `JSON!` on the service — a registration without a usable\n // card is rejected, so the document is parsed and checked before sending.\n const agentCard = parseAgentCard(formData.agentCardJson);\n if (!agentCard) {\n toast.error('Agent card must be a valid JSON object');\n return;\n }\n const validation = validateAgentCard(agentCard);\n if (!validation.valid) {\n toast.error(validation.errors[0]);\n return;\n }\n\n if (isNew) {\n try {\n const created = await createA2AAgent({\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n });\n toast.success(`Registered \"${created.name}\"`);\n navigateTo(`a2a/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to register A2A agent');\n }\n return;\n }\n\n if (!agentId) return;\n try {\n await updateA2AAgent({\n agentId,\n input: {\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n },\n });\n toast.success('A2A agent updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update A2A agent');\n }\n };\n\n const handleDelete = async () => {\n if (!agentId) return;\n try {\n await deleteA2AAgent(agentId);\n if (isNative()) void nativeNotify('success');\n toast.success('A2A agent removed');\n navigateTo('a2a');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to remove A2A agent');\n }\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('a2a')}>\n <ArrowLeft size={20} />\n </Button>\n <Share2 size={24} className=\"text-primary\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{isNew ? 'Register A2A Agent' : a2aAgent?.name}</span>\n {!isNew && a2aAgent && <StatusBadge status={a2aAgent.status} />}\n {!isNew && a2aAgent && (\n <Badge variant={getTrustBadgeVariant(toTrustLevel(a2aAgent.trustLevel))}>\n {a2aAgent.trustLevel.replace('_', ' ')}\n </Badge>\n )}\n </div>\n {!isNew && a2aAgent?.description && (\n <p className=\"text-sm font-normal text-text-secondary\">{a2aAgent.description}</p>\n )}\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => (isNew ? navigateTo('a2a') : setIsEditing(false))}\n >\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n isLoading={createA2AAgentResult.loading || updateA2AAgentResult.loading}\n >\n {isNew ? 'Register Agent' : 'Save Changes'}\n </Button>\n </>\n ) : (\n <>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.A2A_REGISTRY_UPDATE}>\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => {\n if (a2aAgent) setFormData(toForm(a2aAgent));\n setIsEditing(true);\n }}\n >\n Edit\n </Button>\n </BotmanorPermissionGate>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteA2AAgentResult.loading}\n >\n Confirm\n </Button>\n </div>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.A2A_REGISTRY_DELETE}>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Remove\n </Button>\n </BotmanorPermissionGate>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Globe size={18} />}>\n This is one external agent registered in your A2A network. Inspect its public agent card —\n the skills it advertises, its provider and trust level — and decide how your own agents\n may delegate work to it. Keeping this entry accurate is what lets BotManor safely hand off\n tasks to agents outside your workspace.\n </PagePurpose>\n\n {/* Basic Info */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"e.g., External Weather Agent\"\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Describe what this A2A agent does...\"\n rows={3}\n />\n </FormField>\n <FormField label=\"Well-Known URL\" description=\"URL to fetch agent.json\">\n <Input\n value={formData.wellKnownUrl}\n onChange={(e) => setFormData({ ...formData, wellKnownUrl: e.target.value })}\n placeholder=\"https://example.com/.well-known/agent.json\"\n />\n </FormField>\n <FormField label=\"Trust Level\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.trustLevel}\n onChange={(e) =>\n setFormData({ ...formData, trustLevel: toTrustLevel(e.target.value) })\n }\n >\n <option value=\"UNVERIFIED\">Unverified</option>\n <option value=\"VERIFIED_PUBLISHER\">Verified Publisher</option>\n <option value=\"INTERNAL\">Internal</option>\n </select>\n </FormField>\n <FormField\n label=\"Agent Card (JSON)\"\n required\n description=\"Paste the agent's /.well-known/agent.json document\"\n >\n <Textarea\n value={formData.agentCardJson}\n onChange={(e) => setFormData({ ...formData, agentCardJson: e.target.value })}\n rows={12}\n className=\"font-mono text-xs\"\n />\n </FormField>\n {!parseAgentCard(formData.agentCardJson) && (\n <p className=\"text-sm text-status-error-text\">\n Agent card must be a valid JSON object.\n </p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Agent Card */}\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Globe size={18} />\n Agent Card\n </CardTitle>\n <CardDescription>Public agent metadata per A2A spec</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {!isNew && a2aAgent?.wellKnownUrl && (\n <div className=\"flex items-center gap-2 p-3 bg-bg-sunken rounded-lg\">\n <Globe size={16} className=\"text-text-secondary\" />\n <a\n href={a2aAgent.wellKnownUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-primary hover:underline flex items-center gap-1\"\n >\n {a2aAgent.wellKnownUrl}\n <ExternalLink size={12} />\n </a>\n </div>\n )}\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Agent URL</p>\n <p className=\"font-medium font-mono text-sm\">{agentCard.url || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Version</p>\n <Badge variant=\"outline\">{agentCard.version || MISSING_VALUE}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Provider</p>\n <p className=\"font-medium\">{agentCard.providerOrganization || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Documentation</p>\n {agentCard.documentationUrl ? (\n <a\n href={agentCard.documentationUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline flex items-center gap-1\"\n >\n View Docs <ExternalLink size={12} />\n </a>\n ) : (\n <p className=\"text-text-secondary\">{MISSING_VALUE}</p>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Capabilities */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Capabilities\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\n {[\n {\n key: 'streaming',\n label: 'Streaming',\n value: agentCard.capabilities.streaming,\n },\n {\n key: 'pushNotifications',\n label: 'Push Notifications',\n value: agentCard.capabilities.pushNotifications,\n },\n {\n key: 'stateTransitionHistory',\n label: 'State History',\n value: agentCard.capabilities.stateTransitionHistory,\n },\n ].map((cap) => (\n <div\n key={cap.key}\n className={`p-3 rounded-lg border ${cap.value ? 'border-green-500 bg-green-500/10' : 'border-border-subtle bg-bg-sunken'}`}\n >\n <p className=\"font-medium\">{cap.label}</p>\n <Badge variant={cap.value ? 'success' : 'secondary'}>\n {cap.value ? 'Supported' : 'Not Supported'}\n </Badge>\n </div>\n ))}\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Input Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultInputModes.length > 0 ? (\n agentCard.defaultInputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Output Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultOutputModes.length > 0 ? (\n agentCard.defaultOutputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Authentication */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Key size={18} />\n Authentication\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <p className=\"text-sm text-text-secondary\">Supported Schemes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.authenticationSchemes.length > 0 ? (\n agentCard.authenticationSchemes.map((scheme) => (\n <Badge key={scheme} variant=\"outline\">\n {scheme}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None specified</span>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Skills */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Skills\n </CardTitle>\n <CardDescription>Capabilities exposed by this agent</CardDescription>\n </CardHeader>\n <CardContent>\n {agentCard.skills.length > 0 ? (\n <div className=\"space-y-3\">\n {agentCard.skills.map((skill) => (\n <div key={skill.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h4 className=\"font-medium\">{skill.name}</h4>\n <p className=\"text-sm text-text-secondary\">{skill.description}</p>\n </div>\n <Badge variant=\"outline\">{skill.id}</Badge>\n </div>\n {skill.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {skill.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n {skill.examples.length > 0 && (\n <div className=\"mt-2\">\n <p className=\"text-xs text-text-secondary\">Examples:</p>\n <ul className=\"text-sm text-text-secondary list-disc list-inside\">\n {skill.examples.map((ex, i) => (\n <li key={i}>{ex}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No skills defined</p>\n )}\n </CardContent>\n </Card>\n\n {/* Entitlements */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Entitlements\n </CardTitle>\n <CardDescription>Which apps/agents can invoke this A2A agent</CardDescription>\n </CardHeader>\n <CardContent>\n {entitlements.length > 0 ? (\n <div className=\"space-y-3\">\n {entitlements.map((entitlement) => (\n <div key={entitlement.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {entitlement.sourceType}\n </Badge>\n <span className=\"font-mono text-sm\">{entitlement.sourceId}</span>\n </div>\n {entitlement.maxHops && (\n <span className=\"text-sm text-text-secondary\">\n Max Hops: {entitlement.maxHops}\n </span>\n )}\n </div>\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Allowed Skills</p>\n {entitlement.allowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.allowedSkills.map((s) => (\n <Badge key={s} variant=\"success\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">All</span>\n )}\n </div>\n <div>\n <p className=\"text-text-secondary\">Disallowed Skills</p>\n {entitlement.disallowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.disallowedSkills.map((s) => (\n <Badge key={s} variant=\"destructive\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No entitlements configured</p>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n {!isNew && a2aAgent && (\n <Card>\n <CardHeader>\n <CardTitle>Metadata</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Revision</p>\n <p className=\"font-medium\">{a2aAgent.revision}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{a2aAgent.visibility}</Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"A2AAgentDetailPage.js","names":["_Fragment","Textarea","Textarea$1","TRUST_LEVELS","DEFAULT_FORM","toTrustLevel","value","toForm","agent","parseAgentCard","parsed","json","A2AAgentDetailPage","useParams","useBotlit","a2aAgent","useA2AAgent","isNew","agentId","createA2AAgent","createA2AAgentResult","useRegisterA2AAgent","updateA2AAgent","updateA2AAgentResult","useUpdateA2AAgent","deleteA2AAgent","deleteA2AAgentResult","useDeleteA2AAgent","isEditing","setIsEditing","useState","showDeleteConfirm","setShowDeleteConfirm","formData","setFormData","agentCard","useMemo","readAgentCard","entitlements","readEntitlements","loading","PageLayout","EmptyState","Button","navigateTo","getTrustBadgeVariant","level","handleSave","validation","validateAgentCard","created","toast","err","handleDelete","isNative","nativeNotify","ArrowLeft","Share2","StatusBadge","Badge","Fragment","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Edit","nativeImpact","Trash2","PagePurpose","Globe","Card","CardHeader","CardTitle","CardContent","FormField","Input","CardDescription","ExternalLink","Zap","cap","mode","Key","scheme","skill","tag","ex","i","Shield","entitlement","s","formatRelativeTime"],"sources":["../../../src/botlit/pages/A2AAgentDetailPage.tsx"],"sourcesContent":["/**\n * A2A Agent Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Edit,\n Trash2,\n Share2,\n Shield,\n Globe,\n Key,\n Zap,\n ExternalLink,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport {\n useA2AAgent,\n useRegisterA2AAgent,\n useUpdateA2AAgent,\n useDeleteA2AAgent,\n readAgentCard,\n readEntitlements,\n validateAgentCard,\n type A2AAgentRecord,\n} from '../hooks/useA2A';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { TrustLevel } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\ninterface A2AAgentDetailPageProps {\n isNew?: boolean;\n}\n\n/** Editable subset of an A2A registry entry. */\ninterface A2AAgentForm {\n name: string;\n description: string;\n wellKnownUrl: string;\n trustLevel: TrustLevel;\n /** The `/.well-known/agent.json` document, edited as raw JSON. */\n agentCardJson: string;\n}\n\nconst TRUST_LEVELS: TrustLevel[] = ['UNVERIFIED', 'VERIFIED_PUBLISHER', 'INTERNAL'];\n\nconst EMPTY_AGENT_CARD_JSON = JSON.stringify(\n {\n name: '',\n description: '',\n url: '',\n version: '1.0.0',\n capabilities: { streaming: false, pushNotifications: false, stateTransitionHistory: false },\n authentication: { schemes: ['bearer'] },\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n skills: [],\n },\n null,\n 2\n);\n\nconst DEFAULT_FORM: A2AAgentForm = {\n name: '',\n description: '',\n wellKnownUrl: '',\n trustLevel: 'UNVERIFIED',\n agentCardJson: EMPTY_AGENT_CARD_JSON,\n};\n\nfunction toTrustLevel(value: string): TrustLevel {\n return TRUST_LEVELS.includes(value as TrustLevel) ? (value as TrustLevel) : 'UNVERIFIED';\n}\n\nfunction toForm(agent: A2AAgentRecord): A2AAgentForm {\n return {\n name: agent.name,\n description: agent.description ?? '',\n wellKnownUrl: agent.wellKnownUrl ?? '',\n trustLevel: toTrustLevel(agent.trustLevel),\n agentCardJson: JSON.stringify(agent.agentCard ?? {}, null, 2),\n };\n}\n\n/** Parses the edited agent card; returns undefined when the JSON is malformed. */\nfunction parseAgentCard(json: string): Record<string, unknown> | undefined {\n try {\n const parsed: unknown = JSON.parse(json);\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const A2AAgentDetailPage: FC<A2AAgentDetailPageProps> = ({ isNew = false }) => {\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: a2aAgent, loading } = useA2AAgent(isNew ? undefined : agentId);\n const [createA2AAgent, createA2AAgentResult] = useRegisterA2AAgent();\n const [updateA2AAgent, updateA2AAgentResult] = useUpdateA2AAgent();\n const [deleteA2AAgent, deleteA2AAgentResult] = useDeleteA2AAgent();\n\n const [isEditing, setIsEditing] = useState(isNew);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [formData, setFormData] = useState<A2AAgentForm>(DEFAULT_FORM);\n\n // Seed the form once the entry arrives so \"Edit\" opens on current values.\n useEffect(() => {\n if (a2aAgent && !isNew) {\n setFormData(toForm(a2aAgent));\n }\n }, [a2aAgent, isNew]);\n\n // While editing, preview the card being typed; otherwise the stored one.\n const agentCard = useMemo(\n () =>\n readAgentCard(\n isEditing ? parseAgentCard(formData.agentCardJson) : (a2aAgent?.agentCard ?? undefined)\n ),\n [isEditing, formData.agentCardJson, a2aAgent]\n );\n\n const entitlements = useMemo(\n () => readEntitlements(a2aAgent?.entitlements),\n [a2aAgent?.entitlements]\n );\n\n if (loading && !isNew) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!a2aAgent && !isNew) {\n return (\n <PageLayout title=\"A2A Agent Not Found\">\n <EmptyState\n illustration=\"empty-people\"\n title=\"A2A Agent Not Found\"\n description=\"The A2A agent doesn't exist.\"\n action={<Button onClick={() => navigateTo('a2a')}>Back to A2A Registry</Button>}\n />\n </PageLayout>\n );\n }\n\n const getTrustBadgeVariant = (level: TrustLevel) => {\n switch (level) {\n case 'INTERNAL':\n return 'success';\n case 'VERIFIED_PUBLISHER':\n return 'default';\n default:\n return 'secondary';\n }\n };\n\n const handleSave = async () => {\n if (!formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n\n // `agentCard` is `JSON!` on the service — a registration without a usable\n // card is rejected, so the document is parsed and checked before sending.\n const agentCard = parseAgentCard(formData.agentCardJson);\n if (!agentCard) {\n toast.error('Agent card must be a valid JSON object');\n return;\n }\n const validation = validateAgentCard(agentCard);\n if (!validation.valid) {\n toast.error(validation.errors[0]);\n return;\n }\n\n if (isNew) {\n try {\n const created = await createA2AAgent({\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n });\n toast.success(`Registered \"${created.name}\"`);\n navigateTo(`a2a/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to register A2A agent');\n }\n return;\n }\n\n if (!agentId) return;\n try {\n await updateA2AAgent({\n agentId,\n input: {\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n },\n });\n toast.success('A2A agent updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update A2A agent');\n }\n };\n\n const handleDelete = async () => {\n if (!agentId) return;\n try {\n await deleteA2AAgent(agentId);\n if (isNative()) void nativeNotify('success');\n toast.success('A2A agent removed');\n navigateTo('a2a');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to remove A2A agent');\n }\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('a2a')}>\n <ArrowLeft size={20} />\n </Button>\n <Share2 size={24} className=\"text-primary\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{isNew ? 'Register A2A Agent' : a2aAgent?.name}</span>\n {!isNew && a2aAgent && <StatusBadge status={a2aAgent.status} />}\n {!isNew && a2aAgent && (\n <Badge variant={getTrustBadgeVariant(toTrustLevel(a2aAgent.trustLevel))}>\n {a2aAgent.trustLevel.replace('_', ' ')}\n </Badge>\n )}\n </div>\n {!isNew && a2aAgent?.description && (\n <p className=\"text-sm font-normal text-text-secondary\">{a2aAgent.description}</p>\n )}\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => (isNew ? navigateTo('a2a') : setIsEditing(false))}\n >\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n isLoading={createA2AAgentResult.loading || updateA2AAgentResult.loading}\n >\n {isNew ? 'Register Agent' : 'Save Changes'}\n </Button>\n </>\n ) : (\n <>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.A2A_REGISTRY_UPDATE}>\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => {\n if (a2aAgent) setFormData(toForm(a2aAgent));\n setIsEditing(true);\n }}\n >\n Edit\n </Button>\n </BotmanorPermissionGate>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteA2AAgentResult.loading}\n >\n Confirm\n </Button>\n </div>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.A2A_REGISTRY_DELETE}>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Remove\n </Button>\n </BotmanorPermissionGate>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Globe size={18} />}>\n This is one external agent registered in your A2A network. Inspect its public agent card —\n the skills it advertises, its provider and trust level — and decide how your own agents\n may delegate work to it. Keeping this entry accurate is what lets BotManor safely hand off\n tasks to agents outside your workspace.\n </PagePurpose>\n\n {/* Basic Info */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"e.g., External Weather Agent\"\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Describe what this A2A agent does...\"\n rows={3}\n />\n </FormField>\n <FormField label=\"Well-Known URL\" description=\"URL to fetch agent.json\">\n <Input\n value={formData.wellKnownUrl}\n onChange={(e) => setFormData({ ...formData, wellKnownUrl: e.target.value })}\n placeholder=\"https://example.com/.well-known/agent.json\"\n />\n </FormField>\n <FormField label=\"Trust Level\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.trustLevel}\n onChange={(e) =>\n setFormData({ ...formData, trustLevel: toTrustLevel(e.target.value) })\n }\n >\n <option value=\"UNVERIFIED\">Unverified</option>\n <option value=\"VERIFIED_PUBLISHER\">Verified Publisher</option>\n <option value=\"INTERNAL\">Internal</option>\n </select>\n </FormField>\n <FormField\n label=\"Agent Card (JSON)\"\n required\n description=\"Paste the agent's /.well-known/agent.json document\"\n >\n <Textarea\n value={formData.agentCardJson}\n onChange={(e) => setFormData({ ...formData, agentCardJson: e.target.value })}\n rows={12}\n className=\"font-mono text-xs\"\n />\n </FormField>\n {!parseAgentCard(formData.agentCardJson) && (\n <p className=\"text-sm text-status-error-text\">\n Agent card must be a valid JSON object.\n </p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Agent Card */}\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Globe size={18} />\n Agent Card\n </CardTitle>\n <CardDescription>Public agent metadata per A2A spec</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {!isNew && a2aAgent?.wellKnownUrl && (\n <div className=\"flex items-center gap-2 p-3 bg-bg-sunken rounded-lg\">\n <Globe size={16} className=\"text-text-secondary\" />\n <a\n href={a2aAgent.wellKnownUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-primary hover:underline flex items-center gap-1\"\n >\n {a2aAgent.wellKnownUrl}\n <ExternalLink size={12} />\n </a>\n </div>\n )}\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Agent URL</p>\n <p className=\"font-medium font-mono text-sm\">{agentCard.url || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Version</p>\n <Badge variant=\"outline\">{agentCard.version || MISSING_VALUE}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Provider</p>\n <p className=\"font-medium\">{agentCard.providerOrganization || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Documentation</p>\n {agentCard.documentationUrl ? (\n <a\n href={agentCard.documentationUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline flex items-center gap-1\"\n >\n View Docs <ExternalLink size={12} />\n </a>\n ) : (\n <p className=\"text-text-secondary\">{MISSING_VALUE}</p>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Capabilities */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Capabilities\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\n {[\n {\n key: 'streaming',\n label: 'Streaming',\n value: agentCard.capabilities.streaming,\n },\n {\n key: 'pushNotifications',\n label: 'Push Notifications',\n value: agentCard.capabilities.pushNotifications,\n },\n {\n key: 'stateTransitionHistory',\n label: 'State History',\n value: agentCard.capabilities.stateTransitionHistory,\n },\n ].map((cap) => (\n <div\n key={cap.key}\n className={`p-3 rounded-lg border ${cap.value ? 'border-status-success-border bg-status-success-bg-subtle' : 'border-border-subtle bg-bg-sunken'}`}\n >\n <p className=\"font-medium\">{cap.label}</p>\n <Badge variant={cap.value ? 'success' : 'secondary'}>\n {cap.value ? 'Supported' : 'Not Supported'}\n </Badge>\n </div>\n ))}\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Input Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultInputModes.length > 0 ? (\n agentCard.defaultInputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Output Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultOutputModes.length > 0 ? (\n agentCard.defaultOutputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Authentication */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Key size={18} />\n Authentication\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <p className=\"text-sm text-text-secondary\">Supported Schemes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.authenticationSchemes.length > 0 ? (\n agentCard.authenticationSchemes.map((scheme) => (\n <Badge key={scheme} variant=\"outline\">\n {scheme}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None specified</span>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Skills */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Skills\n </CardTitle>\n <CardDescription>Capabilities exposed by this agent</CardDescription>\n </CardHeader>\n <CardContent>\n {agentCard.skills.length > 0 ? (\n <div className=\"space-y-3\">\n {agentCard.skills.map((skill) => (\n <div key={skill.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h4 className=\"font-medium\">{skill.name}</h4>\n <p className=\"text-sm text-text-secondary\">{skill.description}</p>\n </div>\n <Badge variant=\"outline\">{skill.id}</Badge>\n </div>\n {skill.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {skill.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n {skill.examples.length > 0 && (\n <div className=\"mt-2\">\n <p className=\"text-xs text-text-secondary\">Examples:</p>\n <ul className=\"text-sm text-text-secondary list-disc list-inside\">\n {skill.examples.map((ex, i) => (\n <li key={i}>{ex}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No skills defined</p>\n )}\n </CardContent>\n </Card>\n\n {/* Entitlements */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Entitlements\n </CardTitle>\n <CardDescription>Which apps/agents can invoke this A2A agent</CardDescription>\n </CardHeader>\n <CardContent>\n {entitlements.length > 0 ? (\n <div className=\"space-y-3\">\n {entitlements.map((entitlement) => (\n <div key={entitlement.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {entitlement.sourceType}\n </Badge>\n <span className=\"font-mono text-sm\">{entitlement.sourceId}</span>\n </div>\n {entitlement.maxHops && (\n <span className=\"text-sm text-text-secondary\">\n Max Hops: {entitlement.maxHops}\n </span>\n )}\n </div>\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Allowed Skills</p>\n {entitlement.allowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.allowedSkills.map((s) => (\n <Badge key={s} variant=\"success\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">All</span>\n )}\n </div>\n <div>\n <p className=\"text-text-secondary\">Disallowed Skills</p>\n {entitlement.disallowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.disallowedSkills.map((s) => (\n <Badge key={s} variant=\"destructive\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No entitlements configured</p>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n {!isNew && a2aAgent && (\n <Card>\n <CardHeader>\n <CardTitle>Metadata</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Revision</p>\n <p className=\"font-medium\">{a2aAgent.revision}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{a2aAgent.visibility}</Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAyDA,IAAMG,IAA6B;CAAC;CAAc;CAAsB;AAAU,GAkB5EC,IAA6B;CACjC,MAAM;CACN,aAAa;CACb,cAAc;CACd,YAAY;CACZ,eArB4B,KAAK,UACjC;EACE,MAAM;EACN,aAAa;EACb,KAAK;EACL,SAAS;EACT,cAAc;GAAE,WAAW;GAAO,mBAAmB;GAAO,wBAAwB;EAAM;EAC1F,gBAAgB,EAAE,SAAS,CAAC,QAAQ,EAAE;EACtC,mBAAmB,CAAC,MAAM;EAC1B,oBAAoB,CAAC,MAAM;EAC3B,QAAQ,CAAC;CACX,GACA,MACA,CAQe;AACjB;AAEA,SAASC,EAAa,GAA2B;CAC/C,OAAOF,EAAa,SAASG,CAAmB,IAAKA,IAAuB;AAC9E;AAEA,SAASC,EAAO,GAAqC;CACnD,OAAO;EACL,MAAMC,EAAM;EACZ,aAAaA,EAAM,eAAe;EAClC,cAAcA,EAAM,gBAAgB;EACpC,YAAYH,EAAaG,EAAM,UAAU;EACzC,eAAe,KAAK,UAAUA,EAAM,aAAa,CAAC,GAAG,MAAM,CAAC;CAC9D;AACF;AAGA,SAASC,EAAe,GAAmD;CACzE,IAAI;EACF,IAAMC,IAAkB,KAAK,MAAMC,CAAI;EACvC,OAAO,OAAOD,KAAW,YAAYA,KAAmB,CAAC,MAAM,QAAQA,CAAM,IACxEA,IACD,KAAA;CACN,QAAQ;EACN;CACF;AACF;AAEA,IAAaE,KAAmD,EAAE,WAAQ,SAAY;CACpF,IAAM,EAAE,eAAYC,EAAU,GACxB,EAAE,kBAAeC,EAAU,GAC3B,EAAE,MAAMC,GAAU,eAAYC,EAAYC,IAAQ,KAAA,IAAYC,CAAO,GACrE,CAACC,IAAgBC,MAAwBC,GAAoB,GAC7D,CAACC,IAAgBC,MAAwBC,GAAkB,GAC3D,CAACC,IAAgBC,MAAwBC,EAAkB,GAE3D,CAACC,GAAWC,KAAgBC,EAASb,CAAK,GAC1C,CAACc,IAAmBC,KAAwBF,EAAS,EAAK,GAC1D,CAACG,GAAUC,KAAeJ,EAAuB1B,CAAY;CAGnE,SAAgB;EACd,AAAIW,KAAY,CAACE,KACfiB,EAAY3B,EAAOQ,CAAQ,CAAC;CAEhC,GAAG,CAACA,GAAUE,CAAK,CAAC;CAGpB,IAAMkB,IAAYC,QAEdC,EACET,IAAYnB,EAAewB,EAAS,aAAa,IAAKlB,GAAU,aAAa,KAAA,CAC/E,GACF;EAACa;EAAWK,EAAS;EAAelB;CAAQ,CAC9C,GAEMuB,IAAeF,QACbG,EAAiBxB,GAAU,YAAY,GAC7C,CAACA,GAAU,YAAY,CACzB;CAEA,IAAIyB,KAAW,CAACvB,GACd,OACE,kBAACwB,GAAD;EAAY,OAAM;EAChB,UAAA,kBAAC,OAAD,EAAK,WAAU,8DAA+D,CAAA;CACpE,CAAA;CAIhB,IAAI,CAAC1B,KAAY,CAACE,GAChB,OACE,kBAACwB,GAAD;EAAY,OAAM;EAChB,UAAA,kBAACC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,QAAQ,kBAACC,GAAD;IAAQ,eAAeC,EAAW,KAAK;IAAG,UAAA;GAA4B,CAAA;EAC/E,CAAA;CACS,CAAA;CAIhB,IAAMC,MAAwB,MAAsB;EAClD,QAAQC,GAAR;GACE,KAAK,YACH,OAAO;GACT,KAAK,sBACH,OAAO;GACT,SACE,OAAO;EACX;CACF,GAEMC,KAAa,YAAY;EAC7B,IAAI,CAACd,EAAS,KAAK,KAAK,GAAG;GACzB,EAAM,MAAM,kBAAkB;GAC9B;EACF;EAIA,IAAME,IAAY1B,EAAewB,EAAS,aAAa;EACvD,IAAI,CAACE,GAAW;GACd,EAAM,MAAM,wCAAwC;GACpD;EACF;EACA,IAAMa,IAAaC,GAAkBd,CAAS;EAC9C,IAAI,CAACa,EAAW,OACd,EAAM,MAAMA,EAAW,OAAO,EAAE;OAIlC,IAAI/B,GACF,IAAI;GACF,IAAMiC,IAAU,MAAM/B,GAAe;IACnC,MAAMc,EAAS,KAAK,KAAK;IACzB,aAAaA,EAAS,YAAY,KAAK,KAAK;IAC5C,cAAcA,EAAS,aAAa,KAAK,KAAK;IAC9C,YAAYA,EAAS;IACrB;GACF,CAAC;GAED,AADAkB,EAAM,QAAQ,eAAeD,EAAQ,KAAK,EAAE,GAC5CN,EAAW,OAAOM,EAAQ,IAAI;EAChC,SAASE,GAAK;GACZ,EAAM,MAAMA,aAAe,QAAQA,EAAI,UAAU,8BAA8B;EACjF;OAIF,IAAKlC,GACL,IAAI;GAYF,AAXA,MAAMI,GAAe;IACnB;IACA,OAAO;KACL,MAAMW,EAAS,KAAK,KAAK;KACzB,aAAaA,EAAS,YAAY,KAAK,KAAK;KAC5C,cAAcA,EAAS,aAAa,KAAK,KAAK;KAC9C,YAAYA,EAAS;KACrB;IACF;GACF,CAAC,GACDkB,EAAM,QAAQ,mBAAmB,GACjCtB,EAAa,EAAK;EACpB,SAASuB,GAAK;GACZ,EAAM,MAAMA,aAAe,QAAQA,EAAI,UAAU,4BAA4B;EAC/E;CACF,GAEMC,KAAe,YAAY;EAC/B,IAAKnC,GACL,IAAI;GAIF,AAHA,MAAMO,GAAeP,CAAO,GACxBoC,EAAS,KAAGC,EAAkB,SAAS,GAC3CJ,EAAM,QAAQ,mBAAmB,GACjCP,EAAW,KAAK;EAClB,SAASQ,GAAK;GAEZ,AADIE,EAAS,KAAGC,EAAkB,OAAO,GACzCJ,EAAM,MAAMC,aAAe,QAAQA,EAAI,UAAU,4BAA4B;EAC/E;CACF;CAEA,OACE,kBAACX,GAAD;EACE,OACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAACE,GAAD;KAAQ,SAAQ;KAAQ,MAAK;KAAO,eAAeC,EAAW,KAAK;KACjE,UAAA,kBAACY,GAAD,EAAW,MAAM,GAAK,CAAA;IAChB,CAAA;IACR,kBAACC,IAAD;KAAQ,MAAM;KAAI,WAAU;IAAgB,CAAA;IAC5C,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAAC,QAAD,EAAA,UAAOxC,IAAQ,uBAAuBF,GAAU,KAAW,CAAA;MAC1D,CAACE,KAASF,KAAY,kBAAC2C,IAAD,EAAa,QAAQ3C,EAAS,OAAS,CAAA;MAC7D,CAACE,KAASF,KACT,kBAAC4C,GAAD;OAAO,SAASd,GAAqBxC,EAAaU,EAAS,UAAU,CAAC;OACnE,UAAAA,EAAS,WAAW,QAAQ,KAAK,GAAG;MAChC,CAAA;KAEN;IACJ,CAAA,GAAA,CAACE,KAASF,GAAU,eACnB,kBAAC,KAAD;KAAG,WAAU;KAA2C,UAAAA,EAAS;IAAe,CAAA,CAE/E,EAAA,CAAA;GACF;;EAEP,SACE,kBAAC,OAAD;GAAK,WAAU;GACZ,UAAAa,IACC,kBAAA5B,GAAA,EAAA,UAAA,CACE,kBAAC2C,GAAD;IACE,SAAQ;IACR,eAAgB1B,IAAQ2B,EAAW,KAAK,IAAIf,EAAa,EAAK;IAC/D,UAAA;GAEO,CAAA,GACR,kBAACc,GAAD;IACE,SAASI;IACT,WAAW3B,GAAqB,WAAWG,GAAqB;IAE/D,UAAAN,IAAQ,mBAAmB;GACtB,CAAA,CACR,EAAA,CAAA,IAEF,kBAAAjB,GAAA,EAAA,UAAA,CACE,kBAAC6D,GAAD;IAAwB,YAAYC,EAAqB;IACvD,UAAA,kBAACnB,GAAD;KACE,SAAQ;KACR,UAAU,kBAACoB,GAAD,EAAM,MAAM,GAAK,CAAA;KAC3B,eAAe;MAEb,AADIhD,KAAUmB,EAAY3B,EAAOQ,CAAQ,CAAC,GAC1Cc,EAAa,EAAI;KACnB;KACD,UAAA;IAEO,CAAA;GACc,CAAA,GACvBE,KACC,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACY,GAAD;KAAQ,SAAQ;KAAU,MAAK;KAAK,eAAeX,EAAqB,EAAK;KAAG,UAAA;IAExE,CAAA,GACR,kBAACW,GAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe;MAEb,AADAqB,EAAa,QAAQ,GACrBX,GAAkB;KACpB;KACA,WAAW3B,GAAqB;KACjC,UAAA;IAEO,CAAA,CACL;GAEL,CAAA,IAAA,kBAACmC,GAAD;IAAwB,YAAYC,EAAqB;IACvD,UAAA,kBAACnB,GAAD;KACE,SAAQ;KACR,UAAU,kBAACsB,GAAD,EAAQ,MAAM,GAAK,CAAA;KAC7B,eAAejC,EAAqB,EAAI;KACzC,UAAA;IAEO,CAAA;GACc,CAAA,CAE1B,EAAA,CAAA;EAED,CAAA;EAGP,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAACkC,GAAD;KAAa,MAAM,kBAACC,GAAD,EAAO,MAAM,GAAK,CAAA;KAAG,UAAA;IAK3B,CAAA;IAGZvC,KACC,kBAACwC,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD,EAAA,UACE,kBAACC,GAAD,EAAA,UAAW,oBAA4B,CAAA,EAC7B,CAAA,GACZ,kBAACC,GAAD;KAAa,WAAU;KAAvB,UAAA;MACE,kBAACC,GAAD;OAAW,OAAM;OAAO,UAAA;OACtB,UAAA,kBAACC,GAAD;QACE,OAAOxC,EAAS;QAChB,WAAW,MAAMC,EAAY;SAAE,GAAGD;SAAU,MAAM,EAAE,OAAO;QAAM,CAAC;QAClE,aAAY;OACb,CAAA;MACQ,CAAA;MACX,kBAACuC,GAAD;OAAW,OAAM;OACf,UAAA,kBAACvE,GAAD;QACE,OAAOgC,EAAS;QAChB,WAAW,MAAMC,EAAY;SAAE,GAAGD;SAAU,aAAa,EAAE,OAAO;QAAM,CAAC;QACzE,aAAY;QACZ,MAAM;OACP,CAAA;MACQ,CAAA;MACX,kBAACuC,GAAD;OAAW,OAAM;OAAiB,aAAY;OAC5C,UAAA,kBAACC,GAAD;QACE,OAAOxC,EAAS;QAChB,WAAW,MAAMC,EAAY;SAAE,GAAGD;SAAU,cAAc,EAAE,OAAO;QAAM,CAAC;QAC1E,aAAY;OACb,CAAA;MACQ,CAAA;MACX,kBAACuC,GAAD;OAAW,OAAM;OACf,UAAA,kBAAC,UAAD;QACE,WAAU;QACV,OAAOvC,EAAS;QAChB,WAAW,MACTC,EAAY;SAAE,GAAGD;SAAU,YAAY5B,EAAa,EAAE,OAAO,KAAK;QAAE,CAAC;QAJzE,UAAA;SAOE,kBAAC,UAAD;UAAQ,OAAM;UAAa,UAAA;SAAkB,CAAA;SAC7C,kBAAC,UAAD;UAAQ,OAAM;UAAqB,UAAA;SAA0B,CAAA;SAC7D,kBAAC,UAAD;UAAQ,OAAM;UAAW,UAAA;SAAgB,CAAA;QACnC;;MACC,CAAA;MACX,kBAACmE,GAAD;OACE,OAAM;OACN,UAAA;OACA,aAAY;OAEZ,UAAA,kBAACvE,GAAD;QACE,OAAOgC,EAAS;QAChB,WAAW,MAAMC,EAAY;SAAE,GAAGD;SAAU,eAAe,EAAE,OAAO;QAAM,CAAC;QAC3E,MAAM;QACN,WAAU;OACX,CAAA;MACQ,CAAA;MACV,CAACxB,EAAewB,EAAS,aAAa,KACrC,kBAAC,KAAD;OAAG,WAAU;OAAiC,UAAA;MAE3C,CAAA;KAEM;IACT,CAAA,CAAA,EAAA,CAAA;IAIR,kBAACmC,GAAD;KAAM,WAAU;KAAQ,MAAA;KAAxB,UAAA,CACE,kBAACC,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD;MAAW,WAAU;MAArB,UAAA,CACE,kBAACH,GAAD,EAAO,MAAM,GAAK,CAAA,GAAC,YAEV;KACX,CAAA,GAAA,kBAACO,GAAD,EAAA,UAAiB,qCAAmD,CAAA,CAC1D,EAAA,CAAA,GACZ,kBAACH,GAAD;MAAa,WAAU;MAAvB,UAAA,CACG,CAACtD,KAASF,GAAU,gBACnB,kBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,kBAACoD,GAAD;QAAO,MAAM;QAAI,WAAU;OAAuB,CAAA,GAClD,kBAAC,KAAD;QACE,MAAMpD,EAAS;QACf,QAAO;QACP,KAAI;QACJ,WAAU;QAJZ,UAAA,CAMGA,EAAS,cACV,kBAAC4D,GAAD,EAAc,MAAM,GAAK,CAAA,CACxB;OACA,CAAA,CAAA;MAGP,CAAA,GAAA,kBAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SAA8B,UAAA;QAAY,CAAA,GACvD,kBAAC,KAAD;SAAG,WAAU;SAAiC,UAAAxC,EAAU,OAAA;QAAwB,CAAA,CAC7E,EAAA,CAAA;QACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SAA8B,UAAA;QAAU,CAAA,GACrD,kBAACwB,GAAD;SAAO,SAAQ;SAAW,UAAAxB,EAAU,WAAA;QAAgC,CAAA,CACjE,EAAA,CAAA;QACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SAA8B,UAAA;QAAW,CAAA,GACtD,kBAAC,KAAD;SAAG,WAAU;SAAe,UAAAA,EAAU,wBAAA;QAAyC,CAAA,CAC5E,EAAA,CAAA;QACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SAA8B,UAAA;QAAgB,CAAA,GAC1DA,EAAU,mBACT,kBAAC,KAAD;SACE,MAAMA,EAAU;SAChB,QAAO;SACP,KAAI;SACJ,WAAU;SAJZ,UAAA,CAKC,cACW,kBAACwC,GAAD,EAAc,MAAM,GAAK,CAAA,CAClC;QAEH,CAAA,IAAA,kBAAC,KAAD;SAAG,WAAU;SAAuB,UAAA;QAAiB,CAAA,CAEpD,EAAA,CAAA;OACF;MACM,CAAA,CAAA;KACT,CAAA,CAAA;;IAGN,kBAACP,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD,EAAA,UACE,kBAACC,GAAD;KAAW,WAAU;KAArB,UAAA,CACE,kBAACM,GAAD,EAAK,MAAM,GAAK,CAAA,GAAC,cAER;IACD,CAAA,EAAA,CAAA,GACZ,kBAACL,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KACZ,UAAA;MACC;OACE,KAAK;OACL,OAAO;OACP,OAAOpC,EAAU,aAAa;MAChC;MACA;OACE,KAAK;OACL,OAAO;OACP,OAAOA,EAAU,aAAa;MAChC;MACA;OACE,KAAK;OACL,OAAO;OACP,OAAOA,EAAU,aAAa;MAChC;KACF,CAAC,CAAC,KAAK,MACL,kBAAC,OAAD;MAEE,WAAW,yBAAyB0C,EAAI,QAAQ,6DAA6D;MAF/G,UAAA,CAIE,kBAAC,KAAD;OAAG,WAAU;OAAe,UAAAA,EAAI;MAAS,CAAA,GACzC,kBAAClB,GAAD;OAAO,SAASkB,EAAI,QAAQ,YAAY;OACrC,UAAAA,EAAI,QAAQ,cAAc;MACtB,CAAA,CACJ;KAPE,GAAAA,EAAI,GAON,CACN;IACE,CAAA,GACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;MAAmC,UAAA;KAAc,CAAA,GAC9D,kBAAC,OAAD;MAAK,WAAU;MACZ,UAAA1C,EAAU,kBAAkB,SAAS,IACpCA,EAAU,kBAAkB,KAAK,MAC/B,kBAACwB,GAAD;OAAkB,SAAQ;OACvB,UAAAmB;MACI,GAFKA,CAEL,CACR,IAED,kBAAC,QAAD;OAAM,WAAU;OAAsB,UAAA;MAAU,CAAA;KAE/C,CAAA,CACF,EAAA,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;MAAmC,UAAA;KAAe,CAAA,GAC/D,kBAAC,OAAD;MAAK,WAAU;MACZ,UAAA3C,EAAU,mBAAmB,SAAS,IACrCA,EAAU,mBAAmB,KAAK,MAChC,kBAACwB,GAAD;OAAkB,SAAQ;OACvB,UAAAmB;MACI,GAFKA,CAEL,CACR,IAED,kBAAC,QAAD;OAAM,WAAU;OAAsB,UAAA;MAAU,CAAA;KAE/C,CAAA,CACF,EAAA,CAAA,CACF;IACM,CAAA,CAAA,EAAA,CAAA,CACT,EAAA,CAAA;IAGN,kBAACV,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD,EAAA,UACE,kBAACC,GAAD;KAAW,WAAU;KAArB,UAAA,CACE,kBAACS,IAAD,EAAK,MAAM,GAAK,CAAA,GAAC,gBAER;IACD,CAAA,EAAA,CAAA,GACZ,kBAACR,GAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;MAA8B,UAAA;KAAoB,CAAA,GAC/D,kBAAC,OAAD;MAAK,WAAU;MACZ,UAAApC,EAAU,sBAAsB,SAAS,IACxCA,EAAU,sBAAsB,KAAK,MACnC,kBAACwB,GAAD;OAAoB,SAAQ;OACzB,UAAAqB;MACI,GAFKA,CAEL,CACR,IAED,kBAAC,QAAD;OAAM,WAAU;OAAsB,UAAA;MAAoB,CAAA;KAEzD,CAAA,CACF;IACM,CAAA,EAAA,CAAA,CACT,EAAA,CAAA;IAGN,kBAACZ,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD;KAAW,WAAU;KAArB,UAAA,CACE,kBAACM,GAAD,EAAK,MAAM,GAAK,CAAA,GAAC,QAER;IACX,CAAA,GAAA,kBAACF,GAAD,EAAA,UAAiB,qCAAmD,CAAA,CAC1D,EAAA,CAAA,GACZ,kBAACH,GAAD,EAAA,UACGpC,EAAU,OAAO,SAAS,IACzB,kBAAC,OAAD;KAAK,WAAU;KACZ,UAAAA,EAAU,OAAO,KAAK,MACrB,kBAAC,OAAD;MAAoB,WAAU;MAA9B,UAAA;OACE,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;SAAI,WAAU;SAAe,UAAA8C,EAAM;QAAS,CAAA,GAC5C,kBAAC,KAAD;SAAG,WAAU;SAA+B,UAAAA,EAAM;QAAe,CAAA,CAC9D,EAAA,CAAA,GACL,kBAACtB,GAAD;SAAO,SAAQ;SAAW,UAAAsB,EAAM;QAAU,CAAA,CACvC;;OACJA,EAAM,KAAK,SAAS,KACnB,kBAAC,OAAD;QAAK,WAAU;QACZ,UAAAA,EAAM,KAAK,KAAK,MACf,kBAACtB,GAAD;SAAiB,SAAQ;SAAY,WAAU;SAC5C,UAAAuB;QACI,GAFKA,CAEL,CACR;OACE,CAAA;OAEND,EAAM,SAAS,SAAS,KACvB,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SAA8B,UAAA;QAAY,CAAA,GACvD,kBAAC,MAAD;SAAI,WAAU;SACX,UAAAA,EAAM,SAAS,KAAK,GAAI,MACvB,kBAAC,MAAD,EAAA,UAAaE,EAAO,GAAXC,CAAW,CACrB;QACC,CAAA,CACD;;MAEJ;KA3BK,GAAAH,EAAM,EA2BX,CACN;IACE,CAAA,IAEL,kBAAC,KAAD;KAAG,WAAU;KAAsB,UAAA;IAAoB,CAAA,EAE9C,CAAA,CACT,EAAA,CAAA;IAGN,kBAACb,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD;KAAW,WAAU;KAArB,UAAA,CACE,kBAACe,GAAD,EAAQ,MAAM,GAAK,CAAA,GAAC,cAEX;IACX,CAAA,GAAA,kBAACX,GAAD,EAAA,UAAiB,8CAA4D,CAAA,CACnE,EAAA,CAAA,GACZ,kBAACH,GAAD,EAAA,UACGjC,EAAa,SAAS,IACrB,kBAAC,OAAD;KAAK,WAAU;KACZ,UAAAA,EAAa,KAAK,MACjB,kBAAC,OAAD;MAA0B,WAAU;MAApC,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAACqB,GAAD;SAAO,SAAQ;SAAU,WAAU;SAChC,UAAA2B,EAAY;QACR,CAAA,GACP,kBAAC,QAAD;SAAM,WAAU;SAAqB,UAAAA,EAAY;QAAe,CAAA,CAC7D;OACJ,CAAA,GAAAA,EAAY,WACX,kBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA,CAA8C,cACjCA,EAAY,OACnB;OAEL,CAAA,CAAA;MACL,CAAA,GAAA,kBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;QAAsB,UAAA;OAAiB,CAAA,GACnDA,EAAY,cAAc,SAAS,IAClC,kBAAC,OAAD;QAAK,WAAU;QACZ,UAAAA,EAAY,cAAc,KAAK,MAC9B,kBAAC3B,GAAD;SAAe,SAAQ;SAAU,WAAU;SACxC,UAAA4B;QACI,GAFKA,CAEL,CACR;OACE,CAAA,IAEL,kBAAC,QAAD;QAAM,WAAU;QAAsB,UAAA;OAAS,CAAA,CAE9C,EAAA,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;QAAsB,UAAA;OAAoB,CAAA,GACtDD,EAAY,iBAAiB,SAAS,IACrC,kBAAC,OAAD;QAAK,WAAU;QACZ,UAAAA,EAAY,iBAAiB,KAAK,MACjC,kBAAC3B,GAAD;SAAe,SAAQ;SAAc,WAAU;SAC5C,UAAA4B;QACI,GAFKA,CAEL,CACR;OACE,CAAA,IAEL,kBAAC,QAAD;QAAM,WAAU;QAAsB,UAAA;OAAU,CAAA,CAE/C,EAAA,CAAA,CACF;MACF,CAAA,CAAA;KA5CK,GAAAD,EAAY,EA4CjB,CACN;IACE,CAAA,IAEL,kBAAC,KAAD;KAAG,WAAU;KAAsB,UAAA;IAA6B,CAAA,EAEvD,CAAA,CACT,EAAA,CAAA;IAGL,CAACrE,KAASF,KACT,kBAACqD,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD,EAAA,UACE,kBAACC,GAAD,EAAA,UAAW,WAAmB,CAAA,EACpB,CAAA,GACZ,kBAACC,GAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;OAAsB,UAAA;MAAU,CAAA,GAC7C,kBAAC,KAAD;OAAG,WAAU;OAAe,UAAAiB,EAAmBzE,EAAS,SAAS;MAAK,CAAA,CACnE,EAAA,CAAA;MACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;OAAsB,UAAA;MAAU,CAAA,GAC7C,kBAAC,KAAD;OAAG,WAAU;OAAe,UAAAyE,EAAmBzE,EAAS,SAAS;MAAK,CAAA,CACnE,EAAA,CAAA;MACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;OAAsB,UAAA;MAAW,CAAA,GAC9C,kBAAC,KAAD;OAAG,WAAU;OAAe,UAAAA,EAAS;MAAY,CAAA,CAC9C,EAAA,CAAA;MACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;OAAsB,UAAA;MAAa,CAAA,GAChD,kBAAC4C,GAAD;OAAO,SAAQ;OAAW,UAAA5C,EAAS;MAAkB,CAAA,CAClD,EAAA,CAAA;KACF;IACM,CAAA,EAAA,CAAA,CACT,EAAA,CAAA;GAEL;;CACK,CAAA;AAEhB"}
|
|
@@ -375,7 +375,7 @@ var F = () => {
|
|
|
375
375
|
}), /* @__PURE__ */ S("div", { children: X.length > 0 ? /* @__PURE__ */ S("div", {
|
|
376
376
|
className: "grid grid-cols-2 md:grid-cols-3 gap-4",
|
|
377
377
|
children: X.map((e) => /* @__PURE__ */ C("div", {
|
|
378
|
-
className: "p-3 rounded-lg border border-
|
|
378
|
+
className: "p-3 rounded-lg border border-status-success-border bg-status-success-bg-subtle",
|
|
379
379
|
children: [/* @__PURE__ */ S("p", {
|
|
380
380
|
className: "font-medium",
|
|
381
381
|
children: e
|