agents 0.0.0-d72c6a2 → 0.0.0-da56baa

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 (57) hide show
  1. package/dist/_esm-LV5FJ3HK.js +3922 -0
  2. package/dist/_esm-LV5FJ3HK.js.map +1 -0
  3. package/dist/ai-chat-agent.d.ts +1 -1
  4. package/dist/ai-chat-agent.js +5 -4
  5. package/dist/ai-chat-agent.js.map +1 -1
  6. package/dist/ai-chat-v5-migration.js +1 -0
  7. package/dist/ai-react.d.ts +7 -1
  8. package/dist/ai-react.js +157 -111
  9. package/dist/ai-react.js.map +1 -1
  10. package/dist/ai-types.d.ts +1 -0
  11. package/dist/ai-types.js +2 -1
  12. package/dist/ccip-CMBYN64O.js +15 -0
  13. package/dist/ccip-CMBYN64O.js.map +1 -0
  14. package/dist/chunk-5Y6BEZDY.js +276 -0
  15. package/dist/chunk-5Y6BEZDY.js.map +1 -0
  16. package/dist/{chunk-AVYJQSLW.js → chunk-BER7KXUJ.js} +2 -1
  17. package/dist/chunk-BER7KXUJ.js.map +1 -0
  18. package/dist/chunk-JJBFIGUC.js +5202 -0
  19. package/dist/chunk-JJBFIGUC.js.map +1 -0
  20. package/dist/chunk-PR4QN5HX.js +43 -0
  21. package/dist/chunk-PR4QN5HX.js.map +1 -0
  22. package/dist/{chunk-MH46VMM4.js → chunk-QEPGNUG6.js} +55 -17
  23. package/dist/chunk-QEPGNUG6.js.map +1 -0
  24. package/dist/{chunk-YDUDMOL6.js → chunk-RS5OCNEQ.js} +35 -8
  25. package/dist/chunk-RS5OCNEQ.js.map +1 -0
  26. package/dist/chunk-TYAY6AU6.js +159 -0
  27. package/dist/chunk-TYAY6AU6.js.map +1 -0
  28. package/dist/{chunk-LL2AFX7V.js → chunk-XFS5ERG3.js} +20 -2
  29. package/dist/chunk-XFS5ERG3.js.map +1 -0
  30. package/dist/{client-CvaJdLQA.d.ts → client-BohGLma8.d.ts} +36 -10
  31. package/dist/client.js +2 -1
  32. package/dist/index.d.ts +11 -4
  33. package/dist/index.js +5 -4
  34. package/dist/mcp/client.d.ts +1 -1
  35. package/dist/mcp/client.js +2 -1
  36. package/dist/mcp/do-oauth-client-provider.d.ts +8 -0
  37. package/dist/mcp/do-oauth-client-provider.js +2 -1
  38. package/dist/mcp/index.d.ts +12 -31
  39. package/dist/mcp/index.js +233 -163
  40. package/dist/mcp/index.js.map +1 -1
  41. package/dist/mcp/x402.d.ts +39 -0
  42. package/dist/mcp/x402.js +3195 -0
  43. package/dist/mcp/x402.js.map +1 -0
  44. package/dist/observability/index.js +5 -4
  45. package/dist/react.d.ts +1 -1
  46. package/dist/react.js +2 -1
  47. package/dist/react.js.map +1 -1
  48. package/dist/schedule.js +2 -0
  49. package/dist/schedule.js.map +1 -1
  50. package/dist/secp256k1-M22GZP2U.js +2193 -0
  51. package/dist/secp256k1-M22GZP2U.js.map +1 -0
  52. package/package.json +11 -5
  53. package/src/index.ts +48 -8
  54. package/dist/chunk-AVYJQSLW.js.map +0 -1
  55. package/dist/chunk-LL2AFX7V.js.map +0 -1
  56. package/dist/chunk-MH46VMM4.js.map +0 -1
  57. package/dist/chunk-YDUDMOL6.js.map +0 -1
@@ -0,0 +1,159 @@
1
+ // ../../node_modules/@noble/hashes/esm/cryptoNode.js
2
+ import * as nc from "crypto";
3
+ var crypto = nc && typeof nc === "object" && "webcrypto" in nc ? nc.webcrypto : nc && typeof nc === "object" && "randomBytes" in nc ? nc : void 0;
4
+
5
+ // ../../node_modules/@noble/hashes/esm/utils.js
6
+ function isBytes(a) {
7
+ return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
8
+ }
9
+ function anumber(n) {
10
+ if (!Number.isSafeInteger(n) || n < 0)
11
+ throw new Error("positive integer expected, got " + n);
12
+ }
13
+ function abytes(b, ...lengths) {
14
+ if (!isBytes(b))
15
+ throw new Error("Uint8Array expected");
16
+ if (lengths.length > 0 && !lengths.includes(b.length))
17
+ throw new Error("Uint8Array expected of length " + lengths + ", got length=" + b.length);
18
+ }
19
+ function ahash(h) {
20
+ if (typeof h !== "function" || typeof h.create !== "function")
21
+ throw new Error("Hash should be wrapped by utils.createHasher");
22
+ anumber(h.outputLen);
23
+ anumber(h.blockLen);
24
+ }
25
+ function aexists(instance, checkFinished = true) {
26
+ if (instance.destroyed)
27
+ throw new Error("Hash instance has been destroyed");
28
+ if (checkFinished && instance.finished)
29
+ throw new Error("Hash#digest() has already been called");
30
+ }
31
+ function aoutput(out, instance) {
32
+ abytes(out);
33
+ const min = instance.outputLen;
34
+ if (out.length < min) {
35
+ throw new Error("digestInto() expects output buffer of length at least " + min);
36
+ }
37
+ }
38
+ function u32(arr) {
39
+ return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
40
+ }
41
+ function clean(...arrays) {
42
+ for (let i = 0; i < arrays.length; i++) {
43
+ arrays[i].fill(0);
44
+ }
45
+ }
46
+ function createView(arr) {
47
+ return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
48
+ }
49
+ function rotr(word, shift) {
50
+ return word << 32 - shift | word >>> shift;
51
+ }
52
+ var isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)();
53
+ function byteSwap(word) {
54
+ return word << 24 & 4278190080 | word << 8 & 16711680 | word >>> 8 & 65280 | word >>> 24 & 255;
55
+ }
56
+ function byteSwap32(arr) {
57
+ for (let i = 0; i < arr.length; i++) {
58
+ arr[i] = byteSwap(arr[i]);
59
+ }
60
+ return arr;
61
+ }
62
+ var swap32IfBE = isLE ? (u) => u : byteSwap32;
63
+ function utf8ToBytes(str) {
64
+ if (typeof str !== "string")
65
+ throw new Error("string expected");
66
+ return new Uint8Array(new TextEncoder().encode(str));
67
+ }
68
+ function toBytes(data) {
69
+ if (typeof data === "string")
70
+ data = utf8ToBytes(data);
71
+ abytes(data);
72
+ return data;
73
+ }
74
+ function concatBytes(...arrays) {
75
+ let sum = 0;
76
+ for (let i = 0; i < arrays.length; i++) {
77
+ const a = arrays[i];
78
+ abytes(a);
79
+ sum += a.length;
80
+ }
81
+ const res = new Uint8Array(sum);
82
+ for (let i = 0, pad = 0; i < arrays.length; i++) {
83
+ const a = arrays[i];
84
+ res.set(a, pad);
85
+ pad += a.length;
86
+ }
87
+ return res;
88
+ }
89
+ var Hash = class {
90
+ };
91
+ function createHasher(hashCons) {
92
+ const hashC = (msg) => hashCons().update(toBytes(msg)).digest();
93
+ const tmp = hashCons();
94
+ hashC.outputLen = tmp.outputLen;
95
+ hashC.blockLen = tmp.blockLen;
96
+ hashC.create = () => hashCons();
97
+ return hashC;
98
+ }
99
+ function randomBytes(bytesLength = 32) {
100
+ if (crypto && typeof crypto.getRandomValues === "function") {
101
+ return crypto.getRandomValues(new Uint8Array(bytesLength));
102
+ }
103
+ if (crypto && typeof crypto.randomBytes === "function") {
104
+ return Uint8Array.from(crypto.randomBytes(bytesLength));
105
+ }
106
+ throw new Error("crypto.getRandomValues must be defined");
107
+ }
108
+
109
+ // ../../node_modules/@noble/hashes/esm/_u64.js
110
+ var U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);
111
+ var _32n = /* @__PURE__ */ BigInt(32);
112
+ function fromBig(n, le = false) {
113
+ if (le)
114
+ return { h: Number(n & U32_MASK64), l: Number(n >> _32n & U32_MASK64) };
115
+ return { h: Number(n >> _32n & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };
116
+ }
117
+ function split(lst, le = false) {
118
+ const len = lst.length;
119
+ let Ah = new Uint32Array(len);
120
+ let Al = new Uint32Array(len);
121
+ for (let i = 0; i < len; i++) {
122
+ const { h, l } = fromBig(lst[i], le);
123
+ [Ah[i], Al[i]] = [h, l];
124
+ }
125
+ return [Ah, Al];
126
+ }
127
+ var rotlSH = (h, l, s) => h << s | l >>> 32 - s;
128
+ var rotlSL = (h, l, s) => l << s | h >>> 32 - s;
129
+ var rotlBH = (h, l, s) => l << s - 32 | h >>> 64 - s;
130
+ var rotlBL = (h, l, s) => h << s - 32 | l >>> 64 - s;
131
+
132
+ export {
133
+ anumber,
134
+ abytes,
135
+ ahash,
136
+ aexists,
137
+ aoutput,
138
+ u32,
139
+ clean,
140
+ createView,
141
+ rotr,
142
+ swap32IfBE,
143
+ toBytes,
144
+ concatBytes,
145
+ Hash,
146
+ createHasher,
147
+ randomBytes,
148
+ split,
149
+ rotlSH,
150
+ rotlSL,
151
+ rotlBH,
152
+ rotlBL
153
+ };
154
+ /*! Bundled license information:
155
+
156
+ @noble/hashes/esm/utils.js:
157
+ (*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
158
+ */
159
+ //# sourceMappingURL=chunk-TYAY6AU6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/@noble/hashes/src/cryptoNode.ts","../../../node_modules/@noble/hashes/src/utils.ts","../../../node_modules/@noble/hashes/src/_u64.ts"],"sourcesContent":["/**\n * Internal webcrypto alias.\n * We prefer WebCrypto aka globalThis.crypto, which exists in node.js 16+.\n * Falls back to Node.js built-in crypto for Node.js <=v14.\n * See utils.ts for details.\n * @module\n */\n// @ts-ignore\nimport * as nc from 'node:crypto';\nexport const crypto: any =\n nc && typeof nc === 'object' && 'webcrypto' in nc\n ? (nc.webcrypto as any)\n : nc && typeof nc === 'object' && 'randomBytes' in nc\n ? nc\n : undefined;\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash function */\nexport type CHash = ReturnType<typeof createHasher>;\n/** Hash function with output */\nexport type CHashO = ReturnType<typeof createOptHasher>;\n/** XOF with output */\nexport type CHashXO = ReturnType<typeof createXOFer>;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher<T extends Hash<T>>(\n hashCons: () => Hash<T>\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash<T>;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n"],"mappings":"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","names":[]}
@@ -90,7 +90,12 @@ var DurableObjectOAuthClientProvider = class {
90
90
  return `${this.keyPrefix(clientId)}/code_verifier`;
91
91
  }
92
92
  async saveCodeVerifier(verifier) {
93
- await this.storage.put(this.codeVerifierKey(this.clientId), verifier);
93
+ const key = this.codeVerifierKey(this.clientId);
94
+ const existing = await this.storage.get(key);
95
+ if (existing) {
96
+ return;
97
+ }
98
+ await this.storage.put(key, verifier);
94
99
  }
95
100
  async codeVerifier() {
96
101
  const codeVerifier = await this.storage.get(
@@ -101,9 +106,22 @@ var DurableObjectOAuthClientProvider = class {
101
106
  }
102
107
  return codeVerifier;
103
108
  }
109
+ /** Transport tracking for OAuth flow */
110
+ oauthTransportKey() {
111
+ return `/${this.clientName}/${this.serverId}/oauth_transport`;
112
+ }
113
+ async saveOAuthTransport(transportType) {
114
+ await this.storage.put(this.oauthTransportKey(), transportType);
115
+ }
116
+ async getOAuthTransport() {
117
+ return await this.storage.get(this.oauthTransportKey());
118
+ }
119
+ async clearOAuthTransport() {
120
+ await this.storage.delete(this.oauthTransportKey());
121
+ }
104
122
  };
105
123
 
106
124
  export {
107
125
  DurableObjectOAuthClientProvider
108
126
  };
109
- //# sourceMappingURL=chunk-LL2AFX7V.js.map
127
+ //# sourceMappingURL=chunk-XFS5ERG3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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\";\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 // Transport tracking for OAuth flow\n saveOAuthTransport(transportType: string): Promise<void>;\n getOAuthTransport(): Promise<string | undefined>;\n clearOAuthTransport(): Promise<void>;\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: DurableObjectStorage,\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(): Promise<OAuthClientInformation | undefined> {\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(\n clientInformation: OAuthClientInformationFull\n ): Promise<void> {\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(): Promise<OAuthTokens | undefined> {\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): Promise<void> {\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 async redirectToAuthorization(authUrl: URL): Promise<void> {\n // We want to track the client ID in state here because the typescript SSE client sometimes does\n // a dynamic client registration AFTER generating this redirect URL.\n const client_id = authUrl.searchParams.get(\"client_id\");\n if (client_id) {\n authUrl.searchParams.append(\"state\", client_id);\n }\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): Promise<void> {\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(): Promise<string> {\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 /** Transport tracking for OAuth flow */\n oauthTransportKey() {\n return `/${this.clientName}/${this.serverId}/oauth_transport`;\n }\n\n async saveOAuthTransport(transportType: string): Promise<void> {\n await this.storage.put(this.oauthTransportKey(), transportType);\n }\n\n async getOAuthTransport(): Promise<string | undefined> {\n return await this.storage.get<string>(this.oauthTransportKey());\n }\n\n async clearOAuthTransport(): Promise<void> {\n await this.storage.delete(this.oauthTransportKey());\n }\n}\n"],"mappings":"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","names":[]}
@@ -40,6 +40,22 @@ declare class SSEEdgeClientTransport extends SSEClientTransport {
40
40
  >;
41
41
  }
42
42
 
43
+ type MaybePromise<T> = T | Promise<T>;
44
+ type BaseTransportType = "sse" | "streamable-http";
45
+ type TransportType = BaseTransportType | "auto";
46
+ interface CORSOptions {
47
+ origin?: string;
48
+ methods?: string;
49
+ headers?: string;
50
+ maxAge?: number;
51
+ exposeHeaders?: string;
52
+ }
53
+ interface ServeOptions {
54
+ binding?: string;
55
+ corsOptions?: CORSOptions;
56
+ transport?: BaseTransportType;
57
+ }
58
+
43
59
  declare class StreamableHTTPEdgeClientTransport extends StreamableHTTPClientTransport {
44
60
  private authProvider;
45
61
  /**
@@ -59,9 +75,8 @@ type MCPTransportOptions = (
59
75
  | StreamableHTTPClientTransportOptions
60
76
  ) & {
61
77
  authProvider?: AgentsOAuthProvider;
62
- type?: "sse" | "streamable-http" | "auto";
78
+ type?: TransportType;
63
79
  };
64
- type TransportType = Exclude<MCPTransportOptions["type"], "auto">;
65
80
  declare class MCPClientConnection {
66
81
  url: URL;
67
82
  options: {
@@ -234,12 +249,9 @@ declare class MCPClientConnection {
234
249
  * @returns The transport for the client
235
250
  */
236
251
  getTransport(
237
- transportType: TransportType
252
+ transportType: BaseTransportType
238
253
  ): SSEEdgeClientTransport | StreamableHTTPEdgeClientTransport;
239
- tryConnect(
240
- transportType: MCPTransportOptions["type"],
241
- code?: string
242
- ): Promise<void>;
254
+ private tryConnect;
243
255
  }
244
256
 
245
257
  /**
@@ -284,6 +296,16 @@ declare class MCPClientManager {
284
296
  handleCallbackRequest(req: Request): Promise<{
285
297
  serverId: string;
286
298
  }>;
299
+ /**
300
+ * Register a callback URL for OAuth handling
301
+ * @param url The callback URL to register
302
+ */
303
+ registerCallbackUrl(url: string): void;
304
+ /**
305
+ * Unregister a callback URL
306
+ * @param serverId The server ID whose callback URL should be removed
307
+ */
308
+ unregisterCallbackUrl(serverId: string): void;
287
309
  /**
288
310
  * @returns namespaced list of tools
289
311
  */
@@ -5008,8 +5030,12 @@ declare function getNamespacedData<T extends keyof NamespacedData>(
5008
5030
  ): NamespacedData[T];
5009
5031
 
5010
5032
  export {
5011
- MCPClientManager as M,
5012
- SSEEdgeClientTransport as S,
5013
- StreamableHTTPEdgeClientTransport as a,
5033
+ type BaseTransportType as B,
5034
+ type MaybePromise as M,
5035
+ type ServeOptions as S,
5036
+ type TransportType as T,
5037
+ SSEEdgeClientTransport as a,
5038
+ StreamableHTTPEdgeClientTransport as b,
5039
+ MCPClientManager as c,
5014
5040
  getNamespacedData as g
5015
5041
  };
package/dist/client.js CHANGED
@@ -3,7 +3,8 @@ import {
3
3
  agentFetch,
4
4
  camelCaseToKebabCase
5
5
  } from "./chunk-QEVM4BVL.js";
6
- import "./chunk-AVYJQSLW.js";
6
+ import "./chunk-BER7KXUJ.js";
7
+ import "./chunk-PR4QN5HX.js";
7
8
  export {
8
9
  AgentClient,
9
10
  agentFetch,
package/dist/index.d.ts CHANGED
@@ -8,7 +8,10 @@ import {
8
8
  } from "@modelcontextprotocol/sdk/types.js";
9
9
  import { Server, Connection, PartyServerOptions } from "partyserver";
10
10
  export { Connection, ConnectionContext, WSMessage } from "partyserver";
11
- import { M as MCPClientManager } from "./client-CvaJdLQA.js";
11
+ import {
12
+ c as MCPClientManager,
13
+ T as TransportType
14
+ } from "./client-BohGLma8.js";
12
15
  import { Observability } from "./observability/index.js";
13
16
  import { MessageType } from "./ai-types.js";
14
17
  import "zod";
@@ -124,6 +127,7 @@ type Schedule<T = string> = {
124
127
  cron: string;
125
128
  }
126
129
  );
130
+
127
131
  /**
128
132
  * MCP Server state update message from server -> Client
129
133
  */
@@ -167,7 +171,7 @@ declare class Agent<
167
171
  > extends Server<Env, Props> {
168
172
  private _state;
169
173
  private _ParentClass;
170
- mcp: MCPClientManager;
174
+ readonly mcp: MCPClientManager;
171
175
  /**
172
176
  * Initial state for the Agent
173
177
  * Override to provide default state values
@@ -344,8 +348,9 @@ declare class Agent<
344
348
  /**
345
349
  * Connect to a new MCP Server
346
350
  *
351
+ * @param serverName Name of the MCP server
347
352
  * @param url MCP Server SSE URL
348
- * @param callbackHost Base host for the agent, used for the redirect URI.
353
+ * @param callbackHost Base host for the agent, used for the redirect URI. If not provided, will be derived from the current request.
349
354
  * @param agentsPrefix agents routing prefix if not using `agents`
350
355
  * @param options MCP client and transport (header) options
351
356
  * @returns authUrl
@@ -353,7 +358,7 @@ declare class Agent<
353
358
  addMcpServer(
354
359
  serverName: string,
355
360
  url: string,
356
- callbackHost: string,
361
+ callbackHost?: string,
357
362
  agentsPrefix?: string,
358
363
  options?: {
359
364
  client?: ConstructorParameters<typeof Client>[1];
@@ -380,6 +385,7 @@ declare class Agent<
380
385
  */
381
386
  transport?: {
382
387
  headers?: HeadersInit;
388
+ type?: TransportType;
383
389
  };
384
390
  },
385
391
  reconnect?: {
@@ -552,6 +558,7 @@ export {
552
558
  type Schedule,
553
559
  type StateUpdateMessage,
554
560
  StreamingResponse,
561
+ TransportType,
555
562
  callable,
556
563
  createAddressBasedEmailResolver,
557
564
  createCatchAllEmailResolver,
package/dist/index.js CHANGED
@@ -10,11 +10,12 @@ import {
10
10
  routeAgentEmail,
11
11
  routeAgentRequest,
12
12
  unstable_callable
13
- } from "./chunk-YDUDMOL6.js";
14
- import "./chunk-MH46VMM4.js";
15
- import "./chunk-LL2AFX7V.js";
13
+ } from "./chunk-RS5OCNEQ.js";
14
+ import "./chunk-QEPGNUG6.js";
15
+ import "./chunk-XFS5ERG3.js";
16
16
  import "./chunk-QEVM4BVL.js";
17
- import "./chunk-AVYJQSLW.js";
17
+ import "./chunk-BER7KXUJ.js";
18
+ import "./chunk-PR4QN5HX.js";
18
19
  export {
19
20
  Agent,
20
21
  StreamingResponse,
@@ -3,7 +3,7 @@ import '@modelcontextprotocol/sdk/client/index.js';
3
3
  import '@modelcontextprotocol/sdk/shared/protocol.js';
4
4
  import '@modelcontextprotocol/sdk/types.js';
5
5
  import 'ai';
6
- export { M as MCPClientManager, g as getNamespacedData } from '../client-CvaJdLQA.js';
6
+ export { c as MCPClientManager, g as getNamespacedData } from '../client-BohGLma8.js';
7
7
  import '@modelcontextprotocol/sdk/client/sse.js';
8
8
  import '@modelcontextprotocol/sdk/client/streamableHttp.js';
9
9
  import './do-oauth-client-provider.js';
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  MCPClientManager,
3
3
  getNamespacedData
4
- } from "../chunk-MH46VMM4.js";
4
+ } from "../chunk-QEPGNUG6.js";
5
+ import "../chunk-PR4QN5HX.js";
5
6
  export {
6
7
  MCPClientManager,
7
8
  getNamespacedData
@@ -5,6 +5,9 @@ interface AgentsOAuthProvider extends OAuthClientProvider {
5
5
  authUrl: string | undefined;
6
6
  clientId: string | undefined;
7
7
  serverId: string | undefined;
8
+ saveOAuthTransport(transportType: string): Promise<void>;
9
+ getOAuthTransport(): Promise<string | undefined>;
10
+ clearOAuthTransport(): Promise<void>;
8
11
  }
9
12
  declare class DurableObjectOAuthClientProvider implements AgentsOAuthProvider {
10
13
  storage: DurableObjectStorage;
@@ -37,6 +40,11 @@ declare class DurableObjectOAuthClientProvider implements AgentsOAuthProvider {
37
40
  codeVerifierKey(clientId: string): string;
38
41
  saveCodeVerifier(verifier: string): Promise<void>;
39
42
  codeVerifier(): Promise<string>;
43
+ /** Transport tracking for OAuth flow */
44
+ oauthTransportKey(): string;
45
+ saveOAuthTransport(transportType: string): Promise<void>;
46
+ getOAuthTransport(): Promise<string | undefined>;
47
+ clearOAuthTransport(): Promise<void>;
40
48
  }
41
49
 
42
50
  export { type AgentsOAuthProvider, DurableObjectOAuthClientProvider };
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  DurableObjectOAuthClientProvider
3
- } from "../chunk-LL2AFX7V.js";
3
+ } from "../chunk-XFS5ERG3.js";
4
+ import "../chunk-PR4QN5HX.js";
4
5
  export {
5
6
  DurableObjectOAuthClientProvider
6
7
  };
@@ -2,9 +2,10 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { JSONRPCMessage, ElicitResult } from '@modelcontextprotocol/sdk/types.js';
4
4
  export { ElicitRequest, ElicitRequestSchema, ElicitResult } from '@modelcontextprotocol/sdk/types.js';
5
- import { Agent, AgentContext } from '../index.js';
6
- export { S as SSEEdgeClientTransport, a as StreamableHTTPEdgeClientTransport } from '../client-CvaJdLQA.js';
7
- import { Connection, ConnectionContext, WSMessage } from 'partyserver';
5
+ import { Agent } from '../index.js';
6
+ import { M as MaybePromise, B as BaseTransportType, S as ServeOptions } from '../client-BohGLma8.js';
7
+ export { a as SSEEdgeClientTransport, b as StreamableHTTPEdgeClientTransport } from '../client-BohGLma8.js';
8
+ import { Connection, ConnectionContext } from 'partyserver';
8
9
  import 'cloudflare:workers';
9
10
  import '@modelcontextprotocol/sdk/client/index.js';
10
11
  import '../observability/index.js';
@@ -18,54 +19,34 @@ import './do-oauth-client-provider.js';
18
19
  import '@modelcontextprotocol/sdk/client/auth.js';
19
20
  import '@modelcontextprotocol/sdk/shared/auth.js';
20
21
 
21
- type MaybePromise<T> = T | Promise<T>;
22
- type TransportType = "sse" | "streamable-http";
23
- interface CORSOptions {
24
- origin?: string;
25
- methods?: string;
26
- headers?: string;
27
- maxAge?: number;
28
- exposeHeaders?: string;
29
- }
30
- interface ServeOptions {
31
- binding?: string;
32
- corsOptions?: CORSOptions;
33
- transport?: TransportType;
34
- }
35
-
36
22
  declare abstract class McpAgent<Env = unknown, State = unknown, Props extends Record<string, unknown> = Record<string, unknown>> extends Agent<Env, State, Props> {
37
23
  private _transport?;
38
- private _requestIdToConnectionId;
39
- private _standaloneSseConnectionId?;
40
24
  props?: Props;
41
25
  abstract server: MaybePromise<McpServer | Server>;
42
26
  abstract init(): Promise<void>;
43
- constructor(ctx: AgentContext, env: Env);
44
27
  setInitializeRequest(initializeRequest: JSONRPCMessage): Promise<void>;
45
28
  getInitializeRequest(): Promise<JSONRPCMessage | undefined>;
46
29
  /** Read the transport type for this agent.
47
30
  * This relies on the naming scheme being `sse:${sessionId}`
48
31
  * or `streamable-http:${sessionId}`.
49
32
  */
50
- getTransportType(): TransportType;
51
- /** Get the WebSocket for the standalone SSE if any. Streamable HTTP only. */
52
- private getWebSocketForStandaloneSse;
33
+ getTransportType(): BaseTransportType;
34
+ /** Read the sessionId for this agent.
35
+ * This relies on the naming scheme being `sse:${sessionId}`
36
+ * or `streamable-http:${sessionId}`.
37
+ */
38
+ getSessionId(): string;
53
39
  /** Get the unique WebSocket. SSE transport only. */
54
40
  private getWebSocket;
55
- /** Get the corresponding WebSocket for a responseId. Streamable HTTP only. */
56
- private getWebSocketForResponseID;
57
41
  /** Returns a new transport matching the type of the Agent. */
58
42
  private initTransport;
59
43
  /** Update and store the props */
60
44
  updateProps(props?: Props): Promise<void>;
45
+ reinitializeServer(): Promise<void>;
61
46
  /** Sets up the MCP transport and server every time the Agent is started.*/
62
47
  onStart(props?: Props): Promise<void>;
63
48
  /** Validates new WebSocket connections. */
64
- onConnect(conn: Connection, _: ConnectionContext): Promise<void>;
65
- /** Handles MCP Messages for Streamable HTTP. */
66
- onMessage(connection: Connection, event: WSMessage): Promise<void>;
67
- /** Remove clients from our cache when they disconnect */
68
- onClose(conn: Connection, _code: number, _reason: string, _wasClean: boolean): Promise<void>;
49
+ onConnect(conn: Connection, { request: req }: ConnectionContext): Promise<void>;
69
50
  /** Handles MCP Messages for the legacy SSE transport. */
70
51
  onSSEMcpMessage(_sessionId: string, messageBody: unknown): Promise<Error | null>;
71
52
  /** Elicit user input with a message and schema */