@decocms/runtime 0.28.0 → 1.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config-schema.json +553 -0
- package/package.json +16 -77
- package/scripts/generate-json-schema.ts +24 -0
- package/src/asset-server/dev-server-proxy.ts +16 -0
- package/src/asset-server/index.ts +44 -0
- package/src/bindings/README.md +1 -1
- package/src/bindings/binder.ts +1 -1
- package/src/bindings/channels.ts +1 -1
- package/src/bindings/deconfig/resources.ts +47 -17
- package/src/bindings/deconfig/types.ts +1 -1
- package/src/bindings/index.ts +2 -0
- package/src/bindings/language-model/utils.ts +0 -91
- package/src/bindings/resources/bindings.ts +1 -1
- package/src/bindings/resources/schemas.ts +1 -1
- package/src/bindings/views.ts +1 -1
- package/src/bindings.ts +8 -7
- package/src/index.ts +5 -20
- package/src/mastra.ts +1 -229
- package/src/mcp.ts +7 -11
- package/src/proxy.ts +0 -8
- package/src/resources.ts +1 -1
- package/src/state.ts +1 -1
- package/src/views.ts +1 -1
- package/tsconfig.json +8 -0
- package/dist/admin.d.ts +0 -5
- package/dist/admin.js +0 -21
- package/dist/admin.js.map +0 -1
- package/dist/bindings/deconfig/index.d.ts +0 -12
- package/dist/bindings/deconfig/index.js +0 -10
- package/dist/bindings/deconfig/index.js.map +0 -1
- package/dist/bindings/index.d.ts +0 -2312
- package/dist/bindings/index.js +0 -135
- package/dist/bindings/index.js.map +0 -1
- package/dist/chunk-3AWMDSOH.js +0 -96
- package/dist/chunk-3AWMDSOH.js.map +0 -1
- package/dist/chunk-4XSQKJLU.js +0 -105
- package/dist/chunk-4XSQKJLU.js.map +0 -1
- package/dist/chunk-5EYZ2LVM.js +0 -158
- package/dist/chunk-5EYZ2LVM.js.map +0 -1
- package/dist/chunk-7ITSLORK.js +0 -128
- package/dist/chunk-7ITSLORK.js.map +0 -1
- package/dist/chunk-I7BWSAN6.js +0 -49
- package/dist/chunk-I7BWSAN6.js.map +0 -1
- package/dist/chunk-L4OT2YDO.js +0 -27
- package/dist/chunk-L4OT2YDO.js.map +0 -1
- package/dist/chunk-SHQSNOFL.js +0 -769
- package/dist/chunk-SHQSNOFL.js.map +0 -1
- package/dist/chunk-UHR3BLMF.js +0 -92
- package/dist/chunk-UHR3BLMF.js.map +0 -1
- package/dist/chunk-UIJGM3NV.js +0 -518
- package/dist/chunk-UIJGM3NV.js.map +0 -1
- package/dist/chunk-ZPUT6RN6.js +0 -32
- package/dist/chunk-ZPUT6RN6.js.map +0 -1
- package/dist/client.d.ts +0 -28
- package/dist/client.js +0 -5
- package/dist/client.js.map +0 -1
- package/dist/d1-store.d.ts +0 -9
- package/dist/d1-store.js +0 -4
- package/dist/d1-store.js.map +0 -1
- package/dist/drizzle.d.ts +0 -49
- package/dist/drizzle.js +0 -121
- package/dist/drizzle.js.map +0 -1
- package/dist/index-B7U9jXW4.d.ts +0 -530
- package/dist/index-uCMd27hU.d.ts +0 -471
- package/dist/index.d.ts +0 -10
- package/dist/index.js +0 -637
- package/dist/index.js.map +0 -1
- package/dist/mastra.d.ts +0 -10
- package/dist/mastra.js +0 -6
- package/dist/mastra.js.map +0 -1
- package/dist/mcp-DYmQ2RQf.d.ts +0 -105
- package/dist/mcp-client.d.ts +0 -232
- package/dist/mcp-client.js +0 -4
- package/dist/mcp-client.js.map +0 -1
- package/dist/proxy.d.ts +0 -11
- package/dist/proxy.js +0 -5
- package/dist/proxy.js.map +0 -1
- package/dist/resources.d.ts +0 -362
- package/dist/resources.js +0 -4
- package/dist/resources.js.map +0 -1
- package/dist/views.d.ts +0 -72
- package/dist/views.js +0 -4
- package/dist/views.js.map +0 -1
- package/src/bindings/language-model/ai-sdk.ts +0 -87
- package/src/bindings/language-model/index.ts +0 -4
- package/src/cf-imports.ts +0 -1
- package/src/d1-store.ts +0 -34
- package/src/deprecated.ts +0 -59
- package/src/workflow.ts +0 -193
package/dist/bindings/index.js
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { VIEW_BINDING, CHANNEL_BINDING, ResourceUriSchema } from '../chunk-SHQSNOFL.js';
|
|
2
|
-
export { CHANNEL_BINDING, ChannelBinding, DeleteInputSchema, DeleteOutputSchema, DescribeInputSchema, DescribeOutputSchema, ReadInputSchema, ResourceUriSchema, SearchInputSchema, VIEW_BINDING, ViewBinding, bindingClient, createCreateInputSchema, createCreateOutputSchema, createDeconfigResource, createItemSchema, createReadOutputSchema, createResourceBindings, createSearchOutputSchema, createUpdateInputSchema, createUpdateOutputSchema, impl, listViewsSchema } from '../chunk-SHQSNOFL.js';
|
|
3
|
-
import '../chunk-5EYZ2LVM.js';
|
|
4
|
-
import '../chunk-3AWMDSOH.js';
|
|
5
|
-
export { ResourcePath, ResourceUri, getMetadataString as deconfigGetMetadataString, getMetadataValue as deconfigGetMetadataValue, normalizeDirectory as deconfigNormalizeDirectory } from '../chunk-UHR3BLMF.js';
|
|
6
|
-
import '../chunk-UIJGM3NV.js';
|
|
7
|
-
import '../chunk-L4OT2YDO.js';
|
|
8
|
-
import '../chunk-7ITSLORK.js';
|
|
9
|
-
import '../chunk-I7BWSAN6.js';
|
|
10
|
-
import { LANGUAGE_MODEL_BINDING } from '@decocms/bindings/llm';
|
|
11
|
-
import { z } from 'zod/v3';
|
|
12
|
-
|
|
13
|
-
// src/bindings/utils.ts
|
|
14
|
-
var Binding = (binderTools) => {
|
|
15
|
-
return {
|
|
16
|
-
isImplementedBy: (tools) => {
|
|
17
|
-
const requiredTools = binderTools.filter((tool) => !tool.opt).map(
|
|
18
|
-
(tool) => typeof tool.name === "string" ? new RegExp(`^${tool.name}$`) : tool.name
|
|
19
|
-
// regex match
|
|
20
|
-
);
|
|
21
|
-
return requiredTools.every(
|
|
22
|
-
(regexp) => tools.some((t) => regexp.test(t.name))
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
// src/bindings/resources/helpers.ts
|
|
29
|
-
function validateResourceUri(uri) {
|
|
30
|
-
try {
|
|
31
|
-
ResourceUriSchema.parse(uri);
|
|
32
|
-
return true;
|
|
33
|
-
} catch {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function parseResourceUri(uri) {
|
|
38
|
-
try {
|
|
39
|
-
const validated = ResourceUriSchema.parse(uri);
|
|
40
|
-
const match = validated.match(/^rsc:\/\/([^/]+)\/([^/]+)\/(.+)$/);
|
|
41
|
-
if (!match) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
return {
|
|
45
|
-
workspace: match[1],
|
|
46
|
-
project: match[2],
|
|
47
|
-
resourceId: match[3]
|
|
48
|
-
};
|
|
49
|
-
} catch {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
function constructResourceUri(workspace, project, resourceId) {
|
|
54
|
-
return `rsc://${workspace}/${project}/${resourceId}`;
|
|
55
|
-
}
|
|
56
|
-
var deconfigTools = [
|
|
57
|
-
{
|
|
58
|
-
name: "LIST_FILES",
|
|
59
|
-
inputSchema: z.object({
|
|
60
|
-
branch: z.string().optional(),
|
|
61
|
-
prefix: z.string().optional(),
|
|
62
|
-
select: z.array(z.string()).optional(),
|
|
63
|
-
includeContent: z.boolean().optional()
|
|
64
|
-
}),
|
|
65
|
-
outputSchema: z.object({
|
|
66
|
-
files: z.record(
|
|
67
|
-
z.string(),
|
|
68
|
-
z.object({
|
|
69
|
-
address: z.string(),
|
|
70
|
-
metadata: z.record(z.string(), z.any()),
|
|
71
|
-
sizeInBytes: z.number(),
|
|
72
|
-
mtime: z.number(),
|
|
73
|
-
ctime: z.number(),
|
|
74
|
-
content: z.string().optional()
|
|
75
|
-
})
|
|
76
|
-
),
|
|
77
|
-
count: z.number()
|
|
78
|
-
})
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
name: "READ_FILE",
|
|
82
|
-
inputSchema: z.object({
|
|
83
|
-
branch: z.string().optional(),
|
|
84
|
-
path: z.string(),
|
|
85
|
-
format: z.enum(["base64", "byteArray", "plainString", "json"]).optional()
|
|
86
|
-
}),
|
|
87
|
-
outputSchema: z.object({
|
|
88
|
-
content: z.any(),
|
|
89
|
-
address: z.string(),
|
|
90
|
-
metadata: z.record(z.any()),
|
|
91
|
-
mtime: z.number(),
|
|
92
|
-
ctime: z.number()
|
|
93
|
-
})
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
name: "PUT_FILE",
|
|
97
|
-
inputSchema: z.object({
|
|
98
|
-
branch: z.string().optional(),
|
|
99
|
-
path: z.string(),
|
|
100
|
-
content: z.union([
|
|
101
|
-
z.string(),
|
|
102
|
-
z.object({ base64: z.string() }),
|
|
103
|
-
z.array(z.number())
|
|
104
|
-
]),
|
|
105
|
-
metadata: z.record(z.any()).optional(),
|
|
106
|
-
expectedCtime: z.number().optional()
|
|
107
|
-
}),
|
|
108
|
-
outputSchema: z.object({
|
|
109
|
-
conflict: z.boolean().optional()
|
|
110
|
-
})
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
name: "DELETE_FILE",
|
|
114
|
-
inputSchema: z.object({
|
|
115
|
-
branch: z.string().optional(),
|
|
116
|
-
path: z.string()
|
|
117
|
-
}),
|
|
118
|
-
outputSchema: z.object({
|
|
119
|
-
deleted: z.boolean()
|
|
120
|
-
})
|
|
121
|
-
}
|
|
122
|
-
];
|
|
123
|
-
|
|
124
|
-
// src/bindings/index.ts
|
|
125
|
-
var WellKnownBindings = {
|
|
126
|
-
Channel: CHANNEL_BINDING,
|
|
127
|
-
View: VIEW_BINDING,
|
|
128
|
-
LanguageModel: LANGUAGE_MODEL_BINDING
|
|
129
|
-
// Note: Resources is not included here since it's a generic function
|
|
130
|
-
// Use createResourceBindings(dataSchema) directly for Resources 2.0
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
export { Binding, WellKnownBindings, constructResourceUri, deconfigTools, parseResourceUri, validateResourceUri };
|
|
134
|
-
//# sourceMappingURL=index.js.map
|
|
135
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bindings/utils.ts","../../src/bindings/resources/helpers.ts","../../src/bindings/deconfig/types.ts","../../src/bindings/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ToolBinder } from \"../mcp.ts\";\n\nexport const Binding = <TDefinition extends readonly ToolBinder[]>(\n binderTools: TDefinition,\n) => {\n return {\n isImplementedBy: (tools: Pick<ToolBinder, \"name\">[]) => {\n const requiredTools = binderTools\n .filter((tool) => !tool.opt)\n .map(\n (tool) =>\n typeof tool.name === \"string\"\n ? new RegExp(`^${tool.name}$`) // exact match\n : (tool.name as RegExp), // regex match\n );\n\n return requiredTools.every((regexp) =>\n tools.some((t) => regexp.test(t.name)),\n );\n },\n };\n};\n","import {\n ResourceUriSchema,\n type CreateInput,\n type CreateOutput,\n type DeleteInput,\n type DeleteOutput,\n type ReadInput,\n type ReadOutput,\n type SearchInput,\n type SearchOutput,\n} from \"./schemas.ts\";\n\n/**\n * Resources 2.0 Helper Functions\n *\n * This module provides helper functions for working with Resources 2.0\n * URI format and validation.\n *\n * Key Features:\n * - URI validation and parsing utilities\n * - URI construction helpers\n * - Type-safe resource URI handling\n */\n\n/**\n * Utility function to validate a resource URI format\n *\n * @param uri - The URI to validate\n * @returns True if the URI is valid, false otherwise\n */\nexport function validateResourceUri(uri: string): boolean {\n try {\n ResourceUriSchema.parse(uri);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Utility function to parse a resource URI into its components\n *\n * @param uri - The URI to parse\n * @returns Object containing the parsed components or null if invalid\n */\nexport function parseResourceUri(uri: string): {\n workspace: string;\n project: string;\n resourceId: string;\n} | null {\n try {\n const validated = ResourceUriSchema.parse(uri);\n const match = validated.match(/^rsc:\\/\\/([^/]+)\\/([^/]+)\\/(.+)$/);\n\n if (!match) {\n return null;\n }\n\n return {\n workspace: match[1],\n project: match[2],\n resourceId: match[3],\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Utility function to construct a resource URI from components\n *\n * @param workspace - The workspace identifier\n * @param project - The project identifier\n * @param resourceId - The resource identifier\n * @returns The constructed resource URI\n */\nexport function constructResourceUri(\n workspace: string,\n project: string,\n resourceId: string,\n): string {\n return `rsc://${workspace}/${project}/${resourceId}`;\n}\n\n// Re-export types for convenience\nexport type {\n CreateInput,\n CreateOutput,\n DeleteInput,\n DeleteOutput,\n ReadInput,\n ReadOutput,\n SearchInput,\n SearchOutput,\n};\n","// Types for DeconfigResource\nimport { z } from \"zod/v3\";\nimport type { DefaultEnv } from \"../../index.ts\";\nimport type { MCPClientFetchStub, ToolBinder } from \"../../mcp.ts\";\nimport type { BaseResourceDataSchema } from \"../resources/bindings.ts\";\n\nexport type ResourcesBinding<TDataSchema extends BaseResourceDataSchema> =\n ReturnType<\n typeof import(\"../resources/bindings.ts\").createResourceBindings<TDataSchema>\n >;\n\nexport type ResourcesTools<TDataSchema extends BaseResourceDataSchema> =\n ResourcesBinding<TDataSchema>[number][\"name\"];\n\nexport type EnhancedResourcesTools<TDataSchema extends BaseResourceDataSchema> =\n Partial<\n Record<\n ResourcesTools<TDataSchema>,\n {\n description: string;\n }\n >\n >;\n\n// Define deconfig tools as ToolBinder array (same pattern as workspaceTools in mcp.ts)\nexport const deconfigTools = [\n {\n name: \"LIST_FILES\" as const,\n inputSchema: z.object({\n branch: z.string().optional(),\n prefix: z.string().optional(),\n select: z.array(z.string()).optional(),\n includeContent: z.boolean().optional(),\n }),\n outputSchema: z.object({\n files: z.record(\n z.string(),\n z.object({\n address: z.string(),\n metadata: z.record(z.string(), z.any()),\n sizeInBytes: z.number(),\n mtime: z.number(),\n ctime: z.number(),\n content: z.string().optional(),\n }),\n ),\n count: z.number(),\n }),\n },\n {\n name: \"READ_FILE\" as const,\n inputSchema: z.object({\n branch: z.string().optional(),\n path: z.string(),\n format: z.enum([\"base64\", \"byteArray\", \"plainString\", \"json\"]).optional(),\n }),\n outputSchema: z.object({\n content: z.any(),\n address: z.string(),\n metadata: z.record(z.any()),\n mtime: z.number(),\n ctime: z.number(),\n }),\n },\n {\n name: \"PUT_FILE\" as const,\n inputSchema: z.object({\n branch: z.string().optional(),\n path: z.string(),\n content: z.union([\n z.string(),\n z.object({ base64: z.string() }),\n z.array(z.number()),\n ]),\n metadata: z.record(z.any()).optional(),\n expectedCtime: z.number().optional(),\n }),\n outputSchema: z.object({\n conflict: z.boolean().optional(),\n }),\n },\n {\n name: \"DELETE_FILE\" as const,\n inputSchema: z.object({\n branch: z.string().optional(),\n path: z.string(),\n }),\n outputSchema: z.object({\n deleted: z.boolean(),\n }),\n },\n] as const satisfies readonly ToolBinder[];\n\n// DeconfigClient is now a typed MCP client stub (same pattern as workspaceTools)\nexport type DeconfigClient = MCPClientFetchStub<typeof deconfigTools>;\n\nexport interface DeconfigResourceOptions<\n TDataSchema extends BaseResourceDataSchema,\n> {\n directory?: string; // defaults to /resources/$resourceName\n resourceName: string;\n env: DefaultEnv & { DECONFIG: DeconfigClient };\n dataSchema: TDataSchema;\n enhancements?: EnhancedResourcesTools<TDataSchema>;\n validate?: (data: z.infer<TDataSchema>) => Promise<void>;\n}\n","import { CHANNEL_BINDING } from \"./channels.ts\";\nimport { VIEW_BINDING as VIEWS_BINDING } from \"./views.ts\";\n\n// Import new Resources 2.0 bindings function\nimport { LANGUAGE_MODEL_BINDING } from \"@decocms/bindings/llm\";\nimport { createResourceBindings } from \"./resources/bindings.ts\";\n\n// Export types and utilities from binder\nexport {\n bindingClient,\n ChannelBinding,\n impl,\n ViewBinding,\n type Binder,\n type BinderImplementation,\n type MCPBindingClient,\n type ToolLike,\n} from \"./binder.ts\";\n\n// Export all channel types and schemas\nexport * from \"./channels.ts\";\n\n// Export binding utilities\nexport * from \"./utils.ts\";\n\n// Export views schemas\nexport * from \"./views.ts\";\n\n// Re-export Resources bindings function for convenience\nexport { createResourceBindings };\n\n// Export resources types and schemas\nexport * from \"./resources/bindings.ts\";\nexport * from \"./resources/helpers.ts\";\nexport * from \"./resources/schemas.ts\";\n\n// Export deconfig helpers and types\nexport {\n getMetadataString as deconfigGetMetadataString,\n getMetadataValue as deconfigGetMetadataValue,\n normalizeDirectory as deconfigNormalizeDirectory,\n ResourcePath,\n ResourceUri,\n} from \"./deconfig/helpers.ts\";\nexport { createDeconfigResource } from \"./deconfig/index.ts\";\nexport type {\n DeconfigClient,\n DeconfigResourceOptions,\n EnhancedResourcesTools,\n ResourcesBinding,\n ResourcesTools,\n} from \"./deconfig/index.ts\";\nexport { deconfigTools } from \"./deconfig/types.ts\";\n\nexport const WellKnownBindings = {\n Channel: CHANNEL_BINDING,\n View: VIEWS_BINDING,\n LanguageModel: LANGUAGE_MODEL_BINDING,\n // Note: Resources is not included here since it's a generic function\n // Use createResourceBindings(dataSchema) directly for Resources 2.0\n} as const;\n\nexport type WellKnownBindingsName = keyof typeof WellKnownBindings;\n"]}
|
package/dist/chunk-3AWMDSOH.js
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { Client as Client$1 } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
-
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
3
|
-
import { WebSocketClientTransport } from '@modelcontextprotocol/sdk/client/websocket.js';
|
|
4
|
-
import { ListToolsResultSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
-
import { HTTPClientTransport } from '@decocms/bindings/client';
|
|
6
|
-
|
|
7
|
-
// src/mcp-client.ts
|
|
8
|
-
|
|
9
|
-
// src/mcp-client.ts
|
|
10
|
-
var Client = class extends Client$1 {
|
|
11
|
-
constructor(_clientInfo, options) {
|
|
12
|
-
super(_clientInfo, options);
|
|
13
|
-
}
|
|
14
|
-
async listTools(params, options) {
|
|
15
|
-
const result = await this.request(
|
|
16
|
-
{ method: "tools/list", params },
|
|
17
|
-
ListToolsResultSchema,
|
|
18
|
-
options
|
|
19
|
-
);
|
|
20
|
-
return result;
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
var createServerClient = async (mcpServer, signal, extraHeaders) => {
|
|
24
|
-
const transport = createTransport(mcpServer.connection, signal, extraHeaders);
|
|
25
|
-
if (!transport) {
|
|
26
|
-
throw new Error("Unknown MCP connection type");
|
|
27
|
-
}
|
|
28
|
-
const client = new Client({
|
|
29
|
-
name: mcpServer?.name ?? "MCP Client",
|
|
30
|
-
version: "1.0.0"
|
|
31
|
-
});
|
|
32
|
-
await client.connect(transport);
|
|
33
|
-
return {
|
|
34
|
-
client,
|
|
35
|
-
callStreamableTool: (tool, args) => {
|
|
36
|
-
if (mcpServer.connection.type !== "HTTP") {
|
|
37
|
-
throw new Error("HTTP connection required");
|
|
38
|
-
}
|
|
39
|
-
return fetch(mcpServer.connection.url + `/call-tool/${tool}`, {
|
|
40
|
-
method: "POST",
|
|
41
|
-
redirect: "manual",
|
|
42
|
-
body: JSON.stringify(args),
|
|
43
|
-
headers: {
|
|
44
|
-
...extraHeaders,
|
|
45
|
-
Authorization: `Bearer ${mcpServer.connection.token}`
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
|
-
var createTransport = (connection, signal, extraHeaders) => {
|
|
52
|
-
if (connection.type === "Websocket") {
|
|
53
|
-
return new WebSocketClientTransport(new URL(connection.url));
|
|
54
|
-
}
|
|
55
|
-
if (connection.type !== "SSE" && connection.type !== "HTTP") {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
const authHeaders = connection.token ? { authorization: `Bearer ${connection.token}` } : {};
|
|
59
|
-
const headers = {
|
|
60
|
-
...authHeaders,
|
|
61
|
-
...extraHeaders ?? {},
|
|
62
|
-
..."headers" in connection ? connection.headers || {} : {}
|
|
63
|
-
};
|
|
64
|
-
if (connection.type === "SSE") {
|
|
65
|
-
const config = {
|
|
66
|
-
requestInit: { headers, signal }
|
|
67
|
-
};
|
|
68
|
-
if (connection.token) {
|
|
69
|
-
config.eventSourceInit = {
|
|
70
|
-
fetch: (req, init) => {
|
|
71
|
-
return fetch(req, {
|
|
72
|
-
...init,
|
|
73
|
-
headers: {
|
|
74
|
-
...headers,
|
|
75
|
-
Accept: "text/event-stream"
|
|
76
|
-
},
|
|
77
|
-
signal
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
return new SSEClientTransport(new URL(connection.url), config);
|
|
83
|
-
}
|
|
84
|
-
return new HTTPClientTransport(new URL(connection.url), {
|
|
85
|
-
requestInit: {
|
|
86
|
-
headers,
|
|
87
|
-
signal,
|
|
88
|
-
// @ts-ignore - this is a valid option for fetch
|
|
89
|
-
credentials: "include"
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
export { createServerClient, createTransport };
|
|
95
|
-
//# sourceMappingURL=chunk-3AWMDSOH.js.map
|
|
96
|
-
//# sourceMappingURL=chunk-3AWMDSOH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp-client.ts"],"names":["BaseClient"],"mappings":";;;;;;;;;AAyBA,IAAM,MAAA,GAAN,cAAqBA,QAAA,CAAW;AAAA,EAC9B,WAAA,CAAY,aAA6B,OAAA,EAAyB;AAChE,IAAA,KAAA,CAAM,aAAa,OAAO,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAe,SAAA,CACb,MAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA;AAAA,MACxB,EAAE,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAO;AAAA,MAC/B,qBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAMO,IAAM,kBAAA,GAAqB,OAChC,SAAA,EACA,MAAA,EACA,YAAA,KAC0B;AAC1B,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,SAAA,CAAU,UAAA,EAAY,QAAQ,YAAY,CAAA;AAE5E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,IACxB,IAAA,EAAM,WAAW,IAAA,IAAQ,YAAA;AAAA,IACzB,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAE9B,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,kBAAA,EAAoB,CAAC,IAAA,EAAM,IAAA,KAAS;AAClC,MAAA,IAAI,SAAA,CAAU,UAAA,CAAW,IAAA,KAAS,MAAA,EAAQ;AACxC,QAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO,MAAM,SAAA,CAAU,UAAA,CAAW,GAAA,GAAM,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA,EAAI;AAAA,QAC5D,MAAA,EAAQ,MAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,OAAA,EAAS;AAAA,UACP,GAAG,YAAA;AAAA,UACH,aAAA,EAAe,CAAA,OAAA,EAAU,SAAA,CAAU,UAAA,CAAW,KAAK,CAAA;AAAA;AACrD,OACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAEO,IAAM,eAAA,GAAkB,CAC7B,UAAA,EACA,MAAA,EACA,YAAA,KACG;AACH,EAAA,IAAI,UAAA,CAAW,SAAS,WAAA,EAAa;AACnC,IAAA,OAAO,IAAI,wBAAA,CAAyB,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,UAAA,CAAW,IAAA,KAAS,KAAA,IAAS,UAAA,CAAW,SAAS,MAAA,EAAQ;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAsC,UAAA,CAAW,KAAA,GACnD,EAAE,aAAA,EAAe,UAAU,UAAA,CAAW,KAAK,CAAA,CAAA,EAAG,GAC9C,EAAC;AAEL,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,GAAG,WAAA;AAAA,IACH,GAAI,gBAAgB,EAAC;AAAA,IACrB,GAAI,SAAA,IAAa,UAAA,GAAa,WAAW,OAAA,IAAW,KAAK;AAAC,GAC5D;AAEA,EAAA,IAAI,UAAA,CAAW,SAAS,KAAA,EAAO;AAC7B,IAAA,MAAM,MAAA,GAAoC;AAAA,MACxC,WAAA,EAAa,EAAE,OAAA,EAAS,MAAA;AAAO,KACjC;AAEA,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAA,CAAO,eAAA,GAAkB;AAAA,QACvB,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS;AACpB,UAAA,OAAO,MAAM,GAAA,EAAK;AAAA,YAChB,GAAG,IAAA;AAAA,YACH,OAAA,EAAS;AAAA,cACP,GAAG,OAAA;AAAA,cACH,MAAA,EAAQ;AAAA,aACV;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,kBAAA,CAAmB,IAAI,IAAI,UAAA,CAAW,GAAG,GAAG,MAAM,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,IAAI,mBAAA,CAAoB,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AAAA,IACtD,WAAA,EAAa;AAAA,MACX,OAAA;AAAA,MACA,MAAA;AAAA;AAAA,MAEA,WAAA,EAAa;AAAA;AACf,GACD,CAAA;AACH","file":"chunk-3AWMDSOH.js","sourcesContent":["import {\n Client as BaseClient,\n ClientOptions,\n} from \"@modelcontextprotocol/sdk/client/index.js\";\nimport {\n SSEClientTransport,\n SSEClientTransportOptions,\n} from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { WebSocketClientTransport } from \"@modelcontextprotocol/sdk/client/websocket.js\";\nimport { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport {\n Implementation,\n ListToolsRequest,\n ListToolsResultSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { MCPConnection } from \"./connection.ts\";\nimport { HTTPClientTransport } from \"./http-client-transport.ts\";\n\n/**\n * WARNNING: This is a hack to prevent schema compilation errors.\n * More info at: https://github.com/modelcontextprotocol/typescript-sdk/issues/923\n *\n * Make sure to keep this updated with the right version of the SDK.\n * https://github.com/modelcontextprotocol/typescript-sdk/blob/bf817939917277a4c59f2e19e7b44b8dd7ff140c/src/client/index.ts#L480\n */\nclass Client extends BaseClient {\n constructor(_clientInfo: Implementation, options?: ClientOptions) {\n super(_clientInfo, options);\n }\n\n override async listTools(\n params?: ListToolsRequest[\"params\"],\n options?: RequestOptions,\n ) {\n const result = await this.request(\n { method: \"tools/list\", params },\n ListToolsResultSchema,\n options,\n );\n\n return result;\n }\n}\n\nexport interface ServerClient {\n client: Client;\n callStreamableTool: (tool: string, args: unknown) => Promise<Response>;\n}\nexport const createServerClient = async (\n mcpServer: { connection: MCPConnection; name?: string },\n signal?: AbortSignal,\n extraHeaders?: Record<string, string>,\n): Promise<ServerClient> => {\n const transport = createTransport(mcpServer.connection, signal, extraHeaders);\n\n if (!transport) {\n throw new Error(\"Unknown MCP connection type\");\n }\n\n const client = new Client({\n name: mcpServer?.name ?? \"MCP Client\",\n version: \"1.0.0\",\n });\n\n await client.connect(transport);\n\n return {\n client,\n callStreamableTool: (tool, args) => {\n if (mcpServer.connection.type !== \"HTTP\") {\n throw new Error(\"HTTP connection required\");\n }\n return fetch(mcpServer.connection.url + `/call-tool/${tool}`, {\n method: \"POST\",\n redirect: \"manual\",\n body: JSON.stringify(args),\n headers: {\n ...extraHeaders,\n Authorization: `Bearer ${mcpServer.connection.token}`,\n },\n });\n },\n };\n};\n\nexport const createTransport = (\n connection: MCPConnection,\n signal?: AbortSignal,\n extraHeaders?: Record<string, string>,\n) => {\n if (connection.type === \"Websocket\") {\n return new WebSocketClientTransport(new URL(connection.url));\n }\n\n if (connection.type !== \"SSE\" && connection.type !== \"HTTP\") {\n return null;\n }\n\n const authHeaders: Record<string, string> = connection.token\n ? { authorization: `Bearer ${connection.token}` }\n : {};\n\n const headers: Record<string, string> = {\n ...authHeaders,\n ...(extraHeaders ?? {}),\n ...(\"headers\" in connection ? connection.headers || {} : {}),\n };\n\n if (connection.type === \"SSE\") {\n const config: SSEClientTransportOptions = {\n requestInit: { headers, signal },\n };\n\n if (connection.token) {\n config.eventSourceInit = {\n fetch: (req, init) => {\n return fetch(req, {\n ...init,\n headers: {\n ...headers,\n Accept: \"text/event-stream\",\n },\n signal,\n });\n },\n };\n }\n\n return new SSEClientTransport(new URL(connection.url), config);\n }\n return new HTTPClientTransport(new URL(connection.url), {\n requestInit: {\n headers,\n signal,\n // @ts-ignore - this is a valid option for fetch\n credentials: \"include\",\n },\n });\n};\n"]}
|
package/dist/chunk-4XSQKJLU.js
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { toAsyncIterator } from './chunk-UHR3BLMF.js';
|
|
2
|
-
|
|
3
|
-
// src/client.ts
|
|
4
|
-
var DECO_MCP_CLIENT_HEADER = "X-Deco-MCP-Client";
|
|
5
|
-
var DEFAULT_INIT = {
|
|
6
|
-
credentials: "include",
|
|
7
|
-
headers: {
|
|
8
|
-
[DECO_MCP_CLIENT_HEADER]: "true"
|
|
9
|
-
}
|
|
10
|
-
};
|
|
11
|
-
async function callMCPTool(methodName, args, init) {
|
|
12
|
-
const mergedInit = {
|
|
13
|
-
...init,
|
|
14
|
-
headers: {
|
|
15
|
-
...DEFAULT_INIT.headers,
|
|
16
|
-
...init?.headers
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
const response = await fetch(`/mcp/call-tool/${methodName}`, {
|
|
20
|
-
method: "POST",
|
|
21
|
-
body: JSON.stringify(args),
|
|
22
|
-
credentials: "include",
|
|
23
|
-
...mergedInit
|
|
24
|
-
});
|
|
25
|
-
if (!response.ok) {
|
|
26
|
-
throw new Error(`Failed to call ${methodName}: ${response.statusText}`);
|
|
27
|
-
}
|
|
28
|
-
return response.json();
|
|
29
|
-
}
|
|
30
|
-
function createSubscribeMethod(resourceName, init) {
|
|
31
|
-
return async function* (args) {
|
|
32
|
-
const describeMethodName = `DECO_RESOURCE_${resourceName}_DESCRIBE`;
|
|
33
|
-
const readMethodName = `DECO_RESOURCE_${resourceName}_READ`;
|
|
34
|
-
const describeData = await callMCPTool(describeMethodName, {}, init);
|
|
35
|
-
const watchPathname = describeData?.features?.watch?.pathname;
|
|
36
|
-
const uriTemplate = describeData?.uriTemplate;
|
|
37
|
-
if (!watchPathname) {
|
|
38
|
-
throw new Error(
|
|
39
|
-
`Resource ${resourceName} does not support watch functionality`
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
if (!uriTemplate) {
|
|
43
|
-
throw new Error(`Resource ${resourceName} does not provide uriTemplate`);
|
|
44
|
-
}
|
|
45
|
-
const resourceUri = "uri" in args ? args.uri : uriTemplate.replace("*", args.id);
|
|
46
|
-
const watchUrl = new URL(watchPathname, globalThis.location.origin);
|
|
47
|
-
watchUrl.searchParams.set("uri", resourceUri);
|
|
48
|
-
const eventSource = new EventSource(watchUrl.href);
|
|
49
|
-
const eventStream = toAsyncIterator(
|
|
50
|
-
eventSource,
|
|
51
|
-
"message"
|
|
52
|
-
);
|
|
53
|
-
for await (const event of eventStream) {
|
|
54
|
-
const uri = event.uri;
|
|
55
|
-
if (uri) {
|
|
56
|
-
const readData = await callMCPTool(
|
|
57
|
-
readMethodName,
|
|
58
|
-
{ uri },
|
|
59
|
-
init
|
|
60
|
-
);
|
|
61
|
-
yield { uri, data: readData.data };
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
var createClient = (init) => {
|
|
67
|
-
return new Proxy(
|
|
68
|
-
{},
|
|
69
|
-
{
|
|
70
|
-
get: (_, prop) => {
|
|
71
|
-
const propStr = String(prop);
|
|
72
|
-
const subscribeMatch = propStr.match(/^DECO_RESOURCE_(.+)_SUBSCRIBE$/);
|
|
73
|
-
if (subscribeMatch) {
|
|
74
|
-
const resourceName = subscribeMatch[1];
|
|
75
|
-
return createSubscribeMethod(resourceName, init);
|
|
76
|
-
}
|
|
77
|
-
return async (args, innerInit) => {
|
|
78
|
-
const mergedInit = {
|
|
79
|
-
...init,
|
|
80
|
-
...innerInit,
|
|
81
|
-
headers: {
|
|
82
|
-
...DEFAULT_INIT.headers,
|
|
83
|
-
...init?.headers,
|
|
84
|
-
...innerInit?.headers
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
const response = await fetch(`/mcp/call-tool/${String(prop)}`, {
|
|
88
|
-
method: "POST",
|
|
89
|
-
body: JSON.stringify(args),
|
|
90
|
-
credentials: "include",
|
|
91
|
-
...mergedInit
|
|
92
|
-
});
|
|
93
|
-
if (typeof mergedInit.handleResponse === "function") {
|
|
94
|
-
return mergedInit.handleResponse(response);
|
|
95
|
-
}
|
|
96
|
-
return response.json();
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
);
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
export { DECO_MCP_CLIENT_HEADER, DEFAULT_INIT, createClient };
|
|
104
|
-
//# sourceMappingURL=chunk-4XSQKJLU.js.map
|
|
105
|
-
//# sourceMappingURL=chunk-4XSQKJLU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"names":[],"mappings":"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","file":"chunk-4XSQKJLU.js","sourcesContent":["import { toAsyncIterator } from \"./bindings/deconfig/helpers.ts\";\n// Extract resource name from DECO_RESOURCE_${NAME}_READ pattern\ntype ExtractResourceName<K> = K extends `DECO_RESOURCE_${infer Name}_READ`\n ? Name\n : never;\n\n// Generate SUBSCRIBE method name from resource name\ntype SubscribeMethodName<Name extends string> =\n `DECO_RESOURCE_${Name}_SUBSCRIBE`;\n\n// Extract data type from READ method return type\ntype ExtractReadData<T> = T extends Promise<{ data: infer D }>\n ? D\n : T extends { data: infer D }\n ? D\n : never;\n\n// Generate all SUBSCRIBE method names for a given type\ntype SubscribeMethods<T> = {\n [K in keyof T as K extends `DECO_RESOURCE_${string}_READ`\n ? SubscribeMethodName<ExtractResourceName<K>>\n : never]: K extends `DECO_RESOURCE_${string}_READ`\n ? // oxlint-disable-next-line no-explicit-any\n T[K] extends (...args: any) => any\n ? (args: { id: string } | { uri: string }) => AsyncIterableIterator<{\n uri: string;\n data: ExtractReadData<Awaited<ReturnType<T[K]>>>;\n }>\n : never\n : never;\n};\n\nexport type MCPClient<T> = {\n // oxlint-disable-next-line no-explicit-any\n [K in keyof T]: T[K] extends (...args: any) => any\n ? (\n args: Parameters<T[K]>[0],\n init?: CustomInit,\n ) => Promise<Awaited<ReturnType<T[K]>>>\n : never;\n} & SubscribeMethods<T>;\n\nexport type CustomInit = RequestInit & {\n handleResponse?: (response: Response) => Promise<unknown>;\n};\n\nexport const DECO_MCP_CLIENT_HEADER = \"X-Deco-MCP-Client\";\n\nexport const DEFAULT_INIT: CustomInit = {\n credentials: \"include\",\n headers: {\n [DECO_MCP_CLIENT_HEADER]: \"true\",\n },\n};\n\n/**\n * Helper function to call an MCP tool via fetch\n */\nasync function callMCPTool<T = unknown>(\n methodName: string,\n args: unknown,\n init?: CustomInit,\n): Promise<T> {\n const mergedInit: CustomInit = {\n ...init,\n headers: {\n ...DEFAULT_INIT.headers,\n ...init?.headers,\n },\n };\n\n const response = await fetch(`/mcp/call-tool/${methodName}`, {\n method: \"POST\",\n body: JSON.stringify(args),\n credentials: \"include\",\n ...mergedInit,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to call ${methodName}: ${response.statusText}`);\n }\n\n return response.json() as Promise<T>;\n}\n\n/**\n * Creates a subscribe method for a resource that returns an async iterator\n * yielding {uri, data} objects as resources are updated.\n */\nfunction createSubscribeMethod(\n resourceName: string,\n init?: CustomInit,\n): (args: { id: string }) => AsyncIterableIterator<{\n uri: string;\n data: unknown;\n}> {\n return async function* (args: { id: string } | { uri: string }) {\n // Step 1: Call DESCRIBE to get watch endpoint configuration and URI template\n const describeMethodName = `DECO_RESOURCE_${resourceName}_DESCRIBE`;\n const readMethodName = `DECO_RESOURCE_${resourceName}_READ`;\n\n // Get describe information\n const describeData = await callMCPTool<{\n uriTemplate?: string;\n features?: {\n watch?: {\n pathname?: string;\n };\n };\n }>(describeMethodName, {}, init);\n\n const watchPathname = describeData?.features?.watch?.pathname;\n const uriTemplate = describeData?.uriTemplate;\n\n if (!watchPathname) {\n throw new Error(\n `Resource ${resourceName} does not support watch functionality`,\n );\n }\n\n if (!uriTemplate) {\n throw new Error(`Resource ${resourceName} does not provide uriTemplate`);\n }\n\n // Step 2: Construct URI from template by replacing * with id\n const resourceUri =\n \"uri\" in args ? args.uri : uriTemplate.replace(\"*\", args.id);\n\n // Step 3: Construct watch URL and create EventSource\n const watchUrl = new URL(watchPathname, globalThis.location.origin);\n watchUrl.searchParams.set(\"uri\", resourceUri);\n\n const eventSource = new EventSource(watchUrl.href);\n\n // Step 4: Use toAsyncIterator to consume SSE events and enrich with READ data\n const eventStream = toAsyncIterator<{ uri: string }>(\n eventSource,\n \"message\",\n );\n\n // Iterate over SSE events and enrich with full data\n for await (const event of eventStream) {\n const uri = event.uri;\n\n if (uri) {\n // Call READ to get full resource data\n const readData = await callMCPTool<{ data: unknown }>(\n readMethodName,\n { uri },\n init,\n );\n\n yield { uri, data: readData.data };\n }\n }\n };\n}\n\nexport const createClient = <T>(init?: CustomInit): MCPClient<T> => {\n return new Proxy(\n {},\n {\n get: (_, prop) => {\n const propStr = String(prop);\n\n // Check if this is a SUBSCRIBE method call\n const subscribeMatch = propStr.match(/^DECO_RESOURCE_(.+)_SUBSCRIBE$/);\n if (subscribeMatch) {\n const resourceName = subscribeMatch[1];\n return createSubscribeMethod(resourceName, init);\n }\n\n // Regular method call\n return async (args: unknown, innerInit?: CustomInit) => {\n const mergedInit: CustomInit = {\n ...init,\n ...innerInit,\n headers: {\n ...DEFAULT_INIT.headers,\n ...init?.headers,\n ...innerInit?.headers,\n },\n };\n\n const response = await fetch(`/mcp/call-tool/${String(prop)}`, {\n method: \"POST\",\n body: JSON.stringify(args),\n credentials: \"include\",\n ...mergedInit,\n });\n\n if (typeof mergedInit.handleResponse === \"function\") {\n return mergedInit.handleResponse(response);\n }\n\n return response.json();\n };\n },\n },\n ) as MCPClient<T>;\n};\n"]}
|
package/dist/chunk-5EYZ2LVM.js
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { createServerClient } from './chunk-3AWMDSOH.js';
|
|
2
|
-
import { convertJsonSchemaToZod } from 'zod-from-json-schema';
|
|
3
|
-
|
|
4
|
-
// src/well-known.ts
|
|
5
|
-
var Hosts = {
|
|
6
|
-
API: "api.decocms.com",
|
|
7
|
-
WEB_APP: "admin.decocms.com",
|
|
8
|
-
LOCALHOST: "localhost:3000",
|
|
9
|
-
API_LEGACY: "api.deco.chat",
|
|
10
|
-
WEB_APP_LEGACY: "deco.chat"
|
|
11
|
-
};
|
|
12
|
-
var WELL_KNOWN_API_HOSTNAMES = [
|
|
13
|
-
Hosts.API,
|
|
14
|
-
Hosts.API_LEGACY,
|
|
15
|
-
Hosts.LOCALHOST.split(":")[0]
|
|
16
|
-
];
|
|
17
|
-
var WELL_KNOWN_ORIGINS = [
|
|
18
|
-
`http://${Hosts.LOCALHOST}`,
|
|
19
|
-
`https://${Hosts.WEB_APP}`,
|
|
20
|
-
`https://${Hosts.WEB_APP_LEGACY}`
|
|
21
|
-
];
|
|
22
|
-
|
|
23
|
-
// src/proxy.ts
|
|
24
|
-
var getWorkspace = (workspace) => {
|
|
25
|
-
if (workspace && workspace.length > 0 && !workspace.includes("/")) {
|
|
26
|
-
return `/shared/${workspace}`;
|
|
27
|
-
}
|
|
28
|
-
return workspace ?? "";
|
|
29
|
-
};
|
|
30
|
-
var safeParse = (content) => {
|
|
31
|
-
try {
|
|
32
|
-
return JSON.parse(content);
|
|
33
|
-
} catch {
|
|
34
|
-
return content;
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
var toolsMap = /* @__PURE__ */ new Map();
|
|
38
|
-
function supportsToolNameInPath(url) {
|
|
39
|
-
try {
|
|
40
|
-
return WELL_KNOWN_API_HOSTNAMES.includes(new URL(url).hostname);
|
|
41
|
-
} catch {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
function createMCPClientProxy(options) {
|
|
46
|
-
if (typeof options?.connection === "function") {
|
|
47
|
-
throw new Error(
|
|
48
|
-
"Deprecation Notice: Passing a function as 'connection' is deprecated and will be removed in a future release. Please provide a connection object instead."
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
const mcpPath = options?.mcpPath ?? "/mcp";
|
|
52
|
-
const connection = options?.connection || {
|
|
53
|
-
type: "HTTP",
|
|
54
|
-
token: options?.token,
|
|
55
|
-
url: new URL(
|
|
56
|
-
`${getWorkspace(options?.workspace)}${mcpPath}`,
|
|
57
|
-
options?.decoCmsApiUrl ?? `https://api.decocms.com`
|
|
58
|
-
).href
|
|
59
|
-
};
|
|
60
|
-
return new Proxy({}, {
|
|
61
|
-
get(_, name) {
|
|
62
|
-
if (name === "toJSON") {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
if (typeof name !== "string") {
|
|
66
|
-
throw new Error("Name must be a string");
|
|
67
|
-
}
|
|
68
|
-
async function callToolFn(args) {
|
|
69
|
-
const debugId = options?.debugId?.();
|
|
70
|
-
const extraHeaders = debugId ? { "x-trace-debug-id": debugId } : void 0;
|
|
71
|
-
let toolConnection = connection;
|
|
72
|
-
const shouldAddToolName = options?.supportsToolName ?? ("url" in connection && typeof connection.url === "string" && supportsToolNameInPath(connection.url));
|
|
73
|
-
if (shouldAddToolName && "url" in connection && typeof connection.url === "string") {
|
|
74
|
-
toolConnection = {
|
|
75
|
-
...connection,
|
|
76
|
-
url: connection.url.endsWith("/") ? `${connection.url}tool/${String(name)}` : `${connection.url}/tool/${String(name)}`
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
const { client, callStreamableTool } = await createServerClient(
|
|
80
|
-
{ connection: toolConnection },
|
|
81
|
-
void 0,
|
|
82
|
-
extraHeaders
|
|
83
|
-
);
|
|
84
|
-
if (options?.streamable?.[String(name)]) {
|
|
85
|
-
return callStreamableTool(String(name), args);
|
|
86
|
-
}
|
|
87
|
-
const { structuredContent, isError, content } = await client.callTool(
|
|
88
|
-
{
|
|
89
|
-
name: String(name),
|
|
90
|
-
arguments: args
|
|
91
|
-
},
|
|
92
|
-
void 0,
|
|
93
|
-
{
|
|
94
|
-
timeout: 3e6
|
|
95
|
-
}
|
|
96
|
-
);
|
|
97
|
-
if (isError) {
|
|
98
|
-
const maybeErrorMessage = content?.[0]?.text;
|
|
99
|
-
const error = typeof maybeErrorMessage === "string" ? safeParse(maybeErrorMessage) : null;
|
|
100
|
-
const throwableError = error?.code && typeof options?.getErrorByStatusCode === "function" ? options.getErrorByStatusCode(
|
|
101
|
-
error.code,
|
|
102
|
-
error.message,
|
|
103
|
-
error.traceId
|
|
104
|
-
) : null;
|
|
105
|
-
if (throwableError) {
|
|
106
|
-
throw throwableError;
|
|
107
|
-
}
|
|
108
|
-
throw new Error(
|
|
109
|
-
`Tool ${String(name)} returned an error: ${JSON.stringify(
|
|
110
|
-
structuredContent ?? content
|
|
111
|
-
)}`
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
return structuredContent;
|
|
115
|
-
}
|
|
116
|
-
const listToolsFn = async () => {
|
|
117
|
-
const { client } = await createServerClient({ connection });
|
|
118
|
-
const { tools } = await client.listTools();
|
|
119
|
-
return tools;
|
|
120
|
-
};
|
|
121
|
-
async function listToolsOnce() {
|
|
122
|
-
const conn = connection;
|
|
123
|
-
const key = JSON.stringify(conn);
|
|
124
|
-
try {
|
|
125
|
-
if (!toolsMap.has(key)) {
|
|
126
|
-
toolsMap.set(key, listToolsFn());
|
|
127
|
-
}
|
|
128
|
-
return await toolsMap.get(key);
|
|
129
|
-
} catch (error) {
|
|
130
|
-
console.error("Failed to list tools", error);
|
|
131
|
-
toolsMap.delete(key);
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
callToolFn.asTool = async () => {
|
|
136
|
-
const tools = await listToolsOnce() ?? [];
|
|
137
|
-
const tool = tools.find((t) => t.name === name);
|
|
138
|
-
if (!tool) {
|
|
139
|
-
throw new Error(`Tool ${name} not found`);
|
|
140
|
-
}
|
|
141
|
-
return {
|
|
142
|
-
...tool,
|
|
143
|
-
id: tool.name,
|
|
144
|
-
inputSchema: tool.inputSchema ? convertJsonSchemaToZod(tool.inputSchema) : void 0,
|
|
145
|
-
outputSchema: tool.outputSchema ? convertJsonSchemaToZod(tool.outputSchema) : void 0,
|
|
146
|
-
execute: (input) => {
|
|
147
|
-
return callToolFn(input.context);
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
};
|
|
151
|
-
return callToolFn;
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export { WELL_KNOWN_ORIGINS, createMCPClientProxy };
|
|
157
|
-
//# sourceMappingURL=chunk-5EYZ2LVM.js.map
|
|
158
|
-
//# sourceMappingURL=chunk-5EYZ2LVM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/well-known.ts","../src/proxy.ts"],"names":[],"mappings":"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","file":"chunk-5EYZ2LVM.js","sourcesContent":["const Hosts = {\n API: \"api.decocms.com\",\n WEB_APP: \"admin.decocms.com\",\n APPS: \"deco.page\",\n LOCALHOST: \"localhost:3000\",\n API_LEGACY: \"api.deco.chat\",\n WEB_APP_LEGACY: \"deco.chat\",\n} as const;\n\nexport const WELL_KNOWN_API_HOSTNAMES = [\n Hosts.API,\n Hosts.API_LEGACY,\n Hosts.LOCALHOST.split(\":\")[0],\n] as const;\n\nexport const WELL_KNOWN_ORIGINS = [\n `http://${Hosts.LOCALHOST}`,\n `https://${Hosts.WEB_APP}`,\n `https://${Hosts.WEB_APP_LEGACY}`,\n] as const;\n","/* oxlint-disable no-explicit-any */\nimport type { ToolExecutionContext as _ToolExecutionContext } from \"@mastra/core\";\nimport { convertJsonSchemaToZod } from \"zod-from-json-schema\";\nimport { MCPConnection } from \"./connection.ts\";\nimport { createServerClient } from \"./mcp-client.ts\";\nimport type { CreateStubAPIOptions } from \"./mcp.ts\";\nimport { WELL_KNOWN_API_HOSTNAMES } from \"./well-known.ts\";\n\nconst getWorkspace = (workspace?: string) => {\n if (workspace && workspace.length > 0 && !workspace.includes(\"/\")) {\n return `/shared/${workspace}`;\n }\n return workspace ?? \"\";\n};\n\nconst safeParse = (content: string) => {\n try {\n return JSON.parse(content as string);\n } catch {\n return content;\n }\n};\n\nconst toolsMap = new Map<\n string,\n Promise<\n Array<{\n name: string;\n inputSchema: any;\n outputSchema?: any;\n description: string;\n }>\n >\n>();\n\n/**\n * Determines if a given URL supports tool names in the path.\n * Our APIs (api.decocms.com, api.deco.chat, localhost) support /tool/${toolName} routing.\n * Third-party APIs typically don't support this pattern.\n */\nfunction supportsToolNameInPath(url: string): boolean {\n try {\n // Our main APIs that support /tool/${toolName} routing\n return WELL_KNOWN_API_HOSTNAMES.includes(new URL(url).hostname);\n } catch {\n return false;\n }\n}\n\n/**\n * The base fetcher used to fetch the MCP from API.\n */\nexport function createMCPClientProxy<T extends Record<string, unknown>>(\n options?: CreateStubAPIOptions,\n): T {\n if (typeof options?.connection === \"function\") {\n // [DEPRECATED] Passing a function as 'connection' is deprecated and will be removed in a future release.\n // Please provide a connection object instead.\n throw new Error(\n \"Deprecation Notice: Passing a function as 'connection' is deprecated and will be removed in a future release. Please provide a connection object instead.\",\n );\n }\n\n const mcpPath = options?.mcpPath ?? \"/mcp\";\n\n const connection: MCPConnection = options?.connection || {\n type: \"HTTP\",\n token: options?.token,\n url: new URL(\n `${getWorkspace(options?.workspace)}${mcpPath}`,\n options?.decoCmsApiUrl ?? `https://api.decocms.com`,\n ).href,\n };\n\n return new Proxy<T>({} as T, {\n get(_, name) {\n if (name === \"toJSON\") {\n return null;\n }\n if (typeof name !== \"string\") {\n throw new Error(\"Name must be a string\");\n }\n async function callToolFn(args: unknown) {\n const debugId = options?.debugId?.();\n const extraHeaders = debugId\n ? { \"x-trace-debug-id\": debugId }\n : undefined;\n\n // Create a connection with the tool name in the URL path for better logging\n // Only modify connections that have a URL property (HTTP, SSE, Websocket)\n // Use automatic detection based on URL, with optional override\n let toolConnection = connection;\n const shouldAddToolName =\n options?.supportsToolName ??\n (\"url\" in connection &&\n typeof connection.url === \"string\" &&\n supportsToolNameInPath(connection.url));\n\n if (\n shouldAddToolName &&\n \"url\" in connection &&\n typeof connection.url === \"string\"\n ) {\n toolConnection = {\n ...connection,\n url: connection.url.endsWith(\"/\")\n ? `${connection.url}tool/${String(name)}`\n : `${connection.url}/tool/${String(name)}`,\n };\n }\n\n const { client, callStreamableTool } = await createServerClient(\n { connection: toolConnection },\n undefined,\n extraHeaders,\n );\n\n if (options?.streamable?.[String(name)]) {\n return callStreamableTool(String(name), args);\n }\n\n const { structuredContent, isError, content } = await client.callTool(\n {\n name: String(name),\n arguments: args as Record<string, unknown>,\n },\n undefined,\n {\n timeout: 3000000,\n },\n );\n\n if (isError) {\n // @ts-expect-error - content is not typed\n const maybeErrorMessage = content?.[0]?.text;\n const error =\n typeof maybeErrorMessage === \"string\"\n ? safeParse(maybeErrorMessage)\n : null;\n\n const throwableError =\n error?.code && typeof options?.getErrorByStatusCode === \"function\"\n ? options.getErrorByStatusCode(\n error.code,\n error.message,\n error.traceId,\n )\n : null;\n\n if (throwableError) {\n throw throwableError;\n }\n\n throw new Error(\n `Tool ${String(name)} returned an error: ${JSON.stringify(\n structuredContent ?? content,\n )}`,\n );\n }\n return structuredContent;\n }\n\n const listToolsFn = async () => {\n const { client } = await createServerClient({ connection });\n const { tools } = await client.listTools();\n\n return tools as {\n name: string;\n inputSchema: any;\n outputSchema?: any;\n description: string;\n }[];\n };\n\n async function listToolsOnce() {\n const conn = connection;\n const key = JSON.stringify(conn);\n\n try {\n if (!toolsMap.has(key)) {\n toolsMap.set(key, listToolsFn());\n }\n\n return await toolsMap.get(key)!;\n } catch (error) {\n console.error(\"Failed to list tools\", error);\n\n toolsMap.delete(key);\n return;\n }\n }\n callToolFn.asTool = async () => {\n const tools = (await listToolsOnce()) ?? [];\n const tool = tools.find((t) => t.name === name);\n if (!tool) {\n throw new Error(`Tool ${name} not found`);\n }\n\n return {\n ...tool,\n id: tool.name,\n inputSchema: tool.inputSchema\n ? convertJsonSchemaToZod(tool.inputSchema)\n : undefined,\n outputSchema: tool.outputSchema\n ? convertJsonSchemaToZod(tool.outputSchema)\n : undefined,\n execute: (input: any) => {\n return callToolFn(input.context);\n },\n };\n };\n return callToolFn;\n },\n });\n}\n"]}
|