{"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","defineMcpTool","Type","defineRoutedContribution","defineMcpPlugin","skillDoompiUseMcp","toolMcpUse","toolSessionMcp"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-mcp.mcp.ts","../../src/services/mcpHeadlessTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp.ts","../../src/schemas/mcpHeadlessTool.ts","../../src/services/mcpSessionTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineMcpSkill({\n  name: 'doompi-use-mcp',\n  description:\n    'Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.',\n  read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-use-mcp/SKILL.md'),\n});\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nexport const MCP_HEADLESS_TOOLS_SERVICE = 'doom/mcp-headless-tools';\n\nexport interface McpHeadlessToolCatalog {\n  get(name: string): DoomHeadlessTool | undefined;\n}\n\nexport function mountMcpHeadlessTools(tools: readonly DoomHeadlessTool[]) {\n  return (context: Context): void => {\n    context.plugin((providerContext) => {\n      providerContext.provide(MCP_HEADLESS_TOOLS_SERVICE, {\n        get: (name) => tools.find((tool) => tool.name === name),\n      } satisfies McpHeadlessToolCatalog);\n    });\n  };\n}\n\nexport function bindMcpHeadlessTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool {\n  const tool = context.services.get<McpHeadlessToolCatalog>(MCP_HEADLESS_TOOLS_SERVICE)?.get(name);\n  if (!tool) throw new Error(`MCP tool is unavailable: ${name}`);\n  return {\n    ...tool,\n    execute(toolCallId, parameters, signal, onUpdate) {\n      const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n      return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n    },\n  };\n}\n","import { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'mcp_use'));\n","import { Type } from 'typebox';\n\nexport const McpHeadlessToolParameters = Type.Object({\n  server: Type.String({ minLength: 1 }),\n  tool: Type.String({ minLength: 1 }),\n  arguments: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n});\n","import type { DoomChildSessionTool } from '@agimon-ai/doompi-core/childSession';\nimport type { DoomHeadlessToolResult } from '@agimon-ai/doompi-core/headless';\nimport type { Static } from 'typebox';\nimport { Value } from 'typebox/value';\n\nimport { McpHeadlessToolParameters } from '../../schemas/mcpHeadlessTool';\nimport type { CatalogTool } from '../mcpCatalog';\nimport type { McpSession } from '../mcpSession';\n\nexport const MCP_SESSION_TOOLS_SERVICE = 'doom/mcp-session-tools';\n\n/** Narrow cross-root access to the Pi session's existing upstream MCP runtime. */\nexport interface McpSessionToolsService {\n  readonly generation: string;\n  snapshot(): readonly CatalogTool[];\n  onChange(listener: () => void): () => void;\n  invoke(name: string, parameters: Record<string, unknown>, signal?: AbortSignal): Promise<DoomHeadlessToolResult>;\n}\n\nexport function createMcpSessionToolsService(session: McpSession, generation: string): McpSessionToolsService {\n  return Object.freeze({\n    generation,\n    snapshot: () => session.activeToolDefinitions(),\n    onChange: (listener: () => void) => session.onChange(listener),\n    invoke: (name: string, parameters: Record<string, unknown>, signal?: AbortSignal) =>\n      session.invokeTool(name, parameters, signal),\n  });\n}\n\n/** Borrow an existing MCP runtime; a child never starts or disposes its own upstream connections. */\nexport function createMcpChildTool(\n  invoke: (\n    parameters: Static<typeof McpHeadlessToolParameters>,\n    signal?: AbortSignal,\n  ) => Promise<DoomHeadlessToolResult>,\n): DoomChildSessionTool {\n  return {\n    name: 'mcp',\n    description: 'Call a tool exposed by a connected MCP server.',\n    parameters: McpHeadlessToolParameters,\n    async execute(_toolCallId, parameters, signal) {\n      signal?.throwIfAborted();\n      if (!Value.Check(McpHeadlessToolParameters, parameters)) throw new Error('Invalid MCP tool arguments.');\n      const result = await invoke(parameters, signal);\n      signal?.throwIfAborted();\n      return result;\n    },\n  };\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { TSchema } from 'typebox';\n\nimport { MCP_SESSION_TOOLS_SERVICE, type McpSessionToolsService } from '../../../../../services/mcpSessionTools';\n\nfunction fingerprint(service: McpSessionToolsService): string {\n  return JSON.stringify(\n    service.snapshot().map((tool) => ({\n      name: tool.piName,\n      description: tool.description,\n      schema: tool.inputSchema,\n      annotations: tool.annotations,\n      outputSchema: tool.outputSchema,\n    })),\n  );\n}\n\nexport default defineRoutedContribution(\n  (context: DoomMcpPluginContext): readonly DoomHeadlessTool[] => {\n    const service = context.services.get<McpSessionToolsService>(MCP_SESSION_TOOLS_SERVICE);\n    if (!service) return [];\n    let current = fingerprint(service);\n    const stop = service.onChange(() => {\n      const next = fingerprint(service);\n      if (next === current) return;\n      current = next;\n      context.refresh();\n    });\n    context.signal.addEventListener('abort', stop, { once: true });\n    return service.snapshot().map((tool) => ({\n      name: tool.piName,\n      label: `${tool.serverName}: ${tool.toolName}`,\n      description: tool.description ?? `${tool.toolName} on the ${tool.serverName} MCP server.`,\n      ...(tool.annotations === undefined ? {} : { annotations: tool.annotations }),\n      ...(tool.outputSchema === undefined ? {} : { outputSchema: tool.outputSchema }),\n      parameters: (Object.keys(tool.inputSchema).length > 0\n        ? tool.inputSchema\n        : { type: 'object', properties: {} }) as TSchema,\n      execute: (_toolCallId, parameters, signal) =>\n        service.invoke(\n          tool.piName,\n          (parameters ?? {}) as Record<string, unknown>,\n          AbortSignal.any([context.signal, signal ?? context.signal]),\n        ),\n    }));\n  },\n  { cardinality: 'many' },\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport skillDoompiUseMcp from '../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-mcp.mcp';\nimport toolMcpUse from '../src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp';\nimport toolSessionMcp from '../src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n  typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n  const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n  return Array.isArray(resolved) ? resolved : [resolved as T];\n};\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n  (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n  ...value, _meta: { ...(value as { _meta?: object })._meta, [\"doompi/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n  name: '@agimon-ai/doompi-mcp',\n  session: (context) => ({\n    get skills(): DoomMcpSessionPlugin['skills'] { return [at(skillDoompiUseMcp, context)]; },\n    get tools(): DoomMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/doompi-mcp/mcp_use\", via({ name: 'mcp_use' }, at(toolMcpUse, context))), ...many(toolSessionMcp, context).map((tool) => withWidget(\"@agimon-ai/doompi-mcp/session_mcp\", tool))]; },\n  }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}