@agimon-ai/doompi-mcp 0.0.1-alpha.78 → 0.0.1-alpha.79

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.
@@ -4,6 +4,7 @@ Object.defineProperties(exports, {
4
4
  });
5
5
  let _agimon_ai_doompi_core_mcp_facet = require("@agimon-ai/doompi-core/mcp-facet");
6
6
  let _agimon_ai_doompi_core_server_facet = require("@agimon-ai/doompi-core/server-facet");
7
+ let _agimon_ai_doompi_core_extension_file = require("@agimon-ai/doompi-core/extension-file");
7
8
  //#region src/extensions/workspaces/sessions/(backend)/skill/doompi-use-mcp.mcp.ts
8
9
  var doompi_use_mcp_mcp_default = (0, _agimon_ai_doompi_core_mcp_facet.defineMcpSkill)({
9
10
  name: "doompi-use-mcp",
@@ -28,8 +29,46 @@ function bindMcpHeadlessTool(context, name) {
28
29
  //#region src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp.ts
29
30
  var mcp_use_mcp_default = (0, _agimon_ai_doompi_core_mcp_facet.defineMcpTool)((context) => bindMcpHeadlessTool(context, "mcp_use"));
30
31
  //#endregion
32
+ //#region src/services/mcpSessionTools/index.ts
33
+ const MCP_SESSION_TOOLS_SERVICE = "doom/mcp-session-tools";
34
+ //#endregion
35
+ //#region src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts
36
+ function fingerprint(service) {
37
+ return JSON.stringify(service.snapshot().map((tool) => ({
38
+ name: tool.piName,
39
+ description: tool.description,
40
+ schema: tool.inputSchema
41
+ })));
42
+ }
43
+ var session_mcp_mcp_default = (0, _agimon_ai_doompi_core_extension_file.defineRoutedContribution)((context) => {
44
+ const service = context.services.get(MCP_SESSION_TOOLS_SERVICE);
45
+ if (!service) return [];
46
+ let current = fingerprint(service);
47
+ const stop = service.onChange(() => {
48
+ const next = fingerprint(service);
49
+ if (next === current) return;
50
+ current = next;
51
+ context.refresh();
52
+ });
53
+ context.signal.addEventListener("abort", stop, { once: true });
54
+ return service.snapshot().map((tool) => ({
55
+ name: tool.piName,
56
+ label: `${tool.serverName}: ${tool.toolName}`,
57
+ description: tool.description ?? `${tool.toolName} on the ${tool.serverName} MCP server.`,
58
+ parameters: Object.keys(tool.inputSchema).length > 0 ? tool.inputSchema : {
59
+ type: "object",
60
+ properties: {}
61
+ },
62
+ execute: (_toolCallId, parameters, signal) => service.invoke(tool.piName, parameters ?? {}, AbortSignal.any([context.signal, signal ?? context.signal]))
63
+ }));
64
+ }, { cardinality: "many" });
65
+ //#endregion
31
66
  //#region generated/mcp.ts
32
67
  const at = (value, context) => typeof value === "function" ? value(context) : value;
68
+ const many = (value, context) => {
69
+ const resolved = typeof value === "function" ? value(context) : value;
70
+ return Array.isArray(resolved) ? resolved : [resolved];
71
+ };
33
72
  const via = (identity, value) => ({
34
73
  ...identity,
35
74
  ...value
@@ -41,7 +80,7 @@ const mcp = (0, _agimon_ai_doompi_core_mcp_facet.defineMcpPlugin)({
41
80
  return [at(doompi_use_mcp_mcp_default, context)];
42
81
  },
43
82
  get tools() {
44
- return [via({ name: "mcp_use" }, at(mcp_use_mcp_default, context))];
83
+ return [via({ name: "mcp_use" }, at(mcp_use_mcp_default, context)), ...many(session_mcp_mcp_default, context)];
45
84
  }
46
85
  })
47
86
  });
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","defineMcpTool","defineMcpPlugin","skillDoompiUseMcp","toolMcpUse"],"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","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/doompi-core/mcp-facet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/server-facet';\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/mcp-facet';\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/mcp-facet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'mcp_use'));\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcp-facet';\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';\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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T => ({ ...identity, ...(value as object) }) as T;\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 [via({ name: 'mcp_use' }, at(toolMcpUse, context))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;AAGA,IAAA,8BAAA,GAAeA,iCAAAA,eAAAA,CAAe;CAC5B,MAAM;CACN,aACE;CACF,aAAA,GAAYC,oCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,qCAAqC;AACxF,CAAC;;;ACJD,MAAa,6BAA6B;AAgB1C,SAAgB,oBAAoB,SAA+B,MAAgC;CACjG,MAAM,OAAO,QAAQ,SAAS,IAA4B,0BAA0B,CAAC,EAAE,IAAI,IAAI;CAC/F,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,4BAA4B,MAAM;CAC7D,OAAO;EACL,GAAG;EACH,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,MAAM,kBAAkB,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC;GAClF,OAAO,KAAK,QAAQ,YAAY,YAAY,iBAAiB,UAAU,QAAQ,SAAS;EAC1F;CACF;AACF;;;AC1BA,IAAA,uBAAA,GAAeC,iCAAAA,cAAAA,EAAe,YAAkC,oBAAoB,SAAS,SAAS,CAAC;;;ACGvG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,WAAuB;CAAE,GAAG;CAAU,GAAI;AAAiB;AAE9G,MAAa,OAAA,GAAMC,iCAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa;EACrB,IAAI,SAAyC;GAAE,OAAO,CAAC,GAAGC,4BAAmB,OAAO,CAAC;EAAG;EACxF,IAAI,QAAuC;GAAE,OAAO,CAAC,IAAI,EAAE,MAAM,UAAU,GAAG,GAAGC,qBAAY,OAAO,CAAC,CAAC;EAAG;CAC3G;AACF,CAAC"}
1
+ {"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","defineMcpTool","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/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/mcp-facet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/server-facet';\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/mcp-facet';\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/mcp-facet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'mcp_use'));\n","import type { DoomHeadlessToolResult } from '@agimon-ai/doompi-core/headless';\n\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","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extension-file';\nimport type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcp-facet';\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) => ({ name: tool.piName, description: tool.description, schema: tool.inputSchema })),\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 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/mcp-facet';\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 => ({ ...identity, ...(value as object) }) as T;\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 [via({ name: 'mcp_use' }, at(toolMcpUse, context)), ...many(toolSessionMcp, context)]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;;AAGA,IAAA,8BAAA,GAAeA,iCAAAA,eAAAA,CAAe;CAC5B,MAAM;CACN,aACE;CACF,aAAA,GAAYC,oCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,qCAAqC;AACxF,CAAC;;;ACJD,MAAa,6BAA6B;AAgB1C,SAAgB,oBAAoB,SAA+B,MAAgC;CACjG,MAAM,OAAO,QAAQ,SAAS,IAA4B,0BAA0B,CAAC,EAAE,IAAI,IAAI;CAC/F,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,4BAA4B,MAAM;CAC7D,OAAO;EACL,GAAG;EACH,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,MAAM,kBAAkB,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC;GAClF,OAAO,KAAK,QAAQ,YAAY,YAAY,iBAAiB,UAAU,QAAQ,SAAS;EAC1F;CACF;AACF;;;AC1BA,IAAA,uBAAA,GAAeC,iCAAAA,cAAAA,EAAe,YAAkC,oBAAoB,SAAS,SAAS,CAAC;;;ACCvG,MAAa,4BAA4B;;;ACEzC,SAAS,YAAY,SAAyC;CAC5D,OAAO,KAAK,UACV,QAAQ,SAAS,CAAC,CAAC,KAAK,UAAU;EAAE,MAAM,KAAK;EAAQ,aAAa,KAAK;EAAa,QAAQ,KAAK;CAAY,EAAE,CACnH;AACF;AAEA,IAAA,2BAAA,GAAeC,sCAAAA,yBAAAA,EACZ,YAA+D;CAC9D,MAAM,UAAU,QAAQ,SAAS,IAA4B,yBAAyB;CACtF,IAAI,CAAC,SAAS,OAAO,CAAC;CACtB,IAAI,UAAU,YAAY,OAAO;CACjC,MAAM,OAAO,QAAQ,eAAe;EAClC,MAAM,OAAO,YAAY,OAAO;EAChC,IAAI,SAAS,SAAS;EACtB,UAAU;EACV,QAAQ,QAAQ;CAClB,CAAC;CACD,QAAQ,OAAO,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;CAC7D,OAAO,QAAQ,SAAS,CAAC,CAAC,KAAK,UAAU;EACvC,MAAM,KAAK;EACX,OAAO,GAAG,KAAK,WAAW,IAAI,KAAK;EACnC,aAAa,KAAK,eAAe,GAAG,KAAK,SAAS,UAAU,KAAK,WAAW;EAC5E,YAAa,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,SAAS,IAChD,KAAK,cACL;GAAE,MAAM;GAAU,YAAY,CAAC;EAAE;EACrC,UAAU,aAAa,YAAY,WACjC,QAAQ,OACN,KAAK,QACJ,cAAc,CAAC,GAChB,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,CAC5D;CACJ,EAAE;AACJ,GACA,EAAE,aAAa,OAAO,CACxB;;;ACjCA,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAM,QAAc,OAA6C,YAA6B;CAC5F,MAAM,WAAW,OAAO,UAAU,aAAc,MAA4B,OAAO,IAAI;CACvF,OAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAa;AAC5D;AACA,MAAM,OAAU,UAAmC,WAAuB;CAAE,GAAG;CAAU,GAAI;AAAiB;AAE9G,MAAa,OAAA,GAAMC,iCAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa;EACrB,IAAI,SAAyC;GAAE,OAAO,CAAC,GAAGC,4BAAmB,OAAO,CAAC;EAAG;EACxF,IAAI,QAAuC;GAAE,OAAO,CAAC,IAAI,EAAE,MAAM,UAAU,GAAG,GAAGC,qBAAY,OAAO,CAAC,GAAG,GAAG,KAAKC,yBAAgB,OAAO,CAAC;EAAG;CAC7I;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.cts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBAWa,gDAAG"}
1
+ {"version":3,"file":"mcp.d.cts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBAiBa,gDAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBAWa,gDAAG"}
1
+ {"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBAiBa,gDAAG"}
@@ -1,5 +1,6 @@
1
1
  import { defineMcpPlugin, defineMcpSkill, defineMcpTool } from "@agimon-ai/doompi-core/mcp-facet";
2
2
  import { readPackageResource } from "@agimon-ai/doompi-core/server-facet";
3
+ import { defineRoutedContribution } from "@agimon-ai/doompi-core/extension-file";
3
4
  //#region src/extensions/workspaces/sessions/(backend)/skill/doompi-use-mcp.mcp.ts
4
5
  var doompi_use_mcp_mcp_default = defineMcpSkill({
5
6
  name: "doompi-use-mcp",
@@ -24,8 +25,46 @@ function bindMcpHeadlessTool(context, name) {
24
25
  //#region src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp.ts
25
26
  var mcp_use_mcp_default = defineMcpTool((context) => bindMcpHeadlessTool(context, "mcp_use"));
26
27
  //#endregion
28
+ //#region src/services/mcpSessionTools/index.ts
29
+ const MCP_SESSION_TOOLS_SERVICE = "doom/mcp-session-tools";
30
+ //#endregion
31
+ //#region src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts
32
+ function fingerprint(service) {
33
+ return JSON.stringify(service.snapshot().map((tool) => ({
34
+ name: tool.piName,
35
+ description: tool.description,
36
+ schema: tool.inputSchema
37
+ })));
38
+ }
39
+ var session_mcp_mcp_default = defineRoutedContribution((context) => {
40
+ const service = context.services.get(MCP_SESSION_TOOLS_SERVICE);
41
+ if (!service) return [];
42
+ let current = fingerprint(service);
43
+ const stop = service.onChange(() => {
44
+ const next = fingerprint(service);
45
+ if (next === current) return;
46
+ current = next;
47
+ context.refresh();
48
+ });
49
+ context.signal.addEventListener("abort", stop, { once: true });
50
+ return service.snapshot().map((tool) => ({
51
+ name: tool.piName,
52
+ label: `${tool.serverName}: ${tool.toolName}`,
53
+ description: tool.description ?? `${tool.toolName} on the ${tool.serverName} MCP server.`,
54
+ parameters: Object.keys(tool.inputSchema).length > 0 ? tool.inputSchema : {
55
+ type: "object",
56
+ properties: {}
57
+ },
58
+ execute: (_toolCallId, parameters, signal) => service.invoke(tool.piName, parameters ?? {}, AbortSignal.any([context.signal, signal ?? context.signal]))
59
+ }));
60
+ }, { cardinality: "many" });
61
+ //#endregion
27
62
  //#region generated/mcp.ts
28
63
  const at = (value, context) => typeof value === "function" ? value(context) : value;
64
+ const many = (value, context) => {
65
+ const resolved = typeof value === "function" ? value(context) : value;
66
+ return Array.isArray(resolved) ? resolved : [resolved];
67
+ };
29
68
  const via = (identity, value) => ({
30
69
  ...identity,
31
70
  ...value
@@ -37,7 +76,7 @@ const mcp = defineMcpPlugin({
37
76
  return [at(doompi_use_mcp_mcp_default, context)];
38
77
  },
39
78
  get tools() {
40
- return [via({ name: "mcp_use" }, at(mcp_use_mcp_default, context))];
79
+ return [via({ name: "mcp_use" }, at(mcp_use_mcp_default, context)), ...many(session_mcp_mcp_default, context)];
41
80
  }
42
81
  })
43
82
  });
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.mjs","names":["skillDoompiUseMcp","toolMcpUse"],"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","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/doompi-core/mcp-facet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/server-facet';\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/mcp-facet';\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/mcp-facet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'mcp_use'));\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcp-facet';\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';\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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T => ({ ...identity, ...(value as object) }) as T;\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 [via({ name: 'mcp_use' }, at(toolMcpUse, context))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;AAGA,IAAA,6BAAe,eAAe;CAC5B,MAAM;CACN,aACE;CACF,YAAY,oBAAoB,YAAY,KAAK,qCAAqC;AACxF,CAAC;;;ACJD,MAAa,6BAA6B;AAgB1C,SAAgB,oBAAoB,SAA+B,MAAgC;CACjG,MAAM,OAAO,QAAQ,SAAS,IAA4B,0BAA0B,CAAC,EAAE,IAAI,IAAI;CAC/F,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,4BAA4B,MAAM;CAC7D,OAAO;EACL,GAAG;EACH,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,MAAM,kBAAkB,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC;GAClF,OAAO,KAAK,QAAQ,YAAY,YAAY,iBAAiB,UAAU,QAAQ,SAAS;EAC1F;CACF;AACF;;;AC1BA,IAAA,sBAAe,eAAe,YAAkC,oBAAoB,SAAS,SAAS,CAAC;;;ACGvG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,WAAuB;CAAE,GAAG;CAAU,GAAI;AAAiB;AAE9G,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa;EACrB,IAAI,SAAyC;GAAE,OAAO,CAAC,GAAGA,4BAAmB,OAAO,CAAC;EAAG;EACxF,IAAI,QAAuC;GAAE,OAAO,CAAC,IAAI,EAAE,MAAM,UAAU,GAAG,GAAGC,qBAAY,OAAO,CAAC,CAAC;EAAG;CAC3G;AACF,CAAC"}
1
+ {"version":3,"file":"mcp.mjs","names":["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/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/mcp-facet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/server-facet';\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/mcp-facet';\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/mcp-facet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'mcp_use'));\n","import type { DoomHeadlessToolResult } from '@agimon-ai/doompi-core/headless';\n\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","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extension-file';\nimport type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcp-facet';\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) => ({ name: tool.piName, description: tool.description, schema: tool.inputSchema })),\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 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/mcp-facet';\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 => ({ ...identity, ...(value as object) }) as T;\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 [via({ name: 'mcp_use' }, at(toolMcpUse, context)), ...many(toolSessionMcp, context)]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;AAGA,IAAA,6BAAe,eAAe;CAC5B,MAAM;CACN,aACE;CACF,YAAY,oBAAoB,YAAY,KAAK,qCAAqC;AACxF,CAAC;;;ACJD,MAAa,6BAA6B;AAgB1C,SAAgB,oBAAoB,SAA+B,MAAgC;CACjG,MAAM,OAAO,QAAQ,SAAS,IAA4B,0BAA0B,CAAC,EAAE,IAAI,IAAI;CAC/F,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,4BAA4B,MAAM;CAC7D,OAAO;EACL,GAAG;EACH,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,MAAM,kBAAkB,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC;GAClF,OAAO,KAAK,QAAQ,YAAY,YAAY,iBAAiB,UAAU,QAAQ,SAAS;EAC1F;CACF;AACF;;;AC1BA,IAAA,sBAAe,eAAe,YAAkC,oBAAoB,SAAS,SAAS,CAAC;;;ACCvG,MAAa,4BAA4B;;;ACEzC,SAAS,YAAY,SAAyC;CAC5D,OAAO,KAAK,UACV,QAAQ,SAAS,CAAC,CAAC,KAAK,UAAU;EAAE,MAAM,KAAK;EAAQ,aAAa,KAAK;EAAa,QAAQ,KAAK;CAAY,EAAE,CACnH;AACF;AAEA,IAAA,0BAAe,0BACZ,YAA+D;CAC9D,MAAM,UAAU,QAAQ,SAAS,IAA4B,yBAAyB;CACtF,IAAI,CAAC,SAAS,OAAO,CAAC;CACtB,IAAI,UAAU,YAAY,OAAO;CACjC,MAAM,OAAO,QAAQ,eAAe;EAClC,MAAM,OAAO,YAAY,OAAO;EAChC,IAAI,SAAS,SAAS;EACtB,UAAU;EACV,QAAQ,QAAQ;CAClB,CAAC;CACD,QAAQ,OAAO,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;CAC7D,OAAO,QAAQ,SAAS,CAAC,CAAC,KAAK,UAAU;EACvC,MAAM,KAAK;EACX,OAAO,GAAG,KAAK,WAAW,IAAI,KAAK;EACnC,aAAa,KAAK,eAAe,GAAG,KAAK,SAAS,UAAU,KAAK,WAAW;EAC5E,YAAa,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,SAAS,IAChD,KAAK,cACL;GAAE,MAAM;GAAU,YAAY,CAAC;EAAE;EACrC,UAAU,aAAa,YAAY,WACjC,QAAQ,OACN,KAAK,QACJ,cAAc,CAAC,GAChB,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,CAC5D;CACJ,EAAE;AACJ,GACA,EAAE,aAAa,OAAO,CACxB;;;ACjCA,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAM,QAAc,OAA6C,YAA6B;CAC5F,MAAM,WAAW,OAAO,UAAU,aAAc,MAA4B,OAAO,IAAI;CACvF,OAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAa;AAC5D;AACA,MAAM,OAAU,UAAmC,WAAuB;CAAE,GAAG;CAAU,GAAI;AAAiB;AAE9G,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa;EACrB,IAAI,SAAyC;GAAE,OAAO,CAAC,GAAGA,4BAAmB,OAAO,CAAC;EAAG;EACxF,IAAI,QAAuC;GAAE,OAAO,CAAC,IAAI,EAAE,MAAM,UAAU,GAAG,GAAGC,qBAAY,OAAO,CAAC,GAAG,GAAG,KAAKC,yBAAgB,OAAO,CAAC;EAAG;CAC7I;AACF,CAAC"}
@@ -793,8 +793,7 @@ function McpSessionAuthSection({ sessionId, statuses, sendSessionFrame, contextI
793
793
  /* @__PURE__ */ jsxs(DialogBody, {
794
794
  className: "px-4 py-4 sm:px-5 sm:py-5",
795
795
  children: [
796
- /* @__PURE__ */ jsx("p", {
797
- role: "status",
796
+ /* @__PURE__ */ jsx("output", {
798
797
  className: "text-sm text-doom-muted",
799
798
  children: server?.state === "connected" ? "Authorization complete. This server is connected." : server?.state === "closed" ? "Disconnected from this session. Saved credentials were kept." : authorizationUrl ? "Waiting for you to complete authorization." : server?.state === "failed" ? "Connection failed. Retry authorization; details are in the session transcript." : server ? "Preparing the authorization link..." : "This server is no longer available in the session."
800
799
  }),
@@ -826,8 +825,7 @@ function McpSessionAuthSection({ sessionId, statuses, sendSessionFrame, contextI
826
825
  })
827
826
  ]
828
827
  }) : null,
829
- copyFeedback ? /* @__PURE__ */ jsx("p", {
830
- role: "status",
828
+ copyFeedback ? /* @__PURE__ */ jsx("output", {
831
829
  className: "text-xs text-doom-muted",
832
830
  children: copyFeedback
833
831
  }) : null