@agimon-ai/doompi-mcp 0.0.1-alpha.73 → 0.0.1-alpha.76
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/package.json +21 -14
- package/dist/_virtual/_rolldown/runtime.cjs +0 -1
- package/dist/api-contracts.cjs +0 -1
- package/dist/api-contracts.d.cts +0 -2
- package/dist/api-contracts.d.mts +0 -2
- package/dist/api-contracts.mjs +0 -1
- package/dist/extensions/pi.cjs +0 -2
- package/dist/extensions/pi.cjs.map +0 -1
- package/dist/extensions/pi.d.cts +0 -5
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/pi.d.mts +0 -5
- package/dist/extensions/pi.d.mts.map +0 -1
- package/dist/extensions/pi.mjs +0 -2
- package/dist/extensions/pi.mjs.map +0 -1
- package/dist/extensions/server.cjs +0 -2
- package/dist/extensions/server.cjs.map +0 -1
- package/dist/extensions/server.d.cts +0 -5
- package/dist/extensions/server.d.cts.map +0 -1
- package/dist/extensions/server.d.mts +0 -5
- package/dist/extensions/server.d.mts.map +0 -1
- package/dist/extensions/server.mjs +0 -2
- package/dist/extensions/server.mjs.map +0 -1
- package/dist/index.cjs +0 -1
- package/dist/index.d.cts +0 -9
- package/dist/index.d.mts +0 -9
- package/dist/index.mjs +0 -1
- package/dist/projection.cjs +0 -1
- package/dist/projection.d.cts +0 -5
- package/dist/projection.d.mts +0 -5
- package/dist/projection.mjs +0 -1
- package/dist/src/constants/mcp.cjs +0 -2
- package/dist/src/constants/mcp.cjs.map +0 -1
- package/dist/src/constants/mcp.mjs +0 -2
- package/dist/src/constants/mcp.mjs.map +0 -1
- package/dist/src/constants/piMcp.cjs +0 -2
- package/dist/src/constants/piMcp.cjs.map +0 -1
- package/dist/src/constants/piMcp.mjs +0 -2
- package/dist/src/constants/piMcp.mjs.map +0 -1
- package/dist/src/controllers/leader.cjs +0 -2
- package/dist/src/controllers/leader.cjs.map +0 -1
- package/dist/src/controllers/leader.mjs +0 -2
- package/dist/src/controllers/leader.mjs.map +0 -1
- package/dist/src/controllers/mcpCommand.cjs +0 -3
- package/dist/src/controllers/mcpCommand.cjs.map +0 -1
- package/dist/src/controllers/mcpCommand.mjs +0 -3
- package/dist/src/controllers/mcpCommand.mjs.map +0 -1
- package/dist/src/controllers/mcpHubApi.cjs +0 -2
- package/dist/src/controllers/mcpHubApi.cjs.map +0 -1
- package/dist/src/controllers/mcpHubApi.mjs +0 -2
- package/dist/src/controllers/mcpHubApi.mjs.map +0 -1
- package/dist/src/controllers/piRuntime.cjs +0 -2
- package/dist/src/controllers/piRuntime.cjs.map +0 -1
- package/dist/src/controllers/piRuntime.mjs +0 -2
- package/dist/src/controllers/piRuntime.mjs.map +0 -1
- package/dist/src/controllers/serverRuntime.cjs +0 -2
- package/dist/src/controllers/serverRuntime.cjs.map +0 -1
- package/dist/src/controllers/serverRuntime.mjs +0 -2
- package/dist/src/controllers/serverRuntime.mjs.map +0 -1
- package/dist/src/schemas/apiContracts.cjs +0 -2
- package/dist/src/schemas/apiContracts.cjs.map +0 -1
- package/dist/src/schemas/apiContracts.d.cts +0 -53
- package/dist/src/schemas/apiContracts.d.cts.map +0 -1
- package/dist/src/schemas/apiContracts.d.mts +0 -53
- package/dist/src/schemas/apiContracts.d.mts.map +0 -1
- package/dist/src/schemas/apiContracts.mjs +0 -2
- package/dist/src/schemas/apiContracts.mjs.map +0 -1
- package/dist/src/schemas/directTools.cjs +0 -2
- package/dist/src/schemas/directTools.cjs.map +0 -1
- package/dist/src/schemas/directTools.d.cts +0 -7
- package/dist/src/schemas/directTools.d.cts.map +0 -1
- package/dist/src/schemas/directTools.d.mts +0 -7
- package/dist/src/schemas/directTools.d.mts.map +0 -1
- package/dist/src/schemas/directTools.mjs +0 -2
- package/dist/src/schemas/directTools.mjs.map +0 -1
- package/dist/src/schemas/mcpHeadlessTool.cjs +0 -2
- package/dist/src/schemas/mcpHeadlessTool.cjs.map +0 -1
- package/dist/src/schemas/mcpHeadlessTool.mjs +0 -2
- package/dist/src/schemas/mcpHeadlessTool.mjs.map +0 -1
- package/dist/src/schemas/sessionConfig.cjs +0 -2
- package/dist/src/schemas/sessionConfig.cjs.map +0 -1
- package/dist/src/schemas/sessionConfig.d.cts +0 -5
- package/dist/src/schemas/sessionConfig.d.cts.map +0 -1
- package/dist/src/schemas/sessionConfig.d.mts +0 -5
- package/dist/src/schemas/sessionConfig.d.mts.map +0 -1
- package/dist/src/schemas/sessionConfig.mjs +0 -2
- package/dist/src/schemas/sessionConfig.mjs.map +0 -1
- package/dist/src/services/configSources/index.cjs +0 -2
- package/dist/src/services/configSources/index.cjs.map +0 -1
- package/dist/src/services/configSources/index.d.cts +0 -15
- package/dist/src/services/configSources/index.d.cts.map +0 -1
- package/dist/src/services/configSources/index.d.mts +0 -15
- package/dist/src/services/configSources/index.d.mts.map +0 -1
- package/dist/src/services/configSources/index.mjs +0 -2
- package/dist/src/services/configSources/index.mjs.map +0 -1
- package/dist/src/services/directTools/index.cjs +0 -2
- package/dist/src/services/directTools/index.cjs.map +0 -1
- package/dist/src/services/directTools/index.mjs +0 -2
- package/dist/src/services/directTools/index.mjs.map +0 -1
- package/dist/src/services/directToolsEnvironment/index.cjs +0 -2
- package/dist/src/services/directToolsEnvironment/index.cjs.map +0 -1
- package/dist/src/services/directToolsEnvironment/index.mjs +0 -2
- package/dist/src/services/directToolsEnvironment/index.mjs.map +0 -1
- package/dist/src/services/keyringTokenStore/index.cjs +0 -2
- package/dist/src/services/keyringTokenStore/index.cjs.map +0 -1
- package/dist/src/services/keyringTokenStore/index.mjs +0 -2
- package/dist/src/services/keyringTokenStore/index.mjs.map +0 -1
- package/dist/src/services/mcpCatalog/index.cjs +0 -2
- package/dist/src/services/mcpCatalog/index.cjs.map +0 -1
- package/dist/src/services/mcpCatalog/index.d.cts +0 -16
- package/dist/src/services/mcpCatalog/index.d.cts.map +0 -1
- package/dist/src/services/mcpCatalog/index.d.mts +0 -16
- package/dist/src/services/mcpCatalog/index.d.mts.map +0 -1
- package/dist/src/services/mcpCatalog/index.mjs +0 -2
- package/dist/src/services/mcpCatalog/index.mjs.map +0 -1
- package/dist/src/services/mcpRuntime/index.cjs +0 -2
- package/dist/src/services/mcpRuntime/index.cjs.map +0 -1
- package/dist/src/services/mcpRuntime/index.d.cts +0 -29
- package/dist/src/services/mcpRuntime/index.d.cts.map +0 -1
- package/dist/src/services/mcpRuntime/index.d.mts +0 -29
- package/dist/src/services/mcpRuntime/index.d.mts.map +0 -1
- package/dist/src/services/mcpRuntime/index.mjs +0 -2
- package/dist/src/services/mcpRuntime/index.mjs.map +0 -1
- package/dist/src/services/mcpSession/index.cjs +0 -2
- package/dist/src/services/mcpSession/index.cjs.map +0 -1
- package/dist/src/services/mcpSession/index.mjs +0 -2
- package/dist/src/services/mcpSession/index.mjs.map +0 -1
- package/dist/src/services/mcpSettingsManager/index.cjs +0 -2
- package/dist/src/services/mcpSettingsManager/index.cjs.map +0 -1
- package/dist/src/services/mcpSettingsManager/index.mjs +0 -2
- package/dist/src/services/mcpSettingsManager/index.mjs.map +0 -1
- package/dist/src/services/projection/index.cjs +0 -2
- package/dist/src/services/projection/index.cjs.map +0 -1
- package/dist/src/services/projection/index.d.cts +0 -12
- package/dist/src/services/projection/index.d.cts.map +0 -1
- package/dist/src/services/projection/index.d.mts +0 -12
- package/dist/src/services/projection/index.d.mts.map +0 -1
- package/dist/src/services/projection/index.mjs +0 -2
- package/dist/src/services/projection/index.mjs.map +0 -1
- package/dist/src/services/sessionConfig/index.cjs +0 -2
- package/dist/src/services/sessionConfig/index.cjs.map +0 -1
- package/dist/src/services/sessionConfig/index.d.cts +0 -15
- package/dist/src/services/sessionConfig/index.d.cts.map +0 -1
- package/dist/src/services/sessionConfig/index.d.mts +0 -15
- package/dist/src/services/sessionConfig/index.d.mts.map +0 -1
- package/dist/src/services/sessionConfig/index.mjs +0 -2
- package/dist/src/services/sessionConfig/index.mjs.map +0 -1
- package/dist/src/services/toolVisibility/index.cjs +0 -2
- package/dist/src/services/toolVisibility/index.cjs.map +0 -1
- package/dist/src/services/toolVisibility/index.mjs +0 -2
- package/dist/src/services/toolVisibility/index.mjs.map +0 -1
- package/dist/src/tools/mcpToolCollection.cjs +0 -2
- package/dist/src/tools/mcpToolCollection.cjs.map +0 -1
- package/dist/src/tools/mcpToolCollection.mjs +0 -2
- package/dist/src/tools/mcpToolCollection.mjs.map +0 -1
- package/dist/src/tools/mcpTools.cjs +0 -3
- package/dist/src/tools/mcpTools.cjs.map +0 -1
- package/dist/src/tools/mcpTools.mjs +0 -3
- package/dist/src/tools/mcpTools.mjs.map +0 -1
- package/dist/src/tui/mcpOverlay.cjs +0 -2
- package/dist/src/tui/mcpOverlay.cjs.map +0 -1
- package/dist/src/tui/mcpOverlay.mjs +0 -2
- package/dist/src/tui/mcpOverlay.mjs.map +0 -1
- package/dist/src/tui/mcpToolRender.cjs +0 -3
- package/dist/src/tui/mcpToolRender.cjs.map +0 -1
- package/dist/src/tui/mcpToolRender.mjs +0 -3
- package/dist/src/tui/mcpToolRender.mjs.map +0 -1
- package/dist/src/types/mcp.d.cts +0 -1
- package/dist/src/types/mcp.d.mts +0 -1
- package/dist/src/types/mcpCatalog.d.cts +0 -1
- package/dist/src/types/mcpCatalog.d.mts +0 -1
- package/dist/src/types/mcpConfig.d.cts +0 -56
- package/dist/src/types/mcpConfig.d.cts.map +0 -1
- package/dist/src/types/mcpConfig.d.mts +0 -56
- package/dist/src/types/mcpConfig.d.mts.map +0 -1
- package/dist/src/types/mcpRuntime.d.cts +0 -12
- package/dist/src/types/mcpRuntime.d.cts.map +0 -1
- package/dist/src/types/mcpRuntime.d.mts +0 -12
- package/dist/src/types/mcpRuntime.d.mts.map +0 -1
- package/dist/src/types/webMcp.cjs +0 -2
- package/dist/src/types/webMcp.cjs.map +0 -1
- package/dist/src/types/webMcp.mjs +0 -2
- package/dist/src/types/webMcp.mjs.map +0 -1
- package/src/extensions/web.ts +0 -35
- package/src/types/webMcp.ts +0 -171
- package/src/web/api/mcpSettingsApi.ts +0 -83
- package/src/web/components/McpRepositorySettingsPanel.tsx +0 -249
- package/src/web/components/McpSessionAuthSection.tsx +0 -269
- package/src/web/components/McpToolMessage.tsx +0 -148
- package/src/web/lib/mcpToolMatch.ts +0 -177
- package/src/web/stores/mcpSettingsStore.ts +0 -145
- package/src/web/tsconfig.json +0 -23
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.76",
|
|
4
4
|
"description": "Domain-aware MCP server selection and access boundaries for Pi sessions composed with DoomPi.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -27,19 +27,16 @@
|
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
29
|
"dist",
|
|
30
|
-
"src/web",
|
|
31
|
-
"src/extensions/web.ts",
|
|
32
|
-
"src/types/webMcp.ts",
|
|
33
30
|
"llms.txt",
|
|
34
31
|
"src/prompts",
|
|
35
32
|
"README.md",
|
|
36
33
|
"LICENSE",
|
|
37
|
-
"package.json"
|
|
38
|
-
"!src/web/**/*.stories.tsx"
|
|
34
|
+
"package.json"
|
|
39
35
|
],
|
|
40
36
|
"type": "module",
|
|
41
37
|
"main": "./dist/index.cjs",
|
|
42
|
-
"
|
|
38
|
+
"module": "./dist/index.mjs",
|
|
39
|
+
"types": "./dist/index.d.cts",
|
|
43
40
|
"jsnext:main": "./dist/index.mjs",
|
|
44
41
|
"exports": {
|
|
45
42
|
".": {
|
|
@@ -47,6 +44,11 @@
|
|
|
47
44
|
"import": "./dist/index.mjs",
|
|
48
45
|
"require": "./dist/index.cjs"
|
|
49
46
|
},
|
|
47
|
+
"./api-contracts": {
|
|
48
|
+
"types": "./dist/api-contracts.d.mts",
|
|
49
|
+
"import": "./dist/api-contracts.mjs",
|
|
50
|
+
"require": "./dist/api-contracts.cjs"
|
|
51
|
+
},
|
|
50
52
|
"./extensions/pi": {
|
|
51
53
|
"types": "./dist/extensions/pi.d.mts",
|
|
52
54
|
"import": "./dist/extensions/pi.mjs",
|
|
@@ -57,6 +59,9 @@
|
|
|
57
59
|
"import": "./dist/extensions/server.mjs",
|
|
58
60
|
"require": "./dist/extensions/server.cjs"
|
|
59
61
|
},
|
|
62
|
+
"./extensions/web": {
|
|
63
|
+
"import": "./dist/extensions/web.mjs"
|
|
64
|
+
},
|
|
60
65
|
"./projection": {
|
|
61
66
|
"types": "./dist/projection.d.mts",
|
|
62
67
|
"import": "./dist/projection.mjs",
|
|
@@ -68,10 +73,11 @@
|
|
|
68
73
|
"access": "public"
|
|
69
74
|
},
|
|
70
75
|
"dependencies": {
|
|
71
|
-
"@agimon-ai/doompi-config": "0.0.1-alpha.
|
|
72
|
-
"@agimon-ai/doompi-core": "0.0.1-alpha.
|
|
73
|
-
"@agimon-ai/doompi-ui": "0.0.1-alpha.
|
|
74
|
-
"@agimon-ai/doompi-web-components": "0.0.1-alpha.
|
|
76
|
+
"@agimon-ai/doompi-config": "0.0.1-alpha.74",
|
|
77
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.75",
|
|
78
|
+
"@agimon-ai/doompi-ui": "0.0.1-alpha.75",
|
|
79
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.33",
|
|
80
|
+
"@agimon-ai/doompi-web-security": "0.0.1-alpha.35",
|
|
75
81
|
"@agimon-ai/mcp-proxy": "0.31.25",
|
|
76
82
|
"@deepseek-ai/cordis": "4.0.2",
|
|
77
83
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
@@ -81,6 +87,7 @@
|
|
|
81
87
|
"yaml": "2.9.0"
|
|
82
88
|
},
|
|
83
89
|
"devDependencies": {
|
|
90
|
+
"@agimon-ai/doompi-build": "0.0.1-alpha.4",
|
|
84
91
|
"@earendil-works/pi-coding-agent": "0.85.1",
|
|
85
92
|
"@earendil-works/pi-tui": "0.85.1",
|
|
86
93
|
"@tanstack/react-store": "0.11.1",
|
|
@@ -110,7 +117,7 @@
|
|
|
110
117
|
"node": ">=22.19.0"
|
|
111
118
|
},
|
|
112
119
|
"doompiServer": {
|
|
113
|
-
"entry": "./
|
|
120
|
+
"entry": "./generated/server.ts",
|
|
114
121
|
"dist": "./dist/extensions/server.mjs",
|
|
115
122
|
"scopes": [
|
|
116
123
|
"global",
|
|
@@ -125,7 +132,7 @@
|
|
|
125
132
|
"doompiWeb": {
|
|
126
133
|
"pluginId": "mcp",
|
|
127
134
|
"channels": [],
|
|
128
|
-
"client": "./
|
|
135
|
+
"client": "./dist/extensions/web.mjs",
|
|
129
136
|
"scopes": [
|
|
130
137
|
"workspace",
|
|
131
138
|
"session"
|
|
@@ -139,7 +146,7 @@
|
|
|
139
146
|
"scripts": {
|
|
140
147
|
"build": "tsdown",
|
|
141
148
|
"test": "vitest --run",
|
|
142
|
-
"typecheck": "tsc --noEmit && tsc --noEmit -p
|
|
149
|
+
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.web.json",
|
|
143
150
|
"lint": "oxlint . && oxfmt . --check",
|
|
144
151
|
"fixcode": "oxlint . --fix && oxfmt ."
|
|
145
152
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));exports.__toESM=s;
|
package/dist/api-contracts.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("./src/schemas/apiContracts.cjs");exports.apiContracts=e.apiContracts,exports.default=e.apiContracts;
|
package/dist/api-contracts.d.cts
DELETED
package/dist/api-contracts.d.mts
DELETED
package/dist/api-contracts.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{apiContracts as e}from"./src/schemas/apiContracts.mjs";export{e as apiContracts,e as default};
|
package/dist/extensions/pi.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../src/constants/piMcp.cjs"),t=require("../src/controllers/mcpCommand.cjs"),n=require("../src/controllers/piRuntime.cjs"),r=require("../src/tools/mcpToolCollection.cjs"),i=require("../src/tui/mcpToolRender.cjs"),a=(0,require("@agimon-ai/doompi-core/pi-extension").definePiExtension)(e.PACKAGE_SOURCE,({runtime:a})=>{if(!a)throw Error(`MCP requires the Cordis runtime mode.`);let o=n.createMcpPiRuntime(a);return{services:o.services,tools:r.createMcpToolCollection(o.session,e=>({renderCall:(t,n)=>i.renderMcpCall(e,t,n),renderResult:(e,t,n,r)=>i.renderMcpResult(e,{...t,isError:r.isError},n)})),commands:[t.createMcpCommand(o.session,{openOverlay:async e=>{let{openMcpOverlay:t}=await Promise.resolve().then(()=>require("../src/tui/mcpOverlay.cjs"));return t(e,o.session)}})],onDispose:()=>o.onDispose(),resources:[{source:e.PACKAGE_SOURCE,moduleUrl:require("url").pathToFileURL(__filename).href,skills:[{name:`doompi-use-mcp`,description:`Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.`}]}]}});exports.default=a,exports.mcpExtension=a;
|
|
2
|
-
//# sourceMappingURL=pi.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.cjs","names":["definePiExtension","PACKAGE_SOURCE","createMcpPiRuntime","createMcpToolCollection","renderMcpCall","renderMcpResult","createMcpCommand"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { PACKAGE_SOURCE } from '../constants/piMcp';\nimport { createMcpCommand } from '../controllers/mcpCommand';\nimport { createMcpPiRuntime } from '../controllers/piRuntime';\nimport { createMcpToolCollection } from '../tools/mcpToolCollection';\nimport { renderMcpCall, renderMcpResult } from '../tui/mcpToolRender';\nexport const mcpExtension = definePiExtension(PACKAGE_SOURCE, ({ runtime }) => {\n if (!runtime) throw new Error('MCP requires the Cordis runtime mode.');\n const state = createMcpPiRuntime(runtime);\n return {\n services: state.services,\n tools: createMcpToolCollection(state.session, (tool) => ({\n renderCall: (params, theme) => renderMcpCall(tool, params as Record<string, unknown>, theme),\n renderResult: (result, options, theme, context) =>\n renderMcpResult(result, { ...options, isError: context.isError }, theme),\n })),\n commands: [\n createMcpCommand(state.session, {\n openOverlay: async (ctx) => {\n const { openMcpOverlay } = await import('../tui/mcpOverlay');\n return openMcpOverlay(ctx, state.session);\n },\n }),\n ],\n onDispose: () => state.onDispose(),\n resources: [\n {\n source: PACKAGE_SOURCE,\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 ],\n };\n});\nexport default mcpExtension;\n"],"mappings":"oUAOa,GAAA,+CAAeA,CAAAA,CAAAA,kBAAAA,CAAkBC,EAAAA,gBAAiB,CAAE,aAAc,CAC7E,GAAI,CAAC,EAAS,MAAU,MAAM,uCAAuC,EACrE,IAAM,EAAQC,EAAAA,mBAAmB,CAAO,EACxC,MAAO,CACL,SAAU,EAAM,SAChB,MAAOC,EAAAA,wBAAwB,EAAM,QAAU,IAAU,CACvD,YAAa,EAAQ,IAAUC,EAAAA,cAAc,EAAM,EAAmC,CAAK,EAC3F,cAAe,EAAQ,EAAS,EAAO,IACrCC,EAAAA,gBAAgB,EAAQ,CAAE,GAAG,EAAS,QAAS,EAAQ,OAAQ,EAAG,CAAK,CAC3E,EAAE,EACF,SAAU,CACRC,EAAAA,iBAAiB,EAAM,QAAS,CAC9B,YAAa,KAAO,IAAQ,CAC1B,GAAM,CAAE,kBAAmB,MAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAM,2BAAA,CAAA,EACjC,OAAO,EAAe,EAAK,EAAM,OAAO,CAC1C,CACF,CAAC,CACH,EACA,cAAiB,EAAM,UAAU,EACjC,UAAW,CACT,CACE,OAAQL,EAAAA,eACR,UAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,KACA,OAAQ,CACN,CACE,KAAM,iBACN,YACE,2HACJ,CACF,CACF,CACF,CACF,CACF,CAAC"}
|
package/dist/extensions/pi.d.cts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.cts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";qBAOa,oEAAY"}
|
package/dist/extensions/pi.d.mts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";qBAOa,oEAAY"}
|
package/dist/extensions/pi.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{PACKAGE_SOURCE as e}from"../src/constants/piMcp.mjs";import{createMcpCommand as t}from"../src/controllers/mcpCommand.mjs";import{createMcpPiRuntime as n}from"../src/controllers/piRuntime.mjs";import{createMcpToolCollection as r}from"../src/tools/mcpToolCollection.mjs";import{renderMcpCall as i,renderMcpResult as a}from"../src/tui/mcpToolRender.mjs";import{definePiExtension as o}from"@agimon-ai/doompi-core/pi-extension";const s=o(e,({runtime:o})=>{if(!o)throw Error(`MCP requires the Cordis runtime mode.`);let s=n(o);return{services:s.services,tools:r(s.session,e=>({renderCall:(t,n)=>i(e,t,n),renderResult:(e,t,n,r)=>a(e,{...t,isError:r.isError},n)})),commands:[t(s.session,{openOverlay:async e=>{let{openMcpOverlay:t}=await import(`../src/tui/mcpOverlay.mjs`);return t(e,s.session)}})],onDispose:()=>s.onDispose(),resources:[{source:e,moduleUrl:import.meta.url,skills:[{name:`doompi-use-mcp`,description:`Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.`}]}]}});export{s as default,s as mcpExtension};
|
|
2
|
-
//# sourceMappingURL=pi.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { PACKAGE_SOURCE } from '../constants/piMcp';\nimport { createMcpCommand } from '../controllers/mcpCommand';\nimport { createMcpPiRuntime } from '../controllers/piRuntime';\nimport { createMcpToolCollection } from '../tools/mcpToolCollection';\nimport { renderMcpCall, renderMcpResult } from '../tui/mcpToolRender';\nexport const mcpExtension = definePiExtension(PACKAGE_SOURCE, ({ runtime }) => {\n if (!runtime) throw new Error('MCP requires the Cordis runtime mode.');\n const state = createMcpPiRuntime(runtime);\n return {\n services: state.services,\n tools: createMcpToolCollection(state.session, (tool) => ({\n renderCall: (params, theme) => renderMcpCall(tool, params as Record<string, unknown>, theme),\n renderResult: (result, options, theme, context) =>\n renderMcpResult(result, { ...options, isError: context.isError }, theme),\n })),\n commands: [\n createMcpCommand(state.session, {\n openOverlay: async (ctx) => {\n const { openMcpOverlay } = await import('../tui/mcpOverlay');\n return openMcpOverlay(ctx, state.session);\n },\n }),\n ],\n onDispose: () => state.onDispose(),\n resources: [\n {\n source: PACKAGE_SOURCE,\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 ],\n };\n});\nexport default mcpExtension;\n"],"mappings":"8aAOA,MAAa,EAAe,EAAkB,GAAiB,CAAE,aAAc,CAC7E,GAAI,CAAC,EAAS,MAAU,MAAM,uCAAuC,EACrE,IAAM,EAAQ,EAAmB,CAAO,EACxC,MAAO,CACL,SAAU,EAAM,SAChB,MAAO,EAAwB,EAAM,QAAU,IAAU,CACvD,YAAa,EAAQ,IAAU,EAAc,EAAM,EAAmC,CAAK,EAC3F,cAAe,EAAQ,EAAS,EAAO,IACrC,EAAgB,EAAQ,CAAE,GAAG,EAAS,QAAS,EAAQ,OAAQ,EAAG,CAAK,CAC3E,EAAE,EACF,SAAU,CACR,EAAiB,EAAM,QAAS,CAC9B,YAAa,KAAO,IAAQ,CAC1B,GAAM,CAAE,kBAAmB,MAAM,OAAO,6BACxC,OAAO,EAAe,EAAK,EAAM,OAAO,CAC1C,CACF,CAAC,CACH,EACA,cAAiB,EAAM,UAAU,EACjC,UAAW,CACT,CACE,OAAQ,EACR,UAAW,YAAY,IACvB,OAAQ,CACN,CACE,KAAM,iBACN,YACE,2HACJ,CACF,CACF,CACF,CACF,CACF,CAAC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../src/controllers/mcpHubApi.cjs"),t=require("../src/controllers/serverRuntime.cjs"),n=(0,require("@agimon-ai/doompi-core/server-facet").defineServerPlugin)({name:`@agimon-ai/doompi-mcp`,global:{api:[e.mcpHubApi]},workspace:{api:[e.mcpHubApi]},session:()=>t.createMcpServerRuntime()});exports.default=n,exports.mcpServerFacet=n;
|
|
2
|
-
//# sourceMappingURL=server.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["defineServerPlugin","mcpHubApi","createMcpServerRuntime"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { mcpHubApi } from '../controllers/mcpHubApi';\nimport { createMcpServerRuntime } from '../controllers/serverRuntime';\nexport const mcpServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi-mcp',\n global: { api: [mcpHubApi] },\n workspace: { api: [mcpHubApi] },\n session: () => createMcpServerRuntime(),\n});\nexport default mcpServerFacet;\n"],"mappings":"qMAIa,GAAA,+CAAiBA,CAAAA,CAAAA,mBAAAA,CAAmB,CAC/C,KAAM,wBACN,OAAQ,CAAE,IAAK,CAACC,EAAAA,SAAS,CAAE,EAC3B,UAAW,CAAE,IAAK,CAACA,EAAAA,SAAS,CAAE,EAC9B,YAAeC,EAAAA,uBAAuB,CACxC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.cts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAIa,8DAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAIa,8DAAc"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{mcpHubApi as e}from"../src/controllers/mcpHubApi.mjs";import{createMcpServerRuntime as t}from"../src/controllers/serverRuntime.mjs";import{defineServerPlugin as n}from"@agimon-ai/doompi-core/server-facet";const r=n({name:`@agimon-ai/doompi-mcp`,global:{api:[e]},workspace:{api:[e]},session:()=>t()});export{r as default,r as mcpServerFacet};
|
|
2
|
-
//# sourceMappingURL=server.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":[],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { mcpHubApi } from '../controllers/mcpHubApi';\nimport { createMcpServerRuntime } from '../controllers/serverRuntime';\nexport const mcpServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi-mcp',\n global: { api: [mcpHubApi] },\n workspace: { api: [mcpHubApi] },\n session: () => createMcpServerRuntime(),\n});\nexport default mcpServerFacet;\n"],"mappings":"oNAIA,MAAa,EAAiB,EAAmB,CAC/C,KAAM,wBACN,OAAQ,CAAE,IAAK,CAAC,CAAS,CAAE,EAC3B,UAAW,CAAE,IAAK,CAAC,CAAS,CAAE,EAC9B,YAAe,EAAuB,CACxC,CAAC"}
|
package/dist/index.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src/services/configSources/index.cjs"),t=require("./src/services/mcpRuntime/index.cjs"),n=require("./src/services/sessionConfig/index.cjs"),r=require("./src/schemas/directTools.cjs"),i=require("./src/schemas/sessionConfig.cjs"),a=require("./src/services/mcpCatalog/index.cjs");exports.DIRECT_TOOLS_ENV=r.DIRECT_TOOLS_ENV,exports.NO_DIRECT_TOOLS=r.NO_DIRECT_TOOLS,exports.PROXY_SERVER_NAME=e.PROXY_SERVER_NAME,exports.SESSION_ENV_VAR=i.SESSION_ENV_VAR,exports.buildMcpConfigGroups=e.buildMcpConfigGroups,exports.definitionsCachePath=t.definitionsCachePath,exports.readCachedCatalog=t.readCachedCatalog,exports.readSessionConfig=n.readSessionConfig,exports.sessionConfigEnvironment=n.sessionConfigEnvironment,exports.toPiToolName=a.toPiToolName;
|
package/dist/index.d.cts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { McpAllowlist, McpConfigGroups, McpConfigSource, McpSessionConfig } from "./src/types/mcpConfig.cjs";
|
|
2
|
-
import { PROXY_SERVER_NAME, buildMcpConfigGroups } from "./src/services/configSources/index.cjs";
|
|
3
|
-
import { CachedCatalog } from "./src/types/mcpRuntime.cjs";
|
|
4
|
-
import { definitionsCachePath, readCachedCatalog } from "./src/services/mcpRuntime/index.cjs";
|
|
5
|
-
import { readSessionConfig, sessionConfigEnvironment } from "./src/services/sessionConfig/index.cjs";
|
|
6
|
-
import { DIRECT_TOOLS_ENV, NO_DIRECT_TOOLS } from "./src/schemas/directTools.cjs";
|
|
7
|
-
import { SESSION_ENV_VAR } from "./src/schemas/sessionConfig.cjs";
|
|
8
|
-
import { toPiToolName } from "./src/services/mcpCatalog/index.cjs";
|
|
9
|
-
export { type CachedCatalog, DIRECT_TOOLS_ENV, type McpAllowlist, type McpConfigGroups, type McpConfigSource, type McpSessionConfig, NO_DIRECT_TOOLS, PROXY_SERVER_NAME, SESSION_ENV_VAR, buildMcpConfigGroups, definitionsCachePath, readCachedCatalog, readSessionConfig, sessionConfigEnvironment, toPiToolName };
|
package/dist/index.d.mts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { McpAllowlist, McpConfigGroups, McpConfigSource, McpSessionConfig } from "./src/types/mcpConfig.mjs";
|
|
2
|
-
import { PROXY_SERVER_NAME, buildMcpConfigGroups } from "./src/services/configSources/index.mjs";
|
|
3
|
-
import { CachedCatalog } from "./src/types/mcpRuntime.mjs";
|
|
4
|
-
import { definitionsCachePath, readCachedCatalog } from "./src/services/mcpRuntime/index.mjs";
|
|
5
|
-
import { readSessionConfig, sessionConfigEnvironment } from "./src/services/sessionConfig/index.mjs";
|
|
6
|
-
import { DIRECT_TOOLS_ENV, NO_DIRECT_TOOLS } from "./src/schemas/directTools.mjs";
|
|
7
|
-
import { SESSION_ENV_VAR } from "./src/schemas/sessionConfig.mjs";
|
|
8
|
-
import { toPiToolName } from "./src/services/mcpCatalog/index.mjs";
|
|
9
|
-
export { type CachedCatalog, DIRECT_TOOLS_ENV, type McpAllowlist, type McpConfigGroups, type McpConfigSource, type McpSessionConfig, NO_DIRECT_TOOLS, PROXY_SERVER_NAME, SESSION_ENV_VAR, buildMcpConfigGroups, definitionsCachePath, readCachedCatalog, readSessionConfig, sessionConfigEnvironment, toPiToolName };
|
package/dist/index.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{PROXY_SERVER_NAME as e,buildMcpConfigGroups as t}from"./src/services/configSources/index.mjs";import{definitionsCachePath as n,readCachedCatalog as r}from"./src/services/mcpRuntime/index.mjs";import{readSessionConfig as i,sessionConfigEnvironment as a}from"./src/services/sessionConfig/index.mjs";import{DIRECT_TOOLS_ENV as o,NO_DIRECT_TOOLS as s}from"./src/schemas/directTools.mjs";import{SESSION_ENV_VAR as c}from"./src/schemas/sessionConfig.mjs";import{toPiToolName as l}from"./src/services/mcpCatalog/index.mjs";export{o as DIRECT_TOOLS_ENV,s as NO_DIRECT_TOOLS,e as PROXY_SERVER_NAME,c as SESSION_ENV_VAR,t as buildMcpConfigGroups,n as definitionsCachePath,r as readCachedCatalog,i as readSessionConfig,a as sessionConfigEnvironment,l as toPiToolName};
|
package/dist/projection.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src/services/projection/index.cjs");let t=require("@agimon-ai/doompi-config/agentPluginMcp"),n=require("@agimon-ai/doompi-core/mcp-projection");Object.defineProperty(exports,"AGENT_PLUGIN_MCP_SCHEMA_URL",{enumerable:!0,get:function(){return n.AGENT_PLUGIN_MCP_SCHEMA_URL}}),exports.mcpSessionConfigFromProjection=e.mcpSessionConfigFromProjection,Object.defineProperty(exports,"normalizeAgentPluginMcpSource",{enumerable:!0,get:function(){return t.normalizeAgentPluginMcpSource}});
|
package/dist/projection.d.cts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { McpConfigSource, McpSessionConfig } from "./src/types/mcpConfig.cjs";
|
|
2
|
-
import { mcpSessionConfigFromProjection } from "./src/services/projection/index.cjs";
|
|
3
|
-
import { AGENT_PLUGIN_MCP_SCHEMA_URL } from "@agimon-ai/doompi-core/mcp-projection";
|
|
4
|
-
import { NormalizeAgentPluginMcpOptions, NormalizedAgentPluginMcpSource, normalizeAgentPluginMcpSource } from "@agimon-ai/doompi-config/agentPluginMcp";
|
|
5
|
-
export { AGENT_PLUGIN_MCP_SCHEMA_URL, type McpConfigSource, type McpSessionConfig, type NormalizeAgentPluginMcpOptions, type NormalizedAgentPluginMcpSource, mcpSessionConfigFromProjection, normalizeAgentPluginMcpSource };
|
package/dist/projection.d.mts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { McpConfigSource, McpSessionConfig } from "./src/types/mcpConfig.mjs";
|
|
2
|
-
import { mcpSessionConfigFromProjection } from "./src/services/projection/index.mjs";
|
|
3
|
-
import { NormalizeAgentPluginMcpOptions, NormalizedAgentPluginMcpSource, normalizeAgentPluginMcpSource } from "@agimon-ai/doompi-config/agentPluginMcp";
|
|
4
|
-
import { AGENT_PLUGIN_MCP_SCHEMA_URL } from "@agimon-ai/doompi-core/mcp-projection";
|
|
5
|
-
export { AGENT_PLUGIN_MCP_SCHEMA_URL, type McpConfigSource, type McpSessionConfig, type NormalizeAgentPluginMcpOptions, type NormalizedAgentPluginMcpSource, mcpSessionConfigFromProjection, normalizeAgentPluginMcpSource };
|
package/dist/projection.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{mcpSessionConfigFromProjection as e}from"./src/services/projection/index.mjs";import{normalizeAgentPluginMcpSource as t}from"@agimon-ai/doompi-config/agentPluginMcp";import{AGENT_PLUGIN_MCP_SCHEMA_URL as n}from"@agimon-ai/doompi-core/mcp-projection";export{n as AGENT_PLUGIN_MCP_SCHEMA_URL,e as mcpSessionConfigFromProjection,t as normalizeAgentPluginMcpSource};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.cjs","names":[],"sources":["../../../src/constants/mcp.ts"],"sourcesContent":["export const COMMAND_NAME = 'mcp';\nexport const COMMAND_DESCRIPTION = 'Browse this session MCP servers: authorize, enable, disable, tools and resources';\nexport const SERVER_COMMAND_DESCRIPTION = 'Show MCP configuration or begin an authorization request.';\n"],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.mjs","names":[],"sources":["../../../src/constants/mcp.ts"],"sourcesContent":["export const COMMAND_NAME = 'mcp';\nexport const COMMAND_DESCRIPTION = 'Browse this session MCP servers: authorize, enable, disable, tools and resources';\nexport const SERVER_COMMAND_DESCRIPTION = 'Show MCP configuration or begin an authorization request.';\n"],"mappings":"AACA,MAAa,EAAsB,mFACtB,EAA6B"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e={key:`e`,label:`extension`,detail:`tools, skills and config`,order:50};exports.LEADER_BINDING_PREFIX=`doom-mcp`,exports.LEADER_DETAIL=`servers and tools`,exports.LEADER_GROUP=e,exports.MCP_STATUS_KEY=`doom-mcp`,exports.PACKAGE_SOURCE=`@agimon-ai/doompi-mcp`;
|
|
2
|
-
//# sourceMappingURL=piMcp.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"piMcp.cjs","names":[],"sources":["../../../src/constants/piMcp.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/doompi-mcp';\n/** Leader binding ids are restricted to `[a-z0-9][a-z0-9._:-]*`, so the scope and slash are dropped. */\nexport const LEADER_BINDING_PREFIX = 'doom-mcp';\n/**\n * Sits under the existing `extension` group, beside `tools` and `config`.\n *\n * A top-level key would have to be unique across every extension, and MCP belongs\n * next to the tool browser a user reaches for anyway. `t` in particular is taken:\n * it is Doom Task's top-level group.\n */\nexport const LEADER_GROUP = { key: 'e', label: 'extension', detail: 'tools, skills and config', order: 50 } as const;\nexport const LEADER_KEY = 'm';\nexport const LEADER_LABEL = 'mcp';\nexport const LEADER_DETAIL = 'servers and tools';\n/**\n * Footer status carrying the session's MCP server names, comma separated.\n *\n * MCP tools are registered under `<server>_<tool>`, a name only known at\n * runtime, so the cockpit's web plugin reads this status to recognise which\n * tool calls are MCP calls. The web half duplicates the literal (src/web may\n * only import src/types), and a test keeps the two in step.\n */\nexport const MCP_STATUS_KEY = 'doom-mcp';\n"],"mappings":"AAAA,MAUa,EAAe,CAAE,IAAK,IAAK,MAAO,YAAa,OAAQ,2BAA4B,MAAO,EAAG"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=`@agimon-ai/doompi-mcp`,t=`doom-mcp`,n={key:`e`,label:`extension`,detail:`tools, skills and config`,order:50},r=`servers and tools`,i=`doom-mcp`;export{t as LEADER_BINDING_PREFIX,r as LEADER_DETAIL,n as LEADER_GROUP,i as MCP_STATUS_KEY,e as PACKAGE_SOURCE};
|
|
2
|
-
//# sourceMappingURL=piMcp.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"piMcp.mjs","names":[],"sources":["../../../src/constants/piMcp.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/doompi-mcp';\n/** Leader binding ids are restricted to `[a-z0-9][a-z0-9._:-]*`, so the scope and slash are dropped. */\nexport const LEADER_BINDING_PREFIX = 'doom-mcp';\n/**\n * Sits under the existing `extension` group, beside `tools` and `config`.\n *\n * A top-level key would have to be unique across every extension, and MCP belongs\n * next to the tool browser a user reaches for anyway. `t` in particular is taken:\n * it is Doom Task's top-level group.\n */\nexport const LEADER_GROUP = { key: 'e', label: 'extension', detail: 'tools, skills and config', order: 50 } as const;\nexport const LEADER_KEY = 'm';\nexport const LEADER_LABEL = 'mcp';\nexport const LEADER_DETAIL = 'servers and tools';\n/**\n * Footer status carrying the session's MCP server names, comma separated.\n *\n * MCP tools are registered under `<server>_<tool>`, a name only known at\n * runtime, so the cockpit's web plugin reads this status to recognise which\n * tool calls are MCP calls. The web half duplicates the literal (src/web may\n * only import src/types), and a test keeps the two in step.\n */\nexport const MCP_STATUS_KEY = 'doom-mcp';\n"],"mappings":"AAAA,MAAa,EAAiB,wBAEjB,EAAwB,WAQxB,EAAe,CAAE,IAAK,IAAK,MAAO,YAAa,OAAQ,2BAA4B,MAAO,EAAG,EAG7F,EAAgB,oBAShB,EAAiB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../constants/piMcp.cjs");function t(t){let n=t.registerLeader({source:e.PACKAGE_SOURCE,bindings:[{id:`${e.LEADER_BINDING_PREFIX}.open`,path:[e.LEADER_GROUP,{key:`m`,label:`mcp`,detail:e.LEADER_DETAIL}],command:{name:`mcp`}}]});return()=>n.dispose()}exports.registerLeaderContribution=t;
|
|
2
|
-
//# sourceMappingURL=leader.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"leader.cjs","names":["PACKAGE_SOURCE","LEADER_BINDING_PREFIX","LEADER_GROUP","LEADER_DETAIL"],"sources":["../../../src/controllers/leader.ts"],"sourcesContent":["import type { DoomUiHubService } from '@agimon-ai/doompi-core/ui-hub';\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"],"mappings":"0CAYA,SAAgB,EAA2B,EAAmC,CAC5E,IAAM,EAAe,EAAI,eAAe,CACtC,OAAQA,EAAAA,eACR,SAAU,CACR,CACE,GAAI,GAAGC,EAAAA,sBAAsB,OAC7B,KAAM,CAACC,EAAAA,aAAc,CAAE,IAAA,IAAiB,MAAA,MAAqB,OAAQC,EAAAA,aAAc,CAAC,EACpF,QAAS,CAAE,KAAA,KAAmB,CAChC,CACF,CACF,CAAC,EACD,UAAa,EAAa,QAAQ,CACpC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{LEADER_BINDING_PREFIX as e,LEADER_DETAIL as t,LEADER_GROUP as n,PACKAGE_SOURCE as r}from"../constants/piMcp.mjs";function i(i){let a=i.registerLeader({source:r,bindings:[{id:`${e}.open`,path:[n,{key:`m`,label:`mcp`,detail:t}],command:{name:`mcp`}}]});return()=>a.dispose()}export{i as registerLeaderContribution};
|
|
2
|
-
//# sourceMappingURL=leader.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"leader.mjs","names":[],"sources":["../../../src/controllers/leader.ts"],"sourcesContent":["import type { DoomUiHubService } from '@agimon-ai/doompi-core/ui-hub';\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"],"mappings":"wHAYA,SAAgB,EAA2B,EAAmC,CAC5E,IAAM,EAAe,EAAI,eAAe,CACtC,OAAQ,EACR,SAAU,CACR,CACE,GAAI,GAAG,EAAsB,OAC7B,KAAM,CAAC,EAAc,CAAE,IAAA,IAAiB,MAAA,MAAqB,OAAQ,CAAc,CAAC,EACpF,QAAS,CAAE,KAAA,KAAmB,CAChC,CACF,CACF,CAAC,EACD,UAAa,EAAa,QAAQ,CACpC"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const e=require("../constants/mcp.cjs"),t=`info`,n=`warning`,r={status:`status`,auth:`auth`,disconnect:`disconnect`,reload:`reload`},i=Object.values(r).join(`, `);function a(e){let[t=r.status,...n]=e.trim().split(/\s+/).filter(Boolean);return{subcommand:t,argument:n.join(` `)}}function o(e){let{servers:t}=e.getSnapshot();return t.length===0?`No MCP servers are configured for this session.`:[...t.map(e=>{let t=e.error?` (${e.error})`:``;return`${e.name}: ${e.state} · ${e.tools.length} tools${t}`}),...e.getDiagnostics()].join(`
|
|
2
|
-
`)}async function s(e,r,i){if(!r){i.ui.notify(`Name the server to authorize, for example /mcp auth boomlink.`,n);return}try{await e.reauthorize(r),i.ui.notify(`${r} is authorized.`,t)}catch(e){i.ui.notify(`Could not authorize ${r}: ${e instanceof Error?e.message:`unknown error`}`,n)}}function c(c,l){return[`mcp`,{description:e.COMMAND_DESCRIPTION,handler:async(e,u)=>{let d=typeof e==`string`?e:``;if(d.trim()===``&&u.hasUI){await l.openOverlay(u);return}let{subcommand:f,argument:p}=a(d);if(f===r.auth){await s(c,p,u);return}if(f===r.disconnect){if(!p){u.ui.notify(`Name the server to disconnect, for example /mcp disconnect boomlink.`,n);return}try{await c.disconnect(p),u.ui.notify(`${p} is disconnected from this session. Saved credentials were kept.`,t)}catch(e){u.ui.notify(`Could not disconnect ${p}: ${e instanceof Error?e.message:`unknown error`}`,n)}return}if(f===r.reload){u.ui.notify(`Reconnecting MCP servers.`,t),c.start();return}if(f!==r.status){u.ui.notify(`Unknown /mcp subcommand "${f}". Use ${i}.`,n);return}u.ui.notify(o(c),t)}}]}exports.createMcpCommand=c,exports.formatStatus=o;
|
|
3
|
-
//# sourceMappingURL=mcpCommand.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcpCommand.cjs","names":["COMMAND_DESCRIPTION"],"sources":["../../../src/controllers/mcpCommand.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { COMMAND_NAME, COMMAND_DESCRIPTION } from '../constants/mcp';\nimport type { McpCommandTarget } from '../types/mcp';\n\ninterface McpCommandDeps {\n openOverlay(ctx: ExtensionContext): Promise<void>;\n}\n\nconst INFO = 'info';\nconst WARNING = 'warning';\n\nconst SUBCOMMAND = { status: 'status', auth: 'auth', disconnect: 'disconnect', reload: 'reload' } as const;\nconst SUBCOMMANDS = Object.values(SUBCOMMAND).join(', ');\n\n/** `/mcp <subcommand> [argument]`, with the bare command showing status. */\nfunction parseArguments(args: string): { subcommand: string; argument: string } {\n const [subcommand = SUBCOMMAND.status, ...rest] = args.trim().split(/\\s+/).filter(Boolean);\n return { subcommand, argument: rest.join(' ') };\n}\n\n/** One line per server: its state, and how many tools it currently offers. */\nexport function formatStatus(session: McpCommandTarget): string {\n const { servers } = session.getSnapshot();\n if (servers.length === 0) return 'No MCP servers are configured for this session.';\n const lines = servers.map((server) => {\n const detail = server.error ? ` (${server.error})` : '';\n return `${server.name}: ${server.state} · ${server.tools.length} tools${detail}`;\n });\n return [...lines, ...session.getDiagnostics()].join('\\n');\n}\n\nasync function runAuth(session: McpCommandTarget, serverName: string, ctx: ExtensionContext): Promise<void> {\n if (!serverName) {\n ctx.ui.notify('Name the server to authorize, for example /mcp auth boomlink.', WARNING);\n return;\n }\n try {\n // Reconnecting is what drives the flow: the OAuth provider surfaces the\n // authorization URL through the handler this extension installed.\n await session.reauthorize(serverName);\n ctx.ui.notify(`${serverName} is authorized.`, INFO);\n } catch (error) {\n ctx.ui.notify(\n `Could not authorize ${serverName}: ${error instanceof Error ? error.message : 'unknown error'}`,\n WARNING,\n );\n }\n}\n\nexport function createMcpCommand(\n session: McpCommandTarget,\n deps: McpCommandDeps,\n): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]] {\n return [\n COMMAND_NAME,\n {\n description: COMMAND_DESCRIPTION,\n handler: async (args, ctx) => {\n const raw = typeof args === 'string' ? args : '';\n // The bare command opens the browser, where the same information can be acted\n // on. The subcommands stay because an overlay needs a terminal, and a headless\n // or scripted session still has to be able to ask.\n if (raw.trim() === '' && ctx.hasUI) {\n await deps.openOverlay(ctx);\n return;\n }\n const { subcommand, argument } = parseArguments(raw);\n if (subcommand === SUBCOMMAND.auth) {\n await runAuth(session, argument, ctx);\n return;\n }\n if (subcommand === SUBCOMMAND.disconnect) {\n if (!argument) {\n ctx.ui.notify('Name the server to disconnect, for example /mcp disconnect boomlink.', WARNING);\n return;\n }\n try {\n await session.disconnect(argument);\n ctx.ui.notify(`${argument} is disconnected from this session. Saved credentials were kept.`, INFO);\n } catch (error) {\n ctx.ui.notify(\n `Could not disconnect ${argument}: ${error instanceof Error ? error.message : 'unknown error'}`,\n WARNING,\n );\n }\n return;\n }\n if (subcommand === SUBCOMMAND.reload) {\n ctx.ui.notify('Reconnecting MCP servers.', INFO);\n // Not awaited: a server that never answers must not wedge the command.\n void session.start();\n return;\n }\n if (subcommand !== SUBCOMMAND.status) {\n ctx.ui.notify(`Unknown /${COMMAND_NAME} subcommand \"${subcommand}\". Use ${SUBCOMMANDS}.`, WARNING);\n return;\n }\n ctx.ui.notify(formatStatus(session), INFO);\n },\n },\n ];\n}\n"],"mappings":"wCASM,EAAO,OACP,EAAU,UAEV,EAAa,CAAE,OAAQ,SAAU,KAAM,OAAQ,WAAY,aAAc,OAAQ,QAAS,EAC1F,EAAc,OAAO,OAAO,CAAU,CAAC,CAAC,KAAK,IAAI,EAGvD,SAAS,EAAe,EAAwD,CAC9E,GAAM,CAAC,EAAa,EAAW,OAAQ,GAAG,GAAQ,EAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO,EACzF,MAAO,CAAE,aAAY,SAAU,EAAK,KAAK,GAAG,CAAE,CAChD,CAGA,SAAgB,EAAa,EAAmC,CAC9D,GAAM,CAAE,WAAY,EAAQ,YAAY,EAMxC,OALI,EAAQ,SAAW,EAAU,kDAK1B,CAAC,GAJM,EAAQ,IAAK,GAAW,CACpC,IAAM,EAAS,EAAO,MAAQ,KAAK,EAAO,MAAM,GAAK,GACrD,MAAO,GAAG,EAAO,KAAK,IAAI,EAAO,MAAM,KAAK,EAAO,MAAM,OAAO,QAAQ,GAC1E,CACe,EAAG,GAAG,EAAQ,eAAe,CAAC,CAAC,CAAC,KAAK;CAAI,CAC1D,CAEA,eAAe,EAAQ,EAA2B,EAAoB,EAAsC,CAC1G,GAAI,CAAC,EAAY,CACf,EAAI,GAAG,OAAO,gEAAiE,CAAO,EACtF,MACF,CACA,GAAI,CAGF,MAAM,EAAQ,YAAY,CAAU,EACpC,EAAI,GAAG,OAAO,GAAG,EAAW,iBAAkB,CAAI,CACpD,OAAS,EAAO,CACd,EAAI,GAAG,OACL,uBAAuB,EAAW,IAAI,aAAiB,MAAQ,EAAM,QAAU,kBAC/E,CACF,CACF,CACF,CAEA,SAAgB,EACd,EACA,EACmE,CACnE,MAAO,CAAA,MAEL,CACE,YAAaA,EAAAA,oBACb,QAAS,MAAO,EAAM,IAAQ,CAC5B,IAAM,EAAM,OAAO,GAAS,SAAW,EAAO,GAI9C,GAAI,EAAI,KAAK,IAAM,IAAM,EAAI,MAAO,CAClC,MAAM,EAAK,YAAY,CAAG,EAC1B,MACF,CACA,GAAM,CAAE,aAAY,YAAa,EAAe,CAAG,EACnD,GAAI,IAAe,EAAW,KAAM,CAClC,MAAM,EAAQ,EAAS,EAAU,CAAG,EACpC,MACF,CACA,GAAI,IAAe,EAAW,WAAY,CACxC,GAAI,CAAC,EAAU,CACb,EAAI,GAAG,OAAO,uEAAwE,CAAO,EAC7F,MACF,CACA,GAAI,CACF,MAAM,EAAQ,WAAW,CAAQ,EACjC,EAAI,GAAG,OAAO,GAAG,EAAS,kEAAmE,CAAI,CACnG,OAAS,EAAO,CACd,EAAI,GAAG,OACL,wBAAwB,EAAS,IAAI,aAAiB,MAAQ,EAAM,QAAU,kBAC9E,CACF,CACF,CACA,MACF,CACA,GAAI,IAAe,EAAW,OAAQ,CACpC,EAAI,GAAG,OAAO,4BAA6B,CAAI,EAE/C,EAAa,MAAM,EACnB,MACF,CACA,GAAI,IAAe,EAAW,OAAQ,CACpC,EAAI,GAAG,OAAO,4BAAwC,EAAW,SAAS,EAAY,GAAI,CAAO,EACjG,MACF,CACA,EAAI,GAAG,OAAO,EAAa,CAAO,EAAG,CAAI,CAC3C,CACF,CACF,CACF"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{COMMAND_DESCRIPTION as e}from"../constants/mcp.mjs";const t=`info`,n=`warning`,r={status:`status`,auth:`auth`,disconnect:`disconnect`,reload:`reload`},i=Object.values(r).join(`, `);function a(e){let[t=r.status,...n]=e.trim().split(/\s+/).filter(Boolean);return{subcommand:t,argument:n.join(` `)}}function o(e){let{servers:t}=e.getSnapshot();return t.length===0?`No MCP servers are configured for this session.`:[...t.map(e=>{let t=e.error?` (${e.error})`:``;return`${e.name}: ${e.state} · ${e.tools.length} tools${t}`}),...e.getDiagnostics()].join(`
|
|
2
|
-
`)}async function s(e,r,i){if(!r){i.ui.notify(`Name the server to authorize, for example /mcp auth boomlink.`,n);return}try{await e.reauthorize(r),i.ui.notify(`${r} is authorized.`,t)}catch(e){i.ui.notify(`Could not authorize ${r}: ${e instanceof Error?e.message:`unknown error`}`,n)}}function c(c,l){return[`mcp`,{description:e,handler:async(e,u)=>{let d=typeof e==`string`?e:``;if(d.trim()===``&&u.hasUI){await l.openOverlay(u);return}let{subcommand:f,argument:p}=a(d);if(f===r.auth){await s(c,p,u);return}if(f===r.disconnect){if(!p){u.ui.notify(`Name the server to disconnect, for example /mcp disconnect boomlink.`,n);return}try{await c.disconnect(p),u.ui.notify(`${p} is disconnected from this session. Saved credentials were kept.`,t)}catch(e){u.ui.notify(`Could not disconnect ${p}: ${e instanceof Error?e.message:`unknown error`}`,n)}return}if(f===r.reload){u.ui.notify(`Reconnecting MCP servers.`,t),c.start();return}if(f!==r.status){u.ui.notify(`Unknown /mcp subcommand "${f}". Use ${i}.`,n);return}u.ui.notify(o(c),t)}}]}export{c as createMcpCommand,o as formatStatus};
|
|
3
|
-
//# sourceMappingURL=mcpCommand.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcpCommand.mjs","names":[],"sources":["../../../src/controllers/mcpCommand.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { COMMAND_NAME, COMMAND_DESCRIPTION } from '../constants/mcp';\nimport type { McpCommandTarget } from '../types/mcp';\n\ninterface McpCommandDeps {\n openOverlay(ctx: ExtensionContext): Promise<void>;\n}\n\nconst INFO = 'info';\nconst WARNING = 'warning';\n\nconst SUBCOMMAND = { status: 'status', auth: 'auth', disconnect: 'disconnect', reload: 'reload' } as const;\nconst SUBCOMMANDS = Object.values(SUBCOMMAND).join(', ');\n\n/** `/mcp <subcommand> [argument]`, with the bare command showing status. */\nfunction parseArguments(args: string): { subcommand: string; argument: string } {\n const [subcommand = SUBCOMMAND.status, ...rest] = args.trim().split(/\\s+/).filter(Boolean);\n return { subcommand, argument: rest.join(' ') };\n}\n\n/** One line per server: its state, and how many tools it currently offers. */\nexport function formatStatus(session: McpCommandTarget): string {\n const { servers } = session.getSnapshot();\n if (servers.length === 0) return 'No MCP servers are configured for this session.';\n const lines = servers.map((server) => {\n const detail = server.error ? ` (${server.error})` : '';\n return `${server.name}: ${server.state} · ${server.tools.length} tools${detail}`;\n });\n return [...lines, ...session.getDiagnostics()].join('\\n');\n}\n\nasync function runAuth(session: McpCommandTarget, serverName: string, ctx: ExtensionContext): Promise<void> {\n if (!serverName) {\n ctx.ui.notify('Name the server to authorize, for example /mcp auth boomlink.', WARNING);\n return;\n }\n try {\n // Reconnecting is what drives the flow: the OAuth provider surfaces the\n // authorization URL through the handler this extension installed.\n await session.reauthorize(serverName);\n ctx.ui.notify(`${serverName} is authorized.`, INFO);\n } catch (error) {\n ctx.ui.notify(\n `Could not authorize ${serverName}: ${error instanceof Error ? error.message : 'unknown error'}`,\n WARNING,\n );\n }\n}\n\nexport function createMcpCommand(\n session: McpCommandTarget,\n deps: McpCommandDeps,\n): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]] {\n return [\n COMMAND_NAME,\n {\n description: COMMAND_DESCRIPTION,\n handler: async (args, ctx) => {\n const raw = typeof args === 'string' ? args : '';\n // The bare command opens the browser, where the same information can be acted\n // on. The subcommands stay because an overlay needs a terminal, and a headless\n // or scripted session still has to be able to ask.\n if (raw.trim() === '' && ctx.hasUI) {\n await deps.openOverlay(ctx);\n return;\n }\n const { subcommand, argument } = parseArguments(raw);\n if (subcommand === SUBCOMMAND.auth) {\n await runAuth(session, argument, ctx);\n return;\n }\n if (subcommand === SUBCOMMAND.disconnect) {\n if (!argument) {\n ctx.ui.notify('Name the server to disconnect, for example /mcp disconnect boomlink.', WARNING);\n return;\n }\n try {\n await session.disconnect(argument);\n ctx.ui.notify(`${argument} is disconnected from this session. Saved credentials were kept.`, INFO);\n } catch (error) {\n ctx.ui.notify(\n `Could not disconnect ${argument}: ${error instanceof Error ? error.message : 'unknown error'}`,\n WARNING,\n );\n }\n return;\n }\n if (subcommand === SUBCOMMAND.reload) {\n ctx.ui.notify('Reconnecting MCP servers.', INFO);\n // Not awaited: a server that never answers must not wedge the command.\n void session.start();\n return;\n }\n if (subcommand !== SUBCOMMAND.status) {\n ctx.ui.notify(`Unknown /${COMMAND_NAME} subcommand \"${subcommand}\". Use ${SUBCOMMANDS}.`, WARNING);\n return;\n }\n ctx.ui.notify(formatStatus(session), INFO);\n },\n },\n ];\n}\n"],"mappings":"2DASA,MAAM,EAAO,OACP,EAAU,UAEV,EAAa,CAAE,OAAQ,SAAU,KAAM,OAAQ,WAAY,aAAc,OAAQ,QAAS,EAC1F,EAAc,OAAO,OAAO,CAAU,CAAC,CAAC,KAAK,IAAI,EAGvD,SAAS,EAAe,EAAwD,CAC9E,GAAM,CAAC,EAAa,EAAW,OAAQ,GAAG,GAAQ,EAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO,EACzF,MAAO,CAAE,aAAY,SAAU,EAAK,KAAK,GAAG,CAAE,CAChD,CAGA,SAAgB,EAAa,EAAmC,CAC9D,GAAM,CAAE,WAAY,EAAQ,YAAY,EAMxC,OALI,EAAQ,SAAW,EAAU,kDAK1B,CAAC,GAJM,EAAQ,IAAK,GAAW,CACpC,IAAM,EAAS,EAAO,MAAQ,KAAK,EAAO,MAAM,GAAK,GACrD,MAAO,GAAG,EAAO,KAAK,IAAI,EAAO,MAAM,KAAK,EAAO,MAAM,OAAO,QAAQ,GAC1E,CACe,EAAG,GAAG,EAAQ,eAAe,CAAC,CAAC,CAAC,KAAK;CAAI,CAC1D,CAEA,eAAe,EAAQ,EAA2B,EAAoB,EAAsC,CAC1G,GAAI,CAAC,EAAY,CACf,EAAI,GAAG,OAAO,gEAAiE,CAAO,EACtF,MACF,CACA,GAAI,CAGF,MAAM,EAAQ,YAAY,CAAU,EACpC,EAAI,GAAG,OAAO,GAAG,EAAW,iBAAkB,CAAI,CACpD,OAAS,EAAO,CACd,EAAI,GAAG,OACL,uBAAuB,EAAW,IAAI,aAAiB,MAAQ,EAAM,QAAU,kBAC/E,CACF,CACF,CACF,CAEA,SAAgB,EACd,EACA,EACmE,CACnE,MAAO,CAAA,MAEL,CACE,YAAa,EACb,QAAS,MAAO,EAAM,IAAQ,CAC5B,IAAM,EAAM,OAAO,GAAS,SAAW,EAAO,GAI9C,GAAI,EAAI,KAAK,IAAM,IAAM,EAAI,MAAO,CAClC,MAAM,EAAK,YAAY,CAAG,EAC1B,MACF,CACA,GAAM,CAAE,aAAY,YAAa,EAAe,CAAG,EACnD,GAAI,IAAe,EAAW,KAAM,CAClC,MAAM,EAAQ,EAAS,EAAU,CAAG,EACpC,MACF,CACA,GAAI,IAAe,EAAW,WAAY,CACxC,GAAI,CAAC,EAAU,CACb,EAAI,GAAG,OAAO,uEAAwE,CAAO,EAC7F,MACF,CACA,GAAI,CACF,MAAM,EAAQ,WAAW,CAAQ,EACjC,EAAI,GAAG,OAAO,GAAG,EAAS,kEAAmE,CAAI,CACnG,OAAS,EAAO,CACd,EAAI,GAAG,OACL,wBAAwB,EAAS,IAAI,aAAiB,MAAQ,EAAM,QAAU,kBAC9E,CACF,CACF,CACA,MACF,CACA,GAAI,IAAe,EAAW,OAAQ,CACpC,EAAI,GAAG,OAAO,4BAA6B,CAAI,EAE/C,EAAa,MAAM,EACnB,MACF,CACA,GAAI,IAAe,EAAW,OAAQ,CACpC,EAAI,GAAG,OAAO,4BAAwC,EAAW,SAAS,EAAY,GAAI,CAAO,EACjG,MACF,CACA,EAAI,GAAG,OAAO,EAAa,CAAO,EAAG,CAAI,CAC3C,CACF,CACF,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../types/webMcp.cjs"),t=require("../services/mcpSettingsManager/index.cjs"),n={"content-type":`application/json`},r=/^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$/u,i=/^[a-f0-9-]{36}$/u,a=new t.McpSettingsManager;function o(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:n})}function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function c(e){let t=await e.text();if(!(t.length>8192))try{let e=JSON.parse(t);return s(e)?e:void 0}catch{return}}function l(e){return typeof e==`string`&&r.test(e)?e:void 0}function u(e){return typeof e==`string`&&e.length>0&&e.length<=160&&!Array.from(e).some(e=>e.charCodeAt(0)<=31)?e:void 0}function d(e,t){return e.resolveRepository?.(t)}function f(e){let t=e instanceof Error?e.message:``;return t.includes(`already active`)||t.startsWith(`Sync this repository`)?{status:409,message:t}:t.includes(`not enabled`)?{status:404,message:t}:{status:500,message:`MCP management could not complete that request.`}}async function p(e,t){let n=l(new URL(e.url).searchParams.get(`repositoryId`));if(!n)return o({error:`A valid repositoryId is required.`},400);let r=d(t,n);if(!r)return o({error:`That repository is not available to this hub.`},404);try{return o(await a.readCatalog(n,r,t.readRepositorySync?.(n)))}catch{return o({error:`The synced MCP catalog could not be read.`},500)}}async function m(e,t){let n=l((await c(e))?.repositoryId);if(!n)return o({error:`A valid repositoryId is required.`},400);let r=d(t,n);if(!r)return o({error:`That repository is not available to this hub.`},404);try{return o(await a.discover(n,r,t.readRepositorySync?.(n)))}catch(e){let t=f(e);return o({error:t.message},t.status)}}async function h(e,t){let n=await c(e),r=l(n?.repositoryId),i=u(n?.serverName);if(!r||!i)return o({error:`A valid repositoryId and serverName are required.`},400);let s=d(t,r);if(!s)return o({error:`That repository is not available to this hub.`},404);try{return o(await a.authorize(r,s,t.readRepositorySync?.(r),i,t.oauthRedirect?.()),202)}catch(e){let t=f(e);return o({error:t.message},t.status)}}async function g(t,n,r){let s=r.slice(`${e.MCP_AUTHORIZATION_API_PATH}/`.length),c=l(new URL(t.url).searchParams.get(`repositoryId`));if(!c||!i.test(s))return o({error:`A valid repositoryId and flow id are required.`},400);if(!d(n,c))return o({error:`That repository is not available to this hub.`},404);if(t.method===`DELETE`){let e=await a.cancelAuthorization(s,c);return e?o(e):o({error:`That authorization flow was not found.`},404)}let u=a.getAuthorization(s,c);return u?o(u):o({error:`That authorization flow was not found.`},404)}const _={basePath:`mcp`,start(e){return{async fetch(t){let n=new URL(t.url).pathname;return t.method===`GET`&&n===`/repository`?await p(t,e):t.method===`POST`&&n===`/repository/discover`?await m(t,e):t.method===`POST`&&n===`/repository/authorize`?await h(t,e):(t.method===`GET`||t.method===`DELETE`)&&n.startsWith(`/repository/authorize/`)?await g(t,e,n):o({error:`Not found.`},404)},close(){a.dispose()}}}};exports.mcpHubApi=_;
|
|
2
|
-
//# sourceMappingURL=mcpHubApi.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcpHubApi.cjs","names":["McpSettingsManager","MCP_AUTHORIZATION_API_PATH"],"sources":["../../../src/controllers/mcpHubApi.ts"],"sourcesContent":["import type { DoomApi, DoomApiContext } from '@agimon-ai/doompi-core/package-api';\n\nimport { McpSettingsManager } from '../services/mcpSettingsManager';\nimport { MCP_AUTHORIZATION_API_PATH, MCP_DISCOVERY_API_PATH, MCP_REPOSITORY_API_PATH } from '../types/webMcp';\n\nconst JSON_HEADERS = { 'content-type': 'application/json' };\nconst REPOSITORY_ID = /^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$/u;\nconst FLOW_ID = /^[a-f0-9-]{36}$/u;\nconst MAX_BODY_BYTES = 8 * 1024;\nconst MAX_SERVER_NAME = 160;\nconst manager = new McpSettingsManager();\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction json(body: unknown, status = 200): Response {\n return new Response(JSON.stringify(body), { status, headers: JSON_HEADERS });\n}\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nasync function bodyOf(request: Request): Promise<JsonRecord | undefined> {\n const text = await request.text();\n if (text.length > MAX_BODY_BYTES) return undefined;\n try {\n const parsed = JSON.parse(text) as unknown;\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction repositoryIdOf(value: unknown): string | undefined {\n return typeof value === 'string' && REPOSITORY_ID.test(value) ? value : undefined;\n}\n\nfunction serverNameOf(value: unknown): string | undefined {\n return typeof value === 'string' &&\n value.length > 0 &&\n value.length <= MAX_SERVER_NAME &&\n !Array.from(value).some((character) => character.charCodeAt(0) <= 0x1f)\n ? value\n : undefined;\n}\n\nfunction resolveRepository(context: DoomApiContext, repositoryId: string): string | undefined {\n return context.resolveRepository?.(repositoryId);\n}\n\nfunction errorStatus(error: unknown): { status: number; message: string } {\n const message = error instanceof Error ? error.message : '';\n if (message.includes('already active')) return { status: 409, message };\n if (message.startsWith('Sync this repository')) return { status: 409, message };\n if (message.includes('not enabled')) return { status: 404, message };\n return { status: 500, message: 'MCP management could not complete that request.' };\n}\n\nasync function handleCatalog(request: Request, context: DoomApiContext): Promise<Response> {\n const repositoryId = repositoryIdOf(new URL(request.url).searchParams.get('repositoryId'));\n if (!repositoryId) return json({ error: 'A valid repositoryId is required.' }, 400);\n const repositoryRoot = resolveRepository(context, repositoryId);\n if (!repositoryRoot) return json({ error: 'That repository is not available to this hub.' }, 404);\n try {\n return json(await manager.readCatalog(repositoryId, repositoryRoot, context.readRepositorySync?.(repositoryId)));\n } catch {\n return json({ error: 'The synced MCP catalog could not be read.' }, 500);\n }\n}\n\nasync function handleDiscovery(request: Request, context: DoomApiContext): Promise<Response> {\n const body = await bodyOf(request);\n const repositoryId = repositoryIdOf(body?.repositoryId);\n if (!repositoryId) return json({ error: 'A valid repositoryId is required.' }, 400);\n const repositoryRoot = resolveRepository(context, repositoryId);\n if (!repositoryRoot) return json({ error: 'That repository is not available to this hub.' }, 404);\n try {\n return json(await manager.discover(repositoryId, repositoryRoot, context.readRepositorySync?.(repositoryId)));\n } catch (error) {\n const failure = errorStatus(error);\n return json({ error: failure.message }, failure.status);\n }\n}\n\nasync function handleAuthorize(request: Request, context: DoomApiContext): Promise<Response> {\n const body = await bodyOf(request);\n const repositoryId = repositoryIdOf(body?.repositoryId);\n const serverName = serverNameOf(body?.serverName);\n if (!repositoryId || !serverName) return json({ error: 'A valid repositoryId and serverName are required.' }, 400);\n const repositoryRoot = resolveRepository(context, repositoryId);\n if (!repositoryRoot) return json({ error: 'That repository is not available to this hub.' }, 404);\n try {\n return json(\n await manager.authorize(\n repositoryId,\n repositoryRoot,\n context.readRepositorySync?.(repositoryId),\n serverName,\n context.oauthRedirect?.(),\n ),\n 202,\n );\n } catch (error) {\n const failure = errorStatus(error);\n return json({ error: failure.message }, failure.status);\n }\n}\n\nasync function handleAuthorizationFlow(request: Request, context: DoomApiContext, path: string): Promise<Response> {\n const flowId = path.slice(`${MCP_AUTHORIZATION_API_PATH}/`.length);\n const repositoryId = repositoryIdOf(new URL(request.url).searchParams.get('repositoryId'));\n if (!repositoryId || !FLOW_ID.test(flowId))\n return json({ error: 'A valid repositoryId and flow id are required.' }, 400);\n if (!resolveRepository(context, repositoryId)) {\n return json({ error: 'That repository is not available to this hub.' }, 404);\n }\n if (request.method === 'DELETE') {\n const flow = await manager.cancelAuthorization(flowId, repositoryId);\n return flow ? json(flow) : json({ error: 'That authorization flow was not found.' }, 404);\n }\n const flow = manager.getAuthorization(flowId, repositoryId);\n return flow ? json(flow) : json({ error: 'That authorization flow was not found.' }, 404);\n}\n\nexport const mcpHubApi: DoomApi = {\n basePath: 'mcp',\n start(context) {\n return {\n async fetch(request) {\n const path = new URL(request.url).pathname;\n if (request.method === 'GET' && path === MCP_REPOSITORY_API_PATH) {\n return await handleCatalog(request, context);\n }\n if (request.method === 'POST' && path === MCP_DISCOVERY_API_PATH) {\n return await handleDiscovery(request, context);\n }\n if (request.method === 'POST' && path === MCP_AUTHORIZATION_API_PATH) {\n return await handleAuthorize(request, context);\n }\n if (\n (request.method === 'GET' || request.method === 'DELETE') &&\n path.startsWith(`${MCP_AUTHORIZATION_API_PATH}/`)\n ) {\n return await handleAuthorizationFlow(request, context, path);\n }\n return json({ error: 'Not found.' }, 404);\n },\n close() {\n void manager.dispose();\n },\n };\n },\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{MCP_AUTHORIZATION_API_PATH as e}from"../types/webMcp.mjs";import{McpSettingsManager as t}from"../services/mcpSettingsManager/index.mjs";const n={"content-type":`application/json`},r=/^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$/u,i=/^[a-f0-9-]{36}$/u,a=new t;function o(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:n})}function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function c(e){let t=await e.text();if(!(t.length>8192))try{let e=JSON.parse(t);return s(e)?e:void 0}catch{return}}function l(e){return typeof e==`string`&&r.test(e)?e:void 0}function u(e){return typeof e==`string`&&e.length>0&&e.length<=160&&!Array.from(e).some(e=>e.charCodeAt(0)<=31)?e:void 0}function d(e,t){return e.resolveRepository?.(t)}function f(e){let t=e instanceof Error?e.message:``;return t.includes(`already active`)||t.startsWith(`Sync this repository`)?{status:409,message:t}:t.includes(`not enabled`)?{status:404,message:t}:{status:500,message:`MCP management could not complete that request.`}}async function p(e,t){let n=l(new URL(e.url).searchParams.get(`repositoryId`));if(!n)return o({error:`A valid repositoryId is required.`},400);let r=d(t,n);if(!r)return o({error:`That repository is not available to this hub.`},404);try{return o(await a.readCatalog(n,r,t.readRepositorySync?.(n)))}catch{return o({error:`The synced MCP catalog could not be read.`},500)}}async function m(e,t){let n=l((await c(e))?.repositoryId);if(!n)return o({error:`A valid repositoryId is required.`},400);let r=d(t,n);if(!r)return o({error:`That repository is not available to this hub.`},404);try{return o(await a.discover(n,r,t.readRepositorySync?.(n)))}catch(e){let t=f(e);return o({error:t.message},t.status)}}async function h(e,t){let n=await c(e),r=l(n?.repositoryId),i=u(n?.serverName);if(!r||!i)return o({error:`A valid repositoryId and serverName are required.`},400);let s=d(t,r);if(!s)return o({error:`That repository is not available to this hub.`},404);try{return o(await a.authorize(r,s,t.readRepositorySync?.(r),i,t.oauthRedirect?.()),202)}catch(e){let t=f(e);return o({error:t.message},t.status)}}async function g(t,n,r){let s=r.slice(`${e}/`.length),c=l(new URL(t.url).searchParams.get(`repositoryId`));if(!c||!i.test(s))return o({error:`A valid repositoryId and flow id are required.`},400);if(!d(n,c))return o({error:`That repository is not available to this hub.`},404);if(t.method===`DELETE`){let e=await a.cancelAuthorization(s,c);return e?o(e):o({error:`That authorization flow was not found.`},404)}let u=a.getAuthorization(s,c);return u?o(u):o({error:`That authorization flow was not found.`},404)}const _={basePath:`mcp`,start(e){return{async fetch(t){let n=new URL(t.url).pathname;return t.method===`GET`&&n===`/repository`?await p(t,e):t.method===`POST`&&n===`/repository/discover`?await m(t,e):t.method===`POST`&&n===`/repository/authorize`?await h(t,e):(t.method===`GET`||t.method===`DELETE`)&&n.startsWith(`/repository/authorize/`)?await g(t,e,n):o({error:`Not found.`},404)},close(){a.dispose()}}}};export{_ as mcpHubApi};
|
|
2
|
-
//# sourceMappingURL=mcpHubApi.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcpHubApi.mjs","names":[],"sources":["../../../src/controllers/mcpHubApi.ts"],"sourcesContent":["import type { DoomApi, DoomApiContext } from '@agimon-ai/doompi-core/package-api';\n\nimport { McpSettingsManager } from '../services/mcpSettingsManager';\nimport { MCP_AUTHORIZATION_API_PATH, MCP_DISCOVERY_API_PATH, MCP_REPOSITORY_API_PATH } from '../types/webMcp';\n\nconst JSON_HEADERS = { 'content-type': 'application/json' };\nconst REPOSITORY_ID = /^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$/u;\nconst FLOW_ID = /^[a-f0-9-]{36}$/u;\nconst MAX_BODY_BYTES = 8 * 1024;\nconst MAX_SERVER_NAME = 160;\nconst manager = new McpSettingsManager();\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction json(body: unknown, status = 200): Response {\n return new Response(JSON.stringify(body), { status, headers: JSON_HEADERS });\n}\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nasync function bodyOf(request: Request): Promise<JsonRecord | undefined> {\n const text = await request.text();\n if (text.length > MAX_BODY_BYTES) return undefined;\n try {\n const parsed = JSON.parse(text) as unknown;\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction repositoryIdOf(value: unknown): string | undefined {\n return typeof value === 'string' && REPOSITORY_ID.test(value) ? value : undefined;\n}\n\nfunction serverNameOf(value: unknown): string | undefined {\n return typeof value === 'string' &&\n value.length > 0 &&\n value.length <= MAX_SERVER_NAME &&\n !Array.from(value).some((character) => character.charCodeAt(0) <= 0x1f)\n ? value\n : undefined;\n}\n\nfunction resolveRepository(context: DoomApiContext, repositoryId: string): string | undefined {\n return context.resolveRepository?.(repositoryId);\n}\n\nfunction errorStatus(error: unknown): { status: number; message: string } {\n const message = error instanceof Error ? error.message : '';\n if (message.includes('already active')) return { status: 409, message };\n if (message.startsWith('Sync this repository')) return { status: 409, message };\n if (message.includes('not enabled')) return { status: 404, message };\n return { status: 500, message: 'MCP management could not complete that request.' };\n}\n\nasync function handleCatalog(request: Request, context: DoomApiContext): Promise<Response> {\n const repositoryId = repositoryIdOf(new URL(request.url).searchParams.get('repositoryId'));\n if (!repositoryId) return json({ error: 'A valid repositoryId is required.' }, 400);\n const repositoryRoot = resolveRepository(context, repositoryId);\n if (!repositoryRoot) return json({ error: 'That repository is not available to this hub.' }, 404);\n try {\n return json(await manager.readCatalog(repositoryId, repositoryRoot, context.readRepositorySync?.(repositoryId)));\n } catch {\n return json({ error: 'The synced MCP catalog could not be read.' }, 500);\n }\n}\n\nasync function handleDiscovery(request: Request, context: DoomApiContext): Promise<Response> {\n const body = await bodyOf(request);\n const repositoryId = repositoryIdOf(body?.repositoryId);\n if (!repositoryId) return json({ error: 'A valid repositoryId is required.' }, 400);\n const repositoryRoot = resolveRepository(context, repositoryId);\n if (!repositoryRoot) return json({ error: 'That repository is not available to this hub.' }, 404);\n try {\n return json(await manager.discover(repositoryId, repositoryRoot, context.readRepositorySync?.(repositoryId)));\n } catch (error) {\n const failure = errorStatus(error);\n return json({ error: failure.message }, failure.status);\n }\n}\n\nasync function handleAuthorize(request: Request, context: DoomApiContext): Promise<Response> {\n const body = await bodyOf(request);\n const repositoryId = repositoryIdOf(body?.repositoryId);\n const serverName = serverNameOf(body?.serverName);\n if (!repositoryId || !serverName) return json({ error: 'A valid repositoryId and serverName are required.' }, 400);\n const repositoryRoot = resolveRepository(context, repositoryId);\n if (!repositoryRoot) return json({ error: 'That repository is not available to this hub.' }, 404);\n try {\n return json(\n await manager.authorize(\n repositoryId,\n repositoryRoot,\n context.readRepositorySync?.(repositoryId),\n serverName,\n context.oauthRedirect?.(),\n ),\n 202,\n );\n } catch (error) {\n const failure = errorStatus(error);\n return json({ error: failure.message }, failure.status);\n }\n}\n\nasync function handleAuthorizationFlow(request: Request, context: DoomApiContext, path: string): Promise<Response> {\n const flowId = path.slice(`${MCP_AUTHORIZATION_API_PATH}/`.length);\n const repositoryId = repositoryIdOf(new URL(request.url).searchParams.get('repositoryId'));\n if (!repositoryId || !FLOW_ID.test(flowId))\n return json({ error: 'A valid repositoryId and flow id are required.' }, 400);\n if (!resolveRepository(context, repositoryId)) {\n return json({ error: 'That repository is not available to this hub.' }, 404);\n }\n if (request.method === 'DELETE') {\n const flow = await manager.cancelAuthorization(flowId, repositoryId);\n return flow ? json(flow) : json({ error: 'That authorization flow was not found.' }, 404);\n }\n const flow = manager.getAuthorization(flowId, repositoryId);\n return flow ? json(flow) : json({ error: 'That authorization flow was not found.' }, 404);\n}\n\nexport const mcpHubApi: DoomApi = {\n basePath: 'mcp',\n start(context) {\n return {\n async fetch(request) {\n const path = new URL(request.url).pathname;\n if (request.method === 'GET' && path === MCP_REPOSITORY_API_PATH) {\n return await handleCatalog(request, context);\n }\n if (request.method === 'POST' && path === MCP_DISCOVERY_API_PATH) {\n return await handleDiscovery(request, context);\n }\n if (request.method === 'POST' && path === MCP_AUTHORIZATION_API_PATH) {\n return await handleAuthorize(request, context);\n }\n if (\n (request.method === 'GET' || request.method === 'DELETE') &&\n path.startsWith(`${MCP_AUTHORIZATION_API_PATH}/`)\n ) {\n return await handleAuthorizationFlow(request, context, path);\n }\n return json({ error: 'Not found.' }, 404);\n },\n close() {\n void manager.dispose();\n },\n };\n },\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../services/sessionConfig/index.cjs"),n=require("../services/projection/index.cjs"),r=require("../constants/piMcp.cjs"),i=require("../services/mcpSession/index.cjs"),a=require("../types/webMcp.cjs"),o=require("./leader.cjs");let s=require("node:path");s=e.__toESM(s,1);let c=require("@agimon-ai/doompi-core/mcp-projection"),l=require("@agimon-ai/doompi-core/cordis-host"),u=require("@agimon-ai/doompi-core/mcp-status"),d=require("@agimon-ai/doompi-core/mcp-tool-resolver"),f=require("@agimon-ai/doompi-core/tool-surface"),p=require("@agimon-ai/doompi-core/ui-hub");const m=`warning`;function h(e){return{enabled:!1,repoRoot:e,stagingDirectory:s.default.join(e,`.doom`,`mcp-disabled`),sources:[]}}function g(e){let s=e.mode,g,_=!1,v=new i.McpSession({onAuthorizationUrl:async(e,t,{openBrowser:n})=>{let r=g;if(r?.mode===`tui`){if(!n)return;try{let{default:t}=await import(`open`);await t(e.toString())}catch(e){throw r.ui.notify(`Could not open the authorization page for ${t}: ${e instanceof Error?e.message:String(e)}. Press a in the MCP overlay to retry.`,m),e}return}r?.ui?.notify(`Authorize ${t} by opening:\n${e.toString()}`,`info`)}});return{session:v,services:[e=>{e.inject([p.DOOM_UI_HUB_SERVICE],e=>o.registerLeaderContribution((0,p.requireDoomUiHub)(e))),e.inject([f.DOOM_TOOL_SURFACE_SERVICE],e=>v.bindToolSurface((0,f.requireDoomToolSurface)(e))),e.inject([l.DOOM_CORDIS_SESSION_SERVICE],async e=>{let i=e.get(l.DOOM_CORDIS_SESSION_SERVICE),o=i.context,f=i.sessionId,p=!0;g=o;let y=()=>{let e=v.getSnapshot().servers.map(e=>e.name).join(`,`);o.ui?.setStatus(r.MCP_STATUS_KEY,e),o.mode!==`tui`&&o.ui?.setStatus(a.MCP_SESSION_AUTH_STATUS_KEY,a.formatMcpSessionAuthStatus(v.getServers()))},b=v.onChange(y);y(),s===`standalone`?await v.reconfigure(t.readSessionConfig(process.env,o.cwd)):(await v.reconfigure(h(o.cwd)),e.inject([c.DOOM_MCP_PROJECTION_SERVICE],async e=>{let t=(0,c.readDoomMcpProjectionService)(e);return!t||t.sessionId!==f?(await v.reconfigure(h(o.cwd)),t&&p&&!_&&o.ui?.notify(`The Doom MCP projection belongs to session "${t.sessionId}", not "${f}"; MCP is disabled.`,m)):await v.reconfigure(n.mcpSessionConfigFromProjection(t.getSnapshot())),async()=>{p&&!_&&await v.reconfigure(h(o.cwd))}}));let x=Object.freeze({generation:`${i.generation}:mcp-status`,getSnapshot:()=>v.getSnapshot(),onChange:e=>v.onChange(e)}),S=Object.freeze({generation:`${i.generation}:mcp-tool-resolver`,resolve:e=>v.resolveToolSelectors(e)});e.provide(u.DOOM_MCP_STATUS_SERVICE,x),e.provide(d.DOOM_MCP_TOOL_RESOLVER_SERVICE,S);for(let e of v.getDiagnostics())o.ui?.notify(e,m);return async()=>{p=!1,b(),o.ui?.setStatus(r.MCP_STATUS_KEY,void 0),o.mode!==`tui`&&o.ui?.setStatus(a.MCP_SESSION_AUTH_STATUS_KEY,void 0),g===o&&(g=void 0),_||await v.reconfigure(h(o.cwd))}})}],async onDispose(){_=!0,g=void 0,await v.dispose()}}}exports.createMcpPiRuntime=g;
|
|
2
|
-
//# sourceMappingURL=piRuntime.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"piRuntime.cjs","names":["path","McpSession","DOOM_UI_HUB_SERVICE","registerLeaderContribution","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","DOOM_MCP_STATUS_SERVICE","DOOM_MCP_TOOL_RESOLVER_SERVICE"],"sources":["../../../src/controllers/piRuntime.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { DoomCordisRuntimeService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_MCP_PROJECTION_SERVICE, readDoomMcpProjectionService } from '@agimon-ai/doompi-core/mcp-projection';\nimport { DOOM_MCP_STATUS_SERVICE, type DoomMcpStatusService } from '@agimon-ai/doompi-core/mcp-status';\nimport {\n DOOM_MCP_TOOL_RESOLVER_SERVICE,\n type DoomMcpToolResolverService,\n} from '@agimon-ai/doompi-core/mcp-tool-resolver';\nimport { DOOM_TOOL_SURFACE_SERVICE, requireDoomToolSurface } from '@agimon-ai/doompi-core/tool-surface';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\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';\n\nconst INFO = 'info';\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 onAuthorizationUrl: async (url, serverName, { openBrowser }) => {\n const context = activeContext;\n if (context?.mode === 'tui') {\n if (!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 return;\n }\n context?.ui?.notify(`Authorize ${serverName} by opening:\\n${url.toString()}`, INFO);\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));\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 await session.reconfigure(mcpSessionConfigFromProjection(projection.getSnapshot()));\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 sessionContext.provide(DOOM_MCP_STATUS_SERVICE, status);\n sessionContext.provide(DOOM_MCP_TOOL_RESOLVER_SERVICE, toolResolver);\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"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readSessionConfig as e}from"../services/sessionConfig/index.mjs";import{mcpSessionConfigFromProjection as t}from"../services/projection/index.mjs";import{MCP_STATUS_KEY as n}from"../constants/piMcp.mjs";import{McpSession as r}from"../services/mcpSession/index.mjs";import{MCP_SESSION_AUTH_STATUS_KEY as i,formatMcpSessionAuthStatus as a}from"../types/webMcp.mjs";import{registerLeaderContribution as o}from"./leader.mjs";import s from"node:path";import{DOOM_MCP_PROJECTION_SERVICE as c,readDoomMcpProjectionService as l}from"@agimon-ai/doompi-core/mcp-projection";import{DOOM_CORDIS_SESSION_SERVICE as u}from"@agimon-ai/doompi-core/cordis-host";import{DOOM_MCP_STATUS_SERVICE as d}from"@agimon-ai/doompi-core/mcp-status";import{DOOM_MCP_TOOL_RESOLVER_SERVICE as f}from"@agimon-ai/doompi-core/mcp-tool-resolver";import{DOOM_TOOL_SURFACE_SERVICE as p,requireDoomToolSurface as m}from"@agimon-ai/doompi-core/tool-surface";import{DOOM_UI_HUB_SERVICE as h,requireDoomUiHub as g}from"@agimon-ai/doompi-core/ui-hub";const _=`warning`;function v(e){return{enabled:!1,repoRoot:e,stagingDirectory:s.join(e,`.doom`,`mcp-disabled`),sources:[]}}function y(s){let y=s.mode,b,x=!1,S=new r({onAuthorizationUrl:async(e,t,{openBrowser:n})=>{let r=b;if(r?.mode===`tui`){if(!n)return;try{let{default:t}=await import(`open`);await t(e.toString())}catch(e){throw r.ui.notify(`Could not open the authorization page for ${t}: ${e instanceof Error?e.message:String(e)}. Press a in the MCP overlay to retry.`,_),e}return}r?.ui?.notify(`Authorize ${t} by opening:\n${e.toString()}`,`info`)}});return{session:S,services:[r=>{r.inject([h],e=>o(g(e))),r.inject([p],e=>S.bindToolSurface(m(e))),r.inject([u],async r=>{let o=r.get(u),s=o.context,p=o.sessionId,m=!0;b=s;let h=()=>{let e=S.getSnapshot().servers.map(e=>e.name).join(`,`);s.ui?.setStatus(n,e),s.mode!==`tui`&&s.ui?.setStatus(i,a(S.getServers()))},g=S.onChange(h);h(),y===`standalone`?await S.reconfigure(e(process.env,s.cwd)):(await S.reconfigure(v(s.cwd)),r.inject([c],async e=>{let n=l(e);return!n||n.sessionId!==p?(await S.reconfigure(v(s.cwd)),n&&m&&!x&&s.ui?.notify(`The Doom MCP projection belongs to session "${n.sessionId}", not "${p}"; MCP is disabled.`,_)):await S.reconfigure(t(n.getSnapshot())),async()=>{m&&!x&&await S.reconfigure(v(s.cwd))}}));let C=Object.freeze({generation:`${o.generation}:mcp-status`,getSnapshot:()=>S.getSnapshot(),onChange:e=>S.onChange(e)}),w=Object.freeze({generation:`${o.generation}:mcp-tool-resolver`,resolve:e=>S.resolveToolSelectors(e)});r.provide(d,C),r.provide(f,w);for(let e of S.getDiagnostics())s.ui?.notify(e,_);return async()=>{m=!1,g(),s.ui?.setStatus(n,void 0),s.mode!==`tui`&&s.ui?.setStatus(i,void 0),b===s&&(b=void 0),x||await S.reconfigure(v(s.cwd))}})}],async onDispose(){x=!0,b=void 0,await S.dispose()}}}export{y as createMcpPiRuntime};
|
|
2
|
-
//# sourceMappingURL=piRuntime.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"piRuntime.mjs","names":[],"sources":["../../../src/controllers/piRuntime.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { DoomCordisRuntimeService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_MCP_PROJECTION_SERVICE, readDoomMcpProjectionService } from '@agimon-ai/doompi-core/mcp-projection';\nimport { DOOM_MCP_STATUS_SERVICE, type DoomMcpStatusService } from '@agimon-ai/doompi-core/mcp-status';\nimport {\n DOOM_MCP_TOOL_RESOLVER_SERVICE,\n type DoomMcpToolResolverService,\n} from '@agimon-ai/doompi-core/mcp-tool-resolver';\nimport { DOOM_TOOL_SURFACE_SERVICE, requireDoomToolSurface } from '@agimon-ai/doompi-core/tool-surface';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\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';\n\nconst INFO = 'info';\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 onAuthorizationUrl: async (url, serverName, { openBrowser }) => {\n const context = activeContext;\n if (context?.mode === 'tui') {\n if (!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 return;\n }\n context?.ui?.notify(`Authorize ${serverName} by opening:\\n${url.toString()}`, INFO);\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));\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 await session.reconfigure(mcpSessionConfigFromProjection(projection.getSnapshot()));\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 sessionContext.provide(DOOM_MCP_STATUS_SERVICE, status);\n sessionContext.provide(DOOM_MCP_TOOL_RESOLVER_SERVICE, toolResolver);\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"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../services/configSources/index.cjs"),t=require("../services/mcpRuntime/index.cjs"),n=require("../services/sessionConfig/index.cjs"),r=require("../constants/mcp.cjs"),i=require("../schemas/mcpHeadlessTool.cjs");function a(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}function o(e){let t=a(e).content;return Array.isArray(t)?t.map(e=>{let t=a(e);return t.type===`text`&&typeof t.text==`string`?{type:`text`,text:t.text}:t.type===`image`&&typeof t.data==`string`&&typeof t.mimeType==`string`?{type:`image`,data:t.data,mimeType:t.mimeType}:{type:`text`,text:JSON.stringify(e)}}):[{type:`text`,text:JSON.stringify(e)}]}function s(t,r){let i=n.readSessionConfig(t,r),a=e.buildMcpConfigGroups(i);return JSON.stringify({enabled:i.enabled!==!1,repoRoot:i.repoRoot,shared:a.shared.configPaths,sessionLocal:a.sessionLocal.configPaths,droppedServers:a.droppedServers,diagnostics:a.diagnostics},null,2)}function c(){let c;return{resources:[{name:`doompi/mcp-config`,kind:`context`,read:e=>s(e.environment,e.cwd)}],activities:[{name:`doompi-mcp-runtime`,async start(r){let i=new t.McpRuntimeOwner;c=i;try{let t=n.readSessionConfig(r.environment,r.cwd),a=e.buildMcpConfigGroups(t),o=[...a.shared.configSources,...a.sessionLocal.configSources];await i.start({configSources:o,onAuthorizationUrl:(e,t)=>void r.client.notify({title:`Authorize MCP server ${t}`,body:e.toString(),level:`warning`}),onServerStateChange:e=>{r.client.setStatus(`doompi-mcp`,`${e.serverName}: ${e.state}`)}})}catch(e){await r.client.notify({title:`DoomPi MCP unavailable`,body:e instanceof Error?e.message:String(e),level:`warning`})}return async()=>{c===i&&(c=void 0,await i.dispose(),r.client.setStatus(`doompi-mcp`,void 0))}}}],commands:[{name:`mcp`,description:r.SERVER_COMMAND_DESCRIPTION,async execute(e,t){let[n=`status`,r]=e.trim().split(/\s+/u).filter(Boolean);if(n===`auth`){let e=await t.client.request({kind:`input`,title:`Authorize MCP server${r?` ${r}`:``}`,message:`Paste the authorization URL or code supplied by the MCP server.`});typeof e==`string`&&e.trim()&&await t.client.notify({body:`MCP authorization received for ${r??`server`}.`,level:`info`});return}await t.client.notify({title:`DoomPi MCP`,body:s(t.environment,t.cwd),level:n===`status`?`info`:`warning`})}}],tools:[{name:`mcp_use`,label:`MCP use`,description:`Call a tool exposed by a connected MCP server.`,parameters:i.McpHeadlessToolParameters,executionMode:`serial`,async execute(e,t){let n=c?.getServices();if(!n)return{content:[{type:`text`,text:`The MCP runtime has not started yet.`}],isError:!0};try{let e=await(await n.clientManager.ensureConnected(t.server)).callTool(t.tool,t.arguments??{});return{content:o(e),details:e,...a(e).isError===!0?{isError:!0}:{}}}catch(e){return{content:[{type:`text`,text:e instanceof Error?e.message:String(e)}],isError:!0}}}}]}}exports.createMcpServerRuntime=c;
|
|
2
|
-
//# sourceMappingURL=serverRuntime.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serverRuntime.cjs","names":["readSessionConfig","buildMcpConfigGroups","McpRuntimeOwner","SERVER_COMMAND_DESCRIPTION","McpHeadlessToolParameters"],"sources":["../../../src/controllers/serverRuntime.ts"],"sourcesContent":["import {\n type DoomHeadlessActivity,\n type DoomHeadlessCommand,\n type DoomHeadlessContent,\n type DoomHeadlessResource,\n type DoomHeadlessTool,\n} from '@agimon-ai/doompi-core/headless';\n\nimport { COMMAND_NAME, SERVER_COMMAND_DESCRIPTION } from '../constants/mcp';\nimport { McpHeadlessToolParameters } from '../schemas/mcpHeadlessTool';\nimport { buildMcpConfigGroups } from '../services/configSources';\nimport { McpRuntimeOwner } from '../services/mcpRuntime';\nimport { readSessionConfig } from '../services/sessionConfig';\n\ntype JsonRecord = Readonly<Record<string, unknown>>;\n\nfunction record(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as JsonRecord) : {};\n}\n\nfunction resultContent(result: unknown): DoomHeadlessContent[] {\n const content = record(result).content;\n if (!Array.isArray(content)) return [{ type: 'text', text: JSON.stringify(result) }];\n return content.map((block): DoomHeadlessContent => {\n const item = record(block);\n if (item.type === 'text' && typeof item.text === 'string') return { type: 'text', text: item.text };\n if (item.type === 'image' && typeof item.data === 'string' && typeof item.mimeType === 'string') {\n return { type: 'image', data: item.data, mimeType: item.mimeType };\n }\n return { type: 'text', text: JSON.stringify(block) };\n });\n}\n\nfunction readConfig(environment: Readonly<Record<string, string | undefined>>, cwd: string): string {\n const config = readSessionConfig(environment, cwd);\n const groups = buildMcpConfigGroups(config);\n return JSON.stringify(\n {\n enabled: config.enabled !== false,\n repoRoot: config.repoRoot,\n shared: groups.shared.configPaths,\n sessionLocal: groups.sessionLocal.configPaths,\n droppedServers: groups.droppedServers,\n diagnostics: groups.diagnostics,\n },\n null,\n 2,\n );\n}\n\nexport function createMcpServerRuntime() {\n let runtime: McpRuntimeOwner | undefined;\n const resource: DoomHeadlessResource = {\n name: 'doompi/mcp-config',\n kind: 'context',\n read: (execution) => readConfig(execution.environment, execution.cwd),\n };\n\n const activity: DoomHeadlessActivity = {\n name: 'doompi-mcp-runtime',\n async start(execution) {\n const owner = new McpRuntimeOwner();\n runtime = owner;\n try {\n const config = readSessionConfig(execution.environment, execution.cwd);\n const groups = buildMcpConfigGroups(config);\n const sources = [...groups.shared.configSources, ...groups.sessionLocal.configSources];\n await owner.start({\n configSources: sources,\n onAuthorizationUrl: (url, serverName) =>\n void execution.client.notify({\n title: `Authorize MCP server ${serverName}`,\n body: url.toString(),\n level: 'warning',\n }),\n onServerStateChange: (change) => {\n execution.client.setStatus('doompi-mcp', `${change.serverName}: ${change.state}`);\n },\n });\n } catch (error) {\n await execution.client.notify({\n title: 'DoomPi MCP unavailable',\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n }\n return async () => {\n if (runtime !== owner) return;\n runtime = undefined;\n await owner.dispose();\n execution.client.setStatus('doompi-mcp', undefined);\n };\n },\n };\n\n // web-plugin-tool-renderers: ignore mcp_use, headless-only generic MCP dispatch\n const tool: DoomHeadlessTool<typeof McpHeadlessToolParameters> = {\n name: 'mcp_use',\n label: 'MCP use',\n description: 'Call a tool exposed by a connected MCP server.',\n parameters: McpHeadlessToolParameters,\n executionMode: 'serial',\n async execute(_toolCallId, parameters) {\n const services = runtime?.getServices();\n if (!services) {\n return { content: [{ type: 'text', text: 'The MCP runtime has not started yet.' }], isError: true };\n }\n try {\n const connection = await services.clientManager.ensureConnected(parameters.server);\n const result = await connection.callTool(parameters.tool, parameters.arguments ?? {});\n return {\n content: resultContent(result),\n details: result,\n ...(record(result).isError === true ? { isError: true } : {}),\n };\n } catch (error) {\n return {\n content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }],\n isError: true,\n };\n }\n },\n };\n\n const command: DoomHeadlessCommand = {\n name: COMMAND_NAME,\n description: SERVER_COMMAND_DESCRIPTION,\n async execute(args, execution) {\n const [subcommand = 'status', serverName] = args.trim().split(/\\s+/u).filter(Boolean);\n if (subcommand === 'auth') {\n const result = await execution.client.request({\n kind: 'input',\n title: `Authorize MCP server${serverName ? ` ${serverName}` : ''}`,\n message: 'Paste the authorization URL or code supplied by the MCP server.',\n });\n if (typeof result === 'string' && result.trim()) {\n await execution.client.notify({\n body: `MCP authorization received for ${serverName ?? 'server'}.`,\n level: 'info',\n });\n }\n return;\n }\n await execution.client.notify({\n title: 'DoomPi MCP',\n body: readConfig(execution.environment, execution.cwd),\n level: subcommand === 'status' ? 'info' : 'warning',\n });\n },\n };\n return { resources: [resource], activities: [activity], commands: [command], tools: [tool] };\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{buildMcpConfigGroups as e}from"../services/configSources/index.mjs";import{McpRuntimeOwner as t}from"../services/mcpRuntime/index.mjs";import{readSessionConfig as n}from"../services/sessionConfig/index.mjs";import{SERVER_COMMAND_DESCRIPTION as r}from"../constants/mcp.mjs";import{McpHeadlessToolParameters as i}from"../schemas/mcpHeadlessTool.mjs";function a(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}function o(e){let t=a(e).content;return Array.isArray(t)?t.map(e=>{let t=a(e);return t.type===`text`&&typeof t.text==`string`?{type:`text`,text:t.text}:t.type===`image`&&typeof t.data==`string`&&typeof t.mimeType==`string`?{type:`image`,data:t.data,mimeType:t.mimeType}:{type:`text`,text:JSON.stringify(e)}}):[{type:`text`,text:JSON.stringify(e)}]}function s(t,r){let i=n(t,r),a=e(i);return JSON.stringify({enabled:i.enabled!==!1,repoRoot:i.repoRoot,shared:a.shared.configPaths,sessionLocal:a.sessionLocal.configPaths,droppedServers:a.droppedServers,diagnostics:a.diagnostics},null,2)}function c(){let c;return{resources:[{name:`doompi/mcp-config`,kind:`context`,read:e=>s(e.environment,e.cwd)}],activities:[{name:`doompi-mcp-runtime`,async start(r){let i=new t;c=i;try{let t=n(r.environment,r.cwd),a=e(t),o=[...a.shared.configSources,...a.sessionLocal.configSources];await i.start({configSources:o,onAuthorizationUrl:(e,t)=>void r.client.notify({title:`Authorize MCP server ${t}`,body:e.toString(),level:`warning`}),onServerStateChange:e=>{r.client.setStatus(`doompi-mcp`,`${e.serverName}: ${e.state}`)}})}catch(e){await r.client.notify({title:`DoomPi MCP unavailable`,body:e instanceof Error?e.message:String(e),level:`warning`})}return async()=>{c===i&&(c=void 0,await i.dispose(),r.client.setStatus(`doompi-mcp`,void 0))}}}],commands:[{name:`mcp`,description:r,async execute(e,t){let[n=`status`,r]=e.trim().split(/\s+/u).filter(Boolean);if(n===`auth`){let e=await t.client.request({kind:`input`,title:`Authorize MCP server${r?` ${r}`:``}`,message:`Paste the authorization URL or code supplied by the MCP server.`});typeof e==`string`&&e.trim()&&await t.client.notify({body:`MCP authorization received for ${r??`server`}.`,level:`info`});return}await t.client.notify({title:`DoomPi MCP`,body:s(t.environment,t.cwd),level:n===`status`?`info`:`warning`})}}],tools:[{name:`mcp_use`,label:`MCP use`,description:`Call a tool exposed by a connected MCP server.`,parameters:i,executionMode:`serial`,async execute(e,t){let n=c?.getServices();if(!n)return{content:[{type:`text`,text:`The MCP runtime has not started yet.`}],isError:!0};try{let e=await(await n.clientManager.ensureConnected(t.server)).callTool(t.tool,t.arguments??{});return{content:o(e),details:e,...a(e).isError===!0?{isError:!0}:{}}}catch(e){return{content:[{type:`text`,text:e instanceof Error?e.message:String(e)}],isError:!0}}}}]}}export{c as createMcpServerRuntime};
|
|
2
|
-
//# sourceMappingURL=serverRuntime.mjs.map
|