agents 0.0.0-5ebaeb2 → 0.0.0-603b825

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +108 -8
  2. package/dist/ai-chat-agent.d.ts +91 -19
  3. package/dist/ai-chat-agent.js +789 -343
  4. package/dist/ai-chat-agent.js.map +1 -1
  5. package/dist/ai-chat-v5-migration-BSiGZmYU.js +155 -0
  6. package/dist/ai-chat-v5-migration-BSiGZmYU.js.map +1 -0
  7. package/dist/ai-chat-v5-migration.d.ts +7 -4
  8. package/dist/ai-chat-v5-migration.js +3 -19
  9. package/dist/ai-react.d.ts +25 -23
  10. package/dist/ai-react.js +390 -304
  11. package/dist/ai-react.js.map +1 -1
  12. package/dist/ai-types-81H_-Uxh.d.ts +103 -0
  13. package/dist/ai-types-CrMqkwc_.js +24 -0
  14. package/dist/ai-types-CrMqkwc_.js.map +1 -0
  15. package/dist/ai-types.d.ts +6 -91
  16. package/dist/ai-types.js +3 -7
  17. package/dist/cli.d.ts +8 -0
  18. package/dist/cli.js +27 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/client-B3SR12TQ.js +117 -0
  21. package/dist/client-B3SR12TQ.js.map +1 -0
  22. package/dist/client-BAQA84dr.d.ts +104 -0
  23. package/dist/client-BZ-xTxF5.js +901 -0
  24. package/dist/client-BZ-xTxF5.js.map +1 -0
  25. package/dist/client-ctTw3KHG.d.ts +1440 -0
  26. package/dist/client.d.ts +11 -92
  27. package/dist/client.js +4 -12
  28. package/dist/codemode/ai.d.ts +27 -0
  29. package/dist/codemode/ai.js +151 -0
  30. package/dist/codemode/ai.js.map +1 -0
  31. package/dist/do-oauth-client-provider-Cs9QpXYp.js +93 -0
  32. package/dist/do-oauth-client-provider-Cs9QpXYp.js.map +1 -0
  33. package/dist/do-oauth-client-provider-UhQDpDb8.d.ts +134 -0
  34. package/dist/index-BUle9RiP.d.ts +58 -0
  35. package/dist/index-D2dnUH0r.d.ts +578 -0
  36. package/dist/index.d.ts +56 -550
  37. package/dist/index.js +7 -31
  38. package/dist/mcp/client.d.ts +4 -11
  39. package/dist/mcp/client.js +4 -9
  40. package/dist/mcp/do-oauth-client-provider.d.ts +2 -42
  41. package/dist/mcp/do-oauth-client-provider.js +3 -7
  42. package/dist/mcp/index.d.ts +188 -92
  43. package/dist/mcp/index.js +1426 -1012
  44. package/dist/mcp/index.js.map +1 -1
  45. package/dist/mcp/x402.d.ts +34 -0
  46. package/dist/mcp/x402.js +198 -0
  47. package/dist/mcp/x402.js.map +1 -0
  48. package/dist/mcp-BwPscEiF.d.ts +61 -0
  49. package/dist/observability/index.d.ts +3 -46
  50. package/dist/observability/index.js +7 -11
  51. package/dist/react-B_ENAdCe.d.ts +113 -0
  52. package/dist/react.d.ts +10 -123
  53. package/dist/react.js +183 -112
  54. package/dist/react.js.map +1 -1
  55. package/dist/schedule.d.ts +13 -10
  56. package/dist/schedule.js +43 -31
  57. package/dist/schedule.js.map +1 -1
  58. package/dist/serializable-faDkMCai.d.ts +39 -0
  59. package/dist/serializable.d.ts +7 -32
  60. package/dist/serializable.js +1 -1
  61. package/dist/src-C6rC6ZpH.js +1248 -0
  62. package/dist/src-C6rC6ZpH.js.map +1 -0
  63. package/package.json +71 -33
  64. package/dist/ai-chat-v5-migration.js.map +0 -1
  65. package/dist/ai-types.js.map +0 -1
  66. package/dist/chunk-AVYJQSLW.js +0 -17
  67. package/dist/chunk-AVYJQSLW.js.map +0 -1
  68. package/dist/chunk-IJPBZOSS.js +0 -1296
  69. package/dist/chunk-IJPBZOSS.js.map +0 -1
  70. package/dist/chunk-LL2AFX7V.js +0 -109
  71. package/dist/chunk-LL2AFX7V.js.map +0 -1
  72. package/dist/chunk-QEVM4BVL.js +0 -116
  73. package/dist/chunk-QEVM4BVL.js.map +0 -1
  74. package/dist/chunk-UJVEAURM.js +0 -150
  75. package/dist/chunk-UJVEAURM.js.map +0 -1
  76. package/dist/chunk-VYENMKFS.js +0 -612
  77. package/dist/chunk-VYENMKFS.js.map +0 -1
  78. package/dist/client-CcIORE73.d.ts +0 -4607
  79. package/dist/client.js.map +0 -1
  80. package/dist/index.js.map +0 -1
  81. package/dist/mcp/client.js.map +0 -1
  82. package/dist/mcp/do-oauth-client-provider.js.map +0 -1
  83. package/dist/observability/index.js.map +0 -1
  84. package/dist/serializable.js.map +0 -1
  85. package/src/index.ts +0 -1947
package/dist/client.d.ts CHANGED
@@ -1,98 +1,17 @@
1
+ import "./serializable-faDkMCai.js";
1
2
  import {
2
- PartySocketOptions,
3
- PartyFetchOptions,
4
- PartySocket
5
- } from "partysocket";
6
- import { SerializableReturnValue, SerializableValue } from "./serializable.js";
7
-
8
- /**
9
- * Options for creating an AgentClient
10
- */
11
- type AgentClientOptions<State = unknown> = Omit<
12
- PartySocketOptions,
13
- "party" | "room"
14
- > & {
15
- /** Name of the agent to connect to */
16
- agent: string;
17
- /** Name of the specific Agent instance */
18
- name?: string;
19
- /** Called when the Agent's state is updated */
20
- onStateUpdate?: (state: State, source: "server" | "client") => void;
21
- };
22
- /**
23
- * Options for streaming RPC calls
24
- */
25
- type StreamOptions = {
26
- /** Called when a chunk of data is received */
27
- onChunk?: (chunk: unknown) => void;
28
- /** Called when the stream ends */
29
- onDone?: (finalChunk: unknown) => void;
30
- /** Called when an error occurs */
31
- onError?: (error: string) => void;
32
- };
33
- /**
34
- * Options for the agentFetch function
35
- */
36
- type AgentClientFetchOptions = Omit<PartyFetchOptions, "party" | "room"> & {
37
- /** Name of the agent to connect to */
38
- agent: string;
39
- /** Name of the specific Agent instance */
40
- name?: string;
41
- };
42
- /**
43
- * Convert a camelCase string to a kebab-case string
44
- * @param str The string to convert
45
- * @returns The kebab-case string
46
- */
47
- declare function camelCaseToKebabCase(str: string): string;
48
- /**
49
- * WebSocket client for connecting to an Agent
50
- */
51
- declare class AgentClient<State = unknown> extends PartySocket {
52
- /**
53
- * @deprecated Use agentFetch instead
54
- */
55
- static fetch(_opts: PartyFetchOptions): Promise<Response>;
56
- agent: string;
57
- name: string;
58
- private options;
59
- private _pendingCalls;
60
- constructor(options: AgentClientOptions<State>);
61
- setState(state: State): void;
62
- /**
63
- * Call a method on the Agent
64
- * @param method Name of the method to call
65
- * @param args Arguments to pass to the method
66
- * @param streamOptions Options for handling streaming responses
67
- * @returns Promise that resolves with the method's return value
68
- */
69
- call<T extends SerializableReturnValue>(
70
- method: string,
71
- args?: SerializableValue[],
72
- streamOptions?: StreamOptions
73
- ): Promise<T>;
74
- call<T = unknown>(
75
- method: string,
76
- args?: unknown[],
77
- streamOptions?: StreamOptions
78
- ): Promise<T>;
79
- }
80
- /**
81
- * Make an HTTP request to an Agent
82
- * @param opts Connection options
83
- * @param init Request initialization options
84
- * @returns Promise resolving to a Response
85
- */
86
- declare function agentFetch(
87
- opts: AgentClientFetchOptions,
88
- init?: RequestInit
89
- ): Promise<Response>;
90
-
3
+ a as agentFetch,
4
+ i as StreamOptions,
5
+ n as AgentClientFetchOptions,
6
+ o as camelCaseToKebabCase,
7
+ r as AgentClientOptions,
8
+ t as AgentClient
9
+ } from "./client-BAQA84dr.js";
91
10
  export {
92
11
  AgentClient,
93
- type AgentClientFetchOptions,
94
- type AgentClientOptions,
95
- type StreamOptions,
12
+ AgentClientFetchOptions,
13
+ AgentClientOptions,
14
+ StreamOptions,
96
15
  agentFetch,
97
16
  camelCaseToKebabCase
98
17
  };
package/dist/client.js CHANGED
@@ -1,12 +1,4 @@
1
- import {
2
- AgentClient,
3
- agentFetch,
4
- camelCaseToKebabCase
5
- } from "./chunk-QEVM4BVL.js";
6
- import "./chunk-AVYJQSLW.js";
7
- export {
8
- AgentClient,
9
- agentFetch,
10
- camelCaseToKebabCase
11
- };
12
- //# sourceMappingURL=client.js.map
1
+ import "./ai-types-CrMqkwc_.js";
2
+ import { n as agentFetch, r as camelCaseToKebabCase, t as AgentClient } from "./client-B3SR12TQ.js";
3
+
4
+ export { AgentClient, agentFetch, camelCaseToKebabCase };
@@ -0,0 +1,27 @@
1
+ import { ToolSet } from "ai";
2
+ import { WorkerEntrypoint } from "cloudflare:workers";
3
+
4
+ //#region src/codemode/ai.d.ts
5
+ declare class CodeModeProxy extends WorkerEntrypoint<Cloudflare.Env, {
6
+ binding: string;
7
+ name: string;
8
+ callback: string;
9
+ }> {
10
+ callFunction(options: {
11
+ functionName: string;
12
+ args: unknown[];
13
+ }): Promise<any>;
14
+ }
15
+ declare function experimental_codemode(options: {
16
+ tools: ToolSet;
17
+ prompt: string;
18
+ globalOutbound: Fetcher;
19
+ loader: WorkerLoader;
20
+ proxy: Fetcher<CodeModeProxy>;
21
+ }): Promise<{
22
+ prompt: string;
23
+ tools: ToolSet;
24
+ }>;
25
+ //#endregion
26
+ export { CodeModeProxy, experimental_codemode };
27
+ //# sourceMappingURL=ai.d.ts.map
@@ -0,0 +1,151 @@
1
+ import "../ai-types-CrMqkwc_.js";
2
+ import "../client-B3SR12TQ.js";
3
+ import "../client-BZ-xTxF5.js";
4
+ import "../do-oauth-client-provider-Cs9QpXYp.js";
5
+ import { s as getAgentByName } from "../src-C6rC6ZpH.js";
6
+ import { generateObject, tool } from "ai";
7
+ import { openai } from "@ai-sdk/openai";
8
+ import { z } from "zod/v3";
9
+ import { compile } from "json-schema-to-typescript";
10
+ import { createTypeAlias, printNode, zodToTs } from "zod-to-ts";
11
+ import { WorkerEntrypoint, env } from "cloudflare:workers";
12
+
13
+ //#region src/codemode/ai.ts
14
+ function toCamelCase(str) {
15
+ return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase()).replace(/^[a-z]/, (letter) => letter.toUpperCase());
16
+ }
17
+ var CodeModeProxy = class extends WorkerEntrypoint {
18
+ async callFunction(options) {
19
+ return (await getAgentByName(env[this.ctx.props.binding], this.ctx.props.name))[this.ctx.props.callback](options.functionName, options.args);
20
+ }
21
+ };
22
+ async function experimental_codemode(options) {
23
+ const generatedTypes = await generateTypes(options.tools);
24
+ return {
25
+ prompt: `You are a helpful assistant. You have access to the "codemode" tool that can do different things:
26
+
27
+ ${getToolDescriptions(options.tools)}
28
+
29
+ If the user asks to do anything that be achieveable by the codemode tool, then simply pass over control to it by giving it a simple function description. Don't be too verbose.
30
+
31
+ `,
32
+ tools: { codemode: tool({
33
+ description: "codemode: a tool that can generate code to achieve a goal",
34
+ inputSchema: z.object({ functionDescription: z.string() }),
35
+ outputSchema: z.object({
36
+ code: z.string(),
37
+ result: z.any()
38
+ }),
39
+ execute: async ({ functionDescription }) => {
40
+ try {
41
+ const response = await generateObject({
42
+ model: openai("gpt-4.1"),
43
+ schema: z.object({ code: z.string() }),
44
+ prompt: `You are a code generating machine.
45
+
46
+ In addition to regular javascript, you can also use the following functions:
47
+
48
+ ${generatedTypes}
49
+
50
+ Respond only with the code, nothing else. Output javascript code.
51
+
52
+ Generate an async function that achieves the goal. This async function doesn't accept any arguments.
53
+
54
+ Here is user input: ${functionDescription}`
55
+ });
56
+ const result = await createEvaluator(response.object.code, {
57
+ proxy: options.proxy,
58
+ loader: options.loader
59
+ })();
60
+ return {
61
+ code: response.object.code,
62
+ result
63
+ };
64
+ } catch (error) {
65
+ console.error("error", error);
66
+ throw error;
67
+ }
68
+ }
69
+ }) }
70
+ };
71
+ }
72
+ function createEvaluator(code, options) {
73
+ return async () => {
74
+ return await options.loader.get(`code-${Math.random()}`, () => {
75
+ return {
76
+ compatibilityDate: "2025-06-01",
77
+ compatibilityFlags: ["nodejs_compat"],
78
+ mainModule: "foo.js",
79
+ modules: { "foo.js": `
80
+ import { env, WorkerEntrypoint } from "cloudflare:workers";
81
+
82
+ export default class CodeModeWorker extends WorkerEntrypoint {
83
+ async evaluate() {
84
+ try {
85
+ const { CodeModeProxy } = env;
86
+ const codemode = new Proxy(
87
+ {},
88
+ {
89
+ get: (target, prop) => {
90
+ return (args) => {
91
+ return CodeModeProxy.callFunction({
92
+ functionName: prop,
93
+ args: args,
94
+ });
95
+ };
96
+ }
97
+ }
98
+ );
99
+
100
+ return await ${code}();
101
+ } catch (err) {
102
+ return {
103
+ err: err.message,
104
+ stack: err.stack
105
+ };
106
+ }
107
+ }
108
+ }
109
+
110
+ ` },
111
+ env: { CodeModeProxy: options.proxy },
112
+ globalOutbound: null
113
+ };
114
+ }).getEntrypoint().evaluate();
115
+ };
116
+ }
117
+ async function generateTypes(tools) {
118
+ let availableTools = "";
119
+ let availableTypes = "";
120
+ for (const [toolName, tool$1] of Object.entries(tools)) {
121
+ const inputJsonType = tool$1.inputSchema.jsonSchema ? await compile(tool$1.inputSchema.jsonSchema, `${toCamelCase(toolName)}Input`, {
122
+ format: false,
123
+ bannerComment: " "
124
+ }) : printNode(createTypeAlias(zodToTs(tool$1.inputSchema, `${toCamelCase(toolName)}Input`).node, `${toCamelCase(toolName)}Input`));
125
+ const outputJsonType = tool$1.outputSchema?.jsonSchema ? await compile(tool$1.outputSchema?.jsonSchema, `${toCamelCase(toolName)}Output`, {
126
+ format: false,
127
+ bannerComment: " "
128
+ }) : tool$1.outputSchema ? printNode(createTypeAlias(zodToTs(tool$1.outputSchema, `${toCamelCase(toolName)}Output`).node, `${toCamelCase(toolName)}Output`)) : `interface ${toCamelCase(toolName)}Output { [key: string]: any }`;
129
+ const InputType = inputJsonType.trim().replace("export interface", "interface");
130
+ const OutputType = outputJsonType.trim().replace("export interface", "interface");
131
+ availableTypes += `\n${InputType}`;
132
+ availableTypes += `\n${OutputType}`;
133
+ availableTools += `\n\t/*\n\t${tool$1.description?.trim()}\n\t*/`;
134
+ availableTools += `\n\t${toolName}: (input: ${toCamelCase(toolName)}Input) => Promise<${toCamelCase(toolName)}Output>;`;
135
+ availableTools += "\n";
136
+ }
137
+ availableTools = `\ndeclare const codemode: {${availableTools}}`;
138
+ return `
139
+ ${availableTypes}
140
+ ${availableTools}
141
+ `;
142
+ }
143
+ function getToolDescriptions(tools) {
144
+ return Object.entries(tools).map(([_toolName, tool$1]) => {
145
+ return `\n- ${tool$1.description?.trim()}`;
146
+ }).join("");
147
+ }
148
+
149
+ //#endregion
150
+ export { CodeModeProxy, experimental_codemode };
151
+ //# sourceMappingURL=ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","names":["tool","compileJsonSchemaToTs","printNodeZodToTs"],"sources":["../../src/codemode/ai.ts"],"sourcesContent":["import { generateObject, tool, type ToolSet } from \"ai\";\nimport { openai } from \"@ai-sdk/openai\";\nimport { z } from \"zod/v3\";\nimport { compile as compileJsonSchemaToTs } from \"json-schema-to-typescript\";\nimport {\n zodToTs,\n printNode as printNodeZodToTs,\n createTypeAlias\n} from \"zod-to-ts\";\nimport { getAgentByName } from \"..\";\nimport { env, WorkerEntrypoint } from \"cloudflare:workers\";\n\nfunction toCamelCase(str: string) {\n return str\n .replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())\n .replace(/^[a-z]/, (letter) => letter.toUpperCase());\n}\n\nexport class CodeModeProxy extends WorkerEntrypoint<\n Cloudflare.Env,\n {\n binding: string;\n name: string;\n callback: string;\n }\n> {\n async callFunction(options: { functionName: string; args: unknown[] }) {\n const stub = (await getAgentByName(\n // @ts-expect-error\n env[this.ctx.props.binding] as AgentNamespace<T>,\n this.ctx.props.name\n )) as DurableObjectStub;\n // @ts-expect-error\n return stub[this.ctx.props.callback](options.functionName, options.args);\n }\n}\n\nexport async function experimental_codemode(options: {\n tools: ToolSet;\n prompt: string;\n globalOutbound: Fetcher;\n loader: WorkerLoader;\n proxy: Fetcher<CodeModeProxy>;\n}): Promise<{\n prompt: string;\n tools: ToolSet;\n}> {\n const generatedTypes = await generateTypes(options.tools);\n const prompt = `You are a helpful assistant. You have access to the \"codemode\" tool that can do different things: \n \n ${getToolDescriptions(options.tools)} \n \n If the user asks to do anything that be achieveable by the codemode tool, then simply pass over control to it by giving it a simple function description. Don't be too verbose.\n \n `;\n\n const codemodeTool = tool({\n description: \"codemode: a tool that can generate code to achieve a goal\",\n inputSchema: z.object({\n functionDescription: z.string()\n }),\n outputSchema: z.object({\n code: z.string(),\n result: z.any()\n }),\n execute: async ({ functionDescription }) => {\n try {\n const response = await generateObject({\n model: openai(\"gpt-4.1\"),\n schema: z.object({\n code: z.string()\n }),\n prompt: `You are a code generating machine.\n\n In addition to regular javascript, you can also use the following functions:\n\n ${generatedTypes} \n\n Respond only with the code, nothing else. Output javascript code.\n\n Generate an async function that achieves the goal. This async function doesn't accept any arguments.\n\n Here is user input: ${functionDescription}` // insert ts types for the tools here\n });\n\n // console.log(\"args\", response.object.args);\n const evaluator = createEvaluator(response.object.code, {\n proxy: options.proxy,\n loader: options.loader\n });\n const result = await evaluator();\n return { code: response.object.code, result: result };\n } catch (error) {\n console.error(\"error\", error);\n throw error;\n // return { code: \"\", result: error };\n }\n }\n });\n\n return { prompt, tools: { codemode: codemodeTool } };\n}\n\nfunction createEvaluator(\n code: string,\n options: {\n loader: WorkerLoader;\n proxy: Fetcher<CodeModeProxy>;\n }\n) {\n return async () => {\n const worker = options.loader.get(`code-${Math.random()}`, () => {\n return {\n compatibilityDate: \"2025-06-01\",\n compatibilityFlags: [\"nodejs_compat\"],\n mainModule: \"foo.js\",\n modules: {\n \"foo.js\": `\nimport { env, WorkerEntrypoint } from \"cloudflare:workers\";\n\nexport default class CodeModeWorker extends WorkerEntrypoint {\n async evaluate() {\n try {\n const { CodeModeProxy } = env;\n const codemode = new Proxy(\n {},\n {\n get: (target, prop) => {\n return (args) => {\n return CodeModeProxy.callFunction({\n functionName: prop,\n args: args, \n });\n };\n }\n }\n );\n\n return await ${code}();\n } catch (err) {\n return {\n err: err.message,\n stack: err.stack\n };\n }\n }\n}\n \n `\n },\n env: {\n // insert keys and bindings to tools/ts functions here\n CodeModeProxy: options.proxy\n },\n globalOutbound: null\n };\n });\n\n // @ts-expect-error TODO: fix this\n return await worker.getEntrypoint().evaluate();\n };\n}\n\nasync function generateTypes(tools: ToolSet) {\n let availableTools = \"\";\n let availableTypes = \"\";\n\n for (const [toolName, tool] of Object.entries(tools)) {\n // @ts-expect-error TODO: fix this\n const inputJsonType = tool.inputSchema.jsonSchema\n ? await compileJsonSchemaToTs(\n // @ts-expect-error TODO: fix this\n tool.inputSchema.jsonSchema,\n `${toCamelCase(toolName)}Input`,\n {\n format: false,\n bannerComment: \" \"\n }\n )\n : printNodeZodToTs(\n createTypeAlias(\n zodToTs(\n // @ts-expect-error TODO: fix this\n tool.inputSchema,\n `${toCamelCase(toolName)}Input`\n ).node,\n `${toCamelCase(toolName)}Input`\n )\n );\n\n const outputJsonType =\n // @ts-expect-error TODO: fix this\n tool.outputSchema?.jsonSchema\n ? await compileJsonSchemaToTs(\n // @ts-expect-error TODO: fix this\n tool.outputSchema?.jsonSchema,\n `${toCamelCase(toolName)}Output`,\n {\n format: false,\n bannerComment: \" \"\n }\n )\n : tool.outputSchema\n ? printNodeZodToTs(\n createTypeAlias(\n zodToTs(\n // @ts-expect-error TODO: fix this\n tool.outputSchema,\n `${toCamelCase(toolName)}Output`\n ).node,\n `${toCamelCase(toolName)}Output`\n )\n )\n : `interface ${toCamelCase(toolName)}Output { [key: string]: any }`;\n\n const InputType = inputJsonType\n .trim()\n .replace(\"export interface\", \"interface\");\n\n const OutputType = outputJsonType\n .trim()\n .replace(\"export interface\", \"interface\");\n\n availableTypes += `\\n${InputType}`;\n availableTypes += `\\n${OutputType}`;\n availableTools += `\\n\\t/*\\n\\t${tool.description?.trim()}\\n\\t*/`;\n availableTools += `\\n\\t${toolName}: (input: ${toCamelCase(toolName)}Input) => Promise<${toCamelCase(toolName)}Output>;`;\n availableTools += \"\\n\";\n }\n\n availableTools = `\\ndeclare const codemode: {${availableTools}}`;\n\n return `\n${availableTypes}\n${availableTools}\n `;\n}\n\nfunction getToolDescriptions(tools: ToolSet) {\n return Object.entries(tools)\n .map(([_toolName, tool]) => {\n return `\\n- ${tool.description?.trim()}`;\n })\n .join(\"\");\n}\n"],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { nanoid } from "nanoid";
2
+
3
+ //#region src/mcp/do-oauth-client-provider.ts
4
+ var DurableObjectOAuthClientProvider = class {
5
+ constructor(storage, clientName, baseRedirectUrl) {
6
+ this.storage = storage;
7
+ this.clientName = clientName;
8
+ this.baseRedirectUrl = baseRedirectUrl;
9
+ }
10
+ get clientMetadata() {
11
+ return {
12
+ client_name: this.clientName,
13
+ client_uri: this.clientUri,
14
+ grant_types: ["authorization_code", "refresh_token"],
15
+ redirect_uris: [this.redirectUrl],
16
+ response_types: ["code"],
17
+ token_endpoint_auth_method: "none"
18
+ };
19
+ }
20
+ get clientUri() {
21
+ return new URL(this.redirectUrl).origin;
22
+ }
23
+ get redirectUrl() {
24
+ return `${this.baseRedirectUrl}/${this.serverId}`;
25
+ }
26
+ get clientId() {
27
+ if (!this._clientId_) throw new Error("Trying to access clientId before it was set");
28
+ return this._clientId_;
29
+ }
30
+ set clientId(clientId_) {
31
+ this._clientId_ = clientId_;
32
+ }
33
+ get serverId() {
34
+ if (!this._serverId_) throw new Error("Trying to access serverId before it was set");
35
+ return this._serverId_;
36
+ }
37
+ set serverId(serverId_) {
38
+ this._serverId_ = serverId_;
39
+ }
40
+ keyPrefix(clientId) {
41
+ return `/${this.clientName}/${this.serverId}/${clientId}`;
42
+ }
43
+ clientInfoKey(clientId) {
44
+ return `${this.keyPrefix(clientId)}/client_info/`;
45
+ }
46
+ async clientInformation() {
47
+ if (!this._clientId_) return;
48
+ return await this.storage.get(this.clientInfoKey(this.clientId)) ?? void 0;
49
+ }
50
+ async saveClientInformation(clientInformation) {
51
+ await this.storage.put(this.clientInfoKey(clientInformation.client_id), clientInformation);
52
+ this.clientId = clientInformation.client_id;
53
+ }
54
+ tokenKey(clientId) {
55
+ return `${this.keyPrefix(clientId)}/token`;
56
+ }
57
+ async tokens() {
58
+ if (!this._clientId_) return;
59
+ return await this.storage.get(this.tokenKey(this.clientId)) ?? void 0;
60
+ }
61
+ async saveTokens(tokens) {
62
+ await this.storage.put(this.tokenKey(this.clientId), tokens);
63
+ }
64
+ get authUrl() {
65
+ return this._authUrl_;
66
+ }
67
+ /**
68
+ * Because this operates on the server side (but we need browser auth), we send this url back to the user
69
+ * and require user interact to initiate the redirect flow
70
+ */
71
+ redirectToAuthorization(authUrl) {
72
+ const stateToken = nanoid();
73
+ authUrl.searchParams.set("state", stateToken);
74
+ this._authUrl_ = authUrl.toString();
75
+ }
76
+ codeVerifierKey(clientId) {
77
+ return `${this.keyPrefix(clientId)}/code_verifier`;
78
+ }
79
+ async saveCodeVerifier(verifier) {
80
+ const key = this.codeVerifierKey(this.clientId);
81
+ if (await this.storage.get(key)) return;
82
+ await this.storage.put(key, verifier);
83
+ }
84
+ async codeVerifier() {
85
+ const codeVerifier = await this.storage.get(this.codeVerifierKey(this.clientId));
86
+ if (!codeVerifier) throw new Error("No code verifier found");
87
+ return codeVerifier;
88
+ }
89
+ };
90
+
91
+ //#endregion
92
+ export { DurableObjectOAuthClientProvider as t };
93
+ //# sourceMappingURL=do-oauth-client-provider-Cs9QpXYp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do-oauth-client-provider-Cs9QpXYp.js","names":["storage: OAuthClientStorage","clientName: string","baseRedirectUrl: string"],"sources":["../src/mcp/do-oauth-client-provider.ts"],"sourcesContent":["import type { OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type {\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthClientMetadata,\n OAuthTokens\n} from \"@modelcontextprotocol/sdk/shared/auth.js\";\nimport { nanoid } from \"nanoid\";\nimport type { OAuthClientStorage } from \"./client-storage\";\n\n// A slight extension to the standard OAuthClientProvider interface because `redirectToAuthorization` doesn't give us the interface we need\n// This allows us to track authentication for a specific server and associated dynamic client registration\nexport interface AgentsOAuthProvider extends OAuthClientProvider {\n authUrl: string | undefined;\n clientId: string | undefined;\n serverId: string | undefined;\n}\n\nexport class DurableObjectOAuthClientProvider implements AgentsOAuthProvider {\n private _authUrl_: string | undefined;\n private _serverId_: string | undefined;\n private _clientId_: string | undefined;\n\n constructor(\n public storage: OAuthClientStorage,\n public clientName: string,\n public baseRedirectUrl: string\n ) {}\n\n get clientMetadata(): OAuthClientMetadata {\n return {\n client_name: this.clientName,\n client_uri: this.clientUri,\n grant_types: [\"authorization_code\", \"refresh_token\"],\n redirect_uris: [this.redirectUrl],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\"\n };\n }\n\n get clientUri() {\n return new URL(this.redirectUrl).origin;\n }\n\n get redirectUrl() {\n return `${this.baseRedirectUrl}/${this.serverId}`;\n }\n\n get clientId() {\n if (!this._clientId_) {\n throw new Error(\"Trying to access clientId before it was set\");\n }\n return this._clientId_;\n }\n\n set clientId(clientId_: string) {\n this._clientId_ = clientId_;\n }\n\n get serverId() {\n if (!this._serverId_) {\n throw new Error(\"Trying to access serverId before it was set\");\n }\n return this._serverId_;\n }\n\n set serverId(serverId_: string) {\n this._serverId_ = serverId_;\n }\n\n keyPrefix(clientId: string) {\n return `/${this.clientName}/${this.serverId}/${clientId}`;\n }\n\n clientInfoKey(clientId: string) {\n return `${this.keyPrefix(clientId)}/client_info/`;\n }\n\n async clientInformation() {\n if (!this._clientId_) {\n return undefined;\n }\n return (\n (await this.storage.get<OAuthClientInformation>(\n this.clientInfoKey(this.clientId)\n )) ?? undefined\n );\n }\n\n async saveClientInformation(clientInformation: OAuthClientInformationFull) {\n await this.storage.put(\n this.clientInfoKey(clientInformation.client_id),\n clientInformation\n );\n this.clientId = clientInformation.client_id;\n }\n\n tokenKey(clientId: string) {\n return `${this.keyPrefix(clientId)}/token`;\n }\n\n async tokens() {\n if (!this._clientId_) {\n return undefined;\n }\n return (\n (await this.storage.get<OAuthTokens>(this.tokenKey(this.clientId))) ??\n undefined\n );\n }\n\n async saveTokens(tokens: OAuthTokens) {\n await this.storage.put(this.tokenKey(this.clientId), tokens);\n }\n\n get authUrl() {\n return this._authUrl_;\n }\n\n /**\n * Because this operates on the server side (but we need browser auth), we send this url back to the user\n * and require user interact to initiate the redirect flow\n */\n redirectToAuthorization(authUrl: URL) {\n // Generate secure random token for state parameter\n const stateToken = nanoid();\n authUrl.searchParams.set(\"state\", stateToken);\n this._authUrl_ = authUrl.toString();\n }\n\n codeVerifierKey(clientId: string) {\n return `${this.keyPrefix(clientId)}/code_verifier`;\n }\n\n async saveCodeVerifier(verifier: string) {\n const key = this.codeVerifierKey(this.clientId);\n\n // Don't overwrite existing verifier to preserve first PKCE verifier\n const existing = await this.storage.get<string>(key);\n if (existing) {\n return;\n }\n\n await this.storage.put(key, verifier);\n }\n\n async codeVerifier() {\n const codeVerifier = await this.storage.get<string>(\n this.codeVerifierKey(this.clientId)\n );\n if (!codeVerifier) {\n throw new Error(\"No code verifier found\");\n }\n return codeVerifier;\n }\n}\n"],"mappings":";;;AAkBA,IAAa,mCAAb,MAA6E;CAK3E,YACE,AAAOA,SACP,AAAOC,YACP,AAAOC,iBACP;EAHO;EACA;EACA;;CAGT,IAAI,iBAAsC;AACxC,SAAO;GACL,aAAa,KAAK;GAClB,YAAY,KAAK;GACjB,aAAa,CAAC,sBAAsB,gBAAgB;GACpD,eAAe,CAAC,KAAK,YAAY;GACjC,gBAAgB,CAAC,OAAO;GACxB,4BAA4B;GAC7B;;CAGH,IAAI,YAAY;AACd,SAAO,IAAI,IAAI,KAAK,YAAY,CAAC;;CAGnC,IAAI,cAAc;AAChB,SAAO,GAAG,KAAK,gBAAgB,GAAG,KAAK;;CAGzC,IAAI,WAAW;AACb,MAAI,CAAC,KAAK,WACR,OAAM,IAAI,MAAM,8CAA8C;AAEhE,SAAO,KAAK;;CAGd,IAAI,SAAS,WAAmB;AAC9B,OAAK,aAAa;;CAGpB,IAAI,WAAW;AACb,MAAI,CAAC,KAAK,WACR,OAAM,IAAI,MAAM,8CAA8C;AAEhE,SAAO,KAAK;;CAGd,IAAI,SAAS,WAAmB;AAC9B,OAAK,aAAa;;CAGpB,UAAU,UAAkB;AAC1B,SAAO,IAAI,KAAK,WAAW,GAAG,KAAK,SAAS,GAAG;;CAGjD,cAAc,UAAkB;AAC9B,SAAO,GAAG,KAAK,UAAU,SAAS,CAAC;;CAGrC,MAAM,oBAAoB;AACxB,MAAI,CAAC,KAAK,WACR;AAEF,SACG,MAAM,KAAK,QAAQ,IAClB,KAAK,cAAc,KAAK,SAAS,CAClC,IAAK;;CAIV,MAAM,sBAAsB,mBAA+C;AACzE,QAAM,KAAK,QAAQ,IACjB,KAAK,cAAc,kBAAkB,UAAU,EAC/C,kBACD;AACD,OAAK,WAAW,kBAAkB;;CAGpC,SAAS,UAAkB;AACzB,SAAO,GAAG,KAAK,UAAU,SAAS,CAAC;;CAGrC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,WACR;AAEF,SACG,MAAM,KAAK,QAAQ,IAAiB,KAAK,SAAS,KAAK,SAAS,CAAC,IAClE;;CAIJ,MAAM,WAAW,QAAqB;AACpC,QAAM,KAAK,QAAQ,IAAI,KAAK,SAAS,KAAK,SAAS,EAAE,OAAO;;CAG9D,IAAI,UAAU;AACZ,SAAO,KAAK;;;;;;CAOd,wBAAwB,SAAc;EAEpC,MAAM,aAAa,QAAQ;AAC3B,UAAQ,aAAa,IAAI,SAAS,WAAW;AAC7C,OAAK,YAAY,QAAQ,UAAU;;CAGrC,gBAAgB,UAAkB;AAChC,SAAO,GAAG,KAAK,UAAU,SAAS,CAAC;;CAGrC,MAAM,iBAAiB,UAAkB;EACvC,MAAM,MAAM,KAAK,gBAAgB,KAAK,SAAS;AAI/C,MADiB,MAAM,KAAK,QAAQ,IAAY,IAAI,CAElD;AAGF,QAAM,KAAK,QAAQ,IAAI,KAAK,SAAS;;CAGvC,MAAM,eAAe;EACnB,MAAM,eAAe,MAAM,KAAK,QAAQ,IACtC,KAAK,gBAAgB,KAAK,SAAS,CACpC;AACD,MAAI,CAAC,aACH,OAAM,IAAI,MAAM,yBAAyB;AAE3C,SAAO"}
@@ -0,0 +1,134 @@
1
+ import { OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js";
2
+ import {
3
+ OAuthClientInformationFull,
4
+ OAuthClientMetadata,
5
+ OAuthTokens
6
+ } from "@modelcontextprotocol/sdk/shared/auth.js";
7
+
8
+ //#region src/mcp/client-storage.d.ts
9
+ /**
10
+ * Represents a row in the cf_agents_mcp_servers table
11
+ */
12
+ type MCPServerRow = {
13
+ id: string;
14
+ name: string;
15
+ server_url: string;
16
+ client_id: string | null;
17
+ auth_url: string | null;
18
+ callback_url: string;
19
+ server_options: string | null;
20
+ };
21
+ /**
22
+ * KV storage interface for OAuth-related data
23
+ * Used by OAuth providers to store tokens, client info, etc.
24
+ */
25
+ interface OAuthClientStorage {
26
+ /**
27
+ * Get a value from key-value storage (for OAuth data like tokens, client info, etc.)
28
+ */
29
+ get<T>(key: string): Promise<T | undefined> | undefined;
30
+ /**
31
+ * Put a value into key-value storage (for OAuth data like tokens, client info, etc.)
32
+ */
33
+ put(key: string, value: unknown): Promise<void> | void;
34
+ }
35
+ /**
36
+ * Storage interface for MCP client manager
37
+ * Abstracts storage operations to decouple from specific storage implementations
38
+ */
39
+ interface MCPClientStorage extends OAuthClientStorage {
40
+ /**
41
+ * Save or update an MCP server configuration
42
+ */
43
+ saveServer(server: MCPServerRow): Promise<void>;
44
+ /**
45
+ * Remove an MCP server from storage
46
+ */
47
+ removeServer(serverId: string): Promise<void>;
48
+ /**
49
+ * List all MCP servers from storage
50
+ */
51
+ listServers(): Promise<MCPServerRow[]>;
52
+ /**
53
+ * Get an MCP server by its callback URL
54
+ * Used during OAuth callback to identify which server is being authenticated
55
+ */
56
+ getServerByCallbackUrl(callbackUrl: string): Promise<MCPServerRow | null>;
57
+ /**
58
+ * Clear auth_url after successful OAuth authentication
59
+ * This prevents the agent from continuously asking for OAuth on reconnect
60
+ * when stored tokens are still valid.
61
+ */
62
+ clearAuthUrl(serverId: string): Promise<void>;
63
+ }
64
+ //#endregion
65
+ //#region src/mcp/do-oauth-client-provider.d.ts
66
+ interface AgentsOAuthProvider extends OAuthClientProvider {
67
+ authUrl: string | undefined;
68
+ clientId: string | undefined;
69
+ serverId: string | undefined;
70
+ }
71
+ declare class DurableObjectOAuthClientProvider implements AgentsOAuthProvider {
72
+ storage: OAuthClientStorage;
73
+ clientName: string;
74
+ baseRedirectUrl: string;
75
+ private _authUrl_;
76
+ private _serverId_;
77
+ private _clientId_;
78
+ constructor(
79
+ storage: OAuthClientStorage,
80
+ clientName: string,
81
+ baseRedirectUrl: string
82
+ );
83
+ get clientMetadata(): OAuthClientMetadata;
84
+ get clientUri(): string;
85
+ get redirectUrl(): string;
86
+ get clientId(): string;
87
+ set clientId(clientId_: string);
88
+ get serverId(): string;
89
+ set serverId(serverId_: string);
90
+ keyPrefix(clientId: string): string;
91
+ clientInfoKey(clientId: string): string;
92
+ clientInformation(): Promise<
93
+ | {
94
+ client_id: string;
95
+ client_secret?: string | undefined;
96
+ client_id_issued_at?: number | undefined;
97
+ client_secret_expires_at?: number | undefined;
98
+ }
99
+ | undefined
100
+ >;
101
+ saveClientInformation(
102
+ clientInformation: OAuthClientInformationFull
103
+ ): Promise<void>;
104
+ tokenKey(clientId: string): string;
105
+ tokens(): Promise<
106
+ | {
107
+ access_token: string;
108
+ token_type: string;
109
+ id_token?: string | undefined;
110
+ expires_in?: number | undefined;
111
+ scope?: string | undefined;
112
+ refresh_token?: string | undefined;
113
+ }
114
+ | undefined
115
+ >;
116
+ saveTokens(tokens: OAuthTokens): Promise<void>;
117
+ get authUrl(): string | undefined;
118
+ /**
119
+ * Because this operates on the server side (but we need browser auth), we send this url back to the user
120
+ * and require user interact to initiate the redirect flow
121
+ */
122
+ redirectToAuthorization(authUrl: URL): void;
123
+ codeVerifierKey(clientId: string): string;
124
+ saveCodeVerifier(verifier: string): Promise<void>;
125
+ codeVerifier(): Promise<string>;
126
+ }
127
+ //#endregion
128
+ export {
129
+ MCPServerRow as i,
130
+ DurableObjectOAuthClientProvider as n,
131
+ MCPClientStorage as r,
132
+ AgentsOAuthProvider as t
133
+ };
134
+ //# sourceMappingURL=do-oauth-client-provider-UhQDpDb8.d.ts.map
@@ -0,0 +1,58 @@
1
+ import { n as BaseEvent, t as MCPObservabilityEvent } from "./mcp-BwPscEiF.js";
2
+
3
+ //#region src/observability/agent.d.ts
4
+
5
+ /**
6
+ * Agent-specific observability events
7
+ * These track the lifecycle and operations of an Agent
8
+ */
9
+ type AgentObservabilityEvent =
10
+ | BaseEvent<"state:update", {}>
11
+ | BaseEvent<
12
+ "rpc",
13
+ {
14
+ method: string;
15
+ streaming?: boolean;
16
+ }
17
+ >
18
+ | BaseEvent<"message:request" | "message:response", {}>
19
+ | BaseEvent<"message:clear">
20
+ | BaseEvent<
21
+ "schedule:create" | "schedule:execute" | "schedule:cancel",
22
+ {
23
+ callback: string;
24
+ id: string;
25
+ }
26
+ >
27
+ | BaseEvent<"destroy">
28
+ | BaseEvent<
29
+ "connect",
30
+ {
31
+ connectionId: string;
32
+ }
33
+ >;
34
+ //#endregion
35
+ //#region src/observability/index.d.ts
36
+ /**
37
+ * Union of all observability event types from different domains
38
+ */
39
+ type ObservabilityEvent = AgentObservabilityEvent | MCPObservabilityEvent;
40
+ interface Observability {
41
+ /**
42
+ * Emit an event for the Agent's observability implementation to handle.
43
+ * @param event - The event to emit
44
+ * @param ctx - The execution context of the invocation (optional)
45
+ */
46
+ emit(event: ObservabilityEvent, ctx?: DurableObjectState): void;
47
+ }
48
+ /**
49
+ * A generic observability implementation that logs events to the console.
50
+ */
51
+ declare const genericObservability: Observability;
52
+ //#endregion
53
+ export {
54
+ ObservabilityEvent as n,
55
+ genericObservability as r,
56
+ Observability as t
57
+ };
58
+ //# sourceMappingURL=index-BUle9RiP.d.ts.map