@agimon-ai/po-mcp 0.0.0-alpha.0
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/LICENSE +21 -0
- package/README.md +223 -0
- package/dist/apiContracts.cjs +269 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +137 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +258 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/extensions/mcp-ui.mjs +31 -0
- package/dist/extensions/mcp-ui.mjs.map +1 -0
- package/dist/extensions/mcp.cjs +104 -0
- package/dist/extensions/mcp.cjs.map +1 -0
- package/dist/extensions/mcp.d.mts +5 -0
- package/dist/extensions/mcp.d.mts.map +1 -0
- package/dist/extensions/mcp.mjs +99 -0
- package/dist/extensions/mcp.mjs.map +1 -0
- package/dist/extensions/server.cjs +2852 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +2839 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/extensions/web.mjs +2200 -0
- package/dist/extensions/web.mjs.map +1 -0
- package/dist/index.cjs +18 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +89 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +9 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mcpCatalog-6Tpt6Gqn.cjs +900 -0
- package/dist/mcpCatalog-6Tpt6Gqn.cjs.map +1 -0
- package/dist/mcpCatalog-SlqWS-sb.mjs +806 -0
- package/dist/mcpCatalog-SlqWS-sb.mjs.map +1 -0
- package/dist/mcpConfig-BYESy-zP.d.mts +57 -0
- package/dist/mcpConfig-BYESy-zP.d.mts.map +1 -0
- package/dist/projection-gyAA2jRB.mjs +43 -0
- package/dist/projection-gyAA2jRB.mjs.map +1 -0
- package/dist/projection-w3XxXmVi.cjs +51 -0
- package/dist/projection-w3XxXmVi.cjs.map +1 -0
- package/dist/projection.cjs +17 -0
- package/dist/projection.d.mts +12 -0
- package/dist/projection.d.mts.map +1 -0
- package/dist/projection.mjs +4 -0
- package/dist/rolldown-runtime-C0BPl7ul.cjs +43 -0
- package/llms.txt +9 -0
- package/package.json +157 -0
- package/src/prompts/po-use-mcp/SKILL.md +79 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { defineApiContract, jsonApiResponses } from "@agimon-ai/po-core/apiContracts";
|
|
2
|
+
import { Type } from "typebox";
|
|
3
|
+
import { defineDoomPluginMethod } from "@agimon-ai/po-core/pluginProtocol";
|
|
4
|
+
//#region src/schemas/apiContracts.ts
|
|
5
|
+
const S = Type.String();
|
|
6
|
+
const N = Type.Number();
|
|
7
|
+
const B = Type.Boolean();
|
|
8
|
+
const O = Type.Optional;
|
|
9
|
+
const literals = (values) => Type.Union(values.map((value) => Type.Literal(value)));
|
|
10
|
+
const RepositoryId = Type.String({ pattern: "^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24}|[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})$" });
|
|
11
|
+
const RepositoryQuery = [{
|
|
12
|
+
name: "repositoryId",
|
|
13
|
+
in: "query",
|
|
14
|
+
required: true,
|
|
15
|
+
schema: RepositoryId
|
|
16
|
+
}];
|
|
17
|
+
const McpCatalogSchema = Type.Object({
|
|
18
|
+
repositoryId: S,
|
|
19
|
+
sync: Type.Object({
|
|
20
|
+
fresh: B,
|
|
21
|
+
reasons: Type.Array(S)
|
|
22
|
+
}),
|
|
23
|
+
servers: Type.Array(Type.Object({
|
|
24
|
+
name: S,
|
|
25
|
+
state: literals([
|
|
26
|
+
"not-connected",
|
|
27
|
+
"connecting",
|
|
28
|
+
"connected",
|
|
29
|
+
"degraded",
|
|
30
|
+
"needs-auth",
|
|
31
|
+
"failed",
|
|
32
|
+
"closed"
|
|
33
|
+
]),
|
|
34
|
+
source: literals([
|
|
35
|
+
"cached",
|
|
36
|
+
"live",
|
|
37
|
+
"configured"
|
|
38
|
+
]),
|
|
39
|
+
credentialPresent: B,
|
|
40
|
+
tools: Type.Array(Type.Object({
|
|
41
|
+
name: S,
|
|
42
|
+
piName: S,
|
|
43
|
+
description: O(S)
|
|
44
|
+
})),
|
|
45
|
+
error: O(S)
|
|
46
|
+
})),
|
|
47
|
+
droppedServers: Type.Array(S),
|
|
48
|
+
diagnostics: Type.Array(S)
|
|
49
|
+
});
|
|
50
|
+
const McpAuthorizationSchema = Type.Object({
|
|
51
|
+
id: S,
|
|
52
|
+
repositoryId: S,
|
|
53
|
+
serverName: S,
|
|
54
|
+
status: literals([
|
|
55
|
+
"starting",
|
|
56
|
+
"waiting",
|
|
57
|
+
"completed",
|
|
58
|
+
"failed",
|
|
59
|
+
"cancelled",
|
|
60
|
+
"expired"
|
|
61
|
+
]),
|
|
62
|
+
authorizationUrl: O(S),
|
|
63
|
+
error: O(S),
|
|
64
|
+
expiresAt: N
|
|
65
|
+
});
|
|
66
|
+
const McpSessionToolSchema = Type.Object({
|
|
67
|
+
server: S,
|
|
68
|
+
tool: S,
|
|
69
|
+
description: O(S),
|
|
70
|
+
inputSchema: Type.Record(S, Type.Unknown()),
|
|
71
|
+
tokens: N
|
|
72
|
+
});
|
|
73
|
+
const SessionToolQuery = [{
|
|
74
|
+
name: "server",
|
|
75
|
+
in: "query",
|
|
76
|
+
required: true,
|
|
77
|
+
schema: Type.String({
|
|
78
|
+
minLength: 1,
|
|
79
|
+
maxLength: 160
|
|
80
|
+
})
|
|
81
|
+
}, {
|
|
82
|
+
name: "tool",
|
|
83
|
+
in: "query",
|
|
84
|
+
required: true,
|
|
85
|
+
schema: Type.String({
|
|
86
|
+
minLength: 1,
|
|
87
|
+
maxLength: 256
|
|
88
|
+
})
|
|
89
|
+
}];
|
|
90
|
+
const apiContracts = defineApiContract({
|
|
91
|
+
version: 1,
|
|
92
|
+
sockets: [],
|
|
93
|
+
dynamic: [],
|
|
94
|
+
http: [{
|
|
95
|
+
id: "mcp.session.tool",
|
|
96
|
+
scope: "session",
|
|
97
|
+
basePath: "mcp-session",
|
|
98
|
+
path: "/tool",
|
|
99
|
+
method: "GET",
|
|
100
|
+
authentication: "owner",
|
|
101
|
+
description: "Read one tool the session reaches through mcp_use: its description, schema, and token cost.",
|
|
102
|
+
parameters: SessionToolQuery,
|
|
103
|
+
responses: jsonApiResponses(McpSessionToolSchema)
|
|
104
|
+
}, ...["global", "workspace"].flatMap((scope) => [
|
|
105
|
+
{
|
|
106
|
+
id: "mcp.catalog",
|
|
107
|
+
scope,
|
|
108
|
+
basePath: "mcp",
|
|
109
|
+
path: "/repository",
|
|
110
|
+
method: "GET",
|
|
111
|
+
authentication: "owner",
|
|
112
|
+
description: "Read the synced MCP repository catalog.",
|
|
113
|
+
parameters: RepositoryQuery,
|
|
114
|
+
responses: jsonApiResponses(McpCatalogSchema)
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
id: "mcp.discover",
|
|
118
|
+
scope,
|
|
119
|
+
basePath: "mcp",
|
|
120
|
+
path: "/repository/discover",
|
|
121
|
+
method: "POST",
|
|
122
|
+
authentication: "owner",
|
|
123
|
+
description: "Discover repository MCP servers.",
|
|
124
|
+
body: {
|
|
125
|
+
required: true,
|
|
126
|
+
contentType: "application/json",
|
|
127
|
+
schema: Type.Object({ repositoryId: RepositoryId })
|
|
128
|
+
},
|
|
129
|
+
responses: jsonApiResponses(McpCatalogSchema)
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: "mcp.authorize",
|
|
133
|
+
scope,
|
|
134
|
+
basePath: "mcp",
|
|
135
|
+
path: "/repository/authorize",
|
|
136
|
+
method: "POST",
|
|
137
|
+
authentication: "owner",
|
|
138
|
+
description: "Start MCP authorization.",
|
|
139
|
+
body: {
|
|
140
|
+
required: true,
|
|
141
|
+
contentType: "application/json",
|
|
142
|
+
schema: Type.Object({
|
|
143
|
+
repositoryId: RepositoryId,
|
|
144
|
+
serverName: Type.String({
|
|
145
|
+
minLength: 1,
|
|
146
|
+
maxLength: 160
|
|
147
|
+
})
|
|
148
|
+
})
|
|
149
|
+
},
|
|
150
|
+
responses: jsonApiResponses(McpAuthorizationSchema, 202)
|
|
151
|
+
},
|
|
152
|
+
...["GET", "DELETE"].map((method) => ({
|
|
153
|
+
id: `mcp.authorization.${method}`,
|
|
154
|
+
scope,
|
|
155
|
+
basePath: "mcp",
|
|
156
|
+
path: "/repository/authorize/{flowId}",
|
|
157
|
+
method,
|
|
158
|
+
authentication: "owner",
|
|
159
|
+
description: method === "GET" ? "Read an authorization flow." : "Cancel an authorization flow.",
|
|
160
|
+
parameters: RepositoryQuery,
|
|
161
|
+
responses: jsonApiResponses(McpAuthorizationSchema)
|
|
162
|
+
}))
|
|
163
|
+
])]
|
|
164
|
+
});
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/schemas/mcpApps.ts
|
|
167
|
+
const Lease = Type.String({
|
|
168
|
+
minLength: 1,
|
|
169
|
+
maxLength: 128
|
|
170
|
+
});
|
|
171
|
+
const JsonObject = Type.Record(Type.String(), Type.Unknown());
|
|
172
|
+
const Empty = Type.Object({}, { additionalProperties: false });
|
|
173
|
+
const Result = Type.Object({
|
|
174
|
+
content: Type.Array(Type.Unknown()),
|
|
175
|
+
structuredContent: Type.Optional(Type.Unknown()),
|
|
176
|
+
_meta: Type.Optional(JsonObject),
|
|
177
|
+
isError: Type.Optional(Type.Boolean())
|
|
178
|
+
});
|
|
179
|
+
const Address = {
|
|
180
|
+
service: "mcp.apps",
|
|
181
|
+
scope: "session",
|
|
182
|
+
direction: "client-to-server"
|
|
183
|
+
};
|
|
184
|
+
const mcpAppOpenMethod = defineDoomPluginMethod({
|
|
185
|
+
...Address,
|
|
186
|
+
method: "open",
|
|
187
|
+
input: Type.Object({ toolCallId: Type.String({
|
|
188
|
+
minLength: 1,
|
|
189
|
+
maxLength: 512
|
|
190
|
+
}) }, { additionalProperties: false }),
|
|
191
|
+
output: Type.Object({
|
|
192
|
+
leaseId: Lease,
|
|
193
|
+
html: Type.String(),
|
|
194
|
+
resourceUri: Type.String(),
|
|
195
|
+
protocol: Type.Union([Type.Literal("mcp"), Type.Literal("openai")]),
|
|
196
|
+
resourceMeta: JsonObject,
|
|
197
|
+
tool: Type.Object({
|
|
198
|
+
name: Type.String(),
|
|
199
|
+
description: Type.String(),
|
|
200
|
+
inputSchema: Type.Object({ type: Type.Literal("object") }, { additionalProperties: true }),
|
|
201
|
+
_meta: JsonObject
|
|
202
|
+
}),
|
|
203
|
+
args: JsonObject,
|
|
204
|
+
result: Result,
|
|
205
|
+
state: Type.Unknown(),
|
|
206
|
+
readOnly: Type.Boolean()
|
|
207
|
+
})
|
|
208
|
+
});
|
|
209
|
+
const mcpAppActivateMethod = defineDoomPluginMethod({
|
|
210
|
+
...Address,
|
|
211
|
+
method: "activate",
|
|
212
|
+
input: Type.Object({ leaseId: Lease }, { additionalProperties: false }),
|
|
213
|
+
output: Type.Object({ readOnly: Type.Literal(false) })
|
|
214
|
+
});
|
|
215
|
+
const mcpAppCallToolMethod = defineDoomPluginMethod({
|
|
216
|
+
...Address,
|
|
217
|
+
method: "callTool",
|
|
218
|
+
input: Type.Object({
|
|
219
|
+
leaseId: Lease,
|
|
220
|
+
name: Type.String({
|
|
221
|
+
minLength: 1,
|
|
222
|
+
maxLength: 256
|
|
223
|
+
}),
|
|
224
|
+
arguments: JsonObject
|
|
225
|
+
}, { additionalProperties: false }),
|
|
226
|
+
output: Result
|
|
227
|
+
});
|
|
228
|
+
const mcpAppSetStateMethod = defineDoomPluginMethod({
|
|
229
|
+
...Address,
|
|
230
|
+
method: "setState",
|
|
231
|
+
input: Type.Object({
|
|
232
|
+
leaseId: Lease,
|
|
233
|
+
state: Type.Unknown()
|
|
234
|
+
}, { additionalProperties: false }),
|
|
235
|
+
output: Empty
|
|
236
|
+
});
|
|
237
|
+
const mcpAppFollowUpMethod = defineDoomPluginMethod({
|
|
238
|
+
...Address,
|
|
239
|
+
method: "followUp",
|
|
240
|
+
input: Type.Object({
|
|
241
|
+
leaseId: Lease,
|
|
242
|
+
prompt: Type.String({
|
|
243
|
+
minLength: 1,
|
|
244
|
+
maxLength: 16e3
|
|
245
|
+
})
|
|
246
|
+
}, { additionalProperties: false }),
|
|
247
|
+
output: Empty
|
|
248
|
+
});
|
|
249
|
+
const mcpAppCloseMethod = defineDoomPluginMethod({
|
|
250
|
+
...Address,
|
|
251
|
+
method: "close",
|
|
252
|
+
input: Type.Object({ leaseId: Lease }, { additionalProperties: false }),
|
|
253
|
+
output: Empty
|
|
254
|
+
});
|
|
255
|
+
//#endregion
|
|
256
|
+
export { apiContracts, apiContracts as default, mcpAppActivateMethod, mcpAppCallToolMethod, mcpAppCloseMethod, mcpAppFollowUpMethod, mcpAppOpenMethod, mcpAppSetStateMethod };
|
|
257
|
+
|
|
258
|
+
//# sourceMappingURL=apiContracts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts","../src/schemas/mcpApps.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst RepositoryId = Type.String({\n pattern: '^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24}|[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})$',\n});\nconst RepositoryQuery = [{ name: 'repositoryId', in: 'query' as const, required: true, schema: RepositoryId }];\nexport const McpCatalogSchema = Type.Object({\n repositoryId: S,\n sync: Type.Object({ fresh: B, reasons: Type.Array(S) }),\n servers: Type.Array(\n Type.Object({\n name: S,\n state: literals(['not-connected', 'connecting', 'connected', 'degraded', 'needs-auth', 'failed', 'closed']),\n source: literals(['cached', 'live', 'configured']),\n credentialPresent: B,\n tools: Type.Array(Type.Object({ name: S, piName: S, description: O(S) })),\n error: O(S),\n }),\n ),\n droppedServers: Type.Array(S),\n diagnostics: Type.Array(S),\n});\nexport const McpAuthorizationSchema = Type.Object({\n id: S,\n repositoryId: S,\n serverName: S,\n status: literals(['starting', 'waiting', 'completed', 'failed', 'cancelled', 'expired']),\n authorizationUrl: O(S),\n error: O(S),\n expiresAt: N,\n});\nexport const McpSessionToolSchema = Type.Object({\n server: S,\n tool: S,\n description: O(S),\n inputSchema: Type.Record(S, Type.Unknown()),\n tokens: N,\n});\nconst SessionToolQuery = [\n { name: 'server', in: 'query' as const, required: true, schema: Type.String({ minLength: 1, maxLength: 160 }) },\n { name: 'tool', in: 'query' as const, required: true, schema: Type.String({ minLength: 1, maxLength: 256 }) },\n];\ntype HttpContract = Parameters<typeof defineApiContract>[0]['http'][number];\nexport const apiContracts = defineApiContract({\n version: 1,\n sockets: [],\n dynamic: [],\n http: [\n {\n id: 'mcp.session.tool',\n scope: 'session',\n basePath: 'mcp-session',\n path: '/tool',\n method: 'GET',\n authentication: 'owner',\n description: 'Read one tool the session reaches through mcp_use: its description, schema, and token cost.',\n parameters: SessionToolQuery,\n responses: jsonApiResponses(McpSessionToolSchema),\n },\n ...(['global', 'workspace'] as const).flatMap((scope): HttpContract[] => [\n {\n id: 'mcp.catalog',\n scope,\n basePath: 'mcp',\n path: '/repository',\n method: 'GET',\n authentication: 'owner',\n description: 'Read the synced MCP repository catalog.',\n parameters: RepositoryQuery,\n responses: jsonApiResponses(McpCatalogSchema),\n },\n {\n id: 'mcp.discover',\n scope,\n basePath: 'mcp',\n path: '/repository/discover',\n method: 'POST',\n authentication: 'owner',\n description: 'Discover repository MCP servers.',\n body: { required: true, contentType: 'application/json', schema: Type.Object({ repositoryId: RepositoryId }) },\n responses: jsonApiResponses(McpCatalogSchema),\n },\n {\n id: 'mcp.authorize',\n scope,\n basePath: 'mcp',\n path: '/repository/authorize',\n method: 'POST',\n authentication: 'owner',\n description: 'Start MCP authorization.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({\n repositoryId: RepositoryId,\n serverName: Type.String({ minLength: 1, maxLength: 160 }),\n }),\n },\n responses: jsonApiResponses(McpAuthorizationSchema, 202),\n },\n ...(['GET', 'DELETE'] as const).map((method) => ({\n id: `mcp.authorization.${method}`,\n scope,\n basePath: 'mcp',\n path: '/repository/authorize/{flowId}',\n method,\n authentication: 'owner' as const,\n description: method === 'GET' ? 'Read an authorization flow.' : 'Cancel an authorization flow.',\n parameters: RepositoryQuery,\n responses: jsonApiResponses(McpAuthorizationSchema),\n })),\n ]),\n ],\n});\nexport default apiContracts;\n","import { defineDoomPluginMethod } from '@agimon-ai/po-core/pluginProtocol';\nimport { Type } from 'typebox';\n\nexport type { McpAppOpenResult } from '../types/webMcp';\n\nconst Lease = Type.String({ minLength: 1, maxLength: 128 });\nconst JsonObject = Type.Record(Type.String(), Type.Unknown());\nconst Empty = Type.Object({}, { additionalProperties: false });\nconst Result = Type.Object({\n content: Type.Array(Type.Unknown()),\n structuredContent: Type.Optional(Type.Unknown()),\n _meta: Type.Optional(JsonObject),\n isError: Type.Optional(Type.Boolean()),\n});\nconst Address = { service: 'mcp.apps', scope: 'session', direction: 'client-to-server' } as const;\n\nexport const mcpAppOpenMethod = defineDoomPluginMethod({\n ...Address,\n method: 'open',\n input: Type.Object({ toolCallId: Type.String({ minLength: 1, maxLength: 512 }) }, { additionalProperties: false }),\n output: Type.Object({\n leaseId: Lease,\n html: Type.String(),\n resourceUri: Type.String(),\n protocol: Type.Union([Type.Literal('mcp'), Type.Literal('openai')]),\n resourceMeta: JsonObject,\n tool: Type.Object({\n name: Type.String(),\n description: Type.String(),\n inputSchema: Type.Object({ type: Type.Literal('object') }, { additionalProperties: true }),\n _meta: JsonObject,\n }),\n args: JsonObject,\n result: Result,\n state: Type.Unknown(),\n readOnly: Type.Boolean(),\n }),\n});\n\nexport const mcpAppActivateMethod = defineDoomPluginMethod({\n ...Address,\n method: 'activate',\n input: Type.Object({ leaseId: Lease }, { additionalProperties: false }),\n output: Type.Object({ readOnly: Type.Literal(false) }),\n});\nexport const mcpAppCallToolMethod = defineDoomPluginMethod({\n ...Address,\n method: 'callTool',\n input: Type.Object(\n { leaseId: Lease, name: Type.String({ minLength: 1, maxLength: 256 }), arguments: JsonObject },\n { additionalProperties: false },\n ),\n output: Result,\n});\nexport const mcpAppSetStateMethod = defineDoomPluginMethod({\n ...Address,\n method: 'setState',\n input: Type.Object({ leaseId: Lease, state: Type.Unknown() }, { additionalProperties: false }),\n output: Empty,\n});\nexport const mcpAppFollowUpMethod = defineDoomPluginMethod({\n ...Address,\n method: 'followUp',\n input: Type.Object(\n { leaseId: Lease, prompt: Type.String({ minLength: 1, maxLength: 16000 }) },\n { additionalProperties: false },\n ),\n output: Empty,\n});\nexport const mcpAppCloseMethod = defineDoomPluginMethod({\n ...Address,\n method: 'close',\n input: Type.Object({ leaseId: Lease }, { additionalProperties: false }),\n output: Empty,\n});\nexport const mcpAppMethods = [\n mcpAppOpenMethod,\n mcpAppActivateMethod,\n mcpAppCallToolMethod,\n mcpAppSetStateMethod,\n mcpAppFollowUpMethod,\n mcpAppCloseMethod,\n] as const;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { defineMcpWidget } from "@agimon-ai/po-core/web";
|
|
2
|
+
import { McpToolFields, McpToolFrame, McpToolOutput } from "@agimon-ai/po-web-components";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/extensions/workspaces/sessions/(frontend)/tool/mcp_use.mcp.tsx
|
|
5
|
+
function McpUseMcpWidget(props) {
|
|
6
|
+
return /* @__PURE__ */ jsxs(McpToolFrame, {
|
|
7
|
+
...props,
|
|
8
|
+
title: "Call MCP tool",
|
|
9
|
+
children: [/* @__PURE__ */ jsx(McpToolFields, { fields: [["Server", props.args.server], ["Tool", props.args.tool]] }), /* @__PURE__ */ jsx(McpToolOutput, { result: props.result })]
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
var mcp_use_mcp_default = defineMcpWidget(McpUseMcpWidget);
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/extensions/workspaces/sessions/(frontend)/tool/session_mcp.mcp.tsx
|
|
15
|
+
function SessionMcpMcpWidget(props) {
|
|
16
|
+
return /* @__PURE__ */ jsx(McpToolFrame, {
|
|
17
|
+
...props,
|
|
18
|
+
title: props.toolName,
|
|
19
|
+
children: /* @__PURE__ */ jsx(McpToolOutput, { result: props.result })
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region generated/mcp-ui.ts
|
|
24
|
+
const widgets = {
|
|
25
|
+
"@agimon-ai/po-mcp/mcp_use": mcp_use_mcp_default,
|
|
26
|
+
"@agimon-ai/po-mcp/session_mcp": defineMcpWidget(SessionMcpMcpWidget)
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { widgets };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=mcp-ui.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-ui.mjs","names":["Widget0","Widget1"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/mcp_use.mcp.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/session_mcp.mcp.tsx","../../generated/mcp-ui.ts"],"sourcesContent":["import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction McpUseMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"Call MCP tool\">\n <McpToolFields\n fields={[\n ['Server', props.args.server],\n ['Tool', props.args.tool],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(McpUseMcpWidget);\n","import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction SessionMcpMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title={props.toolName}>\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(SessionMcpMcpWidget);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport type { ComponentType } from 'react';\nimport type { DoomMcpWidgetProps } from '@agimon-ai/po-core/mcpWidget';\nimport Widget0 from \"../src/extensions/workspaces/sessions/(frontend)/tool/mcp_use.mcp\";\nimport Widget1 from \"../src/extensions/workspaces/sessions/(frontend)/tool/session_mcp.mcp\";\n\nexport const widgets: Readonly<Record<string, ComponentType<DoomMcpWidgetProps>>> = {\n \"@agimon-ai/po-mcp/mcp_use\": Widget0,\n \"@agimon-ai/po-mcp/session_mcp\": Widget1,\n};\n"],"mappings":";;;;AAGA,SAAS,gBAAgB,OAA2B;CAClD,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ,CACN,CAAC,UAAU,MAAM,KAAK,MAAM,GAC5B,CAAC,QAAQ,MAAM,KAAK,IAAI,CAC1B,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;AAEA,IAAA,sBAAe,gBAAgB,eAAe;;;ACd9C,SAAS,oBAAoB,OAA2B;CACtD,OACE,oBAAC,cAAD;EAAc,GAAI;EAAO,OAAO,MAAM;EACpC,UAAA,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA;CAC1B,CAAA;AAElB;;;ACHA,MAAa,UAAuE;CAClF,6BAA6BA;CAC7B,iCDGa,gBAAgB,mBCHIC;AACnC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
let _agimon_ai_po_core_mcpFacet = require("@agimon-ai/po-core/mcpFacet");
|
|
6
|
+
let _agimon_ai_po_core_serverFacet = require("@agimon-ai/po-core/serverFacet");
|
|
7
|
+
let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
|
|
8
|
+
require("typebox/value");
|
|
9
|
+
let typebox = require("typebox");
|
|
10
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/po-use-mcp.mcp.ts
|
|
11
|
+
var po_use_mcp_mcp_default = (0, _agimon_ai_po_core_mcpFacet.defineMcpSkill)({
|
|
12
|
+
name: "po-use-mcp",
|
|
13
|
+
description: "Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.",
|
|
14
|
+
read: () => (0, _agimon_ai_po_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-use-mcp/SKILL.md")
|
|
15
|
+
});
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/services/mcpHeadlessTools/index.ts
|
|
18
|
+
const MCP_HEADLESS_TOOLS_SERVICE = "doom/mcp-headless-tools";
|
|
19
|
+
function bindMcpHeadlessTool(context, name) {
|
|
20
|
+
const tool = context.services.get(MCP_HEADLESS_TOOLS_SERVICE)?.get(name);
|
|
21
|
+
if (!tool) throw new Error(`MCP tool is unavailable: ${name}`);
|
|
22
|
+
return {
|
|
23
|
+
...tool,
|
|
24
|
+
execute(toolCallId, parameters, signal, onUpdate) {
|
|
25
|
+
const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);
|
|
26
|
+
return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp.ts
|
|
32
|
+
var mcp_use_mcp_default = (0, _agimon_ai_po_core_mcpFacet.defineMcpTool)((context) => bindMcpHeadlessTool(context, "mcp_use"));
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/save_file.mcp.ts
|
|
35
|
+
var save_file_mcp_default = (0, _agimon_ai_po_core_mcpFacet.defineMcpTool)((context) => bindMcpHeadlessTool(context, "save_file"));
|
|
36
|
+
typebox.Type.Object({
|
|
37
|
+
server: typebox.Type.String({ minLength: 1 }),
|
|
38
|
+
tool: typebox.Type.String({ minLength: 1 }),
|
|
39
|
+
arguments: typebox.Type.Optional(typebox.Type.Record(typebox.Type.String(), typebox.Type.Unknown()))
|
|
40
|
+
});
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/services/mcpSessionTools/index.ts
|
|
43
|
+
const MCP_SESSION_TOOLS_SERVICE = "doom/mcp-session-tools";
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts
|
|
46
|
+
var session_mcp_mcp_default = (0, _agimon_ai_po_core_extensionFile.defineRoutedContribution)((context) => {
|
|
47
|
+
const service = context.services.get(MCP_SESSION_TOOLS_SERVICE);
|
|
48
|
+
if (!service) return [];
|
|
49
|
+
let current = [];
|
|
50
|
+
const stop = service.onChange(() => {
|
|
51
|
+
const next = service.project();
|
|
52
|
+
if (next.length === current.length && next.every((tool, index) => tool === current[index])) return;
|
|
53
|
+
current = next;
|
|
54
|
+
context.refresh();
|
|
55
|
+
});
|
|
56
|
+
current = service.project();
|
|
57
|
+
context.signal.addEventListener("abort", stop, { once: true });
|
|
58
|
+
return current.map((tool) => ({
|
|
59
|
+
...tool,
|
|
60
|
+
execute: (toolCallId, parameters, signal) => tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]))
|
|
61
|
+
}));
|
|
62
|
+
}, { cardinality: "many" });
|
|
63
|
+
//#endregion
|
|
64
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/share_file.mcp.ts
|
|
65
|
+
var share_file_mcp_default = (0, _agimon_ai_po_core_mcpFacet.defineMcpTool)((context) => bindMcpHeadlessTool(context, "share_file"));
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region generated/mcp.ts
|
|
68
|
+
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
69
|
+
const many = (value, context) => {
|
|
70
|
+
const resolved = typeof value === "function" ? value(context) : value;
|
|
71
|
+
return Array.isArray(resolved) ? resolved : [resolved];
|
|
72
|
+
};
|
|
73
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
74
|
+
...identity,
|
|
75
|
+
...value
|
|
76
|
+
};
|
|
77
|
+
const withWidget = (key, value) => value === void 0 ? value : {
|
|
78
|
+
...value,
|
|
79
|
+
_meta: {
|
|
80
|
+
...value._meta,
|
|
81
|
+
["po/widget"]: key
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const mcp = (0, _agimon_ai_po_core_mcpFacet.defineMcpPlugin)({
|
|
85
|
+
name: "@agimon-ai/po-mcp",
|
|
86
|
+
session: (context) => ({
|
|
87
|
+
get skills() {
|
|
88
|
+
return [at(po_use_mcp_mcp_default, context)];
|
|
89
|
+
},
|
|
90
|
+
get tools() {
|
|
91
|
+
return [
|
|
92
|
+
withWidget("@agimon-ai/po-mcp/mcp_use", via({ name: "mcp_use" }, at(mcp_use_mcp_default, context))),
|
|
93
|
+
via({ name: "save_file" }, at(save_file_mcp_default, context)),
|
|
94
|
+
...many(session_mcp_mcp_default, context).map((tool) => withWidget("@agimon-ai/po-mcp/session_mcp", tool)),
|
|
95
|
+
via({ name: "share_file" }, at(share_file_mcp_default, context))
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
});
|
|
100
|
+
//#endregion
|
|
101
|
+
exports.default = mcp;
|
|
102
|
+
exports.mcp = mcp;
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=mcp.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","defineMcpTool","defineMcpTool","Type","defineRoutedContribution","defineMcpTool","defineMcpPlugin","skillPoUseMcp","toolMcpUse","toolSaveFile","toolSessionMcp","toolShareFile"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-use-mcp.mcp.ts","../../src/services/mcpHeadlessTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/save_file.mcp.ts","../../src/schemas/mcpHeadlessTool.ts","../../src/services/mcpSessionTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/share_file.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'po-use-mcp',\n description:\n 'Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-mcp/SKILL.md'),\n});\n","import type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nexport const MCP_HEADLESS_TOOLS_SERVICE = 'doom/mcp-headless-tools';\n\nexport interface McpHeadlessToolCatalog {\n get(name: string): DoomHeadlessTool | undefined;\n}\n\nexport function mountMcpHeadlessTools(tools: readonly DoomHeadlessTool[]) {\n return (context: Context): void => {\n context.plugin((providerContext) => {\n providerContext.provide(MCP_HEADLESS_TOOLS_SERVICE, {\n get: (name) => tools.find((tool) => tool.name === name),\n } satisfies McpHeadlessToolCatalog);\n });\n };\n}\n\nexport function bindMcpHeadlessTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool {\n const tool = context.services.get<McpHeadlessToolCatalog>(MCP_HEADLESS_TOOLS_SERVICE)?.get(name);\n if (!tool) throw new Error(`MCP tool is unavailable: ${name}`);\n return {\n ...tool,\n execute(toolCallId, parameters, signal, onUpdate) {\n const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n },\n };\n}\n","import { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'mcp_use'));\n","import { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'save_file'));\n","import { Type } from 'typebox';\n\nexport const McpHeadlessToolParameters = Type.Object({\n server: Type.String({ minLength: 1 }),\n tool: Type.String({ minLength: 1 }),\n arguments: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n});\n","import type { DoomChildSessionMcpCatalog, DoomChildSessionMcpTool } from '@agimon-ai/po-core/childSession';\nimport type { DoomHeadlessTool, DoomHeadlessToolResult } from '@agimon-ai/po-core/headless';\nimport type { ReadResourceResult } from '@modelcontextprotocol/server';\nimport type { Static, TSchema } from 'typebox';\nimport { Value } from 'typebox/value';\n\nimport { McpHeadlessToolParameters } from '../../schemas/mcpHeadlessTool';\nimport { mcpToolExecutionMetadata, type CatalogTool } from '../mcpCatalog';\nimport { modelInputSchema } from '../mcpFileParams';\nimport type { McpSession } from '../mcpSession';\n\nexport const MCP_SESSION_TOOLS_SERVICE = 'doom/mcp-session-tools';\n\n/** This projection needs no caller-owned execution context and can be borrowed unchanged. */\nexport interface McpDirectTool extends DoomHeadlessTool {\n execute(toolCallId: string, parameters: unknown, signal?: AbortSignal): Promise<DoomHeadlessToolResult>;\n}\n\n/** Narrow cross-root access to the Pi session's existing upstream MCP runtime. */\nexport interface McpSessionToolsService {\n readonly generation: string;\n runtimeRevision(): number;\n readAppResource(server: string, tool: string, resourceUri: string, signal?: AbortSignal): Promise<ReadResourceResult>;\n snapshot(): readonly CatalogTool[];\n project(): readonly McpDirectTool[];\n refresh(): void;\n dispose(): void;\n resolveSelectors(selectors: readonly string[]): readonly string[];\n onChange(listener: () => void): () => void;\n invoke(name: string, parameters: Record<string, unknown>, signal?: AbortSignal): Promise<DoomHeadlessToolResult>;\n}\n\nexport function createMcpSessionToolsService(\n session: McpSession,\n generation: string,\n assertAvailable: () => void = () => undefined,\n): McpSessionToolsService {\n let disposed = false;\n const listeners = new Set<() => void>();\n const retained = new Map<string, { fingerprint: string; tool: McpDirectTool; retire(): void }>();\n const snapshot = () => {\n try {\n if (disposed) return [];\n assertAvailable();\n return session.activeToolDefinitions();\n } catch {\n // An inactive or stale parent lends no declarations.\n return [];\n }\n };\n const project = (): readonly McpDirectTool[] => {\n const definitions = snapshot();\n const names = new Set(definitions.map((tool) => tool.piName));\n for (const [name, entry] of retained) {\n if (names.has(name)) continue;\n entry.retire();\n retained.delete(name);\n }\n return definitions.map((definition) => {\n const fingerprint = JSON.stringify([session.toolGeneration, definition]);\n const previous = retained.get(definition.piName);\n if (previous?.fingerprint === fingerprint) return previous.tool;\n previous?.retire();\n let retired = false;\n const invoke = session.bindToolInvocation(definition);\n const tool: McpDirectTool = {\n name: definition.piName,\n label: `${definition.serverName}: ${definition.toolName}`,\n description: definition.description ?? `${definition.toolName} on the ${definition.serverName} MCP server.`,\n ...(definition.annotations === undefined ? {} : { annotations: definition.annotations }),\n ...(definition._meta === undefined ? {} : { _meta: mcpToolExecutionMetadata(definition) }),\n ...(definition.outputSchema === undefined ? {} : { outputSchema: definition.outputSchema }),\n // File parameters are validated as the `{path}` objects the model sends.\n parameters: modelInputSchema(definition) as TSchema,\n async execute(_toolCallId, parameters, signal) {\n assertAvailable();\n if (retired) throw new Error(`MCP tool ${definition.piName} is no longer available.`);\n signal?.throwIfAborted();\n const arguments_ = parameters === undefined ? {} : parameters;\n if (!Value.Check(tool.parameters, arguments_))\n throw new Error(`Invalid arguments for MCP tool ${definition.piName}.`);\n const result = await invoke(arguments_ as Record<string, unknown>, signal);\n signal?.throwIfAborted();\n return result;\n },\n };\n retained.set(definition.piName, {\n fingerprint,\n tool,\n retire: () => {\n retired = true;\n },\n });\n return tool;\n });\n };\n const refresh = () => {\n project();\n for (const listener of listeners) listener();\n };\n // Retirement must happen even if a borrower temporarily has no change listener.\n const stopSession = session.onChange(refresh);\n return Object.freeze({\n generation,\n runtimeRevision: () => session.toolGeneration,\n readAppResource: async (server: string, tool: string, resourceUri: string, signal?: AbortSignal) => {\n assertAvailable();\n if (disposed) throw new Error('The MCP session is no longer available.');\n const result = await session.readAppResource(server, tool, resourceUri, signal);\n assertAvailable();\n if (disposed) throw new Error('The MCP session is no longer available.');\n return result;\n },\n snapshot,\n project,\n refresh,\n dispose: () => {\n disposed = true;\n stopSession();\n refresh();\n listeners.clear();\n },\n resolveSelectors: (selectors: readonly string[]) => {\n const active = new Set(snapshot().map((tool) => tool.piName));\n return session\n .resolveToolSelectors(selectors)\n .map((tool) => tool.name)\n .filter((name) => active.has(name));\n },\n onChange: (listener: () => void) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n invoke: async (name: string, parameters: Record<string, unknown>, signal?: AbortSignal) => {\n assertAvailable();\n const tool = project().find((candidate) => candidate.name === name);\n if (!tool) throw new Error(`MCP tool ${name} is not available in this session.`);\n return tool.execute('mcp', parameters, signal);\n },\n });\n}\n\n/** Borrow an existing MCP runtime; a child never starts or disposes its own upstream connections. */\nexport function createMcpChildTool(\n invoke: (\n parameters: Static<typeof McpHeadlessToolParameters>,\n signal?: AbortSignal,\n ) => Promise<DoomHeadlessToolResult>,\n catalog?: DoomChildSessionMcpCatalog,\n): DoomChildSessionMcpTool {\n return {\n name: 'mcp',\n ...(catalog === undefined ? {} : { catalog }),\n description: 'Call a tool exposed by a connected MCP server.',\n parameters: McpHeadlessToolParameters,\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n if (!Value.Check(McpHeadlessToolParameters, parameters)) throw new Error('Invalid MCP tool arguments.');\n const result = await invoke(parameters, signal);\n signal?.throwIfAborted();\n return result;\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport {\n MCP_SESSION_TOOLS_SERVICE,\n type McpDirectTool,\n type McpSessionToolsService,\n} from '../../../../../services/mcpSessionTools';\n\nexport default defineRoutedContribution(\n (context: DoomMcpPluginContext): readonly DoomHeadlessTool[] => {\n const service = context.services.get<McpSessionToolsService>(MCP_SESSION_TOOLS_SERVICE);\n if (!service) return [];\n let current: readonly McpDirectTool[] = [];\n const stop = service.onChange(() => {\n const next = service.project();\n if (next.length === current.length && next.every((tool, index) => tool === current[index])) return;\n current = next;\n context.refresh();\n });\n current = service.project();\n context.signal.addEventListener('abort', stop, { once: true });\n return current.map((tool) => ({\n ...tool,\n execute: (toolCallId, parameters, signal) =>\n tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal])),\n }));\n },\n { cardinality: 'many' },\n);\n","import { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'share_file'));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport skillPoUseMcp from '../src/extensions/workspaces/sessions/(backend)/skill/po-use-mcp.mcp';\nimport toolMcpUse from '../src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp';\nimport toolSaveFile from '../src/extensions/workspaces/sessions/(backend)/tool/save_file.mcp';\nimport toolSessionMcp from '../src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp';\nimport toolShareFile from '../src/extensions/workspaces/sessions/(backend)/tool/share_file.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-mcp',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [at(skillPoUseMcp, context)]; },\n get tools(): DoomMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-mcp/mcp_use\", via({ name: 'mcp_use' }, at(toolMcpUse, context))), via({ name: 'save_file' }, at(toolSaveFile, context)), ...many(toolSessionMcp, context).map((tool) => withWidget(\"@agimon-ai/po-mcp/session_mcp\", tool)), via({ name: 'share_file' }, at(toolShareFile, context))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBAwBa,2CAAG"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { defineMcpPlugin, defineMcpSkill, defineMcpTool } from "@agimon-ai/po-core/mcpFacet";
|
|
2
|
+
import { readPackageResource } from "@agimon-ai/po-core/serverFacet";
|
|
3
|
+
import { defineRoutedContribution } from "@agimon-ai/po-core/extensionFile";
|
|
4
|
+
import "typebox/value";
|
|
5
|
+
import { Type } from "typebox";
|
|
6
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/po-use-mcp.mcp.ts
|
|
7
|
+
var po_use_mcp_mcp_default = defineMcpSkill({
|
|
8
|
+
name: "po-use-mcp",
|
|
9
|
+
description: "Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.",
|
|
10
|
+
read: () => readPackageResource(import.meta.url, "src/prompts/po-use-mcp/SKILL.md")
|
|
11
|
+
});
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/services/mcpHeadlessTools/index.ts
|
|
14
|
+
const MCP_HEADLESS_TOOLS_SERVICE = "doom/mcp-headless-tools";
|
|
15
|
+
function bindMcpHeadlessTool(context, name) {
|
|
16
|
+
const tool = context.services.get(MCP_HEADLESS_TOOLS_SERVICE)?.get(name);
|
|
17
|
+
if (!tool) throw new Error(`MCP tool is unavailable: ${name}`);
|
|
18
|
+
return {
|
|
19
|
+
...tool,
|
|
20
|
+
execute(toolCallId, parameters, signal, onUpdate) {
|
|
21
|
+
const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);
|
|
22
|
+
return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp.ts
|
|
28
|
+
var mcp_use_mcp_default = defineMcpTool((context) => bindMcpHeadlessTool(context, "mcp_use"));
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/save_file.mcp.ts
|
|
31
|
+
var save_file_mcp_default = defineMcpTool((context) => bindMcpHeadlessTool(context, "save_file"));
|
|
32
|
+
Type.Object({
|
|
33
|
+
server: Type.String({ minLength: 1 }),
|
|
34
|
+
tool: Type.String({ minLength: 1 }),
|
|
35
|
+
arguments: Type.Optional(Type.Record(Type.String(), Type.Unknown()))
|
|
36
|
+
});
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region src/services/mcpSessionTools/index.ts
|
|
39
|
+
const MCP_SESSION_TOOLS_SERVICE = "doom/mcp-session-tools";
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts
|
|
42
|
+
var session_mcp_mcp_default = defineRoutedContribution((context) => {
|
|
43
|
+
const service = context.services.get(MCP_SESSION_TOOLS_SERVICE);
|
|
44
|
+
if (!service) return [];
|
|
45
|
+
let current = [];
|
|
46
|
+
const stop = service.onChange(() => {
|
|
47
|
+
const next = service.project();
|
|
48
|
+
if (next.length === current.length && next.every((tool, index) => tool === current[index])) return;
|
|
49
|
+
current = next;
|
|
50
|
+
context.refresh();
|
|
51
|
+
});
|
|
52
|
+
current = service.project();
|
|
53
|
+
context.signal.addEventListener("abort", stop, { once: true });
|
|
54
|
+
return current.map((tool) => ({
|
|
55
|
+
...tool,
|
|
56
|
+
execute: (toolCallId, parameters, signal) => tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]))
|
|
57
|
+
}));
|
|
58
|
+
}, { cardinality: "many" });
|
|
59
|
+
//#endregion
|
|
60
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/share_file.mcp.ts
|
|
61
|
+
var share_file_mcp_default = defineMcpTool((context) => bindMcpHeadlessTool(context, "share_file"));
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region generated/mcp.ts
|
|
64
|
+
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
65
|
+
const many = (value, context) => {
|
|
66
|
+
const resolved = typeof value === "function" ? value(context) : value;
|
|
67
|
+
return Array.isArray(resolved) ? resolved : [resolved];
|
|
68
|
+
};
|
|
69
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
70
|
+
...identity,
|
|
71
|
+
...value
|
|
72
|
+
};
|
|
73
|
+
const withWidget = (key, value) => value === void 0 ? value : {
|
|
74
|
+
...value,
|
|
75
|
+
_meta: {
|
|
76
|
+
...value._meta,
|
|
77
|
+
["po/widget"]: key
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const mcp = defineMcpPlugin({
|
|
81
|
+
name: "@agimon-ai/po-mcp",
|
|
82
|
+
session: (context) => ({
|
|
83
|
+
get skills() {
|
|
84
|
+
return [at(po_use_mcp_mcp_default, context)];
|
|
85
|
+
},
|
|
86
|
+
get tools() {
|
|
87
|
+
return [
|
|
88
|
+
withWidget("@agimon-ai/po-mcp/mcp_use", via({ name: "mcp_use" }, at(mcp_use_mcp_default, context))),
|
|
89
|
+
via({ name: "save_file" }, at(save_file_mcp_default, context)),
|
|
90
|
+
...many(session_mcp_mcp_default, context).map((tool) => withWidget("@agimon-ai/po-mcp/session_mcp", tool)),
|
|
91
|
+
via({ name: "share_file" }, at(share_file_mcp_default, context))
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
});
|
|
96
|
+
//#endregion
|
|
97
|
+
export { mcp as default, mcp };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=mcp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.mjs","names":["skillPoUseMcp","toolMcpUse","toolSaveFile","toolSessionMcp","toolShareFile"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-use-mcp.mcp.ts","../../src/services/mcpHeadlessTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/save_file.mcp.ts","../../src/schemas/mcpHeadlessTool.ts","../../src/services/mcpSessionTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/share_file.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'po-use-mcp',\n description:\n 'Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-use-mcp/SKILL.md'),\n});\n","import type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nexport const MCP_HEADLESS_TOOLS_SERVICE = 'doom/mcp-headless-tools';\n\nexport interface McpHeadlessToolCatalog {\n get(name: string): DoomHeadlessTool | undefined;\n}\n\nexport function mountMcpHeadlessTools(tools: readonly DoomHeadlessTool[]) {\n return (context: Context): void => {\n context.plugin((providerContext) => {\n providerContext.provide(MCP_HEADLESS_TOOLS_SERVICE, {\n get: (name) => tools.find((tool) => tool.name === name),\n } satisfies McpHeadlessToolCatalog);\n });\n };\n}\n\nexport function bindMcpHeadlessTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool {\n const tool = context.services.get<McpHeadlessToolCatalog>(MCP_HEADLESS_TOOLS_SERVICE)?.get(name);\n if (!tool) throw new Error(`MCP tool is unavailable: ${name}`);\n return {\n ...tool,\n execute(toolCallId, parameters, signal, onUpdate) {\n const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n },\n };\n}\n","import { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'mcp_use'));\n","import { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'save_file'));\n","import { Type } from 'typebox';\n\nexport const McpHeadlessToolParameters = Type.Object({\n server: Type.String({ minLength: 1 }),\n tool: Type.String({ minLength: 1 }),\n arguments: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n});\n","import type { DoomChildSessionMcpCatalog, DoomChildSessionMcpTool } from '@agimon-ai/po-core/childSession';\nimport type { DoomHeadlessTool, DoomHeadlessToolResult } from '@agimon-ai/po-core/headless';\nimport type { ReadResourceResult } from '@modelcontextprotocol/server';\nimport type { Static, TSchema } from 'typebox';\nimport { Value } from 'typebox/value';\n\nimport { McpHeadlessToolParameters } from '../../schemas/mcpHeadlessTool';\nimport { mcpToolExecutionMetadata, type CatalogTool } from '../mcpCatalog';\nimport { modelInputSchema } from '../mcpFileParams';\nimport type { McpSession } from '../mcpSession';\n\nexport const MCP_SESSION_TOOLS_SERVICE = 'doom/mcp-session-tools';\n\n/** This projection needs no caller-owned execution context and can be borrowed unchanged. */\nexport interface McpDirectTool extends DoomHeadlessTool {\n execute(toolCallId: string, parameters: unknown, signal?: AbortSignal): Promise<DoomHeadlessToolResult>;\n}\n\n/** Narrow cross-root access to the Pi session's existing upstream MCP runtime. */\nexport interface McpSessionToolsService {\n readonly generation: string;\n runtimeRevision(): number;\n readAppResource(server: string, tool: string, resourceUri: string, signal?: AbortSignal): Promise<ReadResourceResult>;\n snapshot(): readonly CatalogTool[];\n project(): readonly McpDirectTool[];\n refresh(): void;\n dispose(): void;\n resolveSelectors(selectors: readonly string[]): readonly string[];\n onChange(listener: () => void): () => void;\n invoke(name: string, parameters: Record<string, unknown>, signal?: AbortSignal): Promise<DoomHeadlessToolResult>;\n}\n\nexport function createMcpSessionToolsService(\n session: McpSession,\n generation: string,\n assertAvailable: () => void = () => undefined,\n): McpSessionToolsService {\n let disposed = false;\n const listeners = new Set<() => void>();\n const retained = new Map<string, { fingerprint: string; tool: McpDirectTool; retire(): void }>();\n const snapshot = () => {\n try {\n if (disposed) return [];\n assertAvailable();\n return session.activeToolDefinitions();\n } catch {\n // An inactive or stale parent lends no declarations.\n return [];\n }\n };\n const project = (): readonly McpDirectTool[] => {\n const definitions = snapshot();\n const names = new Set(definitions.map((tool) => tool.piName));\n for (const [name, entry] of retained) {\n if (names.has(name)) continue;\n entry.retire();\n retained.delete(name);\n }\n return definitions.map((definition) => {\n const fingerprint = JSON.stringify([session.toolGeneration, definition]);\n const previous = retained.get(definition.piName);\n if (previous?.fingerprint === fingerprint) return previous.tool;\n previous?.retire();\n let retired = false;\n const invoke = session.bindToolInvocation(definition);\n const tool: McpDirectTool = {\n name: definition.piName,\n label: `${definition.serverName}: ${definition.toolName}`,\n description: definition.description ?? `${definition.toolName} on the ${definition.serverName} MCP server.`,\n ...(definition.annotations === undefined ? {} : { annotations: definition.annotations }),\n ...(definition._meta === undefined ? {} : { _meta: mcpToolExecutionMetadata(definition) }),\n ...(definition.outputSchema === undefined ? {} : { outputSchema: definition.outputSchema }),\n // File parameters are validated as the `{path}` objects the model sends.\n parameters: modelInputSchema(definition) as TSchema,\n async execute(_toolCallId, parameters, signal) {\n assertAvailable();\n if (retired) throw new Error(`MCP tool ${definition.piName} is no longer available.`);\n signal?.throwIfAborted();\n const arguments_ = parameters === undefined ? {} : parameters;\n if (!Value.Check(tool.parameters, arguments_))\n throw new Error(`Invalid arguments for MCP tool ${definition.piName}.`);\n const result = await invoke(arguments_ as Record<string, unknown>, signal);\n signal?.throwIfAborted();\n return result;\n },\n };\n retained.set(definition.piName, {\n fingerprint,\n tool,\n retire: () => {\n retired = true;\n },\n });\n return tool;\n });\n };\n const refresh = () => {\n project();\n for (const listener of listeners) listener();\n };\n // Retirement must happen even if a borrower temporarily has no change listener.\n const stopSession = session.onChange(refresh);\n return Object.freeze({\n generation,\n runtimeRevision: () => session.toolGeneration,\n readAppResource: async (server: string, tool: string, resourceUri: string, signal?: AbortSignal) => {\n assertAvailable();\n if (disposed) throw new Error('The MCP session is no longer available.');\n const result = await session.readAppResource(server, tool, resourceUri, signal);\n assertAvailable();\n if (disposed) throw new Error('The MCP session is no longer available.');\n return result;\n },\n snapshot,\n project,\n refresh,\n dispose: () => {\n disposed = true;\n stopSession();\n refresh();\n listeners.clear();\n },\n resolveSelectors: (selectors: readonly string[]) => {\n const active = new Set(snapshot().map((tool) => tool.piName));\n return session\n .resolveToolSelectors(selectors)\n .map((tool) => tool.name)\n .filter((name) => active.has(name));\n },\n onChange: (listener: () => void) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n invoke: async (name: string, parameters: Record<string, unknown>, signal?: AbortSignal) => {\n assertAvailable();\n const tool = project().find((candidate) => candidate.name === name);\n if (!tool) throw new Error(`MCP tool ${name} is not available in this session.`);\n return tool.execute('mcp', parameters, signal);\n },\n });\n}\n\n/** Borrow an existing MCP runtime; a child never starts or disposes its own upstream connections. */\nexport function createMcpChildTool(\n invoke: (\n parameters: Static<typeof McpHeadlessToolParameters>,\n signal?: AbortSignal,\n ) => Promise<DoomHeadlessToolResult>,\n catalog?: DoomChildSessionMcpCatalog,\n): DoomChildSessionMcpTool {\n return {\n name: 'mcp',\n ...(catalog === undefined ? {} : { catalog }),\n description: 'Call a tool exposed by a connected MCP server.',\n parameters: McpHeadlessToolParameters,\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n if (!Value.Check(McpHeadlessToolParameters, parameters)) throw new Error('Invalid MCP tool arguments.');\n const result = await invoke(parameters, signal);\n signal?.throwIfAborted();\n return result;\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport {\n MCP_SESSION_TOOLS_SERVICE,\n type McpDirectTool,\n type McpSessionToolsService,\n} from '../../../../../services/mcpSessionTools';\n\nexport default defineRoutedContribution(\n (context: DoomMcpPluginContext): readonly DoomHeadlessTool[] => {\n const service = context.services.get<McpSessionToolsService>(MCP_SESSION_TOOLS_SERVICE);\n if (!service) return [];\n let current: readonly McpDirectTool[] = [];\n const stop = service.onChange(() => {\n const next = service.project();\n if (next.length === current.length && next.every((tool, index) => tool === current[index])) return;\n current = next;\n context.refresh();\n });\n current = service.project();\n context.signal.addEventListener('abort', stop, { once: true });\n return current.map((tool) => ({\n ...tool,\n execute: (toolCallId, parameters, signal) =>\n tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal])),\n }));\n },\n { cardinality: 'many' },\n);\n","import { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: DoomMcpPluginContext) => bindMcpHeadlessTool(context, 'share_file'));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport skillPoUseMcp from '../src/extensions/workspaces/sessions/(backend)/skill/po-use-mcp.mcp';\nimport toolMcpUse from '../src/extensions/workspaces/sessions/(backend)/tool/mcp_use.mcp';\nimport toolSaveFile from '../src/extensions/workspaces/sessions/(backend)/tool/save_file.mcp';\nimport toolSessionMcp from '../src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp';\nimport toolShareFile from '../src/extensions/workspaces/sessions/(backend)/tool/share_file.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-mcp',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [at(skillPoUseMcp, context)]; },\n get tools(): DoomMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-mcp/mcp_use\", via({ name: 'mcp_use' }, at(toolMcpUse, context))), via({ name: 'save_file' }, at(toolSaveFile, context)), ...many(toolSessionMcp, context).map((tool) => withWidget(\"@agimon-ai/po-mcp/session_mcp\", tool)), via({ name: 'share_file' }, at(toolShareFile, context))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}
|