@agimon-ai/doompi-mcp 0.0.1-alpha.93 → 0.0.1-alpha.95

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.
@@ -66,11 +66,45 @@ const McpAuthorizationSchema = typebox.Type.Object({
66
66
  error: O(S),
67
67
  expiresAt: N
68
68
  });
69
+ const McpSessionToolSchema = typebox.Type.Object({
70
+ server: S,
71
+ tool: S,
72
+ description: O(S),
73
+ inputSchema: typebox.Type.Record(S, typebox.Type.Unknown()),
74
+ tokens: N
75
+ });
76
+ const SessionToolQuery = [{
77
+ name: "server",
78
+ in: "query",
79
+ required: true,
80
+ schema: typebox.Type.String({
81
+ minLength: 1,
82
+ maxLength: 160
83
+ })
84
+ }, {
85
+ name: "tool",
86
+ in: "query",
87
+ required: true,
88
+ schema: typebox.Type.String({
89
+ minLength: 1,
90
+ maxLength: 256
91
+ })
92
+ }];
69
93
  const apiContracts = (0, _agimon_ai_doompi_core_apiContracts.defineApiContract)({
70
94
  version: 1,
71
95
  sockets: [],
72
96
  dynamic: [],
73
- http: ["global", "workspace"].flatMap((scope) => [
97
+ http: [{
98
+ id: "mcp.session.tool",
99
+ scope: "session",
100
+ basePath: "mcp-session",
101
+ path: "/tool",
102
+ method: "GET",
103
+ authentication: "owner",
104
+ description: "Read one tool the session reaches through mcp_use: its description, schema, and token cost.",
105
+ parameters: SessionToolQuery,
106
+ responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(McpSessionToolSchema)
107
+ }, ...["global", "workspace"].flatMap((scope) => [
74
108
  {
75
109
  id: "mcp.catalog",
76
110
  scope,
@@ -129,7 +163,7 @@ const apiContracts = (0, _agimon_ai_doompi_core_apiContracts.defineApiContract)(
129
163
  parameters: RepositoryQuery,
130
164
  responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(McpAuthorizationSchema)
131
165
  }))
132
- ])
166
+ ])]
133
167
  });
134
168
  //#endregion
135
169
  exports.apiContracts = apiContracts;
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-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({ pattern: '^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$' });\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 apiContracts = defineApiContract({\n version: 1,\n sockets: [],\n dynamic: [],\n http: (['global', 'workspace'] as const).flatMap((scope) => [\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({ repositoryId: RepositoryId, serverName: Type.String({ minLength: 1, maxLength: 160 }) }),\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});\nexport default apiContracts;\n"],"mappings":";;;;;;;AAGA,MAAM,IAAIA,QAAAA,KAAK,OAAO;AACtB,MAAM,IAAIA,QAAAA,KAAK,OAAO;AACtB,MAAM,IAAIA,QAAAA,KAAK,QAAQ;AACvB,MAAM,IAAIA,QAAAA,KAAK;AACf,MAAM,YAA8B,WAAgBA,QAAAA,KAAK,MAAM,OAAO,KAAK,UAAUA,QAAAA,KAAK,QAAQ,KAAK,CAAC,CAAC;AACzG,MAAM,eAAeA,QAAAA,KAAK,OAAO,EAAE,SAAS,4CAA4C,CAAC;AACzF,MAAM,kBAAkB,CAAC;CAAE,MAAM;CAAgB,IAAI;CAAkB,UAAU;CAAM,QAAQ;AAAa,CAAC;AAC7G,MAAa,mBAAmBA,QAAAA,KAAK,OAAO;CAC1C,cAAc;CACd,MAAMA,QAAAA,KAAK,OAAO;EAAE,OAAO;EAAG,SAASA,QAAAA,KAAK,MAAM,CAAC;CAAE,CAAC;CACtD,SAASA,QAAAA,KAAK,MACZA,QAAAA,KAAK,OAAO;EACV,MAAM;EACN,OAAO,SAAS;GAAC;GAAiB;GAAc;GAAa;GAAY;GAAc;GAAU;EAAQ,CAAC;EAC1G,QAAQ,SAAS;GAAC;GAAU;GAAQ;EAAY,CAAC;EACjD,mBAAmB;EACnB,OAAOA,QAAAA,KAAK,MAAMA,QAAAA,KAAK,OAAO;GAAE,MAAM;GAAG,QAAQ;GAAG,aAAa,EAAE,CAAC;EAAE,CAAC,CAAC;EACxE,OAAO,EAAE,CAAC;CACZ,CAAC,CACH;CACA,gBAAgBA,QAAAA,KAAK,MAAM,CAAC;CAC5B,aAAaA,QAAAA,KAAK,MAAM,CAAC;AAC3B,CAAC;AACD,MAAa,yBAAyBA,QAAAA,KAAK,OAAO;CAChD,IAAI;CACJ,cAAc;CACd,YAAY;CACZ,QAAQ,SAAS;EAAC;EAAY;EAAW;EAAa;EAAU;EAAa;CAAS,CAAC;CACvF,kBAAkB,EAAE,CAAC;CACrB,OAAO,EAAE,CAAC;CACV,WAAW;AACb,CAAC;AACD,MAAa,gBAAA,GAAeC,oCAAAA,kBAAAA,CAAkB;CAC5C,SAAS;CACT,SAAS,CAAC;CACV,SAAS,CAAC;CACV,MAAO,CAAC,UAAU,WAAW,CAAC,CAAW,SAAS,UAAU;EAC1D;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,YAAY;GACZ,YAAA,GAAWC,oCAAAA,iBAAAA,CAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IAAE,UAAU;IAAM,aAAa;IAAoB,QAAQF,QAAAA,KAAK,OAAO,EAAE,cAAc,aAAa,CAAC;GAAE;GAC7G,YAAA,GAAWE,oCAAAA,iBAAAA,CAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IACJ,UAAU;IACV,aAAa;IACb,QAAQF,QAAAA,KAAK,OAAO;KAAE,cAAc;KAAc,YAAYA,QAAAA,KAAK,OAAO;MAAE,WAAW;MAAG,WAAW;KAAI,CAAC;IAAE,CAAC;GAC/G;GACA,YAAA,GAAWE,oCAAAA,iBAAAA,CAAiB,wBAAwB,GAAG;EACzD;EACA,GAAI,CAAC,OAAO,QAAQ,CAAC,CAAW,KAAK,YAAY;GAC/C,IAAI,qBAAqB;GACzB;GACA,UAAU;GACV,MAAM;GACN;GACA,gBAAgB;GAChB,aAAa,WAAW,QAAQ,gCAAgC;GAChE,YAAY;GACZ,YAAA,GAAWA,oCAAAA,iBAAAA,CAAiB,sBAAsB;EACpD,EAAE;CACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-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({ pattern: '^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$' });\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"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBAmCa"}
1
+ {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBA+Ca"}
@@ -62,11 +62,45 @@ const McpAuthorizationSchema = Type.Object({
62
62
  error: O(S),
63
63
  expiresAt: N
64
64
  });
65
+ const McpSessionToolSchema = Type.Object({
66
+ server: S,
67
+ tool: S,
68
+ description: O(S),
69
+ inputSchema: Type.Record(S, Type.Unknown()),
70
+ tokens: N
71
+ });
72
+ const SessionToolQuery = [{
73
+ name: "server",
74
+ in: "query",
75
+ required: true,
76
+ schema: Type.String({
77
+ minLength: 1,
78
+ maxLength: 160
79
+ })
80
+ }, {
81
+ name: "tool",
82
+ in: "query",
83
+ required: true,
84
+ schema: Type.String({
85
+ minLength: 1,
86
+ maxLength: 256
87
+ })
88
+ }];
65
89
  const apiContracts = defineApiContract({
66
90
  version: 1,
67
91
  sockets: [],
68
92
  dynamic: [],
69
- http: ["global", "workspace"].flatMap((scope) => [
93
+ http: [{
94
+ id: "mcp.session.tool",
95
+ scope: "session",
96
+ basePath: "mcp-session",
97
+ path: "/tool",
98
+ method: "GET",
99
+ authentication: "owner",
100
+ description: "Read one tool the session reaches through mcp_use: its description, schema, and token cost.",
101
+ parameters: SessionToolQuery,
102
+ responses: jsonApiResponses(McpSessionToolSchema)
103
+ }, ...["global", "workspace"].flatMap((scope) => [
70
104
  {
71
105
  id: "mcp.catalog",
72
106
  scope,
@@ -125,7 +159,7 @@ const apiContracts = defineApiContract({
125
159
  parameters: RepositoryQuery,
126
160
  responses: jsonApiResponses(McpAuthorizationSchema)
127
161
  }))
128
- ])
162
+ ])]
129
163
  });
130
164
  //#endregion
131
165
  export { apiContracts, apiContracts as default };
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-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({ pattern: '^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$' });\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 apiContracts = defineApiContract({\n version: 1,\n sockets: [],\n dynamic: [],\n http: (['global', 'workspace'] as const).flatMap((scope) => [\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({ repositoryId: RepositoryId, serverName: Type.String({ minLength: 1, maxLength: 160 }) }),\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});\nexport default apiContracts;\n"],"mappings":";;;AAGA,MAAM,IAAI,KAAK,OAAO;AACtB,MAAM,IAAI,KAAK,OAAO;AACtB,MAAM,IAAI,KAAK,QAAQ;AACvB,MAAM,IAAI,KAAK;AACf,MAAM,YAA8B,WAAgB,KAAK,MAAM,OAAO,KAAK,UAAU,KAAK,QAAQ,KAAK,CAAC,CAAC;AACzG,MAAM,eAAe,KAAK,OAAO,EAAE,SAAS,4CAA4C,CAAC;AACzF,MAAM,kBAAkB,CAAC;CAAE,MAAM;CAAgB,IAAI;CAAkB,UAAU;CAAM,QAAQ;AAAa,CAAC;AAC7G,MAAa,mBAAmB,KAAK,OAAO;CAC1C,cAAc;CACd,MAAM,KAAK,OAAO;EAAE,OAAO;EAAG,SAAS,KAAK,MAAM,CAAC;CAAE,CAAC;CACtD,SAAS,KAAK,MACZ,KAAK,OAAO;EACV,MAAM;EACN,OAAO,SAAS;GAAC;GAAiB;GAAc;GAAa;GAAY;GAAc;GAAU;EAAQ,CAAC;EAC1G,QAAQ,SAAS;GAAC;GAAU;GAAQ;EAAY,CAAC;EACjD,mBAAmB;EACnB,OAAO,KAAK,MAAM,KAAK,OAAO;GAAE,MAAM;GAAG,QAAQ;GAAG,aAAa,EAAE,CAAC;EAAE,CAAC,CAAC;EACxE,OAAO,EAAE,CAAC;CACZ,CAAC,CACH;CACA,gBAAgB,KAAK,MAAM,CAAC;CAC5B,aAAa,KAAK,MAAM,CAAC;AAC3B,CAAC;AACD,MAAa,yBAAyB,KAAK,OAAO;CAChD,IAAI;CACJ,cAAc;CACd,YAAY;CACZ,QAAQ,SAAS;EAAC;EAAY;EAAW;EAAa;EAAU;EAAa;CAAS,CAAC;CACvF,kBAAkB,EAAE,CAAC;CACrB,OAAO,EAAE,CAAC;CACV,WAAW;AACb,CAAC;AACD,MAAa,eAAe,kBAAkB;CAC5C,SAAS;CACT,SAAS,CAAC;CACV,SAAS,CAAC;CACV,MAAO,CAAC,UAAU,WAAW,CAAC,CAAW,SAAS,UAAU;EAC1D;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,YAAY;GACZ,WAAW,iBAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IAAE,UAAU;IAAM,aAAa;IAAoB,QAAQ,KAAK,OAAO,EAAE,cAAc,aAAa,CAAC;GAAE;GAC7G,WAAW,iBAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IACJ,UAAU;IACV,aAAa;IACb,QAAQ,KAAK,OAAO;KAAE,cAAc;KAAc,YAAY,KAAK,OAAO;MAAE,WAAW;MAAG,WAAW;KAAI,CAAC;IAAE,CAAC;GAC/G;GACA,WAAW,iBAAiB,wBAAwB,GAAG;EACzD;EACA,GAAI,CAAC,OAAO,QAAQ,CAAC,CAAW,KAAK,YAAY;GAC/C,IAAI,qBAAqB;GACzB;GACA,UAAU;GACV,MAAM;GACN;GACA,gBAAgB;GAChB,aAAa,WAAW,QAAQ,gCAAgC;GAChE,YAAY;GACZ,WAAW,iBAAiB,sBAAsB;EACpD,EAAE;CACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-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({ pattern: '^(?:[a-f0-9]{32}|repo-[A-Za-z0-9_-]{24})$' });\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"],"mappings":";;;AAGA,MAAM,IAAI,KAAK,OAAO;AACtB,MAAM,IAAI,KAAK,OAAO;AACtB,MAAM,IAAI,KAAK,QAAQ;AACvB,MAAM,IAAI,KAAK;AACf,MAAM,YAA8B,WAAgB,KAAK,MAAM,OAAO,KAAK,UAAU,KAAK,QAAQ,KAAK,CAAC,CAAC;AACzG,MAAM,eAAe,KAAK,OAAO,EAAE,SAAS,4CAA4C,CAAC;AACzF,MAAM,kBAAkB,CAAC;CAAE,MAAM;CAAgB,IAAI;CAAkB,UAAU;CAAM,QAAQ;AAAa,CAAC;AAC7G,MAAa,mBAAmB,KAAK,OAAO;CAC1C,cAAc;CACd,MAAM,KAAK,OAAO;EAAE,OAAO;EAAG,SAAS,KAAK,MAAM,CAAC;CAAE,CAAC;CACtD,SAAS,KAAK,MACZ,KAAK,OAAO;EACV,MAAM;EACN,OAAO,SAAS;GAAC;GAAiB;GAAc;GAAa;GAAY;GAAc;GAAU;EAAQ,CAAC;EAC1G,QAAQ,SAAS;GAAC;GAAU;GAAQ;EAAY,CAAC;EACjD,mBAAmB;EACnB,OAAO,KAAK,MAAM,KAAK,OAAO;GAAE,MAAM;GAAG,QAAQ;GAAG,aAAa,EAAE,CAAC;EAAE,CAAC,CAAC;EACxE,OAAO,EAAE,CAAC;CACZ,CAAC,CACH;CACA,gBAAgB,KAAK,MAAM,CAAC;CAC5B,aAAa,KAAK,MAAM,CAAC;AAC3B,CAAC;AACD,MAAa,yBAAyB,KAAK,OAAO;CAChD,IAAI;CACJ,cAAc;CACd,YAAY;CACZ,QAAQ,SAAS;EAAC;EAAY;EAAW;EAAa;EAAU;EAAa;CAAS,CAAC;CACvF,kBAAkB,EAAE,CAAC;CACrB,OAAO,EAAE,CAAC;CACV,WAAW;AACb,CAAC;AACD,MAAa,uBAAuB,KAAK,OAAO;CAC9C,QAAQ;CACR,MAAM;CACN,aAAa,EAAE,CAAC;CAChB,aAAa,KAAK,OAAO,GAAG,KAAK,QAAQ,CAAC;CAC1C,QAAQ;AACV,CAAC;AACD,MAAM,mBAAmB,CACvB;CAAE,MAAM;CAAU,IAAI;CAAkB,UAAU;CAAM,QAAQ,KAAK,OAAO;EAAE,WAAW;EAAG,WAAW;CAAI,CAAC;AAAE,GAC9G;CAAE,MAAM;CAAQ,IAAI;CAAkB,UAAU;CAAM,QAAQ,KAAK,OAAO;EAAE,WAAW;EAAG,WAAW;CAAI,CAAC;AAAE,CAC9G;AAEA,MAAa,eAAe,kBAAkB;CAC5C,SAAS;CACT,SAAS,CAAC;CACV,SAAS,CAAC;CACV,MAAM,CACJ;EACE,IAAI;EACJ,OAAO;EACP,UAAU;EACV,MAAM;EACN,QAAQ;EACR,gBAAgB;EAChB,aAAa;EACb,YAAY;EACZ,WAAW,iBAAiB,oBAAoB;CAClD,GACA,GAAI,CAAC,UAAU,WAAW,CAAC,CAAW,SAAS,UAA0B;EACvE;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,YAAY;GACZ,WAAW,iBAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IAAE,UAAU;IAAM,aAAa;IAAoB,QAAQ,KAAK,OAAO,EAAE,cAAc,aAAa,CAAC;GAAE;GAC7G,WAAW,iBAAiB,gBAAgB;EAC9C;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,MAAM;IACJ,UAAU;IACV,aAAa;IACb,QAAQ,KAAK,OAAO;KAClB,cAAc;KACd,YAAY,KAAK,OAAO;MAAE,WAAW;MAAG,WAAW;KAAI,CAAC;IAC1D,CAAC;GACH;GACA,WAAW,iBAAiB,wBAAwB,GAAG;EACzD;EACA,GAAI,CAAC,OAAO,QAAQ,CAAC,CAAW,KAAK,YAAY;GAC/C,IAAI,qBAAqB;GACzB;GACA,UAAU;GACV,MAAM;GACN;GACA,gBAAgB;GAChB,aAAa,WAAW,QAAQ,gCAAgC;GAChE,YAAY;GACZ,WAAW,iBAAiB,sBAAsB;EACpD,EAAE;CACJ,CAAC,CACH;AACF,CAAC"}
@@ -5,7 +5,7 @@ Object.defineProperties(exports, {
5
5
  const require_rolldown_runtime = require("../rolldown-runtime-C0BPl7ul.cjs");
6
6
  const require_mcpCatalog = require("../mcpCatalog-Bnkul3t_.cjs");
7
7
  const require_projection = require("../projection-w3XxXmVi.cjs");
8
- const require_mcpCommand = require("../mcpCommand-BARs6Y1N.cjs");
8
+ const require_mcpCommand = require("../mcpCommand-CGYkV5hK.cjs");
9
9
  let node_path = require("node:path");
10
10
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
11
11
  let _agimon_ai_doompi_core_mcpProjection = require("@agimon-ai/doompi-core/mcpProjection");
@@ -1,6 +1,6 @@
1
1
  import { a as readSessionConfig } from "../mcpCatalog-laXfwecc.mjs";
2
2
  import { t as mcpSessionConfigFromProjection } from "../projection-gyAA2jRB.mjs";
3
- import { _ as LEADER_BINDING_PREFIX, a as createMcpSessionToolsService, b as MCP_STATUS_KEY, g as createMcpTool, h as McpSession, i as createMcpChildTool, m as formatMcpSessionAuthStatus, p as MCP_SESSION_AUTH_STATUS_KEY, r as MCP_SESSION_TOOLS_SERVICE, t as createMcpCommand, v as LEADER_DETAIL, x as PACKAGE_SOURCE, y as LEADER_GROUP } from "../mcpCommand-BaJXXphd.mjs";
3
+ import { C as MCP_STATUS_KEY, S as LEADER_GROUP, _ as formatMcpSessionAuthStatus, a as createMcpSessionToolsService, b as LEADER_BINDING_PREFIX, i as createMcpChildTool, p as MCP_SESSION_AUTH_STATUS_KEY, r as MCP_SESSION_TOOLS_SERVICE, t as createMcpCommand, v as McpSession, w as PACKAGE_SOURCE, x as LEADER_DETAIL, y as createMcpTool } from "../mcpCommand-DlUGMhht.mjs";
4
4
  import path from "node:path";
5
5
  import { DOOM_MCP_PROJECTION_SERVICE, readDoomMcpProjectionService } from "@agimon-ai/doompi-core/mcpProjection";
6
6
  import { definePiExtension, piToolContributions } from "@agimon-ai/doompi-core/piExtension";
@@ -5,7 +5,7 @@ Object.defineProperties(exports, {
5
5
  const require_rolldown_runtime = require("../rolldown-runtime-C0BPl7ul.cjs");
6
6
  const require_mcpCatalog = require("../mcpCatalog-Bnkul3t_.cjs");
7
7
  const require_projection = require("../projection-w3XxXmVi.cjs");
8
- const require_mcpCommand = require("../mcpCommand-BARs6Y1N.cjs");
8
+ const require_mcpCommand = require("../mcpCommand-CGYkV5hK.cjs");
9
9
  const require_keyringTokenStore = require("../keyringTokenStore-LBsDb_eC.cjs");
10
10
  let node_crypto = require("node:crypto");
11
11
  let node_fs = require("node:fs");
@@ -33,6 +33,60 @@ function mountMcpHeadlessTools(tools) {
33
33
  };
34
34
  }
35
35
  //#endregion
36
+ //#region src/services/mcpToolCost/index.ts
37
+ /**
38
+ * What one downstream tool would cost if it were added to the model's tool list directly: its
39
+ * name, description and input schema, priced the way the context panel prices every other tool.
40
+ */
41
+ function mcpToolTokens(tool, countTokens) {
42
+ return countTokens(JSON.stringify({
43
+ name: tool.piName,
44
+ ...tool.description === void 0 ? {} : { description: tool.description },
45
+ parameters: tool.inputSchema
46
+ }));
47
+ }
48
+ //#endregion
49
+ //#region src/services/mcpSessionApi/index.ts
50
+ const JSON_HEADERS$1 = { "content-type": "application/json" };
51
+ function json$1(body, status = 200) {
52
+ return new Response(JSON.stringify(body), {
53
+ status,
54
+ headers: JSON_HEADERS$1
55
+ });
56
+ }
57
+ /**
58
+ * This package's session mount, `mcp-session`: one reachable tool's description and schema.
59
+ *
60
+ * Read-only and bounded to the tools `mcp_use` accepts, so a page can inspect what the agent may
61
+ * call without the status line carrying every schema.
62
+ */
63
+ function createMcpSessionApi(source, countTokens) {
64
+ return {
65
+ basePath: "mcp-session",
66
+ start() {
67
+ return {
68
+ async fetch(request) {
69
+ const url = new URL(request.url);
70
+ if (request.method !== "GET" || url.pathname !== "/tool") return json$1({ error: "Not found." }, 404);
71
+ const server = url.searchParams.get("server") ?? "";
72
+ const name = url.searchParams.get("tool") ?? "";
73
+ if (!server || !name) return json$1({ error: "A tool is named by its server and tool name." }, 400);
74
+ const tool = source.activeToolDefinitions().find((candidate) => candidate.serverName === server && candidate.toolName === name);
75
+ if (!tool) return json$1({ error: `MCP tool ${server}/${name} is not available in this session.` }, 404);
76
+ return json$1({
77
+ server,
78
+ tool: name,
79
+ ...tool.description === void 0 ? {} : { description: tool.description },
80
+ inputSchema: tool.inputSchema,
81
+ tokens: mcpToolTokens(tool, await countTokens())
82
+ });
83
+ },
84
+ close: () => void 0
85
+ };
86
+ }
87
+ };
88
+ }
89
+ //#endregion
36
90
  //#region src/services/serverRuntime/index.ts
37
91
  function sessionConfiguration(execution, workspaceRoot) {
38
92
  if (workspaceRoot !== void 0) {
@@ -118,6 +172,23 @@ function createMcpServerRuntime(environment = {}, workspaceRoot, getResolver) {
118
172
  });
119
173
  return transition;
120
174
  };
175
+ let countTokens;
176
+ let tokenizer;
177
+ const loadTokenizer = () => {
178
+ tokenizer ??= import("gpt-tokenizer").then((module) => {
179
+ countTokens = module.countTokens;
180
+ return module.countTokens;
181
+ });
182
+ return tokenizer;
183
+ };
184
+ const toolTokens = /* @__PURE__ */ new Map();
185
+ /** Each reachable tool's schema cost, keyed by its registered name, once the tokenizer is loaded. */
186
+ const reachableTokens = () => {
187
+ if (countTokens === void 0) return toolTokens;
188
+ for (const tool of session.activeToolDefinitions()) if (!toolTokens.has(tool.piName)) toolTokens.set(tool.piName, mcpToolTokens(tool, countTokens));
189
+ return toolTokens;
190
+ };
191
+ const api = createMcpSessionApi(session, loadTokenizer);
121
192
  const activity = {
122
193
  name: "doompi-mcp-runtime",
123
194
  async start(execution) {
@@ -127,7 +198,17 @@ function createMcpServerRuntime(environment = {}, workspaceRoot, getResolver) {
127
198
  const reported = /* @__PURE__ */ new Set();
128
199
  const publish = () => {
129
200
  execution.client.setStatus(require_mcpCommand.MCP_STATUS_KEY, session.getServers().map((server) => server.name).join(","));
130
- execution.client.setStatus(require_mcpCommand.MCP_SESSION_AUTH_STATUS_KEY, require_mcpCommand.formatMcpSessionAuthStatus(session.getServers()));
201
+ const tokens = reachableTokens();
202
+ execution.client.setStatus(require_mcpCommand.MCP_SESSION_AUTH_STATUS_KEY, require_mcpCommand.formatMcpSessionAuthStatus(session.getServers().map((server) => ({
203
+ ...server,
204
+ tools: server.tools.map((tool) => {
205
+ const cost = tokens.get(tool.piName);
206
+ return cost === void 0 ? tool : {
207
+ ...tool,
208
+ tokens: cost
209
+ };
210
+ })
211
+ }))));
131
212
  for (const diagnostic of session.getDiagnostics()) {
132
213
  if (reported.has(diagnostic)) continue;
133
214
  reported.add(diagnostic);
@@ -138,7 +219,13 @@ function createMcpServerRuntime(environment = {}, workspaceRoot, getResolver) {
138
219
  });
139
220
  }
140
221
  };
141
- const stopPublishing = session.onChange(publish);
222
+ const stopPublishing = session.onChange(() => {
223
+ toolTokens.clear();
224
+ publish();
225
+ });
226
+ loadTokenizer().then(() => {
227
+ if (active === execution) publish();
228
+ });
142
229
  try {
143
230
  await refresh(execution, execution.selection);
144
231
  publish();
@@ -184,6 +271,7 @@ function createMcpServerRuntime(environment = {}, workspaceRoot, getResolver) {
184
271
  const childTool = require_mcpCommand.createMcpChildTool(invoke);
185
272
  return {
186
273
  session,
274
+ api: [api],
187
275
  activities: [activity],
188
276
  commands: [{
189
277
  name: "mcp",
@@ -719,6 +807,13 @@ var apiRoutes_default = (0, _agimon_ai_doompi_core_web.defineApiRoutes)({
719
807
  path: AUTHORIZATION_FLOW_PATH,
720
808
  query: [require_mcpCommand.MCP_REPOSITORY_ID_QUERY],
721
809
  response: (0, _agimon_ai_doompi_core_web.apiResponse)()
810
+ },
811
+ /** Session scope: one tool the session reaches through mcp_use, with its description and schema. */
812
+ sessionTool: {
813
+ method: "GET",
814
+ path: require_mcpCommand.MCP_SESSION_TOOL_API_PATH,
815
+ query: [require_mcpCommand.MCP_SESSION_TOOL_SERVER_QUERY, require_mcpCommand.MCP_SESSION_TOOL_NAME_QUERY],
816
+ response: (0, _agimon_ai_doompi_core_web.apiResponse)()
722
817
  }
723
818
  });
724
819
  //#endregion
@@ -842,7 +937,7 @@ async function handleAuthorizationFlow(request, context, path) {
842
937
  * the browser a client bound to the same segment, so the settings panel can no
843
938
  * longer spell a workspace mount by hand.
844
939
  */
845
- var route_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoute)({
940
+ var route_server_default$1 = (0, _agimon_ai_doompi_core_extensionFile.defineRoute)({
846
941
  basePath: "mcp",
847
942
  start(context) {
848
943
  return {
@@ -861,6 +956,10 @@ var route_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoute)
861
956
  }
862
957
  });
863
958
  //#endregion
959
+ //#region src/extensions/workspaces/sessions/(backend)/api/mcp-session/route.server.ts
960
+ /** Mounts the session's `mcp-session` API: the reachable tool detail the context panel opens. */
961
+ var route_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoute)((context) => context.root.api[0]);
962
+ //#endregion
864
963
  //#region src/extensions/workspaces/sessions/(backend)/command/mcp.server.ts
865
964
  var mcp_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineServerCommand)((context) => context.root.commands[0]);
866
965
  //#endregion
@@ -876,10 +975,10 @@ const via = (identity, value) => value === void 0 ? void 0 : {
876
975
  const facet = (0, _agimon_ai_doompi_core_serverFacet.defineServerPlugin)({
877
976
  name: "@agimon-ai/doompi-mcp",
878
977
  global: (context) => ({ get api() {
879
- return [at(route_server_default, context)];
978
+ return [at(route_server_default$1, context)];
880
979
  } }),
881
980
  workspace: (context) => ({ get api() {
882
- return [at(route_server_default, context)];
981
+ return [at(route_server_default$1, context)];
883
982
  } }),
884
983
  session: async (context) => {
885
984
  const scopeSession = await root_server_default(context);
@@ -890,7 +989,7 @@ const facet = (0, _agimon_ai_doompi_core_serverFacet.defineServerPlugin)({
890
989
  return {
891
990
  ...(0, _agimon_ai_doompi_core_extensionFile.composeRootHooks)(scopeSession),
892
991
  get api() {
893
- return [at(route_server_default, context)];
992
+ return [at(route_server_default$1, context), at(route_server_default, contextSession)];
894
993
  },
895
994
  get commands() {
896
995
  return [via({ name: "mcp" }, at(mcp_server_default, contextSession))];