@pellux/goodvibes-sdk 0.33.26 → 0.33.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contracts/artifacts/operator-contract.json +1090 -4
- package/dist/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-runtime.js +150 -2
- package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/platform/daemon/facade-composition.js +2 -0
- package/dist/platform/daemon/http/mcp-routes.d.ts +13 -0
- package/dist/platform/daemon/http/mcp-routes.d.ts.map +1 -0
- package/dist/platform/daemon/http/mcp-routes.js +128 -0
- package/dist/platform/daemon/http/router.d.ts +2 -0
- package/dist/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/platform/daemon/http/router.js +12 -0
- package/dist/platform/mcp/config.d.ts +27 -0
- package/dist/platform/mcp/config.d.ts.map +1 -1
- package/dist/platform/mcp/config.js +165 -46
- package/dist/platform/mcp/index.d.ts +3 -3
- package/dist/platform/mcp/index.d.ts.map +1 -1
- package/dist/platform/mcp/index.js +1 -1
- package/dist/platform/mcp/mcp-api.d.ts +24 -0
- package/dist/platform/mcp/mcp-api.d.ts.map +1 -1
- package/dist/platform/mcp/mcp-api.js +12 -0
- package/dist/platform/mcp/registry.d.ts +27 -2
- package/dist/platform/mcp/registry.d.ts.map +1 -1
- package/dist/platform/mcp/registry.js +106 -8
- package/dist/platform/version.js +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"method-catalog-runtime.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/method-catalog-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"method-catalog-runtime.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/method-catalog-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAqH1E,eAAO,MAAM,sCAAsC,EAAE,SAAS,uBAAuB,EA4WpF,CAAC"}
|
|
@@ -1,7 +1,155 @@
|
|
|
1
|
-
import { EMPTY_OBJECT_SCHEMA, STRING_SCHEMA, NUMBER_SCHEMA, objectSchema, listOutputSchema, entityOutputSchema, bodyEnvelopeSchema, methodDescriptor, runtimeEventId, } from './method-catalog-shared.js';
|
|
2
|
-
import { nullableSchema } from './operator-contract-schemas-shared.js';
|
|
1
|
+
import { EMPTY_OBJECT_SCHEMA, BOOLEAN_SCHEMA, STRING_SCHEMA, NUMBER_SCHEMA, objectSchema, listOutputSchema, entityOutputSchema, bodyEnvelopeSchema, methodDescriptor, runtimeEventId, arraySchema, } from './method-catalog-shared.js';
|
|
2
|
+
import { enumSchema, nullableSchema } from './operator-contract-schemas-shared.js';
|
|
3
3
|
import { CONTINUITY_SNAPSHOT_SCHEMA, DISTRIBUTED_NODE_HOST_CONTRACT_SCHEMA, HEALTH_SNAPSHOT_SCHEMA, INTELLIGENCE_SNAPSHOT_SCHEMA, MEMORY_DOCTOR_REPORT_SCHEMA, MEMORY_VECTOR_STATS_SCHEMA, PROVIDER_ACCOUNT_SNAPSHOT_SCHEMA, PROVIDER_RUNTIME_SNAPSHOT_SCHEMA, PROVIDER_USAGE_SNAPSHOT_SCHEMA, REMOTE_PAIR_APPROVAL_OUTPUT_SCHEMA, REMOTE_PAIR_REQUEST_OUTPUT_SCHEMA, REMOTE_PAIR_REQUESTS_OUTPUT_SCHEMA, REMOTE_PEERS_OUTPUT_SCHEMA, REMOTE_PAIR_REQUEST_ACTION_INPUT_SCHEMA, REMOTE_PEER_DISCONNECT_INPUT_SCHEMA, REMOTE_PEER_INVOKE_INPUT_SCHEMA, REMOTE_PEER_INVOKE_OUTPUT_SCHEMA, REMOTE_PEER_OUTPUT_SCHEMA, REMOTE_PEER_TOKEN_REVOKE_INPUT_SCHEMA, REMOTE_PEER_TOKEN_ROTATE_INPUT_SCHEMA, REMOTE_PEER_TOKEN_ROTATE_OUTPUT_SCHEMA, REMOTE_SNAPSHOT_SCHEMA, REMOTE_WORK_LIST_OUTPUT_SCHEMA, REMOTE_WORK_CANCEL_INPUT_SCHEMA, REMOTE_WORK_OUTPUT_SCHEMA, SECURITY_SETTINGS_REPORT_SCHEMA, SETTINGS_SNAPSHOT_SCHEMA, WORKTREE_SNAPSHOT_SCHEMA, } from './operator-contract-schemas.js';
|
|
4
|
+
const MCP_SCOPE_SCHEMA = enumSchema(['project', 'global']);
|
|
5
|
+
const MCP_SERVER_CONFIG_SCHEMA = objectSchema({
|
|
6
|
+
name: STRING_SCHEMA,
|
|
7
|
+
command: STRING_SCHEMA,
|
|
8
|
+
args: arraySchema(STRING_SCHEMA),
|
|
9
|
+
env: objectSchema({}, [], { additionalProperties: true }),
|
|
10
|
+
envKeys: arraySchema(STRING_SCHEMA),
|
|
11
|
+
role: nullableSchema(STRING_SCHEMA),
|
|
12
|
+
trustMode: nullableSchema(STRING_SCHEMA),
|
|
13
|
+
allowedPaths: arraySchema(STRING_SCHEMA),
|
|
14
|
+
allowedHosts: arraySchema(STRING_SCHEMA),
|
|
15
|
+
}, ['name', 'command']);
|
|
16
|
+
const MCP_CONFIG_SOURCE_SCHEMA = objectSchema({
|
|
17
|
+
scope: STRING_SCHEMA,
|
|
18
|
+
kind: STRING_SCHEMA,
|
|
19
|
+
path: STRING_SCHEMA,
|
|
20
|
+
writable: BOOLEAN_SCHEMA,
|
|
21
|
+
}, ['scope', 'kind', 'path', 'writable']);
|
|
22
|
+
const MCP_CONFIG_SERVER_SCHEMA = objectSchema({
|
|
23
|
+
name: STRING_SCHEMA,
|
|
24
|
+
command: STRING_SCHEMA,
|
|
25
|
+
args: arraySchema(STRING_SCHEMA),
|
|
26
|
+
envKeys: arraySchema(STRING_SCHEMA),
|
|
27
|
+
role: nullableSchema(STRING_SCHEMA),
|
|
28
|
+
trustMode: nullableSchema(STRING_SCHEMA),
|
|
29
|
+
allowedPaths: arraySchema(STRING_SCHEMA),
|
|
30
|
+
allowedHosts: arraySchema(STRING_SCHEMA),
|
|
31
|
+
source: MCP_CONFIG_SOURCE_SCHEMA,
|
|
32
|
+
}, ['name', 'command', 'args', 'envKeys', 'role', 'trustMode', 'allowedPaths', 'allowedHosts', 'source']);
|
|
33
|
+
const MCP_RELOAD_SERVER_SCHEMA = objectSchema({
|
|
34
|
+
name: STRING_SCHEMA,
|
|
35
|
+
action: enumSchema(['added', 'changed', 'removed', 'unchanged']),
|
|
36
|
+
connected: BOOLEAN_SCHEMA,
|
|
37
|
+
}, ['name', 'action', 'connected']);
|
|
38
|
+
const MCP_RELOAD_RESULT_SCHEMA = objectSchema({
|
|
39
|
+
added: NUMBER_SCHEMA,
|
|
40
|
+
changed: NUMBER_SCHEMA,
|
|
41
|
+
removed: NUMBER_SCHEMA,
|
|
42
|
+
unchanged: NUMBER_SCHEMA,
|
|
43
|
+
servers: arraySchema(MCP_RELOAD_SERVER_SCHEMA),
|
|
44
|
+
}, ['added', 'changed', 'removed', 'unchanged', 'servers']);
|
|
45
|
+
const MCP_CONFIG_RESPONSE_SCHEMA = objectSchema({
|
|
46
|
+
locations: arraySchema(MCP_CONFIG_SOURCE_SCHEMA),
|
|
47
|
+
servers: arraySchema(MCP_CONFIG_SERVER_SCHEMA),
|
|
48
|
+
}, ['locations', 'servers']);
|
|
49
|
+
const MCP_CONFIG_MUTATION_RESPONSE_SCHEMA = objectSchema({
|
|
50
|
+
scope: MCP_SCOPE_SCHEMA,
|
|
51
|
+
path: STRING_SCHEMA,
|
|
52
|
+
removed: BOOLEAN_SCHEMA,
|
|
53
|
+
reload: MCP_RELOAD_RESULT_SCHEMA,
|
|
54
|
+
config: MCP_CONFIG_RESPONSE_SCHEMA,
|
|
55
|
+
}, ['scope', 'path', 'reload', 'config']);
|
|
56
|
+
const MCP_SERVER_STATUS_SCHEMA = objectSchema({
|
|
57
|
+
name: STRING_SCHEMA,
|
|
58
|
+
connected: BOOLEAN_SCHEMA,
|
|
59
|
+
}, ['name', 'connected']);
|
|
60
|
+
const MCP_SERVERS_RESPONSE_SCHEMA = objectSchema({
|
|
61
|
+
servers: arraySchema(MCP_SERVER_STATUS_SCHEMA),
|
|
62
|
+
security: arraySchema(objectSchema({}, [], { additionalProperties: true })),
|
|
63
|
+
sandboxBindings: arraySchema(objectSchema({}, [], { additionalProperties: true })),
|
|
64
|
+
}, ['servers', 'security', 'sandboxBindings']);
|
|
65
|
+
const MCP_TOOL_SCHEMA = objectSchema({
|
|
66
|
+
qualifiedName: STRING_SCHEMA,
|
|
67
|
+
serverName: STRING_SCHEMA,
|
|
68
|
+
toolName: STRING_SCHEMA,
|
|
69
|
+
description: STRING_SCHEMA,
|
|
70
|
+
}, ['qualifiedName', 'serverName', 'toolName', 'description']);
|
|
71
|
+
const MCP_TOOLS_RESPONSE_SCHEMA = objectSchema({
|
|
72
|
+
tools: arraySchema(MCP_TOOL_SCHEMA),
|
|
73
|
+
}, ['tools']);
|
|
4
74
|
export const builtinGatewayRuntimeMethodDescriptors = [
|
|
75
|
+
methodDescriptor({
|
|
76
|
+
id: 'mcp.config.get',
|
|
77
|
+
title: 'MCP Effective Config',
|
|
78
|
+
description: 'Return effective MCP config from global, external, and project sources. Environment values are redacted to envKeys.',
|
|
79
|
+
category: 'mcp',
|
|
80
|
+
scopes: ['read:mcp'],
|
|
81
|
+
http: { method: 'GET', path: '/api/mcp/config' },
|
|
82
|
+
events: [runtimeEventId('mcp')],
|
|
83
|
+
inputSchema: EMPTY_OBJECT_SCHEMA,
|
|
84
|
+
outputSchema: MCP_CONFIG_RESPONSE_SCHEMA,
|
|
85
|
+
}),
|
|
86
|
+
methodDescriptor({
|
|
87
|
+
id: 'mcp.servers.list',
|
|
88
|
+
title: 'MCP Servers List',
|
|
89
|
+
description: 'Return configured MCP servers, runtime security posture, and sandbox bindings.',
|
|
90
|
+
category: 'mcp',
|
|
91
|
+
scopes: ['read:mcp'],
|
|
92
|
+
http: { method: 'GET', path: '/api/mcp/servers' },
|
|
93
|
+
events: [runtimeEventId('mcp')],
|
|
94
|
+
inputSchema: EMPTY_OBJECT_SCHEMA,
|
|
95
|
+
outputSchema: MCP_SERVERS_RESPONSE_SCHEMA,
|
|
96
|
+
}),
|
|
97
|
+
methodDescriptor({
|
|
98
|
+
id: 'mcp.tools.list',
|
|
99
|
+
title: 'MCP Tools List',
|
|
100
|
+
description: 'Return currently connected MCP tools.',
|
|
101
|
+
category: 'mcp',
|
|
102
|
+
scopes: ['read:mcp'],
|
|
103
|
+
http: { method: 'GET', path: '/api/mcp/tools' },
|
|
104
|
+
events: [runtimeEventId('mcp')],
|
|
105
|
+
inputSchema: EMPTY_OBJECT_SCHEMA,
|
|
106
|
+
outputSchema: MCP_TOOLS_RESPONSE_SCHEMA,
|
|
107
|
+
}),
|
|
108
|
+
methodDescriptor({
|
|
109
|
+
id: 'mcp.config.reload',
|
|
110
|
+
title: 'Reload MCP Config',
|
|
111
|
+
description: 'Reload effective MCP config and reconnect added, removed, or changed servers without daemon restart.',
|
|
112
|
+
category: 'mcp',
|
|
113
|
+
scopes: ['write:mcp'],
|
|
114
|
+
access: 'admin',
|
|
115
|
+
http: { method: 'POST', path: '/api/mcp/reload' },
|
|
116
|
+
events: [runtimeEventId('mcp')],
|
|
117
|
+
inputSchema: EMPTY_OBJECT_SCHEMA,
|
|
118
|
+
outputSchema: objectSchema({
|
|
119
|
+
reload: MCP_RELOAD_RESULT_SCHEMA,
|
|
120
|
+
config: MCP_CONFIG_RESPONSE_SCHEMA,
|
|
121
|
+
}, ['reload', 'config']),
|
|
122
|
+
}),
|
|
123
|
+
methodDescriptor({
|
|
124
|
+
id: 'mcp.servers.upsert',
|
|
125
|
+
title: 'Upsert MCP Server',
|
|
126
|
+
description: 'Persist a project/global MCP server config and reconnect the changed runtime server without daemon restart.',
|
|
127
|
+
category: 'mcp',
|
|
128
|
+
scopes: ['write:mcp'],
|
|
129
|
+
access: 'admin',
|
|
130
|
+
http: { method: 'POST', path: '/api/mcp/config/servers' },
|
|
131
|
+
events: [runtimeEventId('mcp')],
|
|
132
|
+
inputSchema: bodyEnvelopeSchema({
|
|
133
|
+
scope: MCP_SCOPE_SCHEMA,
|
|
134
|
+
server: MCP_SERVER_CONFIG_SCHEMA,
|
|
135
|
+
}, ['server']),
|
|
136
|
+
outputSchema: MCP_CONFIG_MUTATION_RESPONSE_SCHEMA,
|
|
137
|
+
}),
|
|
138
|
+
methodDescriptor({
|
|
139
|
+
id: 'mcp.servers.remove',
|
|
140
|
+
title: 'Remove MCP Server',
|
|
141
|
+
description: 'Remove a project/global MCP server config and disconnect it without daemon restart.',
|
|
142
|
+
category: 'mcp',
|
|
143
|
+
scopes: ['write:mcp'],
|
|
144
|
+
access: 'admin',
|
|
145
|
+
http: { method: 'DELETE', path: '/api/mcp/config/servers/{serverName}' },
|
|
146
|
+
events: [runtimeEventId('mcp')],
|
|
147
|
+
inputSchema: objectSchema({
|
|
148
|
+
serverName: STRING_SCHEMA,
|
|
149
|
+
scope: MCP_SCOPE_SCHEMA,
|
|
150
|
+
}, ['serverName']),
|
|
151
|
+
outputSchema: MCP_CONFIG_MUTATION_RESPONSE_SCHEMA,
|
|
152
|
+
}),
|
|
5
153
|
methodDescriptor({
|
|
6
154
|
id: 'remote.snapshot',
|
|
7
155
|
title: 'Remote Runtime Snapshot',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade-composition.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/facade-composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAqBvD,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,wCAAwC,CAAC;AAG3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,YAAY,CAAC;AAKpE,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,EACvC,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,oBAAoB,CA8HvG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,2BAA2B,CAgJ5F;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,sCAAsC,GAC9C,yBAAyB,
|
|
1
|
+
{"version":3,"file":"facade-composition.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/facade-composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAqBvD,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,wCAAwC,CAAC;AAG3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,YAAY,CAAC;AAKpE,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,EACvC,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,oBAAoB,CA8HvG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,2BAA2B,CAgJ5F;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,sCAAsC,GAC9C,yBAAyB,CA2K3B;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE;IAC1D,QAAQ,CAAC,aAAa,EAAE,OAAO,2BAA2B,EAAE,mBAAmB,CAAC;IAChF,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,yBAAyB,EAAE,WAAW,GAAG,QAAQ,CAAC;IACzK,QAAQ,CAAC,4BAA4B,EAAE,CAAC,OAAO,EAAE,OAAO,yBAAyB,EAAE,sBAAsB,GAAG,SAAS,EAAE,KAAK,EAAE;QAC5H,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACzC,KAAK,IAAI,CAAC;CACZ,GAAG,IAAI,CAoBP"}
|
|
@@ -383,6 +383,8 @@ export function createDaemonFacadeCollaborators(options) {
|
|
|
383
383
|
watcherRegistry: runtime.watcherRegistry,
|
|
384
384
|
voiceService: runtime.voiceService,
|
|
385
385
|
webSearchService: runtime.webSearchService,
|
|
386
|
+
mcpRegistry: runtime.runtimeServices.mcpRegistry,
|
|
387
|
+
mcpConfigRoots: runtime.runtimeServices.shellPaths,
|
|
386
388
|
knowledgeService: runtime.knowledgeService,
|
|
387
389
|
homeGraphService: runtime.homeGraphService,
|
|
388
390
|
projectPlanningService: runtime.projectPlanningService,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { McpRegistry } from '../../mcp/registry.js';
|
|
2
|
+
import type { McpConfigRoots } from '../../mcp/config.js';
|
|
3
|
+
import type { JsonRecord } from '../helpers.js';
|
|
4
|
+
interface McpRouteContext {
|
|
5
|
+
readonly mcpRegistry: Pick<McpRegistry, 'getEffectiveConfig' | 'reload' | 'upsertServerConfig' | 'removeServerConfig' | 'listServers' | 'listServerSecurity' | 'listServerSandboxBindings' | 'listAllTools'>;
|
|
6
|
+
readonly roots: McpConfigRoots;
|
|
7
|
+
readonly parseJsonBody: (req: Request) => Promise<JsonRecord | Response>;
|
|
8
|
+
readonly parseOptionalJsonBody: (req: Request) => Promise<JsonRecord | null | Response>;
|
|
9
|
+
readonly requireAdmin: (req: Request) => Response | null;
|
|
10
|
+
}
|
|
11
|
+
export declare function dispatchMcpRoutes(req: Request, context: McpRouteContext): Promise<Response | null>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=mcp-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/mcp-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EACV,cAAc,EAIf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,UAAU,eAAe;IACvB,QAAQ,CAAC,WAAW,EAAE,IAAI,CACxB,WAAW,EACT,oBAAoB,GACpB,QAAQ,GACR,oBAAoB,GACpB,oBAAoB,GACpB,aAAa,GACb,oBAAoB,GACpB,2BAA2B,GAC3B,cAAc,CACjB,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;IACxF,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;CAC1D;AAoED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAkExG"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { jsonErrorResponse } from './error-response.js';
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
function stringArray(value) {
|
|
6
|
+
return Array.isArray(value) && value.every((entry) => typeof entry === 'string')
|
|
7
|
+
? [...value]
|
|
8
|
+
: undefined;
|
|
9
|
+
}
|
|
10
|
+
function stringRecord(value) {
|
|
11
|
+
if (!isRecord(value))
|
|
12
|
+
return undefined;
|
|
13
|
+
const entries = Object.entries(value);
|
|
14
|
+
if (!entries.every((entry) => typeof entry[1] === 'string'))
|
|
15
|
+
return undefined;
|
|
16
|
+
return Object.fromEntries(entries);
|
|
17
|
+
}
|
|
18
|
+
function parseScope(value) {
|
|
19
|
+
return value === 'global' ? 'global' : 'project';
|
|
20
|
+
}
|
|
21
|
+
function parseServerConfig(value) {
|
|
22
|
+
if (!isRecord(value)) {
|
|
23
|
+
return jsonErrorResponse({ error: 'Missing MCP server config object.' }, { status: 400 });
|
|
24
|
+
}
|
|
25
|
+
if (typeof value.name !== 'string' || !value.name.trim()) {
|
|
26
|
+
return jsonErrorResponse({ error: 'MCP server name is required.' }, { status: 400 });
|
|
27
|
+
}
|
|
28
|
+
if (typeof value.command !== 'string' || !value.command.trim()) {
|
|
29
|
+
return jsonErrorResponse({ error: 'MCP server command is required.' }, { status: 400 });
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
name: value.name.trim(),
|
|
33
|
+
command: value.command.trim(),
|
|
34
|
+
args: stringArray(value.args) ?? [],
|
|
35
|
+
env: stringRecord(value.env),
|
|
36
|
+
role: typeof value.role === 'string' ? value.role : undefined,
|
|
37
|
+
trustMode: typeof value.trustMode === 'string' ? value.trustMode : undefined,
|
|
38
|
+
allowedPaths: stringArray(value.allowedPaths),
|
|
39
|
+
allowedHosts: stringArray(value.allowedHosts),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function redactServer(server) {
|
|
43
|
+
return {
|
|
44
|
+
name: server.name,
|
|
45
|
+
command: server.command,
|
|
46
|
+
args: server.args ?? [],
|
|
47
|
+
envKeys: Object.keys(server.env ?? {}).sort(),
|
|
48
|
+
role: server.role ?? null,
|
|
49
|
+
trustMode: server.trustMode ?? null,
|
|
50
|
+
allowedPaths: server.allowedPaths ?? [],
|
|
51
|
+
allowedHosts: server.allowedHosts ?? [],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function serializeEffectiveConfig(config) {
|
|
55
|
+
return {
|
|
56
|
+
locations: config.locations,
|
|
57
|
+
servers: config.servers.map((entry) => ({
|
|
58
|
+
...redactServer(entry.server),
|
|
59
|
+
source: entry.source,
|
|
60
|
+
})),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export async function dispatchMcpRoutes(req, context) {
|
|
64
|
+
const url = new URL(req.url);
|
|
65
|
+
const { pathname } = url;
|
|
66
|
+
if (pathname === '/api/mcp/config' && req.method === 'GET') {
|
|
67
|
+
return Response.json(serializeEffectiveConfig(context.mcpRegistry.getEffectiveConfig(context.roots)));
|
|
68
|
+
}
|
|
69
|
+
if (pathname === '/api/mcp/servers' && req.method === 'GET') {
|
|
70
|
+
return Response.json({
|
|
71
|
+
servers: context.mcpRegistry.listServers(),
|
|
72
|
+
security: context.mcpRegistry.listServerSecurity(),
|
|
73
|
+
sandboxBindings: context.mcpRegistry.listServerSandboxBindings(),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (pathname === '/api/mcp/tools' && req.method === 'GET') {
|
|
77
|
+
return Response.json({ tools: await context.mcpRegistry.listAllTools() });
|
|
78
|
+
}
|
|
79
|
+
if (pathname === '/api/mcp/reload' && req.method === 'POST') {
|
|
80
|
+
const admin = context.requireAdmin(req);
|
|
81
|
+
if (admin)
|
|
82
|
+
return admin;
|
|
83
|
+
return Response.json({
|
|
84
|
+
reload: await context.mcpRegistry.reload(context.roots),
|
|
85
|
+
config: serializeEffectiveConfig(context.mcpRegistry.getEffectiveConfig(context.roots)),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (pathname === '/api/mcp/config/servers' && req.method === 'POST') {
|
|
89
|
+
const admin = context.requireAdmin(req);
|
|
90
|
+
if (admin)
|
|
91
|
+
return admin;
|
|
92
|
+
const body = await context.parseJsonBody(req);
|
|
93
|
+
if (body instanceof Response)
|
|
94
|
+
return body;
|
|
95
|
+
const server = parseServerConfig(body.server ?? body);
|
|
96
|
+
if (server instanceof Response)
|
|
97
|
+
return server;
|
|
98
|
+
const scope = parseScope(body.scope);
|
|
99
|
+
const result = await context.mcpRegistry.upsertServerConfig(context.roots, scope, server);
|
|
100
|
+
return Response.json({
|
|
101
|
+
scope,
|
|
102
|
+
path: result.path,
|
|
103
|
+
removed: false,
|
|
104
|
+
reload: result.reload,
|
|
105
|
+
config: serializeEffectiveConfig(context.mcpRegistry.getEffectiveConfig(context.roots)),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const serverMatch = pathname.match(/^\/api\/mcp\/config\/servers\/([^/]+)$/);
|
|
109
|
+
if (serverMatch && req.method === 'DELETE') {
|
|
110
|
+
const admin = context.requireAdmin(req);
|
|
111
|
+
if (admin)
|
|
112
|
+
return admin;
|
|
113
|
+
const body = await context.parseOptionalJsonBody(req);
|
|
114
|
+
if (body instanceof Response)
|
|
115
|
+
return body;
|
|
116
|
+
const scope = parseScope(body?.scope ?? url.searchParams.get('scope'));
|
|
117
|
+
const serverName = decodeURIComponent(serverMatch[1]);
|
|
118
|
+
const result = await context.mcpRegistry.removeServerConfig(context.roots, scope, serverName);
|
|
119
|
+
return Response.json({
|
|
120
|
+
scope,
|
|
121
|
+
path: result.path,
|
|
122
|
+
removed: result.removed,
|
|
123
|
+
reload: result.reload,
|
|
124
|
+
config: serializeEffectiveConfig(context.mcpRegistry.getEffectiveConfig(context.roots)),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
@@ -43,6 +43,8 @@ interface DaemonHttpRouterContext {
|
|
|
43
43
|
readonly watcherRegistry: WatcherRegistry;
|
|
44
44
|
readonly voiceService: VoiceService;
|
|
45
45
|
readonly webSearchService: WebSearchService;
|
|
46
|
+
readonly mcpRegistry: import('../../mcp/registry.js').McpRegistry;
|
|
47
|
+
readonly mcpConfigRoots: import('../../mcp/config.js').McpConfigRoots;
|
|
46
48
|
readonly knowledgeService: KnowledgeService;
|
|
47
49
|
readonly homeGraphService: HomeGraphService;
|
|
48
50
|
readonly projectPlanningService: ProjectPlanningService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAIL,KAAK,iBAAiB,EAGvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAC7G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAMpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjI,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AACpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEpI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAK/D,OAAO,KAAK,EAAE,+BAA+B,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0B5F,OAAO,KAAK,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,7 @@ import { dispatchCompanionChatRoutes } from '../../companion/companion-chat-rout
|
|
|
28
28
|
import { dispatchModelRoutes } from './model-routes.js';
|
|
29
29
|
import { dispatchBatchRoutes } from './batch-routes.js';
|
|
30
30
|
import { dispatchCloudflareRoutes } from './cloudflare-routes.js';
|
|
31
|
+
import { dispatchMcpRoutes } from './mcp-routes.js';
|
|
31
32
|
import { HomeAssistantConversationRoutes } from './homeassistant-routes.js';
|
|
32
33
|
import { HomeGraphRoutes } from './home-graph-routes.js';
|
|
33
34
|
import { dispatchOpenAICompatibleRoutes } from './openai-compatible-routes.js';
|
|
@@ -182,6 +183,17 @@ export class DaemonHttpRouter {
|
|
|
182
183
|
if (cloudflareResponse)
|
|
183
184
|
return cloudflareResponse;
|
|
184
185
|
}
|
|
186
|
+
if (url.pathname.startsWith('/api/mcp')) {
|
|
187
|
+
const mcpResponse = await dispatchMcpRoutes(req, {
|
|
188
|
+
mcpRegistry: this.context.mcpRegistry,
|
|
189
|
+
roots: this.context.mcpConfigRoots,
|
|
190
|
+
parseJsonBody: (request) => this.parseJsonBody(request),
|
|
191
|
+
parseOptionalJsonBody: (request) => this.parseOptionalJsonBody(request),
|
|
192
|
+
requireAdmin: (request) => this.context.requireAdmin(request),
|
|
193
|
+
});
|
|
194
|
+
if (mcpResponse)
|
|
195
|
+
return mcpResponse;
|
|
196
|
+
}
|
|
185
197
|
if (url.pathname.startsWith('/api/homeassistant')) {
|
|
186
198
|
const homeGraphResponse = await this.getHomeGraphRoutes().handle(req);
|
|
187
199
|
if (homeGraphResponse)
|
|
@@ -21,9 +21,36 @@ export interface McpConfig {
|
|
|
21
21
|
servers: McpServerConfig[];
|
|
22
22
|
}
|
|
23
23
|
export type McpConfigRoots = Pick<ShellPathService, 'workingDirectory' | 'homeDirectory'>;
|
|
24
|
+
export type McpConfigScope = 'project' | 'global';
|
|
25
|
+
export interface McpConfigLocation {
|
|
26
|
+
readonly scope: McpConfigScope | 'external';
|
|
27
|
+
readonly kind: 'global-xdg' | 'global-dotdir' | 'claude-desktop' | 'project-mcp' | 'project-goodvibes';
|
|
28
|
+
readonly path: string;
|
|
29
|
+
readonly writable: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface McpServerConfigEntry {
|
|
32
|
+
readonly server: McpServerConfig;
|
|
33
|
+
readonly source: McpConfigLocation;
|
|
34
|
+
}
|
|
35
|
+
export interface McpEffectiveConfig {
|
|
36
|
+
readonly servers: readonly McpServerConfigEntry[];
|
|
37
|
+
readonly locations: readonly McpConfigLocation[];
|
|
38
|
+
}
|
|
39
|
+
export declare function getMcpConfigLocations(roots: McpConfigRoots): readonly McpConfigLocation[];
|
|
24
40
|
/**
|
|
25
41
|
* loadMcpConfig - Scan multiple locations in precedence order (later wins).
|
|
26
42
|
* Returns merged config from all found files. Returns empty config on failure.
|
|
27
43
|
*/
|
|
28
44
|
export declare function loadMcpConfig(roots: McpConfigRoots): McpConfig;
|
|
45
|
+
export declare function loadMcpEffectiveConfig(roots: McpConfigRoots): McpEffectiveConfig;
|
|
46
|
+
export declare function loadWritableMcpConfig(roots: McpConfigRoots, scope: McpConfigScope): McpConfig;
|
|
47
|
+
export declare function upsertMcpServerConfig(roots: McpConfigRoots, scope: McpConfigScope, server: McpServerConfig): {
|
|
48
|
+
readonly path: string;
|
|
49
|
+
readonly config: McpConfig;
|
|
50
|
+
};
|
|
51
|
+
export declare function removeMcpServerConfig(roots: McpConfigRoots, scope: McpConfigScope, serverName: string): {
|
|
52
|
+
readonly path: string;
|
|
53
|
+
readonly removed: boolean;
|
|
54
|
+
readonly config: McpConfig;
|
|
55
|
+
};
|
|
29
56
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/platform/mcp/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzC,sDAAsD;IACtD,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxH,mEAAmE;IACnE,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAChF,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACpC,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/platform/mcp/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzC,sDAAsD;IACtD,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxH,mEAAmE;IACnE,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAChF,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACpC,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,eAAe,CAAC,CAAC;AAC1F,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,GAAG,gBAAgB,GAAG,aAAa,GAAG,mBAAmB,CAAC;IACvG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAgCD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,iBAAiB,EAAE,CAmCzF;AA4DD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAE9D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,kBAAkB,CAoBhF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,SAAS,CAG7F;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,eAAe,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAUvD;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,MAAM,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAQlF"}
|