@agimon-ai/po-mcp 0.0.0-alpha.76 → 0.0.0-alpha.78

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.
@@ -81,10 +81,26 @@ function isReachableTool(value) {
81
81
  const record = value;
82
82
  return Object.keys(record).every((key) => key === "name" || key === "piName" || key === "tokens") && isToolName(record.name) && (!("piName" in record) || isToolName(record.piName)) && (!("tokens" in record) || isTokenCount(record.tokens));
83
83
  }
84
+ function isServerManagement(value) {
85
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
86
+ const record = value;
87
+ return Object.keys(record).every((key) => [
88
+ "owner",
89
+ "canEdit",
90
+ "canRemove",
91
+ "revision",
92
+ "target",
93
+ "kind"
94
+ ].includes(key)) && [
95
+ "global",
96
+ "repository",
97
+ "read-only"
98
+ ].includes(String(record.owner)) && typeof record.canEdit === "boolean" && typeof record.canRemove === "boolean" && (!("revision" in record) || typeof record.revision === "string" && /^[a-f0-9]{64}$/u.test(record.revision)) && (!("target" in record) || typeof record.target === "string" && record.target.length <= 2048 && !hasControlCharacter(record.target)) && (!("kind" in record) || record.kind === "local" || record.kind === "remote") && (!(record.canEdit || record.canRemove) || record.owner !== "read-only" && typeof record.revision === "string");
99
+ }
84
100
  function isSessionAuthStatusItem(value) {
85
101
  if (!value || typeof value !== "object" || Array.isArray(value)) return false;
86
102
  const record = value;
87
- return Object.keys(record).every((key) => key === "name" || key === "state" || key === "authorizationUrl" || key === "tools" || key === "missingSecrets") && (!("missingSecrets" in record) || Array.isArray(record.missingSecrets) && record.missingSecrets.length <= MAX_MISSING_SECRETS && record.missingSecrets.every(isSecretName)) && (!("authorizationUrl" in record) || isAuthorizationUrl(record.authorizationUrl)) && (!("tools" in record) || Array.isArray(record.tools) && record.tools.length <= MAX_SERVER_TOOLS && record.tools.every(isReachableTool)) && typeof record.name === "string" && record.name.trim() !== "" && !hasControlCharacter(record.name) && isSessionAuthState(record.state);
103
+ return Object.keys(record).every((key) => key === "management" || key === "name" || key === "state" || key === "authorizationUrl" || key === "tools" || key === "missingSecrets" || key === "oauthEligible" || key === "oauthAuthorized") && (!("management" in record) || isServerManagement(record.management)) && (!("oauthEligible" in record) || typeof record.oauthEligible === "boolean") && (!("oauthAuthorized" in record) || typeof record.oauthAuthorized === "boolean") && (!("missingSecrets" in record) || Array.isArray(record.missingSecrets) && record.missingSecrets.length <= MAX_MISSING_SECRETS && record.missingSecrets.every(isSecretName)) && (!("authorizationUrl" in record) || isAuthorizationUrl(record.authorizationUrl)) && (!("tools" in record) || Array.isArray(record.tools) && record.tools.length <= MAX_SERVER_TOOLS && record.tools.every(isReachableTool)) && typeof record.name === "string" && record.name.trim() !== "" && !hasControlCharacter(record.name) && isSessionAuthState(record.state);
88
104
  }
89
105
  /** Hub API paths for repository-scoped MCP management. */
90
106
  const MCP_REPOSITORY_API_PATH = "/repository";
@@ -168,6 +184,16 @@ const routes = {
168
184
  path: MCP_SERVERS_API_PATH,
169
185
  response: void 0
170
186
  },
187
+ editServer: {
188
+ method: "PATCH",
189
+ path: MCP_SERVERS_API_PATH,
190
+ response: void 0
191
+ },
192
+ removeServer: {
193
+ method: "DELETE",
194
+ path: MCP_SERVERS_API_PATH,
195
+ response: void 0
196
+ },
171
197
  globalServers: {
172
198
  method: "GET",
173
199
  path: MCP_GLOBAL_SERVERS_API_PATH,
@@ -1 +1 @@
1
- {"version":3,"file":"native.mjs","names":["Button","CopyButton","fontOf","Sheet","SheetBody","SheetContent","SheetDescription","SheetFooter","SheetHeader","SheetTitle","Spinner","StyleSheet","McpSessionAuthState","McpServerSheetProps","server","name","state","authorizationUrl","missingSecrets","onOpenLink","url","onReauthorize","onDisconnect","onClose","ManageRow","title","hint","onPress","styles","manageRow","McpServerSheet","connected","waitsForSecret","length","signingIn","open","headText","body","ask","map","askTitle","askName","step","stepNumber","stepText","link","waiting","manage","label","create","theme","flex","minWidth","gap","spacing","uni__dependencies","fontSize","base","lineHeight","fontWeight","medium","color","colors","hi","sm","lineHeightRelaxed","dim","semibold","flexDirection","alignItems","width","height","borderRadius","borderWidth","borderColor","green","textAlign","paddingLeft","md","hairlineWidth","border","fontFamily","mono","paddingTop","borderTopWidth","borderTopColor","minHeight","justifyContent","padding","backgroundColor","magenta","styles","Button","Dot","DotTone","fontOf","KebabIcon","Spinner","useState","StyleSheet","McpSessionAuthState","McpSessionServerTool","name","tokens","active","McpSessionServerRow","state","tools","missingSecrets","Action","STATE","Record","label","dot","ink","Ink","action","connected","connecting","degraded","closed","failed","disabled","ACTION_LABEL","signIn","connect","retry","NEEDS_SECRET","tokenLabel","tool","count","undefined","toLocaleString","McpSessionServersProps","servers","onAuthorize","server","onOpenServer","onOpenTool","McpSessionServers","revealedServers","setRevealedServers","serversWithTools","filter","length","visibleTools","Set","slice","map","styles","section","head","title","hint","index","waitsForSecret","view","divider","row","has","kind","toolName","inactive","indent","create","theme","gap","spacing","paddingHorizontal","paddingVertical","uni__dependencies","paddingBottom","fontSize","lg","lineHeight","fontWeight","semibold","color","colors","hi","sm","lineHeightRelaxed","dim","borderTopWidth","hairlineWidth","borderTopColor","flexDirection","alignItems","minHeight","flex","base","token","paddingLeft","width","violet","fontFamily","mono","styles","Button","CodeBlock","fontOf","Sheet","SheetBody","SheetContent","SheetFooter","SheetHeader","SheetTitle","Spinner","StyleSheet","McpSessionToolDetail","McpToolSchemaSheetProps","target","piName","server","inContext","detail","error","onClose","McpToolSchemaSheet","open","styles","headText","mono","hint","tokens","toLocaleString","body","description","text","warnings","length","map","warning","source","path","message","schema","label","JSON","stringify","inputSchema","create","theme","flex","minWidth","gap","spacing","uni__dependencies","fontFamily","fontSize","base","lineHeight","lineHeightRelaxed","color","colors","sm","dim","red","fontWeight","semibold","yellow","styles","WebPluginSlotProps","useEffect","useState","Linking","MCP_SESSION_AUTH_STATUS_KEY","McpSessionToolDetail","parseMcpSessionAuthStatus","requestMcpSessionAuthorization","requestMcpSessionDisconnect","fetchSessionTool","McpServerSheet","McpSessionServerRow","McpSessionServers","McpToolSchemaSheet","ToolTarget","sessionId","server","tool","piName","inContext","McpSessionContext","statuses","sendSessionFrame","contextInventory","published","serverTarget","setServerTarget","name","toolTarget","setToolTarget","detail","setDetail","key","value","error","toolKey","undefined","live","then","result","ok","rows","map","item","inventory","filter","entry","source","owner","length","state","missingSecrets","tools","itemKind","tokens","active","selected","find","authorize","current","authorizationUrl","openTool","serverName","toolName","reachable","identity","some","shownDetail","url","openURL","ToolMessageRenderProps","Button","CopyButton","fontOf","MessageItem","MessageItemBody","MessageItemHeader","MessageItemStatus","StatusTone","toolTone","useState","Linking","StyleSheet","McpResultBlock","McpStatusTone","matchMcpTool","mcpIdentityFromDetails","mcpImageBlocks","mcpResultBlocks","mcpResultView","CHARACTER_PAGE","LINE_PAGE","BLOCK_PAGE","IMAGE_PAGE","STATUS_TONE","Record","running","ok","error","hint","fallbackIdentity","toolName","server","tool","separator","indexOf","slice","hasApp","details","app","version","resourceUri","Literal","source","copy","all","revealed","label","characters","setCharacters","length","sourceLines","split","lines","setLines","linePrefix","join","end","Math","min","last","charCodeAt","next","visible","styles","part","code","codeScroll","literal","codeText","disclosure","meta","value","ResultBlock","block","type","link","openURL","uri","title","name","text","undefined","mimeType","JSON","stringify","McpToolMessage","defaultExpanded","initialReveal","props","identity","result","statuses","images","content","blocks","imageCount","setImageCount","blockCount","setBlockCount","view","output","expanded","isPartial","isError","hasInput","Object","keys","args","hasOutput","status","open","call","map","image","index","data","tone","glyph","create","theme","gap","spacing","minWidth","uni__dependencies","alignItems","flexShrink","fontFamily","sans","fontSize","base","lineHeight","color","colors","dim","sm","lineHeightRelaxed","fontWeight","semibold","blue","mono","borderRadius","DEFAULT","borderWidth","borderColor","border","backgroundColor","deep","padding","paddingRight","position","top","right","width","height","md","fillMcpAuth","toolMcp"],"sources":["../../src/types/webMcp.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/mcpSessionCommands.ts","../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/mcpSessionToolApi.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/McpServerSheet.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/McpSessionServers.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/McpToolSchemaSheet.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/McpSessionContext.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/McpAuth.context.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/mcpToolMatch.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/McpToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/mcp.native.tsx","../../generated/native.ts"],"sourcesContent":["/**\n * What an MCP tool result carries beyond its text, shared by this package's\n * Pi adapter (which attaches it as the result's details) and its web plugin\n * (which renders it). Wire JSON only: images ride Pi's own content blocks,\n * so they are not repeated here.\n */\nimport type { ContextToolWarning } from '@agimon-ai/po-core/contextApi';\nimport type { CallToolResult } from '@modelcontextprotocol/server';\n\n/** Shared browser/server payload validated by the mcp.apps.open wire schema. */\nexport interface McpAppOpenResult {\n leaseId: string;\n html: string;\n resourceUri: string;\n protocol: 'mcp' | 'openai';\n resourceMeta: Record<string, unknown>;\n tool: {\n name: string;\n description: string;\n inputSchema: { type: 'object'; [key: string]: unknown };\n _meta: Record<string, unknown>;\n };\n args: Record<string, unknown>;\n result: { content: unknown[]; structuredContent?: unknown; _meta?: Record<string, unknown>; isError?: boolean };\n state: unknown;\n readOnly: boolean;\n}\n\n/** Private presentation payload, never appended to model content. */\nexport interface McpAppPresentation {\n version: 1;\n resourceUri?: string;\n protocol?: 'mcp' | 'openai';\n result: CallToolResult;\n}\nexport type McpResultBlock =\n | { type: 'audio'; data: string; mimeType: string }\n | { type: 'resource_link'; uri: string; name: string; title?: string; description?: string; mimeType?: string }\n | { type: 'resource'; uri: string; mimeType?: string; text?: string; blob?: string }\n | { type: 'structured'; value: Record<string, unknown> };\n\nexport interface McpToolDetails {\n server: string;\n tool: string;\n /** Present only when the downstream result carried something beyond text and images. */\n blocks?: McpResultBlock[];\n app?: McpAppPresentation;\n}\n\nexport const MCP_SESSION_AUTH_STATUS_KEY = 'po-mcp-session-auth';\n\nconst ANSI_ESCAPE_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-?]*[ -/]*[@-~]`, 'gu');\nconst MAX_SESSION_AUTH_SERVERS = 128;\nconst MAX_AUTHORIZATION_URL_LENGTH = 8192;\nconst MAX_SERVER_TOOLS = 512;\nconst MAX_TOOL_NAME_LENGTH = 256;\nconst MAX_MISSING_SECRETS = 64;\nconst SECRET_NAME_PATTERN = /^[A-Za-z0-9._-]{1,64}$/u;\nconst SESSION_AUTH_STATES = [\n 'not-connected',\n 'connecting',\n 'connected',\n 'degraded',\n 'needs-auth',\n 'failed',\n 'closed',\n 'disabled',\n] as const;\nexport type McpSessionAuthState = (typeof SESSION_AUTH_STATES)[number];\n\nfunction isSessionAuthState(value: unknown): value is McpSessionAuthState {\n return SESSION_AUTH_STATES.some((state) => state === value);\n}\n\nexport interface McpSessionAuthStatusItem {\n readonly name: string;\n readonly state: McpSessionAuthState;\n readonly authorizationUrl?: string;\n /** Available tools and their estimated direct-schema cost, not a second context inventory. */\n readonly tools?: readonly McpSessionReachableTool[];\n /** `${vault:NAME}` secrets the server is waiting for. Names only, never values. */\n readonly missingSecrets?: readonly string[];\n}\n\nexport interface McpSessionReachableTool {\n /** Original downstream name, used with the configured server for detail lookup. */\n readonly name: string;\n /** Actual registered name. Optional for older live-session status producers. */\n readonly piName?: string;\n readonly tokens?: number;\n}\n\n/** A session's view of one reachable tool: what the dialog shows when a row is opened. */\nexport interface McpSessionToolDetail {\n readonly server: string;\n readonly tool: string;\n readonly piName: string;\n readonly description?: string;\n readonly inputSchema: Record<string, unknown>;\n readonly tokens: number;\n readonly warnings?: readonly ContextToolWarning[];\n readonly _meta?: Record<string, unknown>;\n}\n\n/** Session route for one reachable tool's description and schema. */\nexport const MCP_SESSION_TOOL_API_PATH = '/tool';\nexport const MCP_SESSION_TOOL_SERVER_QUERY = 'server';\nexport const MCP_SESSION_TOOL_NAME_QUERY = 'tool';\n/** Session route that stores a `${vault:NAME}` secret the session reported missing. */\nexport const MCP_SESSION_SECRETS_API_PATH = '/secrets';\n\n/** Body of the session secrets route. The value is sent once and never echoed back. */\nexport interface McpSupplySecretRequest {\n server: string;\n name: string;\n value: string;\n}\n\nexport interface McpSupplySecretResult {\n server: string;\n name: string;\n}\n\ninterface McpSessionServerStatusSource {\n readonly name: string;\n readonly state: string;\n readonly authorizationUrl?: unknown;\n readonly tools?: readonly {\n readonly toolName: string;\n readonly piName?: string;\n readonly active: boolean;\n readonly tokens?: number;\n }[];\n readonly missingSecrets?: readonly string[];\n}\n\n/** Keeps servers visible before discovery and after failures, without diagnostics or credentials. */\nexport function formatMcpSessionAuthStatus<T extends McpSessionServerStatusSource>(\n servers: readonly T[],\n): string | undefined {\n const items: McpSessionAuthStatusItem[] = servers.flatMap((server) => {\n if (!isSessionAuthState(server.state)) return [];\n const tools = (server.tools ?? [])\n .filter((tool) => tool.active && isToolName(tool.toolName))\n .map((tool): McpSessionReachableTool => ({\n name: tool.toolName,\n ...(isToolName(tool.piName) ? { piName: tool.piName } : {}),\n ...(isTokenCount(tool.tokens) ? { tokens: tool.tokens } : {}),\n }))\n .slice(0, MAX_SERVER_TOOLS);\n const missingSecrets = (server.missingSecrets ?? []).filter(isSecretName).slice(0, MAX_MISSING_SECRETS);\n const item: McpSessionAuthStatusItem = {\n name: server.name,\n state: server.state,\n ...(isAuthorizationUrl(server.authorizationUrl) ? { authorizationUrl: server.authorizationUrl } : {}),\n ...(tools.length === 0 ? {} : { tools }),\n ...(missingSecrets.length === 0 ? {} : { missingSecrets }),\n };\n return [item];\n });\n return items.length === 0 ? undefined : JSON.stringify(items);\n}\n\n/** Reads the live-session status defensively. Empty is the browser's active-session clear value. */\nexport function parseMcpSessionAuthStatus(raw: string | undefined): McpSessionAuthStatusItem[] | undefined {\n if (raw === undefined || raw.trim() === '') return undefined;\n try {\n const value: unknown = JSON.parse(raw.replace(ANSI_ESCAPE_PATTERN, ''));\n if (!Array.isArray(value) || value.length === 0 || value.length > MAX_SESSION_AUTH_SERVERS) return undefined;\n\n const names = new Set<string>();\n for (const item of value) {\n if (!isSessionAuthStatusItem(item) || names.has(item.name)) return undefined;\n names.add(item.name);\n }\n return value;\n } catch {\n return undefined;\n }\n}\n\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0);\n if (codePoint !== undefined && (codePoint < 32 || (codePoint >= 127 && codePoint <= 159))) return true;\n }\n return false;\n}\n\nfunction isAuthorizationUrl(value: unknown): value is string {\n if (typeof value !== 'string' || value.length > MAX_AUTHORIZATION_URL_LENGTH || hasControlCharacter(value)) {\n return false;\n }\n try {\n const url = new URL(value);\n return (url.protocol === 'http:' || url.protocol === 'https:') && url.username === '' && url.password === '';\n } catch {\n return false;\n }\n}\n\nfunction isToolName(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n value.trim() !== '' &&\n value.length <= MAX_TOOL_NAME_LENGTH &&\n !hasControlCharacter(value)\n );\n}\n\nfunction isSecretName(value: unknown): value is string {\n return typeof value === 'string' && SECRET_NAME_PATTERN.test(value);\n}\n\nfunction isTokenCount(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0;\n}\n\nfunction isReachableTool(value: unknown): value is McpSessionReachableTool {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n Object.keys(record).every((key) => key === 'name' || key === 'piName' || key === 'tokens') &&\n isToolName(record.name) &&\n (!('piName' in record) || isToolName(record.piName)) &&\n (!('tokens' in record) || isTokenCount(record.tokens))\n );\n}\n\nfunction isSessionAuthStatusItem(value: unknown): value is McpSessionAuthStatusItem {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n Object.keys(record).every(\n (key) =>\n key === 'name' || key === 'state' || key === 'authorizationUrl' || key === 'tools' || key === 'missingSecrets',\n ) &&\n (!('missingSecrets' in record) ||\n (Array.isArray(record.missingSecrets) &&\n record.missingSecrets.length <= MAX_MISSING_SECRETS &&\n record.missingSecrets.every(isSecretName))) &&\n (!('authorizationUrl' in record) || isAuthorizationUrl(record.authorizationUrl)) &&\n (!('tools' in record) ||\n (Array.isArray(record.tools) &&\n record.tools.length <= MAX_SERVER_TOOLS &&\n record.tools.every(isReachableTool))) &&\n typeof record.name === 'string' &&\n record.name.trim() !== '' &&\n !hasControlCharacter(record.name) &&\n isSessionAuthState(record.state)\n );\n}\n\n/** Hub API paths for repository-scoped MCP management. */\nexport const MCP_REPOSITORY_API_PATH = '/repository';\nexport const MCP_DISCOVERY_API_PATH = '/repository/discover';\nexport const MCP_AUTHORIZATION_API_PATH = '/repository/authorize';\n/** The repository every route is asked about, and the flow segment the two flow routes carry. */\nexport const MCP_REPOSITORY_ID_QUERY = 'repositoryId';\nexport const MCP_FLOW_ID_PARAM = 'flowId';\n/** Adds one server to the repository's `.mcp.json` or to the person's own config. */\nexport const MCP_SERVERS_API_PATH = '/servers';\n/** Lists the servers in the person's own config. */\nexport const MCP_GLOBAL_SERVERS_API_PATH = '/servers/global';\n\n/** Where a new server is written: the repository's `.mcp.json`, or the person's own config for every repository. */\nexport type McpServerScope = 'repository' | 'global';\n\n/** One `mcpServers` entry, in the shape Po already reads. */\nexport type McpServerEntry =\n | { type: 'http'; url: string; headers?: Record<string, string> }\n | { command: string; args: string[]; env?: Record<string, string> };\n\nexport interface McpAddServerRequest {\n scope: McpServerScope;\n /** Required for the repository scope. */\n repositoryId?: string;\n name: string;\n entry: McpServerEntry;\n /** A local command runs with the person's permissions, so the server asks for this confirmation too. */\n trusted?: boolean;\n /**\n * Header names (remote) or env names (local) whose values are kept in Po's vault. The config\n * gets `${vault:<name>-<field>}` in their place.\n */\n secretFields?: string[];\n}\n\nexport interface McpAddServerResult {\n scope: McpServerScope;\n name: string;\n}\n\n/** One server in a config file, as the settings page lists it. Credentials and environment never leave the hub. */\nexport interface McpConfiguredServer {\n name: string;\n kind: 'remote' | 'local';\n /** The URL, or the command without its arguments. */\n target: string;\n}\n\nexport interface McpGlobalServers {\n servers: McpConfiguredServer[];\n}\n\nexport type McpRepositoryServerState =\n | 'not-connected'\n | 'connecting'\n | 'connected'\n | 'degraded'\n | 'needs-auth'\n | 'failed'\n | 'closed';\n\nexport interface McpRepositoryTool {\n name: string;\n piName: string;\n description?: string;\n}\n\nexport interface McpRepositoryServer {\n name: string;\n state: McpRepositoryServerState;\n source: 'cached' | 'live' | 'configured';\n credentialPresent: boolean;\n tools: McpRepositoryTool[];\n error?: string;\n}\n\nexport interface McpRepositoryCatalog {\n repositoryId: string;\n sync: {\n fresh: boolean;\n reasons: string[];\n };\n servers: McpRepositoryServer[];\n droppedServers: string[];\n diagnostics: string[];\n}\n\nexport type McpAuthorizationStatus = 'starting' | 'waiting' | 'completed' | 'failed' | 'cancelled' | 'expired';\n\nexport interface McpAuthorizationFlow {\n id: string;\n repositoryId: string;\n serverName: string;\n status: McpAuthorizationStatus;\n authorizationUrl?: string;\n error?: string;\n expiresAt: number;\n}\n","import type { SessionFrameSender } from '@agimon-ai/po-core/web';\n\n/** Requests authorization through Pi's command frame, never through a shell. */\nexport function requestMcpSessionAuthorization(\n sendSessionFrame: SessionFrameSender,\n sessionId: string,\n serverName: string,\n): void {\n sendSessionFrame(sessionId, { type: 'prompt', message: `/mcp auth ${serverName}` });\n}\n\n/** Disconnects the server from this session only; its saved credentials are kept. */\nexport function requestMcpSessionDisconnect(\n sendSessionFrame: SessionFrameSender,\n sessionId: string,\n serverName: string,\n): void {\n sendSessionFrame(sessionId, { type: 'prompt', message: `/mcp disconnect ${serverName}` });\n}\n","// Type-only, so the native bundle that reads this table never imports the web contract at runtime.\nimport type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport {\n MCP_AUTHORIZATION_API_PATH,\n MCP_DISCOVERY_API_PATH,\n MCP_FLOW_ID_PARAM,\n MCP_GLOBAL_SERVERS_API_PATH,\n MCP_REPOSITORY_API_PATH,\n MCP_REPOSITORY_ID_QUERY,\n MCP_SESSION_SECRETS_API_PATH,\n MCP_SESSION_TOOL_API_PATH,\n MCP_SESSION_TOOL_NAME_QUERY,\n MCP_SERVERS_API_PATH,\n MCP_SESSION_TOOL_SERVER_QUERY,\n type McpAddServerResult,\n type McpAuthorizationFlow,\n type McpGlobalServers,\n type McpRepositoryCatalog,\n type McpSessionToolDetail,\n type McpSupplySecretResult,\n} from './webMcp';\n\n/** One authorization flow, addressed by id below the flow collection. */\nconst AUTHORIZATION_FLOW_PATH = `${MCP_AUTHORIZATION_API_PATH}/:${MCP_FLOW_ID_PARAM}`;\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path. The build reads both off\n * `src/extensions/(backend)/api/mcp/`, so the mount is stated once, by the\n * folder that creates it. The sub-paths come from `webMcp`, which already owned\n * them, so this table names where a route sits and nothing else.\n *\n * This is the one file the hub handler and the settings panel both read, so a\n * path cannot move on one side alone. The handler matches on these strings\n * rather than parsing its own copies of them.\n *\n * `:flowId` is the client's parameter syntax; the handler reads the segment off\n * the same path, so the two cannot disagree about where the id sits.\n */\nconst routes = {\n catalog: {\n method: 'GET',\n path: MCP_REPOSITORY_API_PATH,\n query: [MCP_REPOSITORY_ID_QUERY],\n response: undefined as unknown as ApiResponseOf<McpRepositoryCatalog>,\n },\n discover: {\n method: 'POST',\n path: MCP_DISCOVERY_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpRepositoryCatalog>,\n },\n authorize: {\n method: 'POST',\n path: MCP_AUTHORIZATION_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpAuthorizationFlow>,\n },\n readAuthorization: {\n method: 'GET',\n path: AUTHORIZATION_FLOW_PATH,\n query: [MCP_REPOSITORY_ID_QUERY],\n response: undefined as unknown as ApiResponseOf<McpAuthorizationFlow>,\n },\n /** The same path as `readAuthorization`; the method is the whole of the difference. */\n cancelAuthorization: {\n method: 'DELETE',\n path: AUTHORIZATION_FLOW_PATH,\n query: [MCP_REPOSITORY_ID_QUERY],\n response: undefined as unknown as ApiResponseOf<McpAuthorizationFlow>,\n },\n /** Adds one server to the repository's `.mcp.json` or the person's own config, by the body's scope. */\n addServer: {\n method: 'POST',\n path: MCP_SERVERS_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpAddServerResult>,\n },\n globalServers: {\n method: 'GET',\n path: MCP_GLOBAL_SERVERS_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpGlobalServers>,\n },\n /** Session scope: one available tool's registered name, description and schema. */\n sessionTool: {\n method: 'GET',\n path: MCP_SESSION_TOOL_API_PATH,\n query: [MCP_SESSION_TOOL_SERVER_QUERY, MCP_SESSION_TOOL_NAME_QUERY],\n response: undefined as unknown as ApiResponseOf<McpSessionToolDetail>,\n },\n /** Session scope: stores a secret the session reported missing. Owner-only; the value is never echoed. */\n sessionSecret: {\n method: 'POST',\n path: MCP_SESSION_SECRETS_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpSupplySecretResult>,\n },\n} as const satisfies ApiRoutes;\n\nexport default routes;\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'mcp' at for the mcp mount. */\nexport const mcpScopes = ['global', 'workspace', 'session'] as const;\n\nexport const mcp = createApiClient(routes, {\n scopes: mcpScopes,\n basePath: 'mcp',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n\n/** Scopes the tree mounts 'mcp-session' at for the mcp-session mount. */\nexport const mcpSessionScopes = ['session'] as const;\n\nexport const mcpSession = createApiClient(routes, {\n scopes: mcpSessionScopes,\n basePath: 'mcp-session',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import { mcpSession } from '../../../../../../../generated/client.native';\nimport {\n MCP_SESSION_TOOL_NAME_QUERY,\n MCP_SESSION_TOOL_SERVER_QUERY,\n type McpSessionToolDetail,\n} from '../../../../../../types/webMcp';\n\nexport type FetchSessionToolResult = { ok: true; detail: McpSessionToolDetail } | { ok: false; error: string };\n\n/** The phone's half of fetchSessionTool: the same session route over the native sealed transport. */\nexport async function fetchSessionTool(\n sessionId: string,\n server: string,\n tool: string,\n): Promise<FetchSessionToolResult> {\n const result = await mcpSession\n .session(sessionId)\n .sessionTool({ query: { [MCP_SESSION_TOOL_SERVER_QUERY]: server, [MCP_SESSION_TOOL_NAME_QUERY]: tool } });\n if (!result.ok) {\n if (result.status === 0) return { ok: false, error: 'The session is unreachable.' };\n return { ok: false, error: result.error === '' ? `The session answered ${result.status}.` : result.error };\n }\n return { ok: true, detail: result.data };\n}\n","import {\n Button,\n CopyButton,\n fontOf,\n Sheet,\n SheetBody,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n Spinner,\n} from '@agimon-ai/po-native-components';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { McpSessionAuthState } from '../../../../../../types/webMcp';\n\nexport interface McpServerSheetProps {\n /** The server the sheet is for; null closes it. */\n server: {\n name: string;\n state: McpSessionAuthState;\n authorizationUrl?: string;\n /** `${vault:NAME}` secrets the server waits for; the phone points to the web panel to add them. */\n missingSecrets?: readonly string[];\n } | null;\n onOpenLink: (url: string) => void;\n onReauthorize: () => void;\n onDisconnect: () => void;\n onClose: () => void;\n}\n\nfunction ManageRow({ title, hint, onPress }: { title: string; hint?: string; onPress: () => void }) {\n return (\n <Pressable style={styles.manageRow} onPress={onPress} accessibilityRole=\"button\" accessibilityLabel={title}>\n <Text style={styles.title}>{title}</Text>\n {hint ? <Text style={styles.hint}>{hint}</Text> : null}\n </Pressable>\n );\n}\n\n/**\n * The phone's half of the web authorization dialog: sign-in progress while a link is pending, and\n * Reauthorize or Disconnect once the server is connected. Disconnect keeps saved credentials.\n */\nexport function McpServerSheet({ server, onOpenLink, onReauthorize, onDisconnect, onClose }: McpServerSheetProps) {\n const connected = server?.state === 'connected';\n const missingSecrets = connected ? [] : (server?.missingSecrets ?? []);\n const waitsForSecret = missingSecrets.length > 0;\n const signingIn = !connected && !waitsForSecret && server !== null && server.state !== 'disabled';\n const url = server?.authorizationUrl;\n return (\n <Sheet\n open={server !== null}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <SheetContent>\n <SheetHeader>\n <View style={styles.headText}>\n <SheetTitle>\n {connected || waitsForSecret ? (server?.name ?? '') : `Sign in to ${server?.name ?? ''}`}\n </SheetTitle>\n <SheetDescription>\n {connected\n ? 'Connected in this session.'\n : waitsForSecret\n ? 'Waiting for a secret before it connects.'\n : 'Po connects as soon as you approve.'}\n </SheetDescription>\n </View>\n </SheetHeader>\n <SheetBody style={styles.body}>\n {waitsForSecret ? (\n <View style={styles.ask}>\n {missingSecrets.map((name) => (\n <Text key={name} style={styles.askTitle}>\n Needs secret <Text style={styles.askName}>{name}</Text>\n </Text>\n ))}\n {/* ponytail: the phone has no secret input; the value is typed once, in the web panel. */}\n <Text style={styles.hint}>\n Add it from Po on the web, in this session&apos;s MCP servers. It is saved to your vault and the server\n reconnects.\n </Text>\n </View>\n ) : null}\n {signingIn ? (\n <>\n <View style={styles.step}>\n <Text style={styles.stepNumber}>1</Text>\n <View style={styles.stepText}>\n <Text style={styles.title}>Approve Po in your browser</Text>\n <Text style={styles.hint}>It opens in Safari.</Text>\n </View>\n <Button variant=\"outline\" size=\"sm\" disabled={!url} onPress={() => url && onOpenLink(url)}>\n Open\n </Button>\n </View>\n {url ? (\n <View style={styles.link}>\n <Text selectable numberOfLines={1} style={styles.url}>\n {url}\n </Text>\n <CopyButton text={url} label=\"Copy link\" />\n </View>\n ) : null}\n <View style={styles.waiting}>\n <Spinner />\n <Text style={styles.hint}>\n {url ? 'Waiting for you to finish signing in.' : 'Preparing the sign-in link.'}\n </Text>\n </View>\n </>\n ) : null}\n {server && server.state !== 'disabled' && !waitsForSecret ? (\n <View style={styles.manage}>\n <Text style={styles.label}>Manage</Text>\n <ManageRow title=\"Reauthorize\" onPress={onReauthorize} />\n {connected ? (\n <ManageRow\n title=\"Disconnect from this session\"\n hint=\"Saved credentials are kept\"\n onPress={onDisconnect}\n />\n ) : null}\n </View>\n ) : null}\n </SheetBody>\n <SheetFooter>\n <Button variant=\"ghost\" onPress={onClose}>\n {connected ? 'Done' : 'Cancel'}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n headText: { flex: 1, minWidth: 0, gap: theme.spacing(1) },\n body: { gap: theme.spacing(4) },\n title: {\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.medium,\n color: theme.colors.hi,\n },\n hint: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeightRelaxed.sm, color: theme.colors.dim },\n label: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.dim,\n },\n step: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(3) },\n stepText: { flex: 1, minWidth: 0, gap: 2 },\n stepNumber: {\n width: 22,\n height: 22,\n borderRadius: 11,\n borderWidth: 1.5,\n borderColor: theme.colors.green,\n textAlign: 'center',\n fontSize: theme.fontSize.sm,\n lineHeight: 19,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.green,\n },\n link: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingLeft: theme.spacing(3),\n borderRadius: theme.borderRadius.md,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors.border,\n },\n url: {\n flex: 1,\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n waiting: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n manage: {\n gap: theme.spacing(1),\n paddingTop: theme.spacing(3),\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: theme.colors['border-soft'],\n },\n manageRow: { minHeight: 44, justifyContent: 'center', gap: 2 },\n ask: {\n gap: theme.spacing(1),\n padding: theme.spacing(3),\n borderRadius: theme.borderRadius.md,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors['edge-magenta'],\n backgroundColor: theme.colors['tint-magenta'],\n },\n askTitle: {\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.magenta,\n },\n askName: { fontFamily: fontOf(theme.fontFamily.mono), fontWeight: theme.fontWeight.medium, color: theme.colors.hi },\n}));\n","import { Button, Dot, type DotTone, fontOf, KebabIcon, Spinner } from '@agimon-ai/po-native-components';\nimport { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { McpSessionAuthState } from '../../../../../../types/webMcp';\n\n/** One tool a server offers, and whether its schema is in the model's context. */\nexport interface McpSessionServerTool {\n name: string;\n tokens?: number;\n active: boolean;\n}\n\nexport interface McpSessionServerRow {\n name: string;\n state: McpSessionAuthState;\n tools: readonly McpSessionServerTool[];\n /** Vault secrets the server waits for; while any is missing it reads as a gentle ask, not a failure. */\n missingSecrets?: readonly string[];\n}\n\ntype Action = 'signIn' | 'connect' | 'retry';\n\n/** What each state reads as, its dot, its ink, and the one action it offers. */\nconst STATE: Record<McpSessionAuthState, { label: string; dot: DotTone; ink: Ink; action?: Action }> = {\n connected: { label: 'Connected', dot: 'green', ink: 'dim' },\n connecting: { label: 'Connecting', dot: 'muted', ink: 'dim' },\n degraded: { label: 'Degraded', dot: 'yellow', ink: 'dim' },\n 'needs-auth': { label: 'Needs sign-in', dot: 'muted', ink: 'magenta', action: 'signIn' },\n 'not-connected': { label: 'Not connected', dot: 'muted', ink: 'dim', action: 'connect' },\n closed: { label: 'Disconnected', dot: 'muted', ink: 'dim', action: 'connect' },\n failed: { label: \"Couldn't connect\", dot: 'red', ink: 'red', action: 'retry' },\n disabled: { label: 'Disabled', dot: 'muted', ink: 'dim' },\n};\n\nconst ACTION_LABEL: Record<Action, string> = { signIn: 'Sign in', connect: 'Connect', retry: 'Try again' };\n\n/** A missing secret is the person's to give from the web panel, so there is no action here. */\nconst NEEDS_SECRET: (typeof STATE)[McpSessionAuthState] = { label: 'Needs secret', dot: 'muted', ink: 'magenta' };\n\ntype Ink = 'dim' | 'magenta' | 'red';\n\nfunction tokenLabel(tool: McpSessionServerTool): string {\n const count = tool.tokens === undefined ? '-' : `~${tool.tokens.toLocaleString()}`;\n return tool.active ? count : `(${count})`;\n}\n\nexport interface McpSessionServersProps {\n servers: readonly McpSessionServerRow[];\n /** Sign in, connect, and try again all start the server's authorization. */\n onAuthorize: (server: string) => void;\n /** The server's sheet: sign-in progress, reauthorize, disconnect. */\n onOpenServer: (server: string) => void;\n onOpenTool: (server: string, tool: string) => void;\n}\n\n/**\n * The session's MCP servers on the phone, at parity with the web Context section: every configured\n * server stays listed, including one waiting for OAuth that has no tools yet, so it can be connected.\n */\nexport function McpSessionServers({ servers, onAuthorize, onOpenServer, onOpenTool }: McpSessionServersProps) {\n const [revealedServers, setRevealedServers] = useState(1);\n const serversWithTools = servers.filter((server) => server.tools.length > 0);\n const visibleTools = new Set(serversWithTools.slice(0, revealedServers).map((server) => server.name));\n if (servers.length === 0) return null;\n return (\n <View testID=\"context-mcp-auth\" style={styles.section}>\n <View style={styles.head}>\n <Text style={styles.title} accessibilityRole=\"header\">\n MCP servers\n </Text>\n <Text style={styles.hint}>Servers this session can use. Tap a server for its tools.</Text>\n </View>\n {servers.map((server, index) => {\n const waitsForSecret = server.state !== 'connected' && (server.missingSecrets?.length ?? 0) > 0;\n const view = waitsForSecret ? NEEDS_SECRET : STATE[server.state];\n return (\n <View key={server.name} style={[styles.server, index > 0 && styles.divider]}>\n <View style={styles.row}>\n <Dot tone={view.dot} pulse={server.state === 'connecting'} />\n <Text numberOfLines={1} style={styles.name}>\n {server.name}\n </Text>\n <Text style={styles.ink(view.ink)}>{view.label}</Text>\n {server.state === 'connecting' ? <Spinner /> : null}\n {view.action ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onPress={() => onAuthorize(server.name)}\n accessibilityLabel={`${ACTION_LABEL[view.action]}: ${server.name}`}\n >\n {ACTION_LABEL[view.action]}\n </Button>\n ) : null}\n <Pressable\n onPress={() => onOpenServer(server.name)}\n hitSlop={12}\n accessibilityRole=\"button\"\n accessibilityLabel={`Manage ${server.name}`}\n >\n <KebabIcon size={16} />\n </Pressable>\n </View>\n {server.tools.length > 0 && visibleTools.has(server.name) ? (\n <View style={styles.tools}>\n {server.tools.map((tool) => (\n <Pressable\n key={tool.name}\n style={styles.tool}\n onPress={() => onOpenTool(server.name, tool.name)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Open schema for ${tool.name}`}\n >\n <Text style={styles.kind}>T</Text>\n <Text numberOfLines={1} style={[styles.toolName, !tool.active && styles.inactive]}>\n {tool.name}\n </Text>\n <Text style={styles.tokens}>{tokenLabel(tool)}</Text>\n </Pressable>\n ))}\n </View>\n ) : server.tools.length > 0 ? (\n <Text style={[styles.hint, styles.indent]}>{server.tools.length} tools</Text>\n ) : server.state === 'needs-auth' ? (\n <Text style={[styles.hint, styles.indent]}>Tools appear after you sign in.</Text>\n ) : null}\n </View>\n );\n })}\n {revealedServers < serversWithTools.length ? (\n <View style={styles.head}>\n <Text style={styles.hint}>\n {revealedServers} of {serversWithTools.length} servers' tools shown\n </Text>\n <Button variant=\"ghost\" onPress={() => setRevealedServers((count) => count + 1)}>\n Show more server tools\n </Button>\n </View>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n section: { gap: theme.spacing(2), paddingHorizontal: theme.spacing(4), paddingVertical: theme.spacing(3) },\n head: { gap: theme.spacing(1), paddingBottom: theme.spacing(1) },\n title: {\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n hint: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeightRelaxed.sm, color: theme.colors.dim },\n server: { gap: theme.spacing(2), paddingVertical: theme.spacing(3) },\n divider: { borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: theme.colors['border-soft'] },\n row: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2.5), minHeight: 44 },\n name: {\n flex: 1,\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n ink: (token: Ink) => ({ fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors[token] }),\n indent: { paddingLeft: theme.spacing(5) },\n tools: { gap: theme.spacing(0.5), paddingLeft: theme.spacing(5) },\n tool: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(3), minHeight: 44 },\n kind: {\n width: 12,\n fontSize: theme.fontSize['2xs'],\n lineHeight: theme.lineHeight['2xs'],\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.violet,\n },\n toolName: {\n flex: 1,\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.hi,\n },\n inactive: { color: theme.colors.dim },\n tokens: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.dim },\n}));\n","import {\n Button,\n CodeBlock,\n fontOf,\n Sheet,\n SheetBody,\n SheetContent,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n Spinner,\n} from '@agimon-ai/po-native-components';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { McpSessionToolDetail } from '../../../../../../types/webMcp';\n\nexport interface McpToolSchemaSheetProps {\n /** The tool the sheet is for; null closes it. */\n target: { piName: string; server: string; inContext: boolean } | null;\n /** The loaded detail, undefined while it is read. */\n detail?: McpSessionToolDetail;\n error?: string;\n onClose: () => void;\n}\n\n/** The phone's half of the web tool dialog: description, warnings, the full input schema and its token cost. */\nexport function McpToolSchemaSheet({ target, detail, error, onClose }: McpToolSchemaSheetProps) {\n return (\n <Sheet\n open={target !== null}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <SheetContent>\n <SheetHeader>\n <View style={styles.headText}>\n <SheetTitle style={styles.mono}>{target?.piName ?? ''}</SheetTitle>\n <Text style={styles.hint}>\n {target?.server}\n {target?.inContext === false ? ' · not in context' : ' · in context'}\n {detail ? ` · ~${detail.tokens.toLocaleString()} tokens` : ''}\n </Text>\n </View>\n </SheetHeader>\n <SheetBody style={styles.body}>\n {error ? <Text style={styles.error}>{error}</Text> : null}\n {!detail && !error ? <Spinner label=\"Reading the tool\" /> : null}\n {detail?.description ? <Text style={styles.text}>{detail.description}</Text> : null}\n {detail?.warnings?.length ? (\n <View style={styles.warnings} accessibilityLabel=\"Tool warnings\">\n {detail.warnings.map((warning) => (\n <Text key={`${warning.source}:${warning.path}:${warning.message}`} style={styles.warning}>\n {warning.source} {warning.path}: {warning.message}\n </Text>\n ))}\n </View>\n ) : null}\n {detail ? (\n <View style={styles.schema}>\n <Text style={styles.label}>Input schema</Text>\n <CodeBlock text={JSON.stringify(detail.inputSchema, null, 2)} language=\"json\" />\n </View>\n ) : null}\n </SheetBody>\n <SheetFooter>\n <Button variant=\"outline\" onPress={onClose}>\n Done\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n headText: { flex: 1, minWidth: 0, gap: theme.spacing(1) },\n mono: { fontFamily: fontOf(theme.fontFamily.mono) },\n body: { gap: theme.spacing(4) },\n text: { fontSize: theme.fontSize.base, lineHeight: theme.lineHeightRelaxed.base, color: theme.colors.text },\n hint: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.dim },\n error: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeightRelaxed.sm, color: theme.colors.red },\n label: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.dim,\n },\n warnings: { gap: theme.spacing(1) },\n warning: { fontSize: theme.fontSize.base, lineHeight: theme.lineHeight.base, color: theme.colors.yellow },\n schema: { gap: theme.spacing(2) },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport { useEffect, useState } from 'react';\nimport { Linking } from 'react-native';\n\nimport {\n MCP_SESSION_AUTH_STATUS_KEY,\n type McpSessionToolDetail,\n parseMcpSessionAuthStatus,\n} from '../../../../../../types/webMcp';\nimport { requestMcpSessionAuthorization, requestMcpSessionDisconnect } from '../_lib/mcpSessionCommands';\nimport { fetchSessionTool } from '../_lib/mcpSessionToolApi.native';\nimport { McpServerSheet } from './McpServerSheet.native';\nimport { type McpSessionServerRow, McpSessionServers } from './McpSessionServers.native';\nimport { McpToolSchemaSheet } from './McpToolSchemaSheet.native';\n\ninterface ToolTarget {\n sessionId: string;\n server: string;\n tool: string;\n piName: string;\n inContext: boolean;\n}\n\n/**\n * The session's MCP servers in the phone's Context tab, wired as the web section is: the live\n * status the session publishes, the context inventory for what reached the model, `/mcp auth` and\n * `/mcp disconnect` prompt frames, and the session tool route for a schema.\n */\nexport function McpSessionContext({\n sessionId,\n statuses,\n sendSessionFrame,\n contextInventory = [],\n}: WebPluginSlotProps) {\n const published = parseMcpSessionAuthStatus(statuses[MCP_SESSION_AUTH_STATUS_KEY]) ?? [];\n const [serverTarget, setServerTarget] = useState<{ sessionId: string; name: string } | null>(null);\n const [toolTarget, setToolTarget] = useState<ToolTarget | null>(null);\n const [detail, setDetail] = useState<{ key: string; value?: McpSessionToolDetail; error?: string }>();\n\n const toolKey = toolTarget ? `${toolTarget.sessionId}:${toolTarget.server}:${toolTarget.tool}` : undefined;\n useEffect(() => {\n if (!toolTarget || !toolKey) return;\n let live = true;\n void fetchSessionTool(toolTarget.sessionId, toolTarget.server, toolTarget.tool).then((result) => {\n if (!live) return;\n setDetail(result.ok ? { key: toolKey, value: result.detail } : { key: toolKey, error: result.error });\n });\n return () => {\n live = false;\n };\n }, [toolKey, toolTarget]);\n\n const rows: McpSessionServerRow[] = published.map((item) => {\n // Only the context inventory measures what is actually emitted to the model.\n const inventory = contextInventory.filter((entry) => entry.source === 'mcp' && entry.owner === item.name);\n if (inventory.length > 0) {\n return {\n name: item.name,\n state: item.state,\n missingSecrets: item.missingSecrets,\n tools: inventory\n .filter((entry) => entry.itemKind === 'tool')\n .map((entry) => ({ name: entry.name, tokens: entry.tokens ?? undefined, active: entry.active })),\n };\n }\n return {\n name: item.name,\n state: item.state,\n missingSecrets: item.missingSecrets,\n tools: (item.tools ?? []).map((tool) => ({ name: tool.piName ?? tool.name, tokens: tool.tokens, active: false })),\n };\n });\n\n const selected = serverTarget?.sessionId === sessionId ? serverTarget : null;\n const server = published.find((item) => item.name === selected?.name);\n\n const authorize = (name: string) => {\n if (sessionId === null) return;\n setServerTarget({ sessionId, name });\n const current = published.find((item) => item.name === name);\n if (!current?.authorizationUrl && current?.state !== 'connecting') {\n requestMcpSessionAuthorization(sendSessionFrame, sessionId, name);\n }\n };\n\n const openTool = (serverName: string, toolName: string) => {\n if (sessionId === null) return;\n const reachable = published.find((item) => item.name === serverName)?.tools ?? [];\n const identity = reachable.find((tool) => (tool.piName ?? tool.name) === toolName);\n if (!identity) return;\n const inContext = contextInventory.some(\n (entry) => entry.source === 'mcp' && entry.name === toolName && entry.active,\n );\n setToolTarget({ sessionId, server: serverName, tool: identity.name, piName: toolName, inContext });\n };\n\n const shownDetail = detail && detail.key === toolKey ? detail : undefined;\n\n return (\n <>\n <McpSessionServers\n servers={rows}\n onAuthorize={authorize}\n onOpenServer={(name) => {\n if (sessionId !== null) setServerTarget({ sessionId, name });\n }}\n onOpenTool={openTool}\n />\n <McpServerSheet\n server={\n server\n ? {\n name: server.name,\n state: server.state,\n authorizationUrl: server.authorizationUrl,\n missingSecrets: server.missingSecrets,\n }\n : null\n }\n onOpenLink={(url) => void Linking.openURL(url)}\n onReauthorize={() => {\n if (selected) requestMcpSessionAuthorization(sendSessionFrame, selected.sessionId, selected.name);\n }}\n onDisconnect={() => {\n if (selected) requestMcpSessionDisconnect(sendSessionFrame, selected.sessionId, selected.name);\n }}\n onClose={() => setServerTarget(null)}\n />\n <McpToolSchemaSheet\n target={\n toolTarget ? { piName: toolTarget.piName, server: toolTarget.server, inContext: toolTarget.inContext } : null\n }\n {...(shownDetail?.value ? { detail: shownDetail.value } : {})}\n {...(shownDetail?.error ? { error: shownDetail.error } : {})}\n onClose={() => setToolTarget(null)}\n />\n </>\n );\n}\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { McpSessionContext } from './_components/McpSessionContext.native';\n\nexport default defineFill({ component: McpSessionContext });\n","import type { McpResultBlock } from '../../../../../../types/webMcp';\n\n/**\n * Pure view logic for MCP tool cards. MCP tools are registered under `<server>_<tool>`,\n * so the plugin recognises a call by the server names the session publishes.\n */\n\n/**\n * The footer status the session half publishes (src/constants/piMcp.ts\n * MCP_STATUS_KEY). Duplicated because the browser half may import only\n * src/types and src/constants; a test keeps the two literals equal.\n */\nexport const MCP_STATUS_KEY = 'po-mcp';\nconst SERVER_SEPARATOR = ',';\nconst PI_NAME_SEPARATOR = '_';\nconst MAX_ARGUMENTS = 3;\n/** Text lines kept in the collapsed result, before the card is expanded. */\nconst COLLAPSED_RESULT_LINES = 12;\n\nexport interface McpToolIdentity {\n server: string;\n tool: string;\n}\n\n/** The server names the session reports, in the order it listed them. */\nexport function mcpServers(statuses: Readonly<Record<string, string>>): string[] {\n const raw = statuses[MCP_STATUS_KEY];\n if (raw === undefined) return [];\n return raw\n .split(SERVER_SEPARATOR)\n .map((name) => name.trim())\n .filter((name) => name.length > 0);\n}\n\n/**\n * Splits a Pi tool name into its MCP server and tool. The longest server\n * prefix wins so `github_enterprise_search` belongs to `github_enterprise`\n * when both it and `github` are configured.\n */\nexport function matchMcpTool(toolName: string, statuses: Readonly<Record<string, string>>): McpToolIdentity | null {\n let best: McpToolIdentity | null = null;\n for (const server of mcpServers(statuses)) {\n const prefix = `${server}${PI_NAME_SEPARATOR}`;\n if (!toolName.startsWith(prefix) || toolName.length === prefix.length) continue;\n if (best === null || server.length > best.server.length) {\n best = { server, tool: toolName.slice(prefix.length) };\n }\n }\n return best;\n}\n\n/** The identity the result details carry, which the tool wrote itself and is exact. */\nexport function mcpIdentityFromDetails(details: unknown): McpToolIdentity | null {\n if (typeof details !== 'object' || details === null) return null;\n const record = details as { server?: unknown; tool?: unknown };\n if (typeof record.server !== 'string' || typeof record.tool !== 'string') return null;\n return { server: record.server, tool: record.tool };\n}\n\nfunction argumentValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (value === null) return 'null';\n if (Array.isArray(value)) return `[${value.length}]`;\n return '{…}';\n}\n\n/** The first few arguments as `key=value`, with a count for the rest. */\nexport function mcpArgumentSummary(params: Record<string, unknown>): string {\n const entries = Object.entries(params);\n const shown = entries.slice(0, MAX_ARGUMENTS).map(([key, value]) => `${key}=${argumentValue(value)}`);\n if (entries.length > shown.length) shown.push(`+${entries.length - shown.length}`);\n return shown.join(' · ');\n}\n\nexport type McpStatusTone = 'running' | 'ok' | 'error' | 'hint';\n\nexport interface McpResultView {\n lines: string[];\n status: { glyph: string; tone: McpStatusTone; text: string } | null;\n}\n\n/** The result body as renderMcpResult lays it out: text lines, then one status line. */\nexport function mcpResultView(input: {\n output: string;\n expanded: boolean;\n isPartial: boolean;\n isError: boolean;\n}): McpResultView {\n const all = input.output.split('\\n');\n while (all.length > 0 && all.at(-1)?.trim() === '') all.pop();\n const lines = input.expanded ? all : all.slice(0, COLLAPSED_RESULT_LINES);\n\n if (input.isPartial) return { lines, status: { glyph: '◐', tone: 'running', text: 'running' } };\n if (input.isError) return { lines, status: { glyph: '✗', tone: 'error', text: 'failed' } };\n if (!input.expanded && all.length > lines.length) {\n return { lines, status: { glyph: '…', tone: 'hint', text: `${all.length - lines.length} more line(s)` } };\n }\n if (lines.length === 0) return { lines, status: { glyph: '✓', tone: 'ok', text: 'done' } };\n return { lines, status: null };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** One block of the result's details, kept only when its required fields are the strings the adapter wrote. */\nfunction mcpResultBlock(entry: unknown): McpResultBlock | null {\n if (!isRecord(entry)) return null;\n const text = (key: string): string | undefined => (typeof entry[key] === 'string' ? entry[key] : undefined);\n switch (entry.type) {\n case 'audio': {\n const data = text('data');\n const mimeType = text('mimeType');\n return data !== undefined && mimeType !== undefined ? { type: 'audio', data, mimeType } : null;\n }\n case 'resource_link': {\n const uri = text('uri');\n const name = text('name');\n if (uri === undefined || name === undefined) return null;\n const title = text('title');\n const description = text('description');\n const mimeType = text('mimeType');\n return {\n type: 'resource_link',\n uri,\n name,\n ...(title === undefined ? {} : { title }),\n ...(description === undefined ? {} : { description }),\n ...(mimeType === undefined ? {} : { mimeType }),\n };\n }\n case 'resource': {\n const uri = text('uri');\n if (uri === undefined) return null;\n const mimeType = text('mimeType');\n const content = text('text');\n const blob = text('blob');\n return {\n type: 'resource',\n uri,\n ...(mimeType === undefined ? {} : { mimeType }),\n ...(content === undefined ? {} : { text: content }),\n ...(blob === undefined ? {} : { blob }),\n };\n }\n case 'structured':\n return isRecord(entry.value) ? { type: 'structured', value: entry.value } : null;\n default:\n return null;\n }\n}\n\n/** The blocks beyond text the adapter attached to the result's details; malformed entries are dropped. */\nexport function mcpResultBlocks(details: unknown): McpResultBlock[] {\n if (!isRecord(details) || !Array.isArray(details.blocks)) return [];\n return details.blocks.flatMap((entry) => {\n const block = mcpResultBlock(entry);\n return block === null ? [] : [block];\n });\n}\n\nexport interface McpImageBlock {\n data: string;\n mimeType: string;\n}\n\n/** The image blocks of a result's content, which Pi carries beside the text. */\nexport function mcpImageBlocks(content: readonly unknown[]): McpImageBlock[] {\n return content.flatMap((block) => {\n if (!isRecord(block) || block.type !== 'image') return [];\n return typeof block.data === 'string' && typeof block.mimeType === 'string'\n ? [{ data: block.data, mimeType: block.mimeType }]\n : [];\n });\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n Button,\n CopyButton,\n fontOf,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n type StatusTone,\n toolTone,\n} from '@agimon-ai/po-native-components';\nimport { useState } from 'react';\nimport { Image, Linking, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type {} from '../../../../../../types/unistyles.native';\nimport type { McpResultBlock } from '../../../../../../types/webMcp';\nimport {\n type McpStatusTone,\n matchMcpTool,\n mcpIdentityFromDetails,\n mcpImageBlocks,\n mcpResultBlocks,\n mcpResultView,\n} from '../_lib/mcpToolMatch';\n\nconst CHARACTER_PAGE = 640;\nconst LINE_PAGE = 12;\nconst BLOCK_PAGE = 2;\nconst IMAGE_PAGE = 1;\nconst STATUS_TONE: Record<McpStatusTone, StatusTone> = {\n running: 'running',\n ok: 'ok',\n error: 'error',\n hint: 'neutral',\n};\n\nfunction fallbackIdentity(toolName: string): { server: string; tool: string } {\n const separator = toolName.indexOf('_');\n if (separator <= 0) return { server: toolName, tool: '' };\n return { server: toolName.slice(0, separator), tool: toolName.slice(separator + 1) };\n}\n\nfunction hasApp(details: unknown): boolean {\n if (details === null || typeof details !== 'object' || !('app' in details)) return false;\n const app = details.app;\n return (\n app !== null &&\n typeof app === 'object' &&\n 'version' in app &&\n app.version === 1 &&\n 'resourceUri' in app &&\n typeof app.resourceUri === 'string'\n );\n}\n\n/** Copies always receive the original string, never the displayed prefix. */\nfunction Literal({\n source,\n copy = false,\n all = false,\n revealed = false,\n label = 'complete source',\n}: {\n source: string;\n copy?: boolean;\n all?: boolean;\n label?: string;\n revealed?: boolean;\n}) {\n const [characters, setCharacters] = useState(all ? source.length : CHARACTER_PAGE * (revealed ? 2 : 1));\n const sourceLines = source.split('\\n');\n const [lines, setLines] = useState(all ? sourceLines.length : LINE_PAGE * (revealed ? 2 : 1));\n const linePrefix = sourceLines.slice(0, lines).join('\\n');\n let end = Math.min(characters, linePrefix.length);\n const last = linePrefix.charCodeAt(end - 1);\n const next = linePrefix.charCodeAt(end);\n if (last >= 0xd800 && last <= 0xdbff && next >= 0xdc00 && next <= 0xdfff) end -= 1;\n const visible = linePrefix.slice(0, end);\n return (\n <View style={styles.part}>\n {copy ? (\n <View style={styles.code}>\n <ScrollView horizontal contentContainerStyle={styles.codeScroll}>\n <Text selectable style={[styles.literal, styles.codeText]}>\n {visible}\n </Text>\n </ScrollView>\n <CopyButton text={source} label={label} style={styles.copy} />\n </View>\n ) : (\n <Text selectable style={styles.literal}>\n {visible}\n </Text>\n )}\n {visible.length < source.length ? (\n <View style={styles.disclosure}>\n <Text style={styles.meta}>\n {visible.length} of {source.length} characters · {visible.split('\\n').length} of {sourceLines.length} lines\n </Text>\n <Button\n variant=\"ghost\"\n onPress={() => {\n setCharacters((value) => value + CHARACTER_PAGE);\n setLines((value) => value + LINE_PAGE);\n }}\n >\n Show more {copy ? 'source' : 'output'}\n </Button>\n </View>\n ) : null}\n </View>\n );\n}\n\nfunction ResultBlock({ block, all }: { block: McpResultBlock; all: boolean }) {\n switch (block.type) {\n case 'resource_link':\n return (\n <Text accessibilityRole=\"link\" style={styles.link} onPress={() => void Linking.openURL(block.uri)}>\n {block.title ?? block.name}\n </Text>\n );\n case 'resource':\n return block.text === undefined ? (\n <Text style={styles.meta}>\n binary {block.mimeType ?? 'resource'} · {block.uri}\n </Text>\n ) : (\n <Literal source={block.text} copy all={all} label=\"complete resource\" />\n );\n case 'structured':\n return (\n <Literal source={JSON.stringify(block.value, null, 2)} copy all={all} label=\"complete structured result\" />\n );\n case 'audio':\n return <Text style={styles.meta}>audio · {block.mimeType}</Text>;\n }\n}\n\n/** Bounded inline MCP results. The optional initial reveal is used by deterministic stories. */\nexport function McpToolMessage({\n defaultExpanded = false,\n initialReveal = 'first',\n ...props\n}: ToolMessageRenderProps & {\n defaultExpanded?: boolean;\n initialReveal?: 'first' | 'output' | 'all';\n}) {\n const all = initialReveal === 'all';\n const revealed = initialReveal === 'output';\n const identity =\n mcpIdentityFromDetails(props.result?.details) ??\n matchMcpTool(props.toolName, props.statuses) ??\n fallbackIdentity(props.toolName);\n const images = mcpImageBlocks(props.result?.content ?? []);\n const blocks = mcpResultBlocks(props.result?.details);\n const [imageCount, setImageCount] = useState(all ? images.length : IMAGE_PAGE);\n const [blockCount, setBlockCount] = useState(all ? blocks.length : BLOCK_PAGE);\n const view = mcpResultView({\n output: props.output,\n expanded: true,\n isPartial: props.running,\n isError: props.isError,\n });\n const hasInput = Object.keys(props.args).length > 0;\n const hasOutput = props.output.length > 0 || view.status !== null || images.length > 0 || blocks.length > 0;\n const app = !props.running && hasApp(props.result?.details);\n return (\n <MessageItem\n tone={toolTone(props)}\n expandable={hasInput || hasOutput}\n defaultExpanded={defaultExpanded}\n testID=\"tool-mcp\"\n >\n {({ expanded: open }) => (\n <>\n <MessageItemHeader title=\"mcp\" testID=\"tool-call-mcp\">\n <Text numberOfLines={1} style={styles.call}>\n <Text style={styles.meta}>{identity.server} / </Text>\n <Text style={styles.link}>{identity.tool}</Text>\n </Text>\n </MessageItemHeader>\n {app ? (\n <MessageItemBody>\n <Text style={styles.meta}>\n This MCP App runs in Po on your computer. Open the session there to use it.\n </Text>\n </MessageItemBody>\n ) : null}\n {open && hasInput ? (\n <MessageItemBody testID=\"tool-input-mcp\" style={styles.part}>\n <Text style={styles.label}>Input</Text>\n <Literal source={JSON.stringify(props.args, null, 2)} copy all={all} label=\"complete input\" />\n </MessageItemBody>\n ) : null}\n {open && hasOutput ? (\n <MessageItemBody testID=\"tool-result-mcp\" style={styles.part}>\n {hasInput ? <Text style={styles.label}>Output</Text> : null}\n {view.lines.length > 0 ? <Literal source={view.lines.join('\\n')} all={all} revealed={revealed} /> : null}\n {images.slice(0, imageCount).map((image, index) => (\n <Image\n key={index}\n source={{ uri: `data:${image.mimeType};base64,${image.data}` }}\n accessibilityLabel={`${identity.tool} result ${index + 1}`}\n resizeMode=\"contain\"\n style={styles.image}\n />\n ))}\n {imageCount < images.length ? (\n <View style={styles.disclosure}>\n <Text style={styles.meta}>\n {imageCount} of {images.length} images\n </Text>\n <Button variant=\"ghost\" onPress={() => setImageCount((value) => value + IMAGE_PAGE)}>\n Show more images\n </Button>\n </View>\n ) : null}\n {blocks.slice(0, blockCount).map((block, index) => (\n <ResultBlock key={index} block={block} all={all} />\n ))}\n {blockCount < blocks.length ? (\n <View style={styles.disclosure}>\n <Text style={styles.meta}>\n {blockCount} of {blocks.length} additional blocks\n </Text>\n <Button variant=\"ghost\" onPress={() => setBlockCount((value) => value + BLOCK_PAGE)}>\n Show more blocks\n </Button>\n </View>\n ) : null}\n {view.status ? (\n <MessageItemStatus tone={STATUS_TONE[view.status.tone]} glyph={view.status.glyph}>\n {view.status.text}\n </MessageItemStatus>\n ) : null}\n </MessageItemBody>\n ) : null}\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n part: { gap: theme.spacing(1.5), minWidth: 0 },\n disclosure: { gap: theme.spacing(1), alignItems: 'flex-start' },\n call: {\n flexShrink: 1,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n meta: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n label: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: theme.fontWeight.semibold,\n },\n link: {\n color: theme.colors.blue,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n literal: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n codeText: { color: theme.colors.text },\n code: {\n borderRadius: theme.borderRadius.DEFAULT,\n borderWidth: 1,\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.deep,\n },\n codeScroll: { padding: theme.spacing(2.5), paddingRight: theme.spacing(9) },\n copy: { position: 'absolute', top: theme.spacing(1.5), right: theme.spacing(1.5) },\n image: { width: '100%', height: 240, borderRadius: theme.borderRadius.md },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { McpToolMessage } from './_components/McpToolMessage.native';\nimport { matchMcpTool, mcpIdentityFromDetails } from './_lib/mcpToolMatch';\n\nexport default defineToolRenderer({\n tools: [],\n matches: (toolName, statuses, details) =>\n mcpIdentityFromDetails(details) !== null || matchMcpTool(toolName, statuses) !== null,\n message: McpToolMessage,\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fillMcpAuth from '../src/extensions/workspaces/sessions/(frontend)/fill/McpAuth.context.native';\nimport toolMcp from '../src/extensions/workspaces/sessions/(frontend)/tool/mcp.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'mcp',\n session: {\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'context', id: 'mcp-auth' }, fillMcpAuth)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['mcp'] }, toolMcp)]; },\n },\n});\n"],"mappings":";;;;;;;;;;;AAmDA,MAAM,sBAAsB,IAAI,OAAO,GAAG,OAAO,aAAa,EAAE,EAAE,uBAAuB,IAAI;AAC7F,MAAM,2BAA2B;AACjC,MAAM,+BAA+B;AACrC,MAAM,mBAAmB;AACzB,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAC5B,MAAM,sBAAsB;AAC5B,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,SAAS,mBAAmB,OAA8C;CACxE,OAAO,oBAAoB,MAAM,UAAU,UAAU,KAAK;AAC5D;;AAiCA,MAAa,4BAA4B;AACzC,MAAa,gCAAgC;AAC7C,MAAa,8BAA8B;;AAE3C,MAAa,+BAA+B;;AAuD5C,SAAgB,0BAA0B,KAAiE;CACzG,IAAI,QAAQ,KAAA,KAAa,IAAI,KAAK,MAAM,IAAI,OAAO,KAAA;CACnD,IAAI;EACF,MAAM,QAAiB,KAAK,MAAM,IAAI,QAAQ,qBAAqB,EAAE,CAAC;EACtE,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,KAAK,MAAM,SAAS,0BAA0B,OAAO,KAAA;EAEnG,MAAM,wBAAQ,IAAI,IAAY;EAC9B,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,CAAC,wBAAwB,IAAI,KAAK,MAAM,IAAI,KAAK,IAAI,GAAG,OAAO,KAAA;GACnE,MAAM,IAAI,KAAK,IAAI;EACrB;EACA,OAAO;CACT,QAAQ;EACN;CACF;AACF;AAEA,SAAS,oBAAoB,OAAwB;CACnD,KAAK,MAAM,aAAa,OAAO;EAC7B,MAAM,YAAY,UAAU,YAAY,CAAC;EACzC,IAAI,cAAc,KAAA,MAAc,YAAY,MAAO,aAAa,OAAO,aAAa,MAAO,OAAO;CACpG;CACA,OAAO;AACT;AAEA,SAAS,mBAAmB,OAAiC;CAC3D,IAAI,OAAO,UAAU,YAAY,MAAM,SAAS,gCAAgC,oBAAoB,KAAK,GACvG,OAAO;CAET,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EACzB,QAAQ,IAAI,aAAa,WAAW,IAAI,aAAa,aAAa,IAAI,aAAa,MAAM,IAAI,aAAa;CAC5G,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,WAAW,OAAiC;CACnD,OACE,OAAO,UAAU,YACjB,MAAM,KAAK,MAAM,MACjB,MAAM,UAAU,wBAChB,CAAC,oBAAoB,KAAK;AAE9B;AAEA,SAAS,aAAa,OAAiC;CACrD,OAAO,OAAO,UAAU,YAAY,oBAAoB,KAAK,KAAK;AACpE;AAEA,SAAS,aAAa,OAAiC;CACrD,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS;AAC1E;AAEA,SAAS,gBAAgB,OAAkD;CACzE,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG,OAAO;CACxE,MAAM,SAAS;CACf,OACE,OAAO,KAAK,MAAM,CAAC,CAAC,OAAO,QAAQ,QAAQ,UAAU,QAAQ,YAAY,QAAQ,QAAQ,KACzF,WAAW,OAAO,IAAI,MACrB,EAAE,YAAY,WAAW,WAAW,OAAO,MAAM,OACjD,EAAE,YAAY,WAAW,aAAa,OAAO,MAAM;AAExD;AAEA,SAAS,wBAAwB,OAAmD;CAClF,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG,OAAO;CACxE,MAAM,SAAS;CACf,OACE,OAAO,KAAK,MAAM,CAAC,CAAC,OACjB,QACC,QAAQ,UAAU,QAAQ,WAAW,QAAQ,sBAAsB,QAAQ,WAAW,QAAQ,gBAClG,MACC,EAAE,oBAAoB,WACpB,MAAM,QAAQ,OAAO,cAAc,KAClC,OAAO,eAAe,UAAU,uBAChC,OAAO,eAAe,MAAM,YAAY,OAC3C,EAAE,sBAAsB,WAAW,mBAAmB,OAAO,gBAAgB,OAC7E,EAAE,WAAW,WACX,MAAM,QAAQ,OAAO,KAAK,KACzB,OAAO,MAAM,UAAU,oBACvB,OAAO,MAAM,MAAM,eAAe,MACtC,OAAO,OAAO,SAAS,YACvB,OAAO,KAAK,KAAK,MAAM,MACvB,CAAC,oBAAoB,OAAO,IAAI,KAChC,mBAAmB,OAAO,KAAK;AAEnC;;AAGA,MAAa,0BAA0B;AACvC,MAAa,yBAAyB;AACtC,MAAa,6BAA6B;;AAE1C,MAAa,0BAA0B;AACvC,MAAa,oBAAoB;;AAEjC,MAAa,uBAAuB;;AAEpC,MAAa,8BAA8B;;;;ACpQ3C,SAAgB,+BACd,kBACA,WACA,YACM;CACN,iBAAiB,WAAW;EAAE,MAAM;EAAU,SAAS,aAAa;CAAa,CAAC;AACpF;;AAGA,SAAgB,4BACd,kBACA,WACA,YACM;CACN,iBAAiB,WAAW;EAAE,MAAM;EAAU,SAAS,mBAAmB;CAAa,CAAC;AAC1F;;;;ACMA,MAAM,0BAA0B,GAAG,2BAA2B,IAAI;;;;;;;;;;;;;;;;AAiBlE,MAAM,SAAS;CACb,SAAS;EACP,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,uBAAuB;EAC/B,UAAU,KAAA;CACZ;CACA,UAAU;EACR,QAAQ;EACR,MAAM;EACN,UAAU,KAAA;CACZ;CACA,WAAW;EACT,QAAQ;EACR,MAAM;EACN,UAAU,KAAA;CACZ;CACA,mBAAmB;EACjB,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,uBAAuB;EAC/B,UAAU,KAAA;CACZ;;CAEA,qBAAqB;EACnB,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,uBAAuB;EAC/B,UAAU,KAAA;CACZ;;CAEA,WAAW;EACT,QAAQ;EACR,MAAM;EACN,UAAU,KAAA;CACZ;CACA,eAAe;EACb,QAAQ;EACR,MAAM;EACN,UAAU,KAAA;CACZ;;CAEA,aAAa;EACX,QAAQ;EACR,MAAM;EACN,OAAO,CAAC,+BAA+B,2BAA2B;EAClE,UAAU,KAAA;CACZ;;CAEA,eAAe;EACb,QAAQ;EACR,MAAM;EACN,UAAU,KAAA;CACZ;AACF;ACvFmB,gBAAgB,QAAQ;CACzC,QAAQ;EAHgB;EAAU;EAAa;CAGvC;CACR,UAAU;CACV,WAAW;CACX,gBAAgB;AAClB,CAAC;AAKD,MAAa,aAAa,gBAAgB,QAAQ;CAChD,QAAQ,CAHuB,SAGvB;CACR,UAAU;CACV,WAAW;CACX,gBAAgB;AAClB,CAAC;;;;ACbD,eAAsB,iBACpB,WACA,QACA,MACiC;CACjC,MAAM,SAAS,MAAM,WAClB,QAAQ,SAAS,CAAC,CAClB,YAAY,EAAE,OAAO;GAAG,gCAAgC;GAAS,8BAA8B;CAAK,EAAE,CAAC;CAC1G,IAAI,CAAC,OAAO,IAAI;EACd,IAAI,OAAO,WAAW,GAAG,OAAO;GAAE,IAAI;GAAO,OAAO;EAA8B;EAClF,OAAO;GAAE,IAAI;GAAO,OAAO,OAAO,UAAU,KAAK,wBAAwB,OAAO,OAAO,KAAK,OAAO;EAAM;CAC3G;CACA,OAAO;EAAE,IAAI;EAAM,QAAQ,OAAO;CAAK;AACzC;;;ACUA,SAASwB,UAAU,EAAEC,OAAOC,MAAMC,WAAkE;CAClG,OACE,qBAAC,WAAD;EAAW,OAAOC,SAAOC;EAAoBF;EAAS,mBAAkB;EAAS,oBAAoBF;EAArG,UAAA,CACE,oBAAC,MAAD;GAAM,OAAOG,SAAOH;GAAQA,UAAAA;EAAY,CAAA,GACvCC,OAAO,oBAAC,MAAD;GAAM,OAAOE,SAAOF;GAAOA,UAAAA;EAAW,CAAA,IAAI,IACzC;;AAEf;;;;;AAMA,SAAgBI,eAAe,EAAEhB,QAAQK,YAAYE,eAAeC,cAAcC,WAAgC;CAChH,MAAMQ,YAAYjB,QAAQE,UAAU;CACpC,MAAME,iBAAiBa,YAAY,CAAA,IAAMjB,QAAQI,kBAAkB,CAAA;CACnE,MAAMc,iBAAiBd,eAAee,SAAS;CAC/C,MAAMC,YAAY,CAACH,aAAa,CAACC,kBAAkBlB,WAAW,QAAQA,OAAOE,UAAU;CACvF,MAAMI,MAAMN,QAAQG;CACpB,OACE,oBAAC,OAAD;EACE,MAAMH,WAAW;EACjB,eAAeqB,SAAS;GACtB,IAAI,CAACA,MAAMZ,QAAQ;EACrB;EAEA,UAAA,qBAAC,cAAD,EAAA,UAAA;GACE,oBAAC,aAAD,EAAA,UACE,qBAAC,MAAD;IAAM,OAAOK,SAAOQ;IAApB,UAAA,CACE,oBAAC,YAAD,EAAA,UACGL,aAAaC,iBAAkBlB,QAAQC,QAAQ,KAAM,cAAcD,QAAQC,QAAQ,KAC1E,CAAA,GACZ,oBAAC,kBAAD,EAAA,UACGgB,YACG,+BACAC,iBACE,6CACA,sCACU,CAAA,CACd;GACK,CAAA,EAAA,CAAA;GACb,qBAAC,WAAD;IAAW,OAAOJ,SAAOS;IAAzB,UAAA;KACGL,iBACC,qBAAC,MAAD;MAAM,OAAOJ,SAAOU;MAApB,UAAA,CACGpB,eAAeqB,KAAKxB,SACnB,qBAAC,MAAD;OAAiB,OAAOa,SAAOY;OAA/B,UAAA,CAAwC,iBACzB,oBAAC,MAAD;QAAM,OAAOZ,SAAOa;QAAU1B,UAAAA;OAAW,CAAA,CAClD;MAFKA,GAAAA,IAEL,CACP,GAED,oBAAC,MAAD;OAAM,OAAOa,SAAOF;OAAK,UAAA;MAGnB,CAAA,CACF;KACJ,CAAA,IAAA;KACHQ,YACC,qBAAA,UAAA,EAAA,UAAA;MACE,qBAAC,MAAD;OAAM,OAAON,SAAOc;OAApB,UAAA;QACE,oBAAC,MAAD;SAAM,OAAOd,SAAOe;SAAY,UAAA;QAAO,CAAA;QACvC,qBAAC,MAAD;SAAM,OAAOf,SAAOgB;SAApB,UAAA,CACE,oBAAC,MAAD;UAAM,OAAOhB,SAAOH;UAAO,UAAA;SAAgC,CAAA,GAC3D,oBAAC,MAAD;UAAM,OAAOG,SAAOF;UAAM,UAAA;SAAyB,CAAA,CAC/C;;QACN,oBAAC,QAAD;SAAQ,SAAQ;SAAU,MAAK;SAAK,UAAU,CAACN;SAAK,eAAeA,OAAOD,WAAWC,GAAG;SAAE,UAAA;QAElF,CAAA;OACJ;;MACLA,MACC,qBAAC,MAAD;OAAM,OAAOQ,SAAOiB;OAApB,UAAA,CACE,oBAAC,MAAD;QAAM,YAAA;QAAW,eAAe;QAAG,OAAOjB,SAAOR;QAC9CA,UAAAA;OACG,CAAA,GACN,oBAAC,YAAD;QAAY,MAAMA;QAAK,OAAM;OAAW,CAAA,CACpC;MACJ,CAAA,IAAA;MACJ,qBAAC,MAAD;OAAM,OAAOQ,SAAOkB;OAApB,UAAA,CACE,oBAAC,SAAD,CAAQ,CAAA,GACR,oBAAC,MAAD;QAAM,OAAOlB,SAAOF;QACjBN,UAAAA,MAAM,0CAA0C;OAC7C,CAAA,CACF;;KACR,EAAA,CAAA,IACE;KACHN,UAAUA,OAAOE,UAAU,cAAc,CAACgB,iBACzC,qBAAC,MAAD;MAAM,OAAOJ,SAAOmB;MAApB,UAAA;OACE,oBAAC,MAAD;QAAM,OAAOnB,SAAOoB;QAAO,UAAA;OAAY,CAAA;OACvC,oBAAC,WAAD;QAAW,OAAM;QAAc,SAAS3B;OAAc,CAAA;OACrDU,YACC,oBAAC,WAAD;QACE,OAAM;QACN,MAAK;QACL,SAAST;OAAa,CAAA,IAEtB;MACA;KACJ,CAAA,IAAA;IACK;;GACX,oBAAC,aAAD,EAAA,UACE,oBAAC,QAAD;IAAQ,SAAQ;IAAQ,SAASC;IAC9BQ,UAAAA,YAAY,SAAS;GAChB,CAAA,EACG,CAAA;EACD,EAAA,CAAA;CACT,CAAA;AAEX;AAEA,MAAMH,WAASjB,WAAWsC,QAAQC,WAAW;CAC3Cd,UAAU;EAAEe,MAAM;EAAGC,UAAU;EAAGC,KAAKH,MAAMI,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;CACxDlB,MAAM;EAAEgB,KAAKH,MAAMI,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC9B9B,OAAO;EACL+B,UAAUN,MAAMM,SAASC;EACzBC,YAAYR,MAAMQ,WAAWD;EAC7BE,YAAYT,MAAMS,WAAWC;EAC7BC,OAAOX,MAAMY,OAAOC;EAAER,mBAAA,CAAA,CAAA;CACxB;CACA7B,MAAM;EAAE8B,UAAUN,MAAMM,SAASQ;EAAIN,YAAYR,MAAMe,kBAAkBD;EAAIH,OAAOX,MAAMY,OAAOI;EAAGX,mBAAA,CAAA,CAAA;CAAC;CACrGP,OAAO;EACLQ,UAAUN,MAAMM,SAASQ;EACzBN,YAAYR,MAAMQ,WAAWM;EAC7BL,YAAYT,MAAMS,WAAWQ;EAC7BN,OAAOX,MAAMY,OAAOI;EAAGX,mBAAA,CAAA,CAAA;CACzB;CACAb,MAAM;EAAE0B,eAAe;EAAOC,YAAY;EAAUhB,KAAKH,MAAMI,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC1EX,UAAU;EAAEO,MAAM;EAAGC,UAAU;EAAGC,KAAK;CAAE;CACzCV,YAAY;EACV2B,OAAO;EACPC,QAAQ;EACRC,cAAc;EACdC,aAAa;EACbC,aAAaxB,MAAMY,OAAOa;EAC1BC,WAAW;EACXpB,UAAUN,MAAMM,SAASQ;EACzBN,YAAY;EACZC,YAAYT,MAAMS,WAAWQ;EAC7BN,OAAOX,MAAMY,OAAOa;EAAKpB,mBAAA,CAAA,CAAA;CAC3B;CACAV,MAAM;EACJuB,eAAe;EACfC,YAAY;EACZhB,KAAKH,MAAMI,QAAQ,CAAC;EACpBuB,aAAa3B,MAAMI,QAAQ,CAAC;EAC5BkB,cAActB,MAAMsB,aAAaM;EACjCL,aAAa9D,WAAWoE;EACxBL,aAAaxB,MAAMY,OAAOkB;EAAMzB,mBAAA,CAAA,CAAA;CAClC;CACAnC,KAAK;EACH+B,MAAM;EACN8B,YAAY/E,OAAOgD,MAAM+B,WAAWC,IAAI;EACxC1B,UAAUN,MAAMM,SAASQ;EACzBN,YAAYR,MAAMQ,WAAWM;EAC7BH,OAAOX,MAAMY,OAAOI;EAAGX,mBAAA,CAAA,CAAA;CACzB;CACAT,SAAS;EAAEsB,eAAe;EAAOC,YAAY;EAAUhB,KAAKH,MAAMI,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC7ER,QAAQ;EACNM,KAAKH,MAAMI,QAAQ,CAAC;EACpB6B,YAAYjC,MAAMI,QAAQ,CAAC;EAC3B8B,gBAAgBzE,WAAWoE;EAC3BM,gBAAgBnC,MAAMY,OAAO;EAAcP,mBAAA,CAAA,CAAA;CAC7C;CACA1B,WAAW;EAAEyD,WAAW;EAAIC,gBAAgB;EAAUlC,KAAK;CAAE;CAC7Df,KAAK;EACHe,KAAKH,MAAMI,QAAQ,CAAC;EACpBkC,SAAStC,MAAMI,QAAQ,CAAC;EACxBkB,cAActB,MAAMsB,aAAaM;EACjCL,aAAa9D,WAAWoE;EACxBL,aAAaxB,MAAMY,OAAO;EAC1B2B,iBAAiBvC,MAAMY,OAAO;EAAeP,mBAAA,CAAA,CAAA;CAC/C;CACAf,UAAU;EACRgB,UAAUN,MAAMM,SAASC;EACzBC,YAAYR,MAAMQ,WAAWD;EAC7BE,YAAYT,MAAMS,WAAWQ;EAC7BN,OAAOX,MAAMY,OAAO4B;EAAOnC,mBAAA,CAAA,CAAA;CAC7B;CACAd,SAAS;EAAEwC,YAAY/E,OAAOgD,MAAM+B,WAAWC,IAAI;EAAGvB,YAAYT,MAAMS,WAAWC;EAAQC,OAAOX,MAAMY,OAAOC;EAAER,mBAAA,CAAA,CAAA;CAAC;AACpH,EAAE;;;;ACzLF,MAAMuD,QAAiG;CACrGO,WAAW;EAAEL,OAAO;EAAaC,KAAK;EAASC,KAAK;CAAM;CAC1DI,YAAY;EAAEN,OAAO;EAAcC,KAAK;EAASC,KAAK;CAAM;CAC5DK,UAAU;EAAEP,OAAO;EAAYC,KAAK;EAAUC,KAAK;CAAM;CACzD,cAAc;EAAEF,OAAO;EAAiBC,KAAK;EAASC,KAAK;EAAWE,QAAQ;CAAS;CACvF,iBAAiB;EAAEJ,OAAO;EAAiBC,KAAK;EAASC,KAAK;EAAOE,QAAQ;CAAU;CACvFI,QAAQ;EAAER,OAAO;EAAgBC,KAAK;EAASC,KAAK;EAAOE,QAAQ;CAAU;CAC7EK,QAAQ;EAAET,OAAO;EAAoBC,KAAK;EAAOC,KAAK;EAAOE,QAAQ;CAAQ;CAC7EM,UAAU;EAAEV,OAAO;EAAYC,KAAK;EAASC,KAAK;CAAM;AAC1D;AAEA,MAAMS,eAAuC;CAAEC,QAAQ;CAAWC,SAAS;CAAWC,OAAO;AAAY;;AAGzG,MAAMC,eAAoD;CAAEf,OAAO;CAAgBC,KAAK;CAASC,KAAK;AAAU;AAIhH,SAASc,WAAWC,MAAoC;CACtD,MAAMC,QAAQD,KAAK1B,WAAW4B,KAAAA,IAAY,MAAM,IAAIF,KAAK1B,OAAO6B,eAAe;CAC/E,OAAOH,KAAKzB,SAAS0B,QAAQ,IAAIA,MAAK;AACxC;;;;;AAeA,SAAgBS,kBAAkB,EAAEL,SAASC,aAAaE,cAAcC,cAAsC;CAC5G,MAAM,CAACE,iBAAiBC,sBAAsB3C,SAAS,CAAC;CACxD,MAAM4C,mBAAmBR,QAAQS,QAAQP,WAAWA,OAAO7B,MAAMqC,SAAS,CAAC;CAC3E,MAAMC,eAAe,IAAIC,IAAIJ,iBAAiBK,MAAM,GAAGP,eAAe,CAAC,CAACQ,KAAKZ,WAAWA,OAAOlC,IAAI,CAAC;CACpG,IAAIgC,QAAQU,WAAW,GAAG,OAAO;CACjC,OACE,qBAAC,MAAD;EAAM,QAAO;EAAmB,OAAOK,SAAOC;EAA9C,UAAA;GACE,qBAAC,MAAD;IAAM,OAAOD,SAAOE;IAApB,UAAA,CACE,oBAAC,MAAD;KAAM,OAAOF,SAAOG;KAAO,mBAAkB;KAAQ,UAAA;IAE/C,CAAA,GACN,oBAAC,MAAD;KAAM,OAAOH,SAAOI;KAAM,UAAA;IAA+D,CAAA,CACrF;;GACLnB,QAAQc,KAAKZ,QAAQkB,UAAU;IAE9B,MAAME,OADiBpB,OAAO9B,UAAU,gBAAgB8B,OAAO5B,gBAAgBoC,UAAU,KAAK,IAChEjB,eAAejB,MAAM0B,OAAO9B;IAC1D,OACE,qBAAC,MAAD;KAAwB,OAAO,CAAC2C,SAAOb,QAAQkB,QAAQ,KAAKL,SAAOQ,OAAO;KAA1E,UAAA,CACE,qBAAC,MAAD;MAAM,OAAOR,SAAOS;MAApB,UAAA;OACE,oBAAC,KAAD;QAAK,MAAMF,KAAK3C;QAAK,OAAOuB,OAAO9B,UAAU;OAAa,CAAA;OAC1D,oBAAC,MAAD;QAAM,eAAe;QAAG,OAAO2C,SAAO/C;QACnCkC,UAAAA,OAAOlC;OACJ,CAAA;OACN,oBAAC,MAAD;QAAM,OAAO+C,SAAOnC,IAAI0C,KAAK1C,GAAG;QAAI0C,UAAAA,KAAK5C;OAAY,CAAA;OACpDwB,OAAO9B,UAAU,eAAe,oBAAC,SAAD,CAAQ,CAAA,IAAM;OAC9CkD,KAAKxC,SACJ,oBAAC,QAAD;QACE,SAAQ;QACR,MAAK;QACL,eAAemB,YAAYC,OAAOlC,IAAI;QACtC,oBAAoB,GAAGqB,aAAaiC,KAAKxC,QAAO,IAAKoB,OAAOlC;QAE3DqB,UAAAA,aAAaiC,KAAKxC;OACb,CAAA,IACN;OACJ,oBAAC,WAAD;QACE,eAAeqB,aAAaD,OAAOlC,IAAI;QACvC,SAAS;QACT,mBAAkB;QAClB,oBAAoB,UAAUkC,OAAOlC;QAErC,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAG,CAAA;OACX,CAAA;MACP;KACLkC,CAAAA,GAAAA,OAAO7B,MAAMqC,SAAS,KAAKC,aAAac,IAAIvB,OAAOlC,IAAI,IACtD,oBAAC,MAAD;MAAM,OAAO+C,SAAO1C;MACjB6B,UAAAA,OAAO7B,MAAMyC,KAAKnB,SACjB,qBAAC,WAAD;OAEE,OAAOoB,SAAOpB;OACd,eAAeS,WAAWF,OAAOlC,MAAM2B,KAAK3B,IAAI;OAChD,mBAAkB;OAClB,oBAAoB,mBAAmB2B,KAAK3B;OAL9C,UAAA;QAOE,oBAAC,MAAD;SAAM,OAAO+C,SAAOW;SAAM,UAAA;QAAO,CAAA;QACjC,oBAAC,MAAD;SAAM,eAAe;SAAG,OAAO,CAACX,SAAOY,UAAU,CAAChC,KAAKzB,UAAU6C,SAAOa,QAAQ;SAC7EjC,UAAAA,KAAK3B;QACF,CAAA;QACN,oBAAC,MAAD;SAAM,OAAO+C,SAAO9C;SAASyB,UAAAA,WAAWC,IAAI;QAAQ,CAAA;OAC3C;MAXJA,GAAAA,KAAK3B,IAWD,CACZ;KACG,CAAA,IACJkC,OAAO7B,MAAMqC,SAAS,IACxB,qBAAC,MAAD;MAAM,OAAO,CAACK,SAAOI,MAAMJ,SAAOc,MAAM;MAAxC,UAAA,CAA4C3B,OAAO7B,MAAMqC,QAAO,QAAY;KAC1ER,CAAAA,IAAAA,OAAO9B,UAAU,eACnB,oBAAC,MAAD;MAAM,OAAO,CAAC2C,SAAOI,MAAMJ,SAAOc,MAAM;MAAG,UAAA;KAAqC,CAAA,IAC9E,IACA;IAlDK3B,GAAAA,OAAOlC,IAkDZ;GAEV,CAAC;GACAsC,kBAAkBE,iBAAiBE,SAClC,qBAAC,MAAD;IAAM,OAAOK,SAAOE;IAApB,UAAA,CACE,qBAAC,MAAD;KAAM,OAAOF,SAAOI;KAApB,UAAA;MACGb;MAAgB;MAAKE,iBAAiBE;MAAO;KAC1C;IACN,CAAA,GAAA,oBAAC,QAAD;KAAQ,SAAQ;KAAQ,eAAeH,oBAAoBX,UAAUA,QAAQ,CAAC;KAAE,UAAA;IAExE,CAAA,CACJ;GACJ,CAAA,IAAA;EACA;;AAEV;AAEA,MAAMmB,WAASlD,WAAWiE,QAAQC,WAAW;CAC3Cf,SAAS;EAAEgB,KAAKD,MAAME,QAAQ,CAAC;EAAGC,mBAAmBH,MAAME,QAAQ,CAAC;EAAGE,iBAAiBJ,MAAME,QAAQ,CAAC;EAACG,mBAAA,CAAA,CAAA;CAAC;CACzGnB,MAAM;EAAEe,KAAKD,MAAME,QAAQ,CAAC;EAAGI,eAAeN,MAAME,QAAQ,CAAC;EAACG,mBAAA,CAAA,CAAA;CAAC;CAC/DlB,OAAO;EACLoB,UAAUP,MAAMO,SAASC;EACzBC,YAAYT,MAAMS,WAAWD;EAC7BE,YAAYV,MAAMU,WAAWC;EAC7BC,OAAOZ,MAAMa,OAAOC;EAAET,mBAAA,CAAA,CAAA;CACxB;CACAjB,MAAM;EAAEmB,UAAUP,MAAMO,SAASQ;EAAIN,YAAYT,MAAMgB,kBAAkBD;EAAIH,OAAOZ,MAAMa,OAAOI;EAAGZ,mBAAA,CAAA,CAAA;CAAC;CACrGlC,QAAQ;EAAE8B,KAAKD,MAAME,QAAQ,CAAC;EAAGE,iBAAiBJ,MAAME,QAAQ,CAAC;EAACG,mBAAA,CAAA,CAAA;CAAC;CACnEb,SAAS;EAAE0B,gBAAgBpF,WAAWqF;EAAeC,gBAAgBpB,MAAMa,OAAO;EAAcR,mBAAA,CAAA,CAAA;CAAC;CACjGZ,KAAK;EAAE4B,eAAe;EAAOC,YAAY;EAAUrB,KAAKD,MAAME,QAAQ,GAAG;EAAGqB,WAAW;EAAElB,mBAAA,CAAA,CAAA;CAAC;CAC1FpE,MAAM;EACJuF,MAAM;EACNjB,UAAUP,MAAMO,SAASkB;EACzBhB,YAAYT,MAAMS,WAAWgB;EAC7Bf,YAAYV,MAAMU,WAAWC;EAC7BC,OAAOZ,MAAMa,OAAOC;EAAET,mBAAA,CAAA,CAAA;CACxB;CACAxD,MAAM6E,WAAgB;EAAEnB,UAAUP,MAAMO,SAASQ;EAAIN,YAAYT,MAAMS,WAAWM;EAAIH,OAAOZ,MAAMa,OAAOa;EAAMrB,mBAAA,CAAA,CAAA;CAAC;CACjHP,QAAQ;EAAE6B,aAAa3B,MAAME,QAAQ,CAAC;EAACG,mBAAA,CAAA,CAAA;CAAC;CACxC/D,OAAO;EAAE2D,KAAKD,MAAME,QAAQ,EAAG;EAAGyB,aAAa3B,MAAME,QAAQ,CAAC;EAACG,mBAAA,CAAA,CAAA;CAAC;CAChEzC,MAAM;EAAEyD,eAAe;EAAOC,YAAY;EAAUrB,KAAKD,MAAME,QAAQ,CAAC;EAAGqB,WAAW;EAAElB,mBAAA,CAAA,CAAA;CAAC;CACzFV,MAAM;EACJiC,OAAO;EACPrB,UAAUP,MAAMO,SAAS;EACzBE,YAAYT,MAAMS,WAAW;EAC7BC,YAAYV,MAAMU,WAAWC;EAC7BC,OAAOZ,MAAMa,OAAOgB;EAAMxB,mBAAA,CAAA,CAAA;CAC5B;CACAT,UAAU;EACR4B,MAAM;EACNM,YAAYpG,OAAOsE,MAAM8B,WAAWC,IAAI;EACxCxB,UAAUP,MAAMO,SAASkB;EACzBhB,YAAYT,MAAMS,WAAWgB;EAC7Bb,OAAOZ,MAAMa,OAAOC;EAAET,mBAAA,CAAA,CAAA;CACxB;CACAR,UAAU;EAAEe,OAAOZ,MAAMa,OAAOI;EAAGZ,mBAAA,CAAA,CAAA;CAAC;CACpCnE,QAAQ;EAAEqE,UAAUP,MAAMO,SAASQ;EAAIN,YAAYT,MAAMS,WAAWM;EAAIH,OAAOZ,MAAMa,OAAOI;EAAGZ,mBAAA,CAAA,CAAA;CAAC;AAClG,EAAE;;;;AC9JF,SAAgBgD,mBAAmB,EAAEP,QAAQI,QAAQC,OAAOC,WAAoC;CAC9F,OACE,oBAAC,OAAD;EACE,MAAMN,WAAW;EACjB,eAAeQ,SAAS;GACtB,IAAI,CAACA,MAAMF,QAAQ;EACrB;EAEA,UAAA,qBAAC,cAAD,EAAA,UAAA;GACE,oBAAC,aAAD,EAAA,UACE,qBAAC,MAAD;IAAM,OAAOG,SAAOC;IAApB,UAAA,CACE,oBAAC,YAAD;KAAY,OAAOD,SAAOE;KAAOX,UAAAA,QAAQC,UAAU;IAAe,CAAA,GAClE,qBAAC,MAAD;KAAM,OAAOQ,SAAOG;KAApB,UAAA;MACGZ,QAAQE;MACRF,QAAQG,cAAc,QAAQ,sBAAsB;MACpDC,SAAS,OAAOA,OAAOS,OAAOC,eAAe,EAAC,WAAY;KACvD;IACF,CAAA,CAAA;GACK,CAAA,EAAA,CAAA;GACb,qBAAC,WAAD;IAAW,OAAOL,SAAOM;IAAzB,UAAA;KACGV,QAAQ,oBAAC,MAAD;MAAM,OAAOI,SAAOJ;MAAQA,UAAAA;KAAY,CAAA,IAAI;KACpD,CAACD,UAAU,CAACC,QAAQ,oBAAC,SAAD,EAAS,OAAM,mBAAkB,CAAA,IAAM;KAC3DD,QAAQY,cAAc,oBAAC,MAAD;MAAM,OAAOP,SAAOQ;MAAOb,UAAAA,OAAOY;KAAkB,CAAA,IAAI;KAC9EZ,QAAQc,UAAUC,SACjB,oBAAC,MAAD;MAAM,OAAOV,SAAOS;MAAU,oBAAmB;MAC9Cd,UAAAA,OAAOc,SAASE,KAAKC,YACpB,qBAAC,MAAD;OAAmE,OAAOZ,SAAOY;OAAjF,UAAA;QACGA,QAAQC;QAAO;QAAED,QAAQE;QAAK;QAAGF,QAAQG;OACtC;MAFK,GAAA,GAAGH,QAAQC,OAAM,GAAID,QAAQE,KAAI,GAAIF,QAAQG,SAElD,CACP;KACG,CAAA,IACJ;KACHpB,SACC,qBAAC,MAAD;MAAM,OAAOK,SAAOgB;MAApB,UAAA,CACE,oBAAC,MAAD;OAAM,OAAOhB,SAAOiB;OAAO,UAAA;MAAkB,CAAA,GAC7C,oBAAC,WAAD;OAAW,MAAMC,KAAKC,UAAUxB,OAAOyB,aAAa,MAAM,CAAC;OAAG,UAAS;MAAM,CAAA,CACzE;KACJ,CAAA,IAAA;IACK;;GACX,oBAAC,aAAD,EAAA,UACE,oBAAC,QAAD;IAAQ,SAAQ;IAAU,SAASvB;IAAQ,UAAA;GAEnC,CAAA,EACG,CAAA;EACD,EAAA,CAAA;CACT,CAAA;AAEX;AAEA,MAAMG,WAASZ,WAAWiC,QAAQC,WAAW;CAC3CrB,UAAU;EAAEsB,MAAM;EAAGC,UAAU;EAAGC,KAAKH,MAAMI,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;CACxDzB,MAAM;EAAE0B,YAAYhD,OAAO0C,MAAMM,WAAW1B,IAAI;EAACyB,mBAAA,CAAA,CAAA;CAAC;CAClDrB,MAAM;EAAEmB,KAAKH,MAAMI,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC9BnB,MAAM;EAAEqB,UAAUP,MAAMO,SAASC;EAAMC,YAAYT,MAAMU,kBAAkBF;EAAMG,OAAOX,MAAMY,OAAO1B;EAAImB,mBAAA,CAAA,CAAA;CAAC;CAC1GxB,MAAM;EAAE0B,UAAUP,MAAMO,SAASM;EAAIJ,YAAYT,MAAMS,WAAWI;EAAIF,OAAOX,MAAMY,OAAOE;EAAGT,mBAAA,CAAA,CAAA;CAAC;CAC9F/B,OAAO;EAAEiC,UAAUP,MAAMO,SAASM;EAAIJ,YAAYT,MAAMU,kBAAkBG;EAAIF,OAAOX,MAAMY,OAAOG;EAAGV,mBAAA,CAAA,CAAA;CAAC;CACtGV,OAAO;EACLY,UAAUP,MAAMO,SAASM;EACzBJ,YAAYT,MAAMS,WAAWI;EAC7BG,YAAYhB,MAAMgB,WAAWC;EAC7BN,OAAOX,MAAMY,OAAOE;EAAGT,mBAAA,CAAA,CAAA;CACzB;CACAlB,UAAU;EAAEgB,KAAKH,MAAMI,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;CAClCf,SAAS;EAAEiB,UAAUP,MAAMO,SAASC;EAAMC,YAAYT,MAAMS,WAAWD;EAAMG,OAAOX,MAAMY,OAAOM;EAAMb,mBAAA,CAAA,CAAA;CAAC;CACxGX,QAAQ;EAAES,KAAKH,MAAMI,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;AAClC,EAAE;;;;;;;;AChEF,SAAgBmC,kBAAkB,EAChCL,WACAM,UACAC,kBACAC,mBAAmB,CAAA,KACE;CACrB,MAAMC,YAAYlB,0BAA0Be,SAAAA,sBAAqC,KAAK,CAAA;CACtF,MAAM,CAACI,cAAcC,mBAAmBxB,SAAqD,IAAI;CACjG,MAAM,CAAC0B,YAAYC,iBAAiB3B,SAA4B,IAAI;CACpE,MAAM,CAAC4B,QAAQC,aAAa7B,SAAwE;CAEpG,MAAMiC,UAAUP,aAAa,GAAGA,WAAWb,UAAS,GAAIa,WAAWZ,OAAM,GAAIY,WAAWX,SAASmB,KAAAA;CACjGnC,gBAAgB;EACd,IAAI,CAAC2B,cAAc,CAACO,SAAS;EAC7B,IAAIE,OAAO;EACX,iBAAsBT,WAAWb,WAAWa,WAAWZ,QAAQY,WAAWX,IAAI,CAAC,CAACqB,MAAMC,WAAW;GAC/F,IAAI,CAACF,MAAM;GACXN,UAAUQ,OAAOC,KAAK;IAAER,KAAKG;IAASF,OAAOM,OAAOT;GAAO,IAAI;IAAEE,KAAKG;IAASD,OAAOK,OAAOL;GAAM,CAAC;EACtG,CAAC;EACD,aAAa;GACXG,OAAO;EACT;CACF,GAAG,CAACF,SAASP,UAAU,CAAC;CAExB,MAAMa,OAA8BjB,UAAUkB,KAAKC,SAAS;EAE1D,MAAMC,YAAYrB,iBAAiBsB,QAAQC,UAAUA,MAAMC,WAAW,SAASD,MAAME,UAAUL,KAAKhB,IAAI;EACxG,IAAIiB,UAAUK,SAAS,GACrB,OAAO;GACLtB,MAAMgB,KAAKhB;GACXuB,OAAOP,KAAKO;GACZC,gBAAgBR,KAAKQ;GACrBC,OAAOR,UACJC,QAAQC,UAAUA,MAAMO,aAAa,MAAM,CAAC,CAC5CX,KAAKI,WAAW;IAAEnB,MAAMmB,MAAMnB;IAAM2B,QAAQR,MAAMQ,UAAUlB,KAAAA;IAAWmB,QAAQT,MAAMS;GAAO,EAAE;EACnG;EAEF,OAAO;GACL5B,MAAMgB,KAAKhB;GACXuB,OAAOP,KAAKO;GACZC,gBAAgBR,KAAKQ;GACrBC,QAAQT,KAAKS,SAAS,CAAA,EAAA,CAAIV,KAAKzB,UAAU;IAAEU,MAAMV,KAAKC,UAAUD,KAAKU;IAAM2B,QAAQrC,KAAKqC;IAAQC,QAAQ;GAAM,EAAE;EAClH;CACF,CAAC;CAED,MAAMC,WAAW/B,cAAcV,cAAcA,YAAYU,eAAe;CACxE,MAAMT,SAASQ,UAAUiC,MAAMd,SAASA,KAAKhB,SAAS6B,UAAU7B,IAAI;CAEpE,MAAM+B,aAAa/B,SAAiB;EAClC,IAAIZ,cAAc,MAAM;EACxBW,gBAAgB;GAAEX;GAAWY;EAAK,CAAC;EACnC,MAAMgC,UAAUnC,UAAUiC,MAAMd,SAASA,KAAKhB,SAASA,IAAI;EAC3D,IAAI,CAACgC,SAASC,oBAAoBD,SAAST,UAAU,cACnD3C,+BAA+Be,kBAAkBP,WAAWY,IAAI;CAEpE;CAEA,MAAMkC,YAAYC,YAAoBC,aAAqB;EACzD,IAAIhD,cAAc,MAAM;EAExB,MAAMkD,YADYzC,UAAUiC,MAAMd,SAASA,KAAKhB,SAASmC,UAAU,CAAC,EAAEV,SAAS,CAAA,EAAA,CACpDK,MAAMxC,UAAUA,KAAKC,UAAUD,KAAKU,UAAUoC,QAAQ;EACjF,IAAI,CAACE,UAAU;EACf,MAAM9C,YAAYI,iBAAiB2C,MAChCpB,UAAUA,MAAMC,WAAW,SAASD,MAAMnB,SAASoC,YAAYjB,MAAMS,MACxE;EACA1B,cAAc;GAAEd;GAAWC,QAAQ8C;GAAY7C,MAAMgD,SAAStC;GAAMT,QAAQ6C;GAAU5C;EAAU,CAAC;CACnG;CAEA,MAAMgD,cAAcrC,UAAUA,OAAOE,QAAQG,UAAUL,SAASM,KAAAA;CAEhE,OACE,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,mBAAD;GACE,SAASK;GACT,aAAaiB;GACb,eAAe/B,SAAS;IACtB,IAAIZ,cAAc,MAAMW,gBAAgB;KAAEX;KAAWY;IAAK,CAAC;GAC7D;GACA,YAAYkC;EAAS,CAAA;EAEvB,oBAAC,gBAAD;GACE,QACE7C,SACI;IACEW,MAAMX,OAAOW;IACbuB,OAAOlC,OAAOkC;IACdU,kBAAkB5C,OAAO4C;IACzBT,gBAAgBnC,OAAOmC;GACzB,IACA;GAEN,aAAaiB,QAAQ,KAAKjE,QAAQkE,QAAQD,GAAG;GAC7C,qBAAqB;IACnB,IAAIZ,UAAUjD,+BAA+Be,kBAAkBkC,SAASzC,WAAWyC,SAAS7B,IAAI;GAClG;GACA,oBAAoB;IAClB,IAAI6B,UAAUhD,4BAA4Bc,kBAAkBkC,SAASzC,WAAWyC,SAAS7B,IAAI;GAC/F;GACA,eAAeD,gBAAgB,IAAI;EAAE,CAAA;EAEvC,oBAAC,oBAAD;GACE,QACEE,aAAa;IAAEV,QAAQU,WAAWV;IAAQF,QAAQY,WAAWZ;IAAQG,WAAWS,WAAWT;GAAU,IAAI;GAE3G,GAAKgD,aAAalC,QAAQ,EAAEH,QAAQqC,YAAYlC,MAAM,IAAI,CAAC;GAC3D,GAAKkC,aAAajC,QAAQ,EAAEA,OAAOiC,YAAYjC,MAAM,IAAI,CAAC;GAC1D,eAAeL,cAAc,IAAI;EAAE,CAAA;CAEvC,EAAA,CAAA;AAEJ;;;ACtIA,IAAA,iCAAe,WAAW,EAAE,WAAW,kBAAkB,CAAC;;;;;;;;;;;;ACQ1D,MAAa,iBAAiB;AAC9B,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;;AAG1B,MAAM,yBAAyB;;AAQ/B,SAAgB,WAAW,UAAsD;CAC/E,MAAM,MAAM,SAAS;CACrB,IAAI,QAAQ,KAAA,GAAW,OAAO,CAAC;CAC/B,OAAO,IACJ,MAAM,gBAAgB,CAAC,CACvB,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,QAAQ,SAAS,KAAK,SAAS,CAAC;AACrC;;;;;;AAOA,SAAgB,aAAa,UAAkB,UAAoE;CACjH,IAAI,OAA+B;CACnC,KAAK,MAAM,UAAU,WAAW,QAAQ,GAAG;EACzC,MAAM,SAAS,GAAG,SAAS;EAC3B,IAAI,CAAC,SAAS,WAAW,MAAM,KAAK,SAAS,WAAW,OAAO,QAAQ;EACvE,IAAI,SAAS,QAAQ,OAAO,SAAS,KAAK,OAAO,QAC/C,OAAO;GAAE;GAAQ,MAAM,SAAS,MAAM,OAAO,MAAM;EAAE;CAEzD;CACA,OAAO;AACT;;AAGA,SAAgB,uBAAuB,SAA0C;CAC/E,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM,OAAO;CAC5D,MAAM,SAAS;CACf,IAAI,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,SAAS,UAAU,OAAO;CACjF,OAAO;EAAE,QAAQ,OAAO;EAAQ,MAAM,OAAO;CAAK;AACpD;;AA0BA,SAAgB,cAAc,OAKZ;CAChB,MAAM,MAAM,MAAM,OAAO,MAAM,IAAI;CACnC,OAAO,IAAI,SAAS,KAAK,IAAI,GAAG,EAAE,CAAC,EAAE,KAAK,MAAM,IAAI,IAAI,IAAI;CAC5D,MAAM,QAAQ,MAAM,WAAW,MAAM,IAAI,MAAM,GAAG,sBAAsB;CAExE,IAAI,MAAM,WAAW,OAAO;EAAE;EAAO,QAAQ;GAAE,OAAO;GAAK,MAAM;GAAW,MAAM;EAAU;CAAE;CAC9F,IAAI,MAAM,SAAS,OAAO;EAAE;EAAO,QAAQ;GAAE,OAAO;GAAK,MAAM;GAAS,MAAM;EAAS;CAAE;CACzF,IAAI,CAAC,MAAM,YAAY,IAAI,SAAS,MAAM,QACxC,OAAO;EAAE;EAAO,QAAQ;GAAE,OAAO;GAAK,MAAM;GAAQ,MAAM,GAAG,IAAI,SAAS,MAAM,OAAO;EAAe;CAAE;CAE1G,IAAI,MAAM,WAAW,GAAG,OAAO;EAAE;EAAO,QAAQ;GAAE,OAAO;GAAK,MAAM;GAAM,MAAM;EAAO;CAAE;CACzF,OAAO;EAAE;EAAO,QAAQ;CAAK;AAC/B;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;AAGA,SAAS,eAAe,OAAuC;CAC7D,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAC7B,MAAM,QAAQ,QAAqC,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,KAAA;CACjG,QAAQ,MAAM,MAAd;EACE,KAAK,SAAS;GACZ,MAAM,OAAO,KAAK,MAAM;GACxB,MAAM,WAAW,KAAK,UAAU;GAChC,OAAO,SAAS,KAAA,KAAa,aAAa,KAAA,IAAY;IAAE,MAAM;IAAS;IAAM;GAAS,IAAI;EAC5F;EACA,KAAK,iBAAiB;GACpB,MAAM,MAAM,KAAK,KAAK;GACtB,MAAM,OAAO,KAAK,MAAM;GACxB,IAAI,QAAQ,KAAA,KAAa,SAAS,KAAA,GAAW,OAAO;GACpD,MAAM,QAAQ,KAAK,OAAO;GAC1B,MAAM,cAAc,KAAK,aAAa;GACtC,MAAM,WAAW,KAAK,UAAU;GAChC,OAAO;IACL,MAAM;IACN;IACA;IACA,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;IACvC,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY;IACnD,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;GAC/C;EACF;EACA,KAAK,YAAY;GACf,MAAM,MAAM,KAAK,KAAK;GACtB,IAAI,QAAQ,KAAA,GAAW,OAAO;GAC9B,MAAM,WAAW,KAAK,UAAU;GAChC,MAAM,UAAU,KAAK,MAAM;GAC3B,MAAM,OAAO,KAAK,MAAM;GACxB,OAAO;IACL,MAAM;IACN;IACA,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;IAC7C,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,QAAQ;IACjD,GAAI,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK;GACvC;EACF;EACA,KAAK,cACH,OAAO,SAAS,MAAM,KAAK,IAAI;GAAE,MAAM;GAAc,OAAO,MAAM;EAAM,IAAI;EAC9E,SACE,OAAO;CACX;AACF;;AAGA,SAAgB,gBAAgB,SAAoC;CAClE,IAAI,CAAC,SAAS,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,MAAM,GAAG,OAAO,CAAC;CAClE,OAAO,QAAQ,OAAO,SAAS,UAAU;EACvC,MAAM,QAAQ,eAAe,KAAK;EAClC,OAAO,UAAU,OAAO,CAAC,IAAI,CAAC,KAAK;CACrC,CAAC;AACH;;AAQA,SAAgB,eAAe,SAA8C;CAC3E,OAAO,QAAQ,SAAS,UAAU;EAChC,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,SAAS,SAAS,OAAO,CAAC;EACxD,OAAO,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,aAAa,WAC/D,CAAC;GAAE,MAAM,MAAM;GAAM,UAAU,MAAM;EAAS,CAAC,IAC/C,CAAC;CACP,CAAC;AACH;;;ACpJA,MAAM6D,iBAAiB;AACvB,MAAMC,YAAY;AAClB,MAAMC,aAAa;AACnB,MAAMC,aAAa;AACnB,MAAMC,cAAiD;CACrDE,SAAS;CACTC,IAAI;CACJC,OAAO;CACPC,MAAM;AACR;AAEA,SAASC,iBAAiBC,UAAoD;CAC5E,MAAMG,YAAYH,SAASI,QAAQ,GAAG;CACtC,IAAID,aAAa,GAAG,OAAO;EAAEF,QAAQD;EAAUE,MAAM;CAAG;CACxD,OAAO;EAAED,QAAQD,SAASK,MAAM,GAAGF,SAAS;EAAGD,MAAMF,SAASK,MAAMF,YAAY,CAAC;CAAE;AACrF;AAEA,SAASG,OAAOC,SAA2B;CACzC,IAAIA,YAAY,QAAQ,OAAOA,YAAY,YAAY,EAAE,SAASA,UAAU,OAAO;CACnF,MAAMC,MAAMD,QAAQC;CACpB,OACEA,QAAQ,QACR,OAAOA,QAAQ,YACf,aAAaA,OACbA,IAAIC,YAAY,KAChB,iBAAiBD,OACjB,OAAOA,IAAIE,gBAAgB;AAE/B;;AAGA,SAASC,QAAQ,EACfC,QACAC,OAAO,OACPC,MAAM,OACNC,WAAW,OACXC,QAAQ,qBAOP;CACD,MAAM,CAACC,YAAYC,iBAAiBvC,SAASmC,MAAMF,OAAOO,SAAS9B,kBAAkB0B,WAAW,IAAI,EAAE;CACtG,MAAMK,cAAcR,OAAOS,MAAM,IAAI;CACrC,MAAM,CAACC,OAAOC,YAAY5C,SAASmC,MAAMM,YAAYD,SAAS7B,aAAayB,WAAW,IAAI,EAAE;CAC5F,MAAMS,aAAaJ,YAAYf,MAAM,GAAGiB,KAAK,CAAC,CAACG,KAAK,IAAI;CACxD,IAAIC,MAAMC,KAAKC,IAAIX,YAAYO,WAAWL,MAAM;CAChD,MAAMU,OAAOL,WAAWM,WAAWJ,MAAM,CAAC;CAC1C,MAAMK,OAAOP,WAAWM,WAAWJ,GAAG;CACtC,IAAIG,QAAQ,SAAUA,QAAQ,SAAUE,QAAQ,SAAUA,QAAQ,OAAQL,OAAO;CACjF,MAAMM,UAAUR,WAAWnB,MAAM,GAAGqB,GAAG;CACvC,OACE,qBAAC,MAAD;EAAM,OAAOO,OAAOC;EAApB,UAAA,CACGrB,OACC,qBAAC,MAAD;GAAM,OAAOoB,OAAOE;GAApB,UAAA,CACE,oBAAC,YAAD;IAAY,YAAA;IAAW,uBAAuBF,OAAOG;IACnD,UAAA,oBAAC,MAAD;KAAM,YAAA;KAAW,OAAO,CAACH,OAAOI,SAASJ,OAAOK,QAAQ;KACrDN,UAAAA;IACG,CAAA;GACI,CAAA,GACZ,oBAAC,YAAD;IAAY,MAAMpB;IAAeI;IAAO,OAAOiB,OAAOpB;GAAK,CAAA,CACvD;EAEN,CAAA,IAAA,oBAAC,MAAD;GAAM,YAAA;GAAW,OAAOoB,OAAOI;GAC5BL,UAAAA;EACG,CAAA,GAEPA,QAAQb,SAASP,OAAOO,SACvB,qBAAC,MAAD;GAAM,OAAOc,OAAOM;GAApB,UAAA,CACE,qBAAC,MAAD;IAAM,OAAON,OAAOO;IAApB,UAAA;KACGR,QAAQb;KAAO;KAAKP,OAAOO;KAAO;KAAea,QAAQX,MAAM,IAAI,CAAC,CAACF;KAAO;KAAKC,YAAYD;KAAO;IACjG;GACN,CAAA,GAAA,qBAAC,QAAD;IACE,SAAQ;IACR,eAAe;KACbD,eAAeuB,UAAUA,QAAQpD,cAAc;KAC/CkC,UAAUkB,UAAUA,QAAQnD,SAAS;IACvC;IALF,UAAA,CAKI,cAESuB,OAAO,WAAW,QACvB;GACJ,CAAA,CAAA;EACJ,CAAA,IAAA,IACA;;AAEV;AAEA,SAAS6B,YAAY,EAAEC,OAAO7B,OAAgD;CAC5E,QAAQ6B,MAAMC,MAAd;EACE,KAAK,iBACH,OACE,oBAAC,MAAD;GAAM,mBAAkB;GAAO,OAAOX,OAAOY;GAAM,eAAe,KAAKjE,QAAQkE,QAAQH,MAAMI,GAAG;GAC7FJ,UAAAA,MAAMK,SAASL,MAAMM;EAClB,CAAA;EAEV,KAAK,YACH,OAAON,MAAMO,SAASC,KAAAA,IACpB,qBAAC,MAAD;GAAM,OAAOlB,OAAOO;GAApB,UAAA;IAAyB;IACfG,MAAMS,YAAY;IAAW;IAAIT,MAAMI;GAC3C;EAEN,CAAA,IAAA,oBAAC,SAAD;GAAS,QAAQJ,MAAMO;GAAM,MAAA;GAAUpC;GAAK,OAAM;EAAmB,CAAA;EAEzE,KAAK,cACH,OACE,oBAAC,SAAD;GAAS,QAAQuC,KAAKC,UAAUX,MAAMF,OAAO,MAAM,CAAC;GAAG,MAAA;GAAU3B;GAAK,OAAM;EAA4B,CAAA;EAE5G,KAAK,SACH,OAAO,qBAAC,MAAD;GAAM,OAAOmB,OAAOO;GAApB,UAAA,CAA0B,YAASG,MAAMS,QAAe;;CACnE;AACF;;AAGA,SAAgBG,eAAe,EAC7BC,kBAAkB,OAClBC,gBAAgB,SAChB,GAAGC,SAIF;CACD,MAAM5C,MAAM2C,kBAAkB;CAC9B,MAAM1C,WAAW0C,kBAAkB;CACnC,MAAME,WACJ1E,uBAAuByE,MAAME,QAAQrD,OAAO,KAC5CvB,aAAa0E,MAAM1D,UAAU0D,MAAMG,QAAQ,KAC3C9D,iBAAiB2D,MAAM1D,QAAQ;CACjC,MAAM8D,SAAS5E,eAAewE,MAAME,QAAQG,WAAW,CAAA,CAAE;CACzD,MAAMC,SAAS7E,gBAAgBuE,MAAME,QAAQrD,OAAO;CACpD,MAAM,CAAC0D,YAAYC,iBAAiBvF,SAASmC,MAAMgD,OAAO3C,SAAS3B,UAAU;CAC7E,MAAM,CAAC2E,YAAYC,iBAAiBzF,SAASmC,MAAMkD,OAAO7C,SAAS5B,UAAU;CAC7E,MAAM8E,OAAOjF,cAAc;EACzBkF,QAAQZ,MAAMY;EACdC,UAAU;EACVC,WAAWd,MAAM/D;EACjB8E,SAASf,MAAMe;CACjB,CAAC;CACD,MAAMC,WAAWC,OAAOC,KAAKlB,MAAMmB,IAAI,CAAC,CAAC1D,SAAS;CAClD,MAAM2D,YAAYpB,MAAMY,OAAOnD,SAAS,KAAKkD,KAAKU,WAAW,QAAQjB,OAAO3C,SAAS,KAAK6C,OAAO7C,SAAS;CAC1G,MAAMX,MAAM,CAACkD,MAAM/D,WAAWW,OAAOoD,MAAME,QAAQrD,OAAO;CAC1D,OACE,oBAAC,aAAD;EACE,MAAM7B,SAASgF,KAAK;EACpB,YAAYgB,YAAYI;EACPtB;EACjB,QAAO;EAEL,WAAA,EAAEe,UAAUS,WACZ,qBAAA,UAAA,EAAA,UAAA;GACE,oBAAC,mBAAD;IAAmB,OAAM;IAAM,QAAO;IACpC,UAAA,qBAAC,MAAD;KAAM,eAAe;KAAG,OAAO/C,OAAOgD;KAAtC,UAAA,CACE,qBAAC,MAAD;MAAM,OAAOhD,OAAOO;MAApB,UAAA,CAA2BmB,SAAS1D,QAAO,KAAS;KACpD,CAAA,GAAA,oBAAC,MAAD;MAAM,OAAOgC,OAAOY;MAAOc,UAAAA,SAASzD;KAAW,CAAA,CAC3C;;GACW,CAAA;GAClBM,MACC,oBAAC,iBAAD,EAAA,UACE,oBAAC,MAAD;IAAM,OAAOyB,OAAOO;IAAK,UAAA;GAEnB,CAAA,EACS,CAAA,IACf;GACHwC,QAAQN,WACP,qBAAC,iBAAD;IAAiB,QAAO;IAAiB,OAAOzC,OAAOC;IAAvD,UAAA,CACE,oBAAC,MAAD;KAAM,OAAOD,OAAOjB;KAAO,UAAA;IAAW,CAAA,GACtC,oBAAC,SAAD;KAAS,QAAQqC,KAAKC,UAAUI,MAAMmB,MAAM,MAAM,CAAC;KAAG,MAAA;KAAU/D;KAAK,OAAM;IAAgB,CAAA,CAC5E;GACf,CAAA,IAAA;GACHkE,QAAQF,YACP,qBAAC,iBAAD;IAAiB,QAAO;IAAkB,OAAO7C,OAAOC;IAAxD,UAAA;KACGwC,WAAW,oBAAC,MAAD;MAAM,OAAOzC,OAAOjB;MAAO,UAAA;KAAY,CAAA,IAAI;KACtDqD,KAAK/C,MAAMH,SAAS,IAAI,oBAAC,SAAD;MAAS,QAAQkD,KAAK/C,MAAMG,KAAK,IAAI;MAAQX;MAAeC;KAAS,CAAA,IAAM;KACnG+C,OAAOzD,MAAM,GAAG4D,UAAU,CAAC,CAACiB,KAAKC,OAAOC,UACvC,oBAAC,OAAD;MAEE,QAAQ,EAAErC,KAAK,QAAQoC,MAAM/B,SAAQ,UAAW+B,MAAME,OAAO;MAC7D,oBAAoB,GAAG1B,SAASzD,KAAI,UAAWkF,QAAQ;MACvD,YAAW;MACX,OAAOnD,OAAOkD;KAAM,GAJfC,KAIe,CAEvB;KACAnB,aAAaH,OAAO3C,SACnB,qBAAC,MAAD;MAAM,OAAOc,OAAOM;MAApB,UAAA,CACE,qBAAC,MAAD;OAAM,OAAON,OAAOO;OAApB,UAAA;QACGyB;QAAW;QAAKH,OAAO3C;QAAO;OAC3B;MACN,CAAA,GAAA,oBAAC,QAAD;OAAQ,SAAQ;OAAQ,eAAe+C,eAAezB,UAAUA,QAAQjD,UAAU;OAAE,UAAA;MAE5E,CAAA,CACJ;KACJ,CAAA,IAAA;KACHwE,OAAO3D,MAAM,GAAG8D,UAAU,CAAC,CAACe,KAAKvC,OAAOyC,UACvC,oBAAC,aAAD;MAAgCzC;MAAY7B;KAAI,GAA9BsE,KAA8B,CACjD;KACAjB,aAAaH,OAAO7C,SACnB,qBAAC,MAAD;MAAM,OAAOc,OAAOM;MAApB,UAAA,CACE,qBAAC,MAAD;OAAM,OAAON,OAAOO;OAApB,UAAA;QACG2B;QAAW;QAAKH,OAAO7C;QAAO;OAC3B;MACN,CAAA,GAAA,oBAAC,QAAD;OAAQ,SAAQ;OAAQ,eAAeiD,eAAe3B,UAAUA,QAAQlD,UAAU;OAAE,UAAA;MAE5E,CAAA,CACJ;KACJ,CAAA,IAAA;KACH8E,KAAKU,SACJ,oBAAC,mBAAD;MAAmB,MAAMtF,YAAY4E,KAAKU,OAAOO;MAAO,OAAOjB,KAAKU,OAAOQ;MACxElB,UAAAA,KAAKU,OAAO7B;KACI,CAAA,IACjB;IACW;GACf,CAAA,IAAA;EACN,EAAA,CAAA;CAES,CAAA;AAEjB;AAEA,MAAMjB,SAASpD,WAAW2G,QAAQC,WAAW;CAC3CvD,MAAM;EAAEwD,KAAKD,MAAME,QAAQ,GAAG;EAAGC,UAAU;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC7CtD,YAAY;EAAEmD,KAAKD,MAAME,QAAQ,CAAC;EAAGG,YAAY;EAAYD,mBAAA,CAAA,CAAA;CAAC;CAC9DZ,MAAM;EACJc,YAAY;EACZC,YAAY5H,OAAOqH,MAAMO,WAAWC,IAAI;EACxCC,UAAUT,MAAMS,SAASC;EACzBC,YAAYX,MAAMW,WAAWD;EAAIN,mBAAA,CAAA,CAAA;CACnC;CACArD,MAAM;EACJ6D,OAAOZ,MAAMa,OAAOC;EACpBP,YAAY5H,OAAOqH,MAAMO,WAAWC,IAAI;EACxCC,UAAUT,MAAMS,SAASM;EACzBJ,YAAYX,MAAMgB,kBAAkBD;EAAEX,mBAAA,CAAA,CAAA;CACxC;CACA7E,OAAO;EACLqF,OAAOZ,MAAMa,OAAOC;EACpBP,YAAY5H,OAAOqH,MAAMO,WAAWC,IAAI;EACxCC,UAAUT,MAAMS,SAASM;EACzBJ,YAAYX,MAAMW,WAAWI;EAC7BE,YAAYjB,MAAMiB,WAAWC;EAAQd,mBAAA,CAAA,CAAA;CACvC;CACAhD,MAAM;EACJwD,OAAOZ,MAAMa,OAAOM;EACpBZ,YAAY5H,OAAOqH,MAAMO,WAAWC,IAAI;EACxCC,UAAUT,MAAMS,SAASM;EACzBJ,YAAYX,MAAMW,WAAWI;EAAEX,mBAAA,CAAA,CAAA;CACjC;CACAxD,SAAS;EACPgE,OAAOZ,MAAMa,OAAOC;EACpBP,YAAY5H,OAAOqH,MAAMO,WAAWa,IAAI;EACxCX,UAAUT,MAAMS,SAASM;EACzBJ,YAAYX,MAAMgB,kBAAkBD;EAAEX,mBAAA,CAAA,CAAA;CACxC;CACAvD,UAAU;EAAE+D,OAAOZ,MAAMa,OAAOpD;EAAI2C,mBAAA,CAAA,CAAA;CAAC;CACrC1D,MAAM;EACJ2E,cAAcrB,MAAMqB,aAAaC;EACjCC,aAAa;EACbC,aAAaxB,MAAMa,OAAOY;EAC1BC,iBAAiB1B,MAAMa,OAAOc;EAAIvB,mBAAA,CAAA,CAAA;CACpC;CACAzD,YAAY;EAAEiF,SAAS5B,MAAME,QAAQ,GAAG;EAAG2B,cAAc7B,MAAME,QAAQ,CAAC;EAACE,mBAAA,CAAA,CAAA;CAAC;CAC1EhF,MAAM;EAAE0G,UAAU;EAAYC,KAAK/B,MAAME,QAAQ,GAAG;EAAG8B,OAAOhC,MAAME,QAAQ,GAAG;EAACE,mBAAA,CAAA,CAAA;CAAC;CACjFV,OAAO;EAAEuC,OAAO;EAAQC,QAAQ;EAAKb,cAAcrB,MAAMqB,aAAac;EAAE/B,mBAAA,CAAA,CAAA;CAAC;AAC3E,EAAE;;;AC7RF,IAAA,qBAAe,mBAAmB;CAChC,OAAO,CAAC;CACR,UAAU,UAAU,UAAU,YAC5B,uBAAuB,OAAO,MAAM,QAAQ,aAAa,UAAU,QAAQ,MAAM;CACnF,SAAS;AACX,CAAC;;;ACJD,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,eAAe,mBAAmB;CAC7C,IAAI;CACJ,SAAS;EACP,IAAI,QAAyC;GAAE,OAAO,CAAC,IAAI;IAAE,MAAM;IAAW,IAAI;GAAW,GAAGgC,8BAAW,CAAC;EAAG;EAC/G,IAAI,gBAAyD;GAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,GAAGC,kBAAO,CAAC;EAAG;CAC5G;AACF,CAAC"}
1
+ {"version":3,"file":"native.mjs","names":["Button","CopyButton","fontOf","Sheet","SheetBody","SheetContent","SheetDescription","SheetFooter","SheetHeader","SheetTitle","Spinner","StyleSheet","McpSessionAuthState","McpServerSheetProps","server","name","state","authorizationUrl","missingSecrets","onOpenLink","url","onReauthorize","onDisconnect","onClose","ManageRow","title","hint","onPress","styles","manageRow","McpServerSheet","connected","waitsForSecret","length","signingIn","open","headText","body","ask","map","askTitle","askName","step","stepNumber","stepText","link","waiting","manage","label","create","theme","flex","minWidth","gap","spacing","uni__dependencies","fontSize","base","lineHeight","fontWeight","medium","color","colors","hi","sm","lineHeightRelaxed","dim","semibold","flexDirection","alignItems","width","height","borderRadius","borderWidth","borderColor","green","textAlign","paddingLeft","md","hairlineWidth","border","fontFamily","mono","paddingTop","borderTopWidth","borderTopColor","minHeight","justifyContent","padding","backgroundColor","magenta","styles","Button","Dot","DotTone","fontOf","KebabIcon","Spinner","useState","StyleSheet","McpSessionAuthState","McpSessionServerTool","name","tokens","active","McpSessionServerRow","state","tools","missingSecrets","Action","STATE","Record","label","dot","ink","Ink","action","connected","connecting","degraded","closed","failed","disabled","ACTION_LABEL","signIn","connect","retry","NEEDS_SECRET","tokenLabel","tool","count","undefined","toLocaleString","McpSessionServersProps","servers","onAuthorize","server","onOpenServer","onOpenTool","McpSessionServers","revealedServers","setRevealedServers","serversWithTools","filter","length","visibleTools","Set","slice","map","styles","section","head","title","hint","index","waitsForSecret","view","divider","row","has","kind","toolName","inactive","indent","create","theme","gap","spacing","paddingHorizontal","paddingVertical","uni__dependencies","paddingBottom","fontSize","lg","lineHeight","fontWeight","semibold","color","colors","hi","sm","lineHeightRelaxed","dim","borderTopWidth","hairlineWidth","borderTopColor","flexDirection","alignItems","minHeight","flex","base","token","paddingLeft","width","violet","fontFamily","mono","styles","Button","CodeBlock","fontOf","Sheet","SheetBody","SheetContent","SheetFooter","SheetHeader","SheetTitle","Spinner","StyleSheet","McpSessionToolDetail","McpToolSchemaSheetProps","target","piName","server","inContext","detail","error","onClose","McpToolSchemaSheet","open","styles","headText","mono","hint","tokens","toLocaleString","body","description","text","warnings","length","map","warning","source","path","message","schema","label","JSON","stringify","inputSchema","create","theme","flex","minWidth","gap","spacing","uni__dependencies","fontFamily","fontSize","base","lineHeight","lineHeightRelaxed","color","colors","sm","dim","red","fontWeight","semibold","yellow","styles","WebPluginSlotProps","useEffect","useState","Linking","MCP_SESSION_AUTH_STATUS_KEY","McpSessionToolDetail","parseMcpSessionAuthStatus","requestMcpSessionAuthorization","requestMcpSessionDisconnect","fetchSessionTool","McpServerSheet","McpSessionServerRow","McpSessionServers","McpToolSchemaSheet","ToolTarget","sessionId","server","tool","piName","inContext","McpSessionContext","statuses","sendSessionFrame","contextInventory","published","serverTarget","setServerTarget","name","toolTarget","setToolTarget","detail","setDetail","key","value","error","toolKey","undefined","live","then","result","ok","rows","map","item","inventory","filter","entry","source","owner","length","state","missingSecrets","tools","itemKind","tokens","active","selected","find","authorize","current","authorizationUrl","openTool","serverName","toolName","reachable","identity","some","shownDetail","url","openURL","ToolMessageRenderProps","Button","CopyButton","fontOf","MessageItem","MessageItemBody","MessageItemHeader","MessageItemStatus","StatusTone","toolTone","useState","Linking","StyleSheet","McpResultBlock","McpStatusTone","matchMcpTool","mcpIdentityFromDetails","mcpImageBlocks","mcpResultBlocks","mcpResultView","CHARACTER_PAGE","LINE_PAGE","BLOCK_PAGE","IMAGE_PAGE","STATUS_TONE","Record","running","ok","error","hint","fallbackIdentity","toolName","server","tool","separator","indexOf","slice","hasApp","details","app","version","resourceUri","Literal","source","copy","all","revealed","label","characters","setCharacters","length","sourceLines","split","lines","setLines","linePrefix","join","end","Math","min","last","charCodeAt","next","visible","styles","part","code","codeScroll","literal","codeText","disclosure","meta","value","ResultBlock","block","type","link","openURL","uri","title","name","text","undefined","mimeType","JSON","stringify","McpToolMessage","defaultExpanded","initialReveal","props","identity","result","statuses","images","content","blocks","imageCount","setImageCount","blockCount","setBlockCount","view","output","expanded","isPartial","isError","hasInput","Object","keys","args","hasOutput","status","open","call","map","image","index","data","tone","glyph","create","theme","gap","spacing","minWidth","uni__dependencies","alignItems","flexShrink","fontFamily","sans","fontSize","base","lineHeight","color","colors","dim","sm","lineHeightRelaxed","fontWeight","semibold","blue","mono","borderRadius","DEFAULT","borderWidth","borderColor","border","backgroundColor","deep","padding","paddingRight","position","top","right","width","height","md","fillMcpAuth","toolMcp"],"sources":["../../src/types/webMcp.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/mcpSessionCommands.ts","../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/mcpSessionToolApi.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/McpServerSheet.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/McpSessionServers.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/McpToolSchemaSheet.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/McpSessionContext.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/McpAuth.context.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/mcpToolMatch.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/McpToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/mcp.native.tsx","../../generated/native.ts"],"sourcesContent":["/**\n * What an MCP tool result carries beyond its text, shared by this package's\n * Pi adapter (which attaches it as the result's details) and its web plugin\n * (which renders it). Wire JSON only: images ride Pi's own content blocks,\n * so they are not repeated here.\n */\nimport type { ContextToolWarning } from '@agimon-ai/po-core/contextApi';\nimport type { CallToolResult } from '@modelcontextprotocol/server';\n\n/** Shared browser/server payload validated by the mcp.apps.open wire schema. */\nexport interface McpAppOpenResult {\n leaseId: string;\n html: string;\n resourceUri: string;\n protocol: 'mcp' | 'openai';\n resourceMeta: Record<string, unknown>;\n tool: {\n name: string;\n description: string;\n inputSchema: { type: 'object'; [key: string]: unknown };\n _meta: Record<string, unknown>;\n };\n args: Record<string, unknown>;\n result: { content: unknown[]; structuredContent?: unknown; _meta?: Record<string, unknown>; isError?: boolean };\n state: unknown;\n readOnly: boolean;\n}\n\n/** Private presentation payload, never appended to model content. */\nexport interface McpAppPresentation {\n version: 1;\n resourceUri?: string;\n protocol?: 'mcp' | 'openai';\n result: CallToolResult;\n}\nexport type McpResultBlock =\n | { type: 'audio'; data: string; mimeType: string }\n | { type: 'resource_link'; uri: string; name: string; title?: string; description?: string; mimeType?: string }\n | { type: 'resource'; uri: string; mimeType?: string; text?: string; blob?: string }\n | { type: 'structured'; value: Record<string, unknown> };\n\nexport interface McpToolDetails {\n server: string;\n tool: string;\n /** Present only when the downstream result carried something beyond text and images. */\n blocks?: McpResultBlock[];\n app?: McpAppPresentation;\n}\n\nexport const MCP_SESSION_AUTH_STATUS_KEY = 'po-mcp-session-auth';\n\nconst ANSI_ESCAPE_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-?]*[ -/]*[@-~]`, 'gu');\nconst MAX_SESSION_AUTH_SERVERS = 128;\nconst MAX_AUTHORIZATION_URL_LENGTH = 8192;\nconst MAX_SERVER_TOOLS = 512;\nconst MAX_TOOL_NAME_LENGTH = 256;\nconst MAX_MISSING_SECRETS = 64;\nconst SECRET_NAME_PATTERN = /^[A-Za-z0-9._-]{1,64}$/u;\nconst SESSION_AUTH_STATES = [\n 'not-connected',\n 'connecting',\n 'connected',\n 'degraded',\n 'needs-auth',\n 'failed',\n 'closed',\n 'disabled',\n] as const;\nexport type McpSessionAuthState = (typeof SESSION_AUTH_STATES)[number];\n\nfunction isSessionAuthState(value: unknown): value is McpSessionAuthState {\n return SESSION_AUTH_STATES.some((state) => state === value);\n}\n\nexport interface McpSessionAuthStatusItem {\n readonly management?: McpServerManagement;\n readonly oauthEligible?: boolean;\n readonly oauthAuthorized?: boolean;\n readonly name: string;\n readonly state: McpSessionAuthState;\n readonly authorizationUrl?: string;\n /** Available tools and their estimated direct-schema cost, not a second context inventory. */\n readonly tools?: readonly McpSessionReachableTool[];\n /** `${vault:NAME}` secrets the server is waiting for. Names only, never values. */\n readonly missingSecrets?: readonly string[];\n}\n\nexport interface McpSessionReachableTool {\n /** Original downstream name, used with the configured server for detail lookup. */\n readonly name: string;\n /** Actual registered name. Optional for older live-session status producers. */\n readonly piName?: string;\n readonly tokens?: number;\n}\n\n/** A session's view of one reachable tool: what the dialog shows when a row is opened. */\nexport interface McpSessionToolDetail {\n readonly server: string;\n readonly tool: string;\n readonly piName: string;\n readonly description?: string;\n readonly inputSchema: Record<string, unknown>;\n readonly tokens: number;\n readonly warnings?: readonly ContextToolWarning[];\n readonly _meta?: Record<string, unknown>;\n}\n\n/** Session route for one reachable tool's description and schema. */\nexport const MCP_SESSION_TOOL_API_PATH = '/tool';\nexport const MCP_SESSION_TOOL_SERVER_QUERY = 'server';\nexport const MCP_SESSION_TOOL_NAME_QUERY = 'tool';\n/** Session route that stores a `${vault:NAME}` secret the session reported missing. */\nexport const MCP_SESSION_SECRETS_API_PATH = '/secrets';\n\n/** Body of the session secrets route. The value is sent once and never echoed back. */\nexport interface McpSupplySecretRequest {\n server: string;\n name: string;\n value: string;\n}\n\nexport interface McpSupplySecretResult {\n server: string;\n name: string;\n}\n\ninterface McpSessionServerStatusSource {\n readonly management?: McpServerManagement;\n readonly oauthEligible?: boolean;\n readonly oauthAuthorized?: boolean;\n readonly name: string;\n readonly state: string;\n readonly authorizationUrl?: unknown;\n readonly tools?: readonly {\n readonly toolName: string;\n readonly piName?: string;\n readonly active: boolean;\n readonly tokens?: number;\n }[];\n readonly missingSecrets?: readonly string[];\n}\n\n/** Keeps servers visible before discovery and after failures, without diagnostics or credentials. */\nexport function formatMcpSessionAuthStatus<T extends McpSessionServerStatusSource>(\n servers: readonly T[],\n): string | undefined {\n const items: McpSessionAuthStatusItem[] = servers.flatMap((server) => {\n if (!isSessionAuthState(server.state)) return [];\n const tools = (server.tools ?? [])\n .filter((tool) => tool.active && isToolName(tool.toolName))\n .map((tool): McpSessionReachableTool => ({\n name: tool.toolName,\n ...(isToolName(tool.piName) ? { piName: tool.piName } : {}),\n ...(isTokenCount(tool.tokens) ? { tokens: tool.tokens } : {}),\n }))\n .slice(0, MAX_SERVER_TOOLS);\n const missingSecrets = (server.missingSecrets ?? []).filter(isSecretName).slice(0, MAX_MISSING_SECRETS);\n const item: McpSessionAuthStatusItem = {\n name: server.name,\n state: server.state,\n ...(isServerManagement(server.management) ? { management: server.management } : {}),\n ...(typeof server.oauthEligible === 'boolean' ? { oauthEligible: server.oauthEligible } : {}),\n ...(typeof server.oauthAuthorized === 'boolean' ? { oauthAuthorized: server.oauthAuthorized } : {}),\n ...(isAuthorizationUrl(server.authorizationUrl) ? { authorizationUrl: server.authorizationUrl } : {}),\n ...(tools.length === 0 ? {} : { tools }),\n ...(missingSecrets.length === 0 ? {} : { missingSecrets }),\n };\n return [item];\n });\n return items.length === 0 ? undefined : JSON.stringify(items);\n}\n\n/** Reads the live-session status defensively. Empty is the browser's active-session clear value. */\nexport function parseMcpSessionAuthStatus(raw: string | undefined): McpSessionAuthStatusItem[] | undefined {\n if (raw === undefined || raw.trim() === '') return undefined;\n try {\n const value: unknown = JSON.parse(raw.replace(ANSI_ESCAPE_PATTERN, ''));\n if (!Array.isArray(value) || value.length === 0 || value.length > MAX_SESSION_AUTH_SERVERS) return undefined;\n\n const names = new Set<string>();\n for (const item of value) {\n if (!isSessionAuthStatusItem(item) || names.has(item.name)) return undefined;\n names.add(item.name);\n }\n return value;\n } catch {\n return undefined;\n }\n}\n\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0);\n if (codePoint !== undefined && (codePoint < 32 || (codePoint >= 127 && codePoint <= 159))) return true;\n }\n return false;\n}\n\nfunction isAuthorizationUrl(value: unknown): value is string {\n if (typeof value !== 'string' || value.length > MAX_AUTHORIZATION_URL_LENGTH || hasControlCharacter(value)) {\n return false;\n }\n try {\n const url = new URL(value);\n return (url.protocol === 'http:' || url.protocol === 'https:') && url.username === '' && url.password === '';\n } catch {\n return false;\n }\n}\n\nfunction isToolName(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n value.trim() !== '' &&\n value.length <= MAX_TOOL_NAME_LENGTH &&\n !hasControlCharacter(value)\n );\n}\n\nfunction isSecretName(value: unknown): value is string {\n return typeof value === 'string' && SECRET_NAME_PATTERN.test(value);\n}\n\nfunction isTokenCount(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0;\n}\n\nfunction isReachableTool(value: unknown): value is McpSessionReachableTool {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n Object.keys(record).every((key) => key === 'name' || key === 'piName' || key === 'tokens') &&\n isToolName(record.name) &&\n (!('piName' in record) || isToolName(record.piName)) &&\n (!('tokens' in record) || isTokenCount(record.tokens))\n );\n}\n\nfunction isServerManagement(value: unknown): value is McpServerManagement {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n Object.keys(record).every((key) => ['owner', 'canEdit', 'canRemove', 'revision', 'target', 'kind'].includes(key)) &&\n ['global', 'repository', 'read-only'].includes(String(record.owner)) &&\n typeof record.canEdit === 'boolean' &&\n typeof record.canRemove === 'boolean' &&\n (!('revision' in record) || (typeof record.revision === 'string' && /^[a-f0-9]{64}$/u.test(record.revision))) &&\n (!('target' in record) ||\n (typeof record.target === 'string' && record.target.length <= 2048 && !hasControlCharacter(record.target))) &&\n (!('kind' in record) || record.kind === 'local' || record.kind === 'remote') &&\n (!(record.canEdit || record.canRemove) || (record.owner !== 'read-only' && typeof record.revision === 'string'))\n );\n}\n\nfunction isSessionAuthStatusItem(value: unknown): value is McpSessionAuthStatusItem {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n Object.keys(record).every(\n (key) =>\n key === 'management' ||\n key === 'name' ||\n key === 'state' ||\n key === 'authorizationUrl' ||\n key === 'tools' ||\n key === 'missingSecrets' ||\n key === 'oauthEligible' ||\n key === 'oauthAuthorized',\n ) &&\n (!('management' in record) || isServerManagement(record.management)) &&\n (!('oauthEligible' in record) || typeof record.oauthEligible === 'boolean') &&\n (!('oauthAuthorized' in record) || typeof record.oauthAuthorized === 'boolean') &&\n (!('missingSecrets' in record) ||\n (Array.isArray(record.missingSecrets) &&\n record.missingSecrets.length <= MAX_MISSING_SECRETS &&\n record.missingSecrets.every(isSecretName))) &&\n (!('authorizationUrl' in record) || isAuthorizationUrl(record.authorizationUrl)) &&\n (!('tools' in record) ||\n (Array.isArray(record.tools) &&\n record.tools.length <= MAX_SERVER_TOOLS &&\n record.tools.every(isReachableTool))) &&\n typeof record.name === 'string' &&\n record.name.trim() !== '' &&\n !hasControlCharacter(record.name) &&\n isSessionAuthState(record.state)\n );\n}\n\n/** Hub API paths for repository-scoped MCP management. */\nexport const MCP_REPOSITORY_API_PATH = '/repository';\nexport const MCP_DISCOVERY_API_PATH = '/repository/discover';\nexport const MCP_AUTHORIZATION_API_PATH = '/repository/authorize';\n/** The repository every route is asked about, and the flow segment the two flow routes carry. */\nexport const MCP_REPOSITORY_ID_QUERY = 'repositoryId';\nexport const MCP_FLOW_ID_PARAM = 'flowId';\n/** Adds one server to the repository's `.mcp.json` or to the person's own config. */\nexport const MCP_SERVERS_API_PATH = '/servers';\n/** Lists the servers in the person's own config. */\nexport const MCP_GLOBAL_SERVERS_API_PATH = '/servers/global';\n\n/** Where a new server is written: the repository's `.mcp.json`, or the person's own config for every repository. */\nexport type McpServerScope = 'repository' | 'global';\n\n/** One `mcpServers` entry, in the shape Po already reads. */\nexport type McpServerEntry =\n | { type: 'http'; url: string; headers?: Record<string, string> }\n | { command: string; args: string[]; env?: Record<string, string> };\n\nexport interface McpAddServerRequest {\n scope: McpServerScope;\n /** Required for the repository scope. */\n repositoryId?: string;\n name: string;\n entry: McpServerEntry;\n /** A local command runs with the person's permissions, so the server asks for this confirmation too. */\n trusted?: boolean;\n /**\n * Header names (remote) or env names (local) whose values are kept in Po's vault. The config\n * gets `${vault:<name>-<field>}` in their place.\n */\n secretFields?: string[];\n}\n\nexport interface McpAddServerResult {\n scope: McpServerScope;\n name: string;\n}\n\n/** One server in a config file, as the settings page lists it. Credentials and environment never leave the hub. */\n/** Saved ownership, never a caller-supplied file path or credential scope. */\nexport interface McpServerManagement {\n owner: 'global' | 'repository' | 'read-only';\n /** Safe edit prefill only. Header/env values and local arguments are never returned. */\n target?: string;\n kind?: 'local' | 'remote';\n canEdit: boolean;\n canRemove: boolean;\n revision?: string;\n}\n\nexport interface McpMutateServerRequest {\n scope: McpServerScope;\n repositoryId?: string;\n name: string;\n revision: string;\n /** Edit only. Headers/env merge. Omitted args preserve saved args; changing args requires a credential decision. */\n entry?: McpServerEntry;\n trusted?: boolean;\n}\n\nexport interface McpMutateServerResult extends McpAddServerResult {\n credentialsPreserved: true;\n liveSessionsChanged: false;\n syncRequired: true;\n /** Global removal can expose different definitions in different repositories. */\n shadowedDefinition: 'present' | 'possible' | 'none';\n}\n\nexport interface McpConfiguredServer {\n management?: McpServerManagement;\n name: string;\n kind: 'remote' | 'local';\n /** The URL, or the command without its arguments. */\n target: string;\n}\n\nexport interface McpGlobalServers {\n servers: McpConfiguredServer[];\n}\n\nexport type McpRepositoryServerState =\n | 'not-connected'\n | 'connecting'\n | 'connected'\n | 'degraded'\n | 'needs-auth'\n | 'failed'\n | 'closed';\n\nexport interface McpRepositoryTool {\n name: string;\n piName: string;\n description?: string;\n}\n\nexport interface McpRepositoryServer {\n management?: McpServerManagement;\n name: string;\n state: McpRepositoryServerState;\n source: 'cached' | 'live' | 'configured';\n credentialPresent: boolean;\n tools: McpRepositoryTool[];\n error?: string;\n}\n\nexport interface McpRepositoryCatalog {\n repositoryId: string;\n sync: {\n fresh: boolean;\n reasons: string[];\n };\n servers: McpRepositoryServer[];\n droppedServers: string[];\n diagnostics: string[];\n}\n\nexport type McpAuthorizationStatus = 'starting' | 'waiting' | 'completed' | 'failed' | 'cancelled' | 'expired';\n\nexport interface McpAuthorizationFlow {\n id: string;\n repositoryId: string;\n serverName: string;\n status: McpAuthorizationStatus;\n authorizationUrl?: string;\n error?: string;\n expiresAt: number;\n}\n","import type { SessionFrameSender } from '@agimon-ai/po-core/web';\n\n/** Requests authorization through Pi's command frame, never through a shell. */\nexport function requestMcpSessionAuthorization(\n sendSessionFrame: SessionFrameSender,\n sessionId: string,\n serverName: string,\n): void {\n sendSessionFrame(sessionId, { type: 'prompt', message: `/mcp auth ${serverName}` });\n}\n\n/** Disconnects the server from this session only; its saved credentials are kept. */\nexport function requestMcpSessionDisconnect(\n sendSessionFrame: SessionFrameSender,\n sessionId: string,\n serverName: string,\n): void {\n sendSessionFrame(sessionId, { type: 'prompt', message: `/mcp disconnect ${serverName}` });\n}\n\n/** Disconnects this session and clears the shared scoped credential, retaining configuration. */\nexport function requestMcpSessionUnauthorize(\n sendSessionFrame: SessionFrameSender,\n sessionId: string,\n serverName: string,\n): void {\n sendSessionFrame(sessionId, { type: 'prompt', message: `/mcp unauthorize ${serverName}` });\n}\n","// Type-only, so the native bundle that reads this table never imports the web contract at runtime.\nimport type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport {\n MCP_AUTHORIZATION_API_PATH,\n MCP_DISCOVERY_API_PATH,\n MCP_FLOW_ID_PARAM,\n MCP_GLOBAL_SERVERS_API_PATH,\n MCP_REPOSITORY_API_PATH,\n MCP_REPOSITORY_ID_QUERY,\n MCP_SESSION_SECRETS_API_PATH,\n MCP_SESSION_TOOL_API_PATH,\n MCP_SESSION_TOOL_NAME_QUERY,\n MCP_SERVERS_API_PATH,\n MCP_SESSION_TOOL_SERVER_QUERY,\n type McpAddServerResult,\n type McpMutateServerResult,\n type McpAuthorizationFlow,\n type McpGlobalServers,\n type McpRepositoryCatalog,\n type McpSessionToolDetail,\n type McpSupplySecretResult,\n} from './webMcp';\n\n/** One authorization flow, addressed by id below the flow collection. */\nconst AUTHORIZATION_FLOW_PATH = `${MCP_AUTHORIZATION_API_PATH}/:${MCP_FLOW_ID_PARAM}`;\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path. The build reads both off\n * `src/extensions/(backend)/api/mcp/`, so the mount is stated once, by the\n * folder that creates it. The sub-paths come from `webMcp`, which already owned\n * them, so this table names where a route sits and nothing else.\n *\n * This is the one file the hub handler and the settings panel both read, so a\n * path cannot move on one side alone. The handler matches on these strings\n * rather than parsing its own copies of them.\n *\n * `:flowId` is the client's parameter syntax; the handler reads the segment off\n * the same path, so the two cannot disagree about where the id sits.\n */\nconst routes = {\n catalog: {\n method: 'GET',\n path: MCP_REPOSITORY_API_PATH,\n query: [MCP_REPOSITORY_ID_QUERY],\n response: undefined as unknown as ApiResponseOf<McpRepositoryCatalog>,\n },\n discover: {\n method: 'POST',\n path: MCP_DISCOVERY_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpRepositoryCatalog>,\n },\n authorize: {\n method: 'POST',\n path: MCP_AUTHORIZATION_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpAuthorizationFlow>,\n },\n readAuthorization: {\n method: 'GET',\n path: AUTHORIZATION_FLOW_PATH,\n query: [MCP_REPOSITORY_ID_QUERY],\n response: undefined as unknown as ApiResponseOf<McpAuthorizationFlow>,\n },\n /** The same path as `readAuthorization`; the method is the whole of the difference. */\n cancelAuthorization: {\n method: 'DELETE',\n path: AUTHORIZATION_FLOW_PATH,\n query: [MCP_REPOSITORY_ID_QUERY],\n response: undefined as unknown as ApiResponseOf<McpAuthorizationFlow>,\n },\n /** Adds one server to the repository's `.mcp.json` or the person's own config, by the body's scope. */\n addServer: {\n method: 'POST',\n path: MCP_SERVERS_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpAddServerResult>,\n },\n editServer: {\n method: 'PATCH',\n path: MCP_SERVERS_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpMutateServerResult>,\n },\n removeServer: {\n method: 'DELETE',\n path: MCP_SERVERS_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpMutateServerResult>,\n },\n globalServers: {\n method: 'GET',\n path: MCP_GLOBAL_SERVERS_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpGlobalServers>,\n },\n /** Session scope: one available tool's registered name, description and schema. */\n sessionTool: {\n method: 'GET',\n path: MCP_SESSION_TOOL_API_PATH,\n query: [MCP_SESSION_TOOL_SERVER_QUERY, MCP_SESSION_TOOL_NAME_QUERY],\n response: undefined as unknown as ApiResponseOf<McpSessionToolDetail>,\n },\n /** Session scope: stores a secret the session reported missing. Owner-only; the value is never echoed. */\n sessionSecret: {\n method: 'POST',\n path: MCP_SESSION_SECRETS_API_PATH,\n response: undefined as unknown as ApiResponseOf<McpSupplySecretResult>,\n },\n} as const satisfies ApiRoutes;\n\nexport default routes;\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'mcp' at for the mcp mount. */\nexport const mcpScopes = ['global', 'workspace', 'session'] as const;\n\nexport const mcp = createApiClient(routes, {\n scopes: mcpScopes,\n basePath: 'mcp',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n\n/** Scopes the tree mounts 'mcp-session' at for the mcp-session mount. */\nexport const mcpSessionScopes = ['session'] as const;\n\nexport const mcpSession = createApiClient(routes, {\n scopes: mcpSessionScopes,\n basePath: 'mcp-session',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import { mcpSession } from '../../../../../../../generated/client.native';\nimport {\n MCP_SESSION_TOOL_NAME_QUERY,\n MCP_SESSION_TOOL_SERVER_QUERY,\n type McpSessionToolDetail,\n} from '../../../../../../types/webMcp';\n\nexport type FetchSessionToolResult = { ok: true; detail: McpSessionToolDetail } | { ok: false; error: string };\n\n/** The phone's half of fetchSessionTool: the same session route over the native sealed transport. */\nexport async function fetchSessionTool(\n sessionId: string,\n server: string,\n tool: string,\n): Promise<FetchSessionToolResult> {\n const result = await mcpSession\n .session(sessionId)\n .sessionTool({ query: { [MCP_SESSION_TOOL_SERVER_QUERY]: server, [MCP_SESSION_TOOL_NAME_QUERY]: tool } });\n if (!result.ok) {\n if (result.status === 0) return { ok: false, error: 'The session is unreachable.' };\n return { ok: false, error: result.error === '' ? `The session answered ${result.status}.` : result.error };\n }\n return { ok: true, detail: result.data };\n}\n","import {\n Button,\n CopyButton,\n fontOf,\n Sheet,\n SheetBody,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n Spinner,\n} from '@agimon-ai/po-native-components';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { McpSessionAuthState } from '../../../../../../types/webMcp';\n\nexport interface McpServerSheetProps {\n /** The server the sheet is for; null closes it. */\n server: {\n name: string;\n state: McpSessionAuthState;\n authorizationUrl?: string;\n /** `${vault:NAME}` secrets the server waits for; the phone points to the web panel to add them. */\n missingSecrets?: readonly string[];\n } | null;\n onOpenLink: (url: string) => void;\n onReauthorize: () => void;\n onDisconnect: () => void;\n onClose: () => void;\n}\n\nfunction ManageRow({ title, hint, onPress }: { title: string; hint?: string; onPress: () => void }) {\n return (\n <Pressable style={styles.manageRow} onPress={onPress} accessibilityRole=\"button\" accessibilityLabel={title}>\n <Text style={styles.title}>{title}</Text>\n {hint ? <Text style={styles.hint}>{hint}</Text> : null}\n </Pressable>\n );\n}\n\n/**\n * The phone's half of the web authorization dialog: sign-in progress while a link is pending, and\n * Reauthorize or Disconnect once the server is connected. Disconnect keeps saved credentials.\n */\nexport function McpServerSheet({ server, onOpenLink, onReauthorize, onDisconnect, onClose }: McpServerSheetProps) {\n const connected = server?.state === 'connected';\n const missingSecrets = connected ? [] : (server?.missingSecrets ?? []);\n const waitsForSecret = missingSecrets.length > 0;\n const signingIn = !connected && !waitsForSecret && server !== null && server.state !== 'disabled';\n const url = server?.authorizationUrl;\n return (\n <Sheet\n open={server !== null}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <SheetContent>\n <SheetHeader>\n <View style={styles.headText}>\n <SheetTitle>\n {connected || waitsForSecret ? (server?.name ?? '') : `Sign in to ${server?.name ?? ''}`}\n </SheetTitle>\n <SheetDescription>\n {connected\n ? 'Connected in this session.'\n : waitsForSecret\n ? 'Waiting for a secret before it connects.'\n : 'Po connects as soon as you approve.'}\n </SheetDescription>\n </View>\n </SheetHeader>\n <SheetBody style={styles.body}>\n {waitsForSecret ? (\n <View style={styles.ask}>\n {missingSecrets.map((name) => (\n <Text key={name} style={styles.askTitle}>\n Needs secret <Text style={styles.askName}>{name}</Text>\n </Text>\n ))}\n {/* ponytail: the phone has no secret input; the value is typed once, in the web panel. */}\n <Text style={styles.hint}>\n Add it from Po on the web, in this session&apos;s MCP servers. It is saved to your vault and the server\n reconnects.\n </Text>\n </View>\n ) : null}\n {signingIn ? (\n <>\n <View style={styles.step}>\n <Text style={styles.stepNumber}>1</Text>\n <View style={styles.stepText}>\n <Text style={styles.title}>Approve Po in your browser</Text>\n <Text style={styles.hint}>It opens in Safari.</Text>\n </View>\n <Button variant=\"outline\" size=\"sm\" disabled={!url} onPress={() => url && onOpenLink(url)}>\n Open\n </Button>\n </View>\n {url ? (\n <View style={styles.link}>\n <Text selectable numberOfLines={1} style={styles.url}>\n {url}\n </Text>\n <CopyButton text={url} label=\"Copy link\" />\n </View>\n ) : null}\n <View style={styles.waiting}>\n <Spinner />\n <Text style={styles.hint}>\n {url ? 'Waiting for you to finish signing in.' : 'Preparing the sign-in link.'}\n </Text>\n </View>\n </>\n ) : null}\n {server && server.state !== 'disabled' && !waitsForSecret ? (\n <View style={styles.manage}>\n <Text style={styles.label}>Manage</Text>\n <ManageRow title=\"Reauthorize\" onPress={onReauthorize} />\n {connected ? (\n <ManageRow\n title=\"Disconnect from this session\"\n hint=\"Saved credentials are kept\"\n onPress={onDisconnect}\n />\n ) : null}\n </View>\n ) : null}\n </SheetBody>\n <SheetFooter>\n <Button variant=\"ghost\" onPress={onClose}>\n {connected ? 'Done' : 'Cancel'}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n headText: { flex: 1, minWidth: 0, gap: theme.spacing(1) },\n body: { gap: theme.spacing(4) },\n title: {\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.medium,\n color: theme.colors.hi,\n },\n hint: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeightRelaxed.sm, color: theme.colors.dim },\n label: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.dim,\n },\n step: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(3) },\n stepText: { flex: 1, minWidth: 0, gap: 2 },\n stepNumber: {\n width: 22,\n height: 22,\n borderRadius: 11,\n borderWidth: 1.5,\n borderColor: theme.colors.green,\n textAlign: 'center',\n fontSize: theme.fontSize.sm,\n lineHeight: 19,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.green,\n },\n link: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingLeft: theme.spacing(3),\n borderRadius: theme.borderRadius.md,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors.border,\n },\n url: {\n flex: 1,\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n waiting: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n manage: {\n gap: theme.spacing(1),\n paddingTop: theme.spacing(3),\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: theme.colors['border-soft'],\n },\n manageRow: { minHeight: 44, justifyContent: 'center', gap: 2 },\n ask: {\n gap: theme.spacing(1),\n padding: theme.spacing(3),\n borderRadius: theme.borderRadius.md,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors['edge-magenta'],\n backgroundColor: theme.colors['tint-magenta'],\n },\n askTitle: {\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.magenta,\n },\n askName: { fontFamily: fontOf(theme.fontFamily.mono), fontWeight: theme.fontWeight.medium, color: theme.colors.hi },\n}));\n","import { Button, Dot, type DotTone, fontOf, KebabIcon, Spinner } from '@agimon-ai/po-native-components';\nimport { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { McpSessionAuthState } from '../../../../../../types/webMcp';\n\n/** One tool a server offers, and whether its schema is in the model's context. */\nexport interface McpSessionServerTool {\n name: string;\n tokens?: number;\n active: boolean;\n}\n\nexport interface McpSessionServerRow {\n name: string;\n state: McpSessionAuthState;\n tools: readonly McpSessionServerTool[];\n /** Vault secrets the server waits for; while any is missing it reads as a gentle ask, not a failure. */\n missingSecrets?: readonly string[];\n}\n\ntype Action = 'signIn' | 'connect' | 'retry';\n\n/** What each state reads as, its dot, its ink, and the one action it offers. */\nconst STATE: Record<McpSessionAuthState, { label: string; dot: DotTone; ink: Ink; action?: Action }> = {\n connected: { label: 'Connected', dot: 'green', ink: 'dim' },\n connecting: { label: 'Connecting', dot: 'muted', ink: 'dim' },\n degraded: { label: 'Degraded', dot: 'yellow', ink: 'dim' },\n 'needs-auth': { label: 'Needs sign-in', dot: 'muted', ink: 'magenta', action: 'signIn' },\n 'not-connected': { label: 'Not connected', dot: 'muted', ink: 'dim', action: 'connect' },\n closed: { label: 'Disconnected', dot: 'muted', ink: 'dim', action: 'connect' },\n failed: { label: \"Couldn't connect\", dot: 'red', ink: 'red', action: 'retry' },\n disabled: { label: 'Disabled', dot: 'muted', ink: 'dim' },\n};\n\nconst ACTION_LABEL: Record<Action, string> = { signIn: 'Sign in', connect: 'Connect', retry: 'Try again' };\n\n/** A missing secret is the person's to give from the web panel, so there is no action here. */\nconst NEEDS_SECRET: (typeof STATE)[McpSessionAuthState] = { label: 'Needs secret', dot: 'muted', ink: 'magenta' };\n\ntype Ink = 'dim' | 'magenta' | 'red';\n\nfunction tokenLabel(tool: McpSessionServerTool): string {\n const count = tool.tokens === undefined ? '-' : `~${tool.tokens.toLocaleString()}`;\n return tool.active ? count : `(${count})`;\n}\n\nexport interface McpSessionServersProps {\n servers: readonly McpSessionServerRow[];\n /** Sign in, connect, and try again all start the server's authorization. */\n onAuthorize: (server: string) => void;\n /** The server's sheet: sign-in progress, reauthorize, disconnect. */\n onOpenServer: (server: string) => void;\n onOpenTool: (server: string, tool: string) => void;\n}\n\n/**\n * The session's MCP servers on the phone, at parity with the web Context section: every configured\n * server stays listed, including one waiting for OAuth that has no tools yet, so it can be connected.\n */\nexport function McpSessionServers({ servers, onAuthorize, onOpenServer, onOpenTool }: McpSessionServersProps) {\n const [revealedServers, setRevealedServers] = useState(1);\n const serversWithTools = servers.filter((server) => server.tools.length > 0);\n const visibleTools = new Set(serversWithTools.slice(0, revealedServers).map((server) => server.name));\n if (servers.length === 0) return null;\n return (\n <View testID=\"context-mcp-auth\" style={styles.section}>\n <View style={styles.head}>\n <Text style={styles.title} accessibilityRole=\"header\">\n MCP servers\n </Text>\n <Text style={styles.hint}>Servers this session can use. Tap a server for its tools.</Text>\n </View>\n {servers.map((server, index) => {\n const waitsForSecret = server.state !== 'connected' && (server.missingSecrets?.length ?? 0) > 0;\n const view = waitsForSecret ? NEEDS_SECRET : STATE[server.state];\n return (\n <View key={server.name} style={[styles.server, index > 0 && styles.divider]}>\n <View style={styles.row}>\n <Dot tone={view.dot} pulse={server.state === 'connecting'} />\n <Text numberOfLines={1} style={styles.name}>\n {server.name}\n </Text>\n <Text style={styles.ink(view.ink)}>{view.label}</Text>\n {server.state === 'connecting' ? <Spinner /> : null}\n {view.action ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onPress={() => onAuthorize(server.name)}\n accessibilityLabel={`${ACTION_LABEL[view.action]}: ${server.name}`}\n >\n {ACTION_LABEL[view.action]}\n </Button>\n ) : null}\n <Pressable\n onPress={() => onOpenServer(server.name)}\n hitSlop={12}\n accessibilityRole=\"button\"\n accessibilityLabel={`Manage ${server.name}`}\n >\n <KebabIcon size={16} />\n </Pressable>\n </View>\n {server.tools.length > 0 && visibleTools.has(server.name) ? (\n <View style={styles.tools}>\n {server.tools.map((tool) => (\n <Pressable\n key={tool.name}\n style={styles.tool}\n onPress={() => onOpenTool(server.name, tool.name)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Open schema for ${tool.name}`}\n >\n <Text style={styles.kind}>T</Text>\n <Text numberOfLines={1} style={[styles.toolName, !tool.active && styles.inactive]}>\n {tool.name}\n </Text>\n <Text style={styles.tokens}>{tokenLabel(tool)}</Text>\n </Pressable>\n ))}\n </View>\n ) : server.tools.length > 0 ? (\n <Text style={[styles.hint, styles.indent]}>{server.tools.length} tools</Text>\n ) : server.state === 'needs-auth' ? (\n <Text style={[styles.hint, styles.indent]}>Tools appear after you sign in.</Text>\n ) : null}\n </View>\n );\n })}\n {revealedServers < serversWithTools.length ? (\n <View style={styles.head}>\n <Text style={styles.hint}>\n {revealedServers} of {serversWithTools.length} servers' tools shown\n </Text>\n <Button variant=\"ghost\" onPress={() => setRevealedServers((count) => count + 1)}>\n Show more server tools\n </Button>\n </View>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n section: { gap: theme.spacing(2), paddingHorizontal: theme.spacing(4), paddingVertical: theme.spacing(3) },\n head: { gap: theme.spacing(1), paddingBottom: theme.spacing(1) },\n title: {\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n hint: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeightRelaxed.sm, color: theme.colors.dim },\n server: { gap: theme.spacing(2), paddingVertical: theme.spacing(3) },\n divider: { borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: theme.colors['border-soft'] },\n row: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2.5), minHeight: 44 },\n name: {\n flex: 1,\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n ink: (token: Ink) => ({ fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors[token] }),\n indent: { paddingLeft: theme.spacing(5) },\n tools: { gap: theme.spacing(0.5), paddingLeft: theme.spacing(5) },\n tool: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(3), minHeight: 44 },\n kind: {\n width: 12,\n fontSize: theme.fontSize['2xs'],\n lineHeight: theme.lineHeight['2xs'],\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.violet,\n },\n toolName: {\n flex: 1,\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.hi,\n },\n inactive: { color: theme.colors.dim },\n tokens: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.dim },\n}));\n","import {\n Button,\n CodeBlock,\n fontOf,\n Sheet,\n SheetBody,\n SheetContent,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n Spinner,\n} from '@agimon-ai/po-native-components';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { McpSessionToolDetail } from '../../../../../../types/webMcp';\n\nexport interface McpToolSchemaSheetProps {\n /** The tool the sheet is for; null closes it. */\n target: { piName: string; server: string; inContext: boolean } | null;\n /** The loaded detail, undefined while it is read. */\n detail?: McpSessionToolDetail;\n error?: string;\n onClose: () => void;\n}\n\n/** The phone's half of the web tool dialog: description, warnings, the full input schema and its token cost. */\nexport function McpToolSchemaSheet({ target, detail, error, onClose }: McpToolSchemaSheetProps) {\n return (\n <Sheet\n open={target !== null}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <SheetContent>\n <SheetHeader>\n <View style={styles.headText}>\n <SheetTitle style={styles.mono}>{target?.piName ?? ''}</SheetTitle>\n <Text style={styles.hint}>\n {target?.server}\n {target?.inContext === false ? ' · not in context' : ' · in context'}\n {detail ? ` · ~${detail.tokens.toLocaleString()} tokens` : ''}\n </Text>\n </View>\n </SheetHeader>\n <SheetBody style={styles.body}>\n {error ? <Text style={styles.error}>{error}</Text> : null}\n {!detail && !error ? <Spinner label=\"Reading the tool\" /> : null}\n {detail?.description ? <Text style={styles.text}>{detail.description}</Text> : null}\n {detail?.warnings?.length ? (\n <View style={styles.warnings} accessibilityLabel=\"Tool warnings\">\n {detail.warnings.map((warning) => (\n <Text key={`${warning.source}:${warning.path}:${warning.message}`} style={styles.warning}>\n {warning.source} {warning.path}: {warning.message}\n </Text>\n ))}\n </View>\n ) : null}\n {detail ? (\n <View style={styles.schema}>\n <Text style={styles.label}>Input schema</Text>\n <CodeBlock text={JSON.stringify(detail.inputSchema, null, 2)} language=\"json\" />\n </View>\n ) : null}\n </SheetBody>\n <SheetFooter>\n <Button variant=\"outline\" onPress={onClose}>\n Done\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n headText: { flex: 1, minWidth: 0, gap: theme.spacing(1) },\n mono: { fontFamily: fontOf(theme.fontFamily.mono) },\n body: { gap: theme.spacing(4) },\n text: { fontSize: theme.fontSize.base, lineHeight: theme.lineHeightRelaxed.base, color: theme.colors.text },\n hint: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.dim },\n error: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeightRelaxed.sm, color: theme.colors.red },\n label: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.dim,\n },\n warnings: { gap: theme.spacing(1) },\n warning: { fontSize: theme.fontSize.base, lineHeight: theme.lineHeight.base, color: theme.colors.yellow },\n schema: { gap: theme.spacing(2) },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport { useEffect, useState } from 'react';\nimport { Linking } from 'react-native';\n\nimport {\n MCP_SESSION_AUTH_STATUS_KEY,\n type McpSessionToolDetail,\n parseMcpSessionAuthStatus,\n} from '../../../../../../types/webMcp';\nimport { requestMcpSessionAuthorization, requestMcpSessionDisconnect } from '../_lib/mcpSessionCommands';\nimport { fetchSessionTool } from '../_lib/mcpSessionToolApi.native';\nimport { McpServerSheet } from './McpServerSheet.native';\nimport { type McpSessionServerRow, McpSessionServers } from './McpSessionServers.native';\nimport { McpToolSchemaSheet } from './McpToolSchemaSheet.native';\n\ninterface ToolTarget {\n sessionId: string;\n server: string;\n tool: string;\n piName: string;\n inContext: boolean;\n}\n\n/**\n * The session's MCP servers in the phone's Context tab, wired as the web section is: the live\n * status the session publishes, the context inventory for what reached the model, `/mcp auth` and\n * `/mcp disconnect` prompt frames, and the session tool route for a schema.\n */\nexport function McpSessionContext({\n sessionId,\n statuses,\n sendSessionFrame,\n contextInventory = [],\n}: WebPluginSlotProps) {\n const published = parseMcpSessionAuthStatus(statuses[MCP_SESSION_AUTH_STATUS_KEY]) ?? [];\n const [serverTarget, setServerTarget] = useState<{ sessionId: string; name: string } | null>(null);\n const [toolTarget, setToolTarget] = useState<ToolTarget | null>(null);\n const [detail, setDetail] = useState<{ key: string; value?: McpSessionToolDetail; error?: string }>();\n\n const toolKey = toolTarget ? `${toolTarget.sessionId}:${toolTarget.server}:${toolTarget.tool}` : undefined;\n useEffect(() => {\n if (!toolTarget || !toolKey) return;\n let live = true;\n void fetchSessionTool(toolTarget.sessionId, toolTarget.server, toolTarget.tool).then((result) => {\n if (!live) return;\n setDetail(result.ok ? { key: toolKey, value: result.detail } : { key: toolKey, error: result.error });\n });\n return () => {\n live = false;\n };\n }, [toolKey, toolTarget]);\n\n const rows: McpSessionServerRow[] = published.map((item) => {\n // Only the context inventory measures what is actually emitted to the model.\n const inventory = contextInventory.filter((entry) => entry.source === 'mcp' && entry.owner === item.name);\n if (inventory.length > 0) {\n return {\n name: item.name,\n state: item.state,\n missingSecrets: item.missingSecrets,\n tools: inventory\n .filter((entry) => entry.itemKind === 'tool')\n .map((entry) => ({ name: entry.name, tokens: entry.tokens ?? undefined, active: entry.active })),\n };\n }\n return {\n name: item.name,\n state: item.state,\n missingSecrets: item.missingSecrets,\n tools: (item.tools ?? []).map((tool) => ({ name: tool.piName ?? tool.name, tokens: tool.tokens, active: false })),\n };\n });\n\n const selected = serverTarget?.sessionId === sessionId ? serverTarget : null;\n const server = published.find((item) => item.name === selected?.name);\n\n const authorize = (name: string) => {\n if (sessionId === null) return;\n setServerTarget({ sessionId, name });\n const current = published.find((item) => item.name === name);\n if (!current?.authorizationUrl && current?.state !== 'connecting') {\n requestMcpSessionAuthorization(sendSessionFrame, sessionId, name);\n }\n };\n\n const openTool = (serverName: string, toolName: string) => {\n if (sessionId === null) return;\n const reachable = published.find((item) => item.name === serverName)?.tools ?? [];\n const identity = reachable.find((tool) => (tool.piName ?? tool.name) === toolName);\n if (!identity) return;\n const inContext = contextInventory.some(\n (entry) => entry.source === 'mcp' && entry.name === toolName && entry.active,\n );\n setToolTarget({ sessionId, server: serverName, tool: identity.name, piName: toolName, inContext });\n };\n\n const shownDetail = detail && detail.key === toolKey ? detail : undefined;\n\n return (\n <>\n <McpSessionServers\n servers={rows}\n onAuthorize={authorize}\n onOpenServer={(name) => {\n if (sessionId !== null) setServerTarget({ sessionId, name });\n }}\n onOpenTool={openTool}\n />\n <McpServerSheet\n server={\n server\n ? {\n name: server.name,\n state: server.state,\n authorizationUrl: server.authorizationUrl,\n missingSecrets: server.missingSecrets,\n }\n : null\n }\n onOpenLink={(url) => void Linking.openURL(url)}\n onReauthorize={() => {\n if (selected) requestMcpSessionAuthorization(sendSessionFrame, selected.sessionId, selected.name);\n }}\n onDisconnect={() => {\n if (selected) requestMcpSessionDisconnect(sendSessionFrame, selected.sessionId, selected.name);\n }}\n onClose={() => setServerTarget(null)}\n />\n <McpToolSchemaSheet\n target={\n toolTarget ? { piName: toolTarget.piName, server: toolTarget.server, inContext: toolTarget.inContext } : null\n }\n {...(shownDetail?.value ? { detail: shownDetail.value } : {})}\n {...(shownDetail?.error ? { error: shownDetail.error } : {})}\n onClose={() => setToolTarget(null)}\n />\n </>\n );\n}\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { McpSessionContext } from './_components/McpSessionContext.native';\n\nexport default defineFill({ component: McpSessionContext });\n","import type { McpResultBlock } from '../../../../../../types/webMcp';\n\n/**\n * Pure view logic for MCP tool cards. MCP tools are registered under `<server>_<tool>`,\n * so the plugin recognises a call by the server names the session publishes.\n */\n\n/**\n * The footer status the session half publishes (src/constants/piMcp.ts\n * MCP_STATUS_KEY). Duplicated because the browser half may import only\n * src/types and src/constants; a test keeps the two literals equal.\n */\nexport const MCP_STATUS_KEY = 'po-mcp';\nconst SERVER_SEPARATOR = ',';\nconst PI_NAME_SEPARATOR = '_';\nconst MAX_ARGUMENTS = 3;\n/** Text lines kept in the collapsed result, before the card is expanded. */\nconst COLLAPSED_RESULT_LINES = 12;\n\nexport interface McpToolIdentity {\n server: string;\n tool: string;\n}\n\n/** The server names the session reports, in the order it listed them. */\nexport function mcpServers(statuses: Readonly<Record<string, string>>): string[] {\n const raw = statuses[MCP_STATUS_KEY];\n if (raw === undefined) return [];\n return raw\n .split(SERVER_SEPARATOR)\n .map((name) => name.trim())\n .filter((name) => name.length > 0);\n}\n\n/**\n * Splits a Pi tool name into its MCP server and tool. The longest server\n * prefix wins so `github_enterprise_search` belongs to `github_enterprise`\n * when both it and `github` are configured.\n */\nexport function matchMcpTool(toolName: string, statuses: Readonly<Record<string, string>>): McpToolIdentity | null {\n let best: McpToolIdentity | null = null;\n for (const server of mcpServers(statuses)) {\n const prefix = `${server}${PI_NAME_SEPARATOR}`;\n if (!toolName.startsWith(prefix) || toolName.length === prefix.length) continue;\n if (best === null || server.length > best.server.length) {\n best = { server, tool: toolName.slice(prefix.length) };\n }\n }\n return best;\n}\n\n/** The identity the result details carry, which the tool wrote itself and is exact. */\nexport function mcpIdentityFromDetails(details: unknown): McpToolIdentity | null {\n if (typeof details !== 'object' || details === null) return null;\n const record = details as { server?: unknown; tool?: unknown };\n if (typeof record.server !== 'string' || typeof record.tool !== 'string') return null;\n return { server: record.server, tool: record.tool };\n}\n\nfunction argumentValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (value === null) return 'null';\n if (Array.isArray(value)) return `[${value.length}]`;\n return '{…}';\n}\n\n/** The first few arguments as `key=value`, with a count for the rest. */\nexport function mcpArgumentSummary(params: Record<string, unknown>): string {\n const entries = Object.entries(params);\n const shown = entries.slice(0, MAX_ARGUMENTS).map(([key, value]) => `${key}=${argumentValue(value)}`);\n if (entries.length > shown.length) shown.push(`+${entries.length - shown.length}`);\n return shown.join(' · ');\n}\n\nexport type McpStatusTone = 'running' | 'ok' | 'error' | 'hint';\n\nexport interface McpResultView {\n lines: string[];\n status: { glyph: string; tone: McpStatusTone; text: string } | null;\n}\n\n/** The result body as renderMcpResult lays it out: text lines, then one status line. */\nexport function mcpResultView(input: {\n output: string;\n expanded: boolean;\n isPartial: boolean;\n isError: boolean;\n}): McpResultView {\n const all = input.output.split('\\n');\n while (all.length > 0 && all.at(-1)?.trim() === '') all.pop();\n const lines = input.expanded ? all : all.slice(0, COLLAPSED_RESULT_LINES);\n\n if (input.isPartial) return { lines, status: { glyph: '◐', tone: 'running', text: 'running' } };\n if (input.isError) return { lines, status: { glyph: '✗', tone: 'error', text: 'failed' } };\n if (!input.expanded && all.length > lines.length) {\n return { lines, status: { glyph: '…', tone: 'hint', text: `${all.length - lines.length} more line(s)` } };\n }\n if (lines.length === 0) return { lines, status: { glyph: '✓', tone: 'ok', text: 'done' } };\n return { lines, status: null };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** One block of the result's details, kept only when its required fields are the strings the adapter wrote. */\nfunction mcpResultBlock(entry: unknown): McpResultBlock | null {\n if (!isRecord(entry)) return null;\n const text = (key: string): string | undefined => (typeof entry[key] === 'string' ? entry[key] : undefined);\n switch (entry.type) {\n case 'audio': {\n const data = text('data');\n const mimeType = text('mimeType');\n return data !== undefined && mimeType !== undefined ? { type: 'audio', data, mimeType } : null;\n }\n case 'resource_link': {\n const uri = text('uri');\n const name = text('name');\n if (uri === undefined || name === undefined) return null;\n const title = text('title');\n const description = text('description');\n const mimeType = text('mimeType');\n return {\n type: 'resource_link',\n uri,\n name,\n ...(title === undefined ? {} : { title }),\n ...(description === undefined ? {} : { description }),\n ...(mimeType === undefined ? {} : { mimeType }),\n };\n }\n case 'resource': {\n const uri = text('uri');\n if (uri === undefined) return null;\n const mimeType = text('mimeType');\n const content = text('text');\n const blob = text('blob');\n return {\n type: 'resource',\n uri,\n ...(mimeType === undefined ? {} : { mimeType }),\n ...(content === undefined ? {} : { text: content }),\n ...(blob === undefined ? {} : { blob }),\n };\n }\n case 'structured':\n return isRecord(entry.value) ? { type: 'structured', value: entry.value } : null;\n default:\n return null;\n }\n}\n\n/** The blocks beyond text the adapter attached to the result's details; malformed entries are dropped. */\nexport function mcpResultBlocks(details: unknown): McpResultBlock[] {\n if (!isRecord(details) || !Array.isArray(details.blocks)) return [];\n return details.blocks.flatMap((entry) => {\n const block = mcpResultBlock(entry);\n return block === null ? [] : [block];\n });\n}\n\nexport interface McpImageBlock {\n data: string;\n mimeType: string;\n}\n\n/** The image blocks of a result's content, which Pi carries beside the text. */\nexport function mcpImageBlocks(content: readonly unknown[]): McpImageBlock[] {\n return content.flatMap((block) => {\n if (!isRecord(block) || block.type !== 'image') return [];\n return typeof block.data === 'string' && typeof block.mimeType === 'string'\n ? [{ data: block.data, mimeType: block.mimeType }]\n : [];\n });\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n Button,\n CopyButton,\n fontOf,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n type StatusTone,\n toolTone,\n} from '@agimon-ai/po-native-components';\nimport { useState } from 'react';\nimport { Image, Linking, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type {} from '../../../../../../types/unistyles.native';\nimport type { McpResultBlock } from '../../../../../../types/webMcp';\nimport {\n type McpStatusTone,\n matchMcpTool,\n mcpIdentityFromDetails,\n mcpImageBlocks,\n mcpResultBlocks,\n mcpResultView,\n} from '../_lib/mcpToolMatch';\n\nconst CHARACTER_PAGE = 640;\nconst LINE_PAGE = 12;\nconst BLOCK_PAGE = 2;\nconst IMAGE_PAGE = 1;\nconst STATUS_TONE: Record<McpStatusTone, StatusTone> = {\n running: 'running',\n ok: 'ok',\n error: 'error',\n hint: 'neutral',\n};\n\nfunction fallbackIdentity(toolName: string): { server: string; tool: string } {\n const separator = toolName.indexOf('_');\n if (separator <= 0) return { server: toolName, tool: '' };\n return { server: toolName.slice(0, separator), tool: toolName.slice(separator + 1) };\n}\n\nfunction hasApp(details: unknown): boolean {\n if (details === null || typeof details !== 'object' || !('app' in details)) return false;\n const app = details.app;\n return (\n app !== null &&\n typeof app === 'object' &&\n 'version' in app &&\n app.version === 1 &&\n 'resourceUri' in app &&\n typeof app.resourceUri === 'string'\n );\n}\n\n/** Copies always receive the original string, never the displayed prefix. */\nfunction Literal({\n source,\n copy = false,\n all = false,\n revealed = false,\n label = 'complete source',\n}: {\n source: string;\n copy?: boolean;\n all?: boolean;\n label?: string;\n revealed?: boolean;\n}) {\n const [characters, setCharacters] = useState(all ? source.length : CHARACTER_PAGE * (revealed ? 2 : 1));\n const sourceLines = source.split('\\n');\n const [lines, setLines] = useState(all ? sourceLines.length : LINE_PAGE * (revealed ? 2 : 1));\n const linePrefix = sourceLines.slice(0, lines).join('\\n');\n let end = Math.min(characters, linePrefix.length);\n const last = linePrefix.charCodeAt(end - 1);\n const next = linePrefix.charCodeAt(end);\n if (last >= 0xd800 && last <= 0xdbff && next >= 0xdc00 && next <= 0xdfff) end -= 1;\n const visible = linePrefix.slice(0, end);\n return (\n <View style={styles.part}>\n {copy ? (\n <View style={styles.code}>\n <ScrollView horizontal contentContainerStyle={styles.codeScroll}>\n <Text selectable style={[styles.literal, styles.codeText]}>\n {visible}\n </Text>\n </ScrollView>\n <CopyButton text={source} label={label} style={styles.copy} />\n </View>\n ) : (\n <Text selectable style={styles.literal}>\n {visible}\n </Text>\n )}\n {visible.length < source.length ? (\n <View style={styles.disclosure}>\n <Text style={styles.meta}>\n {visible.length} of {source.length} characters · {visible.split('\\n').length} of {sourceLines.length} lines\n </Text>\n <Button\n variant=\"ghost\"\n onPress={() => {\n setCharacters((value) => value + CHARACTER_PAGE);\n setLines((value) => value + LINE_PAGE);\n }}\n >\n Show more {copy ? 'source' : 'output'}\n </Button>\n </View>\n ) : null}\n </View>\n );\n}\n\nfunction ResultBlock({ block, all }: { block: McpResultBlock; all: boolean }) {\n switch (block.type) {\n case 'resource_link':\n return (\n <Text accessibilityRole=\"link\" style={styles.link} onPress={() => void Linking.openURL(block.uri)}>\n {block.title ?? block.name}\n </Text>\n );\n case 'resource':\n return block.text === undefined ? (\n <Text style={styles.meta}>\n binary {block.mimeType ?? 'resource'} · {block.uri}\n </Text>\n ) : (\n <Literal source={block.text} copy all={all} label=\"complete resource\" />\n );\n case 'structured':\n return (\n <Literal source={JSON.stringify(block.value, null, 2)} copy all={all} label=\"complete structured result\" />\n );\n case 'audio':\n return <Text style={styles.meta}>audio · {block.mimeType}</Text>;\n }\n}\n\n/** Bounded inline MCP results. The optional initial reveal is used by deterministic stories. */\nexport function McpToolMessage({\n defaultExpanded = false,\n initialReveal = 'first',\n ...props\n}: ToolMessageRenderProps & {\n defaultExpanded?: boolean;\n initialReveal?: 'first' | 'output' | 'all';\n}) {\n const all = initialReveal === 'all';\n const revealed = initialReveal === 'output';\n const identity =\n mcpIdentityFromDetails(props.result?.details) ??\n matchMcpTool(props.toolName, props.statuses) ??\n fallbackIdentity(props.toolName);\n const images = mcpImageBlocks(props.result?.content ?? []);\n const blocks = mcpResultBlocks(props.result?.details);\n const [imageCount, setImageCount] = useState(all ? images.length : IMAGE_PAGE);\n const [blockCount, setBlockCount] = useState(all ? blocks.length : BLOCK_PAGE);\n const view = mcpResultView({\n output: props.output,\n expanded: true,\n isPartial: props.running,\n isError: props.isError,\n });\n const hasInput = Object.keys(props.args).length > 0;\n const hasOutput = props.output.length > 0 || view.status !== null || images.length > 0 || blocks.length > 0;\n const app = !props.running && hasApp(props.result?.details);\n return (\n <MessageItem\n tone={toolTone(props)}\n expandable={hasInput || hasOutput}\n defaultExpanded={defaultExpanded}\n testID=\"tool-mcp\"\n >\n {({ expanded: open }) => (\n <>\n <MessageItemHeader title=\"mcp\" testID=\"tool-call-mcp\">\n <Text numberOfLines={1} style={styles.call}>\n <Text style={styles.meta}>{identity.server} / </Text>\n <Text style={styles.link}>{identity.tool}</Text>\n </Text>\n </MessageItemHeader>\n {app ? (\n <MessageItemBody>\n <Text style={styles.meta}>\n This MCP App runs in Po on your computer. Open the session there to use it.\n </Text>\n </MessageItemBody>\n ) : null}\n {open && hasInput ? (\n <MessageItemBody testID=\"tool-input-mcp\" style={styles.part}>\n <Text style={styles.label}>Input</Text>\n <Literal source={JSON.stringify(props.args, null, 2)} copy all={all} label=\"complete input\" />\n </MessageItemBody>\n ) : null}\n {open && hasOutput ? (\n <MessageItemBody testID=\"tool-result-mcp\" style={styles.part}>\n {hasInput ? <Text style={styles.label}>Output</Text> : null}\n {view.lines.length > 0 ? <Literal source={view.lines.join('\\n')} all={all} revealed={revealed} /> : null}\n {images.slice(0, imageCount).map((image, index) => (\n <Image\n key={index}\n source={{ uri: `data:${image.mimeType};base64,${image.data}` }}\n accessibilityLabel={`${identity.tool} result ${index + 1}`}\n resizeMode=\"contain\"\n style={styles.image}\n />\n ))}\n {imageCount < images.length ? (\n <View style={styles.disclosure}>\n <Text style={styles.meta}>\n {imageCount} of {images.length} images\n </Text>\n <Button variant=\"ghost\" onPress={() => setImageCount((value) => value + IMAGE_PAGE)}>\n Show more images\n </Button>\n </View>\n ) : null}\n {blocks.slice(0, blockCount).map((block, index) => (\n <ResultBlock key={index} block={block} all={all} />\n ))}\n {blockCount < blocks.length ? (\n <View style={styles.disclosure}>\n <Text style={styles.meta}>\n {blockCount} of {blocks.length} additional blocks\n </Text>\n <Button variant=\"ghost\" onPress={() => setBlockCount((value) => value + BLOCK_PAGE)}>\n Show more blocks\n </Button>\n </View>\n ) : null}\n {view.status ? (\n <MessageItemStatus tone={STATUS_TONE[view.status.tone]} glyph={view.status.glyph}>\n {view.status.text}\n </MessageItemStatus>\n ) : null}\n </MessageItemBody>\n ) : null}\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n part: { gap: theme.spacing(1.5), minWidth: 0 },\n disclosure: { gap: theme.spacing(1), alignItems: 'flex-start' },\n call: {\n flexShrink: 1,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n meta: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n label: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: theme.fontWeight.semibold,\n },\n link: {\n color: theme.colors.blue,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n literal: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n codeText: { color: theme.colors.text },\n code: {\n borderRadius: theme.borderRadius.DEFAULT,\n borderWidth: 1,\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.deep,\n },\n codeScroll: { padding: theme.spacing(2.5), paddingRight: theme.spacing(9) },\n copy: { position: 'absolute', top: theme.spacing(1.5), right: theme.spacing(1.5) },\n image: { width: '100%', height: 240, borderRadius: theme.borderRadius.md },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { McpToolMessage } from './_components/McpToolMessage.native';\nimport { matchMcpTool, mcpIdentityFromDetails } from './_lib/mcpToolMatch';\n\nexport default defineToolRenderer({\n tools: [],\n matches: (toolName, statuses, details) =>\n mcpIdentityFromDetails(details) !== null || matchMcpTool(toolName, statuses) !== null,\n message: McpToolMessage,\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fillMcpAuth from '../src/extensions/workspaces/sessions/(frontend)/fill/McpAuth.context.native';\nimport toolMcp from '../src/extensions/workspaces/sessions/(frontend)/tool/mcp.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'mcp',\n session: {\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'context', id: 'mcp-auth' }, fillMcpAuth)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['mcp'] }, toolMcp)]; },\n },\n});\n"],"mappings":"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"}