@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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +223 -0
  3. package/dist/apiContracts.cjs +269 -0
  4. package/dist/apiContracts.cjs.map +1 -0
  5. package/dist/apiContracts.d.mts +137 -0
  6. package/dist/apiContracts.d.mts.map +1 -0
  7. package/dist/apiContracts.mjs +258 -0
  8. package/dist/apiContracts.mjs.map +1 -0
  9. package/dist/extensions/mcp-ui.mjs +31 -0
  10. package/dist/extensions/mcp-ui.mjs.map +1 -0
  11. package/dist/extensions/mcp.cjs +104 -0
  12. package/dist/extensions/mcp.cjs.map +1 -0
  13. package/dist/extensions/mcp.d.mts +5 -0
  14. package/dist/extensions/mcp.d.mts.map +1 -0
  15. package/dist/extensions/mcp.mjs +99 -0
  16. package/dist/extensions/mcp.mjs.map +1 -0
  17. package/dist/extensions/server.cjs +2852 -0
  18. package/dist/extensions/server.cjs.map +1 -0
  19. package/dist/extensions/server.d.mts +5 -0
  20. package/dist/extensions/server.d.mts.map +1 -0
  21. package/dist/extensions/server.mjs +2839 -0
  22. package/dist/extensions/server.mjs.map +1 -0
  23. package/dist/extensions/web.mjs +2200 -0
  24. package/dist/extensions/web.mjs.map +1 -0
  25. package/dist/index.cjs +18 -0
  26. package/dist/index.cjs.map +1 -0
  27. package/dist/index.d.mts +89 -0
  28. package/dist/index.d.mts.map +1 -0
  29. package/dist/index.mjs +9 -0
  30. package/dist/index.mjs.map +1 -0
  31. package/dist/mcpCatalog-6Tpt6Gqn.cjs +900 -0
  32. package/dist/mcpCatalog-6Tpt6Gqn.cjs.map +1 -0
  33. package/dist/mcpCatalog-SlqWS-sb.mjs +806 -0
  34. package/dist/mcpCatalog-SlqWS-sb.mjs.map +1 -0
  35. package/dist/mcpConfig-BYESy-zP.d.mts +57 -0
  36. package/dist/mcpConfig-BYESy-zP.d.mts.map +1 -0
  37. package/dist/projection-gyAA2jRB.mjs +43 -0
  38. package/dist/projection-gyAA2jRB.mjs.map +1 -0
  39. package/dist/projection-w3XxXmVi.cjs +51 -0
  40. package/dist/projection-w3XxXmVi.cjs.map +1 -0
  41. package/dist/projection.cjs +17 -0
  42. package/dist/projection.d.mts +12 -0
  43. package/dist/projection.d.mts.map +1 -0
  44. package/dist/projection.mjs +4 -0
  45. package/dist/rolldown-runtime-C0BPl7ul.cjs +43 -0
  46. package/llms.txt +9 -0
  47. package/package.json +157 -0
  48. 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,5 @@
1
+ //#region generated/mcp.d.ts
2
+ export declare const mcp: import("@agimon-ai/po-core/mcpFacet").DoomMcpPluginDefinition;
3
+ //#endregion
4
+ export { mcp as default };
5
+ //# sourceMappingURL=mcp.d.mts.map
@@ -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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"}