@agimon-ai/po-mcp 0.0.0-alpha.2 → 0.0.0-alpha.4

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 (40) hide show
  1. package/README.md +5 -5
  2. package/dist/apiContracts.cjs +6 -6
  3. package/dist/apiContracts.cjs.map +1 -1
  4. package/dist/apiContracts.d.mts +6 -6
  5. package/dist/apiContracts.d.mts.map +1 -1
  6. package/dist/apiContracts.mjs +7 -7
  7. package/dist/apiContracts.mjs.map +1 -1
  8. package/dist/extensions/mcp-ui.mjs.map +1 -1
  9. package/dist/extensions/mcp.cjs +3 -3
  10. package/dist/extensions/mcp.cjs.map +1 -1
  11. package/dist/extensions/mcp.d.mts +1 -1
  12. package/dist/extensions/mcp.mjs +3 -3
  13. package/dist/extensions/mcp.mjs.map +1 -1
  14. package/dist/extensions/server.cjs +30 -30
  15. package/dist/extensions/server.cjs.map +1 -1
  16. package/dist/extensions/server.d.mts +1 -1
  17. package/dist/extensions/server.mjs +37 -37
  18. package/dist/extensions/server.mjs.map +1 -1
  19. package/dist/extensions/web.mjs +61 -61
  20. package/dist/extensions/web.mjs.map +1 -1
  21. package/dist/index.cjs +3 -3
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.mts +6 -6
  24. package/dist/index.d.mts.map +1 -1
  25. package/dist/index.mjs +4 -4
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/{mcpCatalog-6Tpt6Gqn.cjs → mcpCatalog-BHoE4gfz.cjs} +10 -10
  28. package/dist/mcpCatalog-BHoE4gfz.cjs.map +1 -0
  29. package/dist/{mcpCatalog-SlqWS-sb.mjs → mcpCatalog-Bp-mLZM1.mjs} +11 -11
  30. package/dist/mcpCatalog-Bp-mLZM1.mjs.map +1 -0
  31. package/dist/{mcpConfig-BYESy-zP.d.mts → mcpConfig-lHsIQ2fZ.d.mts} +11 -11
  32. package/dist/{mcpConfig-BYESy-zP.d.mts.map → mcpConfig-lHsIQ2fZ.d.mts.map} +1 -1
  33. package/dist/projection-gyAA2jRB.mjs.map +1 -1
  34. package/dist/projection-w3XxXmVi.cjs.map +1 -1
  35. package/dist/projection.d.mts +3 -3
  36. package/dist/projection.d.mts.map +1 -1
  37. package/llms.txt +1 -1
  38. package/package.json +15 -15
  39. package/dist/mcpCatalog-6Tpt6Gqn.cjs.map +0 -1
  40. package/dist/mcpCatalog-SlqWS-sb.mjs.map +0 -1
package/README.md CHANGED
@@ -15,7 +15,7 @@ absent rather than merely hidden from the model.
15
15
 
16
16
  ## Install
17
17
 
18
- `po init` and `dpi init` include this adapter in `default.packages` in `.po/modes.yaml`.
18
+ `po init` include this adapter in `default.packages` in `.po/modes.yaml`.
19
19
  Remove it or move it to a named layer to change which major modes load it. When loaded in Po,
20
20
  domain selection controls server access.
21
21
 
@@ -40,7 +40,7 @@ Repository `.mcp.json` entries describe direct MCP servers:
40
40
  ```
41
41
 
42
42
  Selected legacy plugins may also provide root `.mcp.json`. A schema-gated Agent Plugin v1 instead
43
- provides root `mcp.json`. Doom validates its portable contract, supplies private persistent
43
+ provides root `mcp.json`. Po validates its portable contract, supplies private persistent
44
44
  `PLUGIN_DATA`, and resolves plugin-relative stdio commands and working directories. It also
45
45
  normalizes `streamable-http` for the embedded runtime. Invalid portable server entries are isolated
46
46
  from the other entries in that plugin.
@@ -61,7 +61,7 @@ domains:
61
61
  An absent or empty allowlist retains configured entries. Use `po --no-mcp` when no MCP server
62
62
  should load.
63
63
 
64
- Within Po, this package consumes the immutable `doomMcpProjection` service published on the
64
+ Within Po, this package consumes the immutable `poMcpProjection` service published on the
65
65
  session Cordis root.
66
66
  Downstream clients run in-process through `@agimon-ai/mcp-proxy`; this adapter does not start its
67
67
  Hono server.
@@ -148,7 +148,7 @@ tool to inspect its description, full input schema, warnings and estimated schem
148
148
  Authorization sends one `/mcp auth <server>` prompt frame; headless hosts never open a desktop
149
149
  browser automatically.
150
150
 
151
- The compact `doom-mcp-session-auth` status carries configured names, states, safe authorization
151
+ The compact `po-mcp-session-auth` status carries configured names, states, safe authorization
152
152
  URLs and tool identities/estimates. It excludes credentials and credential-store data. Repository
153
153
  catalog and authorization APIs remain separate from this live-session view.
154
154
 
@@ -196,7 +196,7 @@ Named routed `src/extensions/` entries declare host contributions and delegate t
196
196
  ### Remote file transfer
197
197
 
198
198
  Session MCP always exposes `share_file` and `save_file`, both marked with
199
- `_meta['doompi/fileTransfer']=true`, subject to the connection's capability grants.
199
+ `_meta['po/fileTransfer']=true`, subject to the connection's capability grants.
200
200
  `share_file({path})` uses session-bound host sharing without a consent prompt. Its
201
201
  structured result contains `url`, `fileName`, `mimeType`, `size`, `expiresAt` (epoch
202
202
  milliseconds), and `maxDownloads` (3). Links expire after 10 minutes and require
@@ -185,7 +185,7 @@ const Address = {
185
185
  scope: "session",
186
186
  direction: "client-to-server"
187
187
  };
188
- const mcpAppOpenMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPluginMethod)({
188
+ const mcpAppOpenMethod = (0, _agimon_ai_po_core_pluginProtocol.definePoPluginMethod)({
189
189
  ...Address,
190
190
  method: "open",
191
191
  input: typebox.Type.Object({ toolCallId: typebox.Type.String({
@@ -210,13 +210,13 @@ const mcpAppOpenMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPluginM
210
210
  readOnly: typebox.Type.Boolean()
211
211
  })
212
212
  });
213
- const mcpAppActivateMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPluginMethod)({
213
+ const mcpAppActivateMethod = (0, _agimon_ai_po_core_pluginProtocol.definePoPluginMethod)({
214
214
  ...Address,
215
215
  method: "activate",
216
216
  input: typebox.Type.Object({ leaseId: Lease }, { additionalProperties: false }),
217
217
  output: typebox.Type.Object({ readOnly: typebox.Type.Literal(false) })
218
218
  });
219
- const mcpAppCallToolMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPluginMethod)({
219
+ const mcpAppCallToolMethod = (0, _agimon_ai_po_core_pluginProtocol.definePoPluginMethod)({
220
220
  ...Address,
221
221
  method: "callTool",
222
222
  input: typebox.Type.Object({
@@ -229,7 +229,7 @@ const mcpAppCallToolMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPlu
229
229
  }, { additionalProperties: false }),
230
230
  output: Result
231
231
  });
232
- const mcpAppSetStateMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPluginMethod)({
232
+ const mcpAppSetStateMethod = (0, _agimon_ai_po_core_pluginProtocol.definePoPluginMethod)({
233
233
  ...Address,
234
234
  method: "setState",
235
235
  input: typebox.Type.Object({
@@ -238,7 +238,7 @@ const mcpAppSetStateMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPlu
238
238
  }, { additionalProperties: false }),
239
239
  output: Empty
240
240
  });
241
- const mcpAppFollowUpMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPluginMethod)({
241
+ const mcpAppFollowUpMethod = (0, _agimon_ai_po_core_pluginProtocol.definePoPluginMethod)({
242
242
  ...Address,
243
243
  method: "followUp",
244
244
  input: typebox.Type.Object({
@@ -250,7 +250,7 @@ const mcpAppFollowUpMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPlu
250
250
  }, { additionalProperties: false }),
251
251
  output: Empty
252
252
  });
253
- const mcpAppCloseMethod = (0, _agimon_ai_po_core_pluginProtocol.defineDoomPluginMethod)({
253
+ const mcpAppCloseMethod = (0, _agimon_ai_po_core_pluginProtocol.definePoPluginMethod)({
254
254
  ...Address,
255
255
  method: "close",
256
256
  input: typebox.Type.Object({ leaseId: Lease }, { additionalProperties: false }),
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses","Type","defineDoomPluginMethod"],"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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"}
1
+ {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses","Type","definePoPluginMethod"],"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 { definePoPluginMethod } 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 = definePoPluginMethod({\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 = definePoPluginMethod({\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 = definePoPluginMethod({\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 = definePoPluginMethod({\n ...Address,\n method: 'setState',\n input: Type.Object({ leaseId: Lease, state: Type.Unknown() }, { additionalProperties: false }),\n output: Empty,\n});\nexport const mcpAppFollowUpMethod = definePoPluginMethod({\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 = definePoPluginMethod({\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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"}
@@ -80,7 +80,7 @@ interface McpAppOpenResult {
80
80
  }
81
81
  //#endregion
82
82
  //#region src/schemas/mcpApps.d.ts
83
- export declare const mcpAppOpenMethod: import("@agimon-ai/po-core/pluginProtocol").DoomPluginMethod<Type.TObject<{
83
+ export declare const mcpAppOpenMethod: import("@agimon-ai/po-core/pluginProtocol").PoPluginMethod<Type.TObject<{
84
84
  toolCallId: Type.TString;
85
85
  }>, Type.TObject<{
86
86
  leaseId: Type.TString;
@@ -106,12 +106,12 @@ export declare const mcpAppOpenMethod: import("@agimon-ai/po-core/pluginProtocol
106
106
  state: Type.TUnknown;
107
107
  readOnly: Type.TBoolean;
108
108
  }>>;
109
- export declare const mcpAppActivateMethod: import("@agimon-ai/po-core/pluginProtocol").DoomPluginMethod<Type.TObject<{
109
+ export declare const mcpAppActivateMethod: import("@agimon-ai/po-core/pluginProtocol").PoPluginMethod<Type.TObject<{
110
110
  leaseId: Type.TString;
111
111
  }>, Type.TObject<{
112
112
  readOnly: Type.TLiteral<false>;
113
113
  }>>;
114
- export declare const mcpAppCallToolMethod: import("@agimon-ai/po-core/pluginProtocol").DoomPluginMethod<Type.TObject<{
114
+ export declare const mcpAppCallToolMethod: import("@agimon-ai/po-core/pluginProtocol").PoPluginMethod<Type.TObject<{
115
115
  leaseId: Type.TString;
116
116
  name: Type.TString;
117
117
  arguments: Type.TRecord<"^.*$", Type.TUnknown>;
@@ -121,15 +121,15 @@ export declare const mcpAppCallToolMethod: import("@agimon-ai/po-core/pluginProt
121
121
  _meta: Type.TOptional<Type.TRecord<"^.*$", Type.TUnknown>>;
122
122
  isError: Type.TOptional<Type.TBoolean>;
123
123
  }>>;
124
- export declare const mcpAppSetStateMethod: import("@agimon-ai/po-core/pluginProtocol").DoomPluginMethod<Type.TObject<{
124
+ export declare const mcpAppSetStateMethod: import("@agimon-ai/po-core/pluginProtocol").PoPluginMethod<Type.TObject<{
125
125
  leaseId: Type.TString;
126
126
  state: Type.TUnknown;
127
127
  }>, Type.TObject<{}>>;
128
- export declare const mcpAppFollowUpMethod: import("@agimon-ai/po-core/pluginProtocol").DoomPluginMethod<Type.TObject<{
128
+ export declare const mcpAppFollowUpMethod: import("@agimon-ai/po-core/pluginProtocol").PoPluginMethod<Type.TObject<{
129
129
  leaseId: Type.TString;
130
130
  prompt: Type.TString;
131
131
  }>, Type.TObject<{}>>;
132
- export declare const mcpAppCloseMethod: import("@agimon-ai/po-core/pluginProtocol").DoomPluginMethod<Type.TObject<{
132
+ export declare const mcpAppCloseMethod: import("@agimon-ai/po-core/pluginProtocol").PoPluginMethod<Type.TObject<{
133
133
  leaseId: Type.TString;
134
134
  }>, Type.TObject<{}>>;
135
135
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts","../src/types/webMcp.ts","../src/schemas/mcpApps.ts"],"mappings":";;;;qBAiDa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCvCI;EACf;EACA;EACA;EACA;EACA,cAAc;EACd;IACE;IACA;IACA;MAAe;OAAiB;;IAChC,OAAO;;EAET,MAAM;EACN;IAAU;IAAoB;IAA6B,QAAQ;IAAyB;;EAC5F;EACA;;;;qBCTW,8DAAgB,iBAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;qBAuBhB,kEAAoB,iBAAA,KAAA;;;;;qBAMpB,kEAAoB,iBAAA,KAAA;;;;;;;;;;qBASpB,kEAAoB,iBAAA,KAAA;;;IAK/B,KAAA;qBACW,kEAAoB,iBAAA,KAAA;;;IAQ/B,KAAA;qBACW,+DAAiB,iBAAA,KAAA;;IAK5B,KAAA"}
1
+ {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts","../src/types/webMcp.ts","../src/schemas/mcpApps.ts"],"mappings":";;;;qBAiDa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCvCI;EACf;EACA;EACA;EACA;EACA,cAAc;EACd;IACE;IACA;IACA;MAAe;OAAiB;;IAChC,OAAO;;EAET,MAAM;EACN;IAAU;IAAoB;IAA6B,QAAQ;IAAyB;;EAC5F;EACA;;;;qBCTW,8DAAgB,eAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;qBAuBhB,kEAAoB,eAAA,KAAA;;;;;qBAMpB,kEAAoB,eAAA,KAAA;;;;;;;;;;qBASpB,kEAAoB,eAAA,KAAA;;;IAK/B,KAAA;qBACW,kEAAoB,eAAA,KAAA;;;IAQ/B,KAAA;qBACW,+DAAiB,eAAA,KAAA;;IAK5B,KAAA"}
@@ -1,6 +1,6 @@
1
1
  import { defineApiContract, jsonApiResponses } from "@agimon-ai/po-core/apiContracts";
2
2
  import { Type } from "typebox";
3
- import { defineDoomPluginMethod } from "@agimon-ai/po-core/pluginProtocol";
3
+ import { definePoPluginMethod } from "@agimon-ai/po-core/pluginProtocol";
4
4
  //#region src/schemas/apiContracts.ts
5
5
  const S = Type.String();
6
6
  const N = Type.Number();
@@ -181,7 +181,7 @@ const Address = {
181
181
  scope: "session",
182
182
  direction: "client-to-server"
183
183
  };
184
- const mcpAppOpenMethod = defineDoomPluginMethod({
184
+ const mcpAppOpenMethod = definePoPluginMethod({
185
185
  ...Address,
186
186
  method: "open",
187
187
  input: Type.Object({ toolCallId: Type.String({
@@ -206,13 +206,13 @@ const mcpAppOpenMethod = defineDoomPluginMethod({
206
206
  readOnly: Type.Boolean()
207
207
  })
208
208
  });
209
- const mcpAppActivateMethod = defineDoomPluginMethod({
209
+ const mcpAppActivateMethod = definePoPluginMethod({
210
210
  ...Address,
211
211
  method: "activate",
212
212
  input: Type.Object({ leaseId: Lease }, { additionalProperties: false }),
213
213
  output: Type.Object({ readOnly: Type.Literal(false) })
214
214
  });
215
- const mcpAppCallToolMethod = defineDoomPluginMethod({
215
+ const mcpAppCallToolMethod = definePoPluginMethod({
216
216
  ...Address,
217
217
  method: "callTool",
218
218
  input: Type.Object({
@@ -225,7 +225,7 @@ const mcpAppCallToolMethod = defineDoomPluginMethod({
225
225
  }, { additionalProperties: false }),
226
226
  output: Result
227
227
  });
228
- const mcpAppSetStateMethod = defineDoomPluginMethod({
228
+ const mcpAppSetStateMethod = definePoPluginMethod({
229
229
  ...Address,
230
230
  method: "setState",
231
231
  input: Type.Object({
@@ -234,7 +234,7 @@ const mcpAppSetStateMethod = defineDoomPluginMethod({
234
234
  }, { additionalProperties: false }),
235
235
  output: Empty
236
236
  });
237
- const mcpAppFollowUpMethod = defineDoomPluginMethod({
237
+ const mcpAppFollowUpMethod = definePoPluginMethod({
238
238
  ...Address,
239
239
  method: "followUp",
240
240
  input: Type.Object({
@@ -246,7 +246,7 @@ const mcpAppFollowUpMethod = defineDoomPluginMethod({
246
246
  }, { additionalProperties: false }),
247
247
  output: Empty
248
248
  });
249
- const mcpAppCloseMethod = defineDoomPluginMethod({
249
+ const mcpAppCloseMethod = definePoPluginMethod({
250
250
  ...Address,
251
251
  method: "close",
252
252
  input: Type.Object({ leaseId: Lease }, { additionalProperties: false }),
@@ -1 +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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"}
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 { definePoPluginMethod } 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 = definePoPluginMethod({\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 = definePoPluginMethod({\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 = definePoPluginMethod({\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 = definePoPluginMethod({\n ...Address,\n method: 'setState',\n input: Type.Object({ leaseId: Lease, state: Type.Unknown() }, { additionalProperties: false }),\n output: Empty,\n});\nexport const mcpAppFollowUpMethod = definePoPluginMethod({\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 = definePoPluginMethod({\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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"}
@@ -1 +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"}
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 PoMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction McpUseMcpWidget(props: PoMcpWidgetProps) {\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 PoMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction SessionMcpMcpWidget(props: PoMcpWidgetProps) {\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 { PoMcpWidgetProps } 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<PoMcpWidgetProps>>> = {\n \"@agimon-ai/po-mcp/mcp_use\": Widget0,\n \"@agimon-ai/po-mcp/session_mcp\": Widget1,\n};\n"],"mappings":";;;;AAGA,SAAS,gBAAgB,OAAyB;CAChD,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,OAAyB;CACpD,OACE,oBAAC,cAAD;EAAc,GAAI;EAAO,OAAO,MAAM;EACpC,UAAA,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA;CAC1B,CAAA;AAElB;;;ACHA,MAAa,UAAqE;CAChF,6BAA6BA;CAC7B,iCDGa,gBAAgB,mBCHIC;AACnC"}
@@ -10,12 +10,12 @@ let typebox = require("typebox");
10
10
  //#region src/extensions/workspaces/sessions/(backend)/skill/po-use-mcp.mcp.ts
11
11
  var po_use_mcp_mcp_default = (0, _agimon_ai_po_core_mcpFacet.defineMcpSkill)({
12
12
  name: "po-use-mcp",
13
- description: "Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.",
13
+ description: "Use Po Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.",
14
14
  read: () => (0, _agimon_ai_po_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-use-mcp/SKILL.md")
15
15
  });
16
16
  //#endregion
17
17
  //#region src/services/mcpHeadlessTools/index.ts
18
- const MCP_HEADLESS_TOOLS_SERVICE = "doom/mcp-headless-tools";
18
+ const MCP_HEADLESS_TOOLS_SERVICE = "po/mcp-headless-tools";
19
19
  function bindMcpHeadlessTool(context, name) {
20
20
  const tool = context.services.get(MCP_HEADLESS_TOOLS_SERVICE)?.get(name);
21
21
  if (!tool) throw new Error(`MCP tool is unavailable: ${name}`);
@@ -40,7 +40,7 @@ typebox.Type.Object({
40
40
  });
41
41
  //#endregion
42
42
  //#region src/services/mcpSessionTools/index.ts
43
- const MCP_SESSION_TOOLS_SERVICE = "doom/mcp-session-tools";
43
+ const MCP_SESSION_TOOLS_SERVICE = "po/mcp-session-tools";
44
44
  //#endregion
45
45
  //#region src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts
46
46
  var session_mcp_mcp_default = (0, _agimon_ai_po_core_extensionFile.defineRoutedContribution)((context) => {
@@ -1 +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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"}
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 Po 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 { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nexport const MCP_HEADLESS_TOOLS_SERVICE = 'po/mcp-headless-tools';\n\nexport interface McpHeadlessToolCatalog {\n get(name: string): PoHeadlessTool | undefined;\n}\n\nexport function mountMcpHeadlessTools(tools: readonly PoHeadlessTool[]) {\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: PoMcpPluginContext, name: string): PoHeadlessTool {\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 PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => bindMcpHeadlessTool(context, 'mcp_use'));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => 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 { PoChildSessionMcpCatalog, PoChildSessionMcpTool } from '@agimon-ai/po-core/childSession';\nimport type { PoHeadlessTool, PoHeadlessToolResult } 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 = 'po/mcp-session-tools';\n\n/** This projection needs no caller-owned execution context and can be borrowed unchanged. */\nexport interface McpDirectTool extends PoHeadlessTool {\n execute(toolCallId: string, parameters: unknown, signal?: AbortSignal): Promise<PoHeadlessToolResult>;\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<PoHeadlessToolResult>;\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: (parameters: Static<typeof McpHeadlessToolParameters>, signal?: AbortSignal) => Promise<PoHeadlessToolResult>,\n catalog?: PoChildSessionMcpCatalog,\n): PoChildSessionMcpTool {\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 { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } 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: PoMcpPluginContext): readonly PoHeadlessTool[] => {\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 PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => bindMcpHeadlessTool(context, 'share_file'));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } 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(): PoMcpSessionPlugin['skills'] { return [at(skillPoUseMcp, context)]; },\n get tools(): PoMcpSessionPlugin['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 PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;;;;AAGA,IAAA,0BAAA,GAAeA,4BAAAA,eAAAA,CAAe;CAC5B,MAAM;CACN,aACE;CACF,aAAA,GAAYC,+BAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,iCAAiC;AACpF,CAAC;;;ACJD,MAAa,6BAA6B;AAgB1C,SAAgB,oBAAoB,SAA6B,MAA8B;CAC7F,MAAM,OAAO,QAAQ,SAAS,IAA4B,0BAA0B,CAAC,EAAE,IAAI,IAAI;CAC/F,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,4BAA4B,MAAM;CAC7D,OAAO;EACL,GAAG;EACH,QAAQ,YAAY,YAAY,QAAQ,UAAU;GAChD,MAAM,kBAAkB,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC;GAClF,OAAO,KAAK,QAAQ,YAAY,YAAY,iBAAiB,UAAU,QAAQ,SAAS;EAC1F;CACF;AACF;;;AC1BA,IAAA,uBAAA,GAAeC,4BAAAA,cAAAA,EAAe,YAAgC,oBAAoB,SAAS,SAAS,CAAC;;;ACArG,IAAA,yBAAA,GAAeC,4BAAAA,cAAAA,EAAe,YAAgC,oBAAoB,SAAS,WAAW,CAAC;ACF9DC,QAAAA,KAAK,OAAO;CACnD,QAAQA,QAAAA,KAAK,OAAO,EAAE,WAAW,EAAE,CAAC;CACpC,MAAMA,QAAAA,KAAK,OAAO,EAAE,WAAW,EAAE,CAAC;CAClC,WAAWA,QAAAA,KAAK,SAASA,QAAAA,KAAK,OAAOA,QAAAA,KAAK,OAAO,GAAGA,QAAAA,KAAK,QAAQ,CAAC,CAAC;AACrE,CAAC;;;ACKD,MAAa,4BAA4B;;;ACDzC,IAAA,2BAAA,GAAeC,iCAAAA,yBAAAA,EACZ,YAA2D;CAC1D,MAAM,UAAU,QAAQ,SAAS,IAA4B,yBAAyB;CACtF,IAAI,CAAC,SAAS,OAAO,CAAC;CACtB,IAAI,UAAoC,CAAC;CACzC,MAAM,OAAO,QAAQ,eAAe;EAClC,MAAM,OAAO,QAAQ,QAAQ;EAC7B,IAAI,KAAK,WAAW,QAAQ,UAAU,KAAK,OAAO,MAAM,UAAU,SAAS,QAAQ,MAAM,GAAG;EAC5F,UAAU;EACV,QAAQ,QAAQ;CAClB,CAAC;CACD,UAAU,QAAQ,QAAQ;CAC1B,QAAQ,OAAO,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;CAC7D,OAAO,QAAQ,KAAK,UAAU;EAC5B,GAAG;EACH,UAAU,YAAY,YAAY,WAChC,KAAK,QAAQ,YAAY,YAAY,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,CAAC;CACpG,EAAE;AACJ,GACA,EAAE,aAAa,OAAO,CACxB;;;AC1BA,IAAA,0BAAA,GAAeC,4BAAAA,cAAAA,EAAe,YAAgC,oBAAoB,SAAS,YAAY,CAAC;;;ACMxG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAM,QAAc,OAA6C,YAA6B;CAC5F,MAAM,WAAW,OAAO,UAAU,aAAc,MAA4B,OAAO,IAAI;CACvF,OAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAa;AAC5D;AACA,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAM,cAAiB,KAAa,UAAgB,UAAU,KAAA,IAAY,QAAS;CACjF,GAAG;CAAO,OAAO;EAAE,GAAI,MAA6B;GAAQ,cAAc;CAAI;AAChF;AAEA,MAAa,OAAA,GAAMC,4BAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa;EACrB,IAAI,SAAuC;GAAE,OAAO,CAAC,GAAGC,wBAAe,OAAO,CAAC;EAAG;EAClF,IAAI,QAAqC;GAAE,OAAO;IAAC,WAAW,6BAA6B,IAAI,EAAE,MAAM,UAAU,GAAG,GAAGC,qBAAY,OAAO,CAAC,CAAC;IAAG,IAAI,EAAE,MAAM,YAAY,GAAG,GAAGC,uBAAc,OAAO,CAAC;IAAG,GAAG,KAAKC,yBAAgB,OAAO,CAAC,CAAC,KAAK,SAAS,WAAW,iCAAiC,IAAI,CAAC;IAAG,IAAI,EAAE,MAAM,aAAa,GAAG,GAAGC,wBAAe,OAAO,CAAC;GAAC;EAAG;CACrW;AACF,CAAC"}
@@ -1,5 +1,5 @@
1
1
  //#region generated/mcp.d.ts
2
- export declare const mcp: import("@agimon-ai/po-core/mcpFacet").DoomMcpPluginDefinition;
2
+ export declare const mcp: import("@agimon-ai/po-core/mcpFacet").PoMcpPluginDefinition;
3
3
  //#endregion
4
4
  export { mcp as default };
5
5
  //# sourceMappingURL=mcp.d.mts.map
@@ -6,12 +6,12 @@ import { Type } from "typebox";
6
6
  //#region src/extensions/workspaces/sessions/(backend)/skill/po-use-mcp.mcp.ts
7
7
  var po_use_mcp_mcp_default = defineMcpSkill({
8
8
  name: "po-use-mcp",
9
- description: "Use Doom Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.",
9
+ description: "Use Po Pi MCP to inspect domain-scoped servers, authenticate, reload configuration, and troubleshoot tool availability.",
10
10
  read: () => readPackageResource(import.meta.url, "src/prompts/po-use-mcp/SKILL.md")
11
11
  });
12
12
  //#endregion
13
13
  //#region src/services/mcpHeadlessTools/index.ts
14
- const MCP_HEADLESS_TOOLS_SERVICE = "doom/mcp-headless-tools";
14
+ const MCP_HEADLESS_TOOLS_SERVICE = "po/mcp-headless-tools";
15
15
  function bindMcpHeadlessTool(context, name) {
16
16
  const tool = context.services.get(MCP_HEADLESS_TOOLS_SERVICE)?.get(name);
17
17
  if (!tool) throw new Error(`MCP tool is unavailable: ${name}`);
@@ -36,7 +36,7 @@ Type.Object({
36
36
  });
37
37
  //#endregion
38
38
  //#region src/services/mcpSessionTools/index.ts
39
- const MCP_SESSION_TOOLS_SERVICE = "doom/mcp-session-tools";
39
+ const MCP_SESSION_TOOLS_SERVICE = "po/mcp-session-tools";
40
40
  //#endregion
41
41
  //#region src/extensions/workspaces/sessions/(backend)/tool/session_mcp.mcp.ts
42
42
  var session_mcp_mcp_default = defineRoutedContribution((context) => {
@@ -1 +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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"}
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 Po 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 { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nexport const MCP_HEADLESS_TOOLS_SERVICE = 'po/mcp-headless-tools';\n\nexport interface McpHeadlessToolCatalog {\n get(name: string): PoHeadlessTool | undefined;\n}\n\nexport function mountMcpHeadlessTools(tools: readonly PoHeadlessTool[]) {\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: PoMcpPluginContext, name: string): PoHeadlessTool {\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 PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => bindMcpHeadlessTool(context, 'mcp_use'));\n","import { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => 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 { PoChildSessionMcpCatalog, PoChildSessionMcpTool } from '@agimon-ai/po-core/childSession';\nimport type { PoHeadlessTool, PoHeadlessToolResult } 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 = 'po/mcp-session-tools';\n\n/** This projection needs no caller-owned execution context and can be borrowed unchanged. */\nexport interface McpDirectTool extends PoHeadlessTool {\n execute(toolCallId: string, parameters: unknown, signal?: AbortSignal): Promise<PoHeadlessToolResult>;\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<PoHeadlessToolResult>;\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: (parameters: Static<typeof McpHeadlessToolParameters>, signal?: AbortSignal) => Promise<PoHeadlessToolResult>,\n catalog?: PoChildSessionMcpCatalog,\n): PoChildSessionMcpTool {\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 { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } 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: PoMcpPluginContext): readonly PoHeadlessTool[] => {\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 PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { bindMcpHeadlessTool } from '../../../../../services/mcpHeadlessTools';\n\nexport default defineMcpTool((context: PoMcpPluginContext) => bindMcpHeadlessTool(context, 'share_file'));\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } 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(): PoMcpSessionPlugin['skills'] { return [at(skillPoUseMcp, context)]; },\n get tools(): PoMcpSessionPlugin['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 PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}