agents 0.20.0 → 0.20.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-stateless-CIkKPETH.js","names":["candidate","createSdkMcpHandler"],"sources":["../src/mcp/auth-context.ts","../src/mcp/handler-errors.ts","../src/mcp/handler-legacy-compat.ts","../src/mcp/handler-stateless.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { AuthInfo } from \"@modelcontextprotocol/server\";\n\nconst VERIFIED_OAUTH_CONTEXT = Symbol.for(\n \"cloudflare.workers-oauth-provider.verified-context.v1\"\n);\n\ninterface VerifiedWorkersOAuthContext {\n version: 1;\n token: string;\n clientId: string;\n scopes: string[];\n expiresAt?: number;\n resource?: string;\n props: Record<string, unknown>;\n}\n\nexport interface McpAuthContext {\n props: Record<string, unknown>;\n}\n\nconst authContextStorage = new AsyncLocalStorage<McpAuthContext>();\n\nexport function getMcpAuthContext(): McpAuthContext | undefined {\n return authContextStorage.getStore();\n}\n\nexport function runWithAuthContext<T>(context: McpAuthContext, fn: () => T): T {\n return authContextStorage.run(context, fn);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction invalidVerifiedContext(): never {\n throw new TypeError(\"Invalid verified OAuth request context\");\n}\n\nexport function getVerifiedOAuthAuthInfo(\n ctx: ExecutionContext\n): { authInfo: AuthInfo; props: Record<string, unknown> } | undefined {\n const symbolContext = ctx as ExecutionContext & Record<symbol, unknown>;\n if (!(VERIFIED_OAUTH_CONTEXT in symbolContext)) return undefined;\n\n const value = symbolContext[VERIFIED_OAUTH_CONTEXT];\n if (!isPlainRecord(value) || value.version !== 1) invalidVerifiedContext();\n\n const candidate = value as Partial<VerifiedWorkersOAuthContext>;\n const { token, clientId, scopes, expiresAt, resource, props } = candidate;\n if (\n typeof token !== \"string\" ||\n token.length === 0 ||\n typeof clientId !== \"string\" ||\n clientId.length === 0 ||\n !Array.isArray(scopes) ||\n !scopes.every((scope) => typeof scope === \"string\") ||\n !isPlainRecord(props)\n ) {\n invalidVerifiedContext();\n }\n\n if (\n expiresAt !== undefined &&\n (typeof expiresAt !== \"number\" ||\n !Number.isFinite(expiresAt) ||\n expiresAt <= 0)\n ) {\n invalidVerifiedContext();\n }\n\n let resourceUrl: URL | undefined;\n if (resource !== undefined) {\n if (typeof resource !== \"string\") invalidVerifiedContext();\n try {\n resourceUrl = new URL(resource);\n } catch {\n invalidVerifiedContext();\n }\n if (resourceUrl.protocol !== \"http:\" && resourceUrl.protocol !== \"https:\") {\n invalidVerifiedContext();\n }\n }\n\n if (ctx.props !== props) invalidVerifiedContext();\n\n return {\n props,\n authInfo: {\n token,\n clientId,\n scopes: [...scopes],\n ...(expiresAt !== undefined && { expiresAt }),\n ...(resourceUrl !== undefined && { resource: resourceUrl }),\n extra: { props }\n }\n };\n}\n","export function internalErrorResponse(\n id: string | number | null = null\n): Response {\n return Response.json(\n {\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal server error\" },\n id\n },\n { status: 500 }\n );\n}\n\nexport function requestIdFromParsedBody(body: unknown): string | number | null {\n if (\n typeof body !== \"object\" ||\n body === null ||\n Array.isArray(body) ||\n !(\"method\" in body) ||\n typeof body.method !== \"string\" ||\n !(\"id\" in body)\n ) {\n return null;\n }\n return typeof body.id === \"string\" || typeof body.id === \"number\"\n ? body.id\n : null;\n}\n\nexport function reportHandlerError(\n onerror: ((error: Error) => void) | undefined,\n error: unknown\n): void {\n try {\n onerror?.(error instanceof Error ? error : new Error(String(error)));\n } catch {\n // Error reporting must not change the response.\n }\n}\n","import {\n WebStandardStreamableHTTPServerTransport,\n isJSONRPCRequest,\n type CreateMcpHandlerOptions,\n type McpHandlerRequestOptions,\n type McpServer,\n type McpServerFactory,\n type Server\n} from \"@modelcontextprotocol/server\";\nimport {\n internalErrorResponse,\n reportHandlerError,\n requestIdFromParsedBody\n} from \"./handler-errors\";\n/**\n * Temporary adapter for Legacy compatibility on the SDK v2 transport.\n *\n * Local deltas from the upstream stateless fallback:\n *\n * - impossible stateless server-to-client requests fail immediately rather\n * than leaving the tool handler waiting for a session response.\n *\n * Streaming and keepalive behavior remain delegated to the SDK transport.\n * Remove this adapter once the SDK exposes the reverse-request policy directly.\n */\nexport function createLegacyCompatibilityRequestHandler(\n factory: McpServerFactory,\n handlerOptions: Pick<CreateMcpHandlerOptions, \"keepAliveMs\" | \"onerror\"> = {}\n) {\n const { keepAliveMs, onerror } = handlerOptions;\n const fetch = async (\n request: Request,\n requestOptions: McpHandlerRequestOptions | undefined\n ): Promise<Response> => {\n // Match the upstream Legacy fallback: GET and DELETE are session operations\n // and cannot be served by a fresh per-request transport. Reject\n // them before running a factory with application-visible side effects.\n if (request.method.toUpperCase() !== \"POST\") {\n return Response.json(\n {\n jsonrpc: \"2.0\",\n error: { code: -32000, message: \"Method not allowed.\" },\n id: null\n },\n { status: 405 }\n );\n }\n\n if (request.signal.aborted) {\n return new Response(null, { status: 499 });\n }\n\n let product: McpServer | Server | undefined;\n let transport: WebStandardStreamableHTTPServerTransport | undefined;\n let teardownPromise: Promise<void> | undefined;\n const teardown = () =>\n (teardownPromise ??= (async () => {\n await Promise.all([\n transport?.close().catch(() => {}),\n product?.close().catch(() => {})\n ]);\n })());\n const onAbort = () => void teardown();\n\n try {\n product = await factory({\n era: \"legacy\",\n ...(requestOptions?.authInfo !== undefined && {\n authInfo: requestOptions.authInfo\n }),\n requestInfo: request\n });\n transport = new WebStandardStreamableHTTPServerTransport({\n keepAliveMs,\n sessionIdGenerator: undefined\n });\n\n const send = transport.send.bind(transport);\n transport.send = async (message, sendOptions) => {\n if (isJSONRPCRequest(message)) {\n transport?.onmessage?.({\n jsonrpc: \"2.0\",\n id: message.id,\n error: {\n code: -32603,\n message:\n \"Server-to-client requests are unavailable in the Legacy compatibility lane. \" +\n \"Use inputRequired(...) for Stateless clients, or route \" +\n \"Legacy traffic to a sessionful transport.\"\n }\n });\n return;\n }\n await send(message, sendOptions);\n };\n\n await product.connect(transport);\n if (request.signal.aborted) {\n await teardown();\n return new Response(null, { status: 499 });\n }\n request.signal.addEventListener(\"abort\", onAbort, { once: true });\n const response = await transport.handleRequest(request, {\n ...(requestOptions?.authInfo !== undefined && {\n authInfo: requestOptions.authInfo\n }),\n ...(requestOptions?.parsedBody !== undefined && {\n parsedBody: requestOptions.parsedBody\n })\n });\n\n if (\n response.body === null ||\n !response.headers.get(\"content-type\")?.includes(\"text/event-stream\")\n ) {\n request.signal.removeEventListener(\"abort\", onAbort);\n await teardown();\n return response;\n }\n\n const reader = response.body.getReader();\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n request.signal.removeEventListener(\"abort\", onAbort);\n await teardown();\n controller.close();\n } else if (value !== undefined) {\n controller.enqueue(value);\n }\n } catch (error) {\n request.signal.removeEventListener(\"abort\", onAbort);\n await teardown();\n controller.error(error);\n }\n },\n async cancel(reason) {\n request.signal.removeEventListener(\"abort\", onAbort);\n await reader.cancel(reason).catch(() => {});\n await teardown();\n }\n });\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n } catch (error) {\n request.signal.removeEventListener(\"abort\", onAbort);\n await teardown();\n reportHandlerError(onerror, error);\n return internalErrorResponse(\n requestIdFromParsedBody(requestOptions?.parsedBody)\n );\n }\n };\n\n return { fetch };\n}\n","import {\n createMcpHandler as createSdkMcpHandler,\n hostHeaderValidationResponse,\n isLegacyRequest,\n localhostAllowedHostnames,\n localhostAllowedOrigins,\n originValidationResponse,\n type AuthInfo,\n type CreateMcpHandlerOptions as SdkCreateMcpHandlerOptions,\n type McpHandlerRequestOptions,\n type McpServerFactory,\n type ServerNotifier\n} from \"@modelcontextprotocol/server\";\nimport {\n getVerifiedOAuthAuthInfo,\n runWithAuthContext,\n type McpAuthContext\n} from \"./auth-context\";\nimport { internalErrorResponse, reportHandlerError } from \"./handler-errors\";\nimport { createLegacyCompatibilityRequestHandler } from \"./handler-legacy-compat\";\nimport type { CORSOptions } from \"./types\";\n\nexport interface CreateStatelessMcpHandlerOptions extends Omit<\n SdkCreateMcpHandlerOptions,\n \"bus\"\n> {\n /** Exact pathname handled by this Worker wrapper. @default \"/mcp\" */\n route?: string;\n /** CORS headers applied by the Worker wrapper. Pass `false` to disable. */\n corsOptions?: CORSOptions | false;\n /**\n * Restrict `Host` headers to these hostnames. Localhost and `workers.dev`\n * endpoints receive matching defaults; custom domains rely on Cloudflare\n * routing unless this option is set.\n */\n allowedHostnames?: string[];\n /**\n * Restrict present browser `Origin` headers to these hostnames. Requests\n * without an Origin (including non-browser MCP clients) remain valid. The\n * default includes localhost-class Origins, the endpoint's `workers.dev`\n * hostname, and a concrete `corsOptions.origin` hostname. Pass `\"*\"` only\n * when equivalent Origin validation runs in trusted middleware upstream.\n */\n allowedOriginHostnames?: string[] | \"*\";\n /** Application props exposed through {@link getMcpAuthContext}. */\n authContext?: McpAuthContext;\n}\n\nexport type StatelessMcpHandler = {\n (request: Request, env: unknown, ctx: ExecutionContext): Promise<Response>;\n fetch(\n request: Request,\n options?: McpHandlerRequestOptions\n ): Promise<Response>;\n notify: ServerNotifier;\n};\n\nexport type StatelessMcpServerInput = McpServerFactory;\n\nconst DEFAULT_CORS_OPTIONS: Required<CORSOptions> = {\n origin: \"*\",\n headers:\n \"Content-Type, Accept, Authorization, mcp-session-id, MCP-Protocol-Version, Mcp-Method, Mcp-Name\",\n methods: \"GET, POST, DELETE, OPTIONS\",\n exposeHeaders: \"mcp-session-id\",\n maxAge: 86400\n};\n\nfunction corsHeaders(options: CORSOptions = {}): Headers {\n const merged = { ...DEFAULT_CORS_OPTIONS, ...options };\n return new Headers({\n \"Access-Control-Allow-Headers\": merged.headers,\n \"Access-Control-Allow-Methods\": merged.methods,\n \"Access-Control-Allow-Origin\": merged.origin,\n \"Access-Control-Expose-Headers\": merged.exposeHeaders,\n \"Access-Control-Max-Age\": String(merged.maxAge)\n });\n}\n\nfunction withCors(response: Response, options: CORSOptions | false): Response {\n const headers = new Headers(response.headers);\n if (options === false) {\n for (const name of Array.from(headers.keys())) {\n if (name.toLowerCase().startsWith(\"access-control-\")) {\n headers.delete(name);\n }\n }\n } else {\n for (const [name, value] of corsHeaders(options)) {\n headers.set(name, value);\n }\n }\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers\n });\n}\n\nfunction wrapResponseBodyWithAuthContext(\n response: Response,\n authContext: McpAuthContext | undefined\n): Response {\n if (!authContext || !response.body) return response;\n\n const reader = response.body.getReader();\n const body = new ReadableStream<Uint8Array>({\n pull(controller) {\n return runWithAuthContext(authContext, async () => {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n });\n },\n cancel(reason) {\n return runWithAuthContext(authContext, () => reader.cancel(reason));\n }\n });\n\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n}\n\nexport function createStatelessMcpHandler(\n factory: StatelessMcpServerInput,\n options: CreateStatelessMcpHandlerOptions = {}\n): StatelessMcpHandler {\n const optionRecord = options as Record<string, unknown>;\n if (optionRecord.bus !== undefined) {\n throw new TypeError(\n 'createMcpHandler option \"bus\" is not exposed by the Agents SDK.'\n );\n }\n const legacyOnlyOption = [\n \"transport\",\n \"storage\",\n \"sessionIdGenerator\",\n \"onsessioninitialized\",\n \"onsessionclosed\",\n \"enableJsonResponse\",\n \"eventStore\",\n \"allowedHosts\",\n \"allowedOrigins\",\n \"enableDnsRebindingProtection\",\n \"retryInterval\"\n ].find((key) => optionRecord[key] !== undefined);\n if (legacyOnlyOption) {\n throw new TypeError(\n `createMcpHandler option \"${legacyOnlyOption}\" is only supported with an MCP SDK v1 server. The managed SDK v2 handler is stateless; remove this option or keep the v1 server during migration.`\n );\n }\n\n const {\n route = \"/mcp\",\n corsOptions = {},\n allowedHostnames,\n allowedOriginHostnames,\n authContext,\n legacy = \"stateless\",\n ...sdkOptions\n } = options;\n\n const sdkHandler = createSdkMcpHandler(factory, {\n ...sdkOptions,\n legacy: \"reject\"\n });\n const legacyCompatibilityHandler =\n legacy === \"stateless\"\n ? createLegacyCompatibilityRequestHandler(factory, {\n keepAliveMs: sdkOptions.keepAliveMs,\n onerror: sdkOptions.onerror\n })\n : undefined;\n\n const serve = async (\n request: Request,\n requestOptions?: McpHandlerRequestOptions,\n workerCtx?: ExecutionContext\n ): Promise<Response> => {\n const requestUrl = new URL(request.url);\n if (requestUrl.pathname !== route) {\n return withCors(new Response(\"Not Found\", { status: 404 }), corsOptions);\n }\n\n // The SDK app factories can distinguish their bind address from an\n // attacker-controlled Host header. A bare Worker cannot. Use defaults we\n // can establish independently: localhost-class names, a standard\n // workers.dev route, and any concrete CORS Origin the application chose.\n // Custom-domain deployments can provide explicit Host and Origin lists.\n const localEndpoint = localhostAllowedHostnames().includes(\n requestUrl.hostname\n );\n const workersDevEndpoint = requestUrl.hostname.endsWith(\".workers.dev\");\n const acceptedHostnames =\n allowedHostnames ??\n (localEndpoint\n ? localhostAllowedHostnames()\n : workersDevEndpoint\n ? [requestUrl.hostname]\n : undefined);\n const hostRejection = acceptedHostnames\n ? hostHeaderValidationResponse(request, acceptedHostnames)\n : undefined;\n if (hostRejection) {\n return withCors(hostRejection, corsOptions);\n }\n if (allowedOriginHostnames !== \"*\") {\n let acceptedOriginHostnames = allowedOriginHostnames;\n if (acceptedOriginHostnames === undefined) {\n const defaults = new Set(localhostAllowedOrigins());\n if (workersDevEndpoint) defaults.add(requestUrl.hostname);\n if (corsOptions !== false && corsOptions.origin !== undefined) {\n try {\n const configuredOrigin = new URL(corsOptions.origin);\n if (\n (configuredOrigin.protocol === \"http:\" ||\n configuredOrigin.protocol === \"https:\") &&\n configuredOrigin.hostname\n ) {\n defaults.add(configuredOrigin.hostname);\n }\n } catch {\n // A wildcard or malformed CORS value does not expand the allowlist.\n }\n }\n acceptedOriginHostnames = [...defaults];\n }\n const originRejection = originValidationResponse(\n request,\n acceptedOriginHostnames ?? []\n );\n if (originRejection) {\n return withCors(originRejection, corsOptions);\n }\n }\n\n if (request.method === \"OPTIONS\" && corsOptions !== false) {\n return new Response(null, { headers: corsHeaders(corsOptions) });\n }\n\n const legacyRequest =\n legacyCompatibilityHandler !== undefined &&\n (await isLegacyRequest(request, requestOptions?.parsedBody));\n\n try {\n const verified = workerCtx\n ? getVerifiedOAuthAuthInfo(workerCtx)\n : undefined;\n const explicitAuthInfo = requestOptions?.authInfo;\n if (\n verified &&\n explicitAuthInfo &&\n explicitAuthInfo.clientId !== verified.authInfo.clientId\n ) {\n throw new TypeError(\"Conflicting verified OAuth client identity\");\n }\n\n const authInfo: AuthInfo | undefined =\n explicitAuthInfo ?? verified?.authInfo;\n const resolvedAuthContext =\n authContext ??\n (verified\n ? { props: verified.props }\n : workerCtx?.props && Object.keys(workerCtx.props).length > 0\n ? { props: workerCtx.props as Record<string, unknown> }\n : undefined);\n const upstreamOptions: McpHandlerRequestOptions | undefined =\n requestOptions || authInfo\n ? { ...requestOptions, ...(authInfo && { authInfo }) }\n : undefined;\n const invoke = async () => {\n if (legacyRequest && legacyCompatibilityHandler) {\n return legacyCompatibilityHandler.fetch(request, upstreamOptions);\n }\n return sdkHandler.fetch(request, upstreamOptions);\n };\n const response = resolvedAuthContext\n ? await runWithAuthContext(resolvedAuthContext, invoke)\n : await invoke();\n return withCors(\n wrapResponseBodyWithAuthContext(response, resolvedAuthContext),\n corsOptions\n );\n } catch (error) {\n reportHandlerError(sdkOptions.onerror, error);\n return withCors(internalErrorResponse(), corsOptions);\n }\n };\n\n const callable = (request: Request, _env: unknown, ctx: ExecutionContext) =>\n serve(request, undefined, ctx);\n const fetch = (request: Request, requestOptions?: McpHandlerRequestOptions) =>\n serve(request, requestOptions);\n\n return Object.assign(callable, {\n fetch,\n notify: sdkHandler.notify\n }) as StatelessMcpHandler;\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -43,6 +43,7 @@ import {
43
43
  dt as callable,
44
44
  et as Schedule,
45
45
  f as AgentToolProgress,
46
+ fn as withInvocationScope,
46
47
  ft as getAgentByName,
47
48
  g as AgentToolRunPart,
48
49
  gt as unstable_callable,
@@ -80,7 +81,7 @@ import {
80
81
  y as AgentToolStoredChunk,
81
82
  yt as MCPAITool,
82
83
  z as EmailRoutingOptions
83
- } from "./agent-tool-types-Btk9ETS-.js";
84
+ } from "./agent-tool-types-BC-WFlsz.js";
84
85
  import { n as camelCaseToKebabCase } from "./utils-CGtGDSgA.js";
85
86
  import {
86
87
  i as isDurableObjectStorageReset,
@@ -174,6 +175,7 @@ export {
174
175
  type TransportType,
175
176
  type WSMessage,
176
177
  __DO_NOT_USE_WILL_BREAK__agentContext,
178
+ withInvocationScope as __DO_NOT_USE_WILL_BREAK__withInvocationScope,
177
179
  callable,
178
180
  camelCaseToKebabCase,
179
181
  createHeaderBasedEmailResolver,
package/dist/index.js CHANGED
@@ -4,12 +4,12 @@ import { MessageType } from "./types.js";
4
4
  import { camelCaseToKebabCase, isInternalJsStubProp } from "./utils.js";
5
5
  import { createHeaderBasedEmailResolver, signAgentHeaders } from "./email.js";
6
6
  import { i as _classPrivateFieldInitSpec, n as _classPrivateFieldSet2, t as _classPrivateFieldGet2 } from "./classPrivateFieldGet2-DZBYAB34.js";
7
+ import { n as withInvocationScope, r as writeSpanAttributes, t as tracer } from "./cloudflare-BduZwmYK.js";
7
8
  import { SUB_PREFIX, getSubAgentByName, parseSubAgentPath, routeSubAgentRequest } from "./sub-routing.js";
8
9
  import { isDurableObjectCodeUpdateReset, isDurableObjectMemoryLimitReset, isDurableObjectStorageReset, isErrorRetryable, isPlatformTransientError, tryN, validateRetryOptions } from "./retries.js";
9
10
  import { a as MCPConnectionState, c as RPC_DO_PREFIX, i as normalizeServerId, l as DisposableStore, n as MCP_SERVER_ID_MAX_LENGTH, t as MCPClientManager } from "./client-zqKcsyFa.js";
10
11
  import { DurableObjectOAuthClientProvider } from "./mcp/do-oauth-client-provider.js";
11
12
  import { genericObservability } from "./observability/index.js";
12
- import { n as writeSpanAttributes, t as tracer } from "./cloudflare-BldFV0Pa.js";
13
13
  import { AsyncLocalStorage } from "node:async_hooks";
14
14
  import { parseCronExpression } from "cron-schedule";
15
15
  import { nanoid } from "nanoid";
@@ -18,6 +18,15 @@ import { RpcTarget, exports } from "cloudflare:workers";
18
18
  import { Server, getServerByName, routePartykitRequest } from "partyserver";
19
19
  //#region src/index.ts
20
20
  let _Symbol$dispose;
21
+ /**
22
+ * Enters an agent invocation: the context every handler reads, plus the span
23
+ * scope that stops invocation-bounded spans from outliving it. Scopes do not
24
+ * nest, so the outermost live entry point owns the boundary — pass
25
+ * `detached` for work that deliberately runs on past its caller.
26
+ */
27
+ function runInInvocation(store, body, options) {
28
+ return __DO_NOT_USE_WILL_BREAK__agentContext.run(store, () => withInvocationScope(body, options));
29
+ }
21
30
  function isClosedWebSocketSendError(error) {
22
31
  return error instanceof TypeError && error.message.includes("WebSocket send() after close");
23
32
  }
@@ -380,7 +389,7 @@ function withAgentContext(method) {
380
389
  return function(...args) {
381
390
  const { agent } = getCurrentAgent();
382
391
  if (agent === this) return method.apply(this, args);
383
- return __DO_NOT_USE_WILL_BREAK__agentContext.run({
392
+ return runInInvocation({
384
393
  agent: this,
385
394
  connection: void 0,
386
395
  request: void 0,
@@ -497,7 +506,7 @@ var Agent = class Agent extends Server {
497
506
  "cloudflare.agents.storage.system": "durable_object",
498
507
  "cloudflare.agents.storage.phase": storagePhase,
499
508
  ...attributes
500
- }, (span) => run((finishAttributes) => writeSpanAttributes(span, finishAttributes)));
509
+ }, (span) => run((finishAttributes) => writeSpanAttributes(span, finishAttributes)), __DO_NOT_USE_WILL_BREAK__agentContext.getStore()?.connection === void 0 ? void 0 : { boundToInvocation: true });
501
510
  }
502
511
  /**
503
512
  * Execute SQL queries against the Agent's database
@@ -824,7 +833,7 @@ var Agent = class Agent extends Server {
824
833
  }
825
834
  const _onRequest = this.onRequest.bind(this);
826
835
  this.onRequest = (request) => {
827
- return __DO_NOT_USE_WILL_BREAK__agentContext.run({
836
+ return runInInvocation({
828
837
  agent: this,
829
838
  connection: void 0,
830
839
  request,
@@ -839,7 +848,7 @@ var Agent = class Agent extends Server {
839
848
  this.onMessage = async (connection, message) => {
840
849
  if (await this._cf_forwardSubAgentWebSocketMessage(connection, message)) return;
841
850
  this._ensureConnectionWrapped(connection);
842
- return __DO_NOT_USE_WILL_BREAK__agentContext.run({
851
+ return runInInvocation({
843
852
  agent: this,
844
853
  connection,
845
854
  request: void 0,
@@ -932,7 +941,7 @@ var Agent = class Agent extends Server {
932
941
  const subAgentOuterUrl = ctx.request.headers.get(SUB_AGENT_OUTER_URL_HEADER);
933
942
  if (subAgentOuterUrl) this._unsafe_setConnectionFlag(connection, CF_SUB_AGENT_OUTER_URL_KEY, subAgentOuterUrl);
934
943
  if (await this._cf_forwardSubAgentWebSocketConnect(connection, ctx.request, { gate: false })) return;
935
- return __DO_NOT_USE_WILL_BREAK__agentContext.run({
944
+ return runInInvocation({
936
945
  agent: this,
937
946
  connection,
938
947
  request: ctx.request,
@@ -979,7 +988,7 @@ var Agent = class Agent extends Server {
979
988
  const _onClose = this.onClose.bind(this);
980
989
  this.onClose = async (connection, code, reason, wasClean) => {
981
990
  if (await this._cf_forwardSubAgentWebSocketClose(connection, code, reason, wasClean)) return;
982
- return __DO_NOT_USE_WILL_BREAK__agentContext.run({
991
+ return runInInvocation({
983
992
  agent: this,
984
993
  connection,
985
994
  request: void 0,
@@ -995,7 +1004,7 @@ var Agent = class Agent extends Server {
995
1004
  };
996
1005
  const _onStart = this.onStart.bind(this);
997
1006
  const startAgent = async (props, update) => {
998
- return __DO_NOT_USE_WILL_BREAK__agentContext.run({
1007
+ return runInInvocation({
999
1008
  agent: this,
1000
1009
  connection: void 0,
1001
1010
  request: void 0,
@@ -1098,7 +1107,7 @@ var Agent = class Agent extends Server {
1098
1107
  const { connection, request, email } = __DO_NOT_USE_WILL_BREAK__agentContext.getStore() || {};
1099
1108
  this.ctx.waitUntil((async () => {
1100
1109
  try {
1101
- await __DO_NOT_USE_WILL_BREAK__agentContext.run({
1110
+ await runInInvocation({
1102
1111
  agent: this,
1103
1112
  connection,
1104
1113
  request,
@@ -1106,7 +1115,7 @@ var Agent = class Agent extends Server {
1106
1115
  }, async () => {
1107
1116
  this._emit("state:update");
1108
1117
  await this._callStatePersistenceHook(nextState, source);
1109
- });
1118
+ }, { detached: true });
1110
1119
  } catch (e) {
1111
1120
  try {
1112
1121
  await this.onError(e);
@@ -1371,7 +1380,7 @@ var Agent = class Agent extends Server {
1371
1380
  forward: (rcptTo, headers) => payload._bridge.forward(rcptTo, headers),
1372
1381
  reply: (options) => payload._bridge.reply(options)
1373
1382
  };
1374
- return __DO_NOT_USE_WILL_BREAK__agentContext.run({
1383
+ return runInInvocation({
1375
1384
  agent: this,
1376
1385
  connection: void 0,
1377
1386
  request: void 0,
@@ -1620,7 +1629,7 @@ var Agent = class Agent extends Server {
1620
1629
  continue;
1621
1630
  }
1622
1631
  const { connection, request, email } = __DO_NOT_USE_WILL_BREAK__agentContext.getStore() || {};
1623
- await __DO_NOT_USE_WILL_BREAK__agentContext.run({
1632
+ await runInInvocation({
1624
1633
  agent: this,
1625
1634
  connection,
1626
1635
  request,
@@ -1655,7 +1664,7 @@ var Agent = class Agent extends Server {
1655
1664
  } finally {
1656
1665
  this.dequeue(row.id);
1657
1666
  }
1658
- });
1667
+ }, { detached: true });
1659
1668
  }
1660
1669
  }
1661
1670
  } finally {
@@ -3295,7 +3304,7 @@ var Agent = class Agent extends Server {
3295
3304
  console.error(`callback ${row.callback} not found`);
3296
3305
  return;
3297
3306
  }
3298
- await __DO_NOT_USE_WILL_BREAK__agentContext.run({
3307
+ await runInInvocation({
3299
3308
  agent: this,
3300
3309
  connection: void 0,
3301
3310
  request: void 0,
@@ -4766,12 +4775,12 @@ var Agent = class Agent extends Server {
4766
4775
  await invoke();
4767
4776
  return;
4768
4777
  }
4769
- await __DO_NOT_USE_WILL_BREAK__agentContext.run({
4778
+ await runInInvocation({
4770
4779
  agent: this,
4771
4780
  connection: void 0,
4772
4781
  request: void 0,
4773
4782
  email: void 0
4774
- }, invoke);
4783
+ }, invoke, { detached: true });
4775
4784
  }
4776
4785
  /**
4777
4786
  * Arm the self-scheduling detached reconcile backbone. Existing schedules are
@@ -5727,7 +5736,7 @@ var Agent = class Agent extends Server {
5727
5736
  }));
5728
5737
  this._recordSubAgent(className, name, identity);
5729
5738
  try {
5730
- await __DO_NOT_USE_WILL_BREAK__agentContext.run({
5739
+ await runInInvocation({
5731
5740
  agent: this,
5732
5741
  connection: void 0,
5733
5742
  request: void 0,
@@ -7223,6 +7232,6 @@ var StreamingResponse = class {
7223
7232
  }
7224
7233
  };
7225
7234
  //#endregion
7226
- export { AGENT_TOOL_MILESTONE_PART, AGENT_TOOL_PROGRESS_PART, Agent, DEFAULT_AGENT_STATIC_OPTIONS, DurableObjectOAuthClientProvider, MCP_SERVER_ID_MAX_LENGTH, MessageType, SUB_PREFIX, SqlError, StreamingResponse, __DO_NOT_USE_WILL_BREAK__agentContext, callable, camelCaseToKebabCase, createHeaderBasedEmailResolver, getAgentByName, getCurrentAgent, getSubAgentByName, isDurableObjectCodeUpdateReset, isDurableObjectMemoryLimitReset, isDurableObjectStorageReset, isPlatformTransientError, normalizeServerId, parseSubAgentPath, routeAgentEmail, routeAgentRequest, routeSubAgentRequest, unstable_callable };
7235
+ export { AGENT_TOOL_MILESTONE_PART, AGENT_TOOL_PROGRESS_PART, Agent, DEFAULT_AGENT_STATIC_OPTIONS, DurableObjectOAuthClientProvider, MCP_SERVER_ID_MAX_LENGTH, MessageType, SUB_PREFIX, SqlError, StreamingResponse, __DO_NOT_USE_WILL_BREAK__agentContext, withInvocationScope as __DO_NOT_USE_WILL_BREAK__withInvocationScope, callable, camelCaseToKebabCase, createHeaderBasedEmailResolver, getAgentByName, getCurrentAgent, getSubAgentByName, isDurableObjectCodeUpdateReset, isDurableObjectMemoryLimitReset, isDurableObjectStorageReset, isPlatformTransientError, normalizeServerId, parseSubAgentPath, routeAgentEmail, routeAgentRequest, routeSubAgentRequest, unstable_callable };
7227
7236
 
7228
7237
  //# sourceMappingURL=index.js.map