@burdenoff/mcp-libs 2026.525.1 → 2026.626.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-HRWIDQJE.js → chunk-XITZQYB2.js} +8 -3
- package/dist/{chunk-HRWIDQJE.js.map → chunk-XITZQYB2.js.map} +1 -1
- package/dist/modules/kadaikodi/index.cjs +1467 -0
- package/dist/modules/kadaikodi/index.cjs.map +1 -0
- package/dist/modules/kadaikodi/index.d.cts +8 -0
- package/dist/modules/kadaikodi/index.d.ts +8 -0
- package/dist/modules/kadaikodi/index.js +1406 -0
- package/dist/modules/kadaikodi/index.js.map +1 -0
- package/dist/modules/sandbox/index.cjs +26 -0
- package/dist/modules/sandbox/index.cjs.map +1 -1
- package/dist/modules/sandbox/index.js +22 -1
- package/dist/modules/sandbox/index.js.map +1 -1
- package/dist/modules/vibecontrols/index.cjs.map +1 -1
- package/dist/modules/vibecontrols/index.js +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/errors.ts","../../../src/core/result.ts","../../../src/core/tool-name.ts","../../../src/modules/vibecontrols/operations.ts","../../../src/modules/sandbox/tools.ts","../../../src/modules/sandbox/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error classes for MCP SDK.\n *\n * Modules MUST throw these instead of throwing raw Errors. The registerTool\n * wrapper in result.ts catches and maps them to MCP-protocol-compliant\n * `{ isError: true, content: [...] }` responses.\n *\n * Throwing past the wrapper to the protocol surfaces as JSON-RPC -32603 to\n * the client and is a protocol bug.\n */\n\nexport class McpUserError extends Error {\n public readonly hint: string | undefined;\n\n constructor(message: string, opts?: { hint?: string }) {\n super(message);\n this.name = 'McpUserError';\n this.hint = opts?.hint;\n }\n}\n\nexport class McpAuthError extends McpUserError {\n constructor(message: string, opts?: { hint?: string }) {\n super(message, {\n hint: opts?.hint ?? 'Run the auth_login tool to authenticate.',\n });\n this.name = 'McpAuthError';\n }\n}\n\nexport class McpInternalError extends Error {\n public override readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'McpInternalError';\n this.cause = cause;\n }\n}\n","/**\n * MCP tool result helpers + central handler.\n *\n * Modules NEVER call server.registerTool directly — they use registerTool()\n * from this module so the central try/catch wraps the handler and:\n * - maps thrown McpUserError / McpAuthError / McpInternalError to\n * MCP-protocol-compliant `{ isError: true, content: [...] }` shapes\n * - threads `_meta.progressToken` into ctx.progress for long ops\n * - emits a structured log line on every error\n * - never leaks `cause` from McpInternalError to the client\n *\n * This is the analog of cli-sdk's createProgram() central error handler.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ZodRawShape } from 'zod';\nimport type { McpContext } from './context.js';\nimport { McpAuthError, McpInternalError, McpUserError } from './errors.js';\n\nexport interface ToolTextContent {\n type: 'text';\n text: string;\n [k: string]: unknown;\n}\n\nexport interface ToolResult {\n content: ToolTextContent[];\n isError?: boolean;\n structuredContent?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\nexport interface ToolMeta {\n progressToken?: string | number;\n}\n\n/**\n * Build a successful tool result with JSON content (pretty-printed).\n */\nexport function jsonResult(data: unknown, structured?: Record<string, unknown>): ToolResult {\n const result: ToolResult = {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n if (structured !== undefined) {\n result.structuredContent = structured;\n }\n return result;\n}\n\n/**\n * Build a successful tool result with plain text content.\n */\nexport function textResult(text: string): ToolResult {\n return { content: [{ type: 'text', text }] };\n}\n\n/**\n * Build an error tool result. Honors MCP's `{ isError: true, content }` shape.\n * Optional hint is appended on a new line so the LLM can react.\n */\nexport function errorResult(message: string, hint?: string): ToolResult {\n const text = hint ? `${message}\\n\\nHint: ${hint}` : message;\n return { content: [{ type: 'text', text }], isError: true };\n}\n\nexport interface ToolMetadata {\n title: string;\n description: string;\n inputSchema?: ZodRawShape;\n}\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n ctx: McpContext,\n meta: ToolMeta,\n) => Promise<unknown>;\n\n/**\n * Register a tool with the central error wrapper.\n *\n * The handler returns a plain value or void. The wrapper:\n * - wraps non-undefined returns in jsonResult()\n * - if the value already looks like a ToolResult (has `content`), passes through\n * - catches McpAuthError / McpUserError / McpInternalError / generic Error\n * - logs every error via ctx.logger.error\n */\nexport function registerTool<TArgs extends Record<string, unknown>>(\n server: McpServer,\n ctx: McpContext,\n name: string,\n metadata: ToolMetadata,\n handler: ToolHandler<TArgs>,\n): void {\n const sdkConfig = {\n title: metadata.title,\n description: metadata.description,\n ...(metadata.inputSchema ? { inputSchema: metadata.inputSchema } : {}),\n };\n\n // The MCP SDK's registerTool signature is `(name, config, handler)`. The\n // handler arity depends on whether inputSchema is present (1-arg without,\n // 2-arg with). We accept a unified handler shape and dispatch at runtime.\n // The SDK's typing is strict and conditional on the inputSchema generic;\n // bypass with a cast since runtime acceptance is unconditional.\n const wrapped = async (...callbackArgs: unknown[]): Promise<ToolResult> => {\n const hasArgs = callbackArgs.length === 2;\n const args = (hasArgs ? callbackArgs[0] : {}) as TArgs;\n const extra = (hasArgs ? callbackArgs[1] : callbackArgs[0]) as\n | { _meta?: { progressToken?: string | number } }\n | undefined;\n\n const progressToken = extra?._meta?.progressToken;\n const meta: ToolMeta = progressToken !== undefined ? { progressToken } : {};\n\n try {\n const result = await handler(args, ctx, meta);\n if (isToolResult(result)) return result;\n if (result === undefined) return textResult('OK');\n return jsonResult(result);\n } catch (error) {\n return mapErrorToResult(error, ctx, name);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (server as any).registerTool(name, sdkConfig, wrapped);\n}\n\nfunction isToolResult(value: unknown): value is ToolResult {\n return (\n !!value &&\n typeof value === 'object' &&\n 'content' in value &&\n Array.isArray((value as ToolResult).content)\n );\n}\n\nfunction mapErrorToResult(error: unknown, ctx: McpContext, toolName: string): ToolResult {\n if (error instanceof McpAuthError) {\n ctx.logger.warn(`${toolName}: auth required`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpUserError) {\n ctx.logger.info(`${toolName}: user error`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpInternalError) {\n ctx.logger.error(`${toolName}: internal error`, {\n message: error.message,\n cause: stringifyCause(error.cause),\n });\n return errorResult(`Internal error in ${toolName}.`);\n }\n const message = error instanceof Error ? error.message : String(error);\n ctx.logger.error(`${toolName}: unhandled error`, { message });\n return errorResult(`${toolName}: ${message}`);\n}\n\nfunction stringifyCause(cause: unknown): string | undefined {\n if (cause === undefined || cause === null) return undefined;\n if (cause instanceof Error) return cause.message;\n try {\n return JSON.stringify(cause);\n } catch {\n return String(cause);\n }\n}\n","/**\n * Tool / resource / prompt naming helpers.\n *\n * Mandatory product prefix avoids collisions when Claude Desktop runs\n * multiple MCP servers concurrently (typical setup is ~6).\n *\n * Tool names are capped at 63 characters — Claude Desktop pre-1.x\n * truncated at 64 in some versions.\n */\n\nimport { McpInternalError } from './errors.js';\n\nconst MAX_TOOL_NAME_LENGTH = 63;\n\nfunction assertSafeName(name: string, kind: 'tool' | 'resource' | 'prompt'): string {\n if (kind === 'tool' && name.length > MAX_TOOL_NAME_LENGTH) {\n throw new McpInternalError(\n `Tool name '${name}' exceeds ${MAX_TOOL_NAME_LENGTH} characters (some MCP clients truncate at 64).`,\n );\n }\n return name;\n}\n\n/**\n * Build a tool name. Format: `<productName>_<...parts>` (snake_case).\n * Example: mcpToolName('vibecontrols', 'vibes', 'list') -> 'vibecontrols_vibes_list'\n */\nexport function mcpToolName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpToolName: productName is required');\n }\n const name = [productName, ...parts].filter(Boolean).join('_');\n return assertSafeName(name, 'tool');\n}\n\n/**\n * Build a resource URI. Format: `<productName>://<...parts>`.\n * Example: mcpResourceUri('vibecontrols', 'schema') -> 'vibecontrols://schema'\n */\nexport function mcpResourceUri(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpResourceUri: productName is required');\n }\n return `${productName}://${parts.filter(Boolean).join('/')}`;\n}\n\n/**\n * Build a prompt name. Format: `<productName>-<...parts>` (kebab-case).\n * Example: mcpPromptName('vibecontrols', 'setup') -> 'vibecontrols-setup'\n */\nexport function mcpPromptName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpPromptName: productName is required');\n }\n return [productName, ...parts].filter(Boolean).join('-');\n}\n\nexport const TOOL_NAME_LIMIT = MAX_TOOL_NAME_LENGTH;\n","/**\n * Centralized GraphQL operations for the VibeControls MCP server.\n * Adapted from vibecontrols-cli/src/graphql/operations.ts with superset field selections.\n * Uses template string interpolation pattern (not gql tagged fragments).\n */\n\n// ---------------------------------------------------------------------------\n// Field Fragments (template string constants for interpolation)\n// ---------------------------------------------------------------------------\n\nexport const AGENT_FIELDS = `\n id name hostname platform architecture version\n tunnelUrl tunnelStatus apiUrl agentApiKey appId appClientId\n capabilities configuration isActive lastHeartbeat metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const VIBE_FIELDS = `\n id name description path type status agentId parentId\n gitBranch gitRemote gitStatus environmentVariables tags metadata\n workspaceId archivedAt createdAt updatedAt deletedAt\n`;\n\nexport const SESSION_FIELDS = `\n id name command workingDirectory type status agentId vibeId\n providerSessionName providerWindowId providerPaneId pid exitCode ttydUrl lastOutput\n autoStart environmentVariables metadata startedAt stoppedAt\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const NOTE_FIELDS = `\n id title content tags isPinned vibeId createdBy metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const CONFIG_FIELDS = `\n id key value scope scopeId isSecret\n workspaceId createdAt updatedAt\n`;\n\nexport const WEBHOOK_FIELDS = `\n id name url events agentIds isActive signingKey retryPolicy\n deliveryCount failureCount lastDelivery lastError\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const UI_SESSION_FIELDS = `\n id userId state activeVibeId activeSessionId\n recentVibes recentSessions workspaceId createdAt updatedAt\n`;\n\nexport const TUNNEL_FIELDS = `\n id workspaceId agentId slug name description\n providerKey protocol localHost localPort tlsMode\n status lastError hasBasicAuth basicAuthUser\n primaryDomain { id hostname type verificationStatus isPrimary }\n startedAt stoppedAt createdAt updatedAt\n`;\n\nexport const TUNNEL_DOMAIN_FIELDS_MCP = `\n id workspaceId tunnelId type hostname environment\n verificationStatus challengeRecordName challengeToken\n verifiedAt lastCheckedAt lastCheckError isPrimary\n dnsTargetHint createdAt updatedAt\n`;\n\nexport const TUNNEL_PROVIDER_FIELDS_MCP = `\n id key displayName description isEnabled pluginPackage minAgentVersion\n capabilities {\n platforms supportedVisibilities\n supportsCustomDomains supportsHttp supportsHttps supportsLiveLogs\n supportsManagedSubdomains supportsReservedSubdomain supportsRotateCredentials\n supportsSessionTokens supportsTcp supportsUdp supportsUsageMetrics\n }\n createdAt updatedAt\n`;\n\nexport const TUNNEL_SESSION_FIELDS_MCP = `\n id workspaceId tunnelId shardId agentId status\n tokenFingerprint issuedAt expiresAt connectedAt disconnectedAt\n revokedAt revokedReason clientIp bytesIn bytesOut\n`;\n\nexport const TUNNEL_SHARD_FIELDS_MCP = `\n id name providerId environment publicHost controlPort proxyPortRange\n region status capacity currentLoad metadata createdAt updatedAt\n`;\n\nexport const TARGET_FIELDS = `\n id name type host port username status\n workspaceId createdAt updatedAt\n`;\n\nexport const AGENT_CONNECTION_FIELDS = `\n id sourceAgentId targetId protocol status permissions\n createdAt updatedAt\n`;\n\nexport const VIBEDECK_FIELDS = `\n id name description isDefault\n workspaceId createdAt updatedAt\n`;\n\nexport const VIBEDECK_BUTTON_FIELDS = `\n id vibeDeckId label icon actionType actionId\n action { id name actionType }\n command script webhookUrl\n row column color category tags\n confirmationRequired keyboardShortcut style sortOrder\n createdAt updatedAt\n`;\n\nexport const AI_TOOL_EVENT_FIELDS = `\n id source eventType payload agentId\n workspaceId createdAt\n`;\n\nexport const DOCS_SITE_FIELDS = `\n id vibeId name visibility runtime\n workspaceId createdAt updatedAt\n`;\n\nexport const DOCS_PAGE_FIELDS = `\n id siteId title slug content parentId sidebarPosition status\n createdAt updatedAt\n`;\n\nexport const DOCS_REVISION_FIELDS = `\n id siteId revisionNumber status buildDurationMs artifactSizeBytes\n errorMessage publishedAt\n createdAt updatedAt\n`;\n\nexport const AUDIT_LOG_FIELDS = `\n id action resourceType resourceId actorId actorType\n status description ipAddress userAgent requestId\n workspaceId createdAt\n`;\n\nexport const SESSION_SHARE_FIELDS = `\n id sessionId sharedWithId permission status message\n createdBy createdAt expiresAt lastAccessAt accessCount revokedAt revokedBy\n`;\n\nexport const SESSION_SHARE_LINK_FIELDS = `\n id sessionId token permission expiresAt\n createdAt\n`;\n\n// ---------------------------------------------------------------------------\n// Agent Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENTS = `\n query VibecontrolsAgents($filter: VibecontrolsAgentFilterInput) {\n vibecontrolsAgents(filter: $filter) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const GET_AGENT = `\n query VibecontrolsAgent($id: ID!) {\n vibecontrolsAgent(id: $id) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const CREATE_AGENT = `\n mutation CreateVibecontrolsAgent($input: CreateVibecontrolsAgentInput!) {\n createVibecontrolsAgent(input: $input) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const UPDATE_AGENT = `\n mutation UpdateVibecontrolsAgent($id: ID!, $input: UpdateVibecontrolsAgentInput!) {\n updateVibecontrolsAgent(id: $id, input: $input) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const DELETE_AGENT = `\n mutation DeleteVibecontrolsAgent($id: ID!) {\n deleteVibecontrolsAgent(id: $id)\n }\n`;\n\nexport const PROBE_AGENT_CONNECTION = `\n query ProbeAgentConnection($id: ID!) {\n probeAgentConnection(id: $id) {\n agentId reachable latencyMs error version tunnelUrl\n }\n }\n`;\n\nexport const AGENT_HEALTH_PROBES = `\n query VibecontrolsAgentHealthProbes {\n vibecontrolsAgentHealthProbes {\n agentId agentName healthy agentVersion errorMessage tunnelUrl uptime\n }\n }\n`;\n\nexport const AGENT_PLUGINS = `\n query AgentPlugins($agentId: ID!) {\n agentPlugins(agentId: $agentId) {\n agentId\n plugins {\n name packageName version description isActive tags metadata\n }\n total\n }\n }\n`;\n\nexport const INSTALL_AGENT_PLUGIN = `\n mutation InstallAgentPlugin($agentId: ID!, $packageName: String!) {\n installAgentPlugin(agentId: $agentId, packageName: $packageName) {\n success message\n plugin { name packageName version description isActive tags metadata }\n }\n }\n`;\n\nexport const REMOVE_AGENT_PLUGIN = `\n mutation RemoveAgentPlugin($agentId: ID!, $packageName: String!) {\n removeAgentPlugin(agentId: $agentId, packageName: $packageName) {\n success message\n plugin { name packageName version description isActive tags metadata }\n }\n }\n`;\n\nexport const AGENT_HEARTBEAT = `\n mutation VibecontrolsAgentHeartbeat($id: ID!) {\n vibecontrolsAgentHeartbeat(id: $id) { id isActive lastHeartbeat }\n }\n`;\n\nexport const DEACTIVATE_AGENT = `\n mutation DeactivateVibecontrolsAgent($id: ID!) {\n deactivateVibecontrolsAgent(id: $id) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const AGENT_GRAPH = `\n query AgentGraph($workspaceId: ID!, $rootAgentId: ID) {\n agentGraph(workspaceId: $workspaceId, rootAgentId: $rootAgentId) {\n agents { ${AGENT_FIELDS} }\n connections { ${AGENT_CONNECTION_FIELDS} }\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Vibe Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_VIBES = `\n query Vibes($filter: VibeFilterInput, $pagination: PaginationInput) {\n vibes(filter: $filter, pagination: $pagination) {\n items { ${VIBE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBE = `\n query Vibe($id: ID!) {\n vibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBE = `\n mutation CreateVibe($input: CreateVibeInput!) {\n createVibe(input: $input) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE = `\n mutation UpdateVibe($id: ID!, $input: UpdateVibeInput!) {\n updateVibe(id: $id, input: $input) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBE = `\n mutation DeleteVibe($id: ID!) { deleteVibe(id: $id) }\n`;\n\nexport const ARCHIVE_VIBE = `\n mutation ArchiveVibe($id: ID!) {\n archiveVibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const RESTORE_VIBE = `\n mutation RestoreVibe($id: ID!) {\n restoreVibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const MOVE_VIBE = `\n mutation MoveVibe($id: ID!, $newParentId: ID) {\n moveVibe(id: $id, newParentId: $newParentId) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE_STATUS = `\n mutation UpdateVibeStatus($id: ID!, $status: VibeStatus!) {\n updateVibeStatus(id: $id, status: $status) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const VIBE_HIERARCHY = `\n query VibeHierarchy($rootId: ID) {\n vibeHierarchy(rootId: $rootId) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const SEARCH_VIBES = `\n query SearchVibes($query: String!, $limit: Int) {\n searchVibes(query: $query, limit: $limit) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE_GIT = `\n mutation UpdateVibeGit($id: ID!, $gitBranch: String, $gitRemote: String, $gitStatus: JSON) {\n updateVibeGit(id: $id, gitBranch: $gitBranch, gitRemote: $gitRemote, gitStatus: $gitStatus) {\n ${VIBE_FIELDS}\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Session Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_SESSIONS = `\n query Sessions($filter: SessionFilterInput, $pagination: PaginationInput) {\n sessions(filter: $filter, pagination: $pagination) {\n items { ${SESSION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_SESSION = `\n query Session($id: ID!) {\n session(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const CREATE_SESSION = `\n mutation CreateSession($input: CreateSessionInput!) {\n createSession(input: $input) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const START_SESSION = `\n mutation StartSession($id: ID!) {\n startSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const STOP_SESSION = `\n mutation StopSession($id: ID!) {\n stopSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const RESTART_SESSION = `\n mutation RestartSession($id: ID!) {\n restartSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const TERMINATE_SESSION = `\n mutation TerminateSession($id: ID!) {\n terminateSession(id: $id)\n }\n`;\n\nexport const SEND_SESSION_INPUT = `\n mutation SendSessionInput($id: ID!, $input: String!) {\n sendSessionInput(id: $id, input: $input)\n }\n`;\n\nexport const START_SESSION_TERMINAL = `\n mutation StartSessionTerminal($id: ID!) {\n startSessionTerminal(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const SESSION_OUTPUT = `\n query SessionOutput($id: ID!, $lines: Int) {\n sessionOutput(id: $id, lines: $lines)\n }\n`;\n\nexport const ACTIVE_SESSIONS = `\n query ActiveSessions($vibeId: ID) {\n activeSessions(vibeId: $vibeId) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const CHECK_SESSION_HEALTH = `\n mutation CheckSessionHealth {\n checkSessionHealth { checked updated errors }\n }\n`;\n\nexport const BULK_RESTART_SESSIONS = `\n mutation BulkRestartSessions($ids: [ID!]!) {\n bulkRestartSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const BULK_STOP_SESSIONS = `\n mutation BulkStopSessions($ids: [ID!]!) {\n bulkStopSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const BULK_TERMINATE_SESSIONS = `\n mutation BulkTerminateSessions($ids: [ID!]!) {\n bulkTerminateSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const UPDATE_SESSION = `\n mutation UpdateSession($id: ID!, $input: UpdateSessionInput!) {\n updateSession(id: $id, input: $input) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const UPDATE_SESSION_STATUS = `\n mutation UpdateSessionStatus($id: ID!, $status: VibecontrolsSessionStatus!) {\n updateSessionStatus(id: $id, status: $status) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const DELETE_SESSION = `\n mutation DeleteSession($id: ID!) { deleteSession(id: $id) }\n`;\n\nexport const KILL_SESSION = `\n mutation KillSession($id: ID!) { killSession(id: $id) }\n`;\n\n// ---------------------------------------------------------------------------\n// Session Sharing Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const SHARE_SESSION = `\n mutation ShareSession($input: ShareSessionInput!) {\n shareSession(input: $input) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const CREATE_SESSION_SHARE_LINK = `\n mutation CreateSessionShareLink($input: CreateSessionShareLinkInput!) {\n createSessionShareLink(input: $input) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const REVOKE_SESSION_SHARE = `\n mutation RevokeSessionShare($id: ID!) {\n revokeSessionShare(id: $id) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const REVOKE_SESSION_SHARE_LINK = `\n mutation RevokeSessionShareLink($id: ID!) {\n revokeSessionShareLink(id: $id) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const SESSION_SHARES = `\n query SessionShares($sessionId: ID!) {\n sessionShares(sessionId: $sessionId) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const SESSION_SHARE_LINKS = `\n query SessionShareLinks($sessionId: ID!) {\n sessionShareLinks(sessionId: $sessionId) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const SESSION_COLLABORATORS = `\n query SessionCollaborators($sessionId: ID!) {\n sessionCollaborators(sessionId: $sessionId) { userId hasControl joinedAt }\n }\n`;\n\nexport const SESSIONS_SHARED_WITH_ME = `\n query SessionsSharedWithMe($filter: SharedWithMeFilterInput, $pagination: PaginationInput) {\n sessionsSharedWithMe(filter: $filter, pagination: $pagination) {\n totalCount\n edges {\n cursor\n node { ${SESSION_SHARE_FIELDS} }\n }\n }\n }\n`;\n\nexport const UPDATE_SESSION_SHARE = `\n mutation UpdateSessionShare($id: ID!, $input: UpdateSessionShareInput!) {\n updateSessionShare(id: $id, input: $input) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const JOIN_SHARED_SESSION = `\n mutation JoinSharedSession($input: JoinSessionInput!) {\n joinSharedSession(input: $input) { id userId hasControl joinedAt role }\n }\n`;\n\nexport const LEAVE_SHARED_SESSION = `\n mutation LeaveSharedSession($sessionId: ID!) { leaveSharedSession(sessionId: $sessionId) }\n`;\n\nexport const REQUEST_SESSION_CONTROL = `\n mutation RequestSessionControl($sessionId: ID!) { requestSessionControl(sessionId: $sessionId) }\n`;\n\nexport const RELEASE_SESSION_CONTROL = `\n mutation ReleaseSessionControl($sessionId: ID!) { releaseSessionControl(sessionId: $sessionId) }\n`;\n\nexport const TRANSFER_SESSION_CONTROL = `\n mutation TransferSessionControl($sessionId: ID!, $toUserId: ID!) {\n transferSessionControl(sessionId: $sessionId, toUserId: $toUserId)\n }\n`;\n\nexport const STOP_SESSION_TERMINAL = `\n mutation StopSessionTerminal($id: ID!) {\n stopSessionTerminal(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const RESTART_SESSION_TERMINAL = `\n mutation RestartSessionTerminal($id: ID!) {\n restartSessionTerminal(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const START_TARGET_TERMINAL = `\n mutation StartTerminal($targetId: ID!, $shell: String) {\n startTerminal(targetId: $targetId, shell: $shell) {\n connectionId sessionId status host localPort remotePort ttydUrl\n }\n }\n`;\n\nexport const STOP_TARGET_TERMINAL = `\n mutation StopTerminal($sessionId: ID!) { stopTerminal(sessionId: $sessionId) }\n`;\n\nexport const EXPORT_SESSIONS = `\n mutation ExportSessions($input: SessionExportInput!) {\n exportSessions(input: $input) { count data format generatedAt }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// AI Prompts\n// ---------------------------------------------------------------------------\n\nexport const AI_PROMPT_FIELDS = `\n id name description content category status isShared\n tags variables metadata createdBy onBehalfOf updatedBy\n workspaceId usageCount lastUsedAt\n createdAt updatedAt deletedAt\n`;\n\nexport const LIST_AI_PROMPTS = `\n query AiPrompts($filter: AIPromptFilterInput, $pagination: PaginationInput) {\n aiPrompts(filter: $filter, pagination: $pagination) {\n items { ${AI_PROMPT_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_AI_PROMPT = `\n query AiPrompt($id: ID!) { aiPrompt(id: $id) { ${AI_PROMPT_FIELDS} } }\n`;\n\nexport const CREATE_AI_PROMPT = `\n mutation CreateAIPrompt($input: CreateAIPromptInput!) {\n createAIPrompt(input: $input) { ${AI_PROMPT_FIELDS} }\n }\n`;\n\nexport const UPDATE_AI_PROMPT = `\n mutation UpdateAIPrompt($id: ID!, $input: UpdateAIPromptInput!) {\n updateAIPrompt(id: $id, input: $input) { ${AI_PROMPT_FIELDS} }\n }\n`;\n\nexport const DELETE_AI_PROMPT = `\n mutation DeleteAIPrompt($id: ID!) { deleteAIPrompt(id: $id) }\n`;\n\nexport const DUPLICATE_AI_PROMPT = `\n mutation DuplicateAIPrompt($id: ID!, $name: String!) {\n duplicateAIPrompt(id: $id, name: $name) { ${AI_PROMPT_FIELDS} }\n }\n`;\n\nexport const RENDER_AI_PROMPT = `\n mutation RenderAIPrompt($id: ID!, $variables: JSON) {\n renderAIPrompt(id: $id, variables: $variables) { promptId rendered }\n }\n`;\n\nexport const RECORD_AI_PROMPT_USAGE = `\n mutation RecordAIPromptUsage($id: ID!) {\n recordAIPromptUsage(id: $id) { ${AI_PROMPT_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// VibeDeck share-links\n// ---------------------------------------------------------------------------\n\nexport const VIBE_DECK_SHARE_LINK_FIELDS = `\n id vibeDeckId token shareUrl name permission status visibility\n hasPassword allowIframe maxUses useCount expiresAt lastUsedAt\n createdBy createdAt\n`;\n\nexport const LIST_VIBE_DECK_SHARE_LINKS = `\n query VibeDeckShareLinks($vibeDeckId: ID!) {\n vibeDeckShareLinks(vibeDeckId: $vibeDeckId) { ${VIBE_DECK_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBE_DECK_SHARE_LINK = `\n mutation CreateVibeDeckShareLink($input: CreateVibeDeckShareLinkInput!) {\n createVibeDeckShareLink(input: $input) { ${VIBE_DECK_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE_DECK_SHARE_LINK = `\n mutation UpdateVibeDeckShareLink($id: ID!, $input: UpdateVibeDeckShareLinkInput!) {\n updateVibeDeckShareLink(id: $id, input: $input) { ${VIBE_DECK_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const REVOKE_VIBE_DECK_SHARE_LINK = `\n mutation RevokeVibeDeckShareLink($id: ID!) {\n revokeVibeDeckShareLink(id: $id) { ${VIBE_DECK_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const VALIDATE_VIBE_DECK_SHARE_LINK = `\n query ValidateVibeDeckShareLink($token: String!) {\n validateVibeDeckShareLink(token: $token) {\n isValid error requiresPassword permission allowIframe\n expiresAt vibeDeckId vibeDeckName ownerName\n }\n }\n`;\n\nexport const SHARED_VIBE_DECK = `\n query SharedVibeDeck($token: String!, $password: String) {\n sharedVibeDeck(token: $token, password: $password) {\n id name description icon buttonSize colorTheme gridColumns gridRows\n permission\n buttons { id label actionType row column rowSpan colSpan icon color category confirmationRequired }\n }\n }\n`;\n\nexport const EXECUTE_SHARED_VIBE_DECK_BUTTON = `\n mutation ExecuteSharedVibeDeckButton($token: String!, $buttonId: ID!, $password: String) {\n executeSharedVibeDeckButton(token: $token, buttonId: $buttonId, password: $password) {\n success output error\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Note Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_NOTES = `\n query Notes($filter: VibecontrolsNoteFilterInput, $pagination: PaginationInput) {\n notes(filter: $filter, pagination: $pagination) {\n items { ${NOTE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_NOTE = `\n query Note($id: ID!) {\n note(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const CREATE_NOTE = `\n mutation CreateNote($input: CreateVibecontrolsNoteInput!) {\n createNote(input: $input) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const UPDATE_NOTE = `\n mutation UpdateNote($id: ID!, $input: UpdateVibecontrolsNoteInput!) {\n updateNote(id: $id, input: $input) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const DELETE_NOTE = `\n mutation DeleteNote($id: ID!) { deleteNote(id: $id) }\n`;\n\nexport const SEARCH_NOTES = `\n query SearchNotes($query: String!, $vibeId: ID, $limit: Int) {\n searchNotes(query: $query, vibeId: $vibeId, limit: $limit) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const PIN_NOTE = `\n mutation PinNote($id: ID!) {\n pinNote(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const UNPIN_NOTE = `\n mutation UnpinNote($id: ID!) {\n unpinNote(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const PINNED_NOTES = `\n query PinnedNotes($vibeId: ID) {\n pinnedNotes(vibeId: $vibeId) { ${NOTE_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_CONFIGURATIONS = `\n query Configurations($filter: ConfigurationFilterInput!, $pagination: PaginationInput) {\n configurations(filter: $filter, pagination: $pagination) {\n items { ${CONFIG_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_CONFIGURATION = `\n query Configuration($key: String!, $scope: ConfigScope!, $scopeId: String) {\n configuration(key: $key, scope: $scope, scopeId: $scopeId) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const CONFIGURATIONS_BY_SCOPE = `\n query ConfigurationsByScope($scope: ConfigScope!, $scopeId: String) {\n configurationsByScope(scope: $scope, scopeId: $scopeId) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const SET_CONFIGURATION = `\n mutation SetConfiguration($key: String!, $scope: ConfigScope!, $scopeId: ID, $value: JSON!, $isSecret: Boolean) {\n setConfiguration(key: $key, scope: $scope, scopeId: $scopeId, value: $value, isSecret: $isSecret) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const DELETE_CONFIGURATION = `\n mutation DeleteConfiguration($key: String!, $scope: ConfigScope!, $scopeId: String) {\n deleteConfiguration(key: $key, scope: $scope, scopeId: $scopeId)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Webhook Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_WEBHOOKS = `\n query Webhooks($filter: WebhookFilterInput, $pagination: PaginationInput) {\n webhooks(filter: $filter, pagination: $pagination) {\n items { ${WEBHOOK_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_WEBHOOK = `\n query Webhook($id: ID!) {\n webhook(id: $id) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const CREATE_WEBHOOK = `\n mutation CreateWebhook($input: CreateWebhookInput!) {\n createWebhook(input: $input) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const UPDATE_WEBHOOK = `\n mutation UpdateWebhook($id: ID!, $input: UpdateWebhookInput!) {\n updateWebhook(id: $id, input: $input) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const DELETE_WEBHOOK = `\n mutation DeleteWebhook($id: ID!) { deleteWebhook(id: $id) }\n`;\n\nexport const TEST_WEBHOOK = `\n mutation TestWebhook($id: ID!) { testWebhook(id: $id) }\n`;\n\nexport const TRIGGER_WEBHOOK = `\n mutation TriggerWebhook($id: ID!, $payload: JSON) {\n triggerWebhook(id: $id, payload: $payload)\n }\n`;\n\nexport const RESET_WEBHOOK_FAILURES = `\n mutation ResetWebhookFailures($id: ID!) {\n resetWebhookFailures(id: $id) { ${WEBHOOK_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Tunnel Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_TUNNELS = `\n query Tunnels($filter: TunnelFilterInput, $pagination: PaginationInput) {\n tunnels(filter: $filter, pagination: $pagination) {\n items { ${TUNNEL_FIELDS} }\n total\n hasMore\n }\n }\n`;\n\nexport const GET_TUNNEL = `\n query Tunnel($id: ID!) { tunnel(id: $id) { ${TUNNEL_FIELDS} } }\n`;\n\nexport const GET_TUNNEL_BY_SLUG = `\n query TunnelBySlug($slug: String!) {\n tunnelBySlug(slug: $slug) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const CREATE_TUNNEL = `\n mutation CreateTunnel($input: CreateTunnelInput!) {\n createTunnel(input: $input) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const UPDATE_TUNNEL = `\n mutation UpdateTunnel($id: ID!, $input: UpdateTunnelInput!) {\n updateTunnel(id: $id, input: $input) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const START_TUNNEL = `\n mutation StartTunnel($id: ID!) { startTunnel(id: $id) { ${TUNNEL_FIELDS} } }\n`;\n\nexport const STOP_TUNNEL = `\n mutation StopTunnel($id: ID!) { stopTunnel(id: $id) { ${TUNNEL_FIELDS} } }\n`;\n\nexport const DELETE_TUNNEL = `\n mutation DeleteTunnel($id: ID!) { deleteTunnel(id: $id) }\n`;\n\nexport const ROTATE_TUNNEL_CREDENTIALS = `\n mutation RotateTunnelCredentials($id: ID!) {\n rotateTunnelCredentials(id: $id) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const ISSUE_TUNNEL_SESSION = `\n mutation IssueTunnelSession($tunnelId: ID!, $ttlSeconds: Int) {\n issueTunnelSession(tunnelId: $tunnelId, ttlSeconds: $ttlSeconds) {\n session { ${TUNNEL_SESSION_FIELDS_MCP} }\n token\n agentConfigHint\n }\n }\n`;\n\nexport const REVOKE_TUNNEL_SESSION = `\n mutation RevokeTunnelSession($sessionId: ID!, $reason: String) {\n revokeTunnelSession(sessionId: $sessionId, reason: $reason)\n }\n`;\n\nexport const LIST_TUNNEL_SESSIONS = `\n query TunnelSessions($tunnelId: ID!, $pagination: PaginationInput) {\n tunnelSessions(tunnelId: $tunnelId, pagination: $pagination) {\n items { ${TUNNEL_SESSION_FIELDS_MCP} }\n total\n hasMore\n }\n }\n`;\n\nexport const LIST_TUNNEL_PROVIDERS = `\n query TunnelProviders { tunnelProviders { ${TUNNEL_PROVIDER_FIELDS_MCP} } }\n`;\n\nexport const GET_TUNNEL_PROVIDER = `\n query TunnelProvider($key: TunnelProviderKey!) {\n tunnelProvider(key: $key) { ${TUNNEL_PROVIDER_FIELDS_MCP} }\n }\n`;\n\nexport const LIST_TUNNEL_SHARDS = `\n query TunnelShards($environment: TunnelEnvironment) {\n tunnelShards(environment: $environment) { ${TUNNEL_SHARD_FIELDS_MCP} }\n }\n`;\n\nexport const TUNNEL_USAGE = `\n query TunnelUsage($tunnelId: ID!, $from: DateTime!, $to: DateTime!) {\n tunnelUsage(tunnelId: $tunnelId, from: $from, to: $to) {\n tunnelId hourBucket bytesIn bytesOut connections requests\n }\n }\n`;\n\nexport const TUNNEL_AUDIT = `\n query TunnelAudit($tunnelId: ID!, $pagination: PaginationInput) {\n tunnelAudit(tunnelId: $tunnelId, pagination: $pagination) {\n items {\n id action resourceType resourceId actorId actorType\n status description ipAddress userAgent requestId\n workspaceId createdAt\n }\n total\n hasMore\n }\n }\n`;\n\nexport const LIST_TUNNEL_DOMAINS = `\n query TunnelDomains($tunnelId: ID, $filter: TunnelDomainFilterInput, $pagination: PaginationInput) {\n tunnelDomains(tunnelId: $tunnelId, filter: $filter, pagination: $pagination) {\n items { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n total\n hasMore\n }\n }\n`;\n\nexport const GET_TUNNEL_DOMAIN = `\n query TunnelDomain($id: ID!) {\n tunnelDomain(id: $id) { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n }\n`;\n\nexport const RESERVE_TUNNEL_SUBDOMAIN = `\n mutation ReserveTunnelSubdomain($input: ReserveTunnelSubdomainInput!) {\n reserveTunnelSubdomain(input: $input) { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n }\n`;\n\nexport const REGISTER_CUSTOM_TUNNEL_DOMAIN = `\n mutation RegisterCustomTunnelDomain($input: RegisterCustomDomainInput!) {\n registerCustomTunnelDomain(input: $input) { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n }\n`;\n\nexport const VERIFY_TUNNEL_DOMAIN = `\n mutation VerifyTunnelDomain($domainId: ID!) {\n verifyTunnelDomain(domainId: $domainId) { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n }\n`;\n\nexport const ATTACH_TUNNEL_DOMAIN = `\n mutation AttachTunnelDomain($tunnelId: ID!, $domainId: ID!, $makePrimary: Boolean) {\n attachTunnelDomain(tunnelId: $tunnelId, domainId: $domainId, makePrimary: $makePrimary) {\n ${TUNNEL_FIELDS}\n }\n }\n`;\n\nexport const DETACH_TUNNEL_DOMAIN = `\n mutation DetachTunnelDomain($tunnelId: ID!, $domainId: ID!) {\n detachTunnelDomain(tunnelId: $tunnelId, domainId: $domainId) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const DELETE_TUNNEL_DOMAIN = `\n mutation DeleteTunnelDomain($domainId: ID!) {\n deleteTunnelDomain(domainId: $domainId)\n }\n`;\n\nexport const PROBE_AGENT_TUNNEL = `\n query ProbeAgentTunnel($url: String!, $agentApiKey: String) {\n probeAgentTunnel(url: $url, agentApiKey: $agentApiKey) {\n agentId reachable latencyMs error version tunnelUrl\n }\n }\n`;\n\nexport const ADD_AGENT_FROM_TUNNEL = `\n mutation AddVibecontrolsAgentFromTunnel($input: AddAgentFromTunnelInput!) {\n addVibecontrolsAgentFromTunnel(input: $input) {\n success clientId clientSecret devportalApplicationId error\n agent { id name workspaceId isActive }\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// UI Session Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const GET_UI_SESSION = `\n query { uiSession { ${UI_SESSION_FIELDS} } }\n`;\n\nexport const SAVE_UI_SESSION = `\n mutation SaveUISession($input: SaveUISessionInput!) {\n saveUISession(input: $input) { ${UI_SESSION_FIELDS} }\n }\n`;\n\nexport const CLEAR_UI_SESSION = `\n mutation { clearUISession }\n`;\n\n// ---------------------------------------------------------------------------\n// AI Tool Event Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AI_TOOL_EVENTS = `\n query AiToolEvents($filter: AiToolEventFilterInput, $pagination: PaginationInput) {\n aiToolEvents(filter: $filter, pagination: $pagination) {\n items { ${AI_TOOL_EVENT_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const RECENT_AI_TOOL_EVENTS = `\n query RecentAiToolEvents($agentId: ID!, $limit: Int) {\n recentAiToolEvents(agentId: $agentId, limit: $limit) { ${AI_TOOL_EVENT_FIELDS} }\n }\n`;\n\nexport const CREATE_AI_TOOL_EVENT = `\n mutation CreateAiToolEvent($input: CreateAiToolEventInput!) {\n createAiToolEvent(input: $input) { ${AI_TOOL_EVENT_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Target Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_TARGETS = `\n query Targets($workspaceId: ID!, $filter: TargetFilterInput, $limit: Int, $offset: Int) {\n targets(workspaceId: $workspaceId, filter: $filter, limit: $limit, offset: $offset) {\n items { ${TARGET_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_TARGET = `\n query Target($id: ID!) {\n target(id: $id) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const CREATE_TARGET = `\n mutation CreateTarget($workspaceId: ID!, $input: CreateTargetInput!) {\n createTarget(workspaceId: $workspaceId, input: $input) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const UPDATE_TARGET = `\n mutation UpdateTarget($id: ID!, $input: UpdateTargetInput!) {\n updateTarget(id: $id, input: $input) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const DELETE_TARGET = `\n mutation DeleteTarget($id: ID!) { deleteTarget(id: $id) }\n`;\n\nexport const TEST_TARGET = `\n query TestTarget($id: ID!) {\n testTarget(id: $id) { success error latencyMs }\n }\n`;\n\nexport const IMPORT_TARGETS_FROM_CONFIG = `\n mutation ImportTargetsFromConfig($agentId: ID!, $hosts: [ConfigHostInput!]!, $workspaceId: ID!) {\n importTargetsFromConfig(agentId: $agentId, hosts: $hosts, workspaceId: $workspaceId) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const SCAN_SSH_CONFIG = `\n mutation ScanSSHConfig($agentId: ID!, $configPath: String) {\n scanSSHConfig(agentId: $agentId, configPath: $configPath) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const INSTALL_AGENT_ON_TARGET = `\n mutation InstallAgentOnTarget($sourceAgentId: ID!, $targetId: ID!, $agentPort: Int) {\n installAgentOnTarget(sourceAgentId: $sourceAgentId, targetId: $targetId, agentPort: $agentPort) { success error }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// VibeDeck Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_VIBEDECKS = `\n query VibeDecks($filter: VibeDeckFilterInput, $pagination: PaginationInput) {\n vibeDecks(filter: $filter, pagination: $pagination) {\n items { ${VIBEDECK_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBEDECK = `\n query VibeDeck($id: ID!) {\n vibeDeck(id: $id) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const DEFAULT_VIBEDECK = `\n query { defaultVibeDeck { ${VIBEDECK_FIELDS} } }\n`;\n\nexport const CREATE_VIBEDECK = `\n mutation CreateVibeDeck($input: CreateVibeDeckInput!) {\n createVibeDeck(input: $input) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBEDECK = `\n mutation UpdateVibeDeck($id: ID!, $input: UpdateVibeDeckInput!) {\n updateVibeDeck(id: $id, input: $input) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBEDECK = `\n mutation DeleteVibeDeck($id: ID!) { deleteVibeDeck(id: $id) }\n`;\n\nexport const DUPLICATE_VIBEDECK = `\n mutation DuplicateVibeDeck($id: ID!, $name: String) {\n duplicateVibeDeck(id: $id, name: $name) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const SET_DEFAULT_VIBEDECK = `\n mutation SetDefaultVibeDeck($id: ID!) {\n setDefaultVibeDeck(id: $id) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const LIST_VIBEDECK_BUTTONS = `\n query VibeDeckButtons($filter: VibeDeckButtonFilterInput, $pagination: PaginationInput) {\n vibeDeckButtons(filter: $filter, pagination: $pagination) {\n items { ${VIBEDECK_BUTTON_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBEDECK_BUTTON = `\n query VibeDeckButton($id: ID!) {\n vibeDeckButton(id: $id) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBEDECK_BUTTON = `\n mutation CreateVibeDeckButton($input: CreateVibeDeckButtonInput!) {\n createVibeDeckButton(input: $input) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBEDECK_BUTTON = `\n mutation UpdateVibeDeckButton($id: ID!, $input: UpdateVibeDeckButtonInput!) {\n updateVibeDeckButton(id: $id, input: $input) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBEDECK_BUTTON = `\n mutation DeleteVibeDeckButton($id: ID!) { deleteVibeDeckButton(id: $id) }\n`;\n\nexport const EXECUTE_VIBEDECK_BUTTON = `\n mutation ExecuteVibeDeckButton($id: ID!, $agentId: ID!) {\n executeVibeDeckButton(id: $id, agentId: $agentId) { success output error }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Action Field Fragments\n// ---------------------------------------------------------------------------\n\nexport const ACTION_FIELDS = `\n id name description actionType sourceType triggerType\n command script webhookUrl workflowDefinition\n tags storeItemId storeVersion metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const ACTION_EXECUTION_FIELDS = `\n id actionId status input output error\n startedAt completedAt durationMs triggeredBy metadata\n workspaceId createdAt updatedAt\n`;\n\n// ---------------------------------------------------------------------------\n// Action Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_ACTIONS = `\n query Actions($filter: ActionFilterInput, $pagination: PaginationInput) {\n actions(filter: $filter, pagination: $pagination) {\n items { ${ACTION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_ACTION = `\n query Action($id: ID!) {\n action(id: $id) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const CREATE_ACTION = `\n mutation CreateAction($input: CreateActionInput!) {\n createAction(input: $input) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const UPDATE_ACTION = `\n mutation UpdateAction($id: ID!, $input: UpdateActionInput!) {\n updateAction(id: $id, input: $input) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const DELETE_ACTION = `\n mutation DeleteAction($id: ID!) { deleteAction(id: $id) }\n`;\n\nexport const DUPLICATE_ACTION = `\n mutation DuplicateAction($id: ID!, $name: String) {\n duplicateAction(id: $id, name: $name) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const EXECUTE_ACTION = `\n mutation ExecuteAction($id: ID!, $input: ExecuteActionInput) {\n executeAction(id: $id, input: $input) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\nexport const INSTALL_ACTION_FROM_STORE = `\n mutation InstallActionFromStore($storeItemId: String!, $version: String, $name: String) {\n installActionFromStore(storeItemId: $storeItemId, version: $version, name: $name) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const CANCEL_ACTION_EXECUTION = `\n mutation CancelActionExecution($id: ID!) {\n cancelActionExecution(id: $id) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\nexport const LIST_ACTION_EXECUTIONS = `\n query ActionExecutions($filter: ActionExecutionFilterInput, $pagination: PaginationInput) {\n actionExecutions(filter: $filter, pagination: $pagination) {\n items { ${ACTION_EXECUTION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_ACTION_EXECUTION = `\n query ActionExecution($id: ID!) {\n actionExecution(id: $id) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Scheduled Job Field Fragments\n// ---------------------------------------------------------------------------\n\nexport const SCHEDULED_JOB_FIELDS = `\n id name scheduleType status actionId\n cronExpression timezone scheduledAt\n interval intervalUnit startDate endDate\n nextExecutionAt lastExecutionAt\n priority tags\n`;\n\n// ---------------------------------------------------------------------------\n// Scheduled Job Queries / Mutations (wspace-scheduler-svc via gateway)\n// ---------------------------------------------------------------------------\n\nexport const CREATE_SCHEDULED_JOB = `\n mutation CreateScheduledJob($workspaceId: ID!, $input: CreateScheduledJobInput!) {\n createScheduledJob(workspaceId: $workspaceId, input: $input) { ${SCHEDULED_JOB_FIELDS} }\n }\n`;\n\nexport const DELETE_SCHEDULED_JOB = `\n mutation DeleteScheduledJob($id: ID!) { deleteScheduledJob(id: $id) }\n`;\n\nexport const LIST_SCHEDULED_JOBS = `\n query ScheduledJobs($workspaceId: ID!, $filter: JobFilterInput, $pagination: SchedulerPaginationInput) {\n scheduledJobs(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n jobs { ${SCHEDULED_JOB_FIELDS} }\n total hasMore\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Docs Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_DOCS_SITES = `\n query DocsSites($filter: VibecontrolsDocsSiteFilterInput, $pagination: PaginationInput) {\n docsSites(filter: $filter, pagination: $pagination) {\n items { ${DOCS_SITE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_DOCS_SITE = `\n query DocsSite($vibeId: ID!) {\n docsSite(vibeId: $vibeId) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const CREATE_DOCS_SITE = `\n mutation CreateDocsSite($input: CreateVibecontrolsDocsSiteInput!) {\n createDocsSite(input: $input) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const UPDATE_DOCS_SITE = `\n mutation UpdateDocsSite($id: ID!, $input: UpdateVibecontrolsDocsSiteInput!) {\n updateDocsSite(id: $id, input: $input) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const DELETE_DOCS_SITE = `\n mutation DeleteDocsSite($id: ID!) { deleteDocsSite(id: $id) }\n`;\n\nexport const LIST_DOCS_PAGES = `\n query DocsPages($siteId: ID!, $filter: VibecontrolsDocsPageFilterInput) {\n docsPages(siteId: $siteId, filter: $filter) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const GET_DOCS_PAGE = `\n query DocsPage($id: ID!) {\n docsPage(id: $id) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const CREATE_DOCS_PAGE = `\n mutation CreateDocsPage($input: CreateVibecontrolsDocsPageInput!) {\n createDocsPage(input: $input) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const UPDATE_DOCS_PAGE = `\n mutation UpdateDocsPage($id: ID!, $input: UpdateVibecontrolsDocsPageInput!) {\n updateDocsPage(id: $id, input: $input) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const DELETE_DOCS_PAGE = `\n mutation DeleteDocsPage($id: ID!) { deleteDocsPage(id: $id) }\n`;\n\nexport const LIST_DOCS_REVISIONS = `\n query DocsRevisions($siteId: ID!, $pagination: PaginationInput) {\n docsRevisions(siteId: $siteId, pagination: $pagination) {\n items { ${DOCS_REVISION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const COMPILE_DOCS_SITE = `\n mutation CompileDocsSite($siteId: ID!, $publish: Boolean) {\n compileDocsSite(siteId: $siteId, publish: $publish) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\nexport const PUBLISH_DOCS_REVISION = `\n mutation PublishDocsRevision($revisionId: ID!) {\n publishDocsRevision(revisionId: $revisionId) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\nexport const ROLLBACK_DOCS_REVISION = `\n mutation RollbackDocsRevision($siteId: ID!, $revisionId: ID!) {\n rollbackDocsRevision(siteId: $siteId, revisionId: $revisionId) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Audit Log Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AUDIT_LOGS = `\n query VibeAuditLogs($filter: VibeAuditLogFilterInput, $pagination: PaginationInput) {\n vibeAuditLogs(filter: $filter, pagination: $pagination) {\n items { ${AUDIT_LOG_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_AUDIT_LOG = `\n query VibeAuditLog($id: ID!) {\n vibeAuditLog(id: $id) { ${AUDIT_LOG_FIELDS} }\n }\n`;\n\nexport const AUDIT_LOG_STATS = `\n query VibeAuditLogStats($filter: VibeAuditLogFilterInput) {\n vibeAuditLogStats(filter: $filter) {\n totalLogs\n logsByAction { action count }\n logsByResourceType { resourceType count }\n logsByStatus { status count }\n }\n }\n`;\n\nexport const EXPORT_AUDIT_LOGS = `\n mutation ExportVibeAuditLogs($filter: VibeAuditLogFilterInput, $format: String) {\n exportVibeAuditLogs(filter: $filter, format: $format)\n }\n`;\n\nexport const DELETE_AUDIT_LOG = `\n mutation DeleteVibeAuditLog($id: ID!, $reason: String) {\n deleteVibeAuditLog(id: $id, reason: $reason)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Auth Operations (Global Gateway)\n// ---------------------------------------------------------------------------\n\nexport const MY_WORKSPACES = `\n query MyWorkspaces($limit: Int) {\n myWorkspaces(limit: $limit) {\n items { id name slug tenantId organizationId }\n }\n }\n`;\n\nexport const ISSUE_WORKSPACE_TOKEN = `\n mutation IssueWorkspaceToken($input: IssueWorkspaceTokenInput!) {\n issueWorkspaceToken(input: $input) {\n success token expiresAt scopes\n error { code message }\n }\n }\n`;\n\nexport const REFRESH_TOKEN = `\n mutation RefreshToken($token: String!) {\n refreshToken(token: $token) { accessToken refreshToken expiresIn }\n }\n`;\n\nexport const SIGN_OUT = `mutation { signOut }`;\n\n// ---------------------------------------------------------------------------\n// Analytics\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Sandbox Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const SANDBOX_FIELDS = `\n id name description template mode status\n crdName podName namespace runtimeClass\n containers { name image ports { containerPort name protocol } env { name value } command args resources { requestsCpu requestsMemory limitsCpu limitsMemory } }\n containerStatuses { name ready port restartCount }\n resources { cpuRequest cpuLimit memoryRequest memoryLimit }\n storage { mode sizeGi mountPath retainOnDelete }\n network { exposeService internalUrl containerUrls serviceName }\n ttlSeconds expiresAt metadata errorMessage\n workspaceId createdBy createdAt updatedAt stoppedAt\n`;\n\nexport const LIST_SANDBOXES = `\n query ListSandboxes($filter: SandboxFilterInput, $pagination: SandboxPaginationInput, $context: ContextInput!) {\n listSandboxes(filter: $filter, pagination: $pagination, context: $context) {\n items { ${SANDBOX_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_SANDBOX = `\n query GetSandbox($id: ID!, $context: ContextInput!) {\n getSandbox(id: $id, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const CREATE_SANDBOX = `\n mutation CreateSandbox($input: CreateSandboxInput!) {\n createSandbox(input: $input) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const DELETE_SANDBOX = `\n mutation DeleteSandbox($id: ID!, $context: ContextInput!) {\n deleteSandbox(id: $id, context: $context)\n }\n`;\n\nexport const STOP_SANDBOX = `\n mutation StopSandbox($id: ID!, $context: ContextInput!) {\n stopSandbox(id: $id, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const EXTEND_SANDBOX_TTL = `\n mutation ExtendSandboxTTL($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {\n extendSandboxTTL(id: $id, additionalSeconds: $additionalSeconds, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const SANDBOX_TEMPLATE_FIELDS = `\n id name description template isDefault ttlSeconds\n containers { name image }\n resources { cpuRequest cpuLimit memoryRequest memoryLimit }\n storage { mode sizeGi mountPath retainOnDelete }\n config metadata allowedImages\n workspaceId createdBy createdAt updatedAt\n`;\n\nexport const LIST_SANDBOX_TEMPLATES = `\n query ListSandboxTemplates($context: ContextInput!, $template: SandboxTemplate, $pagination: SandboxPaginationInput) {\n listSandboxTemplates(context: $context, template: $template, pagination: $pagination) {\n items { ${SANDBOX_TEMPLATE_FIELDS} } total hasMore\n }\n }\n`;\n\nexport const GET_SANDBOX_TEMPLATE = `\n query GetSandboxTemplate($context: ContextInput!, $id: ID!) {\n getSandboxTemplate(context: $context, id: $id) { ${SANDBOX_TEMPLATE_FIELDS} }\n }\n`;\n\nexport const CREATE_SANDBOX_TEMPLATE = `\n mutation CreateSandboxTemplate($input: CreateSandboxTemplateInput!) {\n createSandboxTemplate(input: $input) { ${SANDBOX_TEMPLATE_FIELDS} }\n }\n`;\n\nexport const UPDATE_SANDBOX_TEMPLATE = `\n mutation UpdateSandboxTemplate($input: UpdateSandboxTemplateInput!) {\n updateSandboxTemplate(input: $input) { ${SANDBOX_TEMPLATE_FIELDS} }\n }\n`;\n\nexport const DELETE_SANDBOX_TEMPLATE = `\n mutation DeleteSandboxTemplate($context: ContextInput!, $id: ID!) {\n deleteSandboxTemplate(context: $context, id: $id)\n }\n`;\n\nexport const AVAILABLE_SANDBOX_TAGS = `\n query AvailableSandboxTags($query: String, $limit: Int) {\n availableSandboxTags(query: $query, limit: $limit) { id key label color }\n }\n`;\n\nexport const GET_SANDBOX_TAGS = `\n query GetSandboxTags($input: GetSandboxTagsInput!) {\n getSandboxTags(input: $input) {\n id entityId entityType tagId source assignedAt assignedBy\n }\n }\n`;\n\nexport const CREATE_SANDBOX_TAG = `\n mutation CreateSandboxTag($input: CreateSandboxTagInput!) {\n createSandboxTag(input: $input) { id key label color }\n }\n`;\n\nexport const TAG_SANDBOX = `\n mutation TagSandbox($input: TagSandboxInput!) {\n tagSandbox(input: $input) {\n id entityId tagId source assignedAt\n }\n }\n`;\n\nexport const UNTAG_SANDBOX = `\n mutation UntagSandbox($input: UntagSandboxInput!) {\n untagSandbox(input: $input)\n }\n`;\n\nexport const REPLACE_SANDBOX_TAGS = `\n mutation ReplaceSandboxTags($input: ReplaceSandboxTagsInput!) {\n replaceSandboxTags(input: $input) {\n id entityId tagId source assignedAt\n }\n }\n`;\n\nexport const LIST_ALL_SANDBOXES = `\n query ListAllSandboxes($context: ContextInput!, $filter: SandboxFilterInput, $pagination: SandboxPaginationInput) {\n listAllSandboxes(context: $context, filter: $filter, pagination: $pagination) {\n items { ${SANDBOX_FIELDS} } total hasMore\n }\n }\n`;\n\nexport const LIST_SANDBOX_NODES = `\n query ListSandboxNodes($context: ContextInput!) {\n listSandboxNodes(context: $context) {\n name status allocatableCpu allocatableMemory sandboxPodCount labels\n }\n }\n`;\n\nexport const GET_ACTIVE_SANDBOXES = `\n query GetActiveSandboxes($context: ContextInput!) {\n getActiveSandboxes(context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const GET_RECENT_SANDBOX_ACTIVITY = `\n query GetRecentSandboxActivity($context: ContextInput!, $limit: Int) {\n getRecentSandboxActivity(context: $context, limit: $limit) {\n items { id action actorId status sandboxName sandboxId createdAt }\n total\n }\n }\n`;\n\nexport const GET_SANDBOX_STATS = `\n query GetSandboxStats($context: ContextInput!) {\n getSandboxStats(context: $context) {\n activeSandboxes activeUserSandboxes activeInternalSandboxes\n totalCreated totalDeleted totalUserCreated totalInternalCreated\n runningNow provisioningNow stoppedNow expiredCount failedCount\n totalCpuUsed totalMemoryUsed\n }\n }\n`;\n\nexport const GET_SANDBOX_LOGS = `\n query GetSandboxLogs($context: ContextInput!, $id: ID!, $containerName: String!, $tailLines: Int) {\n getSandboxLogs(context: $context, id: $id, containerName: $containerName, tailLines: $tailLines)\n }\n`;\n\nexport const GET_SANDBOX_CONFIG = `\n query GetSandboxConfig($context: ContextInput!) {\n getSandboxConfig(context: $context) {\n id defaultTtlSeconds maxTtlSeconds allowedTemplates\n maxConcurrentPerUser maxConcurrentPerWorkspace\n defaultCpuRequest defaultCpuLimit defaultMemoryRequest defaultMemoryLimit\n workspaceId updatedAt\n }\n }\n`;\n\nexport const UPDATE_SANDBOX_CONFIG = `\n mutation UpdateSandboxConfig($input: UpdateSandboxConfigInput!) {\n updateSandboxConfig(input: $input) {\n id defaultTtlSeconds maxTtlSeconds allowedTemplates\n maxConcurrentPerUser maxConcurrentPerWorkspace\n defaultCpuRequest defaultCpuLimit defaultMemoryRequest defaultMemoryLimit\n workspaceId updatedAt\n }\n }\n`;\n\nexport const SANDBOX_EXPORT_JOB_FIELDS = `\n id workspaceId format status requestedBy rowCount\n downloadUrl errorMessage expiresAt createdAt updatedAt\n`;\n\nexport const EXPORT_SANDBOXES = `\n mutation ExportSandboxes($input: ExportSandboxesInput!) {\n exportSandboxes(input: $input) { ${SANDBOX_EXPORT_JOB_FIELDS} }\n }\n`;\n\nexport const GET_SANDBOX_EXPORT_JOB = `\n query GetSandboxExportJob($workspaceId: ID!, $jobId: ID!, $context: ContextInput!) {\n getSandboxExportJob(workspaceId: $workspaceId, jobId: $jobId, context: $context) {\n ${SANDBOX_EXPORT_JOB_FIELDS}\n }\n }\n`;\n\nexport const LIST_SANDBOX_EXPORT_JOBS = `\n query ListSandboxExportJobs($workspaceId: ID!, $context: ContextInput!, $pagination: SandboxPaginationInput) {\n listSandboxExportJobs(workspaceId: $workspaceId, context: $context, pagination: $pagination) {\n ${SANDBOX_EXPORT_JOB_FIELDS}\n }\n }\n`;\n\nexport const GET_SANDBOX_ARTIFACT_BYTES = `\n query GetSandboxArtifactBytes($input: SandboxArtifactBytesInput!) {\n getSandboxArtifactBytes(input: $input) { filename mimeType size contentBase64 }\n }\n`;\n\nexport const PROXY_SANDBOX_REQUEST = `\n mutation ProxySandboxRequest($input: ProxySandboxRequestInput!) {\n proxySandboxRequest(input: $input) { status body }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Analytics\n// ---------------------------------------------------------------------------\n\nexport const VIBECONTROLS_ANALYTICS = `\n query VibecontrolsAnalytics($input: VibecontrolsAnalyticsInput!) {\n vibecontrolsAnalytics(input: $input) {\n agents { total active inactive staleHeartbeatCount byPlatform { key count } byArchitecture { key count } createdOverTime { timestamp value } }\n targets { total connectionCount byType { key count } byStatus { key count } }\n sessions { total active avgDurationMs totalCollaborators totalShares totalShareLinks byType { key count } byStatus { key count } createdOverTime { timestamp value } }\n vibes { total withAgent withoutAgent byType { key count } byStatus { key count } createdOverTime { timestamp value } }\n actions { total totalExecutions successRate avgDurationMs byActionType { key count } byTriggerType { key count } bySourceType { key count } executionsByStatus { key count } executionsOverTime { timestamp value } }\n webhooks { total active inactive totalDeliveries totalFailures deliverySuccessRate }\n aiEvents { total bySource { key count } byEventType { key count } eventsOverTime { timestamp value } }\n vibeDecks { totalDecks totalButtons buttonsByActionType { key count } }\n audit { total byAction { key count } byResourceType { key count } byStatus { key count } eventsOverTime { timestamp value } }\n docs { totalSites totalPages totalRevisions buildSuccessRate totalBuildImages pagesByStatus { key count } revisionsByStatus { key count } }\n notes { total pinned unpinned createdOverTime { timestamp value } }\n configurations { total secretCount byScope { key count } }\n executionTimeMs\n cached\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Catalogs / Components / Templates / Scorecards\n// ---------------------------------------------------------------------------\n\nexport const CATALOG_FIELDS = `\n id name description visibility\n ownerId ownerName componentCount vibeCount\n tags metadata workspaceId\n createdAt updatedAt deletedAt\n createdBy updatedBy onBehalfOf\n`;\n\nexport const COMPONENT_FIELDS = `\n id name description type lifecycle version\n language framework repositoryUrl documentationUrl\n dependencies sbomData tags metadata\n ownerId ownerName teamId teamName catalogCount\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const TEMPLATE_FIELDS = `\n id name description category status version\n setupInstructions sourceRepositoryUrl\n fileTree variables componentSnapshot\n cloneCount tags metadata\n createdAt updatedAt\n`;\n\nexport const SCORECARD_METRIC_FIELDS = `\n id name description type status value threshold unit\n iframeUrl iframeHeight lastUpdatedAt createdAt updatedAt\n`;\n\nexport const SCORECARD_FIELDS = `\n id ownerId ownerType overallScore lastEvaluatedAt\n metrics { ${SCORECARD_METRIC_FIELDS} }\n metadata workspaceId createdAt updatedAt\n`;\n\n// catalogs\nexport const LIST_CATALOGS = `\n query VibecontrolsCatalogs($filter: CatalogFilterInput, $pagination: PaginationInput) {\n vibecontrolsCatalogs(filter: $filter, pagination: $pagination) {\n items { ${CATALOG_FIELDS} }\n total hasMore\n }\n }\n`;\nexport const GET_CATALOG = `query VibecontrolsCatalog($id: ID!) { vibecontrolsCatalog(id: $id) { ${CATALOG_FIELDS} } }`;\nexport const GET_CATALOG_DEPENDENCY_GRAPH = `\n query VibecontrolsCatalogDependencyGraph($catalogId: ID!) {\n vibecontrolsCatalogDependencyGraph(catalogId: $catalogId) {\n nodes { id name type version }\n edges { source target version dependencyType }\n }\n }\n`;\nexport const GET_CATALOG_SBOM = `\n query VibecontrolsCatalogSBOM($catalogId: ID!) {\n vibecontrolsCatalogSBOM(catalogId: $catalogId) {\n format generatedAt totalCount\n components { name version type license }\n }\n }\n`;\nexport const CREATE_CATALOG = `mutation CreateVibecontrolsCatalog($input: CreateCatalogInput!) { createVibecontrolsCatalog(input: $input) { ${CATALOG_FIELDS} } }`;\nexport const UPDATE_CATALOG = `mutation UpdateVibecontrolsCatalog($id: ID!, $input: UpdateCatalogInput!) { updateVibecontrolsCatalog(id: $id, input: $input) { ${CATALOG_FIELDS} } }`;\nexport const DELETE_CATALOG = `mutation DeleteVibecontrolsCatalog($id: ID!) { deleteVibecontrolsCatalog(id: $id) }`;\nexport const ADD_COMPONENT_TO_CATALOG = `\n mutation AddComponentToVibecontrolsCatalog($catalogId: ID!, $componentId: ID!) {\n addComponentToVibecontrolsCatalog(catalogId: $catalogId, componentId: $componentId) {\n id catalogId componentId addedAt addedBy metadata workspaceId\n }\n }\n`;\nexport const REMOVE_COMPONENT_FROM_CATALOG = `\n mutation RemoveComponentFromVibecontrolsCatalog($catalogId: ID!, $componentId: ID!) {\n removeComponentFromVibecontrolsCatalog(catalogId: $catalogId, componentId: $componentId)\n }\n`;\nexport const ADD_VIBE_TO_CATALOG = `\n mutation AddVibeToVibecontrolsCatalog($catalogId: ID!, $vibeId: ID!) {\n addVibeToVibecontrolsCatalog(catalogId: $catalogId, vibeId: $vibeId) {\n id catalogId vibeId addedAt addedBy metadata workspaceId\n }\n }\n`;\nexport const REMOVE_VIBE_FROM_CATALOG = `\n mutation RemoveVibeFromVibecontrolsCatalog($catalogId: ID!, $vibeId: ID!) {\n removeVibeFromVibecontrolsCatalog(catalogId: $catalogId, vibeId: $vibeId)\n }\n`;\n\n// components\nexport const LIST_COMPONENTS = `\n query VibecontrolsComponents($filter: ComponentFilterInput, $pagination: PaginationInput) {\n vibecontrolsComponents(filter: $filter, pagination: $pagination) {\n items { ${COMPONENT_FIELDS} }\n total hasMore\n }\n }\n`;\nexport const GET_COMPONENT = `query VibecontrolsComponent($id: ID!) { vibecontrolsComponent(id: $id) { ${COMPONENT_FIELDS} } }`;\nexport const CREATE_COMPONENT = `mutation CreateVibecontrolsComponent($input: CreateComponentInput!) { createVibecontrolsComponent(input: $input) { ${COMPONENT_FIELDS} } }`;\nexport const UPDATE_COMPONENT = `mutation UpdateVibecontrolsComponent($id: ID!, $input: UpdateComponentInput!) { updateVibecontrolsComponent(id: $id, input: $input) { ${COMPONENT_FIELDS} } }`;\nexport const DELETE_COMPONENT = `mutation DeleteVibecontrolsComponent($id: ID!) { deleteVibecontrolsComponent(id: $id) }`;\nexport const FORK_GITHUB_REPO = `\n mutation ForkVibecontrolsGitHubRepo($input: VibecontrolsForkGitHubRepoInput!) {\n forkVibecontrolsGitHubRepo(input: $input) { isForked repoFullName repoUrl }\n }\n`;\nexport const PUBLISH_COMPONENT_AS_TEMPLATE = `\n mutation PublishVibecontrolsComponentAsTemplate(\n $componentId: ID!\n $input: VibecontrolsPublishTemplateInput!\n ) {\n publishVibecontrolsComponentAsTemplate(componentId: $componentId, input: $input) {\n ${TEMPLATE_FIELDS}\n }\n }\n`;\n\n// templates\nexport const LIST_TEMPLATES = `\n query VibecontrolsTemplates($filter: VibecontrolsTemplateFilterInput, $pagination: PaginationInput) {\n vibecontrolsTemplates(filter: $filter, pagination: $pagination) {\n items { ${TEMPLATE_FIELDS} }\n total hasMore\n }\n }\n`;\nexport const GET_TEMPLATE = `query VibecontrolsTemplate($id: ID!) { vibecontrolsTemplate(id: $id) { ${TEMPLATE_FIELDS} } }`;\nexport const UPDATE_TEMPLATE = `mutation UpdateVibecontrolsTemplate($id: ID!, $input: VibecontrolsUpdateTemplateInput!) { updateVibecontrolsTemplate(id: $id, input: $input) { ${TEMPLATE_FIELDS} } }`;\nexport const DELETE_TEMPLATE = `mutation DeleteVibecontrolsTemplate($id: ID!) { deleteVibecontrolsTemplate(id: $id) }`;\nexport const INSTANTIATE_TEMPLATE = `\n mutation InstantiateVibecontrolsTemplate($templateId: ID!, $input: VibecontrolsCloneTemplateInput!) {\n instantiateVibecontrolsTemplate(templateId: $templateId, input: $input) { ${COMPONENT_FIELDS} }\n }\n`;\n\n// scorecards\nexport const GET_SCORECARD = `\n query VibecontrolsScorecard($ownerId: ID!, $ownerType: ScorecardOwnerType!) {\n vibecontrolsScorecard(ownerId: $ownerId, ownerType: $ownerType) { ${SCORECARD_FIELDS} }\n }\n`;\nexport const UPSERT_SCORECARD = `mutation UpsertVibecontrolsScorecard($input: UpsertScorecardInput!) { upsertVibecontrolsScorecard(input: $input) { ${SCORECARD_FIELDS} } }`;\nexport const ADD_SCORECARD_METRIC = `\n mutation AddVibecontrolsScorecardMetric($scorecardId: ID!, $input: AddScorecardMetricInput!) {\n addVibecontrolsScorecardMetric(scorecardId: $scorecardId, input: $input) { ${SCORECARD_METRIC_FIELDS} }\n }\n`;\nexport const UPDATE_SCORECARD_METRIC = `\n mutation UpdateVibecontrolsScorecardMetric($id: ID!, $input: UpdateScorecardMetricInput!) {\n updateVibecontrolsScorecardMetric(id: $id, input: $input) { ${SCORECARD_METRIC_FIELDS} }\n }\n`;\nexport const REMOVE_SCORECARD_METRIC = `mutation RemoveVibecontrolsScorecardMetric($id: ID!) { removeVibecontrolsScorecardMetric(id: $id) }`;\n\n// ---------------------------------------------------------------------------\n// Configuration / Security\n// ---------------------------------------------------------------------------\n\nconst SECURITY_SUMMARY = `summary { critical high medium low info }`;\nconst SECURITY_FINDING_FIELDS = `\n id workspaceId vibeId scanRunId fingerprint\n category severity status ruleId title description\n file line col cve cwe packageName packageVersion fixedVersion\n remediation redactedSample ownerTeam firstSeenAt lastSeenAt dueAt\n`;\nconst SECURITY_EVIDENCE_FIELDS = `\n id workspaceId scanRunId type sha256 sizeBytes\n s3Bucket s3Key retentionDays uploadedAt downloadUrl\n`;\nconst SECURITY_SCAN_RUN_FIELDS = `\n id workspaceId vibeId agentId createdBy providerName\n stage status conclusion policyLevel repoUrl commit\n durationMs errorReason startedAt finishedAt createdAt\n ${SECURITY_SUMMARY}\n findings { ${SECURITY_FINDING_FIELDS} }\n evidence { ${SECURITY_EVIDENCE_FIELDS} }\n`;\nconst SECURITY_PROVIDER_FIELDS = `\n id workspaceId providerName pluginName stage toolVersion\n enabled isDefault config createdAt updatedAt\n`;\nconst REPO_SECURITY_CONFIG_FIELDS = `\n id workspaceId vibeId policyLevel enabledStages\n pluginAssignments profile configYamlEquivalent createdAt updatedAt\n`;\n\nexport const SECURITY_PROVIDERS_Q = `\n query SecurityProviders { securityProviders { ${SECURITY_PROVIDER_FIELDS} } }\n`;\nexport const SECURITY_SCAN_Q = `\n query SecurityScan($id: ID!) { securityScan(id: $id) { ${SECURITY_SCAN_RUN_FIELDS} } }\n`;\nexport const MY_SECURITY_SCANS_Q = `\n query MySecurityScans($filter: SecurityScanFilterInput, $pagination: SecurityPaginationInput) {\n mySecurityScans(filter: $filter, pagination: $pagination) {\n items { ${SECURITY_SCAN_RUN_FIELDS} } total hasMore\n }\n }\n`;\nexport const ALL_SECURITY_SCANS_Q = `\n query AllSecurityScans($filter: SecurityScanFilterInput, $pagination: SecurityPaginationInput) {\n allSecurityScans(filter: $filter, pagination: $pagination) {\n items { ${SECURITY_SCAN_RUN_FIELDS} } total hasMore\n }\n }\n`;\nexport const SECURITY_FINDINGS_Q = `\n query SecurityFindings($filter: SecurityFindingFilterInput, $pagination: SecurityPaginationInput) {\n securityFindings(filter: $filter, pagination: $pagination) {\n items { ${SECURITY_FINDING_FIELDS} } total hasMore\n }\n }\n`;\nexport const SECURITY_POLICY_DECISION_Q = `\n query SecurityPolicyDecision($scanRunId: ID!) {\n securityPolicyDecision(scanRunId: $scanRunId) {\n scanRunId allow denyReasons policyVersion evaluatedAt\n }\n }\n`;\nexport const SECURITY_STATUS_Q = `\n query SecurityStatus($vibeId: ID!) {\n securityStatus(vibeId: $vibeId) {\n vibeId policyLevel perStage lastScanAt\n totals { critical high medium low info }\n }\n }\n`;\nexport const REPOSITORY_SECURITY_CONFIG_Q = `\n query RepositorySecurityConfig($vibeId: ID!) {\n repositorySecurityConfig(vibeId: $vibeId) { ${REPO_SECURITY_CONFIG_FIELDS} }\n }\n`;\nexport const RUN_SECURITY_SCAN_M = `\n mutation RunSecurityScan($vibeId: ID!, $stage: SecurityStage!) {\n runSecurityScan(vibeId: $vibeId, stage: $stage) { ${SECURITY_SCAN_RUN_FIELDS} }\n }\n`;\nexport const CANCEL_SECURITY_SCAN_M = `\n mutation CancelSecurityScan($id: ID!) {\n cancelSecurityScan(id: $id) { ${SECURITY_SCAN_RUN_FIELDS} }\n }\n`;\nexport const CREATE_SECURITY_EXCEPTION_M = `\n mutation CreateSecurityException($input: CreateSecurityExceptionInput!) {\n createSecurityException(input: $input) {\n id workspaceId vibeId findingId reason compensatingControls\n approvedBy expiresAt status createdAt\n }\n }\n`;\nexport const REVOKE_SECURITY_EXCEPTION_M = `\n mutation RevokeSecurityException($id: ID!) { revokeSecurityException(id: $id) }\n`;\nexport const SET_SECURITY_PROVIDER_M = `\n mutation SetSecurityProvider($input: SetSecurityProviderInput!) {\n setSecurityProvider(input: $input) { ${SECURITY_PROVIDER_FIELDS} }\n }\n`;\nexport const UPDATE_SECURITY_FINDING_STATUS_M = `\n mutation UpdateSecurityFindingStatus($id: ID!, $status: SecurityFindingStatus!) {\n updateSecurityFindingStatus(id: $id, status: $status) { ${SECURITY_FINDING_FIELDS} }\n }\n`;\nexport const UPDATE_REPOSITORY_SECURITY_CONFIG_M = `\n mutation UpdateRepositorySecurityConfig(\n $vibeId: ID!, $input: UpdateRepositorySecurityConfigInput!\n ) {\n updateRepositorySecurityConfig(vibeId: $vibeId, input: $input) { ${REPO_SECURITY_CONFIG_FIELDS} }\n }\n`;\nexport const PRESIGN_SECURITY_EVIDENCE_M = `\n mutation PresignSecurityEvidence(\n $scanRunId: ID!, $sha256: String!, $sizeBytes: Int!, $type: SecurityEvidenceType!\n ) {\n presignSecurityEvidence(\n scanRunId: $scanRunId, sha256: $sha256, sizeBytes: $sizeBytes, type: $type\n ) {\n evidenceId uploadUrl method requiredHeaders s3Bucket s3Key expiresAt\n }\n }\n`;\nexport const PUSH_SECURITY_SCAN_RUN_M = `\n mutation PushSecurityScanRun($input: PushSecurityScanRunInput!) {\n pushSecurityScanRun(input: $input) { ${SECURITY_SCAN_RUN_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration / CI status\n// ---------------------------------------------------------------------------\n\nconst CI_RUN_FIELDS = `\n id status conclusion workflowName branch event actor url\n startedAt completedAt durationSeconds\n`;\nconst CI_STATUS_FIELDS = `\n recentRuns { ${CI_RUN_FIELDS} }\n workflows { id name path state }\n averageDurationSeconds successRate totalRunsLast30Days\n`;\nconst CI_DETAILS_FIELDS = `\n ${CI_RUN_FIELDS}\n commitSha commitMessage\n jobs { id name status conclusion startedAt completedAt durationSeconds }\n`;\nconst REPO_STATS_FIELDS = `\n name fullName owner description defaultBranch visibility\n isArchived isFork diskUsageKb stargazerCount watcherCount forkCount\n openIssues openPullRequests dependabotAlerts languages license\n createdAt updatedAt pushedAt\n contributors { login contributions avatarUrl }\n commitActivity { week total additions deletions }\n pullRequests {\n number title state author url createdAt updatedAt\n isDraft labels reviewers\n }\n`;\n\nexport const GET_CI_STATUS_Q = `\n query GetCIStatus($providerId: ID!, $agentId: ID!, $limit: Int) {\n getCIStatus(providerId: $providerId, agentId: $agentId, limit: $limit) { ${CI_STATUS_FIELDS} }\n }\n`;\nexport const GET_CI_PIPELINE_RUNS_Q = `\n query GetCIPipelineRuns($providerId: ID!, $agentId: ID!, $branch: String, $limit: Int) {\n getCIPipelineRuns(providerId: $providerId, agentId: $agentId, branch: $branch, limit: $limit) {\n ${CI_RUN_FIELDS}\n }\n }\n`;\nexport const GET_CI_PIPELINE_DETAILS_Q = `\n query GetCIPipelineDetails($providerId: ID!, $agentId: ID!, $runId: ID!) {\n getCIPipelineDetails(providerId: $providerId, agentId: $agentId, runId: $runId) {\n ${CI_DETAILS_FIELDS}\n }\n }\n`;\nexport const GET_REPO_STATS_Q = `\n query GetRepoStats($providerId: ID!, $agentId: ID!) {\n getRepoStats(providerId: $providerId, agentId: $agentId) { ${REPO_STATS_FIELDS} }\n }\n`;\nexport const REFRESH_CI_STATUS_M = `\n mutation RefreshCIStatus($providerId: ID!, $agentId: ID!) {\n refreshCIStatus(providerId: $providerId, agentId: $agentId) { ${CI_STATUS_FIELDS} }\n }\n`;\nexport const REFRESH_REPO_STATS_M = `\n mutation RefreshRepoStats($providerId: ID!, $agentId: ID!) {\n refreshRepoStats(providerId: $providerId, agentId: $agentId) { ${REPO_STATS_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration / GitOps providers\n// ---------------------------------------------------------------------------\n\nconst GITOPS_FIELDS = `\n id workspaceId createdBy name providerType repoUrl\n isActive vibeId metadata\n context { workspaceId userId appId custom }\n createdAt updatedAt deletedAt\n`;\nexport const LIST_GITOPS_PROVIDERS_Q = `\n query ListGitopsProviders($filter: GitopsProviderFilterInput, $pagination: PaginationInput) {\n listGitopsProviders(filter: $filter, pagination: $pagination) {\n items { ${GITOPS_FIELDS} } total hasMore\n }\n }\n`;\nexport const GET_GITOPS_PROVIDER_Q = `\n query GetGitopsProvider($id: ID!) { getGitopsProvider(id: $id) { ${GITOPS_FIELDS} } }\n`;\nexport const CREATE_GITOPS_PROVIDER_M = `\n mutation CreateGitopsProvider($input: CreateGitopsProviderInput!) {\n createGitopsProvider(input: $input) { ${GITOPS_FIELDS} }\n }\n`;\nexport const UPDATE_GITOPS_PROVIDER_M = `\n mutation UpdateGitopsProvider($id: ID!, $input: UpdateGitopsProviderInput!) {\n updateGitopsProvider(id: $id, input: $input) { ${GITOPS_FIELDS} }\n }\n`;\nexport const DELETE_GITOPS_PROVIDER_M = `\n mutation DeleteGitopsProvider($id: ID!) { deleteGitopsProvider(id: $id) }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration / Settings, preferences, secrets, integration tokens\n// ---------------------------------------------------------------------------\n\nconst PREFS_FIELDS = `\n theme uiDensity sidebarCollapsed codeFont codeFontSize\n preferredIdeCommand defaultAgentForVibe vibeIdeOverrides vibeDetailTabOrder\n`;\nconst NOTIF_FIELDS = `\n emailDigest digestFrequency agentOffline sessionError vibeStatusChange\n`;\nconst DEFAULTS_FIELDS = `\n defaultAgent defaultSessionType defaultVibeType defaultEnvironmentVariables\n autoStartSessions autoGitSync agentHeartbeatInterval agentMaxSessions\n agentAutoReconnect autoUpdate telemetryEnabled logLevel\n`;\nconst BUNDLE_FIELDS = `\n preferences { ${PREFS_FIELDS} }\n notifications { ${NOTIF_FIELDS} }\n workspaceDefaults { ${DEFAULTS_FIELDS} }\n profile { displayName avatar bio language timezone }\n security { mfaEnabled sessionTimeout activeSessions }\n`;\nconst SECRET_FIELDS = `id key value isSecret createdAt updatedAt`;\n\nexport const MY_SETTINGS_Q = `query MySettings { mySettings { ${BUNDLE_FIELDS} } }`;\nexport const MY_SETTINGS_BY_CATEGORY_Q = `\n query MySettingsByCategory($category: SettingsCategory!) {\n mySettingsByCategory(category: $category)\n }\n`;\nexport const LIST_SETTINGS_SECRETS_Q = `\n query ListSettingsSecrets { listSettingsSecrets { ${SECRET_FIELDS} } }\n`;\nexport const SET_SETTINGS_SECRET_M = `\n mutation SetSettingsSecret($input: SetSettingsSecretInput!) {\n setSettingsSecret(input: $input) { ${SECRET_FIELDS} }\n }\n`;\nexport const DELETE_SETTINGS_SECRET_M = `\n mutation DeleteSettingsSecret($key: String!) { deleteSettingsSecret(key: $key) }\n`;\nexport const RESET_SETTINGS_M = `\n mutation ResetSettings($category: SettingsCategory!) { resetSettings(category: $category) }\n`;\nexport const UPDATE_PREFERENCES_M = `\n mutation UpdatePreferences($input: UpdatePreferencesInput!) {\n updatePreferences(input: $input) { ${PREFS_FIELDS} }\n }\n`;\nexport const UPDATE_NOTIFICATION_PREFERENCES_M = `\n mutation UpdateNotificationPreferences($input: UpdateNotificationPreferencesInput!) {\n updateNotificationPreferences(input: $input) { ${NOTIF_FIELDS} }\n }\n`;\nexport const UPDATE_WORKSPACE_DEFAULTS_M = `\n mutation UpdateWorkspaceDefaults($input: UpdateWorkspaceDefaultsInput!) {\n updateWorkspaceDefaults(input: $input) { ${DEFAULTS_FIELDS} }\n }\n`;\nexport const RESOLVE_INTEGRATION_TOKEN_M = `\n mutation VibecontrolsResolveIntegrationToken($connectionId: ID!) {\n vibecontrolsResolveIntegrationToken(connectionId: $connectionId) {\n success connectionStatus wasRefreshed error\n token {\n accessToken refreshToken tokenType providerKey scopes expiresAt metadata\n }\n }\n }\n`;\n","import { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { jsonResult, errorResult, mcpToolName, type McpContext } from '../../core/index.js';\nimport {\n LIST_SANDBOXES,\n GET_SANDBOX,\n CREATE_SANDBOX,\n DELETE_SANDBOX,\n STOP_SANDBOX,\n EXTEND_SANDBOX_TTL,\n LIST_SANDBOX_TEMPLATES,\n GET_SANDBOX_TEMPLATE,\n CREATE_SANDBOX_TEMPLATE,\n UPDATE_SANDBOX_TEMPLATE,\n DELETE_SANDBOX_TEMPLATE,\n AVAILABLE_SANDBOX_TAGS,\n GET_SANDBOX_TAGS,\n CREATE_SANDBOX_TAG,\n TAG_SANDBOX,\n UNTAG_SANDBOX,\n REPLACE_SANDBOX_TAGS,\n LIST_ALL_SANDBOXES,\n LIST_SANDBOX_NODES,\n GET_ACTIVE_SANDBOXES,\n GET_RECENT_SANDBOX_ACTIVITY,\n GET_SANDBOX_STATS,\n GET_SANDBOX_LOGS,\n GET_SANDBOX_CONFIG,\n UPDATE_SANDBOX_CONFIG,\n EXPORT_SANDBOXES,\n GET_SANDBOX_EXPORT_JOB,\n LIST_SANDBOX_EXPORT_JOBS,\n GET_SANDBOX_ARTIFACT_BYTES,\n PROXY_SANDBOX_REQUEST,\n} from '../vibecontrols/operations.js';\n\nexport function registerSandboxTools(\n server: McpServer,\n ctx: McpContext,\n track: (n: string) => string,\n): void {\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_list')),\n {\n title: 'List Sandboxes',\n description: 'List Kubernetes-native sandboxes with optional filters and pagination.',\n inputSchema: {\n status: z\n .string()\n .optional()\n .describe(\n 'Filter by status (PENDING, PROVISIONING, RUNNING, STOPPING, STOPPED, EXPIRED, FAILED)',\n ),\n template: z\n .string()\n .optional()\n .describe(\n 'Filter by template (VIBECONTROLS, AI_BUILDER, WORKFLOW_MULTI_NODE, MISC_SHELL, CUSTOM)',\n ),\n limit: z.number().optional().describe('Max results'),\n offset: z.number().optional().describe('Skip results'),\n },\n },\n async ({ status, template, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (status !== undefined) filter.status = status;\n if (template !== undefined) filter.template = template;\n\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n const data = await ctx.gql.workspace.request<{ listSandboxes: unknown }>(LIST_SANDBOXES, {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n });\n return jsonResult(data.listSandboxes);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_list failed', { error });\n return errorResult(\n `Failed to list sandboxes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_get')),\n {\n title: 'Get Sandbox',\n description: 'Get a sandbox by its ID.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandbox: unknown }>(GET_SANDBOX, { id });\n return jsonResult(data.getSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_get failed', { error });\n return errorResult(\n `Failed to get sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_create')),\n {\n title: 'Create Sandbox',\n description:\n 'Create a new Kubernetes-native sandbox environment with Kata Containers isolation.',\n inputSchema: {\n name: z.string().describe('Sandbox name'),\n template: z\n .enum(['VIBECONTROLS', 'AI_BUILDER', 'WORKFLOW_MULTI_NODE', 'MISC_SHELL', 'CUSTOM'])\n .describe('Sandbox template type'),\n mode: z\n .enum(['DEPLOYMENT', 'JOB'])\n .optional()\n .describe('Run mode: DEPLOYMENT (long-running) or JOB (run-to-completion)'),\n containers: z\n .array(\n z.object({\n name: z.string().describe('Container name'),\n image: z.string().describe('Container image'),\n ports: z\n .array(\n z.object({\n containerPort: z.number().describe('Container port'),\n name: z.string().optional().describe('Port name'),\n protocol: z.string().optional().describe('Protocol (TCP, UDP)'),\n }),\n )\n .optional()\n .describe('Exposed ports'),\n env: z\n .array(\n z.object({\n name: z.string().describe('Env var name'),\n value: z.string().describe('Env var value'),\n }),\n )\n .optional()\n .describe('Environment variables'),\n command: z.array(z.string()).optional().describe('Container entrypoint command'),\n args: z.array(z.string()).optional().describe('Container arguments'),\n }),\n )\n .optional()\n .describe('Container specifications (uses template defaults if omitted)'),\n ttlSeconds: z.number().optional().describe('Time-to-live in seconds'),\n resources: z\n .object({\n cpuRequest: z.string().optional(),\n cpuLimit: z.string().optional(),\n memoryRequest: z.string().optional(),\n memoryLimit: z.string().optional(),\n })\n .optional()\n .describe('Resource requests/limits'),\n description: z.string().optional().describe('Sandbox description'),\n templateId: z.string().optional().describe('Sandbox template config ID to use'),\n },\n },\n async ({\n name,\n template,\n mode,\n containers,\n ttlSeconds,\n resources,\n description,\n templateId,\n }) => {\n try {\n const input: Record<string, unknown> = { name, template };\n if (mode !== undefined) input.mode = mode;\n if (containers !== undefined) input.containers = containers;\n if (ttlSeconds !== undefined) input.ttlSeconds = ttlSeconds;\n if (resources !== undefined) input.resources = resources;\n if (description !== undefined) input.description = description;\n if (templateId !== undefined) input.templateId = templateId;\n\n const data = await ctx.gql.workspace.request<{ createSandbox: unknown }>(CREATE_SANDBOX, {\n input,\n });\n return jsonResult(data.createSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_create failed', { error });\n return errorResult(\n `Failed to create sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_delete')),\n {\n title: 'Delete Sandbox',\n description: 'Delete a sandbox and its Kubernetes resources.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ deleteSandbox: unknown }>(DELETE_SANDBOX, {\n id,\n });\n return jsonResult({ deleted: data.deleteSandbox, sandboxId: id });\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_delete failed', { error });\n return errorResult(\n `Failed to delete sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_stop')),\n {\n title: 'Stop Sandbox',\n description: 'Stop a running sandbox.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ stopSandbox: unknown }>(STOP_SANDBOX, {\n id,\n });\n return jsonResult(data.stopSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_stop failed', { error });\n return errorResult(\n `Failed to stop sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_extend')),\n {\n title: 'Extend Sandbox TTL',\n description: 'Extend the time-to-live of a sandbox.',\n inputSchema: {\n id: z.string().describe('Sandbox ID'),\n additionalSeconds: z.number().describe('Number of seconds to add to the TTL'),\n },\n },\n async ({ id, additionalSeconds }) => {\n try {\n const data = await ctx.gql.workspace.request<{ extendSandboxTTL: unknown }>(\n EXTEND_SANDBOX_TTL,\n {\n id,\n additionalSeconds,\n },\n );\n return jsonResult(data.extendSandboxTTL);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_extend failed', { error });\n return errorResult(\n `Failed to extend sandbox TTL: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Templates ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_list')),\n {\n title: 'List Sandbox Templates',\n description: 'List sandbox template configurations available in this workspace.',\n inputSchema: {\n template: z.string().optional().describe('Filter by template kind'),\n limit: z.number().optional(),\n offset: z.number().optional(),\n },\n },\n async ({ template, limit, offset }) => {\n try {\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n const data = await ctx.gql.workspace.request<{ listSandboxTemplates: unknown }>(\n LIST_SANDBOX_TEMPLATES,\n {\n template,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n },\n );\n return jsonResult(data.listSandboxTemplates);\n } catch (error) {\n ctx.logger.error('sandbox_templates_list failed', { error });\n return errorResult(\n `Failed to list templates: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_get')),\n {\n title: 'Get Sandbox Template',\n description: 'Get a sandbox template by ID.',\n inputSchema: { id: z.string().describe('Template ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxTemplate: unknown }>(\n GET_SANDBOX_TEMPLATE,\n { id },\n );\n return jsonResult(data.getSandboxTemplate);\n } catch (error) {\n ctx.logger.error('sandbox_templates_get failed', { error });\n return errorResult(\n `Failed to get template: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_create')),\n {\n title: 'Create Sandbox Template',\n description: 'Create a new sandbox template configuration.',\n inputSchema: {\n name: z.string(),\n template: z.enum([\n 'VIBECONTROLS',\n 'AI_BUILDER',\n 'WORKFLOW_MULTI_NODE',\n 'MISC_SHELL',\n 'CUSTOM',\n 'DOCS_BUILDER',\n ]),\n description: z.string().optional(),\n isDefault: z.boolean().optional(),\n ttlSeconds: z.number().optional(),\n },\n },\n async ({ name, template, description, isDefault, ttlSeconds }) => {\n try {\n const input: Record<string, unknown> = { name, template };\n if (description !== undefined) input.description = description;\n if (isDefault !== undefined) input.isDefault = isDefault;\n if (ttlSeconds !== undefined) input.ttlSeconds = ttlSeconds;\n const data = await ctx.gql.workspace.request<{ createSandboxTemplate: unknown }>(\n CREATE_SANDBOX_TEMPLATE,\n { input },\n );\n return jsonResult(data.createSandboxTemplate);\n } catch (error) {\n ctx.logger.error('sandbox_templates_create failed', { error });\n return errorResult(\n `Failed to create template: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_update')),\n {\n title: 'Update Sandbox Template',\n description: 'Update a sandbox template configuration.',\n inputSchema: {\n id: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n isDefault: z.boolean().optional(),\n ttlSeconds: z.number().optional(),\n },\n },\n async ({ id, name, description, isDefault, ttlSeconds }) => {\n try {\n const input: Record<string, unknown> = { id };\n if (name !== undefined) input.name = name;\n if (description !== undefined) input.description = description;\n if (isDefault !== undefined) input.isDefault = isDefault;\n if (ttlSeconds !== undefined) input.ttlSeconds = ttlSeconds;\n const data = await ctx.gql.workspace.request<{ updateSandboxTemplate: unknown }>(\n UPDATE_SANDBOX_TEMPLATE,\n { input },\n );\n return jsonResult(data.updateSandboxTemplate);\n } catch (error) {\n ctx.logger.error('sandbox_templates_update failed', { error });\n return errorResult(\n `Failed to update template: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_delete')),\n {\n title: 'Delete Sandbox Template',\n description: 'Delete a sandbox template configuration.',\n inputSchema: { id: z.string() },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ deleteSandboxTemplate: unknown }>(\n DELETE_SANDBOX_TEMPLATE,\n { id },\n );\n return jsonResult({ deleted: data.deleteSandboxTemplate, templateId: id });\n } catch (error) {\n ctx.logger.error('sandbox_templates_delete failed', { error });\n return errorResult(\n `Failed to delete template: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Tags ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_list')),\n {\n title: 'List Available Sandbox Tags',\n description: 'List available sandbox tags in the workspace.',\n inputSchema: {\n query: z.string().optional(),\n limit: z.number().optional(),\n },\n },\n async ({ query, limit }) => {\n try {\n const data = await ctx.gql.workspace.request<{ availableSandboxTags: unknown }>(\n AVAILABLE_SANDBOX_TAGS,\n { query, limit },\n );\n return jsonResult(data.availableSandboxTags);\n } catch (error) {\n ctx.logger.error('sandbox_tags_list failed', { error });\n return errorResult(\n `Failed to list tags: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_get')),\n {\n title: 'Get Sandbox Tags',\n description: 'Get tag assignments for a sandbox.',\n inputSchema: { sandboxId: z.string() },\n },\n async ({ sandboxId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxTags: unknown }>(\n GET_SANDBOX_TAGS,\n { input: { sandboxId } },\n );\n return jsonResult(data.getSandboxTags);\n } catch (error) {\n ctx.logger.error('sandbox_tags_get failed', { error });\n return errorResult(\n `Failed to get tags: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_create')),\n {\n title: 'Create Sandbox Tag',\n description: 'Create a new sandbox tag.',\n inputSchema: {\n label: z.string(),\n color: z.string().optional(),\n },\n },\n async ({ label, color }) => {\n try {\n const input: Record<string, unknown> = { label };\n if (color !== undefined) input.color = color;\n const data = await ctx.gql.workspace.request<{ createSandboxTag: unknown }>(\n CREATE_SANDBOX_TAG,\n { input },\n );\n return jsonResult(data.createSandboxTag);\n } catch (error) {\n ctx.logger.error('sandbox_tags_create failed', { error });\n return errorResult(\n `Failed to create tag: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_attach')),\n {\n title: 'Attach Tag to Sandbox',\n description: 'Attach a tag to a sandbox.',\n inputSchema: {\n sandboxId: z.string(),\n tagId: z.string(),\n source: z.string().optional(),\n },\n },\n async ({ sandboxId, tagId, source }) => {\n try {\n const input: Record<string, unknown> = { sandboxId, tagId };\n if (source !== undefined) input.source = source;\n const data = await ctx.gql.workspace.request<{ tagSandbox: unknown }>(TAG_SANDBOX, {\n input,\n });\n return jsonResult(data.tagSandbox);\n } catch (error) {\n ctx.logger.error('sandbox_tags_attach failed', { error });\n return errorResult(\n `Failed to attach tag: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_detach')),\n {\n title: 'Detach Tag from Sandbox',\n description: 'Detach a tag from a sandbox.',\n inputSchema: {\n sandboxId: z.string(),\n tagId: z.string(),\n },\n },\n async ({ sandboxId, tagId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ untagSandbox: unknown }>(UNTAG_SANDBOX, {\n input: { sandboxId, tagId },\n });\n return jsonResult({ detached: data.untagSandbox, sandboxId, tagId });\n } catch (error) {\n ctx.logger.error('sandbox_tags_detach failed', { error });\n return errorResult(\n `Failed to detach tag: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_replace')),\n {\n title: 'Replace Sandbox Tags',\n description: 'Replace the full set of tags on a sandbox.',\n inputSchema: {\n sandboxId: z.string(),\n tagIds: z.array(z.string()),\n },\n },\n async ({ sandboxId, tagIds }) => {\n try {\n const data = await ctx.gql.workspace.request<{ replaceSandboxTags: unknown }>(\n REPLACE_SANDBOX_TAGS,\n { input: { sandboxId, tagIds } },\n );\n return jsonResult(data.replaceSandboxTags);\n } catch (error) {\n ctx.logger.error('sandbox_tags_replace failed', { error });\n return errorResult(\n `Failed to replace tags: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Admin / observability ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_list_all')),\n {\n title: 'List All Sandboxes (admin)',\n description: 'Admin-only list across the entire workspace including internal sandboxes.',\n inputSchema: {\n status: z.string().optional(),\n template: z.string().optional(),\n limit: z.number().optional(),\n offset: z.number().optional(),\n },\n },\n async ({ status, template, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (status !== undefined) filter.status = status;\n if (template !== undefined) filter.template = template;\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n const data = await ctx.gql.workspace.request<{ listAllSandboxes: unknown }>(\n LIST_ALL_SANDBOXES,\n {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n },\n );\n return jsonResult(data.listAllSandboxes);\n } catch (error) {\n ctx.logger.error('sandbox_admin_list_all failed', { error });\n return errorResult(\n `Failed to list all sandboxes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_nodes_list')),\n {\n title: 'List Sandbox Nodes',\n description: 'List Kubernetes nodes hosting sandbox workloads with capacity info.',\n inputSchema: {},\n },\n async () => {\n try {\n const data = await ctx.gql.workspace.request<{ listSandboxNodes: unknown }>(\n LIST_SANDBOX_NODES,\n {},\n );\n return jsonResult(data.listSandboxNodes);\n } catch (error) {\n ctx.logger.error('sandbox_admin_nodes_list failed', { error });\n return errorResult(\n `Failed to list nodes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_active')),\n {\n title: 'Get Active Sandboxes',\n description: 'Get currently active sandboxes in the workspace.',\n inputSchema: {},\n },\n async () => {\n try {\n const data = await ctx.gql.workspace.request<{ getActiveSandboxes: unknown }>(\n GET_ACTIVE_SANDBOXES,\n {},\n );\n return jsonResult(data.getActiveSandboxes);\n } catch (error) {\n ctx.logger.error('sandbox_admin_active failed', { error });\n return errorResult(\n `Failed to get active sandboxes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_activity')),\n {\n title: 'Recent Sandbox Activity',\n description: 'Get recent sandbox lifecycle activity (create/stop/delete/extend).',\n inputSchema: { limit: z.number().optional() },\n },\n async ({ limit }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getRecentSandboxActivity: unknown }>(\n GET_RECENT_SANDBOX_ACTIVITY,\n { limit },\n );\n return jsonResult(data.getRecentSandboxActivity);\n } catch (error) {\n ctx.logger.error('sandbox_admin_activity failed', { error });\n return errorResult(\n `Failed to get activity: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_stats')),\n {\n title: 'Sandbox Stats',\n description: 'Get aggregate sandbox usage statistics for the workspace.',\n inputSchema: {},\n },\n async () => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxStats: unknown }>(\n GET_SANDBOX_STATS,\n {},\n );\n return jsonResult(data.getSandboxStats);\n } catch (error) {\n ctx.logger.error('sandbox_admin_stats failed', { error });\n return errorResult(\n `Failed to get stats: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_logs')),\n {\n title: 'Get Sandbox Logs',\n description: 'Fetch logs for a sandbox container.',\n inputSchema: {\n id: z.string(),\n containerName: z.string(),\n tailLines: z.number().optional(),\n },\n },\n async ({ id, containerName, tailLines }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxLogs: string }>(GET_SANDBOX_LOGS, {\n id,\n containerName,\n tailLines,\n });\n return jsonResult({ logs: data.getSandboxLogs });\n } catch (error) {\n ctx.logger.error('sandbox_admin_logs failed', { error });\n return errorResult(\n `Failed to get logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_config_get')),\n {\n title: 'Get Sandbox Config',\n description: 'Get the per-workspace sandbox configuration limits.',\n inputSchema: {},\n },\n async () => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxConfig: unknown }>(\n GET_SANDBOX_CONFIG,\n {},\n );\n return jsonResult(data.getSandboxConfig);\n } catch (error) {\n ctx.logger.error('sandbox_admin_config_get failed', { error });\n return errorResult(\n `Failed to get config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_config_set')),\n {\n title: 'Update Sandbox Config',\n description: 'Update the per-workspace sandbox configuration limits.',\n inputSchema: {\n defaultTtlSeconds: z.number().optional(),\n maxTtlSeconds: z.number().optional(),\n maxConcurrentPerUser: z.number().optional(),\n maxConcurrentPerWorkspace: z.number().optional(),\n },\n },\n async ({\n defaultTtlSeconds,\n maxTtlSeconds,\n maxConcurrentPerUser,\n maxConcurrentPerWorkspace,\n }) => {\n try {\n const input: Record<string, unknown> = {};\n if (defaultTtlSeconds !== undefined) input.defaultTtlSeconds = defaultTtlSeconds;\n if (maxTtlSeconds !== undefined) input.maxTtlSeconds = maxTtlSeconds;\n if (maxConcurrentPerUser !== undefined) input.maxConcurrentPerUser = maxConcurrentPerUser;\n if (maxConcurrentPerWorkspace !== undefined)\n input.maxConcurrentPerWorkspace = maxConcurrentPerWorkspace;\n const data = await ctx.gql.workspace.request<{ updateSandboxConfig: unknown }>(\n UPDATE_SANDBOX_CONFIG,\n { input },\n );\n return jsonResult(data.updateSandboxConfig);\n } catch (error) {\n ctx.logger.error('sandbox_admin_config_set failed', { error });\n return errorResult(\n `Failed to update config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Export ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_create')),\n {\n title: 'Create Sandbox Export Job',\n description: 'Kick off an async job to export sandboxes for the workspace.',\n inputSchema: {\n workspaceId: z.string(),\n format: z.enum(['CSV', 'JSON']),\n includeUsageEvents: z.boolean().optional(),\n },\n },\n async ({ workspaceId, format, includeUsageEvents }) => {\n try {\n const input: Record<string, unknown> = { workspaceId, format };\n if (includeUsageEvents !== undefined) input.includeUsageEvents = includeUsageEvents;\n const data = await ctx.gql.workspace.request<{ exportSandboxes: unknown }>(\n EXPORT_SANDBOXES,\n { input },\n );\n return jsonResult(data.exportSandboxes);\n } catch (error) {\n ctx.logger.error('sandbox_export_create failed', { error });\n return errorResult(\n `Failed to create export: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_get')),\n {\n title: 'Get Sandbox Export Job',\n description:\n 'Get a sandbox export job by ID. Poll this to track progress (MCP has no subscriptions).',\n inputSchema: {\n workspaceId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ workspaceId, jobId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxExportJob: unknown }>(\n GET_SANDBOX_EXPORT_JOB,\n { workspaceId, jobId },\n );\n return jsonResult(data.getSandboxExportJob);\n } catch (error) {\n ctx.logger.error('sandbox_export_get failed', { error });\n return errorResult(\n `Failed to get export job: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_list')),\n {\n title: 'List Sandbox Export Jobs',\n description: 'List sandbox export jobs for a workspace.',\n inputSchema: {\n workspaceId: z.string(),\n limit: z.number().optional(),\n offset: z.number().optional(),\n },\n },\n async ({ workspaceId, limit, offset }) => {\n try {\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n const data = await ctx.gql.workspace.request<{ listSandboxExportJobs: unknown }>(\n LIST_SANDBOX_EXPORT_JOBS,\n {\n workspaceId,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n },\n );\n return jsonResult(data.listSandboxExportJobs);\n } catch (error) {\n ctx.logger.error('sandbox_export_list failed', { error });\n return errorResult(\n `Failed to list export jobs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_get_artifact_bytes')),\n {\n title: 'Get Sandbox Artifact Bytes',\n description: 'Fetch raw artifact bytes for a sandbox session (base64-encoded, 50 MB cap).',\n inputSchema: {\n sandboxId: z.string(),\n sessionId: z.string(),\n path: z.string(),\n onBehalfOfUserId: z.string().optional(),\n },\n },\n async ({ sandboxId, sessionId, path, onBehalfOfUserId }) => {\n try {\n const input: Record<string, unknown> = { sandboxId, sessionId, path };\n if (onBehalfOfUserId !== undefined) input.onBehalfOfUserId = onBehalfOfUserId;\n const data = await ctx.gql.workspace.request<{ getSandboxArtifactBytes: unknown }>(\n GET_SANDBOX_ARTIFACT_BYTES,\n { input },\n );\n return jsonResult(data.getSandboxArtifactBytes);\n } catch (error) {\n ctx.logger.error('sandbox_export_get_artifact_bytes failed', { error });\n return errorResult(\n `Failed to get artifact bytes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Proxy ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_proxy_request')),\n {\n title: 'Proxy HTTP Request to Sandbox',\n description: 'Proxy an HTTP request to a service running inside a sandbox container.',\n inputSchema: {\n sandboxId: z.string(),\n method: z.string(),\n path: z.string(),\n body: z.unknown().optional(),\n containerName: z.string().optional(),\n },\n },\n async ({ sandboxId, method, path, body, containerName }) => {\n try {\n const input: Record<string, unknown> = { sandboxId, method, path };\n if (body !== undefined) input.body = body;\n if (containerName !== undefined) input.containerName = containerName;\n const data = await ctx.gql.workspace.request<{ proxySandboxRequest: unknown }>(\n PROXY_SANDBOX_REQUEST,\n { input },\n );\n return jsonResult(data.proxySandboxRequest);\n } catch (error) {\n ctx.logger.error('sandbox_proxy_request failed', { error });\n return errorResult(\n `Failed to proxy request: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Subscription proxies (MCP has no subscriptions — use polling instead) ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_check')),\n {\n title: 'Check Sandbox State',\n description:\n 'Poll a sandbox by ID. MCP has no subscription protocol — call this in a loop to track lifecycle.',\n inputSchema: { id: z.string() },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandbox: unknown }>(GET_SANDBOX, { id });\n return jsonResult(data.getSandbox);\n } catch (error) {\n ctx.logger.error('sandbox_check failed', { error });\n return errorResult(\n `Failed to poll sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_check')),\n {\n title: 'Check Sandbox Export Job',\n description:\n 'Poll an export job by ID. MCP has no subscription protocol — call this in a loop to track progress.',\n inputSchema: {\n workspaceId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ workspaceId, jobId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxExportJob: unknown }>(\n GET_SANDBOX_EXPORT_JOB,\n { workspaceId, jobId },\n );\n return jsonResult(data.getSandboxExportJob);\n } catch (error) {\n ctx.logger.error('sandbox_export_check failed', { error });\n return errorResult(\n `Failed to poll export job: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n}\n","/**\n * Sandbox module — Kubernetes-native sandbox management\n * (<product>_sandbox_{list,get,create,delete,stop,extend}).\n *\n * Backend: ~/products/wspace/sandbox/wspace-sandbox-svc/.\n * Lifted verbatim from vibecontrols-mcp/src/tools/sandboxes.ts.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext, McpModule, ModuleRegistration } from '../../core/index.js';\nimport { registerSandboxTools } from './tools.js';\n\nconst sandboxModule: McpModule = {\n id: 'sandbox',\n version: '0.0.1',\n displayName: 'Sandbox',\n capabilities: { tools: {} },\n\n register(server: McpServer, ctx: McpContext): ModuleRegistration {\n const tools: string[] = [];\n const track = (n: string): string => {\n tools.push(n);\n return n;\n };\n\n registerSandboxTools(server, ctx, track);\n\n return { tools, resources: [], prompts: [] };\n },\n};\n\nexport default sandboxModule;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/errors.ts","../../../src/core/result.ts","../../../src/core/tool-name.ts","../../../src/modules/vibecontrols/operations.ts","../../../src/modules/sandbox/tools.ts","../../../src/modules/sandbox/index.ts"],"names":["z"],"mappings":";;;;;;;;;;;AA8BO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EACjB,KAAA;AAAA,EAEzB,WAAA,CAAY,SAAiB,KAAA,EAAiB;AAC5C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF,CAAA;;;ACCO,SAAS,UAAA,CAAW,MAAe,UAAA,EAAkD;AAC1F,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,GACjE;AAIA,EAAA,OAAO,MAAA;AACT;AAaO,SAAS,WAAA,CAAY,SAAiB,IAAA,EAA2B;AACtE,EAAA,MAAM,IAAA,GAAO,IAAA,GAAO,CAAA,EAAG,OAAO;;AAAA,MAAA,EAAa,IAAI,CAAA,CAAA,GAAK,OAAA;AACpD,EAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,IAAA,EAAK;AAC5D;;;ACnDA,IAAM,oBAAA,GAAuB,EAAA;AAE7B,SAAS,cAAA,CAAe,MAAc,IAAA,EAA8C;AAClF,EAAA,IAAuB,IAAA,CAAK,MAAA,GAAS,oBAAA,EAAsB;AACzD,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,CAAA,WAAA,EAAc,IAAI,CAAA,UAAA,EAAa,oBAAoB,CAAA,8CAAA;AAAA,KACrD;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,WAAA,CAAY,gBAAwB,KAAA,EAAyB;AAC3E,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,iBAAiB,sCAAsC,CAAA;AAAA,EACnE;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,WAAA,EAAa,GAAG,KAAK,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,IAAY,CAAA;AACpC;AC+7CO,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAYvB,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA,cAAA,EAGd,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAMvB,IAAM,WAAA,GAAc;AAAA;AAAA,6CAAA,EAEoB,cAAc,CAAA;AAAA;AAAA,CAAA;AAItD,IAAM,cAAA,GAAiB;AAAA;AAAA,mCAAA,EAEO,cAAc,CAAA;AAAA;AAAA,CAAA;AAI5C,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA,CAAA;AAMvB,IAAM,YAAA,GAAe;AAAA;AAAA,8CAAA,EAEoB,cAAc,CAAA;AAAA;AAAA,CAAA;AAIvD,IAAM,aAAA,GAAgB;AAAA;AAAA,+CAAA,EAEoB,cAAc,CAAA;AAAA;AAAA,CAAA;AAIxD,IAAM,kBAAA,GAAqB;AAAA;AAAA,0FAAA,EAE0D,cAAc,CAAA;AAAA;AAAA,CAAA;AAInG,IAAM,uBAAA,GAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAShC,IAAM,sBAAA,GAAyB;AAAA;AAAA;AAAA,cAAA,EAGtB,uBAAuB,CAAA;AAAA;AAAA;AAAA,CAAA;AAKhC,IAAM,oBAAA,GAAuB;AAAA;AAAA,qDAAA,EAEmB,uBAAuB,CAAA;AAAA;AAAA,CAAA;AAIvE,IAAM,uBAAA,GAA0B;AAAA;AAAA,2CAAA,EAEM,uBAAuB,CAAA;AAAA;AAAA,CAAA;AAI7D,IAAM,uBAAA,GAA0B;AAAA;AAAA,2CAAA,EAEM,uBAAuB,CAAA;AAAA;AAAA,CAAA;AAI7D,IAAM,uBAAA,GAA0B;AAAA;AAAA;AAAA;AAAA,CAAA;AAMhC,IAAM,sBAAA,GAAyB;AAAA;AAAA;AAAA;AAAA,CAAA;AAM/B,IAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAQzB,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA,CAAA;AAM3B,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAQpB,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA,CAAA;AAMtB,IAAM,oBAAA,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAQ7B,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA,cAAA,EAGlB,cAAc,CAAA;AAAA;AAAA;AAAA,CAAA;AAKvB,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAQ3B,IAAM,oBAAA,GAAuB;AAAA;AAAA,4CAAA,EAEU,cAAc,CAAA;AAAA;AAAA,CAAA;AAIrD,IAAM,2BAAA,GAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AASpC,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAW1B,IAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA,CAAA;AAMzB,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAW3B,IAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAW9B,IAAM,yBAAA,GAA4B;AAAA;AAAA;AAAA,CAAA;AAKlC,IAAM,gBAAA,GAAmB;AAAA;AAAA,qCAAA,EAEO,yBAAyB,CAAA;AAAA;AAAA,CAAA;AAIzD,IAAM,sBAAA,GAAyB;AAAA;AAAA;AAAA,MAAA,EAG9B,yBAAyB;AAAA;AAAA;AAAA,CAAA;AAK1B,IAAM,wBAAA,GAA2B;AAAA;AAAA;AAAA,MAAA,EAGhC,yBAAyB;AAAA;AAAA;AAAA,CAAA;AAK1B,IAAM,0BAAA,GAA6B;AAAA;AAAA;AAAA;AAAA,CAAA;AAMnC,IAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA,CAAA;;;AC9qD9B,SAAS,oBAAA,CACd,MAAA,EACA,GAAA,EACA,KAAA,EACM;AACN,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,cAAc,CAAC,CAAA;AAAA,IAClD;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,WAAA,EAAa,wEAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,MAAA,EAAQA,KAAA,CACL,MAAA,EAAO,CACP,UAAS,CACT,QAAA;AAAA,UACC;AAAA,SACF;AAAA,QACF,QAAA,EAAUA,KAAA,CACP,MAAA,EAAO,CACP,UAAS,CACT,QAAA;AAAA,UACC;AAAA,SACF;AAAA,QACF,OAAOA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,aAAa,CAAA;AAAA,QACnD,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,cAAc;AAAA;AACvD,KACF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAO,KAAM;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,SAAkC,EAAC;AACzC,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,MAAA,CAAO,MAAA,GAAS,MAAA;AAC1C,QAAA,IAAI,QAAA,KAAa,KAAA,CAAA,EAAW,MAAA,CAAO,QAAA,GAAW,QAAA;AAE9C,QAAA,MAAM,aAAsC,EAAC;AAC7C,QAAA,IAAI,KAAA,KAAU,KAAA,CAAA,EAAW,UAAA,CAAW,KAAA,GAAQ,KAAA;AAC5C,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,UAAA,CAAW,MAAA,GAAS,MAAA;AAE9C,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAAoC,cAAA,EAAgB;AAAA,UACvF,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,KAAA,CAAA;AAAA,UAClD,YAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,KAAA;AAAA,SAC/D,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,KAAK,aAAa,CAAA;AAAA,MACtC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,kCAAA,EAAoC,EAAE,OAAO,CAAA;AAC9D,QAAA,OAAO,WAAA;AAAA,UACL,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,aAAa,CAAC,CAAA;AAAA,IACjD;AAAA,MACE,KAAA,EAAO,aAAA;AAAA,MACP,WAAA,EAAa,0BAAA;AAAA,MACb,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAA,CAAE,QAAO,CAAE,QAAA,CAAS,YAAY,CAAA;AAAE,KACvD;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,UAAU,OAAA,CAAiC,WAAA,EAAa,EAAE,EAAA,EAAI,CAAA;AACzF,QAAA,OAAO,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,OAAO,CAAA;AAC7D,QAAA,OAAO,WAAA;AAAA,UACL,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAClF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAAA,IACpD;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,WAAA,EACE,oFAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc,CAAA;AAAA,QACxC,QAAA,EAAUA,KAAA,CACP,IAAA,CAAK,CAAC,cAAA,EAAgB,YAAA,EAAc,qBAAA,EAAuB,YAAA,EAAc,QAAQ,CAAC,CAAA,CAClF,QAAA,CAAS,uBAAuB,CAAA;AAAA,QACnC,IAAA,EAAMA,KAAA,CACH,IAAA,CAAK,CAAC,YAAA,EAAc,KAAK,CAAC,CAAA,CAC1B,QAAA,EAAS,CACT,QAAA,CAAS,gEAAgE,CAAA;AAAA,QAC5E,YAAYA,KAAA,CACT,KAAA;AAAA,UACCA,MAAE,MAAA,CAAO;AAAA,YACP,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gBAAgB,CAAA;AAAA,YAC1C,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iBAAiB,CAAA;AAAA,YAC5C,OAAOA,KAAA,CACJ,KAAA;AAAA,cACCA,MAAE,MAAA,CAAO;AAAA,gBACP,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gBAAgB,CAAA;AAAA,gBACnD,MAAMA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,WAAW,CAAA;AAAA,gBAChD,UAAUA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qBAAqB;AAAA,eAC/D;AAAA,aACH,CACC,QAAA,EAAS,CACT,QAAA,CAAS,eAAe,CAAA;AAAA,YAC3B,KAAKA,KAAA,CACF,KAAA;AAAA,cACCA,MAAE,MAAA,CAAO;AAAA,gBACP,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc,CAAA;AAAA,gBACxC,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,eAAe;AAAA,eAC3C;AAAA,aACH,CACC,QAAA,EAAS,CACT,QAAA,CAAS,uBAAuB,CAAA;AAAA,YACnC,OAAA,EAASA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,8BAA8B,CAAA;AAAA,YAC/E,IAAA,EAAMA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,qBAAqB;AAAA,WACpE;AAAA,SACH,CACC,QAAA,EAAS,CACT,QAAA,CAAS,8DAA8D,CAAA;AAAA,QAC1E,YAAYA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA,QACpE,SAAA,EAAWA,MACR,MAAA,CAAO;AAAA,UACN,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,UAChC,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,UAC9B,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,UACnC,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,SAClC,CAAA,CACA,QAAA,EAAS,CACT,SAAS,0BAA0B,CAAA;AAAA,QACtC,aAAaA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qBAAqB,CAAA;AAAA,QACjE,YAAYA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mCAAmC;AAAA;AAChF,KACF;AAAA,IACA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,KAAM;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAiC,EAAE,IAAA,EAAM,QAAA,EAAS;AACxD,QAAA,IAAI,IAAA,KAAS,KAAA,CAAA,EAAW,KAAA,CAAM,IAAA,GAAO,IAAA;AACrC,QAAA,IAAI,UAAA,KAAe,KAAA,CAAA,EAAW,KAAA,CAAM,UAAA,GAAa,UAAA;AACjD,QAAA,IAAI,UAAA,KAAe,KAAA,CAAA,EAAW,KAAA,CAAM,UAAA,GAAa,UAAA;AACjD,QAAA,IAAI,SAAA,KAAc,KAAA,CAAA,EAAW,KAAA,CAAM,SAAA,GAAY,SAAA;AAC/C,QAAA,IAAI,WAAA,KAAgB,KAAA,CAAA,EAAW,KAAA,CAAM,WAAA,GAAc,WAAA;AACnD,QAAA,IAAI,UAAA,KAAe,KAAA,CAAA,EAAW,KAAA,CAAM,UAAA,GAAa,UAAA;AAEjD,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAAoC,cAAA,EAAgB;AAAA,UACvF;AAAA,SACD,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,KAAK,aAAa,CAAA;AAAA,MACtC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,oCAAA,EAAsC,EAAE,OAAO,CAAA;AAChE,QAAA,OAAO,WAAA;AAAA,UACL,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAAA,IACpD;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,WAAA,EAAa,gDAAA;AAAA,MACb,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAA,CAAE,QAAO,CAAE,QAAA,CAAS,YAAY,CAAA;AAAE,KACvD;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAAoC,cAAA,EAAgB;AAAA,UACvF;AAAA,SACD,CAAA;AACD,QAAA,OAAO,WAAW,EAAE,OAAA,EAAS,KAAK,aAAA,EAAe,SAAA,EAAW,IAAI,CAAA;AAAA,MAClE,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,oCAAA,EAAsC,EAAE,OAAO,CAAA;AAChE,QAAA,OAAO,WAAA;AAAA,UACL,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,cAAc,CAAC,CAAA;AAAA,IAClD;AAAA,MACE,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,yBAAA;AAAA,MACb,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAA,CAAE,QAAO,CAAE,QAAA,CAAS,YAAY,CAAA;AAAE,KACvD;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAAkC,YAAA,EAAc;AAAA,UACnF;AAAA,SACD,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,KAAK,WAAW,CAAA;AAAA,MACpC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,kCAAA,EAAoC,EAAE,OAAO,CAAA;AAC9D,QAAA,OAAO,WAAA;AAAA,UACL,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACnF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,eAAe,CAAC,CAAA;AAAA,IACnD;AAAA,MACE,KAAA,EAAO,eAAA;AAAA,MACP,WAAA,EAAa,0BAAA;AAAA,MACb,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAA,CAAE,QAAO,CAAE,QAAA,CAAS,YAAY,CAAA;AAAE,KACvD;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAAmC,aAAA,EAAe;AAAA,UACrF;AAAA,SACD,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,KAAK,YAAY,CAAA;AAAA,MACrC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,mCAAA,EAAqC,EAAE,OAAO,CAAA;AAC/D,QAAA,OAAO,WAAA;AAAA,UACL,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACpF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAAA,IACpD;AAAA,MACE,KAAA,EAAO,oBAAA;AAAA,MACP,WAAA,EAAa,uCAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,YAAY,CAAA;AAAA,QACpC,iBAAA,EAAmBA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qCAAqC;AAAA;AAC9E,KACF;AAAA,IACA,OAAO,EAAE,EAAA,EAAI,iBAAA,EAAkB,KAAM;AACnC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,kBAAA;AAAA,UACA;AAAA,YACE,EAAA;AAAA,YACA;AAAA;AACF,SACF;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,oCAAA,EAAsC,EAAE,OAAO,CAAA;AAChE,QAAA,OAAO,WAAA;AAAA,UACL,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACzF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAIA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,wBAAwB,CAAC,CAAA;AAAA,IAC5D;AAAA,MACE,KAAA,EAAO,wBAAA;AAAA,MACP,WAAA,EAAa,mEAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,UAAUA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA,QAClE,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC3B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAC9B,KACF;AAAA,IACA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,QAAO,KAAM;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,aAAsC,EAAC;AAC7C,QAAA,IAAI,KAAA,KAAU,KAAA,CAAA,EAAW,UAAA,CAAW,KAAA,GAAQ,KAAA;AAC5C,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,UAAA,CAAW,MAAA,GAAS,MAAA;AAC9C,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,sBAAA;AAAA,UACA;AAAA,YACE,QAAA;AAAA,YACA,YAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,KAAA;AAAA;AAChE,SACF;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,oBAAoB,CAAA;AAAA,MAC7C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,OAAO,CAAA;AAC3D,QAAA,OAAO,WAAA;AAAA,UACL,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,uBAAuB,CAAC,CAAA;AAAA,IAC3D;AAAA,MACE,KAAA,EAAO,sBAAA;AAAA,MACP,WAAA,EAAa,+BAAA;AAAA,MACb,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAA,CAAE,QAAO,CAAE,QAAA,CAAS,aAAa,CAAA;AAAE,KACxD;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,oBAAA;AAAA,UACA,EAAE,EAAA;AAAG,SACP;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,kBAAkB,CAAA;AAAA,MAC3C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,OAAO,CAAA;AAC1D,QAAA,OAAO,WAAA;AAAA,UACL,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACnF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,0BAA0B,CAAC,CAAA;AAAA,IAC9D;AAAA,MACE,KAAA,EAAO,yBAAA;AAAA,MACP,WAAA,EAAa,8CAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,QACf,QAAA,EAAUA,MAAE,IAAA,CAAK;AAAA,UACf,cAAA;AAAA,UACA,YAAA;AAAA,UACA,qBAAA;AAAA,UACA,YAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,QACD,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACjC,SAAA,EAAWA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,QAChC,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAClC,KACF;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,UAAU,WAAA,EAAa,SAAA,EAAW,YAAW,KAAM;AAChE,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAiC,EAAE,IAAA,EAAM,QAAA,EAAS;AACxD,QAAA,IAAI,WAAA,KAAgB,KAAA,CAAA,EAAW,KAAA,CAAM,WAAA,GAAc,WAAA;AACnD,QAAA,IAAI,SAAA,KAAc,KAAA,CAAA,EAAW,KAAA,CAAM,SAAA,GAAY,SAAA;AAC/C,QAAA,IAAI,UAAA,KAAe,KAAA,CAAA,EAAW,KAAA,CAAM,UAAA,GAAa,UAAA;AACjD,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,uBAAA;AAAA,UACA,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,qBAAqB,CAAA;AAAA,MAC9C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,OAAO,CAAA;AAC7D,QAAA,OAAO,WAAA;AAAA,UACL,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACtF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,0BAA0B,CAAC,CAAA;AAAA,IAC9D;AAAA,MACE,KAAA,EAAO,yBAAA;AAAA,MACP,WAAA,EAAa,0CAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,QACb,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC1B,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACjC,SAAA,EAAWA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,QAChC,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAClC,KACF;AAAA,IACA,OAAO,EAAE,EAAA,EAAI,MAAM,WAAA,EAAa,SAAA,EAAW,YAAW,KAAM;AAC1D,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAiC,EAAE,EAAA,EAAG;AAC5C,QAAA,IAAI,IAAA,KAAS,KAAA,CAAA,EAAW,KAAA,CAAM,IAAA,GAAO,IAAA;AACrC,QAAA,IAAI,WAAA,KAAgB,KAAA,CAAA,EAAW,KAAA,CAAM,WAAA,GAAc,WAAA;AACnD,QAAA,IAAI,SAAA,KAAc,KAAA,CAAA,EAAW,KAAA,CAAM,SAAA,GAAY,SAAA;AAC/C,QAAA,IAAI,UAAA,KAAe,KAAA,CAAA,EAAW,KAAA,CAAM,UAAA,GAAa,UAAA;AACjD,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,uBAAA;AAAA,UACA,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,qBAAqB,CAAA;AAAA,MAC9C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,OAAO,CAAA;AAC7D,QAAA,OAAO,WAAA;AAAA,UACL,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACtF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,0BAA0B,CAAC,CAAA;AAAA,IAC9D;AAAA,MACE,KAAA,EAAO,yBAAA;AAAA,MACP,WAAA,EAAa,0CAAA;AAAA,MACb,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAA,CAAE,QAAO;AAAE,KAChC;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,uBAAA;AAAA,UACA,EAAE,EAAA;AAAG,SACP;AACA,QAAA,OAAO,WAAW,EAAE,OAAA,EAAS,KAAK,qBAAA,EAAuB,UAAA,EAAY,IAAI,CAAA;AAAA,MAC3E,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,OAAO,CAAA;AAC7D,QAAA,OAAO,WAAA;AAAA,UACL,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACtF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAIA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,mBAAmB,CAAC,CAAA;AAAA,IACvD;AAAA,MACE,KAAA,EAAO,6BAAA;AAAA,MACP,WAAA,EAAa,+CAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC3B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAC7B,KACF;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAM,KAAM;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,sBAAA;AAAA,UACA,EAAE,OAAO,KAAA;AAAM,SACjB;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,oBAAoB,CAAA;AAAA,MAC7C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,OAAO,CAAA;AACtD,QAAA,OAAO,WAAA;AAAA,UACL,wBAAwB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAChF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAC,CAAA;AAAA,IACtD;AAAA,MACE,KAAA,EAAO,kBAAA;AAAA,MACP,WAAA,EAAa,oCAAA;AAAA,MACb,WAAA,EAAa,EAAE,SAAA,EAAWA,KAAA,CAAE,QAAO;AAAE,KACvC;AAAA,IACA,OAAO,EAAE,SAAA,EAAU,KAAM;AACvB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,gBAAA;AAAA,UACA,EAAE,KAAA,EAAO,EAAE,SAAA,EAAU;AAAE,SACzB;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,cAAc,CAAA;AAAA,MACvC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,OAAO,CAAA;AACrD,QAAA,OAAO,WAAA;AAAA,UACL,uBAAuB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAC/E;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,qBAAqB,CAAC,CAAA;AAAA,IACzD;AAAA,MACE,KAAA,EAAO,oBAAA;AAAA,MACP,WAAA,EAAa,2BAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,QAChB,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAC7B,KACF;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAM,KAAM;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAiC,EAAE,KAAA,EAAM;AAC/C,QAAA,IAAI,KAAA,KAAU,KAAA,CAAA,EAAW,KAAA,CAAM,KAAA,GAAQ,KAAA;AACvC,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,kBAAA;AAAA,UACA,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,OAAO,CAAA;AACxD,QAAA,OAAO,WAAA;AAAA,UACL,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACjF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,qBAAqB,CAAC,CAAA;AAAA,IACzD;AAAA,MACE,KAAA,EAAO,uBAAA;AAAA,MACP,WAAA,EAAa,4BAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,QACpB,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,QAChB,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAC9B,KACF;AAAA,IACA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,QAAO,KAAM;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAiC,EAAE,SAAA,EAAW,KAAA,EAAM;AAC1D,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,KAAA,CAAM,MAAA,GAAS,MAAA;AACzC,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAAiC,WAAA,EAAa;AAAA,UACjF;AAAA,SACD,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,OAAO,CAAA;AACxD,QAAA,OAAO,WAAA;AAAA,UACL,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACjF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,qBAAqB,CAAC,CAAA;AAAA,IACzD;AAAA,MACE,KAAA,EAAO,yBAAA;AAAA,MACP,WAAA,EAAa,8BAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,QACpB,KAAA,EAAOA,MAAE,MAAA;AAAO;AAClB,KACF;AAAA,IACA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAM,KAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAAmC,aAAA,EAAe;AAAA,UACrF,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA;AAAM,SAC3B,CAAA;AACD,QAAA,OAAO,WAAW,EAAE,QAAA,EAAU,KAAK,YAAA,EAAc,SAAA,EAAW,OAAO,CAAA;AAAA,MACrE,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,OAAO,CAAA;AACxD,QAAA,OAAO,WAAA;AAAA,UACL,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACjF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,sBAAsB,CAAC,CAAA;AAAA,IAC1D;AAAA,MACE,KAAA,EAAO,sBAAA;AAAA,MACP,WAAA,EAAa,4CAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,QACpB,MAAA,EAAQA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ;AAAA;AAC5B,KACF;AAAA,IACA,OAAO,EAAE,SAAA,EAAW,MAAA,EAAO,KAAM;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,oBAAA;AAAA,UACA,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,QAAO;AAAE,SACjC;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,kBAAkB,CAAA;AAAA,MAC3C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,OAAO,CAAA;AACzD,QAAA,OAAO,WAAA;AAAA,UACL,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACnF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAIA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,wBAAwB,CAAC,CAAA;AAAA,IAC5D;AAAA,MACE,KAAA,EAAO,4BAAA;AAAA,MACP,WAAA,EAAa,2EAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC5B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC9B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC3B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAC9B,KACF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAO,KAAM;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,SAAkC,EAAC;AACzC,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,MAAA,CAAO,MAAA,GAAS,MAAA;AAC1C,QAAA,IAAI,QAAA,KAAa,KAAA,CAAA,EAAW,MAAA,CAAO,QAAA,GAAW,QAAA;AAC9C,QAAA,MAAM,aAAsC,EAAC;AAC7C,QAAA,IAAI,KAAA,KAAU,KAAA,CAAA,EAAW,UAAA,CAAW,KAAA,GAAQ,KAAA;AAC5C,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,UAAA,CAAW,MAAA,GAAS,MAAA;AAC9C,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,kBAAA;AAAA,UACA;AAAA,YACE,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,KAAA,CAAA;AAAA,YAClD,YAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,KAAA;AAAA;AAChE,SACF;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,OAAO,CAAA;AAC3D,QAAA,OAAO,WAAA;AAAA,UACL,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACzF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,0BAA0B,CAAC,CAAA;AAAA,IAC9D;AAAA,MACE,KAAA,EAAO,oBAAA;AAAA,MACP,WAAA,EAAa,qEAAA;AAAA,MACb,aAAa;AAAC,KAChB;AAAA,IACA,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,kBAAA;AAAA,UACA;AAAC,SACH;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,OAAO,CAAA;AAC7D,QAAA,OAAO,WAAA;AAAA,UACL,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACjF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,sBAAsB,CAAC,CAAA;AAAA,IAC1D;AAAA,MACE,KAAA,EAAO,sBAAA;AAAA,MACP,WAAA,EAAa,kDAAA;AAAA,MACb,aAAa;AAAC,KAChB;AAAA,IACA,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,oBAAA;AAAA,UACA;AAAC,SACH;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,kBAAkB,CAAA;AAAA,MAC3C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,OAAO,CAAA;AACzD,QAAA,OAAO,WAAA;AAAA,UACL,mCAAmC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAC3F;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,wBAAwB,CAAC,CAAA;AAAA,IAC5D;AAAA,MACE,KAAA,EAAO,yBAAA;AAAA,MACP,WAAA,EAAa,oEAAA;AAAA,MACb,aAAa,EAAE,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,UAAS;AAAE,KAC9C;AAAA,IACA,OAAO,EAAE,KAAA,EAAM,KAAM;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,2BAAA;AAAA,UACA,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,wBAAwB,CAAA;AAAA,MACjD,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,OAAO,CAAA;AAC3D,QAAA,OAAO,WAAA;AAAA,UACL,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACnF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,qBAAqB,CAAC,CAAA;AAAA,IACzD;AAAA,MACE,KAAA,EAAO,eAAA;AAAA,MACP,WAAA,EAAa,2DAAA;AAAA,MACb,aAAa;AAAC,KAChB;AAAA,IACA,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,iBAAA;AAAA,UACA;AAAC,SACH;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,eAAe,CAAA;AAAA,MACxC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,OAAO,CAAA;AACxD,QAAA,OAAO,WAAA;AAAA,UACL,wBAAwB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAChF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,oBAAoB,CAAC,CAAA;AAAA,IACxD;AAAA,MACE,KAAA,EAAO,kBAAA;AAAA,MACP,WAAA,EAAa,qCAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,QACb,aAAA,EAAeA,MAAE,MAAA,EAAO;AAAA,QACxB,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACjC,KACF;AAAA,IACA,OAAO,EAAE,EAAA,EAAI,aAAA,EAAe,WAAU,KAAM;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,QAAoC,gBAAA,EAAkB;AAAA,UACzF,EAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,OAAO,UAAA,CAAW,EAAE,IAAA,EAAM,IAAA,CAAK,gBAAgB,CAAA;AAAA,MACjD,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,OAAO,CAAA;AACvD,QAAA,OAAO,WAAA;AAAA,UACL,uBAAuB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAC/E;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,0BAA0B,CAAC,CAAA;AAAA,IAC9D;AAAA,MACE,KAAA,EAAO,oBAAA;AAAA,MACP,WAAA,EAAa,qDAAA;AAAA,MACb,aAAa;AAAC,KAChB;AAAA,IACA,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,kBAAA;AAAA,UACA;AAAC,SACH;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,OAAO,CAAA;AAC7D,QAAA,OAAO,WAAA;AAAA,UACL,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACjF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,0BAA0B,CAAC,CAAA;AAAA,IAC9D;AAAA,MACE,KAAA,EAAO,uBAAA;AAAA,MACP,WAAA,EAAa,wDAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,iBAAA,EAAmBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACvC,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACnC,oBAAA,EAAsBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC1C,yBAAA,EAA2BA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACjD,KACF;AAAA,IACA,OAAO;AAAA,MACL,iBAAA;AAAA,MACA,aAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF,KAAM;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,QAAiC,EAAC;AACxC,QAAA,IAAI,iBAAA,KAAsB,KAAA,CAAA,EAAW,KAAA,CAAM,iBAAA,GAAoB,iBAAA;AAC/D,QAAA,IAAI,aAAA,KAAkB,KAAA,CAAA,EAAW,KAAA,CAAM,aAAA,GAAgB,aAAA;AACvD,QAAA,IAAI,oBAAA,KAAyB,KAAA,CAAA,EAAW,KAAA,CAAM,oBAAA,GAAuB,oBAAA;AACrE,QAAA,IAAI,yBAAA,KAA8B,KAAA,CAAA;AAChC,UAAA,KAAA,CAAM,yBAAA,GAA4B,yBAAA;AACpC,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,qBAAA;AAAA,UACA,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,mBAAmB,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,OAAO,CAAA;AAC7D,QAAA,OAAO,WAAA;AAAA,UACL,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACpF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAIA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,uBAAuB,CAAC,CAAA;AAAA,IAC3D;AAAA,MACE,KAAA,EAAO,2BAAA;AAAA,MACP,WAAA,EAAa,8DAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,QACtB,QAAQA,KAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,QAC9B,kBAAA,EAAoBA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS;AAC3C,KACF;AAAA,IACA,OAAO,EAAE,WAAA,EAAa,MAAA,EAAQ,oBAAmB,KAAM;AACrD,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAiC,EAAE,WAAA,EAAa,MAAA,EAAO;AAC7D,QAAA,IAAI,kBAAA,KAAuB,KAAA,CAAA,EAAW,KAAA,CAAM,kBAAA,GAAqB,kBAAA;AACjE,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,gBAAA;AAAA,UACA,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,eAAe,CAAA;AAAA,MACxC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,OAAO,CAAA;AAC1D,QAAA,OAAO,WAAA;AAAA,UACL,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACpF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,oBAAoB,CAAC,CAAA;AAAA,IACxD;AAAA,MACE,KAAA,EAAO,wBAAA;AAAA,MACP,WAAA,EACE,yFAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,QACtB,KAAA,EAAOA,MAAE,MAAA;AAAO;AAClB,KACF;AAAA,IACA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAM,KAAM;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,sBAAA;AAAA,UACA,EAAE,aAAa,KAAA;AAAM,SACvB;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,mBAAmB,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,OAAO,CAAA;AACvD,QAAA,OAAO,WAAA;AAAA,UACL,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,qBAAqB,CAAC,CAAA;AAAA,IACzD;AAAA,MACE,KAAA,EAAO,0BAAA;AAAA,MACP,WAAA,EAAa,2CAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,QACtB,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC3B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAC9B,KACF;AAAA,IACA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,QAAO,KAAM;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,aAAsC,EAAC;AAC7C,QAAA,IAAI,KAAA,KAAU,KAAA,CAAA,EAAW,UAAA,CAAW,KAAA,GAAQ,KAAA;AAC5C,QAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,UAAA,CAAW,MAAA,GAAS,MAAA;AAC9C,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,wBAAA;AAAA,UACA;AAAA,YACE,WAAA;AAAA,YACA,YAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,KAAA;AAAA;AAChE,SACF;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,qBAAqB,CAAA;AAAA,MAC9C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,OAAO,CAAA;AACxD,QAAA,OAAO,WAAA;AAAA,UACL,+BAA+B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACvF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,mCAAmC,CAAC,CAAA;AAAA,IACvE;AAAA,MACE,KAAA,EAAO,4BAAA;AAAA,MACP,WAAA,EAAa,6EAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,QACpB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,QACpB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,QACf,gBAAA,EAAkBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACxC,KACF;AAAA,IACA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,IAAA,EAAM,kBAAiB,KAAM;AAC1D,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAiC,EAAE,SAAA,EAAW,SAAA,EAAW,IAAA,EAAK;AACpE,QAAA,IAAI,gBAAA,KAAqB,KAAA,CAAA,EAAW,KAAA,CAAM,gBAAA,GAAmB,gBAAA;AAC7D,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,0BAAA;AAAA,UACA,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,uBAAuB,CAAA;AAAA,MAChD,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,0CAAA,EAA4C,EAAE,OAAO,CAAA;AACtE,QAAA,OAAO,WAAA;AAAA,UACL,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACzF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAIA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,uBAAuB,CAAC,CAAA;AAAA,IAC3D;AAAA,MACE,KAAA,EAAO,+BAAA;AAAA,MACP,WAAA,EAAa,wEAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,QACpB,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,QACjB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,QACf,IAAA,EAAMA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,QAC3B,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACrC,KACF;AAAA,IACA,OAAO,EAAE,SAAA,EAAW,QAAQ,IAAA,EAAM,IAAA,EAAM,eAAc,KAAM;AAC1D,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAiC,EAAE,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAK;AACjE,QAAA,IAAI,IAAA,KAAS,KAAA,CAAA,EAAW,KAAA,CAAM,IAAA,GAAO,IAAA;AACrC,QAAA,IAAI,aAAA,KAAkB,KAAA,CAAA,EAAW,KAAA,CAAM,aAAA,GAAgB,aAAA;AACvD,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,qBAAA;AAAA,UACA,EAAE,KAAA;AAAM,SACV;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,mBAAmB,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,OAAO,CAAA;AAC1D,QAAA,OAAO,WAAA;AAAA,UACL,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACpF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAIA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,eAAe,CAAC,CAAA;AAAA,IACnD;AAAA,MACE,KAAA,EAAO,qBAAA;AAAA,MACP,WAAA,EACE,uGAAA;AAAA,MACF,WAAA,EAAa,EAAE,EAAA,EAAIA,KAAA,CAAE,QAAO;AAAE,KAChC;AAAA,IACA,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,UAAU,OAAA,CAAiC,WAAA,EAAa,EAAE,EAAA,EAAI,CAAA;AACzF,QAAA,OAAO,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,EAAE,OAAO,CAAA;AAClD,QAAA,OAAO,WAAA;AAAA,UACL,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACnF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,sBAAsB,CAAC,CAAA;AAAA,IAC1D;AAAA,MACE,KAAA,EAAO,0BAAA;AAAA,MACP,WAAA,EACE,0GAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,QACtB,KAAA,EAAOA,MAAE,MAAA;AAAO;AAClB,KACF;AAAA,IACA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAM,KAAM;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,OAAA;AAAA,UACnC,sBAAA;AAAA,UACA,EAAE,aAAa,KAAA;AAAM,SACvB;AACA,QAAA,OAAO,UAAA,CAAW,KAAK,mBAAmB,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,OAAO,CAAA;AACzD,QAAA,OAAO,WAAA;AAAA,UACL,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACtF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;;;AC5/BA,IAAM,aAAA,GAA2B;AAAA,EAC/B,EAAA,EAAI,SAAA;AAAA,EACJ,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,SAAA;AAAA,EACb,YAAA,EAAc,EAAE,KAAA,EAAO,EAAC,EAAE;AAAA,EAE1B,QAAA,CAAS,QAAmB,GAAA,EAAqC;AAC/D,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAsB;AACnC,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,oBAAA,CAAqB,MAAA,EAAQ,KAAK,KAAK,CAAA;AAEvC,IAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EAC7C;AACF,CAAA;AAEA,IAAO,eAAA,GAAQ","file":"index.cjs","sourcesContent":["/**\n * Error classes for MCP SDK.\n *\n * Modules MUST throw these instead of throwing raw Errors. The registerTool\n * wrapper in result.ts catches and maps them to MCP-protocol-compliant\n * `{ isError: true, content: [...] }` responses.\n *\n * Throwing past the wrapper to the protocol surfaces as JSON-RPC -32603 to\n * the client and is a protocol bug.\n */\n\nexport class McpUserError extends Error {\n public readonly hint: string | undefined;\n\n constructor(message: string, opts?: { hint?: string }) {\n super(message);\n this.name = 'McpUserError';\n this.hint = opts?.hint;\n }\n}\n\nexport class McpAuthError extends McpUserError {\n constructor(message: string, opts?: { hint?: string }) {\n super(message, {\n hint: opts?.hint ?? 'Run the auth_login tool to authenticate.',\n });\n this.name = 'McpAuthError';\n }\n}\n\nexport class McpInternalError extends Error {\n public override readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'McpInternalError';\n this.cause = cause;\n }\n}\n","/**\n * MCP tool result helpers + central handler.\n *\n * Modules NEVER call server.registerTool directly — they use registerTool()\n * from this module so the central try/catch wraps the handler and:\n * - maps thrown McpUserError / McpAuthError / McpInternalError to\n * MCP-protocol-compliant `{ isError: true, content: [...] }` shapes\n * - threads `_meta.progressToken` into ctx.progress for long ops\n * - emits a structured log line on every error\n * - never leaks `cause` from McpInternalError to the client\n *\n * This is the analog of cli-sdk's createProgram() central error handler.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ZodRawShape } from 'zod';\nimport type { McpContext } from './context.js';\nimport { McpAuthError, McpInternalError, McpUserError } from './errors.js';\n\nexport interface ToolTextContent {\n type: 'text';\n text: string;\n [k: string]: unknown;\n}\n\nexport interface ToolResult {\n content: ToolTextContent[];\n isError?: boolean;\n structuredContent?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\nexport interface ToolMeta {\n progressToken?: string | number;\n}\n\n/**\n * Build a successful tool result with JSON content (pretty-printed).\n */\nexport function jsonResult(data: unknown, structured?: Record<string, unknown>): ToolResult {\n const result: ToolResult = {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n if (structured !== undefined) {\n result.structuredContent = structured;\n }\n return result;\n}\n\n/**\n * Build a successful tool result with plain text content.\n */\nexport function textResult(text: string): ToolResult {\n return { content: [{ type: 'text', text }] };\n}\n\n/**\n * Build an error tool result. Honors MCP's `{ isError: true, content }` shape.\n * Optional hint is appended on a new line so the LLM can react.\n */\nexport function errorResult(message: string, hint?: string): ToolResult {\n const text = hint ? `${message}\\n\\nHint: ${hint}` : message;\n return { content: [{ type: 'text', text }], isError: true };\n}\n\nexport interface ToolMetadata {\n title: string;\n description: string;\n inputSchema?: ZodRawShape;\n}\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n ctx: McpContext,\n meta: ToolMeta,\n) => Promise<unknown>;\n\n/**\n * Register a tool with the central error wrapper.\n *\n * The handler returns a plain value or void. The wrapper:\n * - wraps non-undefined returns in jsonResult()\n * - if the value already looks like a ToolResult (has `content`), passes through\n * - catches McpAuthError / McpUserError / McpInternalError / generic Error\n * - logs every error via ctx.logger.error\n */\nexport function registerTool<TArgs extends Record<string, unknown>>(\n server: McpServer,\n ctx: McpContext,\n name: string,\n metadata: ToolMetadata,\n handler: ToolHandler<TArgs>,\n): void {\n const sdkConfig = {\n title: metadata.title,\n description: metadata.description,\n ...(metadata.inputSchema ? { inputSchema: metadata.inputSchema } : {}),\n };\n\n // The MCP SDK's registerTool signature is `(name, config, handler)`. The\n // handler arity depends on whether inputSchema is present (1-arg without,\n // 2-arg with). We accept a unified handler shape and dispatch at runtime.\n // The SDK's typing is strict and conditional on the inputSchema generic;\n // bypass with a cast since runtime acceptance is unconditional.\n const wrapped = async (...callbackArgs: unknown[]): Promise<ToolResult> => {\n const hasArgs = callbackArgs.length === 2;\n const args = (hasArgs ? callbackArgs[0] : {}) as TArgs;\n const extra = (hasArgs ? callbackArgs[1] : callbackArgs[0]) as\n | { _meta?: { progressToken?: string | number } }\n | undefined;\n\n const progressToken = extra?._meta?.progressToken;\n const meta: ToolMeta = progressToken !== undefined ? { progressToken } : {};\n\n try {\n const result = await handler(args, ctx, meta);\n if (isToolResult(result)) return result;\n if (result === undefined) return textResult('OK');\n return jsonResult(result);\n } catch (error) {\n return mapErrorToResult(error, ctx, name);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (server as any).registerTool(name, sdkConfig, wrapped);\n}\n\nfunction isToolResult(value: unknown): value is ToolResult {\n return (\n !!value &&\n typeof value === 'object' &&\n 'content' in value &&\n Array.isArray((value as ToolResult).content)\n );\n}\n\nfunction mapErrorToResult(error: unknown, ctx: McpContext, toolName: string): ToolResult {\n if (error instanceof McpAuthError) {\n ctx.logger.warn(`${toolName}: auth required`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpUserError) {\n ctx.logger.info(`${toolName}: user error`, { message: error.message });\n return errorResult(error.message, error.hint);\n }\n if (error instanceof McpInternalError) {\n ctx.logger.error(`${toolName}: internal error`, {\n message: error.message,\n cause: stringifyCause(error.cause),\n });\n return errorResult(`Internal error in ${toolName}.`);\n }\n const message = error instanceof Error ? error.message : String(error);\n ctx.logger.error(`${toolName}: unhandled error`, { message });\n return errorResult(`${toolName}: ${message}`);\n}\n\nfunction stringifyCause(cause: unknown): string | undefined {\n if (cause === undefined || cause === null) return undefined;\n if (cause instanceof Error) return cause.message;\n try {\n return JSON.stringify(cause);\n } catch {\n return String(cause);\n }\n}\n","/**\n * Tool / resource / prompt naming helpers.\n *\n * Mandatory product prefix avoids collisions when Claude Desktop runs\n * multiple MCP servers concurrently (typical setup is ~6).\n *\n * Tool names are capped at 63 characters — Claude Desktop pre-1.x\n * truncated at 64 in some versions.\n */\n\nimport { McpInternalError } from './errors.js';\n\nconst MAX_TOOL_NAME_LENGTH = 63;\n\nfunction assertSafeName(name: string, kind: 'tool' | 'resource' | 'prompt'): string {\n if (kind === 'tool' && name.length > MAX_TOOL_NAME_LENGTH) {\n throw new McpInternalError(\n `Tool name '${name}' exceeds ${MAX_TOOL_NAME_LENGTH} characters (some MCP clients truncate at 64).`,\n );\n }\n return name;\n}\n\n/**\n * Build a tool name. Format: `<productName>_<...parts>` (snake_case).\n * Example: mcpToolName('vibecontrols', 'vibes', 'list') -> 'vibecontrols_vibes_list'\n */\nexport function mcpToolName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpToolName: productName is required');\n }\n const name = [productName, ...parts].filter(Boolean).join('_');\n return assertSafeName(name, 'tool');\n}\n\n/**\n * Build a resource URI. Format: `<productName>://<...parts>`.\n * Example: mcpResourceUri('vibecontrols', 'schema') -> 'vibecontrols://schema'\n */\nexport function mcpResourceUri(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpResourceUri: productName is required');\n }\n return `${productName}://${parts.filter(Boolean).join('/')}`;\n}\n\n/**\n * Build a prompt name. Format: `<productName>-<...parts>` (kebab-case).\n * Example: mcpPromptName('vibecontrols', 'setup') -> 'vibecontrols-setup'\n */\nexport function mcpPromptName(productName: string, ...parts: string[]): string {\n if (!productName) {\n throw new McpInternalError('mcpPromptName: productName is required');\n }\n return [productName, ...parts].filter(Boolean).join('-');\n}\n\nexport const TOOL_NAME_LIMIT = MAX_TOOL_NAME_LENGTH;\n","/**\n * Centralized GraphQL operations for the VibeControls MCP server.\n * Adapted from vibecontrols-cli/src/graphql/operations.ts with superset field selections.\n * Uses template string interpolation pattern (not gql tagged fragments).\n */\n\n// ---------------------------------------------------------------------------\n// Field Fragments (template string constants for interpolation)\n// ---------------------------------------------------------------------------\n\nexport const AGENT_FIELDS = `\n id name hostname platform architecture version\n tunnelUrl tunnelStatus apiUrl agentApiKey appId appClientId\n capabilities configuration isActive lastHeartbeat metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const VIBE_FIELDS = `\n id name description path type status agentId parentId\n gitBranch gitRemote gitStatus environmentVariables tags metadata\n workspaceId archivedAt createdAt updatedAt deletedAt\n`;\n\nexport const SESSION_FIELDS = `\n id name command workingDirectory type status agentId vibeId\n providerSessionName providerWindowId providerPaneId pid exitCode ttydUrl lastOutput\n autoStart environmentVariables metadata startedAt stoppedAt\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const NOTE_FIELDS = `\n id title content tags isPinned vibeId createdBy metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const CONFIG_FIELDS = `\n id key value scope scopeId isSecret\n workspaceId createdAt updatedAt\n`;\n\nexport const WEBHOOK_FIELDS = `\n id name url events agentIds isActive signingKey retryPolicy\n deliveryCount failureCount lastDelivery lastError\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const UI_SESSION_FIELDS = `\n id userId state activeVibeId activeSessionId\n recentVibes recentSessions workspaceId createdAt updatedAt\n`;\n\nexport const TUNNEL_FIELDS = `\n id workspaceId agentId slug name description\n providerKey protocol localHost localPort tlsMode\n status lastError hasBasicAuth basicAuthUser\n primaryDomain { id hostname type verificationStatus isPrimary }\n startedAt stoppedAt createdAt updatedAt\n`;\n\nexport const TUNNEL_DOMAIN_FIELDS_MCP = `\n id workspaceId tunnelId type hostname environment\n verificationStatus challengeRecordName challengeToken\n verifiedAt lastCheckedAt lastCheckError isPrimary\n dnsTargetHint createdAt updatedAt\n`;\n\nexport const TUNNEL_PROVIDER_FIELDS_MCP = `\n id key displayName description isEnabled pluginPackage minAgentVersion\n capabilities {\n platforms supportedVisibilities\n supportsCustomDomains supportsHttp supportsHttps supportsLiveLogs\n supportsManagedSubdomains supportsReservedSubdomain supportsRotateCredentials\n supportsSessionTokens supportsTcp supportsUdp supportsUsageMetrics\n }\n createdAt updatedAt\n`;\n\nexport const TUNNEL_SESSION_FIELDS_MCP = `\n id workspaceId tunnelId shardId agentId status\n tokenFingerprint issuedAt expiresAt connectedAt disconnectedAt\n revokedAt revokedReason clientIp bytesIn bytesOut\n`;\n\nexport const TUNNEL_SHARD_FIELDS_MCP = `\n id name providerId environment publicHost controlPort proxyPortRange\n region status capacity currentLoad metadata createdAt updatedAt\n`;\n\nexport const TARGET_FIELDS = `\n id name type host port username status\n workspaceId createdAt updatedAt\n`;\n\nexport const AGENT_CONNECTION_FIELDS = `\n id sourceAgentId targetId protocol status permissions\n createdAt updatedAt\n`;\n\nexport const VIBEDECK_FIELDS = `\n id name description isDefault\n workspaceId createdAt updatedAt\n`;\n\nexport const VIBEDECK_BUTTON_FIELDS = `\n id vibeDeckId label icon actionType actionId\n action { id name actionType }\n command script webhookUrl\n row column color category tags\n confirmationRequired keyboardShortcut style sortOrder\n createdAt updatedAt\n`;\n\nexport const AI_TOOL_EVENT_FIELDS = `\n id source eventType payload agentId\n workspaceId createdAt\n`;\n\nexport const DOCS_SITE_FIELDS = `\n id vibeId name visibility runtime\n workspaceId createdAt updatedAt\n`;\n\nexport const DOCS_PAGE_FIELDS = `\n id siteId title slug content parentId sidebarPosition status\n createdAt updatedAt\n`;\n\nexport const DOCS_REVISION_FIELDS = `\n id siteId revisionNumber status buildDurationMs artifactSizeBytes\n errorMessage publishedAt\n createdAt updatedAt\n`;\n\nexport const AUDIT_LOG_FIELDS = `\n id action resourceType resourceId actorId actorType\n status description ipAddress userAgent requestId\n workspaceId createdAt\n`;\n\nexport const SESSION_SHARE_FIELDS = `\n id sessionId sharedWithId permission status message\n createdBy createdAt expiresAt lastAccessAt accessCount revokedAt revokedBy\n`;\n\nexport const SESSION_SHARE_LINK_FIELDS = `\n id sessionId token permission expiresAt\n createdAt\n`;\n\n// ---------------------------------------------------------------------------\n// Agent Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENTS = `\n query VibecontrolsAgents($filter: VibecontrolsAgentFilterInput) {\n vibecontrolsAgents(filter: $filter) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const GET_AGENT = `\n query VibecontrolsAgent($id: ID!) {\n vibecontrolsAgent(id: $id) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const CREATE_AGENT = `\n mutation CreateVibecontrolsAgent($input: CreateVibecontrolsAgentInput!) {\n createVibecontrolsAgent(input: $input) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const UPDATE_AGENT = `\n mutation UpdateVibecontrolsAgent($id: ID!, $input: UpdateVibecontrolsAgentInput!) {\n updateVibecontrolsAgent(id: $id, input: $input) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const DELETE_AGENT = `\n mutation DeleteVibecontrolsAgent($id: ID!) {\n deleteVibecontrolsAgent(id: $id)\n }\n`;\n\nexport const PROBE_AGENT_CONNECTION = `\n query ProbeAgentConnection($id: ID!) {\n probeAgentConnection(id: $id) {\n agentId reachable latencyMs error version tunnelUrl\n }\n }\n`;\n\nexport const AGENT_HEALTH_PROBES = `\n query VibecontrolsAgentHealthProbes {\n vibecontrolsAgentHealthProbes {\n agentId agentName healthy agentVersion errorMessage tunnelUrl uptime\n }\n }\n`;\n\nexport const AGENT_PLUGINS = `\n query AgentPlugins($agentId: ID!) {\n agentPlugins(agentId: $agentId) {\n agentId\n plugins {\n name packageName version description isActive tags metadata\n }\n total\n }\n }\n`;\n\nexport const INSTALL_AGENT_PLUGIN = `\n mutation InstallAgentPlugin($agentId: ID!, $packageName: String!) {\n installAgentPlugin(agentId: $agentId, packageName: $packageName) {\n success message\n plugin { name packageName version description isActive tags metadata }\n }\n }\n`;\n\nexport const REMOVE_AGENT_PLUGIN = `\n mutation RemoveAgentPlugin($agentId: ID!, $packageName: String!) {\n removeAgentPlugin(agentId: $agentId, packageName: $packageName) {\n success message\n plugin { name packageName version description isActive tags metadata }\n }\n }\n`;\n\nexport const AGENT_HEARTBEAT = `\n mutation VibecontrolsAgentHeartbeat($id: ID!) {\n vibecontrolsAgentHeartbeat(id: $id) { id isActive lastHeartbeat }\n }\n`;\n\nexport const DEACTIVATE_AGENT = `\n mutation DeactivateVibecontrolsAgent($id: ID!) {\n deactivateVibecontrolsAgent(id: $id) { ${AGENT_FIELDS} }\n }\n`;\n\nexport const AGENT_GRAPH = `\n query AgentGraph($workspaceId: ID!, $rootAgentId: ID) {\n agentGraph(workspaceId: $workspaceId, rootAgentId: $rootAgentId) {\n agents { ${AGENT_FIELDS} }\n connections { ${AGENT_CONNECTION_FIELDS} }\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Vibe Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_VIBES = `\n query Vibes($filter: VibeFilterInput, $pagination: PaginationInput) {\n vibes(filter: $filter, pagination: $pagination) {\n items { ${VIBE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBE = `\n query Vibe($id: ID!) {\n vibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBE = `\n mutation CreateVibe($input: CreateVibeInput!) {\n createVibe(input: $input) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE = `\n mutation UpdateVibe($id: ID!, $input: UpdateVibeInput!) {\n updateVibe(id: $id, input: $input) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBE = `\n mutation DeleteVibe($id: ID!) { deleteVibe(id: $id) }\n`;\n\nexport const ARCHIVE_VIBE = `\n mutation ArchiveVibe($id: ID!) {\n archiveVibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const RESTORE_VIBE = `\n mutation RestoreVibe($id: ID!) {\n restoreVibe(id: $id) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const MOVE_VIBE = `\n mutation MoveVibe($id: ID!, $newParentId: ID) {\n moveVibe(id: $id, newParentId: $newParentId) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE_STATUS = `\n mutation UpdateVibeStatus($id: ID!, $status: VibeStatus!) {\n updateVibeStatus(id: $id, status: $status) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const VIBE_HIERARCHY = `\n query VibeHierarchy($rootId: ID) {\n vibeHierarchy(rootId: $rootId) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const SEARCH_VIBES = `\n query SearchVibes($query: String!, $limit: Int) {\n searchVibes(query: $query, limit: $limit) { ${VIBE_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE_GIT = `\n mutation UpdateVibeGit($id: ID!, $gitBranch: String, $gitRemote: String, $gitStatus: JSON) {\n updateVibeGit(id: $id, gitBranch: $gitBranch, gitRemote: $gitRemote, gitStatus: $gitStatus) {\n ${VIBE_FIELDS}\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Session Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_SESSIONS = `\n query Sessions($filter: SessionFilterInput, $pagination: PaginationInput) {\n sessions(filter: $filter, pagination: $pagination) {\n items { ${SESSION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_SESSION = `\n query Session($id: ID!) {\n session(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const CREATE_SESSION = `\n mutation CreateSession($input: CreateSessionInput!) {\n createSession(input: $input) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const START_SESSION = `\n mutation StartSession($id: ID!) {\n startSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const STOP_SESSION = `\n mutation StopSession($id: ID!) {\n stopSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const RESTART_SESSION = `\n mutation RestartSession($id: ID!) {\n restartSession(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const TERMINATE_SESSION = `\n mutation TerminateSession($id: ID!) {\n terminateSession(id: $id)\n }\n`;\n\nexport const SEND_SESSION_INPUT = `\n mutation SendSessionInput($id: ID!, $input: String!) {\n sendSessionInput(id: $id, input: $input)\n }\n`;\n\nexport const START_SESSION_TERMINAL = `\n mutation StartSessionTerminal($id: ID!) {\n startSessionTerminal(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const SESSION_OUTPUT = `\n query SessionOutput($id: ID!, $lines: Int) {\n sessionOutput(id: $id, lines: $lines)\n }\n`;\n\nexport const ACTIVE_SESSIONS = `\n query ActiveSessions($vibeId: ID) {\n activeSessions(vibeId: $vibeId) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const CHECK_SESSION_HEALTH = `\n mutation CheckSessionHealth {\n checkSessionHealth { checked updated errors }\n }\n`;\n\nexport const BULK_RESTART_SESSIONS = `\n mutation BulkRestartSessions($ids: [ID!]!) {\n bulkRestartSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const BULK_STOP_SESSIONS = `\n mutation BulkStopSessions($ids: [ID!]!) {\n bulkStopSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const BULK_TERMINATE_SESSIONS = `\n mutation BulkTerminateSessions($ids: [ID!]!) {\n bulkTerminateSessions(ids: $ids) { succeeded failed }\n }\n`;\n\nexport const UPDATE_SESSION = `\n mutation UpdateSession($id: ID!, $input: UpdateSessionInput!) {\n updateSession(id: $id, input: $input) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const UPDATE_SESSION_STATUS = `\n mutation UpdateSessionStatus($id: ID!, $status: VibecontrolsSessionStatus!) {\n updateSessionStatus(id: $id, status: $status) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const DELETE_SESSION = `\n mutation DeleteSession($id: ID!) { deleteSession(id: $id) }\n`;\n\nexport const KILL_SESSION = `\n mutation KillSession($id: ID!) { killSession(id: $id) }\n`;\n\n// ---------------------------------------------------------------------------\n// Session Sharing Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const SHARE_SESSION = `\n mutation ShareSession($input: ShareSessionInput!) {\n shareSession(input: $input) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const CREATE_SESSION_SHARE_LINK = `\n mutation CreateSessionShareLink($input: CreateSessionShareLinkInput!) {\n createSessionShareLink(input: $input) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const REVOKE_SESSION_SHARE = `\n mutation RevokeSessionShare($id: ID!) {\n revokeSessionShare(id: $id) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const REVOKE_SESSION_SHARE_LINK = `\n mutation RevokeSessionShareLink($id: ID!) {\n revokeSessionShareLink(id: $id) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const SESSION_SHARES = `\n query SessionShares($sessionId: ID!) {\n sessionShares(sessionId: $sessionId) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const SESSION_SHARE_LINKS = `\n query SessionShareLinks($sessionId: ID!) {\n sessionShareLinks(sessionId: $sessionId) { ${SESSION_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const SESSION_COLLABORATORS = `\n query SessionCollaborators($sessionId: ID!) {\n sessionCollaborators(sessionId: $sessionId) { userId hasControl joinedAt }\n }\n`;\n\nexport const SESSIONS_SHARED_WITH_ME = `\n query SessionsSharedWithMe($filter: SharedWithMeFilterInput, $pagination: PaginationInput) {\n sessionsSharedWithMe(filter: $filter, pagination: $pagination) {\n totalCount\n edges {\n cursor\n node { ${SESSION_SHARE_FIELDS} }\n }\n }\n }\n`;\n\nexport const UPDATE_SESSION_SHARE = `\n mutation UpdateSessionShare($id: ID!, $input: UpdateSessionShareInput!) {\n updateSessionShare(id: $id, input: $input) { ${SESSION_SHARE_FIELDS} }\n }\n`;\n\nexport const JOIN_SHARED_SESSION = `\n mutation JoinSharedSession($input: JoinSessionInput!) {\n joinSharedSession(input: $input) { id userId hasControl joinedAt role }\n }\n`;\n\nexport const LEAVE_SHARED_SESSION = `\n mutation LeaveSharedSession($sessionId: ID!) { leaveSharedSession(sessionId: $sessionId) }\n`;\n\nexport const REQUEST_SESSION_CONTROL = `\n mutation RequestSessionControl($sessionId: ID!) { requestSessionControl(sessionId: $sessionId) }\n`;\n\nexport const RELEASE_SESSION_CONTROL = `\n mutation ReleaseSessionControl($sessionId: ID!) { releaseSessionControl(sessionId: $sessionId) }\n`;\n\nexport const TRANSFER_SESSION_CONTROL = `\n mutation TransferSessionControl($sessionId: ID!, $toUserId: ID!) {\n transferSessionControl(sessionId: $sessionId, toUserId: $toUserId)\n }\n`;\n\nexport const STOP_SESSION_TERMINAL = `\n mutation StopSessionTerminal($id: ID!) {\n stopSessionTerminal(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const RESTART_SESSION_TERMINAL = `\n mutation RestartSessionTerminal($id: ID!) {\n restartSessionTerminal(id: $id) { ${SESSION_FIELDS} }\n }\n`;\n\nexport const START_TARGET_TERMINAL = `\n mutation StartTerminal($targetId: ID!, $shell: String) {\n startTerminal(targetId: $targetId, shell: $shell) {\n connectionId sessionId status host localPort remotePort ttydUrl\n }\n }\n`;\n\nexport const STOP_TARGET_TERMINAL = `\n mutation StopTerminal($sessionId: ID!) { stopTerminal(sessionId: $sessionId) }\n`;\n\nexport const EXPORT_SESSIONS = `\n mutation ExportSessions($input: SessionExportInput!) {\n exportSessions(input: $input) { count data format generatedAt }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// AI Prompts\n// ---------------------------------------------------------------------------\n\nexport const AI_PROMPT_FIELDS = `\n id name description content category status isShared\n tags variables metadata createdBy onBehalfOf updatedBy\n workspaceId usageCount lastUsedAt\n createdAt updatedAt deletedAt\n`;\n\nexport const LIST_AI_PROMPTS = `\n query AiPrompts($filter: AIPromptFilterInput, $pagination: PaginationInput) {\n aiPrompts(filter: $filter, pagination: $pagination) {\n items { ${AI_PROMPT_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_AI_PROMPT = `\n query AiPrompt($id: ID!) { aiPrompt(id: $id) { ${AI_PROMPT_FIELDS} } }\n`;\n\nexport const CREATE_AI_PROMPT = `\n mutation CreateAIPrompt($input: CreateAIPromptInput!) {\n createAIPrompt(input: $input) { ${AI_PROMPT_FIELDS} }\n }\n`;\n\nexport const UPDATE_AI_PROMPT = `\n mutation UpdateAIPrompt($id: ID!, $input: UpdateAIPromptInput!) {\n updateAIPrompt(id: $id, input: $input) { ${AI_PROMPT_FIELDS} }\n }\n`;\n\nexport const DELETE_AI_PROMPT = `\n mutation DeleteAIPrompt($id: ID!) { deleteAIPrompt(id: $id) }\n`;\n\nexport const DUPLICATE_AI_PROMPT = `\n mutation DuplicateAIPrompt($id: ID!, $name: String!) {\n duplicateAIPrompt(id: $id, name: $name) { ${AI_PROMPT_FIELDS} }\n }\n`;\n\nexport const RENDER_AI_PROMPT = `\n mutation RenderAIPrompt($id: ID!, $variables: JSON) {\n renderAIPrompt(id: $id, variables: $variables) { promptId rendered }\n }\n`;\n\nexport const RECORD_AI_PROMPT_USAGE = `\n mutation RecordAIPromptUsage($id: ID!) {\n recordAIPromptUsage(id: $id) { ${AI_PROMPT_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// VibeDeck share-links\n// ---------------------------------------------------------------------------\n\nexport const VIBE_DECK_SHARE_LINK_FIELDS = `\n id vibeDeckId token shareUrl name permission status visibility\n hasPassword allowIframe maxUses useCount expiresAt lastUsedAt\n createdBy createdAt\n`;\n\nexport const LIST_VIBE_DECK_SHARE_LINKS = `\n query VibeDeckShareLinks($vibeDeckId: ID!) {\n vibeDeckShareLinks(vibeDeckId: $vibeDeckId) { ${VIBE_DECK_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBE_DECK_SHARE_LINK = `\n mutation CreateVibeDeckShareLink($input: CreateVibeDeckShareLinkInput!) {\n createVibeDeckShareLink(input: $input) { ${VIBE_DECK_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBE_DECK_SHARE_LINK = `\n mutation UpdateVibeDeckShareLink($id: ID!, $input: UpdateVibeDeckShareLinkInput!) {\n updateVibeDeckShareLink(id: $id, input: $input) { ${VIBE_DECK_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const REVOKE_VIBE_DECK_SHARE_LINK = `\n mutation RevokeVibeDeckShareLink($id: ID!) {\n revokeVibeDeckShareLink(id: $id) { ${VIBE_DECK_SHARE_LINK_FIELDS} }\n }\n`;\n\nexport const VALIDATE_VIBE_DECK_SHARE_LINK = `\n query ValidateVibeDeckShareLink($token: String!) {\n validateVibeDeckShareLink(token: $token) {\n isValid error requiresPassword permission allowIframe\n expiresAt vibeDeckId vibeDeckName ownerName\n }\n }\n`;\n\nexport const SHARED_VIBE_DECK = `\n query SharedVibeDeck($token: String!, $password: String) {\n sharedVibeDeck(token: $token, password: $password) {\n id name description icon buttonSize colorTheme gridColumns gridRows\n permission\n buttons { id label actionType row column rowSpan colSpan icon color category confirmationRequired }\n }\n }\n`;\n\nexport const EXECUTE_SHARED_VIBE_DECK_BUTTON = `\n mutation ExecuteSharedVibeDeckButton($token: String!, $buttonId: ID!, $password: String) {\n executeSharedVibeDeckButton(token: $token, buttonId: $buttonId, password: $password) {\n success output error\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Note Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_NOTES = `\n query Notes($filter: VibecontrolsNoteFilterInput, $pagination: PaginationInput) {\n notes(filter: $filter, pagination: $pagination) {\n items { ${NOTE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_NOTE = `\n query Note($id: ID!) {\n note(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const CREATE_NOTE = `\n mutation CreateNote($input: CreateVibecontrolsNoteInput!) {\n createNote(input: $input) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const UPDATE_NOTE = `\n mutation UpdateNote($id: ID!, $input: UpdateVibecontrolsNoteInput!) {\n updateNote(id: $id, input: $input) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const DELETE_NOTE = `\n mutation DeleteNote($id: ID!) { deleteNote(id: $id) }\n`;\n\nexport const SEARCH_NOTES = `\n query SearchNotes($query: String!, $vibeId: ID, $limit: Int) {\n searchNotes(query: $query, vibeId: $vibeId, limit: $limit) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const PIN_NOTE = `\n mutation PinNote($id: ID!) {\n pinNote(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const UNPIN_NOTE = `\n mutation UnpinNote($id: ID!) {\n unpinNote(id: $id) { ${NOTE_FIELDS} }\n }\n`;\n\nexport const PINNED_NOTES = `\n query PinnedNotes($vibeId: ID) {\n pinnedNotes(vibeId: $vibeId) { ${NOTE_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_CONFIGURATIONS = `\n query Configurations($filter: ConfigurationFilterInput!, $pagination: PaginationInput) {\n configurations(filter: $filter, pagination: $pagination) {\n items { ${CONFIG_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_CONFIGURATION = `\n query Configuration($key: String!, $scope: ConfigScope!, $scopeId: String) {\n configuration(key: $key, scope: $scope, scopeId: $scopeId) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const CONFIGURATIONS_BY_SCOPE = `\n query ConfigurationsByScope($scope: ConfigScope!, $scopeId: String) {\n configurationsByScope(scope: $scope, scopeId: $scopeId) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const SET_CONFIGURATION = `\n mutation SetConfiguration($key: String!, $scope: ConfigScope!, $scopeId: ID, $value: JSON!, $isSecret: Boolean) {\n setConfiguration(key: $key, scope: $scope, scopeId: $scopeId, value: $value, isSecret: $isSecret) { ${CONFIG_FIELDS} }\n }\n`;\n\nexport const DELETE_CONFIGURATION = `\n mutation DeleteConfiguration($key: String!, $scope: ConfigScope!, $scopeId: String) {\n deleteConfiguration(key: $key, scope: $scope, scopeId: $scopeId)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Webhook Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_WEBHOOKS = `\n query Webhooks($filter: WebhookFilterInput, $pagination: PaginationInput) {\n webhooks(filter: $filter, pagination: $pagination) {\n items { ${WEBHOOK_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_WEBHOOK = `\n query Webhook($id: ID!) {\n webhook(id: $id) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const CREATE_WEBHOOK = `\n mutation CreateWebhook($input: CreateWebhookInput!) {\n createWebhook(input: $input) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const UPDATE_WEBHOOK = `\n mutation UpdateWebhook($id: ID!, $input: UpdateWebhookInput!) {\n updateWebhook(id: $id, input: $input) { ${WEBHOOK_FIELDS} }\n }\n`;\n\nexport const DELETE_WEBHOOK = `\n mutation DeleteWebhook($id: ID!) { deleteWebhook(id: $id) }\n`;\n\nexport const TEST_WEBHOOK = `\n mutation TestWebhook($id: ID!) { testWebhook(id: $id) }\n`;\n\nexport const TRIGGER_WEBHOOK = `\n mutation TriggerWebhook($id: ID!, $payload: JSON) {\n triggerWebhook(id: $id, payload: $payload)\n }\n`;\n\nexport const RESET_WEBHOOK_FAILURES = `\n mutation ResetWebhookFailures($id: ID!) {\n resetWebhookFailures(id: $id) { ${WEBHOOK_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Tunnel Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_TUNNELS = `\n query Tunnels($filter: TunnelFilterInput, $pagination: PaginationInput) {\n tunnels(filter: $filter, pagination: $pagination) {\n items { ${TUNNEL_FIELDS} }\n total\n hasMore\n }\n }\n`;\n\nexport const GET_TUNNEL = `\n query Tunnel($id: ID!) { tunnel(id: $id) { ${TUNNEL_FIELDS} } }\n`;\n\nexport const GET_TUNNEL_BY_SLUG = `\n query TunnelBySlug($slug: String!) {\n tunnelBySlug(slug: $slug) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const CREATE_TUNNEL = `\n mutation CreateTunnel($input: CreateTunnelInput!) {\n createTunnel(input: $input) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const UPDATE_TUNNEL = `\n mutation UpdateTunnel($id: ID!, $input: UpdateTunnelInput!) {\n updateTunnel(id: $id, input: $input) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const START_TUNNEL = `\n mutation StartTunnel($id: ID!) { startTunnel(id: $id) { ${TUNNEL_FIELDS} } }\n`;\n\nexport const STOP_TUNNEL = `\n mutation StopTunnel($id: ID!) { stopTunnel(id: $id) { ${TUNNEL_FIELDS} } }\n`;\n\nexport const DELETE_TUNNEL = `\n mutation DeleteTunnel($id: ID!) { deleteTunnel(id: $id) }\n`;\n\nexport const ROTATE_TUNNEL_CREDENTIALS = `\n mutation RotateTunnelCredentials($id: ID!) {\n rotateTunnelCredentials(id: $id) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const ISSUE_TUNNEL_SESSION = `\n mutation IssueTunnelSession($tunnelId: ID!, $ttlSeconds: Int) {\n issueTunnelSession(tunnelId: $tunnelId, ttlSeconds: $ttlSeconds) {\n session { ${TUNNEL_SESSION_FIELDS_MCP} }\n token\n agentConfigHint\n }\n }\n`;\n\nexport const REVOKE_TUNNEL_SESSION = `\n mutation RevokeTunnelSession($sessionId: ID!, $reason: String) {\n revokeTunnelSession(sessionId: $sessionId, reason: $reason)\n }\n`;\n\nexport const LIST_TUNNEL_SESSIONS = `\n query TunnelSessions($tunnelId: ID!, $pagination: PaginationInput) {\n tunnelSessions(tunnelId: $tunnelId, pagination: $pagination) {\n items { ${TUNNEL_SESSION_FIELDS_MCP} }\n total\n hasMore\n }\n }\n`;\n\nexport const LIST_TUNNEL_PROVIDERS = `\n query TunnelProviders { tunnelProviders { ${TUNNEL_PROVIDER_FIELDS_MCP} } }\n`;\n\nexport const GET_TUNNEL_PROVIDER = `\n query TunnelProvider($key: TunnelProviderKey!) {\n tunnelProvider(key: $key) { ${TUNNEL_PROVIDER_FIELDS_MCP} }\n }\n`;\n\nexport const LIST_TUNNEL_SHARDS = `\n query TunnelShards($environment: TunnelEnvironment) {\n tunnelShards(environment: $environment) { ${TUNNEL_SHARD_FIELDS_MCP} }\n }\n`;\n\nexport const TUNNEL_USAGE = `\n query TunnelUsage($tunnelId: ID!, $from: DateTime!, $to: DateTime!) {\n tunnelUsage(tunnelId: $tunnelId, from: $from, to: $to) {\n tunnelId hourBucket bytesIn bytesOut connections requests\n }\n }\n`;\n\nexport const TUNNEL_AUDIT = `\n query TunnelAudit($tunnelId: ID!, $pagination: PaginationInput) {\n tunnelAudit(tunnelId: $tunnelId, pagination: $pagination) {\n items {\n id action resourceType resourceId actorId actorType\n status description ipAddress userAgent requestId\n workspaceId createdAt\n }\n total\n hasMore\n }\n }\n`;\n\nexport const LIST_TUNNEL_DOMAINS = `\n query TunnelDomains($tunnelId: ID, $filter: TunnelDomainFilterInput, $pagination: PaginationInput) {\n tunnelDomains(tunnelId: $tunnelId, filter: $filter, pagination: $pagination) {\n items { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n total\n hasMore\n }\n }\n`;\n\nexport const GET_TUNNEL_DOMAIN = `\n query TunnelDomain($id: ID!) {\n tunnelDomain(id: $id) { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n }\n`;\n\nexport const RESERVE_TUNNEL_SUBDOMAIN = `\n mutation ReserveTunnelSubdomain($input: ReserveTunnelSubdomainInput!) {\n reserveTunnelSubdomain(input: $input) { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n }\n`;\n\nexport const REGISTER_CUSTOM_TUNNEL_DOMAIN = `\n mutation RegisterCustomTunnelDomain($input: RegisterCustomDomainInput!) {\n registerCustomTunnelDomain(input: $input) { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n }\n`;\n\nexport const VERIFY_TUNNEL_DOMAIN = `\n mutation VerifyTunnelDomain($domainId: ID!) {\n verifyTunnelDomain(domainId: $domainId) { ${TUNNEL_DOMAIN_FIELDS_MCP} }\n }\n`;\n\nexport const ATTACH_TUNNEL_DOMAIN = `\n mutation AttachTunnelDomain($tunnelId: ID!, $domainId: ID!, $makePrimary: Boolean) {\n attachTunnelDomain(tunnelId: $tunnelId, domainId: $domainId, makePrimary: $makePrimary) {\n ${TUNNEL_FIELDS}\n }\n }\n`;\n\nexport const DETACH_TUNNEL_DOMAIN = `\n mutation DetachTunnelDomain($tunnelId: ID!, $domainId: ID!) {\n detachTunnelDomain(tunnelId: $tunnelId, domainId: $domainId) { ${TUNNEL_FIELDS} }\n }\n`;\n\nexport const DELETE_TUNNEL_DOMAIN = `\n mutation DeleteTunnelDomain($domainId: ID!) {\n deleteTunnelDomain(domainId: $domainId)\n }\n`;\n\nexport const PROBE_AGENT_TUNNEL = `\n query ProbeAgentTunnel($url: String!, $agentApiKey: String) {\n probeAgentTunnel(url: $url, agentApiKey: $agentApiKey) {\n agentId reachable latencyMs error version tunnelUrl\n }\n }\n`;\n\nexport const ADD_AGENT_FROM_TUNNEL = `\n mutation AddVibecontrolsAgentFromTunnel($input: AddAgentFromTunnelInput!) {\n addVibecontrolsAgentFromTunnel(input: $input) {\n success clientId clientSecret devportalApplicationId error\n agent { id name workspaceId isActive }\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// UI Session Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const GET_UI_SESSION = `\n query { uiSession { ${UI_SESSION_FIELDS} } }\n`;\n\nexport const SAVE_UI_SESSION = `\n mutation SaveUISession($input: SaveUISessionInput!) {\n saveUISession(input: $input) { ${UI_SESSION_FIELDS} }\n }\n`;\n\nexport const CLEAR_UI_SESSION = `\n mutation { clearUISession }\n`;\n\n// ---------------------------------------------------------------------------\n// AI Tool Event Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AI_TOOL_EVENTS = `\n query AiToolEvents($filter: AiToolEventFilterInput, $pagination: PaginationInput) {\n aiToolEvents(filter: $filter, pagination: $pagination) {\n items { ${AI_TOOL_EVENT_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const RECENT_AI_TOOL_EVENTS = `\n query RecentAiToolEvents($agentId: ID!, $limit: Int) {\n recentAiToolEvents(agentId: $agentId, limit: $limit) { ${AI_TOOL_EVENT_FIELDS} }\n }\n`;\n\nexport const CREATE_AI_TOOL_EVENT = `\n mutation CreateAiToolEvent($input: CreateAiToolEventInput!) {\n createAiToolEvent(input: $input) { ${AI_TOOL_EVENT_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Target Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_TARGETS = `\n query Targets($workspaceId: ID!, $filter: TargetFilterInput, $limit: Int, $offset: Int) {\n targets(workspaceId: $workspaceId, filter: $filter, limit: $limit, offset: $offset) {\n items { ${TARGET_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_TARGET = `\n query Target($id: ID!) {\n target(id: $id) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const CREATE_TARGET = `\n mutation CreateTarget($workspaceId: ID!, $input: CreateTargetInput!) {\n createTarget(workspaceId: $workspaceId, input: $input) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const UPDATE_TARGET = `\n mutation UpdateTarget($id: ID!, $input: UpdateTargetInput!) {\n updateTarget(id: $id, input: $input) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const DELETE_TARGET = `\n mutation DeleteTarget($id: ID!) { deleteTarget(id: $id) }\n`;\n\nexport const TEST_TARGET = `\n query TestTarget($id: ID!) {\n testTarget(id: $id) { success error latencyMs }\n }\n`;\n\nexport const IMPORT_TARGETS_FROM_CONFIG = `\n mutation ImportTargetsFromConfig($agentId: ID!, $hosts: [ConfigHostInput!]!, $workspaceId: ID!) {\n importTargetsFromConfig(agentId: $agentId, hosts: $hosts, workspaceId: $workspaceId) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const SCAN_SSH_CONFIG = `\n mutation ScanSSHConfig($agentId: ID!, $configPath: String) {\n scanSSHConfig(agentId: $agentId, configPath: $configPath) { ${TARGET_FIELDS} }\n }\n`;\n\nexport const INSTALL_AGENT_ON_TARGET = `\n mutation InstallAgentOnTarget($sourceAgentId: ID!, $targetId: ID!, $agentPort: Int) {\n installAgentOnTarget(sourceAgentId: $sourceAgentId, targetId: $targetId, agentPort: $agentPort) { success error }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// VibeDeck Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_VIBEDECKS = `\n query VibeDecks($filter: VibeDeckFilterInput, $pagination: PaginationInput) {\n vibeDecks(filter: $filter, pagination: $pagination) {\n items { ${VIBEDECK_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBEDECK = `\n query VibeDeck($id: ID!) {\n vibeDeck(id: $id) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const DEFAULT_VIBEDECK = `\n query { defaultVibeDeck { ${VIBEDECK_FIELDS} } }\n`;\n\nexport const CREATE_VIBEDECK = `\n mutation CreateVibeDeck($input: CreateVibeDeckInput!) {\n createVibeDeck(input: $input) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBEDECK = `\n mutation UpdateVibeDeck($id: ID!, $input: UpdateVibeDeckInput!) {\n updateVibeDeck(id: $id, input: $input) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBEDECK = `\n mutation DeleteVibeDeck($id: ID!) { deleteVibeDeck(id: $id) }\n`;\n\nexport const DUPLICATE_VIBEDECK = `\n mutation DuplicateVibeDeck($id: ID!, $name: String) {\n duplicateVibeDeck(id: $id, name: $name) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const SET_DEFAULT_VIBEDECK = `\n mutation SetDefaultVibeDeck($id: ID!) {\n setDefaultVibeDeck(id: $id) { ${VIBEDECK_FIELDS} }\n }\n`;\n\nexport const LIST_VIBEDECK_BUTTONS = `\n query VibeDeckButtons($filter: VibeDeckButtonFilterInput, $pagination: PaginationInput) {\n vibeDeckButtons(filter: $filter, pagination: $pagination) {\n items { ${VIBEDECK_BUTTON_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_VIBEDECK_BUTTON = `\n query VibeDeckButton($id: ID!) {\n vibeDeckButton(id: $id) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const CREATE_VIBEDECK_BUTTON = `\n mutation CreateVibeDeckButton($input: CreateVibeDeckButtonInput!) {\n createVibeDeckButton(input: $input) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const UPDATE_VIBEDECK_BUTTON = `\n mutation UpdateVibeDeckButton($id: ID!, $input: UpdateVibeDeckButtonInput!) {\n updateVibeDeckButton(id: $id, input: $input) { ${VIBEDECK_BUTTON_FIELDS} }\n }\n`;\n\nexport const DELETE_VIBEDECK_BUTTON = `\n mutation DeleteVibeDeckButton($id: ID!) { deleteVibeDeckButton(id: $id) }\n`;\n\nexport const EXECUTE_VIBEDECK_BUTTON = `\n mutation ExecuteVibeDeckButton($id: ID!, $agentId: ID!) {\n executeVibeDeckButton(id: $id, agentId: $agentId) { success output error }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Action Field Fragments\n// ---------------------------------------------------------------------------\n\nexport const ACTION_FIELDS = `\n id name description actionType sourceType triggerType\n command script webhookUrl workflowDefinition\n tags storeItemId storeVersion metadata\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const ACTION_EXECUTION_FIELDS = `\n id actionId status input output error\n startedAt completedAt durationMs triggeredBy metadata\n workspaceId createdAt updatedAt\n`;\n\n// ---------------------------------------------------------------------------\n// Action Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_ACTIONS = `\n query Actions($filter: ActionFilterInput, $pagination: PaginationInput) {\n actions(filter: $filter, pagination: $pagination) {\n items { ${ACTION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_ACTION = `\n query Action($id: ID!) {\n action(id: $id) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const CREATE_ACTION = `\n mutation CreateAction($input: CreateActionInput!) {\n createAction(input: $input) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const UPDATE_ACTION = `\n mutation UpdateAction($id: ID!, $input: UpdateActionInput!) {\n updateAction(id: $id, input: $input) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const DELETE_ACTION = `\n mutation DeleteAction($id: ID!) { deleteAction(id: $id) }\n`;\n\nexport const DUPLICATE_ACTION = `\n mutation DuplicateAction($id: ID!, $name: String) {\n duplicateAction(id: $id, name: $name) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const EXECUTE_ACTION = `\n mutation ExecuteAction($id: ID!, $input: ExecuteActionInput) {\n executeAction(id: $id, input: $input) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\nexport const INSTALL_ACTION_FROM_STORE = `\n mutation InstallActionFromStore($storeItemId: String!, $version: String, $name: String) {\n installActionFromStore(storeItemId: $storeItemId, version: $version, name: $name) { ${ACTION_FIELDS} }\n }\n`;\n\nexport const CANCEL_ACTION_EXECUTION = `\n mutation CancelActionExecution($id: ID!) {\n cancelActionExecution(id: $id) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\nexport const LIST_ACTION_EXECUTIONS = `\n query ActionExecutions($filter: ActionExecutionFilterInput, $pagination: PaginationInput) {\n actionExecutions(filter: $filter, pagination: $pagination) {\n items { ${ACTION_EXECUTION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_ACTION_EXECUTION = `\n query ActionExecution($id: ID!) {\n actionExecution(id: $id) { ${ACTION_EXECUTION_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Scheduled Job Field Fragments\n// ---------------------------------------------------------------------------\n\nexport const SCHEDULED_JOB_FIELDS = `\n id name scheduleType status actionId\n cronExpression timezone scheduledAt\n interval intervalUnit startDate endDate\n nextExecutionAt lastExecutionAt\n priority tags\n`;\n\n// ---------------------------------------------------------------------------\n// Scheduled Job Queries / Mutations (wspace-scheduler-svc via gateway)\n// ---------------------------------------------------------------------------\n\nexport const CREATE_SCHEDULED_JOB = `\n mutation CreateScheduledJob($workspaceId: ID!, $input: CreateScheduledJobInput!) {\n createScheduledJob(workspaceId: $workspaceId, input: $input) { ${SCHEDULED_JOB_FIELDS} }\n }\n`;\n\nexport const DELETE_SCHEDULED_JOB = `\n mutation DeleteScheduledJob($id: ID!) { deleteScheduledJob(id: $id) }\n`;\n\nexport const LIST_SCHEDULED_JOBS = `\n query ScheduledJobs($workspaceId: ID!, $filter: JobFilterInput, $pagination: SchedulerPaginationInput) {\n scheduledJobs(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n jobs { ${SCHEDULED_JOB_FIELDS} }\n total hasMore\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Docs Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_DOCS_SITES = `\n query DocsSites($filter: VibecontrolsDocsSiteFilterInput, $pagination: PaginationInput) {\n docsSites(filter: $filter, pagination: $pagination) {\n items { ${DOCS_SITE_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_DOCS_SITE = `\n query DocsSite($vibeId: ID!) {\n docsSite(vibeId: $vibeId) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const CREATE_DOCS_SITE = `\n mutation CreateDocsSite($input: CreateVibecontrolsDocsSiteInput!) {\n createDocsSite(input: $input) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const UPDATE_DOCS_SITE = `\n mutation UpdateDocsSite($id: ID!, $input: UpdateVibecontrolsDocsSiteInput!) {\n updateDocsSite(id: $id, input: $input) { ${DOCS_SITE_FIELDS} }\n }\n`;\n\nexport const DELETE_DOCS_SITE = `\n mutation DeleteDocsSite($id: ID!) { deleteDocsSite(id: $id) }\n`;\n\nexport const LIST_DOCS_PAGES = `\n query DocsPages($siteId: ID!, $filter: VibecontrolsDocsPageFilterInput) {\n docsPages(siteId: $siteId, filter: $filter) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const GET_DOCS_PAGE = `\n query DocsPage($id: ID!) {\n docsPage(id: $id) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const CREATE_DOCS_PAGE = `\n mutation CreateDocsPage($input: CreateVibecontrolsDocsPageInput!) {\n createDocsPage(input: $input) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const UPDATE_DOCS_PAGE = `\n mutation UpdateDocsPage($id: ID!, $input: UpdateVibecontrolsDocsPageInput!) {\n updateDocsPage(id: $id, input: $input) { ${DOCS_PAGE_FIELDS} }\n }\n`;\n\nexport const DELETE_DOCS_PAGE = `\n mutation DeleteDocsPage($id: ID!) { deleteDocsPage(id: $id) }\n`;\n\nexport const LIST_DOCS_REVISIONS = `\n query DocsRevisions($siteId: ID!, $pagination: PaginationInput) {\n docsRevisions(siteId: $siteId, pagination: $pagination) {\n items { ${DOCS_REVISION_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const COMPILE_DOCS_SITE = `\n mutation CompileDocsSite($siteId: ID!, $publish: Boolean) {\n compileDocsSite(siteId: $siteId, publish: $publish) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\nexport const PUBLISH_DOCS_REVISION = `\n mutation PublishDocsRevision($revisionId: ID!) {\n publishDocsRevision(revisionId: $revisionId) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\nexport const ROLLBACK_DOCS_REVISION = `\n mutation RollbackDocsRevision($siteId: ID!, $revisionId: ID!) {\n rollbackDocsRevision(siteId: $siteId, revisionId: $revisionId) { ${DOCS_REVISION_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Audit Log Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const LIST_AUDIT_LOGS = `\n query VibeAuditLogs($filter: VibeAuditLogFilterInput, $pagination: PaginationInput) {\n vibeAuditLogs(filter: $filter, pagination: $pagination) {\n items { ${AUDIT_LOG_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_AUDIT_LOG = `\n query VibeAuditLog($id: ID!) {\n vibeAuditLog(id: $id) { ${AUDIT_LOG_FIELDS} }\n }\n`;\n\nexport const AUDIT_LOG_STATS = `\n query VibeAuditLogStats($filter: VibeAuditLogFilterInput) {\n vibeAuditLogStats(filter: $filter) {\n totalLogs\n logsByAction { action count }\n logsByResourceType { resourceType count }\n logsByStatus { status count }\n }\n }\n`;\n\nexport const EXPORT_AUDIT_LOGS = `\n mutation ExportVibeAuditLogs($filter: VibeAuditLogFilterInput, $format: String) {\n exportVibeAuditLogs(filter: $filter, format: $format)\n }\n`;\n\nexport const DELETE_AUDIT_LOG = `\n mutation DeleteVibeAuditLog($id: ID!, $reason: String) {\n deleteVibeAuditLog(id: $id, reason: $reason)\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Auth Operations (Global Gateway)\n// ---------------------------------------------------------------------------\n\nexport const MY_WORKSPACES = `\n query MyWorkspaces($limit: Int) {\n myWorkspaces(limit: $limit) {\n items { id name slug tenantId organizationId }\n }\n }\n`;\n\nexport const ISSUE_WORKSPACE_TOKEN = `\n mutation IssueWorkspaceToken($input: IssueWorkspaceTokenInput!) {\n issueWorkspaceToken(input: $input) {\n success token expiresAt scopes\n error { code message }\n }\n }\n`;\n\nexport const REFRESH_TOKEN = `\n mutation RefreshToken($token: String!) {\n refreshToken(token: $token) { accessToken refreshToken expiresIn }\n }\n`;\n\nexport const SIGN_OUT = `mutation { signOut }`;\n\n// ---------------------------------------------------------------------------\n// Analytics\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Sandbox Queries / Mutations\n// ---------------------------------------------------------------------------\n\nexport const SANDBOX_FIELDS = `\n id name description template mode status\n crdName podName namespace runtimeClass\n containers { name image ports { containerPort name protocol } env { name value } command args resources { requestsCpu requestsMemory limitsCpu limitsMemory } }\n containerStatuses { name ready port restartCount }\n resources { cpuRequest cpuLimit memoryRequest memoryLimit }\n storage { mode sizeGi mountPath retainOnDelete }\n network { exposeService internalUrl containerUrls serviceName }\n ttlSeconds expiresAt metadata errorMessage\n workspaceId createdBy createdAt updatedAt stoppedAt\n`;\n\nexport const LIST_SANDBOXES = `\n query ListSandboxes($filter: SandboxFilterInput, $pagination: SandboxPaginationInput, $context: ContextInput!) {\n listSandboxes(filter: $filter, pagination: $pagination, context: $context) {\n items { ${SANDBOX_FIELDS} }\n total hasMore\n }\n }\n`;\n\nexport const GET_SANDBOX = `\n query GetSandbox($id: ID!, $context: ContextInput!) {\n getSandbox(id: $id, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const CREATE_SANDBOX = `\n mutation CreateSandbox($input: CreateSandboxInput!) {\n createSandbox(input: $input) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const DELETE_SANDBOX = `\n mutation DeleteSandbox($id: ID!, $context: ContextInput!) {\n deleteSandbox(id: $id, context: $context)\n }\n`;\n\nexport const STOP_SANDBOX = `\n mutation StopSandbox($id: ID!, $context: ContextInput!) {\n stopSandbox(id: $id, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const START_SANDBOX = `\n mutation StartSandbox($id: ID!, $context: ContextInput!) {\n startSandbox(id: $id, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const EXTEND_SANDBOX_TTL = `\n mutation ExtendSandboxTTL($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {\n extendSandboxTTL(id: $id, additionalSeconds: $additionalSeconds, context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const SANDBOX_TEMPLATE_FIELDS = `\n id name description template isDefault ttlSeconds\n containers { name image }\n resources { cpuRequest cpuLimit memoryRequest memoryLimit }\n storage { mode sizeGi mountPath retainOnDelete }\n config metadata allowedImages\n workspaceId createdBy createdAt updatedAt\n`;\n\nexport const LIST_SANDBOX_TEMPLATES = `\n query ListSandboxTemplates($context: ContextInput!, $template: SandboxTemplate, $pagination: SandboxPaginationInput) {\n listSandboxTemplates(context: $context, template: $template, pagination: $pagination) {\n items { ${SANDBOX_TEMPLATE_FIELDS} } total hasMore\n }\n }\n`;\n\nexport const GET_SANDBOX_TEMPLATE = `\n query GetSandboxTemplate($context: ContextInput!, $id: ID!) {\n getSandboxTemplate(context: $context, id: $id) { ${SANDBOX_TEMPLATE_FIELDS} }\n }\n`;\n\nexport const CREATE_SANDBOX_TEMPLATE = `\n mutation CreateSandboxTemplate($input: CreateSandboxTemplateInput!) {\n createSandboxTemplate(input: $input) { ${SANDBOX_TEMPLATE_FIELDS} }\n }\n`;\n\nexport const UPDATE_SANDBOX_TEMPLATE = `\n mutation UpdateSandboxTemplate($input: UpdateSandboxTemplateInput!) {\n updateSandboxTemplate(input: $input) { ${SANDBOX_TEMPLATE_FIELDS} }\n }\n`;\n\nexport const DELETE_SANDBOX_TEMPLATE = `\n mutation DeleteSandboxTemplate($context: ContextInput!, $id: ID!) {\n deleteSandboxTemplate(context: $context, id: $id)\n }\n`;\n\nexport const AVAILABLE_SANDBOX_TAGS = `\n query AvailableSandboxTags($query: String, $limit: Int) {\n availableSandboxTags(query: $query, limit: $limit) { id key label color }\n }\n`;\n\nexport const GET_SANDBOX_TAGS = `\n query GetSandboxTags($input: GetSandboxTagsInput!) {\n getSandboxTags(input: $input) {\n id entityId entityType tagId source assignedAt assignedBy\n }\n }\n`;\n\nexport const CREATE_SANDBOX_TAG = `\n mutation CreateSandboxTag($input: CreateSandboxTagInput!) {\n createSandboxTag(input: $input) { id key label color }\n }\n`;\n\nexport const TAG_SANDBOX = `\n mutation TagSandbox($input: TagSandboxInput!) {\n tagSandbox(input: $input) {\n id entityId tagId source assignedAt\n }\n }\n`;\n\nexport const UNTAG_SANDBOX = `\n mutation UntagSandbox($input: UntagSandboxInput!) {\n untagSandbox(input: $input)\n }\n`;\n\nexport const REPLACE_SANDBOX_TAGS = `\n mutation ReplaceSandboxTags($input: ReplaceSandboxTagsInput!) {\n replaceSandboxTags(input: $input) {\n id entityId tagId source assignedAt\n }\n }\n`;\n\nexport const LIST_ALL_SANDBOXES = `\n query ListAllSandboxes($context: ContextInput!, $filter: SandboxFilterInput, $pagination: SandboxPaginationInput) {\n listAllSandboxes(context: $context, filter: $filter, pagination: $pagination) {\n items { ${SANDBOX_FIELDS} } total hasMore\n }\n }\n`;\n\nexport const LIST_SANDBOX_NODES = `\n query ListSandboxNodes($context: ContextInput!) {\n listSandboxNodes(context: $context) {\n name status allocatableCpu allocatableMemory sandboxPodCount labels\n }\n }\n`;\n\nexport const GET_ACTIVE_SANDBOXES = `\n query GetActiveSandboxes($context: ContextInput!) {\n getActiveSandboxes(context: $context) { ${SANDBOX_FIELDS} }\n }\n`;\n\nexport const GET_RECENT_SANDBOX_ACTIVITY = `\n query GetRecentSandboxActivity($context: ContextInput!, $limit: Int) {\n getRecentSandboxActivity(context: $context, limit: $limit) {\n items { id action actorId status sandboxName sandboxId createdAt }\n total\n }\n }\n`;\n\nexport const GET_SANDBOX_STATS = `\n query GetSandboxStats($context: ContextInput!) {\n getSandboxStats(context: $context) {\n activeSandboxes activeUserSandboxes activeInternalSandboxes\n totalCreated totalDeleted totalUserCreated totalInternalCreated\n runningNow provisioningNow stoppedNow expiredCount failedCount\n totalCpuUsed totalMemoryUsed\n }\n }\n`;\n\nexport const GET_SANDBOX_LOGS = `\n query GetSandboxLogs($context: ContextInput!, $id: ID!, $containerName: String!, $tailLines: Int) {\n getSandboxLogs(context: $context, id: $id, containerName: $containerName, tailLines: $tailLines)\n }\n`;\n\nexport const GET_SANDBOX_CONFIG = `\n query GetSandboxConfig($context: ContextInput!) {\n getSandboxConfig(context: $context) {\n id defaultTtlSeconds maxTtlSeconds allowedTemplates\n maxConcurrentPerUser maxConcurrentPerWorkspace\n defaultCpuRequest defaultCpuLimit defaultMemoryRequest defaultMemoryLimit\n workspaceId updatedAt\n }\n }\n`;\n\nexport const UPDATE_SANDBOX_CONFIG = `\n mutation UpdateSandboxConfig($input: UpdateSandboxConfigInput!) {\n updateSandboxConfig(input: $input) {\n id defaultTtlSeconds maxTtlSeconds allowedTemplates\n maxConcurrentPerUser maxConcurrentPerWorkspace\n defaultCpuRequest defaultCpuLimit defaultMemoryRequest defaultMemoryLimit\n workspaceId updatedAt\n }\n }\n`;\n\nexport const SANDBOX_EXPORT_JOB_FIELDS = `\n id workspaceId format status requestedBy rowCount\n downloadUrl errorMessage expiresAt createdAt updatedAt\n`;\n\nexport const EXPORT_SANDBOXES = `\n mutation ExportSandboxes($input: ExportSandboxesInput!) {\n exportSandboxes(input: $input) { ${SANDBOX_EXPORT_JOB_FIELDS} }\n }\n`;\n\nexport const GET_SANDBOX_EXPORT_JOB = `\n query GetSandboxExportJob($workspaceId: ID!, $jobId: ID!, $context: ContextInput!) {\n getSandboxExportJob(workspaceId: $workspaceId, jobId: $jobId, context: $context) {\n ${SANDBOX_EXPORT_JOB_FIELDS}\n }\n }\n`;\n\nexport const LIST_SANDBOX_EXPORT_JOBS = `\n query ListSandboxExportJobs($workspaceId: ID!, $context: ContextInput!, $pagination: SandboxPaginationInput) {\n listSandboxExportJobs(workspaceId: $workspaceId, context: $context, pagination: $pagination) {\n ${SANDBOX_EXPORT_JOB_FIELDS}\n }\n }\n`;\n\nexport const GET_SANDBOX_ARTIFACT_BYTES = `\n query GetSandboxArtifactBytes($input: SandboxArtifactBytesInput!) {\n getSandboxArtifactBytes(input: $input) { filename mimeType size contentBase64 }\n }\n`;\n\nexport const PROXY_SANDBOX_REQUEST = `\n mutation ProxySandboxRequest($input: ProxySandboxRequestInput!) {\n proxySandboxRequest(input: $input) { status body }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Analytics\n// ---------------------------------------------------------------------------\n\nexport const VIBECONTROLS_ANALYTICS = `\n query VibecontrolsAnalytics($input: VibecontrolsAnalyticsInput!) {\n vibecontrolsAnalytics(input: $input) {\n agents { total active inactive staleHeartbeatCount byPlatform { key count } byArchitecture { key count } createdOverTime { timestamp value } }\n targets { total connectionCount byType { key count } byStatus { key count } }\n sessions { total active avgDurationMs totalCollaborators totalShares totalShareLinks byType { key count } byStatus { key count } createdOverTime { timestamp value } }\n vibes { total withAgent withoutAgent byType { key count } byStatus { key count } createdOverTime { timestamp value } }\n actions { total totalExecutions successRate avgDurationMs byActionType { key count } byTriggerType { key count } bySourceType { key count } executionsByStatus { key count } executionsOverTime { timestamp value } }\n webhooks { total active inactive totalDeliveries totalFailures deliverySuccessRate }\n aiEvents { total bySource { key count } byEventType { key count } eventsOverTime { timestamp value } }\n vibeDecks { totalDecks totalButtons buttonsByActionType { key count } }\n audit { total byAction { key count } byResourceType { key count } byStatus { key count } eventsOverTime { timestamp value } }\n docs { totalSites totalPages totalRevisions buildSuccessRate totalBuildImages pagesByStatus { key count } revisionsByStatus { key count } }\n notes { total pinned unpinned createdOverTime { timestamp value } }\n configurations { total secretCount byScope { key count } }\n executionTimeMs\n cached\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Catalogs / Components / Templates / Scorecards\n// ---------------------------------------------------------------------------\n\nexport const CATALOG_FIELDS = `\n id name description visibility\n ownerId ownerName componentCount vibeCount\n tags metadata workspaceId\n createdAt updatedAt deletedAt\n createdBy updatedBy onBehalfOf\n`;\n\nexport const COMPONENT_FIELDS = `\n id name description type lifecycle version\n language framework repositoryUrl documentationUrl\n dependencies sbomData tags metadata\n ownerId ownerName teamId teamName catalogCount\n workspaceId createdAt updatedAt deletedAt\n`;\n\nexport const TEMPLATE_FIELDS = `\n id name description category status version\n setupInstructions sourceRepositoryUrl\n fileTree variables componentSnapshot\n cloneCount tags metadata\n createdAt updatedAt\n`;\n\nexport const SCORECARD_METRIC_FIELDS = `\n id name description type status value threshold unit\n iframeUrl iframeHeight lastUpdatedAt createdAt updatedAt\n`;\n\nexport const SCORECARD_FIELDS = `\n id ownerId ownerType overallScore lastEvaluatedAt\n metrics { ${SCORECARD_METRIC_FIELDS} }\n metadata workspaceId createdAt updatedAt\n`;\n\n// catalogs\nexport const LIST_CATALOGS = `\n query VibecontrolsCatalogs($filter: CatalogFilterInput, $pagination: PaginationInput) {\n vibecontrolsCatalogs(filter: $filter, pagination: $pagination) {\n items { ${CATALOG_FIELDS} }\n total hasMore\n }\n }\n`;\nexport const GET_CATALOG = `query VibecontrolsCatalog($id: ID!) { vibecontrolsCatalog(id: $id) { ${CATALOG_FIELDS} } }`;\nexport const GET_CATALOG_DEPENDENCY_GRAPH = `\n query VibecontrolsCatalogDependencyGraph($catalogId: ID!) {\n vibecontrolsCatalogDependencyGraph(catalogId: $catalogId) {\n nodes { id name type version }\n edges { source target version dependencyType }\n }\n }\n`;\nexport const GET_CATALOG_SBOM = `\n query VibecontrolsCatalogSBOM($catalogId: ID!) {\n vibecontrolsCatalogSBOM(catalogId: $catalogId) {\n format generatedAt totalCount\n components { name version type license }\n }\n }\n`;\nexport const CREATE_CATALOG = `mutation CreateVibecontrolsCatalog($input: CreateCatalogInput!) { createVibecontrolsCatalog(input: $input) { ${CATALOG_FIELDS} } }`;\nexport const UPDATE_CATALOG = `mutation UpdateVibecontrolsCatalog($id: ID!, $input: UpdateCatalogInput!) { updateVibecontrolsCatalog(id: $id, input: $input) { ${CATALOG_FIELDS} } }`;\nexport const DELETE_CATALOG = `mutation DeleteVibecontrolsCatalog($id: ID!) { deleteVibecontrolsCatalog(id: $id) }`;\nexport const ADD_COMPONENT_TO_CATALOG = `\n mutation AddComponentToVibecontrolsCatalog($catalogId: ID!, $componentId: ID!) {\n addComponentToVibecontrolsCatalog(catalogId: $catalogId, componentId: $componentId) {\n id catalogId componentId addedAt addedBy metadata workspaceId\n }\n }\n`;\nexport const REMOVE_COMPONENT_FROM_CATALOG = `\n mutation RemoveComponentFromVibecontrolsCatalog($catalogId: ID!, $componentId: ID!) {\n removeComponentFromVibecontrolsCatalog(catalogId: $catalogId, componentId: $componentId)\n }\n`;\nexport const ADD_VIBE_TO_CATALOG = `\n mutation AddVibeToVibecontrolsCatalog($catalogId: ID!, $vibeId: ID!) {\n addVibeToVibecontrolsCatalog(catalogId: $catalogId, vibeId: $vibeId) {\n id catalogId vibeId addedAt addedBy metadata workspaceId\n }\n }\n`;\nexport const REMOVE_VIBE_FROM_CATALOG = `\n mutation RemoveVibeFromVibecontrolsCatalog($catalogId: ID!, $vibeId: ID!) {\n removeVibeFromVibecontrolsCatalog(catalogId: $catalogId, vibeId: $vibeId)\n }\n`;\n\n// components\nexport const LIST_COMPONENTS = `\n query VibecontrolsComponents($filter: ComponentFilterInput, $pagination: PaginationInput) {\n vibecontrolsComponents(filter: $filter, pagination: $pagination) {\n items { ${COMPONENT_FIELDS} }\n total hasMore\n }\n }\n`;\nexport const GET_COMPONENT = `query VibecontrolsComponent($id: ID!) { vibecontrolsComponent(id: $id) { ${COMPONENT_FIELDS} } }`;\nexport const CREATE_COMPONENT = `mutation CreateVibecontrolsComponent($input: CreateComponentInput!) { createVibecontrolsComponent(input: $input) { ${COMPONENT_FIELDS} } }`;\nexport const UPDATE_COMPONENT = `mutation UpdateVibecontrolsComponent($id: ID!, $input: UpdateComponentInput!) { updateVibecontrolsComponent(id: $id, input: $input) { ${COMPONENT_FIELDS} } }`;\nexport const DELETE_COMPONENT = `mutation DeleteVibecontrolsComponent($id: ID!) { deleteVibecontrolsComponent(id: $id) }`;\nexport const FORK_GITHUB_REPO = `\n mutation ForkVibecontrolsGitHubRepo($input: VibecontrolsForkGitHubRepoInput!) {\n forkVibecontrolsGitHubRepo(input: $input) { isForked repoFullName repoUrl }\n }\n`;\nexport const PUBLISH_COMPONENT_AS_TEMPLATE = `\n mutation PublishVibecontrolsComponentAsTemplate(\n $componentId: ID!\n $input: VibecontrolsPublishTemplateInput!\n ) {\n publishVibecontrolsComponentAsTemplate(componentId: $componentId, input: $input) {\n ${TEMPLATE_FIELDS}\n }\n }\n`;\n\n// templates\nexport const LIST_TEMPLATES = `\n query VibecontrolsTemplates($filter: VibecontrolsTemplateFilterInput, $pagination: PaginationInput) {\n vibecontrolsTemplates(filter: $filter, pagination: $pagination) {\n items { ${TEMPLATE_FIELDS} }\n total hasMore\n }\n }\n`;\nexport const GET_TEMPLATE = `query VibecontrolsTemplate($id: ID!) { vibecontrolsTemplate(id: $id) { ${TEMPLATE_FIELDS} } }`;\nexport const UPDATE_TEMPLATE = `mutation UpdateVibecontrolsTemplate($id: ID!, $input: VibecontrolsUpdateTemplateInput!) { updateVibecontrolsTemplate(id: $id, input: $input) { ${TEMPLATE_FIELDS} } }`;\nexport const DELETE_TEMPLATE = `mutation DeleteVibecontrolsTemplate($id: ID!) { deleteVibecontrolsTemplate(id: $id) }`;\nexport const INSTANTIATE_TEMPLATE = `\n mutation InstantiateVibecontrolsTemplate($templateId: ID!, $input: VibecontrolsCloneTemplateInput!) {\n instantiateVibecontrolsTemplate(templateId: $templateId, input: $input) { ${COMPONENT_FIELDS} }\n }\n`;\n\n// scorecards\nexport const GET_SCORECARD = `\n query VibecontrolsScorecard($ownerId: ID!, $ownerType: ScorecardOwnerType!) {\n vibecontrolsScorecard(ownerId: $ownerId, ownerType: $ownerType) { ${SCORECARD_FIELDS} }\n }\n`;\nexport const UPSERT_SCORECARD = `mutation UpsertVibecontrolsScorecard($input: UpsertScorecardInput!) { upsertVibecontrolsScorecard(input: $input) { ${SCORECARD_FIELDS} } }`;\nexport const ADD_SCORECARD_METRIC = `\n mutation AddVibecontrolsScorecardMetric($scorecardId: ID!, $input: AddScorecardMetricInput!) {\n addVibecontrolsScorecardMetric(scorecardId: $scorecardId, input: $input) { ${SCORECARD_METRIC_FIELDS} }\n }\n`;\nexport const UPDATE_SCORECARD_METRIC = `\n mutation UpdateVibecontrolsScorecardMetric($id: ID!, $input: UpdateScorecardMetricInput!) {\n updateVibecontrolsScorecardMetric(id: $id, input: $input) { ${SCORECARD_METRIC_FIELDS} }\n }\n`;\nexport const REMOVE_SCORECARD_METRIC = `mutation RemoveVibecontrolsScorecardMetric($id: ID!) { removeVibecontrolsScorecardMetric(id: $id) }`;\n\n// ---------------------------------------------------------------------------\n// Configuration / Security\n// ---------------------------------------------------------------------------\n\nconst SECURITY_SUMMARY = `summary { critical high medium low info }`;\nconst SECURITY_FINDING_FIELDS = `\n id workspaceId vibeId scanRunId fingerprint\n category severity status ruleId title description\n file line col cve cwe packageName packageVersion fixedVersion\n remediation redactedSample ownerTeam firstSeenAt lastSeenAt dueAt\n`;\nconst SECURITY_EVIDENCE_FIELDS = `\n id workspaceId scanRunId type sha256 sizeBytes\n s3Bucket s3Key retentionDays uploadedAt downloadUrl\n`;\nconst SECURITY_SCAN_RUN_FIELDS = `\n id workspaceId vibeId agentId createdBy providerName\n stage status conclusion policyLevel repoUrl commit\n durationMs errorReason startedAt finishedAt createdAt\n ${SECURITY_SUMMARY}\n findings { ${SECURITY_FINDING_FIELDS} }\n evidence { ${SECURITY_EVIDENCE_FIELDS} }\n`;\nconst SECURITY_PROVIDER_FIELDS = `\n id workspaceId providerName pluginName stage toolVersion\n enabled isDefault config createdAt updatedAt\n`;\nconst REPO_SECURITY_CONFIG_FIELDS = `\n id workspaceId vibeId policyLevel enabledStages\n pluginAssignments profile configYamlEquivalent createdAt updatedAt\n`;\n\nexport const SECURITY_PROVIDERS_Q = `\n query SecurityProviders { securityProviders { ${SECURITY_PROVIDER_FIELDS} } }\n`;\nexport const SECURITY_SCAN_Q = `\n query SecurityScan($id: ID!) { securityScan(id: $id) { ${SECURITY_SCAN_RUN_FIELDS} } }\n`;\nexport const MY_SECURITY_SCANS_Q = `\n query MySecurityScans($filter: SecurityScanFilterInput, $pagination: SecurityPaginationInput) {\n mySecurityScans(filter: $filter, pagination: $pagination) {\n items { ${SECURITY_SCAN_RUN_FIELDS} } total hasMore\n }\n }\n`;\nexport const ALL_SECURITY_SCANS_Q = `\n query AllSecurityScans($filter: SecurityScanFilterInput, $pagination: SecurityPaginationInput) {\n allSecurityScans(filter: $filter, pagination: $pagination) {\n items { ${SECURITY_SCAN_RUN_FIELDS} } total hasMore\n }\n }\n`;\nexport const SECURITY_FINDINGS_Q = `\n query SecurityFindings($filter: SecurityFindingFilterInput, $pagination: SecurityPaginationInput) {\n securityFindings(filter: $filter, pagination: $pagination) {\n items { ${SECURITY_FINDING_FIELDS} } total hasMore\n }\n }\n`;\nexport const SECURITY_POLICY_DECISION_Q = `\n query SecurityPolicyDecision($scanRunId: ID!) {\n securityPolicyDecision(scanRunId: $scanRunId) {\n scanRunId allow denyReasons policyVersion evaluatedAt\n }\n }\n`;\nexport const SECURITY_STATUS_Q = `\n query SecurityStatus($vibeId: ID!) {\n securityStatus(vibeId: $vibeId) {\n vibeId policyLevel perStage lastScanAt\n totals { critical high medium low info }\n }\n }\n`;\nexport const REPOSITORY_SECURITY_CONFIG_Q = `\n query RepositorySecurityConfig($vibeId: ID!) {\n repositorySecurityConfig(vibeId: $vibeId) { ${REPO_SECURITY_CONFIG_FIELDS} }\n }\n`;\nexport const RUN_SECURITY_SCAN_M = `\n mutation RunSecurityScan($vibeId: ID!, $stage: SecurityStage!) {\n runSecurityScan(vibeId: $vibeId, stage: $stage) { ${SECURITY_SCAN_RUN_FIELDS} }\n }\n`;\nexport const CANCEL_SECURITY_SCAN_M = `\n mutation CancelSecurityScan($id: ID!) {\n cancelSecurityScan(id: $id) { ${SECURITY_SCAN_RUN_FIELDS} }\n }\n`;\nexport const CREATE_SECURITY_EXCEPTION_M = `\n mutation CreateSecurityException($input: CreateSecurityExceptionInput!) {\n createSecurityException(input: $input) {\n id workspaceId vibeId findingId reason compensatingControls\n approvedBy expiresAt status createdAt\n }\n }\n`;\nexport const REVOKE_SECURITY_EXCEPTION_M = `\n mutation RevokeSecurityException($id: ID!) { revokeSecurityException(id: $id) }\n`;\nexport const SET_SECURITY_PROVIDER_M = `\n mutation SetSecurityProvider($input: SetSecurityProviderInput!) {\n setSecurityProvider(input: $input) { ${SECURITY_PROVIDER_FIELDS} }\n }\n`;\nexport const UPDATE_SECURITY_FINDING_STATUS_M = `\n mutation UpdateSecurityFindingStatus($id: ID!, $status: SecurityFindingStatus!) {\n updateSecurityFindingStatus(id: $id, status: $status) { ${SECURITY_FINDING_FIELDS} }\n }\n`;\nexport const UPDATE_REPOSITORY_SECURITY_CONFIG_M = `\n mutation UpdateRepositorySecurityConfig(\n $vibeId: ID!, $input: UpdateRepositorySecurityConfigInput!\n ) {\n updateRepositorySecurityConfig(vibeId: $vibeId, input: $input) { ${REPO_SECURITY_CONFIG_FIELDS} }\n }\n`;\nexport const PRESIGN_SECURITY_EVIDENCE_M = `\n mutation PresignSecurityEvidence(\n $scanRunId: ID!, $sha256: String!, $sizeBytes: Int!, $type: SecurityEvidenceType!\n ) {\n presignSecurityEvidence(\n scanRunId: $scanRunId, sha256: $sha256, sizeBytes: $sizeBytes, type: $type\n ) {\n evidenceId uploadUrl method requiredHeaders s3Bucket s3Key expiresAt\n }\n }\n`;\nexport const PUSH_SECURITY_SCAN_RUN_M = `\n mutation PushSecurityScanRun($input: PushSecurityScanRunInput!) {\n pushSecurityScanRun(input: $input) { ${SECURITY_SCAN_RUN_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration / CI status\n// ---------------------------------------------------------------------------\n\nconst CI_RUN_FIELDS = `\n id status conclusion workflowName branch event actor url\n startedAt completedAt durationSeconds\n`;\nconst CI_STATUS_FIELDS = `\n recentRuns { ${CI_RUN_FIELDS} }\n workflows { id name path state }\n averageDurationSeconds successRate totalRunsLast30Days\n`;\nconst CI_DETAILS_FIELDS = `\n ${CI_RUN_FIELDS}\n commitSha commitMessage\n jobs { id name status conclusion startedAt completedAt durationSeconds }\n`;\nconst REPO_STATS_FIELDS = `\n name fullName owner description defaultBranch visibility\n isArchived isFork diskUsageKb stargazerCount watcherCount forkCount\n openIssues openPullRequests dependabotAlerts languages license\n createdAt updatedAt pushedAt\n contributors { login contributions avatarUrl }\n commitActivity { week total additions deletions }\n pullRequests {\n number title state author url createdAt updatedAt\n isDraft labels reviewers\n }\n`;\n\nexport const GET_CI_STATUS_Q = `\n query GetCIStatus($providerId: ID!, $agentId: ID!, $limit: Int) {\n getCIStatus(providerId: $providerId, agentId: $agentId, limit: $limit) { ${CI_STATUS_FIELDS} }\n }\n`;\nexport const GET_CI_PIPELINE_RUNS_Q = `\n query GetCIPipelineRuns($providerId: ID!, $agentId: ID!, $branch: String, $limit: Int) {\n getCIPipelineRuns(providerId: $providerId, agentId: $agentId, branch: $branch, limit: $limit) {\n ${CI_RUN_FIELDS}\n }\n }\n`;\nexport const GET_CI_PIPELINE_DETAILS_Q = `\n query GetCIPipelineDetails($providerId: ID!, $agentId: ID!, $runId: ID!) {\n getCIPipelineDetails(providerId: $providerId, agentId: $agentId, runId: $runId) {\n ${CI_DETAILS_FIELDS}\n }\n }\n`;\nexport const GET_REPO_STATS_Q = `\n query GetRepoStats($providerId: ID!, $agentId: ID!) {\n getRepoStats(providerId: $providerId, agentId: $agentId) { ${REPO_STATS_FIELDS} }\n }\n`;\nexport const REFRESH_CI_STATUS_M = `\n mutation RefreshCIStatus($providerId: ID!, $agentId: ID!) {\n refreshCIStatus(providerId: $providerId, agentId: $agentId) { ${CI_STATUS_FIELDS} }\n }\n`;\nexport const REFRESH_REPO_STATS_M = `\n mutation RefreshRepoStats($providerId: ID!, $agentId: ID!) {\n refreshRepoStats(providerId: $providerId, agentId: $agentId) { ${REPO_STATS_FIELDS} }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration / GitOps providers\n// ---------------------------------------------------------------------------\n\nconst GITOPS_FIELDS = `\n id workspaceId createdBy name providerType repoUrl\n isActive vibeId metadata\n context { workspaceId userId appId custom }\n createdAt updatedAt deletedAt\n`;\nexport const LIST_GITOPS_PROVIDERS_Q = `\n query ListGitopsProviders($filter: GitopsProviderFilterInput, $pagination: PaginationInput) {\n listGitopsProviders(filter: $filter, pagination: $pagination) {\n items { ${GITOPS_FIELDS} } total hasMore\n }\n }\n`;\nexport const GET_GITOPS_PROVIDER_Q = `\n query GetGitopsProvider($id: ID!) { getGitopsProvider(id: $id) { ${GITOPS_FIELDS} } }\n`;\nexport const CREATE_GITOPS_PROVIDER_M = `\n mutation CreateGitopsProvider($input: CreateGitopsProviderInput!) {\n createGitopsProvider(input: $input) { ${GITOPS_FIELDS} }\n }\n`;\nexport const UPDATE_GITOPS_PROVIDER_M = `\n mutation UpdateGitopsProvider($id: ID!, $input: UpdateGitopsProviderInput!) {\n updateGitopsProvider(id: $id, input: $input) { ${GITOPS_FIELDS} }\n }\n`;\nexport const DELETE_GITOPS_PROVIDER_M = `\n mutation DeleteGitopsProvider($id: ID!) { deleteGitopsProvider(id: $id) }\n`;\n\n// ---------------------------------------------------------------------------\n// Configuration / Settings, preferences, secrets, integration tokens\n// ---------------------------------------------------------------------------\n\nconst PREFS_FIELDS = `\n theme uiDensity sidebarCollapsed codeFont codeFontSize\n preferredIdeCommand defaultAgentForVibe vibeIdeOverrides vibeDetailTabOrder\n`;\nconst NOTIF_FIELDS = `\n emailDigest digestFrequency agentOffline sessionError vibeStatusChange\n`;\nconst DEFAULTS_FIELDS = `\n defaultAgent defaultSessionType defaultVibeType defaultEnvironmentVariables\n autoStartSessions autoGitSync agentHeartbeatInterval agentMaxSessions\n agentAutoReconnect autoUpdate telemetryEnabled logLevel\n`;\nconst BUNDLE_FIELDS = `\n preferences { ${PREFS_FIELDS} }\n notifications { ${NOTIF_FIELDS} }\n workspaceDefaults { ${DEFAULTS_FIELDS} }\n profile { displayName avatar bio language timezone }\n security { mfaEnabled sessionTimeout activeSessions }\n`;\nconst SECRET_FIELDS = `id key value isSecret createdAt updatedAt`;\n\nexport const MY_SETTINGS_Q = `query MySettings { mySettings { ${BUNDLE_FIELDS} } }`;\nexport const MY_SETTINGS_BY_CATEGORY_Q = `\n query MySettingsByCategory($category: SettingsCategory!) {\n mySettingsByCategory(category: $category)\n }\n`;\nexport const LIST_SETTINGS_SECRETS_Q = `\n query ListSettingsSecrets { listSettingsSecrets { ${SECRET_FIELDS} } }\n`;\nexport const SET_SETTINGS_SECRET_M = `\n mutation SetSettingsSecret($input: SetSettingsSecretInput!) {\n setSettingsSecret(input: $input) { ${SECRET_FIELDS} }\n }\n`;\nexport const DELETE_SETTINGS_SECRET_M = `\n mutation DeleteSettingsSecret($key: String!) { deleteSettingsSecret(key: $key) }\n`;\nexport const RESET_SETTINGS_M = `\n mutation ResetSettings($category: SettingsCategory!) { resetSettings(category: $category) }\n`;\nexport const UPDATE_PREFERENCES_M = `\n mutation UpdatePreferences($input: UpdatePreferencesInput!) {\n updatePreferences(input: $input) { ${PREFS_FIELDS} }\n }\n`;\nexport const UPDATE_NOTIFICATION_PREFERENCES_M = `\n mutation UpdateNotificationPreferences($input: UpdateNotificationPreferencesInput!) {\n updateNotificationPreferences(input: $input) { ${NOTIF_FIELDS} }\n }\n`;\nexport const UPDATE_WORKSPACE_DEFAULTS_M = `\n mutation UpdateWorkspaceDefaults($input: UpdateWorkspaceDefaultsInput!) {\n updateWorkspaceDefaults(input: $input) { ${DEFAULTS_FIELDS} }\n }\n`;\nexport const RESOLVE_INTEGRATION_TOKEN_M = `\n mutation VibecontrolsResolveIntegrationToken($connectionId: ID!) {\n vibecontrolsResolveIntegrationToken(connectionId: $connectionId) {\n success connectionStatus wasRefreshed error\n token {\n accessToken refreshToken tokenType providerKey scopes expiresAt metadata\n }\n }\n }\n`;\n","import { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { jsonResult, errorResult, mcpToolName, type McpContext } from '../../core/index.js';\nimport {\n LIST_SANDBOXES,\n GET_SANDBOX,\n CREATE_SANDBOX,\n DELETE_SANDBOX,\n STOP_SANDBOX,\n START_SANDBOX,\n EXTEND_SANDBOX_TTL,\n LIST_SANDBOX_TEMPLATES,\n GET_SANDBOX_TEMPLATE,\n CREATE_SANDBOX_TEMPLATE,\n UPDATE_SANDBOX_TEMPLATE,\n DELETE_SANDBOX_TEMPLATE,\n AVAILABLE_SANDBOX_TAGS,\n GET_SANDBOX_TAGS,\n CREATE_SANDBOX_TAG,\n TAG_SANDBOX,\n UNTAG_SANDBOX,\n REPLACE_SANDBOX_TAGS,\n LIST_ALL_SANDBOXES,\n LIST_SANDBOX_NODES,\n GET_ACTIVE_SANDBOXES,\n GET_RECENT_SANDBOX_ACTIVITY,\n GET_SANDBOX_STATS,\n GET_SANDBOX_LOGS,\n GET_SANDBOX_CONFIG,\n UPDATE_SANDBOX_CONFIG,\n EXPORT_SANDBOXES,\n GET_SANDBOX_EXPORT_JOB,\n LIST_SANDBOX_EXPORT_JOBS,\n GET_SANDBOX_ARTIFACT_BYTES,\n PROXY_SANDBOX_REQUEST,\n} from '../vibecontrols/operations.js';\n\nexport function registerSandboxTools(\n server: McpServer,\n ctx: McpContext,\n track: (n: string) => string,\n): void {\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_list')),\n {\n title: 'List Sandboxes',\n description: 'List Kubernetes-native sandboxes with optional filters and pagination.',\n inputSchema: {\n status: z\n .string()\n .optional()\n .describe(\n 'Filter by status (PENDING, PROVISIONING, RUNNING, STOPPING, STOPPED, EXPIRED, FAILED)',\n ),\n template: z\n .string()\n .optional()\n .describe(\n 'Filter by template (VIBECONTROLS, AI_BUILDER, WORKFLOW_MULTI_NODE, MISC_SHELL, CUSTOM)',\n ),\n limit: z.number().optional().describe('Max results'),\n offset: z.number().optional().describe('Skip results'),\n },\n },\n async ({ status, template, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (status !== undefined) filter.status = status;\n if (template !== undefined) filter.template = template;\n\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n const data = await ctx.gql.workspace.request<{ listSandboxes: unknown }>(LIST_SANDBOXES, {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n });\n return jsonResult(data.listSandboxes);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_list failed', { error });\n return errorResult(\n `Failed to list sandboxes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_get')),\n {\n title: 'Get Sandbox',\n description: 'Get a sandbox by its ID.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandbox: unknown }>(GET_SANDBOX, { id });\n return jsonResult(data.getSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_get failed', { error });\n return errorResult(\n `Failed to get sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_create')),\n {\n title: 'Create Sandbox',\n description:\n 'Create a new Kubernetes-native sandbox environment with Kata Containers isolation.',\n inputSchema: {\n name: z.string().describe('Sandbox name'),\n template: z\n .enum(['VIBECONTROLS', 'AI_BUILDER', 'WORKFLOW_MULTI_NODE', 'MISC_SHELL', 'CUSTOM'])\n .describe('Sandbox template type'),\n mode: z\n .enum(['DEPLOYMENT', 'JOB'])\n .optional()\n .describe('Run mode: DEPLOYMENT (long-running) or JOB (run-to-completion)'),\n containers: z\n .array(\n z.object({\n name: z.string().describe('Container name'),\n image: z.string().describe('Container image'),\n ports: z\n .array(\n z.object({\n containerPort: z.number().describe('Container port'),\n name: z.string().optional().describe('Port name'),\n protocol: z.string().optional().describe('Protocol (TCP, UDP)'),\n }),\n )\n .optional()\n .describe('Exposed ports'),\n env: z\n .array(\n z.object({\n name: z.string().describe('Env var name'),\n value: z.string().describe('Env var value'),\n }),\n )\n .optional()\n .describe('Environment variables'),\n command: z.array(z.string()).optional().describe('Container entrypoint command'),\n args: z.array(z.string()).optional().describe('Container arguments'),\n }),\n )\n .optional()\n .describe('Container specifications (uses template defaults if omitted)'),\n ttlSeconds: z.number().optional().describe('Time-to-live in seconds'),\n resources: z\n .object({\n cpuRequest: z.string().optional(),\n cpuLimit: z.string().optional(),\n memoryRequest: z.string().optional(),\n memoryLimit: z.string().optional(),\n })\n .optional()\n .describe('Resource requests/limits'),\n description: z.string().optional().describe('Sandbox description'),\n templateId: z.string().optional().describe('Sandbox template config ID to use'),\n },\n },\n async ({\n name,\n template,\n mode,\n containers,\n ttlSeconds,\n resources,\n description,\n templateId,\n }) => {\n try {\n const input: Record<string, unknown> = { name, template };\n if (mode !== undefined) input.mode = mode;\n if (containers !== undefined) input.containers = containers;\n if (ttlSeconds !== undefined) input.ttlSeconds = ttlSeconds;\n if (resources !== undefined) input.resources = resources;\n if (description !== undefined) input.description = description;\n if (templateId !== undefined) input.templateId = templateId;\n\n const data = await ctx.gql.workspace.request<{ createSandbox: unknown }>(CREATE_SANDBOX, {\n input,\n });\n return jsonResult(data.createSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_create failed', { error });\n return errorResult(\n `Failed to create sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_delete')),\n {\n title: 'Delete Sandbox',\n description: 'Delete a sandbox and its Kubernetes resources.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ deleteSandbox: unknown }>(DELETE_SANDBOX, {\n id,\n });\n return jsonResult({ deleted: data.deleteSandbox, sandboxId: id });\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_delete failed', { error });\n return errorResult(\n `Failed to delete sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_stop')),\n {\n title: 'Stop Sandbox',\n description: 'Stop a running sandbox.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ stopSandbox: unknown }>(STOP_SANDBOX, {\n id,\n });\n return jsonResult(data.stopSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_stop failed', { error });\n return errorResult(\n `Failed to stop sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_start')),\n {\n title: 'Start Sandbox',\n description: 'Start a stopped sandbox.',\n inputSchema: { id: z.string().describe('Sandbox ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ startSandbox: unknown }>(START_SANDBOX, {\n id,\n });\n return jsonResult(data.startSandbox);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_start failed', { error });\n return errorResult(\n `Failed to start sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_extend')),\n {\n title: 'Extend Sandbox TTL',\n description: 'Extend the time-to-live of a sandbox.',\n inputSchema: {\n id: z.string().describe('Sandbox ID'),\n additionalSeconds: z.number().describe('Number of seconds to add to the TTL'),\n },\n },\n async ({ id, additionalSeconds }) => {\n try {\n const data = await ctx.gql.workspace.request<{ extendSandboxTTL: unknown }>(\n EXTEND_SANDBOX_TTL,\n {\n id,\n additionalSeconds,\n },\n );\n return jsonResult(data.extendSandboxTTL);\n } catch (error) {\n ctx.logger.error('vibecontrols_sandbox_extend failed', { error });\n return errorResult(\n `Failed to extend sandbox TTL: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Templates ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_list')),\n {\n title: 'List Sandbox Templates',\n description: 'List sandbox template configurations available in this workspace.',\n inputSchema: {\n template: z.string().optional().describe('Filter by template kind'),\n limit: z.number().optional(),\n offset: z.number().optional(),\n },\n },\n async ({ template, limit, offset }) => {\n try {\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n const data = await ctx.gql.workspace.request<{ listSandboxTemplates: unknown }>(\n LIST_SANDBOX_TEMPLATES,\n {\n template,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n },\n );\n return jsonResult(data.listSandboxTemplates);\n } catch (error) {\n ctx.logger.error('sandbox_templates_list failed', { error });\n return errorResult(\n `Failed to list templates: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_get')),\n {\n title: 'Get Sandbox Template',\n description: 'Get a sandbox template by ID.',\n inputSchema: { id: z.string().describe('Template ID') },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxTemplate: unknown }>(\n GET_SANDBOX_TEMPLATE,\n { id },\n );\n return jsonResult(data.getSandboxTemplate);\n } catch (error) {\n ctx.logger.error('sandbox_templates_get failed', { error });\n return errorResult(\n `Failed to get template: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_create')),\n {\n title: 'Create Sandbox Template',\n description: 'Create a new sandbox template configuration.',\n inputSchema: {\n name: z.string(),\n template: z.enum([\n 'VIBECONTROLS',\n 'AI_BUILDER',\n 'WORKFLOW_MULTI_NODE',\n 'MISC_SHELL',\n 'CUSTOM',\n 'DOCS_BUILDER',\n ]),\n description: z.string().optional(),\n isDefault: z.boolean().optional(),\n ttlSeconds: z.number().optional(),\n },\n },\n async ({ name, template, description, isDefault, ttlSeconds }) => {\n try {\n const input: Record<string, unknown> = { name, template };\n if (description !== undefined) input.description = description;\n if (isDefault !== undefined) input.isDefault = isDefault;\n if (ttlSeconds !== undefined) input.ttlSeconds = ttlSeconds;\n const data = await ctx.gql.workspace.request<{ createSandboxTemplate: unknown }>(\n CREATE_SANDBOX_TEMPLATE,\n { input },\n );\n return jsonResult(data.createSandboxTemplate);\n } catch (error) {\n ctx.logger.error('sandbox_templates_create failed', { error });\n return errorResult(\n `Failed to create template: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_update')),\n {\n title: 'Update Sandbox Template',\n description: 'Update a sandbox template configuration.',\n inputSchema: {\n id: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n isDefault: z.boolean().optional(),\n ttlSeconds: z.number().optional(),\n },\n },\n async ({ id, name, description, isDefault, ttlSeconds }) => {\n try {\n const input: Record<string, unknown> = { id };\n if (name !== undefined) input.name = name;\n if (description !== undefined) input.description = description;\n if (isDefault !== undefined) input.isDefault = isDefault;\n if (ttlSeconds !== undefined) input.ttlSeconds = ttlSeconds;\n const data = await ctx.gql.workspace.request<{ updateSandboxTemplate: unknown }>(\n UPDATE_SANDBOX_TEMPLATE,\n { input },\n );\n return jsonResult(data.updateSandboxTemplate);\n } catch (error) {\n ctx.logger.error('sandbox_templates_update failed', { error });\n return errorResult(\n `Failed to update template: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_templates_delete')),\n {\n title: 'Delete Sandbox Template',\n description: 'Delete a sandbox template configuration.',\n inputSchema: { id: z.string() },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ deleteSandboxTemplate: unknown }>(\n DELETE_SANDBOX_TEMPLATE,\n { id },\n );\n return jsonResult({ deleted: data.deleteSandboxTemplate, templateId: id });\n } catch (error) {\n ctx.logger.error('sandbox_templates_delete failed', { error });\n return errorResult(\n `Failed to delete template: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Tags ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_list')),\n {\n title: 'List Available Sandbox Tags',\n description: 'List available sandbox tags in the workspace.',\n inputSchema: {\n query: z.string().optional(),\n limit: z.number().optional(),\n },\n },\n async ({ query, limit }) => {\n try {\n const data = await ctx.gql.workspace.request<{ availableSandboxTags: unknown }>(\n AVAILABLE_SANDBOX_TAGS,\n { query, limit },\n );\n return jsonResult(data.availableSandboxTags);\n } catch (error) {\n ctx.logger.error('sandbox_tags_list failed', { error });\n return errorResult(\n `Failed to list tags: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_get')),\n {\n title: 'Get Sandbox Tags',\n description: 'Get tag assignments for a sandbox.',\n inputSchema: { sandboxId: z.string() },\n },\n async ({ sandboxId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxTags: unknown }>(\n GET_SANDBOX_TAGS,\n { input: { sandboxId } },\n );\n return jsonResult(data.getSandboxTags);\n } catch (error) {\n ctx.logger.error('sandbox_tags_get failed', { error });\n return errorResult(\n `Failed to get tags: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_create')),\n {\n title: 'Create Sandbox Tag',\n description: 'Create a new sandbox tag.',\n inputSchema: {\n label: z.string(),\n color: z.string().optional(),\n },\n },\n async ({ label, color }) => {\n try {\n const input: Record<string, unknown> = { label };\n if (color !== undefined) input.color = color;\n const data = await ctx.gql.workspace.request<{ createSandboxTag: unknown }>(\n CREATE_SANDBOX_TAG,\n { input },\n );\n return jsonResult(data.createSandboxTag);\n } catch (error) {\n ctx.logger.error('sandbox_tags_create failed', { error });\n return errorResult(\n `Failed to create tag: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_attach')),\n {\n title: 'Attach Tag to Sandbox',\n description: 'Attach a tag to a sandbox.',\n inputSchema: {\n sandboxId: z.string(),\n tagId: z.string(),\n source: z.string().optional(),\n },\n },\n async ({ sandboxId, tagId, source }) => {\n try {\n const input: Record<string, unknown> = { sandboxId, tagId };\n if (source !== undefined) input.source = source;\n const data = await ctx.gql.workspace.request<{ tagSandbox: unknown }>(TAG_SANDBOX, {\n input,\n });\n return jsonResult(data.tagSandbox);\n } catch (error) {\n ctx.logger.error('sandbox_tags_attach failed', { error });\n return errorResult(\n `Failed to attach tag: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_detach')),\n {\n title: 'Detach Tag from Sandbox',\n description: 'Detach a tag from a sandbox.',\n inputSchema: {\n sandboxId: z.string(),\n tagId: z.string(),\n },\n },\n async ({ sandboxId, tagId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ untagSandbox: unknown }>(UNTAG_SANDBOX, {\n input: { sandboxId, tagId },\n });\n return jsonResult({ detached: data.untagSandbox, sandboxId, tagId });\n } catch (error) {\n ctx.logger.error('sandbox_tags_detach failed', { error });\n return errorResult(\n `Failed to detach tag: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_tags_replace')),\n {\n title: 'Replace Sandbox Tags',\n description: 'Replace the full set of tags on a sandbox.',\n inputSchema: {\n sandboxId: z.string(),\n tagIds: z.array(z.string()),\n },\n },\n async ({ sandboxId, tagIds }) => {\n try {\n const data = await ctx.gql.workspace.request<{ replaceSandboxTags: unknown }>(\n REPLACE_SANDBOX_TAGS,\n { input: { sandboxId, tagIds } },\n );\n return jsonResult(data.replaceSandboxTags);\n } catch (error) {\n ctx.logger.error('sandbox_tags_replace failed', { error });\n return errorResult(\n `Failed to replace tags: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Admin / observability ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_list_all')),\n {\n title: 'List All Sandboxes (admin)',\n description: 'Admin-only list across the entire workspace including internal sandboxes.',\n inputSchema: {\n status: z.string().optional(),\n template: z.string().optional(),\n limit: z.number().optional(),\n offset: z.number().optional(),\n },\n },\n async ({ status, template, limit, offset }) => {\n try {\n const filter: Record<string, unknown> = {};\n if (status !== undefined) filter.status = status;\n if (template !== undefined) filter.template = template;\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n const data = await ctx.gql.workspace.request<{ listAllSandboxes: unknown }>(\n LIST_ALL_SANDBOXES,\n {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n },\n );\n return jsonResult(data.listAllSandboxes);\n } catch (error) {\n ctx.logger.error('sandbox_admin_list_all failed', { error });\n return errorResult(\n `Failed to list all sandboxes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_nodes_list')),\n {\n title: 'List Sandbox Nodes',\n description: 'List Kubernetes nodes hosting sandbox workloads with capacity info.',\n inputSchema: {},\n },\n async () => {\n try {\n const data = await ctx.gql.workspace.request<{ listSandboxNodes: unknown }>(\n LIST_SANDBOX_NODES,\n {},\n );\n return jsonResult(data.listSandboxNodes);\n } catch (error) {\n ctx.logger.error('sandbox_admin_nodes_list failed', { error });\n return errorResult(\n `Failed to list nodes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_active')),\n {\n title: 'Get Active Sandboxes',\n description: 'Get currently active sandboxes in the workspace.',\n inputSchema: {},\n },\n async () => {\n try {\n const data = await ctx.gql.workspace.request<{ getActiveSandboxes: unknown }>(\n GET_ACTIVE_SANDBOXES,\n {},\n );\n return jsonResult(data.getActiveSandboxes);\n } catch (error) {\n ctx.logger.error('sandbox_admin_active failed', { error });\n return errorResult(\n `Failed to get active sandboxes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_activity')),\n {\n title: 'Recent Sandbox Activity',\n description: 'Get recent sandbox lifecycle activity (create/stop/delete/extend).',\n inputSchema: { limit: z.number().optional() },\n },\n async ({ limit }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getRecentSandboxActivity: unknown }>(\n GET_RECENT_SANDBOX_ACTIVITY,\n { limit },\n );\n return jsonResult(data.getRecentSandboxActivity);\n } catch (error) {\n ctx.logger.error('sandbox_admin_activity failed', { error });\n return errorResult(\n `Failed to get activity: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_stats')),\n {\n title: 'Sandbox Stats',\n description: 'Get aggregate sandbox usage statistics for the workspace.',\n inputSchema: {},\n },\n async () => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxStats: unknown }>(\n GET_SANDBOX_STATS,\n {},\n );\n return jsonResult(data.getSandboxStats);\n } catch (error) {\n ctx.logger.error('sandbox_admin_stats failed', { error });\n return errorResult(\n `Failed to get stats: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_logs')),\n {\n title: 'Get Sandbox Logs',\n description: 'Fetch logs for a sandbox container.',\n inputSchema: {\n id: z.string(),\n containerName: z.string(),\n tailLines: z.number().optional(),\n },\n },\n async ({ id, containerName, tailLines }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxLogs: string }>(GET_SANDBOX_LOGS, {\n id,\n containerName,\n tailLines,\n });\n return jsonResult({ logs: data.getSandboxLogs });\n } catch (error) {\n ctx.logger.error('sandbox_admin_logs failed', { error });\n return errorResult(\n `Failed to get logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_config_get')),\n {\n title: 'Get Sandbox Config',\n description: 'Get the per-workspace sandbox configuration limits.',\n inputSchema: {},\n },\n async () => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxConfig: unknown }>(\n GET_SANDBOX_CONFIG,\n {},\n );\n return jsonResult(data.getSandboxConfig);\n } catch (error) {\n ctx.logger.error('sandbox_admin_config_get failed', { error });\n return errorResult(\n `Failed to get config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_admin_config_set')),\n {\n title: 'Update Sandbox Config',\n description: 'Update the per-workspace sandbox configuration limits.',\n inputSchema: {\n defaultTtlSeconds: z.number().optional(),\n maxTtlSeconds: z.number().optional(),\n maxConcurrentPerUser: z.number().optional(),\n maxConcurrentPerWorkspace: z.number().optional(),\n },\n },\n async ({\n defaultTtlSeconds,\n maxTtlSeconds,\n maxConcurrentPerUser,\n maxConcurrentPerWorkspace,\n }) => {\n try {\n const input: Record<string, unknown> = {};\n if (defaultTtlSeconds !== undefined) input.defaultTtlSeconds = defaultTtlSeconds;\n if (maxTtlSeconds !== undefined) input.maxTtlSeconds = maxTtlSeconds;\n if (maxConcurrentPerUser !== undefined) input.maxConcurrentPerUser = maxConcurrentPerUser;\n if (maxConcurrentPerWorkspace !== undefined)\n input.maxConcurrentPerWorkspace = maxConcurrentPerWorkspace;\n const data = await ctx.gql.workspace.request<{ updateSandboxConfig: unknown }>(\n UPDATE_SANDBOX_CONFIG,\n { input },\n );\n return jsonResult(data.updateSandboxConfig);\n } catch (error) {\n ctx.logger.error('sandbox_admin_config_set failed', { error });\n return errorResult(\n `Failed to update config: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Export ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_create')),\n {\n title: 'Create Sandbox Export Job',\n description: 'Kick off an async job to export sandboxes for the workspace.',\n inputSchema: {\n workspaceId: z.string(),\n format: z.enum(['CSV', 'JSON']),\n includeUsageEvents: z.boolean().optional(),\n },\n },\n async ({ workspaceId, format, includeUsageEvents }) => {\n try {\n const input: Record<string, unknown> = { workspaceId, format };\n if (includeUsageEvents !== undefined) input.includeUsageEvents = includeUsageEvents;\n const data = await ctx.gql.workspace.request<{ exportSandboxes: unknown }>(\n EXPORT_SANDBOXES,\n { input },\n );\n return jsonResult(data.exportSandboxes);\n } catch (error) {\n ctx.logger.error('sandbox_export_create failed', { error });\n return errorResult(\n `Failed to create export: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_get')),\n {\n title: 'Get Sandbox Export Job',\n description:\n 'Get a sandbox export job by ID. Poll this to track progress (MCP has no subscriptions).',\n inputSchema: {\n workspaceId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ workspaceId, jobId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxExportJob: unknown }>(\n GET_SANDBOX_EXPORT_JOB,\n { workspaceId, jobId },\n );\n return jsonResult(data.getSandboxExportJob);\n } catch (error) {\n ctx.logger.error('sandbox_export_get failed', { error });\n return errorResult(\n `Failed to get export job: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_list')),\n {\n title: 'List Sandbox Export Jobs',\n description: 'List sandbox export jobs for a workspace.',\n inputSchema: {\n workspaceId: z.string(),\n limit: z.number().optional(),\n offset: z.number().optional(),\n },\n },\n async ({ workspaceId, limit, offset }) => {\n try {\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n const data = await ctx.gql.workspace.request<{ listSandboxExportJobs: unknown }>(\n LIST_SANDBOX_EXPORT_JOBS,\n {\n workspaceId,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n },\n );\n return jsonResult(data.listSandboxExportJobs);\n } catch (error) {\n ctx.logger.error('sandbox_export_list failed', { error });\n return errorResult(\n `Failed to list export jobs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_get_artifact_bytes')),\n {\n title: 'Get Sandbox Artifact Bytes',\n description: 'Fetch raw artifact bytes for a sandbox session (base64-encoded, 50 MB cap).',\n inputSchema: {\n sandboxId: z.string(),\n sessionId: z.string(),\n path: z.string(),\n onBehalfOfUserId: z.string().optional(),\n },\n },\n async ({ sandboxId, sessionId, path, onBehalfOfUserId }) => {\n try {\n const input: Record<string, unknown> = { sandboxId, sessionId, path };\n if (onBehalfOfUserId !== undefined) input.onBehalfOfUserId = onBehalfOfUserId;\n const data = await ctx.gql.workspace.request<{ getSandboxArtifactBytes: unknown }>(\n GET_SANDBOX_ARTIFACT_BYTES,\n { input },\n );\n return jsonResult(data.getSandboxArtifactBytes);\n } catch (error) {\n ctx.logger.error('sandbox_export_get_artifact_bytes failed', { error });\n return errorResult(\n `Failed to get artifact bytes: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Proxy ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_proxy_request')),\n {\n title: 'Proxy HTTP Request to Sandbox',\n description: 'Proxy an HTTP request to a service running inside a sandbox container.',\n inputSchema: {\n sandboxId: z.string(),\n method: z.string(),\n path: z.string(),\n body: z.unknown().optional(),\n containerName: z.string().optional(),\n },\n },\n async ({ sandboxId, method, path, body, containerName }) => {\n try {\n const input: Record<string, unknown> = { sandboxId, method, path };\n if (body !== undefined) input.body = body;\n if (containerName !== undefined) input.containerName = containerName;\n const data = await ctx.gql.workspace.request<{ proxySandboxRequest: unknown }>(\n PROXY_SANDBOX_REQUEST,\n { input },\n );\n return jsonResult(data.proxySandboxRequest);\n } catch (error) {\n ctx.logger.error('sandbox_proxy_request failed', { error });\n return errorResult(\n `Failed to proxy request: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ---------- Subscription proxies (MCP has no subscriptions — use polling instead) ----------\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_check')),\n {\n title: 'Check Sandbox State',\n description:\n 'Poll a sandbox by ID. MCP has no subscription protocol — call this in a loop to track lifecycle.',\n inputSchema: { id: z.string() },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandbox: unknown }>(GET_SANDBOX, { id });\n return jsonResult(data.getSandbox);\n } catch (error) {\n ctx.logger.error('sandbox_check failed', { error });\n return errorResult(\n `Failed to poll sandbox: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'sandbox_export_check')),\n {\n title: 'Check Sandbox Export Job',\n description:\n 'Poll an export job by ID. MCP has no subscription protocol — call this in a loop to track progress.',\n inputSchema: {\n workspaceId: z.string(),\n jobId: z.string(),\n },\n },\n async ({ workspaceId, jobId }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSandboxExportJob: unknown }>(\n GET_SANDBOX_EXPORT_JOB,\n { workspaceId, jobId },\n );\n return jsonResult(data.getSandboxExportJob);\n } catch (error) {\n ctx.logger.error('sandbox_export_check failed', { error });\n return errorResult(\n `Failed to poll export job: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n}\n","/**\n * Sandbox module — Kubernetes-native sandbox management\n * (<product>_sandbox_{list,get,create,delete,stop,extend}).\n *\n * Backend: ~/products/wspace/sandbox/wspace-sandbox-svc/.\n * Lifted verbatim from vibecontrols-mcp/src/tools/sandboxes.ts.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext, McpModule, ModuleRegistration } from '../../core/index.js';\nimport { registerSandboxTools } from './tools.js';\n\nconst sandboxModule: McpModule = {\n id: 'sandbox',\n version: '0.0.1',\n displayName: 'Sandbox',\n capabilities: { tools: {} },\n\n register(server: McpServer, ctx: McpContext): ModuleRegistration {\n const tools: string[] = [];\n const track = (n: string): string => {\n tools.push(n);\n return n;\n };\n\n registerSandboxTools(server, ctx, track);\n\n return { tools, resources: [], prompts: [] };\n },\n};\n\nexport default sandboxModule;\n"]}
|