@agimon-ai/doompi-mcp 0.0.1-alpha.97 → 0.0.1-alpha.99
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/extensions/pi.cjs
CHANGED
|
@@ -70,6 +70,11 @@ function createMcpPiRuntime(runtime) {
|
|
|
70
70
|
const hostSession = sessionContext.get(_agimon_ai_doompi_core_cordisHost.DOOM_CORDIS_SESSION_SERVICE);
|
|
71
71
|
const context = hostSession.context;
|
|
72
72
|
const expectedSessionId = hostSession.sessionId;
|
|
73
|
+
const serverServices = sessionContext.get(_agimon_ai_doompi_core_cordisHost.DOOM_CORDIS_SERVER_SERVICES);
|
|
74
|
+
if (serverServices !== void 0) {
|
|
75
|
+
if (serverServices.sessionId !== expectedSessionId) throw new Error("MCP server services belong to a different session");
|
|
76
|
+
if (serverServices.get("doom/mcp-session-tools") !== void 0) return;
|
|
77
|
+
}
|
|
73
78
|
let sessionActive = true;
|
|
74
79
|
activeContext = context;
|
|
75
80
|
const publishServerStatus = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.cjs","names":["PACKAGE_SOURCE","LEADER_BINDING_PREFIX","LEADER_GROUP","LEADER_DETAIL","path","McpSession","DOOM_UI_HUB_SERVICE","requireDoomUiHub","DOOM_TOOL_SURFACE_SERVICE","requireDoomToolSurface","DOOM_CORDIS_SESSION_SERVICE","MCP_STATUS_KEY","MCP_SESSION_AUTH_STATUS_KEY","formatMcpSessionAuthStatus","readSessionConfig","DOOM_MCP_PROJECTION_SERVICE","readDoomMcpProjectionService","mcpSessionConfigFromProjection","createMcpSessionToolsService","createMcpChildTool","DOOM_MCP_STATUS_SERVICE","DOOM_MCP_TOOL_RESOLVER_SERVICE","MCP_SESSION_TOOLS_SERVICE","DOOM_CHILD_SESSION_MCP_TOOL_SERVICE","defineRoot","defineRoutedContribution","createMcpCommand","defineResource","createMcpTool","wrapTextWithAnsi","truncateToWidth","renderToolHeading","DoomToolCall","defineRoutedContribution","definePiExtension","rootSession","composeRootHooks","commandMcp","resourceDoompiUseMcp","piToolContributions","toolMcp"],"sources":["../../src/services/leader/index.ts","../../src/services/piRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/piRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/mcp.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-mcp.cli.ts","../../src/services/mcpToolCollection/index.ts","../../src/tui/mcpToolRender.ts","../../src/extensions/workspaces/sessions/(backend)/tool/mcp.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type { DoomUiHubService } from '@agimon-ai/doompi-core/uiHub';\n\nimport { COMMAND_NAME } from '../../constants/mcp';\nimport {\n LEADER_BINDING_PREFIX,\n LEADER_DETAIL,\n LEADER_GROUP,\n LEADER_KEY,\n LEADER_LABEL,\n PACKAGE_SOURCE,\n} from '../../constants/piMcp';\n\nexport function registerLeaderContribution(hub: DoomUiHubService): () => void {\n const contribution = hub.registerLeader({\n source: PACKAGE_SOURCE,\n bindings: [\n {\n id: `${LEADER_BINDING_PREFIX}.open`,\n path: [LEADER_GROUP, { key: LEADER_KEY, label: LEADER_LABEL, detail: LEADER_DETAIL }],\n command: { name: COMMAND_NAME },\n },\n ],\n });\n return () => contribution.dispose();\n}\n","import path from 'node:path';\n\nimport { DOOM_CHILD_SESSION_MCP_TOOL_SERVICE } from '@agimon-ai/doompi-core/childSession';\nimport type { DoomCordisRuntimeService } from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_MCP_PROJECTION_SERVICE, readDoomMcpProjectionService } from '@agimon-ai/doompi-core/mcpProjection';\nimport { DOOM_MCP_STATUS_SERVICE, type DoomMcpStatusService } from '@agimon-ai/doompi-core/mcpStatus';\nimport {\n DOOM_MCP_TOOL_RESOLVER_SERVICE,\n type DoomMcpToolResolverService,\n} from '@agimon-ai/doompi-core/mcpToolResolver';\nimport { DOOM_TOOL_SURFACE_SERVICE, requireDoomToolSurface } from '@agimon-ai/doompi-core/toolSurface';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/uiHub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { MCP_STATUS_KEY } from '../../constants/piMcp';\nimport { McpSession } from '../../services/mcpSession';\nimport { mcpSessionConfigFromProjection } from '../../services/projection';\nimport { readSessionConfig } from '../../services/sessionConfig';\nimport type { McpSessionConfig } from '../../types/mcpConfig';\nimport { formatMcpSessionAuthStatus, MCP_SESSION_AUTH_STATUS_KEY } from '../../types/webMcp';\nimport { registerLeaderContribution } from '../leader';\nimport { createMcpChildTool, createMcpSessionToolsService, MCP_SESSION_TOOLS_SERVICE } from '../mcpSessionTools';\n\nconst WARNING = 'warning';\n\nfunction failClosedSessionConfig(cwd: string): McpSessionConfig {\n return {\n enabled: false,\n repoRoot: cwd,\n stagingDirectory: path.join(cwd, '.doom', 'mcp-disabled'),\n sources: [],\n };\n}\n\nexport function createMcpPiRuntime(runtime: DoomCordisRuntimeService) {\n const mode = runtime.mode;\n let activeContext: ExtensionContext | undefined;\n let disposed = false;\n const session = new McpSession({\n // Browser hosts read the URL from the MCP status panel, so only the TUI acts on it here.\n onAuthorizationUrl: async (url, serverName, { openBrowser }) => {\n const context = activeContext;\n if (context?.mode !== 'tui' || !openBrowser) return;\n try {\n const { default: open } = await import('open');\n await open(url.toString());\n } catch (error) {\n context.ui.notify(\n `Could not open the authorization page for ${serverName}: ${error instanceof Error ? error.message : String(error)}. Press a in the MCP overlay to retry.`,\n WARNING,\n );\n throw error;\n }\n },\n });\n\n return {\n session,\n services: [\n (cordis: Context) => {\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => registerLeaderContribution(requireDoomUiHub(uiContext)));\n // The surface lives on the session fiber, so this resolves after install has\n // already registered the cached wrappers: binding is what first hides the ones\n // no server has confirmed.\n cordis.inject([DOOM_TOOL_SURFACE_SERVICE], (surfaceContext) =>\n session.bindToolSurface(requireDoomToolSurface(surfaceContext)),\n );\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], async (sessionContext) => {\n const hostSession = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const context = hostSession.context;\n const expectedSessionId = hostSession.sessionId;\n let sessionActive = true;\n activeContext = context;\n // The legacy server-name status remains available to every UI. The compact\n // authorization status is browser-only so the TUI footer stays unchanged.\n const publishServerStatus = (): void => {\n const servers = session.getSnapshot().servers;\n const names = servers.map((server) => server.name).join(',');\n context.ui?.setStatus(MCP_STATUS_KEY, names);\n if (context.mode !== 'tui') {\n context.ui?.setStatus(MCP_SESSION_AUTH_STATUS_KEY, formatMcpSessionAuthStatus(session.getServers()));\n }\n };\n const stopPublishing = session.onChange(publishServerStatus);\n publishServerStatus();\n\n if (mode === 'standalone') {\n await session.reconfigure(readSessionConfig(process.env, context.cwd), context.cwd);\n } else {\n await session.reconfigure(failClosedSessionConfig(context.cwd));\n sessionContext.inject([DOOM_MCP_PROJECTION_SERVICE], async (projectionContext) => {\n const projection = readDoomMcpProjectionService(projectionContext);\n if (!projection || projection.sessionId !== expectedSessionId) {\n await session.reconfigure(failClosedSessionConfig(context.cwd));\n if (projection && sessionActive && !disposed) {\n context.ui?.notify(\n `The Doom MCP projection belongs to session \"${projection.sessionId}\", not \"${expectedSessionId}\"; MCP is disabled.`,\n WARNING,\n );\n }\n } else {\n const snapshot = projection.getSnapshot();\n await session.reconfigure(\n mcpSessionConfigFromProjection(snapshot, context.cwd),\n context.cwd,\n snapshot.repoRoot,\n );\n }\n return async () => {\n if (sessionActive && !disposed) await session.reconfigure(failClosedSessionConfig(context.cwd));\n };\n });\n }\n\n const status: DoomMcpStatusService = Object.freeze({\n generation: `${hostSession.generation}:mcp-status`,\n getSnapshot: () => session.getSnapshot(),\n onChange: (listener: () => void) => session.onChange(listener),\n });\n const toolResolver: DoomMcpToolResolverService = Object.freeze({\n generation: `${hostSession.generation}:mcp-tool-resolver`,\n resolve: (selectors: readonly string[]) => session.resolveToolSelectors(selectors),\n });\n const sessionTools = createMcpSessionToolsService(session, `${hostSession.generation}:mcp-tools`);\n const childTool = createMcpChildTool(async (parameters, signal) => {\n if (!sessionActive || disposed) throw new Error('The parent MCP session is no longer available.');\n const tool = sessionTools\n .snapshot()\n .find(\n (candidate) => candidate.serverName === parameters.server && candidate.toolName === parameters.tool,\n );\n if (!tool)\n throw new Error(\n `MCP tool ${parameters.server}/${parameters.tool} is not available in the current session configuration.`,\n );\n return sessionTools.invoke(tool.piName, parameters.arguments ?? {}, signal);\n });\n sessionContext.plugin((providerContext) => {\n providerContext.provide(DOOM_MCP_STATUS_SERVICE, status);\n providerContext.provide(DOOM_MCP_TOOL_RESOLVER_SERVICE, toolResolver);\n providerContext.provide(MCP_SESSION_TOOLS_SERVICE, sessionTools);\n providerContext.provide(DOOM_CHILD_SESSION_MCP_TOOL_SERVICE, childTool);\n });\n for (const diagnostic of session.getDiagnostics()) context.ui?.notify(diagnostic, WARNING);\n return async () => {\n sessionActive = false;\n stopPublishing();\n context.ui?.setStatus(MCP_STATUS_KEY, undefined);\n if (context.mode !== 'tui') context.ui?.setStatus(MCP_SESSION_AUTH_STATUS_KEY, undefined);\n if (activeContext === context) activeContext = undefined;\n if (!disposed) await session.reconfigure(failClosedSessionConfig(context.cwd));\n };\n });\n },\n ],\n async onDispose() {\n disposed = true;\n activeContext = undefined;\n await session.dispose();\n },\n };\n}\n","import type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpPiRuntime } from '../../../../../services/piRuntime';\nexport const createMcpPiRoot = ({ runtime }: PiPluginContext) => {\n if (!runtime) throw new Error('MCP requires the Cordis runtime mode.');\n const state = createMcpPiRuntime(runtime);\n return { value: state, services: state.services, onDispose: () => state.onDispose() };\n};\nexport type McpPiScope = Awaited<ReturnType<typeof createMcpPiRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createMcpPiRoot } from './_lib/piRoot';\n\nexport default defineRoot(createMcpPiRoot);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpCommand } from '../../../../../services/mcpCommand';\nimport type { McpPiScope } from '../_lib/piRoot';\nexport default defineRoutedContribution(\n (context: WithRoot<PiPluginContext<unknown>, McpPiScope>) =>\n [\n createMcpCommand(context.root.session, {\n openOverlay: async (ctx) => {\n const { openMcpOverlay } = await import('../../../../../tui/mcpOverlay');\n return openMcpOverlay(ctx, context.root.session);\n },\n }),\n ] as const,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nexport default defineResource({\n source: '@agimon-ai/doompi-mcp',\n moduleUrl: import.meta.url,\n skills: [\n {\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 },\n ],\n});\n","import type { PiToolCollection, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { CatalogTool } from '../../services/mcpCatalog';\nimport type { McpSession } from '../../services/mcpSession';\nimport { createMcpTool, type McpToolRenderers } from '../mcpTools';\nexport function createMcpToolCollection(\n session: McpSession,\n renderers: (tool: CatalogTool) => McpToolRenderers = () => ({}),\n): PiToolCollection {\n const declarations = new Map<CatalogTool, PiToolDeclaration>();\n return {\n snapshot: (): readonly PiToolDeclaration[] =>\n session.toolDefinitions().map((tool) => {\n let declaration = declarations.get(tool);\n if (!declaration) {\n declaration = createMcpTool(\n session.getClientManager,\n tool,\n (candidate) => session.isToolAvailable(candidate),\n renderers(tool),\n );\n declarations.set(tool, declaration);\n }\n return declaration;\n }),\n subscribe: (listener: () => void) => session.onChange(listener),\n };\n}\n","import { DoomToolCall, renderToolHeading } from '@agimon-ai/doompi-ui/toolChrome';\nimport type { Theme } from '@earendil-works/pi-coding-agent';\nimport { type Component, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';\n\nconst COLLAPSED_RESULT_LINES = 12;\nconst MAX_ARGUMENTS = 3;\nconst ELLIPSIS = '…';\n\ninterface McpToolTextLayout {\n wrap: boolean;\n separator: boolean;\n trailingBlank: boolean;\n}\n\n/** Bash-compatible width budget, horizontal inset, and structural result divider. */\nclass McpToolText implements Component {\n constructor(\n private readonly lines: readonly string[],\n private readonly layout: McpToolTextLayout,\n private readonly theme: Theme,\n ) {}\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const contentWidth = Math.max(1, width - 2);\n const rendered = this.layout.wrap\n ? this.lines.flatMap((line) => wrapTextWithAnsi(line, contentWidth))\n : this.lines.map((line) => truncateToWidth(line, contentWidth, ELLIPSIS));\n if (this.layout.separator) {\n rendered.unshift(this.theme.fg('borderMuted', '─'.repeat(contentWidth)));\n }\n const padded = rendered.map((line) => ` ${line}`);\n if (this.layout.trailingBlank) padded.push('');\n return padded;\n }\n\n invalidate(): void {\n // Content is immutable and reflows from the current width on every render.\n }\n}\n\nfunction argumentValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (value === null) return 'null';\n if (Array.isArray(value)) return `[${value.length}]`;\n return '{…}';\n}\n\nfunction argumentSummary(params: Record<string, unknown>): string {\n const entries = Object.entries(params);\n const shown = entries.slice(0, MAX_ARGUMENTS).map(([key, value]) => `${key}=${argumentValue(value)}`);\n if (entries.length > shown.length) shown.push(`+${entries.length - shown.length}`);\n return shown.join(' · ');\n}\n\nexport interface McpToolIdentity {\n serverName: string;\n toolName: string;\n}\n\nexport function renderMcpCall(tool: McpToolIdentity, params: Record<string, unknown>, theme: Theme): Component {\n const heading = renderToolHeading('mcp', tool.serverName, theme, 'muted');\n const toolName = theme.fg('accent', tool.toolName);\n const argumentsText = argumentSummary(params);\n const text = `${heading}${theme.fg('muted', ' / ')}${toolName}${\n argumentsText ? ` ${theme.fg('muted', `· ${argumentsText}`)}` : ''\n }`;\n return new DoomToolCall(text);\n}\n\nexport interface McpToolResultLike {\n content?: Array<{ type: string; text?: string }>;\n}\n\nexport interface McpToolResultOptions {\n expanded: boolean;\n isPartial: boolean;\n isError: boolean;\n}\n\nfunction resultLines(result: McpToolResultLike): string[] {\n const text = (result.content ?? []).map((block) => block.text ?? '').join('');\n const lines = text.split('\\n');\n while (lines.length > 0 && lines.at(-1)?.trim() === '') lines.pop();\n return lines;\n}\n\nexport function renderMcpResult(result: McpToolResultLike, options: McpToolResultOptions, theme: Theme): Component {\n const all = resultLines(result);\n const shown = options.expanded ? all : all.slice(0, COLLAPSED_RESULT_LINES);\n const body = shown.map((line) => theme.fg('toolOutput', line));\n\n if (options.isPartial) {\n body.push(theme.fg('warning', '◐') + theme.fg('dim', ' running'));\n } else if (options.isError) {\n body.push(theme.fg('error', '✗') + theme.fg('dim', ' failed'));\n } else if (!options.expanded && all.length > shown.length) {\n body.push(theme.fg('dim', '… ctrl+o'));\n } else if (body.length === 0) {\n body.push(theme.fg('success', '✓') + theme.fg('dim', ' done'));\n }\n\n return new McpToolText(body, { wrap: options.expanded, separator: true, trailingBlank: true }, theme);\n}\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolCollection } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpToolCollection } from '../../../../../services/mcpToolCollection';\nimport { renderMcpCall, renderMcpResult } from '../../../../../tui/mcpToolRender';\nimport type { McpPiScope } from '../_lib/piRoot';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PiPluginContext<unknown>, McpPiScope>): PiToolCollection =>\n createMcpToolCollection(context.root.session, (tool) => ({\n renderCall: (params, theme) => renderMcpCall(tool, params as Record<string, unknown>, theme),\n renderResult: (result, options, theme, execution) =>\n renderMcpResult(result, { ...options, isError: execution.isError }, theme),\n })),\n { cardinality: 'collection' },\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandMcp from '../src/extensions/workspaces/sessions/(backend)/command/mcp.cli';\nimport resourceDoompiUseMcp from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-mcp.cli';\nimport toolMcp from '../src/extensions/workspaces/sessions/(backend)/tool/mcp.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandMcp> | OptionsOf<typeof resourceDoompiUseMcp> | OptionsOf<typeof toolMcp>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\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};\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-mcp', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [...many(commandMcp, contextSession)]; },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseMcp, contextSession)]; },\n ...piToolContributions('@agimon-ai/doompi-mcp', at(toolMcp, contextSession)),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pi.cjs","names":["PACKAGE_SOURCE","LEADER_BINDING_PREFIX","LEADER_GROUP","LEADER_DETAIL","path","McpSession","DOOM_UI_HUB_SERVICE","requireDoomUiHub","DOOM_TOOL_SURFACE_SERVICE","requireDoomToolSurface","DOOM_CORDIS_SESSION_SERVICE","DOOM_CORDIS_SERVER_SERVICES","MCP_STATUS_KEY","MCP_SESSION_AUTH_STATUS_KEY","formatMcpSessionAuthStatus","readSessionConfig","DOOM_MCP_PROJECTION_SERVICE","readDoomMcpProjectionService","mcpSessionConfigFromProjection","createMcpSessionToolsService","createMcpChildTool","DOOM_MCP_STATUS_SERVICE","DOOM_MCP_TOOL_RESOLVER_SERVICE","MCP_SESSION_TOOLS_SERVICE","DOOM_CHILD_SESSION_MCP_TOOL_SERVICE","defineRoot","defineRoutedContribution","createMcpCommand","defineResource","createMcpTool","wrapTextWithAnsi","truncateToWidth","renderToolHeading","DoomToolCall","defineRoutedContribution","definePiExtension","rootSession","composeRootHooks","commandMcp","resourceDoompiUseMcp","piToolContributions","toolMcp"],"sources":["../../src/services/leader/index.ts","../../src/services/piRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/piRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/mcp.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-mcp.cli.ts","../../src/services/mcpToolCollection/index.ts","../../src/tui/mcpToolRender.ts","../../src/extensions/workspaces/sessions/(backend)/tool/mcp.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type { DoomUiHubService } from '@agimon-ai/doompi-core/uiHub';\n\nimport { COMMAND_NAME } from '../../constants/mcp';\nimport {\n LEADER_BINDING_PREFIX,\n LEADER_DETAIL,\n LEADER_GROUP,\n LEADER_KEY,\n LEADER_LABEL,\n PACKAGE_SOURCE,\n} from '../../constants/piMcp';\n\nexport function registerLeaderContribution(hub: DoomUiHubService): () => void {\n const contribution = hub.registerLeader({\n source: PACKAGE_SOURCE,\n bindings: [\n {\n id: `${LEADER_BINDING_PREFIX}.open`,\n path: [LEADER_GROUP, { key: LEADER_KEY, label: LEADER_LABEL, detail: LEADER_DETAIL }],\n command: { name: COMMAND_NAME },\n },\n ],\n });\n return () => contribution.dispose();\n}\n","import path from 'node:path';\n\nimport { DOOM_CHILD_SESSION_MCP_TOOL_SERVICE } from '@agimon-ai/doompi-core/childSession';\nimport type { DoomCordisRuntimeService } from '@agimon-ai/doompi-core/cordisHost';\nimport {\n DOOM_CORDIS_SESSION_SERVICE,\n DOOM_CORDIS_SERVER_SERVICES,\n type DoomCordisSessionService,\n type DoomCordisServerServices,\n} from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_MCP_PROJECTION_SERVICE, readDoomMcpProjectionService } from '@agimon-ai/doompi-core/mcpProjection';\nimport { DOOM_MCP_STATUS_SERVICE, type DoomMcpStatusService } from '@agimon-ai/doompi-core/mcpStatus';\nimport {\n DOOM_MCP_TOOL_RESOLVER_SERVICE,\n type DoomMcpToolResolverService,\n} from '@agimon-ai/doompi-core/mcpToolResolver';\nimport { DOOM_TOOL_SURFACE_SERVICE, requireDoomToolSurface } from '@agimon-ai/doompi-core/toolSurface';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/uiHub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { MCP_STATUS_KEY } from '../../constants/piMcp';\nimport { McpSession } from '../../services/mcpSession';\nimport { mcpSessionConfigFromProjection } from '../../services/projection';\nimport { readSessionConfig } from '../../services/sessionConfig';\nimport type { McpSessionConfig } from '../../types/mcpConfig';\nimport { formatMcpSessionAuthStatus, MCP_SESSION_AUTH_STATUS_KEY } from '../../types/webMcp';\nimport { registerLeaderContribution } from '../leader';\nimport { createMcpChildTool, createMcpSessionToolsService, MCP_SESSION_TOOLS_SERVICE } from '../mcpSessionTools';\n\nconst WARNING = 'warning';\n\nfunction failClosedSessionConfig(cwd: string): McpSessionConfig {\n return {\n enabled: false,\n repoRoot: cwd,\n stagingDirectory: path.join(cwd, '.doom', 'mcp-disabled'),\n sources: [],\n };\n}\n\nexport function createMcpPiRuntime(runtime: DoomCordisRuntimeService) {\n const mode = runtime.mode;\n let activeContext: ExtensionContext | undefined;\n let disposed = false;\n const session = new McpSession({\n // Browser hosts read the URL from the MCP status panel, so only the TUI acts on it here.\n onAuthorizationUrl: async (url, serverName, { openBrowser }) => {\n const context = activeContext;\n if (context?.mode !== 'tui' || !openBrowser) return;\n try {\n const { default: open } = await import('open');\n await open(url.toString());\n } catch (error) {\n context.ui.notify(\n `Could not open the authorization page for ${serverName}: ${error instanceof Error ? error.message : String(error)}. Press a in the MCP overlay to retry.`,\n WARNING,\n );\n throw error;\n }\n },\n });\n\n return {\n session,\n services: [\n (cordis: Context) => {\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => registerLeaderContribution(requireDoomUiHub(uiContext)));\n // The surface lives on the session fiber, so this resolves after install has\n // already registered the cached wrappers: binding is what first hides the ones\n // no server has confirmed.\n cordis.inject([DOOM_TOOL_SURFACE_SERVICE], (surfaceContext) =>\n session.bindToolSurface(requireDoomToolSurface(surfaceContext)),\n );\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], async (sessionContext) => {\n const hostSession = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const context = hostSession.context;\n const expectedSessionId = hostSession.sessionId;\n const serverServices = sessionContext.get(DOOM_CORDIS_SERVER_SERVICES) as\n | DoomCordisServerServices\n | undefined;\n // The server facet already supplies the tools, commands and status for this host.\n // Do not start a second proxy from the preloaded Pi facet. Standalone Pi has no lender.\n if (serverServices !== undefined) {\n if (serverServices.sessionId !== expectedSessionId)\n throw new Error('MCP server services belong to a different session');\n if (serverServices.get(MCP_SESSION_TOOLS_SERVICE) !== undefined) return;\n }\n let sessionActive = true;\n activeContext = context;\n // The legacy server-name status remains available to every UI. The compact\n // authorization status is browser-only so the TUI footer stays unchanged.\n const publishServerStatus = (): void => {\n const servers = session.getSnapshot().servers;\n const names = servers.map((server) => server.name).join(',');\n context.ui?.setStatus(MCP_STATUS_KEY, names);\n if (context.mode !== 'tui') {\n context.ui?.setStatus(MCP_SESSION_AUTH_STATUS_KEY, formatMcpSessionAuthStatus(session.getServers()));\n }\n };\n const stopPublishing = session.onChange(publishServerStatus);\n publishServerStatus();\n\n if (mode === 'standalone') {\n await session.reconfigure(readSessionConfig(process.env, context.cwd), context.cwd);\n } else {\n await session.reconfigure(failClosedSessionConfig(context.cwd));\n sessionContext.inject([DOOM_MCP_PROJECTION_SERVICE], async (projectionContext) => {\n const projection = readDoomMcpProjectionService(projectionContext);\n if (!projection || projection.sessionId !== expectedSessionId) {\n await session.reconfigure(failClosedSessionConfig(context.cwd));\n if (projection && sessionActive && !disposed) {\n context.ui?.notify(\n `The Doom MCP projection belongs to session \"${projection.sessionId}\", not \"${expectedSessionId}\"; MCP is disabled.`,\n WARNING,\n );\n }\n } else {\n const snapshot = projection.getSnapshot();\n await session.reconfigure(\n mcpSessionConfigFromProjection(snapshot, context.cwd),\n context.cwd,\n snapshot.repoRoot,\n );\n }\n return async () => {\n if (sessionActive && !disposed) await session.reconfigure(failClosedSessionConfig(context.cwd));\n };\n });\n }\n\n const status: DoomMcpStatusService = Object.freeze({\n generation: `${hostSession.generation}:mcp-status`,\n getSnapshot: () => session.getSnapshot(),\n onChange: (listener: () => void) => session.onChange(listener),\n });\n const toolResolver: DoomMcpToolResolverService = Object.freeze({\n generation: `${hostSession.generation}:mcp-tool-resolver`,\n resolve: (selectors: readonly string[]) => session.resolveToolSelectors(selectors),\n });\n const sessionTools = createMcpSessionToolsService(session, `${hostSession.generation}:mcp-tools`);\n const childTool = createMcpChildTool(async (parameters, signal) => {\n if (!sessionActive || disposed) throw new Error('The parent MCP session is no longer available.');\n const tool = sessionTools\n .snapshot()\n .find(\n (candidate) => candidate.serverName === parameters.server && candidate.toolName === parameters.tool,\n );\n if (!tool)\n throw new Error(\n `MCP tool ${parameters.server}/${parameters.tool} is not available in the current session configuration.`,\n );\n return sessionTools.invoke(tool.piName, parameters.arguments ?? {}, signal);\n });\n sessionContext.plugin((providerContext) => {\n providerContext.provide(DOOM_MCP_STATUS_SERVICE, status);\n providerContext.provide(DOOM_MCP_TOOL_RESOLVER_SERVICE, toolResolver);\n providerContext.provide(MCP_SESSION_TOOLS_SERVICE, sessionTools);\n providerContext.provide(DOOM_CHILD_SESSION_MCP_TOOL_SERVICE, childTool);\n });\n for (const diagnostic of session.getDiagnostics()) context.ui?.notify(diagnostic, WARNING);\n return async () => {\n sessionActive = false;\n stopPublishing();\n context.ui?.setStatus(MCP_STATUS_KEY, undefined);\n if (context.mode !== 'tui') context.ui?.setStatus(MCP_SESSION_AUTH_STATUS_KEY, undefined);\n if (activeContext === context) activeContext = undefined;\n if (!disposed) await session.reconfigure(failClosedSessionConfig(context.cwd));\n };\n });\n },\n ],\n async onDispose() {\n disposed = true;\n activeContext = undefined;\n await session.dispose();\n },\n };\n}\n","import type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpPiRuntime } from '../../../../../services/piRuntime';\nexport const createMcpPiRoot = ({ runtime }: PiPluginContext) => {\n if (!runtime) throw new Error('MCP requires the Cordis runtime mode.');\n const state = createMcpPiRuntime(runtime);\n return { value: state, services: state.services, onDispose: () => state.onDispose() };\n};\nexport type McpPiScope = Awaited<ReturnType<typeof createMcpPiRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createMcpPiRoot } from './_lib/piRoot';\n\nexport default defineRoot(createMcpPiRoot);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpCommand } from '../../../../../services/mcpCommand';\nimport type { McpPiScope } from '../_lib/piRoot';\nexport default defineRoutedContribution(\n (context: WithRoot<PiPluginContext<unknown>, McpPiScope>) =>\n [\n createMcpCommand(context.root.session, {\n openOverlay: async (ctx) => {\n const { openMcpOverlay } = await import('../../../../../tui/mcpOverlay');\n return openMcpOverlay(ctx, context.root.session);\n },\n }),\n ] as const,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nexport default defineResource({\n source: '@agimon-ai/doompi-mcp',\n moduleUrl: import.meta.url,\n skills: [\n {\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 },\n ],\n});\n","import type { PiToolCollection, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { CatalogTool } from '../../services/mcpCatalog';\nimport type { McpSession } from '../../services/mcpSession';\nimport { createMcpTool, type McpToolRenderers } from '../mcpTools';\nexport function createMcpToolCollection(\n session: McpSession,\n renderers: (tool: CatalogTool) => McpToolRenderers = () => ({}),\n): PiToolCollection {\n const declarations = new Map<CatalogTool, PiToolDeclaration>();\n return {\n snapshot: (): readonly PiToolDeclaration[] =>\n session.toolDefinitions().map((tool) => {\n let declaration = declarations.get(tool);\n if (!declaration) {\n declaration = createMcpTool(\n session.getClientManager,\n tool,\n (candidate) => session.isToolAvailable(candidate),\n renderers(tool),\n );\n declarations.set(tool, declaration);\n }\n return declaration;\n }),\n subscribe: (listener: () => void) => session.onChange(listener),\n };\n}\n","import { DoomToolCall, renderToolHeading } from '@agimon-ai/doompi-ui/toolChrome';\nimport type { Theme } from '@earendil-works/pi-coding-agent';\nimport { type Component, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';\n\nconst COLLAPSED_RESULT_LINES = 12;\nconst MAX_ARGUMENTS = 3;\nconst ELLIPSIS = '…';\n\ninterface McpToolTextLayout {\n wrap: boolean;\n separator: boolean;\n trailingBlank: boolean;\n}\n\n/** Bash-compatible width budget, horizontal inset, and structural result divider. */\nclass McpToolText implements Component {\n constructor(\n private readonly lines: readonly string[],\n private readonly layout: McpToolTextLayout,\n private readonly theme: Theme,\n ) {}\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const contentWidth = Math.max(1, width - 2);\n const rendered = this.layout.wrap\n ? this.lines.flatMap((line) => wrapTextWithAnsi(line, contentWidth))\n : this.lines.map((line) => truncateToWidth(line, contentWidth, ELLIPSIS));\n if (this.layout.separator) {\n rendered.unshift(this.theme.fg('borderMuted', '─'.repeat(contentWidth)));\n }\n const padded = rendered.map((line) => ` ${line}`);\n if (this.layout.trailingBlank) padded.push('');\n return padded;\n }\n\n invalidate(): void {\n // Content is immutable and reflows from the current width on every render.\n }\n}\n\nfunction argumentValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (value === null) return 'null';\n if (Array.isArray(value)) return `[${value.length}]`;\n return '{…}';\n}\n\nfunction argumentSummary(params: Record<string, unknown>): string {\n const entries = Object.entries(params);\n const shown = entries.slice(0, MAX_ARGUMENTS).map(([key, value]) => `${key}=${argumentValue(value)}`);\n if (entries.length > shown.length) shown.push(`+${entries.length - shown.length}`);\n return shown.join(' · ');\n}\n\nexport interface McpToolIdentity {\n serverName: string;\n toolName: string;\n}\n\nexport function renderMcpCall(tool: McpToolIdentity, params: Record<string, unknown>, theme: Theme): Component {\n const heading = renderToolHeading('mcp', tool.serverName, theme, 'muted');\n const toolName = theme.fg('accent', tool.toolName);\n const argumentsText = argumentSummary(params);\n const text = `${heading}${theme.fg('muted', ' / ')}${toolName}${\n argumentsText ? ` ${theme.fg('muted', `· ${argumentsText}`)}` : ''\n }`;\n return new DoomToolCall(text);\n}\n\nexport interface McpToolResultLike {\n content?: Array<{ type: string; text?: string }>;\n}\n\nexport interface McpToolResultOptions {\n expanded: boolean;\n isPartial: boolean;\n isError: boolean;\n}\n\nfunction resultLines(result: McpToolResultLike): string[] {\n const text = (result.content ?? []).map((block) => block.text ?? '').join('');\n const lines = text.split('\\n');\n while (lines.length > 0 && lines.at(-1)?.trim() === '') lines.pop();\n return lines;\n}\n\nexport function renderMcpResult(result: McpToolResultLike, options: McpToolResultOptions, theme: Theme): Component {\n const all = resultLines(result);\n const shown = options.expanded ? all : all.slice(0, COLLAPSED_RESULT_LINES);\n const body = shown.map((line) => theme.fg('toolOutput', line));\n\n if (options.isPartial) {\n body.push(theme.fg('warning', '◐') + theme.fg('dim', ' running'));\n } else if (options.isError) {\n body.push(theme.fg('error', '✗') + theme.fg('dim', ' failed'));\n } else if (!options.expanded && all.length > shown.length) {\n body.push(theme.fg('dim', '… ctrl+o'));\n } else if (body.length === 0) {\n body.push(theme.fg('success', '✓') + theme.fg('dim', ' done'));\n }\n\n return new McpToolText(body, { wrap: options.expanded, separator: true, trailingBlank: true }, theme);\n}\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolCollection } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpToolCollection } from '../../../../../services/mcpToolCollection';\nimport { renderMcpCall, renderMcpResult } from '../../../../../tui/mcpToolRender';\nimport type { McpPiScope } from '../_lib/piRoot';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PiPluginContext<unknown>, McpPiScope>): PiToolCollection =>\n createMcpToolCollection(context.root.session, (tool) => ({\n renderCall: (params, theme) => renderMcpCall(tool, params as Record<string, unknown>, theme),\n renderResult: (result, options, theme, execution) =>\n renderMcpResult(result, { ...options, isError: execution.isError }, theme),\n })),\n { cardinality: 'collection' },\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandMcp from '../src/extensions/workspaces/sessions/(backend)/command/mcp.cli';\nimport resourceDoompiUseMcp from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-mcp.cli';\nimport toolMcp from '../src/extensions/workspaces/sessions/(backend)/tool/mcp.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandMcp> | OptionsOf<typeof resourceDoompiUseMcp> | OptionsOf<typeof toolMcp>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\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};\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-mcp', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [...many(commandMcp, contextSession)]; },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseMcp, contextSession)]; },\n ...piToolContributions('@agimon-ai/doompi-mcp', at(toolMcp, contextSession)),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
package/dist/extensions/pi.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import { DOOM_MCP_PROJECTION_SERVICE, readDoomMcpProjectionService } from "@agim
|
|
|
6
6
|
import { definePiExtension, piToolContributions } from "@agimon-ai/doompi-core/piExtension";
|
|
7
7
|
import { composeRootHooks, defineResource, defineRoot, defineRoutedContribution } from "@agimon-ai/doompi-core/extensionFile";
|
|
8
8
|
import { DOOM_CHILD_SESSION_MCP_TOOL_SERVICE } from "@agimon-ai/doompi-core/childSession";
|
|
9
|
-
import { DOOM_CORDIS_SESSION_SERVICE } from "@agimon-ai/doompi-core/cordisHost";
|
|
9
|
+
import { DOOM_CORDIS_SERVER_SERVICES, DOOM_CORDIS_SESSION_SERVICE } from "@agimon-ai/doompi-core/cordisHost";
|
|
10
10
|
import { DOOM_MCP_STATUS_SERVICE } from "@agimon-ai/doompi-core/mcpStatus";
|
|
11
11
|
import { DOOM_MCP_TOOL_RESOLVER_SERVICE } from "@agimon-ai/doompi-core/mcpToolResolver";
|
|
12
12
|
import { DOOM_TOOL_SURFACE_SERVICE, requireDoomToolSurface } from "@agimon-ai/doompi-core/toolSurface";
|
|
@@ -64,6 +64,11 @@ function createMcpPiRuntime(runtime) {
|
|
|
64
64
|
const hostSession = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE);
|
|
65
65
|
const context = hostSession.context;
|
|
66
66
|
const expectedSessionId = hostSession.sessionId;
|
|
67
|
+
const serverServices = sessionContext.get(DOOM_CORDIS_SERVER_SERVICES);
|
|
68
|
+
if (serverServices !== void 0) {
|
|
69
|
+
if (serverServices.sessionId !== expectedSessionId) throw new Error("MCP server services belong to a different session");
|
|
70
|
+
if (serverServices.get("doom/mcp-session-tools") !== void 0) return;
|
|
71
|
+
}
|
|
67
72
|
let sessionActive = true;
|
|
68
73
|
activeContext = context;
|
|
69
74
|
const publishServerStatus = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.mjs","names":["rootSession","commandMcp","resourceDoompiUseMcp","toolMcp"],"sources":["../../src/services/leader/index.ts","../../src/services/piRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/piRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/mcp.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-mcp.cli.ts","../../src/services/mcpToolCollection/index.ts","../../src/tui/mcpToolRender.ts","../../src/extensions/workspaces/sessions/(backend)/tool/mcp.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type { DoomUiHubService } from '@agimon-ai/doompi-core/uiHub';\n\nimport { COMMAND_NAME } from '../../constants/mcp';\nimport {\n LEADER_BINDING_PREFIX,\n LEADER_DETAIL,\n LEADER_GROUP,\n LEADER_KEY,\n LEADER_LABEL,\n PACKAGE_SOURCE,\n} from '../../constants/piMcp';\n\nexport function registerLeaderContribution(hub: DoomUiHubService): () => void {\n const contribution = hub.registerLeader({\n source: PACKAGE_SOURCE,\n bindings: [\n {\n id: `${LEADER_BINDING_PREFIX}.open`,\n path: [LEADER_GROUP, { key: LEADER_KEY, label: LEADER_LABEL, detail: LEADER_DETAIL }],\n command: { name: COMMAND_NAME },\n },\n ],\n });\n return () => contribution.dispose();\n}\n","import path from 'node:path';\n\nimport { DOOM_CHILD_SESSION_MCP_TOOL_SERVICE } from '@agimon-ai/doompi-core/childSession';\nimport type { DoomCordisRuntimeService } from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_MCP_PROJECTION_SERVICE, readDoomMcpProjectionService } from '@agimon-ai/doompi-core/mcpProjection';\nimport { DOOM_MCP_STATUS_SERVICE, type DoomMcpStatusService } from '@agimon-ai/doompi-core/mcpStatus';\nimport {\n DOOM_MCP_TOOL_RESOLVER_SERVICE,\n type DoomMcpToolResolverService,\n} from '@agimon-ai/doompi-core/mcpToolResolver';\nimport { DOOM_TOOL_SURFACE_SERVICE, requireDoomToolSurface } from '@agimon-ai/doompi-core/toolSurface';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/uiHub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { MCP_STATUS_KEY } from '../../constants/piMcp';\nimport { McpSession } from '../../services/mcpSession';\nimport { mcpSessionConfigFromProjection } from '../../services/projection';\nimport { readSessionConfig } from '../../services/sessionConfig';\nimport type { McpSessionConfig } from '../../types/mcpConfig';\nimport { formatMcpSessionAuthStatus, MCP_SESSION_AUTH_STATUS_KEY } from '../../types/webMcp';\nimport { registerLeaderContribution } from '../leader';\nimport { createMcpChildTool, createMcpSessionToolsService, MCP_SESSION_TOOLS_SERVICE } from '../mcpSessionTools';\n\nconst WARNING = 'warning';\n\nfunction failClosedSessionConfig(cwd: string): McpSessionConfig {\n return {\n enabled: false,\n repoRoot: cwd,\n stagingDirectory: path.join(cwd, '.doom', 'mcp-disabled'),\n sources: [],\n };\n}\n\nexport function createMcpPiRuntime(runtime: DoomCordisRuntimeService) {\n const mode = runtime.mode;\n let activeContext: ExtensionContext | undefined;\n let disposed = false;\n const session = new McpSession({\n // Browser hosts read the URL from the MCP status panel, so only the TUI acts on it here.\n onAuthorizationUrl: async (url, serverName, { openBrowser }) => {\n const context = activeContext;\n if (context?.mode !== 'tui' || !openBrowser) return;\n try {\n const { default: open } = await import('open');\n await open(url.toString());\n } catch (error) {\n context.ui.notify(\n `Could not open the authorization page for ${serverName}: ${error instanceof Error ? error.message : String(error)}. Press a in the MCP overlay to retry.`,\n WARNING,\n );\n throw error;\n }\n },\n });\n\n return {\n session,\n services: [\n (cordis: Context) => {\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => registerLeaderContribution(requireDoomUiHub(uiContext)));\n // The surface lives on the session fiber, so this resolves after install has\n // already registered the cached wrappers: binding is what first hides the ones\n // no server has confirmed.\n cordis.inject([DOOM_TOOL_SURFACE_SERVICE], (surfaceContext) =>\n session.bindToolSurface(requireDoomToolSurface(surfaceContext)),\n );\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], async (sessionContext) => {\n const hostSession = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const context = hostSession.context;\n const expectedSessionId = hostSession.sessionId;\n let sessionActive = true;\n activeContext = context;\n // The legacy server-name status remains available to every UI. The compact\n // authorization status is browser-only so the TUI footer stays unchanged.\n const publishServerStatus = (): void => {\n const servers = session.getSnapshot().servers;\n const names = servers.map((server) => server.name).join(',');\n context.ui?.setStatus(MCP_STATUS_KEY, names);\n if (context.mode !== 'tui') {\n context.ui?.setStatus(MCP_SESSION_AUTH_STATUS_KEY, formatMcpSessionAuthStatus(session.getServers()));\n }\n };\n const stopPublishing = session.onChange(publishServerStatus);\n publishServerStatus();\n\n if (mode === 'standalone') {\n await session.reconfigure(readSessionConfig(process.env, context.cwd), context.cwd);\n } else {\n await session.reconfigure(failClosedSessionConfig(context.cwd));\n sessionContext.inject([DOOM_MCP_PROJECTION_SERVICE], async (projectionContext) => {\n const projection = readDoomMcpProjectionService(projectionContext);\n if (!projection || projection.sessionId !== expectedSessionId) {\n await session.reconfigure(failClosedSessionConfig(context.cwd));\n if (projection && sessionActive && !disposed) {\n context.ui?.notify(\n `The Doom MCP projection belongs to session \"${projection.sessionId}\", not \"${expectedSessionId}\"; MCP is disabled.`,\n WARNING,\n );\n }\n } else {\n const snapshot = projection.getSnapshot();\n await session.reconfigure(\n mcpSessionConfigFromProjection(snapshot, context.cwd),\n context.cwd,\n snapshot.repoRoot,\n );\n }\n return async () => {\n if (sessionActive && !disposed) await session.reconfigure(failClosedSessionConfig(context.cwd));\n };\n });\n }\n\n const status: DoomMcpStatusService = Object.freeze({\n generation: `${hostSession.generation}:mcp-status`,\n getSnapshot: () => session.getSnapshot(),\n onChange: (listener: () => void) => session.onChange(listener),\n });\n const toolResolver: DoomMcpToolResolverService = Object.freeze({\n generation: `${hostSession.generation}:mcp-tool-resolver`,\n resolve: (selectors: readonly string[]) => session.resolveToolSelectors(selectors),\n });\n const sessionTools = createMcpSessionToolsService(session, `${hostSession.generation}:mcp-tools`);\n const childTool = createMcpChildTool(async (parameters, signal) => {\n if (!sessionActive || disposed) throw new Error('The parent MCP session is no longer available.');\n const tool = sessionTools\n .snapshot()\n .find(\n (candidate) => candidate.serverName === parameters.server && candidate.toolName === parameters.tool,\n );\n if (!tool)\n throw new Error(\n `MCP tool ${parameters.server}/${parameters.tool} is not available in the current session configuration.`,\n );\n return sessionTools.invoke(tool.piName, parameters.arguments ?? {}, signal);\n });\n sessionContext.plugin((providerContext) => {\n providerContext.provide(DOOM_MCP_STATUS_SERVICE, status);\n providerContext.provide(DOOM_MCP_TOOL_RESOLVER_SERVICE, toolResolver);\n providerContext.provide(MCP_SESSION_TOOLS_SERVICE, sessionTools);\n providerContext.provide(DOOM_CHILD_SESSION_MCP_TOOL_SERVICE, childTool);\n });\n for (const diagnostic of session.getDiagnostics()) context.ui?.notify(diagnostic, WARNING);\n return async () => {\n sessionActive = false;\n stopPublishing();\n context.ui?.setStatus(MCP_STATUS_KEY, undefined);\n if (context.mode !== 'tui') context.ui?.setStatus(MCP_SESSION_AUTH_STATUS_KEY, undefined);\n if (activeContext === context) activeContext = undefined;\n if (!disposed) await session.reconfigure(failClosedSessionConfig(context.cwd));\n };\n });\n },\n ],\n async onDispose() {\n disposed = true;\n activeContext = undefined;\n await session.dispose();\n },\n };\n}\n","import type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpPiRuntime } from '../../../../../services/piRuntime';\nexport const createMcpPiRoot = ({ runtime }: PiPluginContext) => {\n if (!runtime) throw new Error('MCP requires the Cordis runtime mode.');\n const state = createMcpPiRuntime(runtime);\n return { value: state, services: state.services, onDispose: () => state.onDispose() };\n};\nexport type McpPiScope = Awaited<ReturnType<typeof createMcpPiRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createMcpPiRoot } from './_lib/piRoot';\n\nexport default defineRoot(createMcpPiRoot);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpCommand } from '../../../../../services/mcpCommand';\nimport type { McpPiScope } from '../_lib/piRoot';\nexport default defineRoutedContribution(\n (context: WithRoot<PiPluginContext<unknown>, McpPiScope>) =>\n [\n createMcpCommand(context.root.session, {\n openOverlay: async (ctx) => {\n const { openMcpOverlay } = await import('../../../../../tui/mcpOverlay');\n return openMcpOverlay(ctx, context.root.session);\n },\n }),\n ] as const,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nexport default defineResource({\n source: '@agimon-ai/doompi-mcp',\n moduleUrl: import.meta.url,\n skills: [\n {\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 },\n ],\n});\n","import type { PiToolCollection, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { CatalogTool } from '../../services/mcpCatalog';\nimport type { McpSession } from '../../services/mcpSession';\nimport { createMcpTool, type McpToolRenderers } from '../mcpTools';\nexport function createMcpToolCollection(\n session: McpSession,\n renderers: (tool: CatalogTool) => McpToolRenderers = () => ({}),\n): PiToolCollection {\n const declarations = new Map<CatalogTool, PiToolDeclaration>();\n return {\n snapshot: (): readonly PiToolDeclaration[] =>\n session.toolDefinitions().map((tool) => {\n let declaration = declarations.get(tool);\n if (!declaration) {\n declaration = createMcpTool(\n session.getClientManager,\n tool,\n (candidate) => session.isToolAvailable(candidate),\n renderers(tool),\n );\n declarations.set(tool, declaration);\n }\n return declaration;\n }),\n subscribe: (listener: () => void) => session.onChange(listener),\n };\n}\n","import { DoomToolCall, renderToolHeading } from '@agimon-ai/doompi-ui/toolChrome';\nimport type { Theme } from '@earendil-works/pi-coding-agent';\nimport { type Component, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';\n\nconst COLLAPSED_RESULT_LINES = 12;\nconst MAX_ARGUMENTS = 3;\nconst ELLIPSIS = '…';\n\ninterface McpToolTextLayout {\n wrap: boolean;\n separator: boolean;\n trailingBlank: boolean;\n}\n\n/** Bash-compatible width budget, horizontal inset, and structural result divider. */\nclass McpToolText implements Component {\n constructor(\n private readonly lines: readonly string[],\n private readonly layout: McpToolTextLayout,\n private readonly theme: Theme,\n ) {}\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const contentWidth = Math.max(1, width - 2);\n const rendered = this.layout.wrap\n ? this.lines.flatMap((line) => wrapTextWithAnsi(line, contentWidth))\n : this.lines.map((line) => truncateToWidth(line, contentWidth, ELLIPSIS));\n if (this.layout.separator) {\n rendered.unshift(this.theme.fg('borderMuted', '─'.repeat(contentWidth)));\n }\n const padded = rendered.map((line) => ` ${line}`);\n if (this.layout.trailingBlank) padded.push('');\n return padded;\n }\n\n invalidate(): void {\n // Content is immutable and reflows from the current width on every render.\n }\n}\n\nfunction argumentValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (value === null) return 'null';\n if (Array.isArray(value)) return `[${value.length}]`;\n return '{…}';\n}\n\nfunction argumentSummary(params: Record<string, unknown>): string {\n const entries = Object.entries(params);\n const shown = entries.slice(0, MAX_ARGUMENTS).map(([key, value]) => `${key}=${argumentValue(value)}`);\n if (entries.length > shown.length) shown.push(`+${entries.length - shown.length}`);\n return shown.join(' · ');\n}\n\nexport interface McpToolIdentity {\n serverName: string;\n toolName: string;\n}\n\nexport function renderMcpCall(tool: McpToolIdentity, params: Record<string, unknown>, theme: Theme): Component {\n const heading = renderToolHeading('mcp', tool.serverName, theme, 'muted');\n const toolName = theme.fg('accent', tool.toolName);\n const argumentsText = argumentSummary(params);\n const text = `${heading}${theme.fg('muted', ' / ')}${toolName}${\n argumentsText ? ` ${theme.fg('muted', `· ${argumentsText}`)}` : ''\n }`;\n return new DoomToolCall(text);\n}\n\nexport interface McpToolResultLike {\n content?: Array<{ type: string; text?: string }>;\n}\n\nexport interface McpToolResultOptions {\n expanded: boolean;\n isPartial: boolean;\n isError: boolean;\n}\n\nfunction resultLines(result: McpToolResultLike): string[] {\n const text = (result.content ?? []).map((block) => block.text ?? '').join('');\n const lines = text.split('\\n');\n while (lines.length > 0 && lines.at(-1)?.trim() === '') lines.pop();\n return lines;\n}\n\nexport function renderMcpResult(result: McpToolResultLike, options: McpToolResultOptions, theme: Theme): Component {\n const all = resultLines(result);\n const shown = options.expanded ? all : all.slice(0, COLLAPSED_RESULT_LINES);\n const body = shown.map((line) => theme.fg('toolOutput', line));\n\n if (options.isPartial) {\n body.push(theme.fg('warning', '◐') + theme.fg('dim', ' running'));\n } else if (options.isError) {\n body.push(theme.fg('error', '✗') + theme.fg('dim', ' failed'));\n } else if (!options.expanded && all.length > shown.length) {\n body.push(theme.fg('dim', '… ctrl+o'));\n } else if (body.length === 0) {\n body.push(theme.fg('success', '✓') + theme.fg('dim', ' done'));\n }\n\n return new McpToolText(body, { wrap: options.expanded, separator: true, trailingBlank: true }, theme);\n}\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolCollection } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpToolCollection } from '../../../../../services/mcpToolCollection';\nimport { renderMcpCall, renderMcpResult } from '../../../../../tui/mcpToolRender';\nimport type { McpPiScope } from '../_lib/piRoot';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PiPluginContext<unknown>, McpPiScope>): PiToolCollection =>\n createMcpToolCollection(context.root.session, (tool) => ({\n renderCall: (params, theme) => renderMcpCall(tool, params as Record<string, unknown>, theme),\n renderResult: (result, options, theme, execution) =>\n renderMcpResult(result, { ...options, isError: execution.isError }, theme),\n })),\n { cardinality: 'collection' },\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandMcp from '../src/extensions/workspaces/sessions/(backend)/command/mcp.cli';\nimport resourceDoompiUseMcp from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-mcp.cli';\nimport toolMcp from '../src/extensions/workspaces/sessions/(backend)/tool/mcp.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandMcp> | OptionsOf<typeof resourceDoompiUseMcp> | OptionsOf<typeof toolMcp>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\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};\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-mcp', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [...many(commandMcp, contextSession)]; },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseMcp, contextSession)]; },\n ...piToolContributions('@agimon-ai/doompi-mcp', at(toolMcp, contextSession)),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pi.mjs","names":["rootSession","commandMcp","resourceDoompiUseMcp","toolMcp"],"sources":["../../src/services/leader/index.ts","../../src/services/piRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/piRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/mcp.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-mcp.cli.ts","../../src/services/mcpToolCollection/index.ts","../../src/tui/mcpToolRender.ts","../../src/extensions/workspaces/sessions/(backend)/tool/mcp.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type { DoomUiHubService } from '@agimon-ai/doompi-core/uiHub';\n\nimport { COMMAND_NAME } from '../../constants/mcp';\nimport {\n LEADER_BINDING_PREFIX,\n LEADER_DETAIL,\n LEADER_GROUP,\n LEADER_KEY,\n LEADER_LABEL,\n PACKAGE_SOURCE,\n} from '../../constants/piMcp';\n\nexport function registerLeaderContribution(hub: DoomUiHubService): () => void {\n const contribution = hub.registerLeader({\n source: PACKAGE_SOURCE,\n bindings: [\n {\n id: `${LEADER_BINDING_PREFIX}.open`,\n path: [LEADER_GROUP, { key: LEADER_KEY, label: LEADER_LABEL, detail: LEADER_DETAIL }],\n command: { name: COMMAND_NAME },\n },\n ],\n });\n return () => contribution.dispose();\n}\n","import path from 'node:path';\n\nimport { DOOM_CHILD_SESSION_MCP_TOOL_SERVICE } from '@agimon-ai/doompi-core/childSession';\nimport type { DoomCordisRuntimeService } from '@agimon-ai/doompi-core/cordisHost';\nimport {\n DOOM_CORDIS_SESSION_SERVICE,\n DOOM_CORDIS_SERVER_SERVICES,\n type DoomCordisSessionService,\n type DoomCordisServerServices,\n} from '@agimon-ai/doompi-core/cordisHost';\nimport { DOOM_MCP_PROJECTION_SERVICE, readDoomMcpProjectionService } from '@agimon-ai/doompi-core/mcpProjection';\nimport { DOOM_MCP_STATUS_SERVICE, type DoomMcpStatusService } from '@agimon-ai/doompi-core/mcpStatus';\nimport {\n DOOM_MCP_TOOL_RESOLVER_SERVICE,\n type DoomMcpToolResolverService,\n} from '@agimon-ai/doompi-core/mcpToolResolver';\nimport { DOOM_TOOL_SURFACE_SERVICE, requireDoomToolSurface } from '@agimon-ai/doompi-core/toolSurface';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/uiHub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { MCP_STATUS_KEY } from '../../constants/piMcp';\nimport { McpSession } from '../../services/mcpSession';\nimport { mcpSessionConfigFromProjection } from '../../services/projection';\nimport { readSessionConfig } from '../../services/sessionConfig';\nimport type { McpSessionConfig } from '../../types/mcpConfig';\nimport { formatMcpSessionAuthStatus, MCP_SESSION_AUTH_STATUS_KEY } from '../../types/webMcp';\nimport { registerLeaderContribution } from '../leader';\nimport { createMcpChildTool, createMcpSessionToolsService, MCP_SESSION_TOOLS_SERVICE } from '../mcpSessionTools';\n\nconst WARNING = 'warning';\n\nfunction failClosedSessionConfig(cwd: string): McpSessionConfig {\n return {\n enabled: false,\n repoRoot: cwd,\n stagingDirectory: path.join(cwd, '.doom', 'mcp-disabled'),\n sources: [],\n };\n}\n\nexport function createMcpPiRuntime(runtime: DoomCordisRuntimeService) {\n const mode = runtime.mode;\n let activeContext: ExtensionContext | undefined;\n let disposed = false;\n const session = new McpSession({\n // Browser hosts read the URL from the MCP status panel, so only the TUI acts on it here.\n onAuthorizationUrl: async (url, serverName, { openBrowser }) => {\n const context = activeContext;\n if (context?.mode !== 'tui' || !openBrowser) return;\n try {\n const { default: open } = await import('open');\n await open(url.toString());\n } catch (error) {\n context.ui.notify(\n `Could not open the authorization page for ${serverName}: ${error instanceof Error ? error.message : String(error)}. Press a in the MCP overlay to retry.`,\n WARNING,\n );\n throw error;\n }\n },\n });\n\n return {\n session,\n services: [\n (cordis: Context) => {\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => registerLeaderContribution(requireDoomUiHub(uiContext)));\n // The surface lives on the session fiber, so this resolves after install has\n // already registered the cached wrappers: binding is what first hides the ones\n // no server has confirmed.\n cordis.inject([DOOM_TOOL_SURFACE_SERVICE], (surfaceContext) =>\n session.bindToolSurface(requireDoomToolSurface(surfaceContext)),\n );\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], async (sessionContext) => {\n const hostSession = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const context = hostSession.context;\n const expectedSessionId = hostSession.sessionId;\n const serverServices = sessionContext.get(DOOM_CORDIS_SERVER_SERVICES) as\n | DoomCordisServerServices\n | undefined;\n // The server facet already supplies the tools, commands and status for this host.\n // Do not start a second proxy from the preloaded Pi facet. Standalone Pi has no lender.\n if (serverServices !== undefined) {\n if (serverServices.sessionId !== expectedSessionId)\n throw new Error('MCP server services belong to a different session');\n if (serverServices.get(MCP_SESSION_TOOLS_SERVICE) !== undefined) return;\n }\n let sessionActive = true;\n activeContext = context;\n // The legacy server-name status remains available to every UI. The compact\n // authorization status is browser-only so the TUI footer stays unchanged.\n const publishServerStatus = (): void => {\n const servers = session.getSnapshot().servers;\n const names = servers.map((server) => server.name).join(',');\n context.ui?.setStatus(MCP_STATUS_KEY, names);\n if (context.mode !== 'tui') {\n context.ui?.setStatus(MCP_SESSION_AUTH_STATUS_KEY, formatMcpSessionAuthStatus(session.getServers()));\n }\n };\n const stopPublishing = session.onChange(publishServerStatus);\n publishServerStatus();\n\n if (mode === 'standalone') {\n await session.reconfigure(readSessionConfig(process.env, context.cwd), context.cwd);\n } else {\n await session.reconfigure(failClosedSessionConfig(context.cwd));\n sessionContext.inject([DOOM_MCP_PROJECTION_SERVICE], async (projectionContext) => {\n const projection = readDoomMcpProjectionService(projectionContext);\n if (!projection || projection.sessionId !== expectedSessionId) {\n await session.reconfigure(failClosedSessionConfig(context.cwd));\n if (projection && sessionActive && !disposed) {\n context.ui?.notify(\n `The Doom MCP projection belongs to session \"${projection.sessionId}\", not \"${expectedSessionId}\"; MCP is disabled.`,\n WARNING,\n );\n }\n } else {\n const snapshot = projection.getSnapshot();\n await session.reconfigure(\n mcpSessionConfigFromProjection(snapshot, context.cwd),\n context.cwd,\n snapshot.repoRoot,\n );\n }\n return async () => {\n if (sessionActive && !disposed) await session.reconfigure(failClosedSessionConfig(context.cwd));\n };\n });\n }\n\n const status: DoomMcpStatusService = Object.freeze({\n generation: `${hostSession.generation}:mcp-status`,\n getSnapshot: () => session.getSnapshot(),\n onChange: (listener: () => void) => session.onChange(listener),\n });\n const toolResolver: DoomMcpToolResolverService = Object.freeze({\n generation: `${hostSession.generation}:mcp-tool-resolver`,\n resolve: (selectors: readonly string[]) => session.resolveToolSelectors(selectors),\n });\n const sessionTools = createMcpSessionToolsService(session, `${hostSession.generation}:mcp-tools`);\n const childTool = createMcpChildTool(async (parameters, signal) => {\n if (!sessionActive || disposed) throw new Error('The parent MCP session is no longer available.');\n const tool = sessionTools\n .snapshot()\n .find(\n (candidate) => candidate.serverName === parameters.server && candidate.toolName === parameters.tool,\n );\n if (!tool)\n throw new Error(\n `MCP tool ${parameters.server}/${parameters.tool} is not available in the current session configuration.`,\n );\n return sessionTools.invoke(tool.piName, parameters.arguments ?? {}, signal);\n });\n sessionContext.plugin((providerContext) => {\n providerContext.provide(DOOM_MCP_STATUS_SERVICE, status);\n providerContext.provide(DOOM_MCP_TOOL_RESOLVER_SERVICE, toolResolver);\n providerContext.provide(MCP_SESSION_TOOLS_SERVICE, sessionTools);\n providerContext.provide(DOOM_CHILD_SESSION_MCP_TOOL_SERVICE, childTool);\n });\n for (const diagnostic of session.getDiagnostics()) context.ui?.notify(diagnostic, WARNING);\n return async () => {\n sessionActive = false;\n stopPublishing();\n context.ui?.setStatus(MCP_STATUS_KEY, undefined);\n if (context.mode !== 'tui') context.ui?.setStatus(MCP_SESSION_AUTH_STATUS_KEY, undefined);\n if (activeContext === context) activeContext = undefined;\n if (!disposed) await session.reconfigure(failClosedSessionConfig(context.cwd));\n };\n });\n },\n ],\n async onDispose() {\n disposed = true;\n activeContext = undefined;\n await session.dispose();\n },\n };\n}\n","import type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpPiRuntime } from '../../../../../services/piRuntime';\nexport const createMcpPiRoot = ({ runtime }: PiPluginContext) => {\n if (!runtime) throw new Error('MCP requires the Cordis runtime mode.');\n const state = createMcpPiRuntime(runtime);\n return { value: state, services: state.services, onDispose: () => state.onDispose() };\n};\nexport type McpPiScope = Awaited<ReturnType<typeof createMcpPiRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createMcpPiRoot } from './_lib/piRoot';\n\nexport default defineRoot(createMcpPiRoot);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpCommand } from '../../../../../services/mcpCommand';\nimport type { McpPiScope } from '../_lib/piRoot';\nexport default defineRoutedContribution(\n (context: WithRoot<PiPluginContext<unknown>, McpPiScope>) =>\n [\n createMcpCommand(context.root.session, {\n openOverlay: async (ctx) => {\n const { openMcpOverlay } = await import('../../../../../tui/mcpOverlay');\n return openMcpOverlay(ctx, context.root.session);\n },\n }),\n ] as const,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nexport default defineResource({\n source: '@agimon-ai/doompi-mcp',\n moduleUrl: import.meta.url,\n skills: [\n {\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 },\n ],\n});\n","import type { PiToolCollection, PiToolDeclaration } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { CatalogTool } from '../../services/mcpCatalog';\nimport type { McpSession } from '../../services/mcpSession';\nimport { createMcpTool, type McpToolRenderers } from '../mcpTools';\nexport function createMcpToolCollection(\n session: McpSession,\n renderers: (tool: CatalogTool) => McpToolRenderers = () => ({}),\n): PiToolCollection {\n const declarations = new Map<CatalogTool, PiToolDeclaration>();\n return {\n snapshot: (): readonly PiToolDeclaration[] =>\n session.toolDefinitions().map((tool) => {\n let declaration = declarations.get(tool);\n if (!declaration) {\n declaration = createMcpTool(\n session.getClientManager,\n tool,\n (candidate) => session.isToolAvailable(candidate),\n renderers(tool),\n );\n declarations.set(tool, declaration);\n }\n return declaration;\n }),\n subscribe: (listener: () => void) => session.onChange(listener),\n };\n}\n","import { DoomToolCall, renderToolHeading } from '@agimon-ai/doompi-ui/toolChrome';\nimport type { Theme } from '@earendil-works/pi-coding-agent';\nimport { type Component, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';\n\nconst COLLAPSED_RESULT_LINES = 12;\nconst MAX_ARGUMENTS = 3;\nconst ELLIPSIS = '…';\n\ninterface McpToolTextLayout {\n wrap: boolean;\n separator: boolean;\n trailingBlank: boolean;\n}\n\n/** Bash-compatible width budget, horizontal inset, and structural result divider. */\nclass McpToolText implements Component {\n constructor(\n private readonly lines: readonly string[],\n private readonly layout: McpToolTextLayout,\n private readonly theme: Theme,\n ) {}\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const contentWidth = Math.max(1, width - 2);\n const rendered = this.layout.wrap\n ? this.lines.flatMap((line) => wrapTextWithAnsi(line, contentWidth))\n : this.lines.map((line) => truncateToWidth(line, contentWidth, ELLIPSIS));\n if (this.layout.separator) {\n rendered.unshift(this.theme.fg('borderMuted', '─'.repeat(contentWidth)));\n }\n const padded = rendered.map((line) => ` ${line}`);\n if (this.layout.trailingBlank) padded.push('');\n return padded;\n }\n\n invalidate(): void {\n // Content is immutable and reflows from the current width on every render.\n }\n}\n\nfunction argumentValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (value === null) return 'null';\n if (Array.isArray(value)) return `[${value.length}]`;\n return '{…}';\n}\n\nfunction argumentSummary(params: Record<string, unknown>): string {\n const entries = Object.entries(params);\n const shown = entries.slice(0, MAX_ARGUMENTS).map(([key, value]) => `${key}=${argumentValue(value)}`);\n if (entries.length > shown.length) shown.push(`+${entries.length - shown.length}`);\n return shown.join(' · ');\n}\n\nexport interface McpToolIdentity {\n serverName: string;\n toolName: string;\n}\n\nexport function renderMcpCall(tool: McpToolIdentity, params: Record<string, unknown>, theme: Theme): Component {\n const heading = renderToolHeading('mcp', tool.serverName, theme, 'muted');\n const toolName = theme.fg('accent', tool.toolName);\n const argumentsText = argumentSummary(params);\n const text = `${heading}${theme.fg('muted', ' / ')}${toolName}${\n argumentsText ? ` ${theme.fg('muted', `· ${argumentsText}`)}` : ''\n }`;\n return new DoomToolCall(text);\n}\n\nexport interface McpToolResultLike {\n content?: Array<{ type: string; text?: string }>;\n}\n\nexport interface McpToolResultOptions {\n expanded: boolean;\n isPartial: boolean;\n isError: boolean;\n}\n\nfunction resultLines(result: McpToolResultLike): string[] {\n const text = (result.content ?? []).map((block) => block.text ?? '').join('');\n const lines = text.split('\\n');\n while (lines.length > 0 && lines.at(-1)?.trim() === '') lines.pop();\n return lines;\n}\n\nexport function renderMcpResult(result: McpToolResultLike, options: McpToolResultOptions, theme: Theme): Component {\n const all = resultLines(result);\n const shown = options.expanded ? all : all.slice(0, COLLAPSED_RESULT_LINES);\n const body = shown.map((line) => theme.fg('toolOutput', line));\n\n if (options.isPartial) {\n body.push(theme.fg('warning', '◐') + theme.fg('dim', ' running'));\n } else if (options.isError) {\n body.push(theme.fg('error', '✗') + theme.fg('dim', ' failed'));\n } else if (!options.expanded && all.length > shown.length) {\n body.push(theme.fg('dim', '… ctrl+o'));\n } else if (body.length === 0) {\n body.push(theme.fg('success', '✓') + theme.fg('dim', ' done'));\n }\n\n return new McpToolText(body, { wrap: options.expanded, separator: true, trailingBlank: true }, theme);\n}\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext, PiToolCollection } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMcpToolCollection } from '../../../../../services/mcpToolCollection';\nimport { renderMcpCall, renderMcpResult } from '../../../../../tui/mcpToolRender';\nimport type { McpPiScope } from '../_lib/piRoot';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PiPluginContext<unknown>, McpPiScope>): PiToolCollection =>\n createMcpToolCollection(context.root.session, (tool) => ({\n renderCall: (params, theme) => renderMcpCall(tool, params as Record<string, unknown>, theme),\n renderResult: (result, options, theme, execution) =>\n renderMcpResult(result, { ...options, isError: execution.isError }, theme),\n })),\n { cardinality: 'collection' },\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandMcp from '../src/extensions/workspaces/sessions/(backend)/command/mcp.cli';\nimport resourceDoompiUseMcp from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-mcp.cli';\nimport toolMcp from '../src/extensions/workspaces/sessions/(backend)/tool/mcp.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandMcp> | OptionsOf<typeof resourceDoompiUseMcp> | OptionsOf<typeof toolMcp>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\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};\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-mcp', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [...many(commandMcp, contextSession)]; },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseMcp, contextSession)]; },\n ...piToolContributions('@agimon-ai/doompi-mcp', at(toolMcp, contextSession)),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-mcp",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.99",
|
|
4
4
|
"description": "Domain-aware MCP server selection and access boundaries for Pi sessions composed with DoomPi.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -73,12 +73,12 @@
|
|
|
73
73
|
"access": "public"
|
|
74
74
|
},
|
|
75
75
|
"dependencies": {
|
|
76
|
-
"@agimon-ai/doompi-config": "0.0.1-alpha.
|
|
77
|
-
"@agimon-ai/doompi-core": "0.0.1-alpha.
|
|
78
|
-
"@agimon-ai/doompi-ui": "0.0.1-alpha.
|
|
79
|
-
"@agimon-ai/doompi-web-components": "0.0.1-alpha.
|
|
80
|
-
"@agimon-ai/doompi-web-security": "0.0.1-alpha.
|
|
81
|
-
"@agimon-ai/mcp-proxy": "0.31.
|
|
76
|
+
"@agimon-ai/doompi-config": "0.0.1-alpha.97",
|
|
77
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.98",
|
|
78
|
+
"@agimon-ai/doompi-ui": "0.0.1-alpha.98",
|
|
79
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.56",
|
|
80
|
+
"@agimon-ai/doompi-web-security": "0.0.1-alpha.51",
|
|
81
|
+
"@agimon-ai/mcp-proxy": "0.31.35",
|
|
82
82
|
"@deepseek-ai/cordis": "4.0.2",
|
|
83
83
|
"@modelcontextprotocol/server": "2.1.0",
|
|
84
84
|
"@napi-rs/keyring": "2.1.0",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"yaml": "2.9.1"
|
|
89
89
|
},
|
|
90
90
|
"devDependencies": {
|
|
91
|
-
"@agimon-ai/doompi-build": "0.0.1-alpha.
|
|
91
|
+
"@agimon-ai/doompi-build": "0.0.1-alpha.20",
|
|
92
92
|
"@earendil-works/pi-coding-agent": "0.87.1",
|
|
93
93
|
"@earendil-works/pi-tui": "0.87.1",
|
|
94
94
|
"@tanstack/react-store": "0.11.1",
|