@decocms/runtime 0.24.0 → 0.25.1
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/dist/bindings/deconfig/index.d.ts +2 -2
- package/dist/bindings/deconfig/index.js +5 -5
- package/dist/bindings/index.d.ts +2 -2
- package/dist/bindings/index.js +6 -6
- package/dist/{chunk-4UQ5U73Y.js → chunk-F6XZPFWM.js} +3 -5
- package/dist/chunk-F6XZPFWM.js.map +1 -0
- package/dist/{chunk-ZRJ5SGAO.js → chunk-I2KGAHFY.js} +26 -6
- package/dist/chunk-I2KGAHFY.js.map +1 -0
- package/dist/{chunk-73FIKR3X.js → chunk-NKUMVYKI.js} +3 -3
- package/dist/chunk-NKUMVYKI.js.map +1 -0
- package/dist/{chunk-377XXI4J.js → chunk-O6IURJAY.js} +4 -4
- package/dist/{chunk-377XXI4J.js.map → chunk-O6IURJAY.js.map} +1 -1
- package/dist/{chunk-G3NWZG2F.js → chunk-QELHWEZH.js} +3 -3
- package/dist/chunk-QELHWEZH.js.map +1 -0
- package/dist/drizzle.d.ts +1 -1
- package/dist/{index-D_J_044C.d.ts → index-D8GtUDPS.d.ts} +11 -2
- package/dist/{index-BBAR4TQu.d.ts → index-SnnmAI05.d.ts} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -6
- package/dist/index.js.map +1 -1
- package/dist/mastra.d.ts +1 -1
- package/dist/mastra.js +2 -2
- package/dist/mcp-client.js +1 -1
- package/dist/proxy.js +2 -2
- package/dist/resources.d.ts +2 -33
- package/dist/resources.js +1 -1
- package/package.json +14 -1
- package/src/admin.ts +16 -0
- package/src/auth.ts +233 -0
- package/src/bindings/README.md +132 -0
- package/src/bindings/binder.ts +143 -0
- package/src/bindings/channels.ts +54 -0
- package/src/bindings/deconfig/helpers.ts +107 -0
- package/src/bindings/deconfig/index.ts +1 -0
- package/src/bindings/deconfig/resources.ts +659 -0
- package/src/bindings/deconfig/types.ts +106 -0
- package/src/bindings/index.ts +61 -0
- package/src/bindings/resources/bindings.ts +99 -0
- package/src/bindings/resources/helpers.ts +95 -0
- package/src/bindings/resources/schemas.ts +265 -0
- package/src/bindings/utils.ts +22 -0
- package/src/bindings/views.ts +14 -0
- package/src/bindings.ts +178 -0
- package/src/cf-imports.ts +1 -0
- package/src/client.ts +201 -0
- package/src/connection.ts +53 -0
- package/src/d1-store.ts +34 -0
- package/src/deprecated.ts +59 -0
- package/src/drizzle.ts +201 -0
- package/src/http-client-transport.ts +66 -0
- package/src/index.ts +409 -0
- package/src/mastra.ts +894 -0
- package/src/mcp-client.ts +119 -0
- package/src/mcp.ts +170 -0
- package/src/proxy.ts +212 -0
- package/src/resources.ts +168 -0
- package/src/state.ts +44 -0
- package/src/views.ts +26 -0
- package/src/well-known.ts +20 -0
- package/src/workflow.ts +193 -0
- package/src/wrangler.ts +146 -0
- package/dist/chunk-4UQ5U73Y.js.map +0 -1
- package/dist/chunk-73FIKR3X.js.map +0 -1
- package/dist/chunk-G3NWZG2F.js.map +0 -1
- package/dist/chunk-ZRJ5SGAO.js.map +0 -1
package/src/views.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
const installBehavior = z.enum(["none", "open", "autoPin"]);
|
|
4
|
+
|
|
5
|
+
// New, richer schema with backward-compat fields kept optional
|
|
6
|
+
export const ViewsListOutputSchema = z.object({
|
|
7
|
+
views: z.array(
|
|
8
|
+
z.object({
|
|
9
|
+
id: z.string().optional(),
|
|
10
|
+
name: z.string().optional(),
|
|
11
|
+
title: z.string(),
|
|
12
|
+
description: z.string().optional(),
|
|
13
|
+
icon: z.string(),
|
|
14
|
+
url: z.string().optional(),
|
|
15
|
+
// New acceptance rules
|
|
16
|
+
mimeTypePattern: z.string().optional(),
|
|
17
|
+
resourceName: z.string().optional(),
|
|
18
|
+
// Legacy/compat fields
|
|
19
|
+
tools: z.array(z.string()).optional().default([]),
|
|
20
|
+
prompt: z.string().optional(),
|
|
21
|
+
installBehavior: installBehavior.optional(),
|
|
22
|
+
}),
|
|
23
|
+
),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export type ViewsListOutput = z.infer<typeof ViewsListOutputSchema>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const Hosts = {
|
|
2
|
+
API: "api.decocms.com",
|
|
3
|
+
WEB_APP: "admin.decocms.com",
|
|
4
|
+
APPS: "deco.page",
|
|
5
|
+
LOCALHOST: "localhost:3000",
|
|
6
|
+
API_LEGACY: "api.deco.chat",
|
|
7
|
+
WEB_APP_LEGACY: "deco.chat",
|
|
8
|
+
} as const;
|
|
9
|
+
|
|
10
|
+
export const WELL_KNOWN_API_HOSTNAMES = [
|
|
11
|
+
Hosts.API,
|
|
12
|
+
Hosts.API_LEGACY,
|
|
13
|
+
Hosts.LOCALHOST.split(":")[0],
|
|
14
|
+
] as const;
|
|
15
|
+
|
|
16
|
+
export const WELL_KNOWN_ORIGINS = [
|
|
17
|
+
`http://${Hosts.LOCALHOST}`,
|
|
18
|
+
`https://${Hosts.WEB_APP}`,
|
|
19
|
+
`https://${Hosts.WEB_APP_LEGACY}`,
|
|
20
|
+
] as const;
|
package/src/workflow.ts
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/* oxlint-disable no-explicit-any */
|
|
2
|
+
import { type DefaultEnv, type RequestContext, withBindings } from "./index.ts";
|
|
3
|
+
import {
|
|
4
|
+
type AppContext,
|
|
5
|
+
type CreateMCPServerOptions,
|
|
6
|
+
isWorkflow,
|
|
7
|
+
MCPServer,
|
|
8
|
+
} from "./mastra.ts";
|
|
9
|
+
|
|
10
|
+
import { D1Store } from "./d1-store.ts";
|
|
11
|
+
import { Mastra, type Workflow as MastraWorkflow } from "@mastra/core";
|
|
12
|
+
import { RuntimeContext } from "@mastra/core/di";
|
|
13
|
+
import { DurableObject } from "./cf-imports.ts";
|
|
14
|
+
import { State } from "./state.ts";
|
|
15
|
+
|
|
16
|
+
const createRuntimeContext = (env: DefaultEnv, ctx: DurableObjectState) => {
|
|
17
|
+
const runtimeContext = new RuntimeContext<AppContext>();
|
|
18
|
+
runtimeContext.set("env", env);
|
|
19
|
+
runtimeContext.set("ctx", ctx);
|
|
20
|
+
return runtimeContext;
|
|
21
|
+
};
|
|
22
|
+
export interface StartWorkflowArgs {
|
|
23
|
+
workflowId: string;
|
|
24
|
+
args: unknown;
|
|
25
|
+
runId?: string;
|
|
26
|
+
ctx: RequestContext;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface CancelWorkflowArgs {
|
|
30
|
+
workflowId: string;
|
|
31
|
+
runId?: string;
|
|
32
|
+
ctx: RequestContext;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ResumeWorkflowArgs {
|
|
36
|
+
workflowId: string;
|
|
37
|
+
runId?: string;
|
|
38
|
+
resumeData: unknown;
|
|
39
|
+
stepId: string;
|
|
40
|
+
ctx: RequestContext;
|
|
41
|
+
}
|
|
42
|
+
export interface WorkflowDO extends Rpc.DurableObjectBranded {
|
|
43
|
+
start: (args: StartWorkflowArgs) => Promise<{ runId: string }>;
|
|
44
|
+
cancel: (args: CancelWorkflowArgs) => Promise<{ cancelled: boolean }>;
|
|
45
|
+
resume: (args: ResumeWorkflowArgs) => Promise<{ resumed: boolean }>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const Workflow = (
|
|
49
|
+
server: MCPServer<any, any>,
|
|
50
|
+
workflows?: CreateMCPServerOptions["workflows"],
|
|
51
|
+
) => {
|
|
52
|
+
return class Workflow
|
|
53
|
+
extends DurableObject<DefaultEnv>
|
|
54
|
+
implements WorkflowDO
|
|
55
|
+
{
|
|
56
|
+
constructor(
|
|
57
|
+
// @ts-ignore: This is a workaround to fix the type error
|
|
58
|
+
// oxlint-disable-next-line ban-types
|
|
59
|
+
public override ctx: DurableObjectState<{}>,
|
|
60
|
+
public override env: DefaultEnv,
|
|
61
|
+
) {
|
|
62
|
+
super(ctx, env);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
bindings(ctx: RequestContext) {
|
|
66
|
+
return withBindings<DefaultEnv>({
|
|
67
|
+
env: this.env,
|
|
68
|
+
server,
|
|
69
|
+
tokenOrContext: ctx,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
runWithContext<T>(
|
|
74
|
+
ctx: RequestContext,
|
|
75
|
+
f: (ctx: DefaultEnv) => Promise<T>,
|
|
76
|
+
): Promise<T> {
|
|
77
|
+
const bindings = this.bindings(ctx);
|
|
78
|
+
return State.run(
|
|
79
|
+
{
|
|
80
|
+
ctx: {
|
|
81
|
+
waitUntil: this.ctx.waitUntil.bind(this.ctx),
|
|
82
|
+
},
|
|
83
|
+
env: this.bindings(ctx),
|
|
84
|
+
},
|
|
85
|
+
() => f(bindings),
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async #getWorkflow(
|
|
90
|
+
workflowId: string,
|
|
91
|
+
bindings: DefaultEnv,
|
|
92
|
+
): Promise<{ workflow: MastraWorkflow }> {
|
|
93
|
+
const bindedWorkflows = await Promise.all(
|
|
94
|
+
workflows?.map(async (workflow) => {
|
|
95
|
+
const workflowResult = workflow(bindings);
|
|
96
|
+
if (isWorkflow(workflowResult)) {
|
|
97
|
+
return { workflow: workflowResult };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return await workflowResult;
|
|
101
|
+
}) ?? [],
|
|
102
|
+
);
|
|
103
|
+
const workflowsMap = Object.fromEntries(
|
|
104
|
+
bindedWorkflows.map((w) => [w.workflow.id, w.workflow]),
|
|
105
|
+
);
|
|
106
|
+
const d1Storage = new D1Store({
|
|
107
|
+
client: bindings.DECO_WORKSPACE_DB,
|
|
108
|
+
});
|
|
109
|
+
const mastra = new Mastra({
|
|
110
|
+
storage: d1Storage,
|
|
111
|
+
workflows: {
|
|
112
|
+
[workflowId]: workflowsMap[workflowId],
|
|
113
|
+
},
|
|
114
|
+
telemetry: {
|
|
115
|
+
enabled: true,
|
|
116
|
+
serviceName: `app-${
|
|
117
|
+
this.env.DECO_CHAT_SCRIPT_SLUG ?? this.env.DECO_APP_SLUG
|
|
118
|
+
}`,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
// since mastra workflows are thenables, so we need to wrap then into an object
|
|
122
|
+
return { workflow: mastra.getWorkflow(workflowId) };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
start({ workflowId, runId, args, ctx }: StartWorkflowArgs) {
|
|
126
|
+
return this.runWithContext(ctx, async (bindings) => {
|
|
127
|
+
const { workflow } = await this.#getWorkflow(workflowId, bindings);
|
|
128
|
+
|
|
129
|
+
const run = await workflow.createRunAsync({
|
|
130
|
+
runId: this.ctx.id.name ?? runId,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const promise = run.start({
|
|
134
|
+
inputData: args,
|
|
135
|
+
runtimeContext: createRuntimeContext(bindings, this.ctx),
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
this.ctx.waitUntil(
|
|
139
|
+
promise
|
|
140
|
+
.then(() => {
|
|
141
|
+
console.debug("workflow", run.runId, "finished successfully");
|
|
142
|
+
})
|
|
143
|
+
.catch((e) => {
|
|
144
|
+
console.error("workflow", run.runId, "finished with error", e);
|
|
145
|
+
throw e;
|
|
146
|
+
}),
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
runId: run.runId,
|
|
151
|
+
};
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
cancel({ workflowId, runId, ctx }: CancelWorkflowArgs) {
|
|
156
|
+
return this.runWithContext(ctx, async () => {
|
|
157
|
+
const { workflow } = await this.#getWorkflow(
|
|
158
|
+
workflowId,
|
|
159
|
+
this.bindings(ctx),
|
|
160
|
+
);
|
|
161
|
+
const run = await workflow.createRunAsync({
|
|
162
|
+
runId: this.ctx.id.name ?? runId,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
this.ctx.waitUntil(run.cancel());
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
cancelled: true,
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
resume({ workflowId, runId, resumeData, stepId, ctx }: ResumeWorkflowArgs) {
|
|
173
|
+
return this.runWithContext(ctx, async (bindings) => {
|
|
174
|
+
const { workflow } = await this.#getWorkflow(workflowId, bindings);
|
|
175
|
+
const run = await workflow.createRunAsync({
|
|
176
|
+
runId: this.ctx.id.name ?? runId,
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
this.ctx.waitUntil(
|
|
180
|
+
run.resume({
|
|
181
|
+
resumeData,
|
|
182
|
+
step: stepId,
|
|
183
|
+
runtimeContext: createRuntimeContext(bindings, this.ctx),
|
|
184
|
+
}),
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
resumed: true,
|
|
189
|
+
};
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
};
|
package/src/wrangler.ts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
export interface BindingBase {
|
|
2
|
+
name: string;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export interface MCPIntegrationIdBinding extends BindingBase {
|
|
6
|
+
type: "mcp";
|
|
7
|
+
/**
|
|
8
|
+
* If not provided, will return a function that takes the integration id and return the binding implementation..
|
|
9
|
+
*/
|
|
10
|
+
integration_id: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface MCPIntegrationNameBinding extends BindingBase {
|
|
14
|
+
type: "mcp";
|
|
15
|
+
/**
|
|
16
|
+
* The name of the integration to bind.
|
|
17
|
+
*/
|
|
18
|
+
integration_name: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ContractClause {
|
|
21
|
+
id: string;
|
|
22
|
+
price: string | number; // can be microdollar or dollars
|
|
23
|
+
description?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface Contract {
|
|
27
|
+
body: string;
|
|
28
|
+
clauses: ContractClause[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ContractBinding extends BindingBase {
|
|
32
|
+
type: "contract";
|
|
33
|
+
/**
|
|
34
|
+
* The clauses of this contract
|
|
35
|
+
*/
|
|
36
|
+
contract: Contract;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type MCPBinding = MCPIntegrationIdBinding | MCPIntegrationNameBinding;
|
|
40
|
+
|
|
41
|
+
export type Binding = MCPBinding | ContractBinding;
|
|
42
|
+
|
|
43
|
+
export interface MigrationBase {
|
|
44
|
+
tag: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface NewClassMigration extends MigrationBase {
|
|
48
|
+
new_classes?: string[];
|
|
49
|
+
new_sqlite_classes?: string[];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface DeletedClassMigration extends MigrationBase {
|
|
53
|
+
deleted_classes: string[];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface RenamedClassMigration extends MigrationBase {
|
|
57
|
+
renamed_classes: {
|
|
58
|
+
from: string;
|
|
59
|
+
to: string;
|
|
60
|
+
}[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type Migration =
|
|
64
|
+
| NewClassMigration
|
|
65
|
+
| DeletedClassMigration
|
|
66
|
+
| RenamedClassMigration;
|
|
67
|
+
|
|
68
|
+
export interface KVNamespace {
|
|
69
|
+
binding: string;
|
|
70
|
+
id: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface Triggers {
|
|
74
|
+
crons: string[];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface Route {
|
|
78
|
+
pattern: string;
|
|
79
|
+
custom_domain?: boolean;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface WranglerConfig {
|
|
83
|
+
name: string;
|
|
84
|
+
main?: string;
|
|
85
|
+
scope?: string;
|
|
86
|
+
main_module?: string;
|
|
87
|
+
routes?: Route[];
|
|
88
|
+
compatibility_date?: string;
|
|
89
|
+
compatibility_flags?: string[];
|
|
90
|
+
vars?: Record<string, string>;
|
|
91
|
+
kv_namespaces?: KVNamespace[];
|
|
92
|
+
triggers?: Triggers;
|
|
93
|
+
//
|
|
94
|
+
ai?: {
|
|
95
|
+
binding: string;
|
|
96
|
+
};
|
|
97
|
+
browser?: {
|
|
98
|
+
binding: string;
|
|
99
|
+
};
|
|
100
|
+
durable_objects?: {
|
|
101
|
+
bindings?: { name: string; class_name: string }[];
|
|
102
|
+
};
|
|
103
|
+
hyperdrive?: { binding: string; id: string; localConnectionString: string }[];
|
|
104
|
+
d1_databases?: {
|
|
105
|
+
database_name: string;
|
|
106
|
+
database_id?: string;
|
|
107
|
+
binding: string;
|
|
108
|
+
}[];
|
|
109
|
+
queues?: {
|
|
110
|
+
consumers?: {
|
|
111
|
+
queue: string;
|
|
112
|
+
max_batch_timeout: number;
|
|
113
|
+
}[];
|
|
114
|
+
producers?: {
|
|
115
|
+
queue: string;
|
|
116
|
+
binding: string;
|
|
117
|
+
}[];
|
|
118
|
+
};
|
|
119
|
+
workflows?: {
|
|
120
|
+
name: string;
|
|
121
|
+
binding: string;
|
|
122
|
+
class_name?: string;
|
|
123
|
+
script_name?: string;
|
|
124
|
+
}[];
|
|
125
|
+
migrations?: Migration[];
|
|
126
|
+
assets?: {
|
|
127
|
+
directory?: string;
|
|
128
|
+
binding?: string;
|
|
129
|
+
jwt?: string;
|
|
130
|
+
not_found_handling?: "none" | "404-page" | "single-page-application";
|
|
131
|
+
run_worker_first?: boolean;
|
|
132
|
+
};
|
|
133
|
+
keep_assets?: boolean;
|
|
134
|
+
//
|
|
135
|
+
deco?: {
|
|
136
|
+
enable_workflows?: boolean;
|
|
137
|
+
workspace?: string;
|
|
138
|
+
local?: boolean;
|
|
139
|
+
integration?: {
|
|
140
|
+
friendlyName?: string;
|
|
141
|
+
icon?: string;
|
|
142
|
+
description?: string;
|
|
143
|
+
};
|
|
144
|
+
bindings?: Binding[];
|
|
145
|
+
};
|
|
146
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http-client-transport.ts","../src/mcp-client.ts"],"names":["BaseClient"],"mappings":"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","file":"chunk-4UQ5U73Y.js","sourcesContent":["import type { JSONRPCMessage } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n StreamableHTTPClientTransport,\n type StreamableHTTPClientTransportOptions,\n} from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\n\nexport class HTTPClientTransport extends StreamableHTTPClientTransport {\n constructor(url: URL, opts?: StreamableHTTPClientTransportOptions) {\n super(url, opts);\n }\n\n override send(\n message: JSONRPCMessage,\n options?: {\n resumptionToken?: string;\n onresumptiontoken?: (token: string) => void;\n },\n ): Promise<void> {\n const mockAction = getMockActionFor(message);\n if (mockAction?.type === \"emit\") {\n this.onmessage?.(mockAction.message);\n return Promise.resolve();\n }\n if (mockAction?.type === \"suppress\") {\n return Promise.resolve();\n }\n return super.send(message, options);\n }\n}\n\ntype MockAction =\n | { type: \"emit\"; message: JSONRPCMessage }\n | { type: \"suppress\" };\n\nfunction getMockActionFor(message: JSONRPCMessage): MockAction | null {\n const m = message;\n if (!m || typeof m !== \"object\" || !(\"method\" in m)) return null;\n\n switch (m.method) {\n case \"initialize\": {\n const protocolVersion = m?.params?.protocolVersion;\n if (!protocolVersion) return null;\n return {\n type: \"emit\",\n message: {\n result: {\n protocolVersion,\n capabilities: { tools: {} },\n serverInfo: { name: \"deco-chat-server\", version: \"1.0.0\" },\n },\n jsonrpc: m.jsonrpc ?? \"2.0\",\n // @ts-expect-error - id is not typed\n id: m.id,\n } as JSONRPCMessage,\n };\n }\n case \"notifications/roots/list_changed\":\n case \"notifications/initialized\":\n case \"notifications/cancelled\":\n case \"notifications/progress\": {\n return { type: \"suppress\" };\n }\n default:\n return null;\n }\n}\n","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 const createServerClient = async (\n mcpServer: { connection: MCPConnection; name?: string },\n signal?: AbortSignal,\n extraHeaders?: Record<string, string>,\n): Promise<Client> => {\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 timeout: 180000, // 3 minutes\n });\n\n await client.connect(transport);\n\n return client;\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resources.ts"],"names":[],"mappings":"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","file":"chunk-73FIKR3X.js","sourcesContent":["import { z } from \"zod\";\nimport mimeDb from \"mime-db\";\n\ntype MimeDb = Record<string, { extensions?: string[] }>;\n\nconst EXTENSION_TO_MIME = (() => {\n const map = new Map<string, string>();\n Object.entries(mimeDb as MimeDb).forEach(([type, meta]) => {\n meta.extensions?.forEach((ext) => {\n if (!map.has(ext)) {\n map.set(ext, type);\n }\n });\n });\n return map;\n})();\n\nfunction extractExtension(value: string): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n const sanitized = trimmed.replace(/^[^?#]*/g, (match) => match);\n const withoutQuery = sanitized.split(/[?#]/)[0];\n\n if (withoutQuery.startsWith(\".\")) {\n return withoutQuery.slice(1).toLowerCase();\n }\n\n if (!withoutQuery.includes(\".\")) {\n if (!withoutQuery.includes(\"/\") && !withoutQuery.includes(\"\\\\\")) {\n return withoutQuery.toLowerCase();\n }\n return undefined;\n }\n\n const lastDot = withoutQuery.lastIndexOf(\".\");\n if (lastDot === -1 || lastDot === withoutQuery.length - 1) return undefined;\n return withoutQuery.slice(lastDot + 1).toLowerCase();\n}\n\n// Base Resource Schema (enhanced)\nexport const ResourceSchema = z.object({\n name: z.string(),\n title: z.string().optional(),\n description: z.string().optional(),\n uri: z.string().url(),\n mimeType: z.string().optional(),\n thumbnail: z.string().url().optional(),\n timestamp: z.string().datetime().optional(),\n size: z.number().positive().optional(),\n annotations: z.record(z.string(), z.string()).optional(),\n});\n\n// Tool Input/Output Schemas (unified)\nexport const ResourcesReadInputSchema = z.object({\n name: z.string().describe(\"Resource type name (e.g., 'Page', 'GoogleDrive')\"),\n uri: z\n .string()\n .url()\n .describe(\n \"The URI of the resource to read. It's important to add the url scheme. Use file:// for files. Use https:// or http:// for remote files\",\n ),\n});\n\nexport const ResourcesReadOutputSchema = ResourceSchema.extend({\n data: z.string().describe(\"The resource content as a string\"),\n type: z\n .enum([\"text\", \"blob\"])\n .describe(\n \"Type of data: 'text' for plain text, 'blob' for base64-encoded binary\",\n ),\n});\n\nexport const ResourceSearchInputSchema = z.object({\n name: z.string().describe(\"Resource type name (e.g., 'Page', 'GoogleDrive')\"),\n term: z.string().describe(\"The term to search for\"),\n cursor: z.string().optional(),\n limit: z.number().positive().optional(),\n});\n\nexport const ResourceSearchOutputSchema = z.object({\n items: z.array(ResourceSchema),\n hasMore: z.boolean(),\n nextCursor: z.string().optional(),\n});\n\nexport const ResourceCreateInputSchema = z.object({\n name: z.string().describe(\"Resource type name (e.g., 'Page', 'GoogleDrive')\"),\n resourceName: z\n .string()\n .describe(\n \"Name of the specific resource instance. DO NOT ADD EXTENSIONS TO THE NAME\",\n ),\n title: z.string().optional(),\n description: z.string().optional(),\n content: z\n .object({\n data: z.string(),\n type: z.enum([\"text\", \"blob\"]),\n mimeType: z.string().optional(),\n })\n .describe(\"Content to create the resource with\"),\n metadata: z.record(z.string(), z.any()).optional(),\n});\nexport const ResourceCreateOutputSchema = ResourceSchema;\n\nexport const ResourceUpdateInputSchema = z.object({\n name: z.string().describe(\"Resource type name (e.g., 'Page', 'GoogleDrive')\"),\n uri: z.string().url().describe(\"URI of the resource to update\"),\n resourceName: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n content: z\n .object({\n data: z.string(),\n type: z.enum([\"text\", \"blob\"]),\n mimeType: z.string().optional(),\n })\n .optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n});\nexport const ResourceUpdateOutputSchema = ResourceSchema;\n\nexport const ResourceDeleteInputSchema = z.object({\n name: z.string().describe(\"Resource type name (e.g., 'Page', 'GoogleDrive')\"),\n uri: z.string().url().describe(\"URI of the resource to delete\"),\n force: z.boolean().optional(),\n});\nexport const ResourceDeleteOutputSchema = z.object({\n deletedUri: z.string().url(),\n});\n\nexport const ResourcesListInputSchema = z.object({});\nexport const ResourcesListOutputSchema = z.object({\n resources: z.array(\n z.object({\n name: z.string(),\n icon: z.string(),\n title: z.string(),\n description: z.string(),\n hasCreate: z.boolean().optional(),\n hasUpdate: z.boolean().optional(),\n hasDelete: z.boolean().optional(),\n }),\n ),\n});\n\n// Export Types\nexport type Resource = z.infer<typeof ResourceSchema>;\nexport type ResourcesReadInput = z.infer<typeof ResourcesReadInputSchema>;\nexport type ResourcesReadOutput = z.infer<typeof ResourcesReadOutputSchema>;\nexport type ResourcesSearchInput = z.infer<typeof ResourceSearchInputSchema>;\nexport type ResourcesSearchOutput = z.infer<typeof ResourceSearchOutputSchema>;\nexport type ResourceCreateInput = z.infer<typeof ResourceCreateInputSchema>;\nexport type ResourceCreateOutput = z.infer<typeof ResourceCreateOutputSchema>;\nexport type ResourceUpdateInput = z.infer<typeof ResourceUpdateInputSchema>;\nexport type ResourceUpdateOutput = z.infer<typeof ResourceUpdateOutputSchema>;\nexport type ResourceDeleteInput = z.infer<typeof ResourceDeleteInputSchema>;\nexport type ResourceDeleteOutput = z.infer<typeof ResourceDeleteOutputSchema>;\nexport type ResourcesListInput = z.infer<typeof ResourcesListInputSchema>;\nexport type ResourcesListOutput = z.infer<typeof ResourcesListOutputSchema>;\n\nexport const mimeType = (filePathOrExtension: string) => {\n const ext = extractExtension(filePathOrExtension);\n if (!ext) return \"text/plain\";\n return EXTENSION_TO_MIME.get(ext) ?? \"text/plain\";\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/well-known.ts","../src/proxy.ts"],"names":[],"mappings":"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","file":"chunk-G3NWZG2F.js","sourcesContent":["export 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 = await createServerClient(\n { connection: toolConnection },\n undefined,\n extraHeaders,\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/state.ts","../src/mastra.ts"],"names":["mastraCreateTool","mastraCreateStep","z","_","bindings","w","base"],"mappings":"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","file":"chunk-ZRJ5SGAO.js","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { z } from \"zod\";\nimport type { AppContext } from \"./mastra.ts\";\nimport { createTool } from \"./mastra.ts\";\n\nconst asyncLocalStorage = new AsyncLocalStorage<AppContext | undefined>();\n\nexport const State = {\n getStore: () => {\n return asyncLocalStorage.getStore();\n },\n run: <TEnv, R, TArgs extends unknown[]>(\n ctx: AppContext<TEnv>,\n f: (...args: TArgs) => R,\n ...args: TArgs\n ): R => asyncLocalStorage.run(ctx, f, ...args),\n};\n\nexport interface ValidationPayload {\n state: unknown;\n}\n\nexport const createStateValidationTool = (stateSchema?: z.ZodTypeAny) => {\n return createTool({\n id: \"DECO_CHAT_STATE_VALIDATION\",\n description: \"Validate the state of the OAuth flow\",\n inputSchema: z.object({\n state: z.unknown(),\n }),\n outputSchema: z.object({\n valid: z.boolean(),\n }),\n execute: (ctx) => {\n if (!stateSchema) {\n return Promise.resolve({ valid: true });\n }\n const parsed = stateSchema.safeParse(ctx.context.state);\n return Promise.resolve({\n valid: parsed.success,\n reason: parsed.error?.message,\n });\n },\n });\n};\n","/* oxlint-disable no-explicit-any */\n/* oxlint-disable ban-types */\nimport { HttpServerTransport } from \"@deco/mcp/http\";\nimport {\n createTool as mastraCreateTool,\n Tool,\n type ToolAction,\n type ToolExecutionContext,\n type Workflow,\n} from \"@mastra/core\";\nimport { RuntimeContext } from \"@mastra/core/di\";\nimport {\n createStep as mastraCreateStep,\n createWorkflow,\n type DefaultEngineType,\n type ExecuteFunction,\n type Step as MastraStep,\n} from \"@mastra/core/workflows\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { ViewsListOutputSchema } from \"./views.ts\";\nimport {\n ResourceCreateInputSchema,\n ResourceCreateOutputSchema,\n ResourceDeleteInputSchema,\n ResourceDeleteOutputSchema,\n ResourceSearchInputSchema,\n ResourceSearchOutputSchema,\n ResourcesListOutputSchema,\n ResourcesReadInputSchema,\n ResourcesReadOutputSchema,\n ResourceUpdateInputSchema,\n ResourceUpdateOutputSchema,\n} from \"./resources.ts\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { DefaultEnv } from \"./index.ts\";\nimport { createStateValidationTool, State } from \"./state.ts\";\nexport { createWorkflow };\n\nexport { cloneStep, cloneWorkflow } from \"@mastra/core/workflows\";\n\nexport const createRuntimeContext = (prev?: RuntimeContext<AppContext>) => {\n const runtimeContext = new RuntimeContext<AppContext>();\n const store = State.getStore();\n if (!store) {\n if (prev) {\n return prev;\n }\n throw new Error(\"Missing context, did you forget to call State.bind?\");\n }\n const { env, ctx, req } = store;\n runtimeContext.set(\"env\", env);\n runtimeContext.set(\"ctx\", ctx);\n runtimeContext.set(\"req\", req);\n return runtimeContext;\n};\n\n/**\n * creates a private tool that always ensure for athentication before being executed\n */\nexport function createPrivateTool<\n TSchemaIn extends z.ZodSchema = z.ZodSchema,\n TSchemaOut extends z.ZodSchema | undefined = undefined,\n TSuspendSchema extends z.ZodSchema = z.ZodSchema,\n TResumeSchema extends z.ZodSchema = z.ZodSchema,\n TContext extends\n ToolExecutionContext<TSchemaIn> = ToolExecutionContext<TSchemaIn>,\n TExecute extends ToolAction<\n TSchemaIn,\n TSchemaOut,\n any,\n any,\n TContext\n >[\"execute\"] = ToolAction<\n TSchemaIn,\n TSchemaOut,\n any,\n any,\n TContext\n >[\"execute\"],\n>(\n opts: ToolAction<\n TSchemaIn,\n TSchemaOut,\n TSuspendSchema,\n TResumeSchema,\n TContext\n > & {\n execute?: TExecute;\n },\n): [TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TExecute] extends [\n z.ZodSchema,\n z.ZodSchema,\n z.ZodSchema,\n z.ZodSchema,\n Function,\n]\n ? Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext> & {\n inputSchema: TSchemaIn;\n outputSchema: TSchemaOut;\n execute: (context: TContext) => Promise<any>;\n }\n : Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext> {\n const execute = opts.execute;\n if (typeof execute === \"function\") {\n opts.execute = ((input, options) => {\n const env = input.runtimeContext.get(\"env\") as DefaultEnv;\n if (env) {\n env.DECO_REQUEST_CONTEXT.ensureAuthenticated();\n }\n return execute(input, options);\n }) as TExecute;\n }\n return createTool(opts);\n}\nexport function createTool<\n TSchemaIn extends z.ZodSchema | undefined = undefined,\n TSchemaOut extends z.ZodSchema | undefined = undefined,\n TSuspendSchema extends z.ZodSchema = z.ZodSchema,\n TResumeSchema extends z.ZodSchema = z.ZodSchema,\n TContext extends ToolExecutionContext<\n TSchemaIn,\n TSuspendSchema,\n TResumeSchema\n > = ToolExecutionContext<TSchemaIn, TSuspendSchema, TResumeSchema>,\n TExecute extends ToolAction<\n TSchemaIn,\n TSchemaOut,\n TSuspendSchema,\n TResumeSchema,\n TContext\n >[\"execute\"] = ToolAction<\n TSchemaIn,\n TSchemaOut,\n TSuspendSchema,\n TResumeSchema,\n TContext\n >[\"execute\"],\n>(\n opts: ToolAction<\n TSchemaIn,\n TSchemaOut,\n TSuspendSchema,\n TResumeSchema,\n TContext\n > & {\n execute?: TExecute;\n },\n): [TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TExecute] extends [\n z.ZodSchema,\n z.ZodSchema,\n z.ZodSchema,\n z.ZodSchema,\n Function,\n]\n ? Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext> & {\n inputSchema: TSchemaIn;\n outputSchema: TSchemaOut;\n execute: (context: TContext) => Promise<any>;\n }\n : Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext> {\n // @ts-expect-error - TSchemaIn is not a ZodType\n return mastraCreateTool({\n ...opts,\n execute:\n typeof opts?.execute === \"function\"\n ? (((input) => {\n return opts.execute!({\n ...input,\n runtimeContext: createRuntimeContext(input.runtimeContext),\n });\n }) as TExecute)\n : opts.execute,\n });\n}\n\nexport type ExecWithContext<TF extends (...args: any[]) => any> = (\n input: Omit<Parameters<TF>[0], \"runtimeContext\"> & {\n runtimeContext: RuntimeContext<AppContext>;\n },\n) => ReturnType<TF>;\n\nexport interface Step<\n TStepId extends string = string,\n // @ts-expect-error - TState is not a ZodObject\n TState extends z.ZodObject<any> = z.ZodObject<any, z.$strip>,\n TSchemaIn extends z.ZodType<any> = z.ZodType<any>,\n TSchemaOut extends z.ZodType<any> = z.ZodType<any>,\n TResumeSchema extends z.ZodType<any> = z.ZodType<any>,\n TSuspendSchema extends z.ZodType<any> = z.ZodType<any>,\n TEngineType = any,\n> extends Omit<\n MastraStep<\n TStepId,\n TState,\n TSchemaIn,\n TSchemaOut,\n TResumeSchema,\n TSuspendSchema,\n TEngineType\n >,\n \"execute\"\n > {\n execute: ExecWithContext<\n ExecuteFunction<\n z.infer<TState>,\n z.infer<TSchemaIn>,\n z.infer<TSchemaOut>,\n z.infer<TResumeSchema>,\n z.infer<TSuspendSchema>,\n TEngineType\n >\n >;\n}\nexport function createStepFromTool<\n TSchemaIn extends z.ZodType<any>,\n TSchemaOut extends z.ZodType<any>,\n TSuspendSchema extends z.ZodType<any>,\n TResumeSchema extends z.ZodType<any>,\n TContext extends ToolExecutionContext<\n TSchemaIn,\n TSuspendSchema,\n TResumeSchema\n >,\n>(\n tool: Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext> & {\n inputSchema: TSchemaIn;\n outputSchema: TSchemaOut;\n execute: (context: TContext) => Promise<any>;\n },\n): Step<\n string,\n // @ts-expect-error - TSchemaIn is not a ZodType\n TSchemaIn,\n TSchemaOut,\n z.ZodType<any>,\n z.ZodType<any>,\n DefaultEngineType\n> {\n // @ts-expect-error - TSchemaIn is not a ZodType\n return mastraCreateStep(tool);\n}\n\nexport function createStep<\n TStepId extends string,\n TStepInput extends z.ZodType<any>,\n TStepOutput extends z.ZodType<any>,\n TResumeSchema extends z.ZodType<any>,\n TSuspendSchema extends z.ZodType<any>,\n>(opts: {\n id: TStepId;\n description?: string;\n inputSchema: TStepInput;\n outputSchema: TStepOutput;\n resumeSchema?: TResumeSchema;\n suspendSchema?: TSuspendSchema;\n execute: ExecWithContext<\n // @ts-expect-error - TStepInput is not a ZodObject\n ExecuteFunction<\n z.infer<TStepInput>,\n z.infer<TStepOutput>,\n z.infer<TResumeSchema>,\n z.infer<TSuspendSchema>,\n DefaultEngineType\n >\n >;\n}): Step<\n TStepId,\n // @ts-expect-error - TStepInput is not a ZodObject\n TStepInput,\n TStepOutput,\n TResumeSchema,\n TSuspendSchema,\n DefaultEngineType\n> {\n // @ts-expect-error - TStepInput is not a ZodObject\n return mastraCreateStep({\n ...opts,\n execute: (input) => {\n return opts.execute({\n ...input,\n runtimeContext: createRuntimeContext(input.runtimeContext),\n });\n },\n });\n}\n\nexport interface ViewExport {\n title: string;\n icon: string;\n url: string;\n tools?: string[];\n rules?: string[];\n installBehavior?: \"none\" | \"open\" | \"autoPin\";\n}\n\nexport type Resources<Env = any, TSchema extends z.ZodTypeAny = never> = Array<\n (env: Env & DefaultEnv<TSchema>) => {\n name: string;\n icon: string;\n title: string;\n description?: string;\n tools: {\n read: (args: { uri: string }) => Promise<unknown>;\n search: (args: {\n term: string;\n cursor?: string;\n limit?: number;\n }) => Promise<unknown>;\n create?: (\n args: z.infer<typeof ResourceCreateInputSchema>,\n ) => Promise<unknown>;\n update?: (\n args: z.infer<typeof ResourceUpdateInputSchema>,\n ) => Promise<unknown>;\n delete?: (\n args: z.infer<typeof ResourceDeleteInputSchema>,\n ) => Promise<unknown>;\n };\n views?: {\n list?: { url?: string; tools?: string[]; rules?: string[] };\n detail?: {\n url?: string;\n mimeTypePattern?: string;\n resourceName?: string;\n tools?: string[];\n rules?: string[];\n };\n };\n }\n>;\nexport interface Integration {\n id: string;\n appId: string;\n}\nexport type CreatedTool = ReturnType<typeof createTool>;\nexport interface CreateMCPServerOptions<\n Env = any,\n TSchema extends z.ZodTypeAny = never,\n> {\n before?: (env: Env & DefaultEnv<TSchema>) => Promise<void> | void;\n oauth?: {\n state?: TSchema;\n scopes?: string[];\n };\n views?: (\n env: Env & DefaultEnv<TSchema>,\n ) => Promise<ViewExport[]> | ViewExport[];\n resources?: Resources<Env, TSchema>;\n tools?:\n | Array<\n (\n env: Env & DefaultEnv<TSchema>,\n ) =>\n | Promise<CreatedTool>\n | CreatedTool\n | CreatedTool[]\n | Promise<CreatedTool[]>\n >\n | ((\n env: Env & DefaultEnv<TSchema>,\n ) => CreatedTool[] | Promise<CreatedTool[]>);\n workflows?: Array<\n (\n env: Env & DefaultEnv<TSchema>,\n ) => // this is a workaround to allow workflows to be thenables\n | Promise<{ workflow: ReturnType<typeof createWorkflow> }>\n | ReturnType<typeof createWorkflow>\n >;\n}\n\nexport type Fetch<TEnv = any> = (\n req: Request,\n env: TEnv,\n ctx: ExecutionContext,\n) => Promise<Response> | Response;\n\nexport interface AppContext<TEnv = any> {\n env: TEnv;\n ctx: { waitUntil: (promise: Promise<any>) => void };\n req?: Request;\n}\n\nconst decoChatOAuthToolsFor = <TSchema extends z.ZodTypeAny = never>({\n state: schema,\n scopes,\n}: CreateMCPServerOptions<any, TSchema>[\"oauth\"] = {}) => {\n const jsonSchema = schema\n ? zodToJsonSchema(schema)\n : { type: \"object\", properties: {} };\n return [\n createTool({\n id: \"DECO_CHAT_OAUTH_START\",\n description: \"OAuth for Deco Chat\",\n inputSchema: z.object({\n returnUrl: z.string(),\n }),\n outputSchema: z.object({\n stateSchema: z.any(),\n scopes: z.array(z.string()).optional(),\n }),\n execute: () => {\n return Promise.resolve({\n stateSchema: jsonSchema,\n scopes,\n });\n },\n }),\n ];\n};\n\nconst createWorkflowTools = <TEnv = any, TSchema extends z.ZodTypeAny = never>(\n workflow: ReturnType<typeof createWorkflow>,\n bindings: TEnv & DefaultEnv<TSchema>,\n) => {\n const startTool = createTool({\n id: `DECO_CHAT_WORKFLOWS_START_${workflow.id}`,\n description: workflow.description ?? `Start workflow ${workflow.id}`,\n inputSchema:\n workflow.inputSchema && \"shape\" in workflow.inputSchema\n ? workflow.inputSchema\n : z.object({}),\n outputSchema: z.object({\n id: z.string(),\n }),\n execute: async (args) => {\n const store = State.getStore();\n const runId =\n store?.req?.headers.get(\"x-deco-chat-run-id\") ?? crypto.randomUUID();\n const workflowDO = bindings.DECO_WORKFLOW_DO.get(\n bindings.DECO_WORKFLOW_DO.idFromName(runId),\n );\n\n using result = await workflowDO.start({\n workflowId: workflow.id,\n args: args.context,\n runId,\n ctx: bindings.DECO_REQUEST_CONTEXT,\n });\n return { id: result.runId };\n },\n });\n\n const cancelTool = createTool({\n id: `DECO_CHAT_WORKFLOWS_CANCEL_${workflow.id}`,\n description: `Cancel ${workflow.description ?? `workflow ${workflow.id}`}`,\n inputSchema: z.object({ runId: z.string() }),\n outputSchema: z.object({ cancelled: z.boolean() }),\n execute: async (args) => {\n const runId = args.context.runId;\n const workflowDO = bindings.DECO_WORKFLOW_DO.get(\n bindings.DECO_WORKFLOW_DO.idFromName(runId),\n );\n\n using _ = await workflowDO.cancel({\n workflowId: workflow.id,\n runId,\n ctx: bindings.DECO_REQUEST_CONTEXT,\n });\n\n return { cancelled: true };\n },\n });\n\n const resumeTool = createTool({\n id: `DECO_CHAT_WORKFLOWS_RESUME_${workflow.id}`,\n description: `Resume ${workflow.description ?? `workflow ${workflow.id}`}`,\n inputSchema: z.object({\n runId: z.string(),\n stepId: z.string(),\n resumeData: z.any(),\n }),\n outputSchema: z.object({ resumed: z.boolean() }),\n execute: async (args) => {\n const runId = args.context.runId;\n const workflowDO = bindings.DECO_WORKFLOW_DO.get(\n bindings.DECO_WORKFLOW_DO.idFromName(runId),\n );\n\n using _ = await workflowDO.resume({\n workflowId: workflow.id,\n runId,\n resumeData: args.context.resumeData,\n stepId: args.context.stepId,\n ctx: bindings.DECO_REQUEST_CONTEXT,\n });\n\n return { resumed: true };\n },\n });\n\n return [startTool, cancelTool, resumeTool];\n};\n\ntype CallTool = (opts: {\n toolCallId: string;\n toolCallInput: any;\n}) => Promise<any>;\n\nexport type MCPServer<TEnv = any, TSchema extends z.ZodTypeAny = never> = {\n fetch: Fetch<TEnv & DefaultEnv<TSchema>>;\n callTool: CallTool;\n};\n\nexport const isWorkflow = (value: any): value is Workflow => {\n return value && !(value instanceof Promise);\n};\n\nexport const createMCPServer = <\n TEnv = any,\n TSchema extends z.ZodTypeAny = never,\n>(\n options: CreateMCPServerOptions<TEnv, TSchema>,\n): MCPServer<TEnv, TSchema> => {\n const createServer = async (bindings: TEnv & DefaultEnv<TSchema>) => {\n await options.before?.(bindings);\n\n const server = new McpServer(\n { name: \"@deco/mcp-api\", version: \"1.0.0\" },\n { capabilities: { tools: {} } },\n );\n\n // Resolve resources first; build resource tools; append later\n const resolvedResources = await Promise.all(\n options.resources?.map((r) => r(bindings)) ?? [],\n );\n const readHandlers = new Map<\n string,\n (a: { uri: string }) => Promise<any>\n >();\n const searchHandlers = new Map<\n string,\n (a: { term: string; cursor?: string; limit?: number }) => Promise<any>\n >();\n const createHandlers = new Map<string, (a: any) => Promise<any>>();\n const updateHandlers = new Map<string, (a: any) => Promise<any>>();\n const deleteHandlers = new Map<string, (a: any) => Promise<any>>();\n for (const r of resolvedResources) {\n if (r?.tools?.read) readHandlers.set(r.name, r.tools.read);\n if (r?.tools?.search) searchHandlers.set(r.name, r.tools.search);\n if (r?.tools?.create) createHandlers.set(r.name, r.tools.create);\n if (r?.tools?.update) updateHandlers.set(r.name, r.tools.update);\n if (r?.tools?.delete) deleteHandlers.set(r.name, r.tools.delete);\n }\n const resourceTools: ReturnType<typeof createTool>[] = [];\n if (resolvedResources.length > 0) {\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_READ\",\n description: \"Read a resource by uri (name + uri)\",\n inputSchema: ResourcesReadInputSchema,\n outputSchema: ResourcesReadOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = readHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`READ not implemented for ${input.name}`);\n }\n // @ts-expect-error - input.name is not a string\n return fn({ uri: input.uri });\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_SEARCH\",\n description: \"Search resources (name + term)\",\n inputSchema: ResourceSearchInputSchema,\n outputSchema: ResourceSearchOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = searchHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`SEARCH not implemented for ${input.name}`);\n }\n // @ts-expect-error - input.name is not a string\n const { term, cursor, limit } = input;\n return fn({ term, cursor, limit });\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_CREATE\",\n description: \"Create a resource (name + content)\",\n inputSchema: ResourceCreateInputSchema,\n outputSchema: ResourceCreateOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = createHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`CREATE not implemented for ${input.name}`);\n }\n return fn(input);\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_UPDATE\",\n description: \"Update a resource (name + uri)\",\n inputSchema: ResourceUpdateInputSchema,\n outputSchema: ResourceUpdateOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = updateHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`UPDATE not implemented for ${input.name}`);\n }\n return fn(input);\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_DELETE\",\n description: \"Delete a resource (name + uri)\",\n inputSchema: ResourceDeleteInputSchema,\n outputSchema: ResourceDeleteOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = deleteHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`DELETE not implemented for ${input.name}`);\n }\n return fn(input);\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_LIST\",\n description: \"List resource types\",\n inputSchema: z.object({}),\n outputSchema: ResourcesListOutputSchema,\n execute: () =>\n Promise.resolve({\n resources: resolvedResources.map((r) => ({\n name: r.name,\n icon: r.icon,\n title: r.title,\n description: r.description ?? \"\",\n hasCreate: Boolean(createHandlers.get(r.name)),\n hasUpdate: Boolean(updateHandlers.get(r.name)),\n hasDelete: Boolean(deleteHandlers.get(r.name)),\n })),\n }),\n }),\n );\n }\n\n const toolsFn =\n typeof options.tools === \"function\"\n ? options.tools\n : async (bindings: TEnv & DefaultEnv<TSchema>) => {\n if (typeof options.tools === \"function\") {\n return await options.tools(bindings);\n }\n return await Promise.all(\n options.tools?.flatMap(async (tool) => {\n const toolResult = tool(bindings);\n const awaited = await toolResult;\n if (Array.isArray(awaited)) {\n return awaited;\n }\n return [awaited];\n }) ?? [],\n ).then((t) => t.flat());\n };\n const tools = await toolsFn(bindings);\n\n // since mastra workflows are thenables, we need to await and add as a prop\n const workflows = await Promise.all(\n options.workflows?.map(async (workflow) => {\n const workflowResult = workflow(bindings);\n if (isWorkflow(workflowResult)) {\n return { workflow: workflowResult };\n }\n\n return await workflowResult;\n }) ?? [],\n ).then((w) => w.map((w) => w.workflow));\n\n const workflowTools =\n workflows?.flatMap((workflow) =>\n createWorkflowTools(workflow, bindings),\n ) ?? [];\n\n tools.push(...workflowTools);\n tools.push(...decoChatOAuthToolsFor<TSchema>(options.oauth));\n tools.push(createStateValidationTool(options.oauth?.state));\n\n tools.push(\n createTool({\n id: `DECO_CHAT_VIEWS_LIST`,\n description: \"List views exposed by this MCP\",\n inputSchema: z.any(),\n outputSchema: ViewsListOutputSchema,\n execute: async () => {\n const base = ((await options.views?.(bindings)) ?? []).map((v) => ({\n id: undefined,\n // Stable machine name for routing: UPPERCASE + underscores\n name: v.title.toUpperCase().replace(/[^A-Z0-9]/g, \"_\"),\n title: v.title,\n description: undefined,\n icon: v.icon,\n url: v.url,\n tools: v.tools ?? [],\n rules: v.rules ?? [],\n installBehavior: v.installBehavior ?? \"none\",\n }));\n const resourceViews = resolvedResources\n .map((r) => {\n const listUrl =\n r.views?.list?.url ??\n `internal://resource/list?name=${encodeURIComponent(r.name)}`;\n\n // Default CRUD tool ids for resources\n const defaultListTools: string[] = (() => {\n const base = [\n \"DECO_CHAT_RESOURCES_LIST\",\n \"DECO_CHAT_RESOURCES_READ\",\n \"DECO_CHAT_RESOURCES_SEARCH\",\n ];\n const canCreate = Boolean(createHandlers.get(r.name));\n const canUpdate = Boolean(updateHandlers.get(r.name));\n const canDelete = Boolean(deleteHandlers.get(r.name));\n if (canCreate) base.push(\"DECO_CHAT_RESOURCES_CREATE\");\n if (canUpdate) base.push(\"DECO_CHAT_RESOURCES_UPDATE\");\n if (canDelete) base.push(\"DECO_CHAT_RESOURCES_DELETE\");\n return base;\n })();\n\n const defaultListRules: string[] = [\n `You are viewing the ${\n r.title ?? r.name\n } resources list. Resources are changeable via Resource tools (DECO_CHAT_RESOURCES_*). Use the appropriate tools to read, search, create, update, or delete items; do not fabricate data.`,\n ];\n\n const list = [\n {\n name: `${r.name.toUpperCase()}_LIST`,\n title: `${r.name} List`,\n description: r.description,\n icon: r.icon,\n url: listUrl,\n tools: r.views?.list?.tools ?? defaultListTools,\n rules: r.views?.list?.rules ?? defaultListRules,\n },\n ];\n const detailUrl =\n r.views?.detail?.url ??\n `internal://resource/detail?name=${encodeURIComponent(r.name)}`;\n const detail = [\n {\n name: `${r.name.toUpperCase()}_DETAIL`,\n title: `${r.name} Detail`,\n description: r.description,\n icon: r.icon,\n url: detailUrl,\n mimeTypePattern: r.views?.detail?.mimeTypePattern,\n resourceName: r.views?.detail?.resourceName ?? r.name,\n tools: r.views?.detail?.tools ?? [],\n rules: r.views?.detail?.rules ?? [],\n },\n ];\n return [...list, ...detail];\n })\n .flat();\n\n return { views: [...base, ...resourceViews] };\n },\n }),\n );\n\n for (const tool of tools) {\n server.registerTool(\n tool.id,\n {\n description: tool.description,\n inputSchema:\n tool.inputSchema && \"shape\" in tool.inputSchema\n ? (tool.inputSchema.shape as z.ZodRawShape)\n : z.object({}).shape,\n outputSchema:\n tool.outputSchema &&\n typeof tool.outputSchema === \"object\" &&\n \"shape\" in tool.outputSchema\n ? (tool.outputSchema.shape as z.ZodRawShape)\n : z.object({}).shape,\n },\n async (args) => {\n const result = await tool.execute!({\n context: args,\n runId: crypto.randomUUID(),\n runtimeContext: createRuntimeContext(),\n });\n return {\n structuredContent: result,\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result),\n },\n ],\n };\n },\n );\n }\n\n return { server, tools };\n };\n\n const fetch = async (\n req: Request,\n env: TEnv & DefaultEnv<TSchema>,\n _ctx: ExecutionContext,\n ) => {\n const { server } = await createServer(env);\n const transport = new HttpServerTransport();\n\n await server.connect(transport);\n\n return await transport.handleMessage(req);\n };\n\n const callTool: CallTool = async ({ toolCallId, toolCallInput }) => {\n const currentState = State.getStore();\n if (!currentState) {\n throw new Error(\"Missing state, did you forget to call State.bind?\");\n }\n const env = currentState?.env;\n const { tools } = await createServer(env);\n const tool = tools.find((t) => t.id === toolCallId);\n const execute = tool?.execute;\n if (!execute) {\n throw new Error(\n `Tool ${toolCallId} not found or does not have an execute function`,\n );\n }\n\n return execute({\n context: toolCallInput,\n runId: crypto.randomUUID(),\n runtimeContext: createRuntimeContext(),\n });\n };\n\n return {\n fetch,\n callTool,\n };\n};\n"]}
|