eve 0.37.0 → 0.37.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.
Files changed (215) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/src/channel/routes.d.ts +13 -3
  3. package/dist/src/channel/routes.js +1 -1
  4. package/dist/src/channel/session-callback.js +1 -1
  5. package/dist/src/channel/session.d.ts +2 -1
  6. package/dist/src/channel/session.js +1 -1
  7. package/dist/src/channel/types.d.ts +41 -0
  8. package/dist/src/chunks/{use-eve-agent-CnppTEFk.js → use-eve-agent-Bi5fRxcZ.js} +9 -1
  9. package/dist/src/chunks/{use-eve-agent-COmP-H8R.js → use-eve-agent-DbKUBhl-.js} +9 -1
  10. package/dist/src/cli/commands/init-git.js +1 -1
  11. package/dist/src/cli/commands/init-recovery.d.ts +3 -0
  12. package/dist/src/cli/commands/init-recovery.js +3 -0
  13. package/dist/src/cli/commands/init-target.d.ts +21 -0
  14. package/dist/src/cli/commands/init-target.js +1 -0
  15. package/dist/src/cli/commands/init.js +1 -1
  16. package/dist/src/cli/dev/tui/runner.d.ts +8 -0
  17. package/dist/src/cli/dev/tui/runner.js +1 -1
  18. package/dist/src/cli/dev/tui/subagent-pump.d.ts +27 -22
  19. package/dist/src/cli/dev/tui/subagent-pump.js +1 -1
  20. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +16 -0
  21. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  22. package/dist/src/cli/dev/tui/tool-presentation.js +1 -1
  23. package/dist/src/client/open-stream.d.ts +2 -0
  24. package/dist/src/client/open-stream.js +1 -1
  25. package/dist/src/client/session.js +1 -1
  26. package/dist/src/compiled/.vendor-stamp.json +2 -1
  27. package/dist/src/compiled/@modelcontextprotocol/server/LICENSE +216 -0
  28. package/dist/src/compiled/@modelcontextprotocol/server/index.d.ts +98 -0
  29. package/dist/src/compiled/@modelcontextprotocol/server/index.js +80 -0
  30. package/dist/src/compiler/extension-compatibility.d.ts +10 -10
  31. package/dist/src/compiler/extension-compatibility.js +1 -1
  32. package/dist/src/compiler/manifest.js +1 -1
  33. package/dist/src/compiler/normalize-agent-config.js +1 -1
  34. package/dist/src/compiler/normalize-manifest.js +1 -1
  35. package/dist/src/compiler/normalize-subagent.d.ts +1 -1
  36. package/dist/src/compiler/normalize-subagent.js +1 -1
  37. package/dist/src/context/serialized-dynamic-model-selection.d.ts +2 -0
  38. package/dist/src/context/serialized-dynamic-model-selection.js +1 -0
  39. package/dist/src/execution/agent-handle-dispatch.d.ts +15 -1
  40. package/dist/src/execution/agent-handle-dispatch.js +1 -1
  41. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  42. package/dist/src/execution/delegated-parent-notification.d.ts +17 -0
  43. package/dist/src/execution/delegated-parent-notification.js +1 -1
  44. package/dist/src/execution/deliver-payloads.js +1 -1
  45. package/dist/src/execution/dispatch-runtime-actions-shared.d.ts +155 -0
  46. package/dist/src/execution/dispatch-runtime-actions-shared.js +1 -0
  47. package/dist/src/execution/dispatch-runtime-actions-step.d.ts +18 -14
  48. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  49. package/dist/src/execution/dispatch-workflow-runtime-actions-step.d.ts +7 -2
  50. package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +1 -1
  51. package/dist/src/execution/effective-output-schema.d.ts +21 -0
  52. package/dist/src/execution/effective-output-schema.js +1 -0
  53. package/dist/src/execution/eve-workflow-attributes.d.ts +2 -0
  54. package/dist/src/execution/node-step.js +1 -1
  55. package/dist/src/execution/parked-delivery-wait.d.ts +8 -12
  56. package/dist/src/execution/parked-delivery-wait.js +1 -1
  57. package/dist/src/execution/{route-proxied-deliver-step.d.ts → proxied-deliver-step.d.ts} +7 -4
  58. package/dist/src/execution/proxied-deliver-step.js +1 -0
  59. package/dist/src/execution/remote-agent-dispatch.d.ts +32 -0
  60. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  61. package/dist/src/execution/remote-agent-route-url.d.ts +2 -0
  62. package/dist/src/execution/remote-agent-route-url.js +1 -0
  63. package/dist/src/execution/route-child-delivery.d.ts +2 -1
  64. package/dist/src/execution/route-child-delivery.js +1 -1
  65. package/dist/src/execution/session-callback-step.d.ts +11 -0
  66. package/dist/src/execution/session-callback-step.js +1 -1
  67. package/dist/src/execution/session-command-wire.js +1 -1
  68. package/dist/src/execution/session-state-cursor.d.ts +25 -0
  69. package/dist/src/execution/session-state-cursor.js +1 -0
  70. package/dist/src/execution/settle-cancelled-turn-step.d.ts +2 -0
  71. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  72. package/dist/src/execution/subagent-event-proxy-step.d.ts +15 -0
  73. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  74. package/dist/src/execution/subagent-hitl-proxy.d.ts +14 -7
  75. package/dist/src/execution/subagent-hitl-proxy.js +1 -1
  76. package/dist/src/execution/subagent-start-local.d.ts +29 -0
  77. package/dist/src/execution/subagent-start-local.js +1 -0
  78. package/dist/src/execution/subagent-start-remote.d.ts +23 -0
  79. package/dist/src/execution/subagent-start-remote.js +1 -0
  80. package/dist/src/execution/task-event-callback.d.ts +13 -0
  81. package/dist/src/execution/task-event-callback.js +1 -0
  82. package/dist/src/execution/task-input-capability.d.ts +4 -0
  83. package/dist/src/execution/task-input-capability.js +1 -0
  84. package/dist/src/execution/tasks/child/steps.d.ts +46 -0
  85. package/dist/src/execution/tasks/child/steps.js +1 -0
  86. package/dist/src/execution/tasks/child/workflow.d.ts +31 -0
  87. package/dist/src/execution/tasks/child/workflow.js +1 -0
  88. package/dist/src/execution/tasks/parent/agent-identity.d.ts +13 -0
  89. package/dist/src/execution/tasks/parent/agent-identity.js +1 -0
  90. package/dist/src/execution/tasks/parent/agent-views.d.ts +6 -0
  91. package/dist/src/execution/tasks/parent/agent-views.js +1 -0
  92. package/dist/src/execution/tasks/parent/continuation-dispatch.d.ts +37 -0
  93. package/dist/src/execution/tasks/parent/continuation-dispatch.js +1 -0
  94. package/dist/src/execution/tasks/parent/control-shared.d.ts +36 -0
  95. package/dist/src/execution/tasks/parent/control-shared.js +1 -0
  96. package/dist/src/execution/tasks/parent/delegate.d.ts +70 -0
  97. package/dist/src/execution/tasks/parent/delegate.js +1 -0
  98. package/dist/src/execution/tasks/parent/dispatch-task-step.d.ts +19 -0
  99. package/dist/src/execution/tasks/parent/dispatch-task-step.js +1 -0
  100. package/dist/src/execution/tasks/parent/dispatch.d.ts +33 -0
  101. package/dist/src/execution/tasks/parent/dispatch.js +1 -0
  102. package/dist/src/execution/tasks/parent/hitl-proxy-steps.d.ts +29 -0
  103. package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -0
  104. package/dist/src/execution/tasks/parent/run-parent.d.ts +72 -0
  105. package/dist/src/execution/tasks/parent/run-parent.js +1 -0
  106. package/dist/src/execution/tasks/parent/send.d.ts +25 -0
  107. package/dist/src/execution/tasks/parent/send.js +1 -0
  108. package/dist/src/execution/tasks/workflow-target.d.ts +2 -0
  109. package/dist/src/execution/tasks/workflow-target.js +1 -0
  110. package/dist/src/execution/terminate-child-sessions-step.d.ts +1 -0
  111. package/dist/src/execution/terminate-child-sessions-step.js +1 -1
  112. package/dist/src/execution/turn-control-receiver.d.ts +10 -0
  113. package/dist/src/execution/turn-control-receiver.js +1 -1
  114. package/dist/src/execution/turn-dispatch.d.ts +2 -0
  115. package/dist/src/execution/turn-dispatch.js +1 -1
  116. package/dist/src/execution/turn-execution-cursor.d.ts +2 -8
  117. package/dist/src/execution/turn-execution-cursor.js +1 -1
  118. package/dist/src/execution/turn-workflow.js +1 -1
  119. package/dist/src/execution/workflow-callback-url.d.ts +5 -0
  120. package/dist/src/execution/workflow-callback-url.js +1 -1
  121. package/dist/src/execution/workflow-entry.js +1 -1
  122. package/dist/src/execution/workflow-runtime.d.ts +9 -0
  123. package/dist/src/execution/workflow-runtime.js +1 -1
  124. package/dist/src/execution/workflow-steps.d.ts +7 -21
  125. package/dist/src/execution/workflow-steps.js +1 -1
  126. package/dist/src/harness/advertised-tools.js +1 -1
  127. package/dist/src/harness/authorization.js +1 -1
  128. package/dist/src/harness/execute-tool.d.ts +7 -0
  129. package/dist/src/harness/handles/prompt.d.ts +12 -0
  130. package/dist/src/harness/handles/prompt.js +2 -1
  131. package/dist/src/harness/handles/query.js +1 -1
  132. package/dist/src/harness/handles/store.d.ts +9 -2
  133. package/dist/src/harness/handles/store.js +1 -1
  134. package/dist/src/harness/handles/transitions.d.ts +10 -1
  135. package/dist/src/harness/handles/transitions.js +1 -1
  136. package/dist/src/harness/proxy-input-requests.d.ts +21 -4
  137. package/dist/src/harness/proxy-input-requests.js +1 -1
  138. package/dist/src/harness/runtime-actions.d.ts +2 -0
  139. package/dist/src/harness/runtime-actions.js +1 -1
  140. package/dist/src/harness/session-limit-enforcement.js +1 -1
  141. package/dist/src/harness/tool-loop.js +2 -2
  142. package/dist/src/harness/workflow-runtime-action-state.js +1 -1
  143. package/dist/src/internal/application/package.js +1 -1
  144. package/dist/src/internal/authored-definition/core.js +1 -1
  145. package/dist/src/internal/invocation/agent-invocation.d.ts +54 -0
  146. package/dist/src/internal/invocation/agent-invocation.js +1 -0
  147. package/dist/src/internal/invocation/attributes.d.ts +2 -0
  148. package/dist/src/internal/invocation/attributes.js +1 -0
  149. package/dist/src/internal/invocation/metadata.d.ts +9 -0
  150. package/dist/src/internal/invocation/metadata.js +1 -0
  151. package/dist/src/internal/invocation/workflow-execution.d.ts +32 -0
  152. package/dist/src/internal/invocation/workflow-execution.js +1 -0
  153. package/dist/src/internal/mcp/http-security.d.ts +12 -0
  154. package/dist/src/internal/mcp/http-security.js +1 -0
  155. package/dist/src/internal/mcp/protected-resource.d.ts +9 -0
  156. package/dist/src/internal/mcp/protected-resource.js +1 -0
  157. package/dist/src/internal/mcp/streamable-http-server.d.ts +51 -0
  158. package/dist/src/internal/mcp/streamable-http-server.js +1 -0
  159. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  160. package/dist/src/internal/nitro/routes/channel-route-context.d.ts +14 -0
  161. package/dist/src/internal/nitro/routes/channel-route-context.js +1 -1
  162. package/dist/src/internal/nitro/routes/runtime-stack.d.ts +2 -0
  163. package/dist/src/internal/nitro/routes/runtime-stack.js +1 -1
  164. package/dist/src/internal/vercel-agent-summary.d.ts +1 -1
  165. package/dist/src/protocol/message.d.ts +28 -0
  166. package/dist/src/protocol/message.js +2 -2
  167. package/dist/src/protocol/routes.d.ts +14 -0
  168. package/dist/src/protocol/routes.js +1 -1
  169. package/dist/src/public/channels/auth.d.ts +36 -0
  170. package/dist/src/public/channels/auth.js +1 -1
  171. package/dist/src/public/channels/eve.js +1 -1
  172. package/dist/src/public/channels/mcp.d.ts +19 -0
  173. package/dist/src/public/channels/mcp.js +1 -0
  174. package/dist/src/public/definitions/channel.d.ts +2 -2
  175. package/dist/src/public/definitions/channel.js +1 -1
  176. package/dist/src/react/use-eve-agent.js +1 -1
  177. package/dist/src/runtime/actions/types.d.ts +9 -0
  178. package/dist/src/runtime/actions/types.js +1 -1
  179. package/dist/src/runtime/agent/bootstrap.js +1 -1
  180. package/dist/src/runtime/connections/authorization-complete-page.js +70 -28
  181. package/dist/src/runtime/framework-channels/index.js +1 -1
  182. package/dist/src/runtime/framework-tools/index.js +1 -1
  183. package/dist/src/runtime/framework-tools/tasks.d.ts +95 -0
  184. package/dist/src/runtime/framework-tools/tasks.js +1 -0
  185. package/dist/src/runtime/prompt/compose.d.ts +1 -0
  186. package/dist/src/runtime/prompt/compose.js +1 -1
  187. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  188. package/dist/src/runtime/resolve-agent.js +1 -1
  189. package/dist/src/runtime/session-callback-route.js +1 -1
  190. package/dist/src/runtime/task-input-response-route.d.ts +5 -0
  191. package/dist/src/runtime/task-input-response-route.js +1 -0
  192. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  193. package/dist/src/setup/scaffold/create/project.js +1 -1
  194. package/dist/src/shared/agent-definition.d.ts +7 -0
  195. package/dist/src/svelte/index.js +1 -1
  196. package/dist/src/svelte/use-eve-agent.js +1 -1
  197. package/dist/src/tasks/json.d.ts +88 -0
  198. package/dist/src/tasks/json.js +1 -0
  199. package/dist/src/tasks/session-index.d.ts +48 -0
  200. package/dist/src/tasks/session-index.js +1 -0
  201. package/dist/src/tasks/task-id.d.ts +34 -0
  202. package/dist/src/tasks/task-id.js +1 -0
  203. package/dist/src/tasks/transitions.d.ts +23 -0
  204. package/dist/src/tasks/transitions.js +1 -0
  205. package/dist/src/tasks/types.d.ts +295 -0
  206. package/dist/src/tasks/types.js +1 -0
  207. package/dist/src/tasks/wire.d.ts +26 -0
  208. package/dist/src/tasks/wire.js +1 -0
  209. package/dist/src/vue/index.js +1 -1
  210. package/dist/src/vue/use-eve-agent.js +1 -1
  211. package/docs/channels/eve.mdx +14 -0
  212. package/docs/guides/client/streaming.mdx +1 -1
  213. package/docs/tools/human-in-the-loop.md +3 -1
  214. package/package.json +7 -1
  215. package/dist/src/execution/route-proxied-deliver-step.js +0 -1
@@ -0,0 +1,54 @@
1
+ import type { ConnectionAuthorizationChallenge } from "#public/connections/errors.js";
2
+ import type { InputRequest } from "#runtime/input/types.js";
3
+ import type { JsonValue } from "#shared/json.js";
4
+ export interface AgentInvocationAuthorizationRequest {
5
+ readonly authorization?: ConnectionAuthorizationChallenge;
6
+ readonly description: string;
7
+ readonly name: string;
8
+ readonly webhookUrl?: string;
9
+ }
10
+ interface AgentInvocationBase {
11
+ readonly invocationId: string;
12
+ readonly createdAt: string;
13
+ readonly expiresAt?: string;
14
+ }
15
+ export type AgentInvocation = (AgentInvocationBase & {
16
+ readonly status: "working";
17
+ readonly pollAfterMs: number;
18
+ readonly result?: JsonValue;
19
+ }) | (AgentInvocationBase & {
20
+ readonly status: "input_required";
21
+ readonly inputRequests: Readonly<Record<string, InputRequest>>;
22
+ readonly result?: JsonValue;
23
+ }) | (AgentInvocationBase & {
24
+ readonly status: "authorization_required";
25
+ readonly authorizations: readonly [
26
+ AgentInvocationAuthorizationRequest,
27
+ ...AgentInvocationAuthorizationRequest[]
28
+ ];
29
+ readonly pollAfterMs: number;
30
+ readonly result?: JsonValue;
31
+ }) | (AgentInvocationBase & {
32
+ readonly status: "completed";
33
+ readonly result?: JsonValue;
34
+ }) | (AgentInvocationBase & {
35
+ readonly status: "failed";
36
+ readonly error: {
37
+ readonly code: number;
38
+ readonly message: string;
39
+ readonly data?: JsonValue;
40
+ };
41
+ }) | (AgentInvocationBase & {
42
+ readonly status: "cancelled";
43
+ });
44
+ export type AgentInvocationStatus = AgentInvocation["status"];
45
+ export type AgentInvocationMutationResult = {
46
+ readonly type: "success";
47
+ readonly invocation: AgentInvocation;
48
+ } | {
49
+ readonly type: "conflict";
50
+ readonly message: string;
51
+ } | {
52
+ readonly type: "not_found";
53
+ };
54
+ export {};
@@ -0,0 +1 @@
1
+ export{};
@@ -0,0 +1,2 @@
1
+ export declare const INVOCATION_TOKEN_ATTRIBUTE = "$eve.invocation_token";
2
+ export declare const INVOCATION_OWNER_ATTRIBUTE = "$eve.invocation_owner";
@@ -0,0 +1 @@
1
+ const INVOCATION_TOKEN_ATTRIBUTE=`$eve.invocation_token`,INVOCATION_OWNER_ATTRIBUTE=`$eve.invocation_owner`;export{INVOCATION_OWNER_ATTRIBUTE,INVOCATION_TOKEN_ATTRIBUTE};
@@ -0,0 +1,9 @@
1
+ import type { RunInput, SessionAuthContext } from "#channel/types.js";
2
+ import { INVOCATION_OWNER_ATTRIBUTE, INVOCATION_TOKEN_ATTRIBUTE } from "#internal/invocation/attributes.js";
3
+ export { INVOCATION_OWNER_ATTRIBUTE, INVOCATION_TOKEN_ATTRIBUTE };
4
+ export type ExternalInvocationMetadata = NonNullable<RunInput["externalInvocation"]>;
5
+ /** Batch-scoped request id exposed to MCP clients for one durable pending-input event. */
6
+ export declare function invocationInputRequestId(pendingBatchId: string, requestId: string): string;
7
+ /** Fixed-width fingerprint used to bind an invocation to its initiating principal. */
8
+ export declare function invocationOwnerKey(auth: SessionAuthContext | null): string;
9
+ export declare function buildInvocationAttributes(metadata: ExternalInvocationMetadata): Readonly<Record<string, string>>;
@@ -0,0 +1 @@
1
+ import{createHash}from"node:crypto";import{INVOCATION_OWNER_ATTRIBUTE,INVOCATION_TOKEN_ATTRIBUTE}from"#internal/invocation/attributes.js";function invocationInputRequestId(t,n){return createHash(`sha256`).update(JSON.stringify([t,n]),`utf8`).digest(`hex`)}function invocationOwnerKey(t){let n=t===null?[`anonymous`]:[t.authenticator,t.issuer??``,t.principalType,t.principalId,t.subject??``];return createHash(`sha256`).update(JSON.stringify(n),`utf8`).digest(`hex`)}function buildInvocationAttributes(e){return{[INVOCATION_OWNER_ATTRIBUTE]:e.ownerKey,[INVOCATION_TOKEN_ATTRIBUTE]:e.continuationToken}}export{INVOCATION_OWNER_ATTRIBUTE,INVOCATION_TOKEN_ATTRIBUTE,buildInvocationAttributes,invocationInputRequestId,invocationOwnerKey};
@@ -0,0 +1,32 @@
1
+ import type { UserContent } from "ai";
2
+ import type { SessionAuthContext } from "#channel/types.js";
3
+ import { type ChannelFrom } from "#channel/channel-operations.js";
4
+ import type { AgentInvocation, AgentInvocationMutationResult } from "#internal/invocation/agent-invocation.js";
5
+ import type { RouteSessionCreator } from "#internal/nitro/routes/channel-route-context.js";
6
+ import type { InputResponse } from "#runtime/input/types.js";
7
+ import type { JsonObject } from "#shared/json.js";
8
+ export declare class WorkflowAgentInvocationExecution {
9
+ #private;
10
+ constructor(input: {
11
+ readonly createSession: RouteSessionCreator;
12
+ readonly from: ChannelFrom;
13
+ });
14
+ create(input: {
15
+ readonly auth: SessionAuthContext | null;
16
+ readonly message: string | UserContent;
17
+ readonly outputSchema?: JsonObject;
18
+ }): Promise<AgentInvocation>;
19
+ read(input: {
20
+ readonly auth: SessionAuthContext | null;
21
+ readonly invocationId: string;
22
+ }): Promise<AgentInvocation | undefined>;
23
+ update(input: {
24
+ readonly auth: SessionAuthContext | null;
25
+ readonly invocationId: string;
26
+ readonly responses: readonly InputResponse[];
27
+ }): Promise<AgentInvocationMutationResult>;
28
+ cancel(input: {
29
+ readonly auth: SessionAuthContext | null;
30
+ readonly invocationId: string;
31
+ }): Promise<AgentInvocation | undefined>;
32
+ }
@@ -0,0 +1 @@
1
+ import{INTERNAL_CHANNEL_DELIVER}from"#channel/channel-operations.js";import{parseJsonValue}from"#shared/json.js";import{RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{getRun,getWorld}from"#internal/workflow/runtime.js";import{parseNdjsonStream}from"#execution/ndjson-stream.js";import{INVOCATION_OWNER_ATTRIBUTE,INVOCATION_TOKEN_ATTRIBUTE,invocationInputRequestId,invocationOwnerKey}from"#internal/invocation/metadata.js";var WorkflowAgentInvocationExecution=class{#e;#t;constructor(e){this.#e=e.createSession,this.#t=e.from}async create(e){let t=`invocation:${crypto.randomUUID()}`,n=await this.#e({auth:e.auth,capabilities:{requestInput:!0},continuationToken:t,externalInvocation:{continuationToken:t,ownerKey:invocationOwnerKey(e.auth)},input:{message:e.message,outputSchema:e.outputSchema},mode:`task`}),r=await this.#n(n.sessionId,e.auth);if(r===void 0)throw Error(`Invocation run was unavailable after durable creation.`);return workingInvocation(n.sessionId,r.createdAt.toISOString(),r.expiredAt?.toISOString())}async read(e){let t=await this.#n(e.invocationId,e.auth);if(t===void 0)return;if(isTerminalRunStatus(t.status))return await terminalInvocation(t);let n=await readRecentPersistedEvents(e.invocationId);return projectNonterminal(t.runId,t.createdAt.toISOString(),t.expiredAt?.toISOString(),n)}async update(t){let r=await this.read(t);if(r===void 0)return{type:`not_found`};if(r.status!==`input_required`)return conflict(`Invocation is not waiting for input.`);let i=await this.#n(t.invocationId,t.auth);if(i===void 0)return{type:`not_found`};let a=latestPendingInputBatch(await readRecentPersistedEvents(t.invocationId));if(a===void 0)return conflict(`Invocation input changed before the update could be applied.`);let o=new Set,s=[];for(let e of t.responses){let t=a.rawRequestIds[e.requestId];if(t===void 0)return conflict(`Unknown input request: ${e.requestId}`);o.add(e.requestId),s.push({...e,requestId:t})}if(o.size!==t.responses.length||o.size!==Object.keys(a.requests).length)return conflict(`Responses must answer the complete pending input batch exactly once.`);let l=i.attributes[INVOCATION_TOKEN_ATTRIBUTE];if(l===void 0)return{type:`not_found`};try{await this.#t(l)[INTERNAL_CHANNEL_DELIVER]({inputResponses:s},{auth:t.auth})}catch(e){if(RunExpiredError.is(e))return{type:`not_found`};throw e}return{invocation:workingInvocation(t.invocationId,r.createdAt,r.expiresAt),type:`success`}}async cancel(e){let t=await this.read(e);if(t===void 0||isTerminal(t.status))return t;try{await getRun(e.invocationId).cancel()}catch(e){if(WorkflowRunNotFoundError.is(e)||RunExpiredError.is(e))return;throw e}return await this.read(e)}async#n(e,t){let i=await getWorld();try{let n=await i.runs.get(e);return n.attributes[INVOCATION_TOKEN_ATTRIBUTE]===void 0?void 0:n.attributes[INVOCATION_OWNER_ATTRIBUTE]===invocationOwnerKey(t)?n:void 0}catch(e){if(WorkflowRunNotFoundError.is(e)||RunExpiredError.is(e))return;throw e}}};async function readRecentPersistedEvents(e){let t=getRun(e).getReadable({startIndex:-64}),n=await t.getTailIndex();if(n<0)return await t.cancel(`invocation event stream is empty`).catch(()=>{}),[];let r=Math.min(n+1,64),a=parseNdjsonStream(()=>t).getReader(),s=[];try{for(;s.length<r;){let{done:e,value:t}=await a.read();if(e)break;s.push(t)}}finally{await a.cancel(`invocation event window read complete`).catch(()=>{}),a.releaseLock()}return s}function pendingInputBatch(e){let t={},n={};for(let r of e.data.requests){let i=invocationInputRequestId(e.meta.id,r.requestId);t[i]=r.requestId,n[i]={...r,requestId:i}}return{id:e.meta.id,rawRequestIds:t,requests:n}}function latestPendingInputBatch(e){let t;for(let n of e)n.type===`input.requested`?t=pendingInputBatch(n):n.type===`turn.started`&&(t=void 0);return t}function projectNonterminal(e,t,n,r){let i=new Map,a,o;for(let e of r)if(e.type===`input.requested`)a=pendingInputBatch(e);else if(e.type===`turn.started`)i.clear(),a=void 0,o=void 0;else if(e.type===`authorization.required`){let t={description:e.data.description,name:e.data.name};e.data.authorization!==void 0&&(t.authorization=e.data.authorization),e.data.webhookUrl!==void 0&&(t.webhookUrl=e.data.webhookUrl),i.set(e.data.name,t)}else e.type===`authorization.completed`?i.delete(e.data.name):e.type===`message.completed`&&e.data.finishReason!==`tool-calls`&&e.data.message!==null&&(o=safeJson(e.data.message));let s=[...i.values()],c={createdAt:t,expiresAt:n,invocationId:e,result:o};return s.length>0?{...c,authorizations:s,pollAfterMs:1e3,status:`authorization_required`}:a===void 0?{...c,pollAfterMs:1e3,status:`working`}:{...c,inputRequests:a.requests,status:`input_required`}}async function terminalInvocation(e){let t={createdAt:e.createdAt.toISOString(),expiresAt:e.expiredAt?.toISOString(),invocationId:e.runId};if(e.status===`cancelled`)return{...t,status:`cancelled`};if(e.status===`failed`)return{...t,error:{code:-32603,data:safeJson(e.error),message:errorMessage(e.error)},status:`failed`};let n=await getRun(e.runId).returnValue;return{...t,result:safeJson(n.output),status:`completed`}}function workingInvocation(e,t,n){return{createdAt:t,expiresAt:n,invocationId:e,pollAfterMs:1e3,status:`working`}}function safeJson(e){try{return parseJsonValue(e)}catch{return String(e)}}function errorMessage(e){return e instanceof Error?e.message:`Session failed.`}function conflict(e){return{message:e,type:`conflict`}}function isTerminal(e){return e===`completed`||e===`failed`||e===`cancelled`}function isTerminalRunStatus(e){return e===`completed`||e===`failed`||e===`cancelled`}export{WorkflowAgentInvocationExecution};
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Applies the fetch-native HTTP guards required in front of the MCP SDK.
3
+ *
4
+ * Non-browser clients normally omit `Origin`; browser requests are restricted
5
+ * to the endpoint's exact origin. Plain HTTP is accepted only on loopback.
6
+ */
7
+ export declare function validateMcpHttpRequest(request: Request): Response | undefined;
8
+ /**
9
+ * Applies transport and Host validation to the public OAuth discovery route
10
+ * without restricting its Origin. The route itself supplies permissive CORS.
11
+ */
12
+ export declare function validateMcpMetadataRequest(request: Request): Response | undefined;
@@ -0,0 +1 @@
1
+ import{isLoopbackHostname}from"#shared/network-address.js";function validateMcpHttpRequest(e){let t=validateMcpHttpRequestBase(e);if(t!==void 0)return t;let n=new URL(e.url),r=e.headers.get(`origin`);if(r===null||r.length===0)return;let i;try{i=new URL(r)}catch{return securityError(`Invalid Origin header.`)}if(i.origin!==n.origin)return securityError(`Invalid Origin: ${i.origin}`)}function validateMcpMetadataRequest(e){return validateMcpHttpRequestBase(e)}function validateMcpHttpRequestBase(t){let n;try{n=new URL(t.url)}catch{return securityError(`Invalid MCP request URL.`,400)}if(n.protocol!==`https:`&&!(n.protocol===`http:`&&isLoopbackHostname(n.hostname)))return securityError(`MCP endpoints require HTTPS except on loopback.`);let r=validateHostHeader(t,n);if(r!==void 0)return r}function validateHostHeader(e,t){let n=e.headers.get(`host`);if(n===null||n.length===0)return securityError(`Missing Host header`);let r;try{r=new URL(`${t.protocol}//${n}`)}catch{return securityError(`Invalid Host header`)}if(r.username!==``||r.password!==``||r.pathname!==`/`||r.search!==``||r.hash!==``||r.host!==t.host)return securityError(`Invalid Host header: ${n}`)}function securityError(e,t=403){return Response.json({error:{code:-32e3,message:e},id:null,jsonrpc:`2.0`},{headers:{"content-type":`application/json`},status:t})}export{validateMcpHttpRequest,validateMcpMetadataRequest};
@@ -0,0 +1,9 @@
1
+ export interface McpProtectedResourceMetadataOptions {
2
+ readonly authorizationServers: readonly string[];
3
+ readonly resource: string;
4
+ readonly scopesSupported?: readonly string[];
5
+ }
6
+ /** Creates RFC 9728 protected-resource metadata for an MCP endpoint. */
7
+ export declare function createMcpProtectedResourceMetadata(options: McpProtectedResourceMetadataOptions): Readonly<Record<string, unknown>>;
8
+ /** Creates the RFC 9728 bearer discovery challenge for an MCP resource. */
9
+ export declare function createMcpResourceChallenge(resourceMetadataUrl: string, scopes?: readonly string[]): string;
@@ -0,0 +1 @@
1
+ import{escapeAuthChallengeParameter}from"#public/channels/auth.js";function createMcpProtectedResourceMetadata(e){let t={authorization_servers:e.authorizationServers,resource:e.resource};return e.scopesSupported!==void 0&&(t.scopes_supported=e.scopesSupported),t}function createMcpResourceChallenge(t,n){let r=[`resource_metadata="${escapeAuthChallengeParameter(t)}"`];return n?.length&&r.push(`scope="${escapeAuthChallengeParameter(n.join(` `))}"`),`Bearer ${r.join(`, `)}`}export{createMcpProtectedResourceMetadata,createMcpResourceChallenge};
@@ -0,0 +1,51 @@
1
+ import { McpServer, type McpToolAnnotations, type StandardSchemaWithJSON } from "#compiled/@modelcontextprotocol/server/index.js";
2
+ import type { SessionAuthContext } from "#channel/types.js";
3
+ export declare const MCP_PROTOCOL_VERSION = "2026-07-28";
4
+ export declare const MCP_LEGACY_PROTOCOL_VERSION = "2025-11-25";
5
+ export interface McpToolDefinition<TInputSchema extends StandardSchemaWithJSON = StandardSchemaWithJSON> {
6
+ readonly name: string;
7
+ readonly description?: string;
8
+ readonly annotations?: McpToolAnnotations;
9
+ readonly inputSchema: TInputSchema;
10
+ readonly outputSchema?: StandardSchemaWithJSON;
11
+ }
12
+ export interface McpCallToolResult<TStructured extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>> {
13
+ readonly content: readonly McpContent[];
14
+ readonly isError?: boolean;
15
+ readonly structuredContent?: TStructured;
16
+ }
17
+ export type McpContent = {
18
+ readonly type: "text";
19
+ readonly text: string;
20
+ } | {
21
+ readonly type: "resource_link";
22
+ readonly name: string;
23
+ readonly uri: string;
24
+ };
25
+ export interface McpServerTool {
26
+ readonly name: string;
27
+ register(server: McpServer, auth: SessionAuthContext | null): void;
28
+ }
29
+ type InferSchemaOutput<TSchema> = TSchema extends StandardSchemaWithJSON<unknown, infer TOutput> ? TOutput : never;
30
+ /** Keeps a schema and its inferred handler input coupled while erasing heterogeneous storage. */
31
+ export declare function defineMcpTool<const TInputSchema extends StandardSchemaWithJSON<unknown, unknown>, TStructured extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>>(input: {
32
+ readonly definition: McpToolDefinition<TInputSchema>;
33
+ call(value: InferSchemaOutput<TInputSchema>, context: {
34
+ readonly auth: SessionAuthContext | null;
35
+ readonly signal: AbortSignal;
36
+ }): Promise<McpCallToolResult<TStructured>>;
37
+ }): McpServerTool;
38
+ export interface McpStreamableHttpServerOptions {
39
+ readonly name: string;
40
+ readonly version: string;
41
+ readonly tools: readonly McpServerTool[];
42
+ authenticate(request: Request): Promise<SessionAuthContext | null | Response>;
43
+ }
44
+ /**
45
+ * Creates a dual-era, stateless MCP HTTP request handler.
46
+ *
47
+ * Current clients use MCP 2026-07-28's per-request envelope. Older clients
48
+ * fall back to the SDK's stateless 2025 Streamable HTTP implementation.
49
+ */
50
+ export declare function createMcpStreamableHttpServer(options: McpStreamableHttpServerOptions): (request: Request) => Promise<Response>;
51
+ export {};
@@ -0,0 +1 @@
1
+ import{McpServer,createMcpHandler}from"#compiled/@modelcontextprotocol/server/index.js";const MCP_PROTOCOL_VERSION=`2026-07-28`,MCP_LEGACY_PROTOCOL_VERSION=`2025-11-25`;function defineMcpTool(e){return{name:e.definition.name,register(t,n){t.registerTool(e.definition.name,{...e.definition.annotations===void 0?{}:{annotations:e.definition.annotations},...e.definition.description===void 0?{}:{description:e.definition.description},inputSchema:e.definition.inputSchema,...e.definition.outputSchema===void 0?{}:{outputSchema:e.definition.outputSchema}},async(t,r)=>await callTool(e.call,t,r.mcpReq.signal,n))}}}function createMcpStreamableHttpServer(e){let n=new Map(e.tools.map(e=>[e.name,e]));if(n.size!==e.tools.length)throw Error(`MCP tool names must be unique.`);return async r=>{let i=await e.authenticate(r);if(i instanceof Response)return i;let a=await preflightModernRequest(r);return a.response===void 0?await createMcpHandler(()=>createServer(e,n,i),{legacy:`stateless`}).fetch(r,a.parsedBody===void 0?void 0:{parsedBody:a.parsedBody}):a.response}}async function preflightModernRequest(e){if(e.method.toUpperCase()!==`POST`||e.headers.has(`mcp-protocol-version`))return{};let t=await inspectRequestBody(e);if(t.tooLarge)return{response:requestBodyTooLargeResponse()};if(t.invalidJson)return{response:invalidJsonResponse()};let n=t.value;if(n===void 0)return{};if(!claimsCurrentProtocolVersion(n))return{parsedBody:n};let r=await probeEarlierValidationFailure(e,n);return r===void 0?{parsedBody:n,response:headerMismatchResponse(n)}:{parsedBody:n,response:r}}async function inspectRequestBody(e){let t=e.body;if(t===null)return{tooLarge:!1};let n=t.getReader(),r=[],i=0;try{for(;;){let e=await n.read();if(e.done)break;if(i+=e.value.byteLength,i>4194304)return await n.cancel(),{tooLarge:!0};r.push(e.value)}let e=new Uint8Array(i),t=0;for(let n of r)e.set(n,t),t+=n.byteLength;return{tooLarge:!1,value:JSON.parse(new TextDecoder().decode(e))}}catch{return{invalidJson:!0,tooLarge:!1}}}function invalidJsonResponse(){return Response.json({error:{code:-32700,message:`Parse error`},id:null,jsonrpc:`2.0`},{status:400})}function requestBodyTooLargeResponse(){return Response.json({error:{code:-32e3,message:`Request body too large`},id:null,jsonrpc:`2.0`},{status:413,statusText:`Request Entity Too Large`})}function claimsCurrentProtocolVersion(e){return isPlainRecord(e)&&isPlainRecord(e.params)&&isPlainRecord(e.params._meta)&&e.params._meta[`io.modelcontextprotocol/protocolVersion`]===`2026-07-28`}function isPlainRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function probeEarlierValidationFailure(r,i){let a=new Headers(r.headers);a.set(`mcp-protocol-version`,MCP_PROTOCOL_VERSION);let o=new Request(r.url,{body:JSON.stringify(i),headers:a,method:r.method}),s=createMcpHandler(()=>new McpServer({name:`eve-mcp-preflight`,version:`0`}),{legacy:`reject`});try{let e=await s.fetch(o,{parsedBody:i});if(e.status===406||e.status===415)return e;if(e.status===400){let t=await e.clone().json().catch(()=>void 0);if(t?.error?.code===-32700||t?.error?.code===-32600||t?.error?.code===-32602||t?.error?.code===-32022)return e}await e.body?.cancel();return}finally{await s.close().catch(()=>{})}}function headerMismatchResponse(e){let t=`the body carries a modern MCP envelope but the required MCP-Protocol-Version header is absent`;return Response.json({error:{code:-32020,data:{mismatch:{body:t,header:`(missing)`}},message:`Bad Request: the request headers and body disagree: ${t}`},id:readJsonRpcRequestId(e),jsonrpc:`2.0`},{status:400})}function readJsonRpcRequestId(e){if(typeof e!=`object`||!e||Array.isArray(e))return null;let t=Reflect.get(e,`id`);return typeof t==`string`||typeof t==`number`?t:null}function createServer(t,n,r){let i=new McpServer({name:t.name,version:t.version},{capabilities:{tools:{listChanged:!1}}});for(let e of n.values())e.register(i,r);return i}async function callTool(e,t,n,r){try{return await e(t,{auth:r,signal:n})}catch(e){return toolError(e instanceof Error?e.message:`Tool call failed.`)}}function toolError(e){return{content:[{type:`text`,text:e}],isError:!0}}export{MCP_LEGACY_PROTOCOL_VERSION,MCP_PROTOCOL_VERSION,createMcpStreamableHttpServer,defineMcpTool};
@@ -1 +1 @@
1
- import{createAttachSessionFn}from"#channel/session.js";import{createLogger,logError}from"#internal/logging.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{createChannelOperations}from"#channel/channel-operations.js";import{getChannelInstrumentationKind}from"#channel/compiled-channel.js";import{createCrossChannelToFn,toCrossChannelTargets}from"#channel/cross-channel-receive.js";import{DEVELOPMENT_WORKFLOW_SECRET_ENV}from"#internal/workflow/development-world-protocol.js";import{readTrustedDevelopmentClientAddress}from"#internal/nitro/dev-client-address.js";import{attachAgentInfoRouteResponse,attachRouteSessionCreator}from"#internal/nitro/routes/channel-route-context.js";import{traceChannelRequest}from"#internal/nitro/routes/channel-request-instrumentation.js";import{resolveNitroChannelRuntimeBundle}from"#internal/nitro/routes/runtime-stack.js";import{readVercelProjectLink}from"#internal/vercel/project-link.js";import{withVercelOidcProjectResolver}from"#runtime/governance/auth/vercel-oidc-project.js";const log=createLogger(`channel.dispatch`);async function dispatchChannelRequest(e,t,r){return await traceChannelRequest({request:e.req,routeKey:t},async i=>{let o=await resolveNitroChannelRuntimeBundle(r),s=o.channels.find(e=>`${e.method.toUpperCase()} ${e.urlPath}`===t);if(s===void 0)return Response.json({error:`No matching channel for this request.`,ok:!1},{status:404});i?.setAttribute(`eve.channel.name`,s.name);let c=getChannelInstrumentationKind(s.definition)??s.adapter?.kind;c!==void 0&&i?.setAttribute(`eve.channel.kind`,c);let l=buildRouteArgs(e,o,s.name,c??`channel`,r,i),u;try{u=await withDevelopmentVercelOidcContext(r,e.req,async()=>{if(s.handler)return await s.handler(e.req,l.args);let t={waitUntil:l.args.waitUntil,params:l.args.params,requestIp:l.args.requestIp};return await s.fetch(e.req,t)})}catch(r){let i=logError(log,`channel handler threw`,r,{routeKey:t,channel:s.name});return flushBackgroundTasks(e,l.backgroundTasks,t,s.name),Response.json({error:`Channel handler failed.`,errorId:i,ok:!1},{status:500})}return flushBackgroundTasks(e,l.backgroundTasks,t,s.name),u})}async function dispatchChannelWebSocketRequest(e,t,r){let i=await resolveNitroChannelRuntimeBundle(r),o=i.channels.find(e=>`${e.method.toUpperCase()} ${e.urlPath}`===t);if(o===void 0||o.websocket===void 0)return rejectWebSocketUpgrade({error:`No matching websocket channel for this request.`,ok:!1},404);let s=o.websocket,c=getChannelInstrumentationKind(o.definition)??o.adapter?.kind??`channel`,l=buildRouteArgs(e,i,o.name,c,r,void 0);try{let n=await withDevelopmentVercelOidcContext(r,e.req,async()=>await s(e.req,l.args));return flushBackgroundTasks(e,l.backgroundTasks,t,o.name),n}catch(r){let i=logError(log,`channel websocket handler threw`,r,{routeKey:t,channel:o.name});return flushBackgroundTasks(e,l.backgroundTasks,t,o.name),rejectWebSocketUpgrade({error:`Channel websocket handler failed.`,errorId:i,ok:!1},500)}}async function withDevelopmentVercelOidcContext(e,t,n){return e.kind===`development`?await withVercelOidcProjectResolver({request:t,resolveCurrentProject:async()=>{let t=await readVercelProjectLink(e.appRoot);return t===void 0?void 0:{environment:`development`,projectId:t.projectId}}},n):await n()}function buildRouteArgs(t,n,a,c,l,d){let f=readVercelRequestId(t.req.headers),p=extractRequestIp(t,l),m=[],h=t.context.params??{},g={};for(let[e,t]of Object.entries(h))g[e]=decodeURIComponent(t);let waitUntil=e=>{m.push(e)},_=n.channels.find(e=>e.name===a),v=_?.adapter??{kind:`channel`},y=d?.spanContext(),b={channelKind:c,channelName:a,requestId:f,requestTraceContext:y===void 0?void 0:{spanId:y.spanId,traceFlags:y.traceFlags,traceId:y.traceId}},x=createChannelOperations({adapter:v,channelName:a,metadata:b,runtime:n.runtime,turnPolicy:_?.turnPolicy}),S=createAttachSessionFn(n.runtime,{...b,turnPolicy:_?.turnPolicy}),C=createCrossChannelToFn(n.runtime,toCrossChannelTargets(n.channels));return{args:attachRouteSessionCreator(attachAgentInfoRouteResponse({attachSession:S,...x,params:g,requestIp:p,to:C,waitUntil},async()=>{let{handleAgentInfoRequest:e}=await import(`#internal/nitro/routes/info.js`);return await e(l)}),async e=>await n.runtime.createSession({...e,adapter:v,channelName:a,delivery:createChannelDeliveryMetadata(b),requestId:f})),backgroundTasks:m}}function readVercelRequestId(e){let t=e.get(`x-vercel-id`)?.trim();return t===``?void 0:t}function rejectWebSocketUpgrade(e,t){return{upgrade(){throw Response.json(e,{status:t})}}}function flushBackgroundTasks(e,t,r,i){t.length!==0&&e.waitUntil(Promise.allSettled(t).then(e=>{for(let t of e)t.status===`rejected`&&logError(log,`channel background task failed`,t.reason,{routeKey:r,channel:i})}))}function extractRequestIp(e,t){if(t.kind===`development`){let t=readTrustedDevelopmentClientAddress(e.req.headers,process.env[DEVELOPMENT_WORKFLOW_SECRET_ENV]);if(t!==void 0)return t}return extractSocketIp(e)}function extractSocketIp(e){let t=e.req.ip;return typeof t==`string`&&t.length>0?t:null}export{dispatchChannelRequest,dispatchChannelWebSocketRequest};
1
+ import{createAttachSessionFn}from"#channel/session.js";import{createLogger,logError}from"#internal/logging.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{createChannelOperations}from"#channel/channel-operations.js";import{getChannelInstrumentationKind}from"#channel/compiled-channel.js";import{createCrossChannelToFn,toCrossChannelTargets}from"#channel/cross-channel-receive.js";import{DEVELOPMENT_WORKFLOW_SECRET_ENV}from"#internal/workflow/development-world-protocol.js";import{readTrustedDevelopmentClientAddress}from"#internal/nitro/dev-client-address.js";import{attachAgentInfoRouteResponse,attachRemoteAgentStreamHeadersResolver,attachRouteChannelName,attachRouteSessionCreator}from"#internal/nitro/routes/channel-route-context.js";import{traceChannelRequest}from"#internal/nitro/routes/channel-request-instrumentation.js";import{resolveNitroChannelRuntimeBundle}from"#internal/nitro/routes/runtime-stack.js";import{readVercelProjectLink}from"#internal/vercel/project-link.js";import{withVercelOidcProjectResolver}from"#runtime/governance/auth/vercel-oidc-project.js";const log=createLogger(`channel.dispatch`);async function dispatchChannelRequest(e,t,r){return await traceChannelRequest({request:e.req,routeKey:t},async i=>{let o=await resolveNitroChannelRuntimeBundle(r),s=o.channels.find(e=>`${e.method.toUpperCase()} ${e.urlPath}`===t);if(s===void 0)return Response.json({error:`No matching channel for this request.`,ok:!1},{status:404});i?.setAttribute(`eve.channel.name`,s.name);let c=getChannelInstrumentationKind(s.definition)??s.adapter?.kind;c!==void 0&&i?.setAttribute(`eve.channel.kind`,c);let l=buildRouteArgs(e,o,s.name,c??`channel`,r,i),u;try{u=await withDevelopmentVercelOidcContext(r,e.req,async()=>{if(s.handler)return await s.handler(e.req,l.args);let t={waitUntil:l.args.waitUntil,params:l.args.params,requestIp:l.args.requestIp};return await s.fetch(e.req,t)})}catch(r){let i=logError(log,`channel handler threw`,r,{routeKey:t,channel:s.name});return flushBackgroundTasks(e,l.backgroundTasks,t,s.name),Response.json({error:`Channel handler failed.`,errorId:i,ok:!1},{status:500})}return flushBackgroundTasks(e,l.backgroundTasks,t,s.name),u})}async function dispatchChannelWebSocketRequest(e,t,r){let i=await resolveNitroChannelRuntimeBundle(r),o=i.channels.find(e=>`${e.method.toUpperCase()} ${e.urlPath}`===t);if(o===void 0||o.websocket===void 0)return rejectWebSocketUpgrade({error:`No matching websocket channel for this request.`,ok:!1},404);let s=o.websocket,c=getChannelInstrumentationKind(o.definition)??o.adapter?.kind??`channel`,l=buildRouteArgs(e,i,o.name,c,r,void 0);try{let n=await withDevelopmentVercelOidcContext(r,e.req,async()=>await s(e.req,l.args));return flushBackgroundTasks(e,l.backgroundTasks,t,o.name),n}catch(r){let i=logError(log,`channel websocket handler threw`,r,{routeKey:t,channel:o.name});return flushBackgroundTasks(e,l.backgroundTasks,t,o.name),rejectWebSocketUpgrade({error:`Channel websocket handler failed.`,errorId:i,ok:!1},500)}}async function withDevelopmentVercelOidcContext(e,t,n){return e.kind===`development`?await withVercelOidcProjectResolver({request:t,resolveCurrentProject:async()=>{let t=await readVercelProjectLink(e.appRoot);return t===void 0?void 0:{environment:`development`,projectId:t.projectId}}},n):await n()}function buildRouteArgs(t,n,a,c,l,d){let f=readVercelRequestId(t.req.headers),p=extractRequestIp(t,l),m=[],h=t.context.params??{},g={};for(let[e,t]of Object.entries(h))g[e]=decodeURIComponent(t);let waitUntil=e=>{m.push(e)},_=n.channels.find(e=>e.name===a),v=_?.adapter??{kind:`channel`},y=d?.spanContext(),b={channelKind:c,channelName:a,requestId:f,requestTraceContext:y===void 0?void 0:{spanId:y.spanId,traceFlags:y.traceFlags,traceId:y.traceId}},x=createChannelOperations({adapter:v,channelName:a,metadata:b,runtime:n.runtime,turnPolicy:_?.turnPolicy}),S=createAttachSessionFn(n.runtime,{...b,turnPolicy:_?.turnPolicy}),C=createCrossChannelToFn(n.runtime,toCrossChannelTargets(n.channels)),w=attachRouteSessionCreator(attachRouteChannelName(attachAgentInfoRouteResponse({attachSession:S,...x,params:g,requestIp:p,to:C,waitUntil},async()=>{let{handleAgentInfoRequest:e}=await import(`#internal/nitro/routes/info.js`);return await e(l)}),a),async e=>await n.runtime.createSession({...e,adapter:v,channelName:a,continuationToken:e.continuationToken===void 0?void 0:`${a}:${e.continuationToken}`,delivery:createChannelDeliveryMetadata(b),requestId:f}));return n.resolveRemoteAgentStreamHeaders!==void 0&&attachRemoteAgentStreamHeadersResolver(w,n.resolveRemoteAgentStreamHeaders),{args:w,backgroundTasks:m}}function readVercelRequestId(e){let t=e.get(`x-vercel-id`)?.trim();return t===``?void 0:t}function rejectWebSocketUpgrade(e,t){return{upgrade(){throw Response.json(e,{status:t})}}}function flushBackgroundTasks(e,t,r,i){t.length!==0&&e.waitUntil(Promise.allSettled(t).then(e=>{for(let t of e)t.status===`rejected`&&logError(log,`channel background task failed`,t.reason,{routeKey:r,channel:i})}))}function extractRequestIp(e,t){if(t.kind===`development`){let t=readTrustedDevelopmentClientAddress(e.req.headers,process.env[DEVELOPMENT_WORKFLOW_SECRET_ENV]);if(t!==void 0)return t}return extractSocketIp(e)}function extractSocketIp(e){let t=e.req.ip;return typeof t==`string`&&t.length>0?t:null}export{dispatchChannelRequest,dispatchChannelWebSocketRequest};
@@ -1,9 +1,23 @@
1
1
  import type { RouteHandlerArgs } from "#channel/routes.js";
2
2
  import type { RunHandle, RunInput } from "#channel/types.js";
3
3
  type AgentInfoRouteResponse = () => Promise<Response>;
4
+ /**
5
+ * Creates one session from a route handler. `continuationToken` is
6
+ * channel-local (the dispatcher prepends the channel name), so ownership
7
+ * established here is visible to `resolveSession` on the same channel.
8
+ */
4
9
  export type RouteSessionCreator = (input: Omit<RunInput, "adapter" | "channelName" | "requestId">) => Promise<RunHandle>;
10
+ export type RemoteAgentStreamHeadersResolver = (input: {
11
+ readonly name: string;
12
+ readonly resolverId?: string;
13
+ readonly url: string;
14
+ }) => Promise<Record<string, string>>;
15
+ export declare function attachRouteChannelName<TArgs extends RouteHandlerArgs>(args: TArgs, channelName: string): TArgs;
16
+ export declare function readRouteChannelName(args: RouteHandlerArgs): string | undefined;
5
17
  export declare function attachAgentInfoRouteResponse<TArgs extends RouteHandlerArgs>(args: TArgs, respond: AgentInfoRouteResponse): TArgs;
6
18
  export declare function readAgentInfoRouteResponse(args: RouteHandlerArgs): AgentInfoRouteResponse | undefined;
7
19
  export declare function attachRouteSessionCreator<TArgs extends RouteHandlerArgs>(args: TArgs, createSession: RouteSessionCreator): TArgs;
8
20
  export declare function readRouteSessionCreator(args: RouteHandlerArgs): RouteSessionCreator | undefined;
21
+ export declare function attachRemoteAgentStreamHeadersResolver<TArgs extends RouteHandlerArgs>(args: TArgs, resolve: RemoteAgentStreamHeadersResolver): TArgs;
22
+ export declare function readRemoteAgentStreamHeadersResolver(args: RouteHandlerArgs): RemoteAgentStreamHeadersResolver | undefined;
9
23
  export {};
@@ -1 +1 @@
1
- const agentInfoRouteResponseKey=`__eveAgentInfoRouteResponse`,routeSessionCreatorKey=`__eveRouteSessionCreator`;function attachAgentInfoRouteResponse(t,n){let r=t;return r[agentInfoRouteResponseKey]=n,t}function readAgentInfoRouteResponse(t){return t[agentInfoRouteResponseKey]}function attachRouteSessionCreator(e,n){let r=e;return r[routeSessionCreatorKey]=n,e}function readRouteSessionCreator(e){return e[routeSessionCreatorKey]}export{attachAgentInfoRouteResponse,attachRouteSessionCreator,readAgentInfoRouteResponse,readRouteSessionCreator};
1
+ const agentInfoRouteResponseKey=`__eveAgentInfoRouteResponse`,routeChannelNameKey=`__eveRouteChannelName`,remoteAgentStreamHeadersResolverKey=`__eveRemoteAgentStreamHeadersResolver`,routeSessionCreatorKey=`__eveRouteSessionCreator`;function attachRouteChannelName(e,n){let r=e;return r[routeChannelNameKey]=n,e}function readRouteChannelName(e){return e[routeChannelNameKey]}function attachAgentInfoRouteResponse(t,n){let r=t;return r[agentInfoRouteResponseKey]=n,t}function readAgentInfoRouteResponse(t){return t[agentInfoRouteResponseKey]}function attachRouteSessionCreator(e,t){let n=e;return n[routeSessionCreatorKey]=t,e}function readRouteSessionCreator(e){return e[routeSessionCreatorKey]}function attachRemoteAgentStreamHeadersResolver(e,t){let r=e;return r[remoteAgentStreamHeadersResolverKey]=t,e}function readRemoteAgentStreamHeadersResolver(e){return e[remoteAgentStreamHeadersResolverKey]}export{attachAgentInfoRouteResponse,attachRemoteAgentStreamHeadersResolver,attachRouteChannelName,attachRouteSessionCreator,readAgentInfoRouteResponse,readRemoteAgentStreamHeadersResolver,readRouteChannelName,readRouteSessionCreator};
@@ -1,4 +1,5 @@
1
1
  import type { Runtime } from "#channel/types.js";
2
+ import type { RemoteAgentStreamHeadersResolver } from "#internal/nitro/routes/channel-route-context.js";
2
3
  import type { ResolvedChannelDefinition } from "#runtime/types.js";
3
4
  import { type NitroArtifactsConfig } from "#internal/nitro/routes/runtime-artifacts.js";
4
5
  /**
@@ -12,6 +13,7 @@ import { type NitroArtifactsConfig } from "#internal/nitro/routes/runtime-artifa
12
13
  */
13
14
  export interface NitroChannelRuntimeBundle {
14
15
  readonly channels: readonly ResolvedChannelDefinition[];
16
+ readonly resolveRemoteAgentStreamHeaders?: RemoteAgentStreamHeadersResolver;
15
17
  readonly runtime: Runtime;
16
18
  }
17
19
  /**
@@ -1 +1 @@
1
- import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{resolveNitroCompiledArtifactsSource}from"#internal/nitro/routes/runtime-artifacts.js";async function resolveNitroChannelRuntimeBundle(e){let t=resolveNitroCompiledArtifactsSource(e),n=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:t}),r=createWorkflowRuntime({compiledArtifactsSource:t});return{channels:n.graph.root.channels,runtime:r}}export{resolveNitroChannelRuntimeBundle};
1
+ import{resolveRemoteAgentStreamHeaders}from"#execution/remote-agent-dispatch.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{resolveNitroCompiledArtifactsSource}from"#internal/nitro/routes/runtime-artifacts.js";async function resolveNitroChannelRuntimeBundle(t){let n=resolveNitroCompiledArtifactsSource(t),r=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:n}),i=createWorkflowRuntime({compiledArtifactsSource:n});return{channels:r.graph.root.channels,resolveRemoteAgentStreamHeaders:async e=>await resolveRemoteAgentStreamHeaders({bundle:r,...e}),runtime:i}}export{resolveNitroChannelRuntimeBundle};
@@ -140,7 +140,7 @@ export interface VercelEveConnectionEntry {
140
140
  }
141
141
  export interface VercelEveChannelEntry {
142
142
  readonly name: string;
143
- readonly method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "WEBSOCKET";
143
+ readonly method: "GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "WEBSOCKET";
144
144
  readonly urlPath: string;
145
145
  readonly type: VercelEveChannelType;
146
146
  /**
@@ -262,10 +262,22 @@ export interface SubagentCalledStreamEvent {
262
262
  data: {
263
263
  callId: string;
264
264
  childSessionId: string;
265
+ childStreamPath: string;
265
266
  sessionId: string;
266
267
  sequence: number;
267
268
  name: string;
268
269
  remote?: {
270
+ /**
271
+ * Key to the authored credential functions (`auth`/`headers`) for this
272
+ * remote child, resolved at stream-proxy time by
273
+ * `resolveRemoteAgentStreamHeaders`. Static subagent → the node id in
274
+ * `subagentRegistry.subagentsByNodeId`; dynamic subagent → its
275
+ * `credentialsStepId` in the step registry. The event stores this key —
276
+ * never resolved header values — because tokens expire and this event
277
+ * is persisted and streamed to clients. Absent when the remote child
278
+ * has no authored credentials.
279
+ */
280
+ resolverId?: string;
269
281
  url: string;
270
282
  };
271
283
  toolName: string;
@@ -302,6 +314,15 @@ export interface SubagentChildEventStreamEvent {
302
314
  */
303
315
  export interface SubagentCompletedStreamEvent {
304
316
  data: {
317
+ /**
318
+ * Present when the originating call completed with a background-task
319
+ * receipt while the child itself kept running. Consumers must not treat
320
+ * this as the child's terminal boundary; the child stream owns that.
321
+ */
322
+ backgroundTask?: {
323
+ taskId: string;
324
+ status: "working";
325
+ };
305
326
  callId: string;
306
327
  output: string;
307
328
  subagentName: string;
@@ -507,6 +528,8 @@ export interface CompactionCompletedStreamEvent {
507
528
  */
508
529
  export interface AuthorizationRequiredStreamEvent {
509
530
  data: {
531
+ /** Stable identity of this exact authorization attempt. */
532
+ attemptId?: string;
510
533
  authorization?: ConnectionAuthorizationChallenge;
511
534
  candidateId?: string;
512
535
  description: string;
@@ -537,6 +560,8 @@ export type ConnectionAuthorizationOutcome = AuthorizationOutcome;
537
560
  */
538
561
  export interface AuthorizationCompletedStreamEvent {
539
562
  data: {
563
+ /** Stable identity shared with the matching required event. */
564
+ attemptId?: string;
540
565
  candidateId?: string;
541
566
  /**
542
567
  * The challenge from the matching `authorization.required` event,
@@ -667,6 +692,7 @@ export declare function createActionsRequestedEvent(input: {
667
692
  * for `getToken`-only authorization sources that authorize out of band.
668
693
  */
669
694
  export declare function createAuthorizationRequiredEvent(input: {
695
+ readonly attemptId?: string;
670
696
  readonly authorization?: ConnectionAuthorizationChallenge;
671
697
  readonly candidateId?: string;
672
698
  readonly description: string;
@@ -682,6 +708,7 @@ export declare function createAuthorizationRequiredEvent(input: {
682
708
  * authorization deadline has expired.
683
709
  */
684
710
  export declare function createAuthorizationCompletedEvent(input: {
711
+ readonly attemptId?: string;
685
712
  readonly authorization?: ConnectionAuthorizationChallenge;
686
713
  readonly candidateId?: string;
687
714
  readonly name: string;
@@ -735,6 +762,7 @@ export declare function createSubagentCalledEvent(input: {
735
762
  readonly sequence: number;
736
763
  readonly name: string;
737
764
  readonly remote?: {
765
+ readonly resolverId?: string;
738
766
  readonly url: string;
739
767
  };
740
768
  readonly toolName: string;
@@ -1,2 +1,2 @@
1
- import{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";import{decodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";import{createEventId}from"#protocol/event-id.js";const EVE_SESSION_ID_HEADER=`x-eve-session-id`,EVE_STREAM_FORMAT_HEADER=`x-eve-stream-format`,EVE_STREAM_TAIL_INDEX_HEADER=`x-eve-stream-tail-index`,EVE_STREAM_VERSION_HEADER=`x-eve-stream-version`,EVE_MESSAGE_STREAM_CONTENT_TYPE=`application/x-ndjson; charset=utf-8`,EVE_MESSAGE_STREAM_FORMAT=`ndjson`,EVE_MESSAGE_STREAM_VERSION=`22`,textEncoder=new TextEncoder;function isCurrentTurnBoundaryEvent(e){return e.type===`session.completed`||e.type===`session.failed`||e.type===`session.waiting`}function isTurnFailureEvent(e){return e.type===`session.failed`||e.type===`step.failed`||e.type===`turn.failed`}function createSessionStartedEvent(e){let t={};return e?.invocation!==void 0&&(t.invocation=e.invocation),e?.runtime!==void 0&&(t.runtime=e.runtime),e?.trace!==void 0&&(t.trace=e.trace),{data:t,type:`session.started`}}function createTurnStartedEvent(e){let t={sequence:e.sequence,turnId:e.turnId};return e.trace!==void 0&&(t.trace=e.trace),{data:t,type:`turn.started`}}function createMessageReceivedEvent(e){return{data:{message:summarizeUserContent(e.message),parts:projectUserContentParts(e.message),sequence:e.sequence,turnId:e.turnId},type:`message.received`}}function summarizeUserContent(e){if(typeof e==`string`)return e;let t=[];for(let n of e)if(n.type===`text`)t.push(n.text);else if(n.type===`file`){let e=n.filename??n.mediaType;t.push(`[file: ${e} (${n.mediaType})]`)}else n.type===`image`&&t.push(`[image: ${n.mediaType??`image`}]`);return t.join(`
2
- `)}function projectUserContentParts(e){if(typeof e==`string`)return[{text:e,type:`text`}];let t=[];for(let n of e)n.type===`text`?t.push({text:n.text,type:`text`}):n.type===`file`?t.push(projectFileLikePart(n.data,n.mediaType,n.filename)):n.type===`image`&&t.push(projectFileLikePart(n.image,n.mediaType??`application/octet-stream`,void 0));return t}function projectFileLikePart(e,t,n){if(isSandboxRefUrl(e)){let t=decodeSandboxRef(e);return createProjectedFilePart({filename:basenameOf(n??t.path),mediaType:t.mediaType,size:t.size})}let r=projectTaggedFileData(e,t,n);if(r!==void 0)return r;let i=byteLengthOf(e);return createProjectedFilePart(i===void 0?{filename:n,mediaType:t,...clientUrlFragment(e)}:{filename:n,mediaType:t,size:i})}function projectTaggedFileData(e,t,n){if(isTaggedFileData(e))switch(e.type){case`data`:{let r=byteLengthOf(e.data);return createProjectedFilePart(r===void 0?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:r})}case`reference`:case`text`:return createProjectedFilePart({filename:n,mediaType:t});case`url`:return createProjectedFilePart({filename:n,mediaType:t,...clientUrlFragment(e.url)})}}function createProjectedFilePart(e){let t={mediaType:e.mediaType,type:`file`};return e.filename!==void 0&&(t.filename=e.filename),e.size!==void 0&&(t.size=e.size),e.url!==void 0&&(t.url=e.url),t}function isTaggedFileData(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`data`||t===`reference`||t===`text`||t===`url`}function byteLengthOf(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return e.byteLength}function clientUrlFragment(r){if(isSerializedUrlFilePart(r))try{let t=deserializeUrlFilePart(r);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}if(r instanceof URL)return isClientResolvableUrl(r)?{url:r.href}:{};if(typeof r!=`string`||hasInternalRefScheme(r))return{};if(r.startsWith(`data:`))return{url:r};try{let e=new URL(r);return isClientResolvableUrl(e)?{url:e.href}:{}}catch{return{}}}function isClientResolvableUrl(e){return e.protocol===`http:`||e.protocol===`https:`||e.protocol===`data:`}function basenameOf(e){let t=e.replaceAll(`\\`,`/`),n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:e}function createActionsRequestedEvent(e){return{data:{actions:e.actions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.reason!==void 0&&(t.reason=e.reason),{data:t,type:`authorization.completed`}}function createApprovalCandidateEvent(e){return{data:e,type:`approval.candidate`}}function createApprovalSettledEvent(e){return{data:e,type:`approval.settled`}}function createInputRequestedEvent(e){return{data:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.requested`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,result:e.result,sequence:e.sequence,status:t.status,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.result`}}function createActionPartialEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.partial`}}function createSubagentCalledEvent(e){return{data:{callId:e.callId,childSessionId:e.childSessionId,sessionId:e.sessionId,sequence:e.sequence,name:e.name,remote:e.remote,toolName:e.toolName,turnId:e.turnId,workflowId:e.workflowId},type:`subagent.called`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,messageSoFar:e.messageSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,reasoningSoFar:e.reasoningSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),e.providerMetadata!==void 0&&(t.providerMetadata=e.providerMetadata),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,turnId:e.turnId},type:`turn.failed`}}function createTurnCancelledEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.cancelled`}}function createContextClearedEvent(e){return{data:{sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`context.cleared`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(e=``){return{data:{continuationToken:toChannelLocalContinuationToken(e),wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId},type:`session.failed`}}function createSessionCompletedEvent(){return{type:`session.completed`}}function stampMessageStreamEvent(e){return{...e,meta:{at:new Date().toISOString(),id:createEventId()}}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){if(e.isError===!0)return{error:buildActionResultError(e),status:`failed`};let t=readActionResultOutputError(e.output);return t===void 0?{status:`completed`}:{error:t,status:`failed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output);return t===void 0?{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(!(n===void 0||r===void 0))return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER,createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createSubagentCalledEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,stampMessageStreamEvent};
1
+ import{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{createEveSessionStreamRoutePath,createEveSubagentStreamRoutePath}from"#protocol/routes.js";import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";import{decodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";import{createEventId}from"#protocol/event-id.js";const EVE_SESSION_ID_HEADER=`x-eve-session-id`,EVE_STREAM_FORMAT_HEADER=`x-eve-stream-format`,EVE_STREAM_TAIL_INDEX_HEADER=`x-eve-stream-tail-index`,EVE_STREAM_VERSION_HEADER=`x-eve-stream-version`,EVE_MESSAGE_STREAM_CONTENT_TYPE=`application/x-ndjson; charset=utf-8`,EVE_MESSAGE_STREAM_FORMAT=`ndjson`,EVE_MESSAGE_STREAM_VERSION=`22`,textEncoder=new TextEncoder;function isCurrentTurnBoundaryEvent(e){return e.type===`session.completed`||e.type===`session.failed`||e.type===`session.waiting`}function isTurnFailureEvent(e){return e.type===`session.failed`||e.type===`step.failed`||e.type===`turn.failed`}function createSessionStartedEvent(e){let t={};return e?.invocation!==void 0&&(t.invocation=e.invocation),e?.runtime!==void 0&&(t.runtime=e.runtime),e?.trace!==void 0&&(t.trace=e.trace),{data:t,type:`session.started`}}function createTurnStartedEvent(e){let t={sequence:e.sequence,turnId:e.turnId};return e.trace!==void 0&&(t.trace=e.trace),{data:t,type:`turn.started`}}function createMessageReceivedEvent(e){return{data:{message:summarizeUserContent(e.message),parts:projectUserContentParts(e.message),sequence:e.sequence,turnId:e.turnId},type:`message.received`}}function summarizeUserContent(e){if(typeof e==`string`)return e;let t=[];for(let n of e)if(n.type===`text`)t.push(n.text);else if(n.type===`file`){let e=n.filename??n.mediaType;t.push(`[file: ${e} (${n.mediaType})]`)}else n.type===`image`&&t.push(`[image: ${n.mediaType??`image`}]`);return t.join(`
2
+ `)}function projectUserContentParts(e){if(typeof e==`string`)return[{text:e,type:`text`}];let t=[];for(let n of e)n.type===`text`?t.push({text:n.text,type:`text`}):n.type===`file`?t.push(projectFileLikePart(n.data,n.mediaType,n.filename)):n.type===`image`&&t.push(projectFileLikePart(n.image,n.mediaType??`application/octet-stream`,void 0));return t}function projectFileLikePart(e,t,n){if(isSandboxRefUrl(e)){let t=decodeSandboxRef(e);return createProjectedFilePart({filename:basenameOf(n??t.path),mediaType:t.mediaType,size:t.size})}let r=projectTaggedFileData(e,t,n);if(r!==void 0)return r;let i=byteLengthOf(e);return createProjectedFilePart(i===void 0?{filename:n,mediaType:t,...clientUrlFragment(e)}:{filename:n,mediaType:t,size:i})}function projectTaggedFileData(e,t,n){if(isTaggedFileData(e))switch(e.type){case`data`:{let r=byteLengthOf(e.data);return createProjectedFilePart(r===void 0?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:r})}case`reference`:case`text`:return createProjectedFilePart({filename:n,mediaType:t});case`url`:return createProjectedFilePart({filename:n,mediaType:t,...clientUrlFragment(e.url)})}}function createProjectedFilePart(e){let t={mediaType:e.mediaType,type:`file`};return e.filename!==void 0&&(t.filename=e.filename),e.size!==void 0&&(t.size=e.size),e.url!==void 0&&(t.url=e.url),t}function isTaggedFileData(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`data`||t===`reference`||t===`text`||t===`url`}function byteLengthOf(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return e.byteLength}function clientUrlFragment(r){if(isSerializedUrlFilePart(r))try{let t=deserializeUrlFilePart(r);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}if(r instanceof URL)return isClientResolvableUrl(r)?{url:r.href}:{};if(typeof r!=`string`||hasInternalRefScheme(r))return{};if(r.startsWith(`data:`))return{url:r};try{let e=new URL(r);return isClientResolvableUrl(e)?{url:e.href}:{}}catch{return{}}}function isClientResolvableUrl(e){return e.protocol===`http:`||e.protocol===`https:`||e.protocol===`data:`}function basenameOf(e){let t=e.replaceAll(`\\`,`/`),n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:e}function createActionsRequestedEvent(e){return{data:{actions:e.actions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.reason!==void 0&&(t.reason=e.reason),{data:t,type:`authorization.completed`}}function createApprovalCandidateEvent(e){return{data:e,type:`approval.candidate`}}function createApprovalSettledEvent(e){return{data:e,type:`approval.settled`}}function createInputRequestedEvent(e){return{data:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.requested`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,result:e.result,sequence:e.sequence,status:t.status,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.result`}}function createActionPartialEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.partial`}}function createSubagentCalledEvent(e){return{data:{callId:e.callId,childSessionId:e.childSessionId,childStreamPath:e.remote===void 0?createEveSessionStreamRoutePath(e.childSessionId):createEveSubagentStreamRoutePath({callId:e.callId,childSessionId:e.childSessionId,parentSessionId:e.sessionId}),sessionId:e.sessionId,sequence:e.sequence,name:e.name,remote:e.remote,toolName:e.toolName,turnId:e.turnId,workflowId:e.workflowId},type:`subagent.called`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,messageSoFar:e.messageSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,reasoningSoFar:e.reasoningSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),e.providerMetadata!==void 0&&(t.providerMetadata=e.providerMetadata),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,turnId:e.turnId},type:`turn.failed`}}function createTurnCancelledEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.cancelled`}}function createContextClearedEvent(e){return{data:{sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`context.cleared`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(e=``){return{data:{continuationToken:toChannelLocalContinuationToken(e),wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId},type:`session.failed`}}function createSessionCompletedEvent(){return{type:`session.completed`}}function stampMessageStreamEvent(e){return{...e,meta:{at:new Date().toISOString(),id:createEventId()}}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){if(e.isError===!0)return{error:buildActionResultError(e),status:`failed`};let t=readActionResultOutputError(e.output);return t===void 0?{status:`completed`}:{error:t,status:`failed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output);return t===void 0?{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(!(n===void 0||r===void 0))return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER,createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createSubagentCalledEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,stampMessageStreamEvent};
@@ -27,6 +27,10 @@ export declare const EVE_SESSION_CLEAR_ROUTE_PATTERN = "/eve/v1/session/:session
27
27
  export declare const EVE_SESSION_RESET_ROUTE_PATTERN = "/eve/v1/session/:sessionId/reset";
28
28
  /** Stable event-stream route pattern for one exact session ID. */
29
29
  export declare const EVE_SESSION_STREAM_ROUTE_PATTERN = "/eve/v1/session/:sessionId/stream";
30
+ /**
31
+ * Parent-origin proxy route for one remotely executed child session stream.
32
+ */
33
+ export declare const EVE_SUBAGENT_STREAM_ROUTE_PATTERN = "/eve/v1/session/:parentSessionId/subagents/:callId/:childSessionId/stream";
30
34
  /**
31
35
  * Framework-owned route pattern for dispatching one authored schedule
32
36
  * exactly once from the dev server.
@@ -89,10 +93,18 @@ export declare const EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN = "/eve/v1/con
89
93
  * is unauthenticated by design and resumes the matching parked runtime action.
90
94
  */
91
95
  export declare const EVE_CALLBACK_ROUTE_PATTERN = "/eve/v1/callback/:token";
96
+ /** Capability route used by a parent task to answer a remote child HITL batch. */
97
+ export declare const EVE_TASK_INPUT_ROUTE_PATTERN = "/eve/v1/task-input/:token";
92
98
  /** Builds the ID-addressed message route for one session. */
93
99
  export declare function createEveSessionRoutePath(sessionId: string): string;
94
100
  /** Builds the ID-addressed cancel route for one session. */
95
101
  export declare function createEveSessionCancelRoutePath(sessionId: string): string;
102
+ /** Builds the parent-origin stream path for one remote child session. */
103
+ export declare function createEveSubagentStreamRoutePath(input: {
104
+ readonly callId: string;
105
+ readonly childSessionId: string;
106
+ readonly parentSessionId: string;
107
+ }): string;
96
108
  /** Builds the ID-addressed compact route for one session. */
97
109
  export declare function createEveSessionCompactRoutePath(sessionId: string): string;
98
110
  /** Builds the ID-addressed clear route for one session. */
@@ -116,3 +128,5 @@ export declare function createEveConnectionCallbackRoutePath(name: string, attem
116
128
  * Creates the stable framework-owned terminal callback route path.
117
129
  */
118
130
  export declare function createEveCallbackRoutePath(token: string): string;
131
+ /** Builds the capability path used to answer one remote child turn. */
132
+ export declare function createEveTaskInputRoutePath(token: string): string;
@@ -1 +1 @@
1
- const EVE_ROUTE_PREFIX=`/eve/v1`,EVE_HEALTH_ROUTE_PATH=`${EVE_ROUTE_PREFIX}/health`,EVE_INFO_ROUTE_PATH=`${EVE_ROUTE_PREFIX}/info`,EVE_SESSION_ROUTE_PATH=`${EVE_ROUTE_PREFIX}/session`,EVE_SESSION_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId`,EVE_SESSION_CANCEL_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/cancel`,EVE_SESSION_COMPACT_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/compact`,EVE_SESSION_CLEAR_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/clear`,EVE_SESSION_RESET_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/reset`,EVE_SESSION_STREAM_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/stream`,EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN=`${EVE_ROUTE_PREFIX}/dev/schedules/:scheduleId`,EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH=`${EVE_ROUTE_PREFIX}/dev/runtime-artifacts`,EVE_DEV_RUNTIME_ARTIFACTS_REBUILD_ROUTE_PATH=`${EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}/rebuild`,EVE_DEV_RUNTIME_ARTIFACTS_SUSPEND_ROUTE_PATH=`${EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}/suspend`,EVE_DEV_RUNTIME_ARTIFACTS_RESUME_ROUTE_PATH=`${EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}/resume`;function createEveDevDispatchSchedulePath(t){return`${EVE_ROUTE_PREFIX}/dev/schedules/${encodeURIComponent(t)}`}const EVE_CONNECTION_CALLBACK_ROUTE_PATTERN=`${EVE_ROUTE_PREFIX}/connections/:name/callback/:attemptId/:token`,EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN=`${EVE_ROUTE_PREFIX}/connections/:name/callback/:token`,EVE_CALLBACK_ROUTE_PATTERN=`${EVE_ROUTE_PREFIX}/callback/:token`;function createEveSessionRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}`}function createEveSessionCancelRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/cancel`}function createEveSessionCompactRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/compact`}function createEveSessionClearRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/clear`}function createEveSessionResetRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/reset`}function createEveSessionStreamRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/stream`}function createEveConnectionCallbackRoutePath(t,n,r){return`${EVE_ROUTE_PREFIX}/connections/${encodeURIComponent(t)}/callback/${encodeURIComponent(n)}/${encodeURIComponent(r)}`}function createEveCallbackRoutePath(t){return`${EVE_ROUTE_PREFIX}/callback/${encodeURIComponent(t)}`}export{EVE_CALLBACK_ROUTE_PATTERN,EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN,EVE_DEV_RUNTIME_ARTIFACTS_REBUILD_ROUTE_PATH,EVE_DEV_RUNTIME_ARTIFACTS_RESUME_ROUTE_PATH,EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH,EVE_DEV_RUNTIME_ARTIFACTS_SUSPEND_ROUTE_PATH,EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH,EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_ROUTE_PREFIX,EVE_SESSION_CANCEL_ROUTE_PATTERN,EVE_SESSION_CLEAR_ROUTE_PATTERN,EVE_SESSION_COMPACT_ROUTE_PATTERN,EVE_SESSION_RESET_ROUTE_PATTERN,EVE_SESSION_ROUTE_PATH,EVE_SESSION_ROUTE_PATTERN,EVE_SESSION_STREAM_ROUTE_PATTERN,createEveCallbackRoutePath,createEveConnectionCallbackRoutePath,createEveDevDispatchSchedulePath,createEveSessionCancelRoutePath,createEveSessionClearRoutePath,createEveSessionCompactRoutePath,createEveSessionResetRoutePath,createEveSessionRoutePath,createEveSessionStreamRoutePath};
1
+ const EVE_ROUTE_PREFIX=`/eve/v1`,EVE_HEALTH_ROUTE_PATH=`${EVE_ROUTE_PREFIX}/health`,EVE_INFO_ROUTE_PATH=`${EVE_ROUTE_PREFIX}/info`,EVE_SESSION_ROUTE_PATH=`${EVE_ROUTE_PREFIX}/session`,EVE_SESSION_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId`,EVE_SESSION_CANCEL_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/cancel`,EVE_SESSION_COMPACT_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/compact`,EVE_SESSION_CLEAR_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/clear`,EVE_SESSION_RESET_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/reset`,EVE_SESSION_STREAM_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:sessionId/stream`,EVE_SUBAGENT_STREAM_ROUTE_PATTERN=`${EVE_SESSION_ROUTE_PATH}/:parentSessionId/subagents/:callId/:childSessionId/stream`,EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN=`${EVE_ROUTE_PREFIX}/dev/schedules/:scheduleId`,EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH=`${EVE_ROUTE_PREFIX}/dev/runtime-artifacts`,EVE_DEV_RUNTIME_ARTIFACTS_REBUILD_ROUTE_PATH=`${EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}/rebuild`,EVE_DEV_RUNTIME_ARTIFACTS_SUSPEND_ROUTE_PATH=`${EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}/suspend`,EVE_DEV_RUNTIME_ARTIFACTS_RESUME_ROUTE_PATH=`${EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}/resume`;function createEveDevDispatchSchedulePath(t){return`${EVE_ROUTE_PREFIX}/dev/schedules/${encodeURIComponent(t)}`}const EVE_CONNECTION_CALLBACK_ROUTE_PATTERN=`${EVE_ROUTE_PREFIX}/connections/:name/callback/:attemptId/:token`,EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN=`${EVE_ROUTE_PREFIX}/connections/:name/callback/:token`,EVE_CALLBACK_ROUTE_PATTERN=`${EVE_ROUTE_PREFIX}/callback/:token`,EVE_TASK_INPUT_ROUTE_PATTERN=`${EVE_ROUTE_PREFIX}/task-input/:token`;function createEveSessionRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}`}function createEveSessionCancelRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/cancel`}function createEveSubagentStreamRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e.parentSessionId)}/subagents/${encodeURIComponent(e.callId)}/${encodeURIComponent(e.childSessionId)}/stream`}function createEveSessionCompactRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/compact`}function createEveSessionClearRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/clear`}function createEveSessionResetRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/reset`}function createEveSessionStreamRoutePath(e){return`${EVE_SESSION_ROUTE_PATH}/${encodeURIComponent(e)}/stream`}function createEveConnectionCallbackRoutePath(t,n,r){return`${EVE_ROUTE_PREFIX}/connections/${encodeURIComponent(t)}/callback/${encodeURIComponent(n)}/${encodeURIComponent(r)}`}function createEveCallbackRoutePath(t){return`${EVE_ROUTE_PREFIX}/callback/${encodeURIComponent(t)}`}function createEveTaskInputRoutePath(t){return`${EVE_ROUTE_PREFIX}/task-input/${encodeURIComponent(t)}`}export{EVE_CALLBACK_ROUTE_PATTERN,EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN,EVE_DEV_RUNTIME_ARTIFACTS_REBUILD_ROUTE_PATH,EVE_DEV_RUNTIME_ARTIFACTS_RESUME_ROUTE_PATH,EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH,EVE_DEV_RUNTIME_ARTIFACTS_SUSPEND_ROUTE_PATH,EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH,EVE_LEGACY_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_ROUTE_PREFIX,EVE_SESSION_CANCEL_ROUTE_PATTERN,EVE_SESSION_CLEAR_ROUTE_PATTERN,EVE_SESSION_COMPACT_ROUTE_PATTERN,EVE_SESSION_RESET_ROUTE_PATTERN,EVE_SESSION_ROUTE_PATH,EVE_SESSION_ROUTE_PATTERN,EVE_SESSION_STREAM_ROUTE_PATTERN,EVE_SUBAGENT_STREAM_ROUTE_PATTERN,EVE_TASK_INPUT_ROUTE_PATTERN,createEveCallbackRoutePath,createEveConnectionCallbackRoutePath,createEveDevDispatchSchedulePath,createEveSessionCancelRoutePath,createEveSessionClearRoutePath,createEveSessionCompactRoutePath,createEveSessionResetRoutePath,createEveSessionRoutePath,createEveSessionStreamRoutePath,createEveSubagentStreamRoutePath,createEveTaskInputRoutePath};
@@ -196,6 +196,8 @@ export interface UnauthorizedResponseOptions {
196
196
  * challenge, and a `{ ok: false, code, error }` body.
197
197
  */
198
198
  export declare function createUnauthorizedResponse(opts?: UnauthorizedResponseOptions): Response;
199
+ /** @internal Escapes a value for an HTTP auth challenge quoted string. */
200
+ export declare function escapeAuthChallengeParameter(value: string): string;
199
201
  /**
200
202
  * Options accepted by auth error classes. The class chooses the HTTP status.
201
203
  */
@@ -230,6 +232,39 @@ export declare class ForbiddenError extends Error {
230
232
  * traffic, include {@link none} as the final entry.
231
233
  */
232
234
  export type AuthFn<TEvent = Request> = (event: TEvent) => SessionAuthContext | null | undefined | Promise<SessionAuthContext | null | undefined>;
235
+ /**
236
+ * OAuth protected-resource metadata attached to an inbound auth policy.
237
+ * `issuer` is shorthand for a single authorization server.
238
+ */
239
+ export type OAuthResourceOptions = {
240
+ readonly metadataPath?: string;
241
+ readonly resource?: string;
242
+ readonly scopes?: readonly string[];
243
+ } & ({
244
+ readonly authorizationServers?: never;
245
+ readonly issuer: string;
246
+ } | {
247
+ readonly authorizationServers: readonly string[];
248
+ readonly issuer?: never;
249
+ });
250
+ declare const OAUTH_RESOURCE_SYMBOL: unique symbol;
251
+ /**
252
+ * An ordinary route authenticator decorated with OAuth protected-resource
253
+ * discovery metadata.
254
+ */
255
+ export type OAuthResourceAuth = AuthFn<Request> & {
256
+ readonly [OAUTH_RESOURCE_SYMBOL]: OAuthResourceOptions;
257
+ };
258
+ /**
259
+ * Adds OAuth protected-resource metadata to an existing inbound auth policy.
260
+ *
261
+ * The returned value remains an {@link AuthFn}: it preserves the ordered auth
262
+ * walk and can be used by any channel. A protocol-aware channel such as
263
+ * `mcpChannel` may additionally publish the metadata and discovery challenge.
264
+ */
265
+ export declare function oauthResource(auth: AuthFn<Request> | readonly AuthFn<Request>[], options: OAuthResourceOptions): OAuthResourceAuth;
266
+ /** @internal Reads OAuth resource metadata without widening `AuthFn`. */
267
+ export declare function readOAuthResourceOptions(auth: AuthFn<Request> | readonly AuthFn<Request>[]): OAuthResourceOptions | undefined;
233
268
  /**
234
269
  * Attaches declared `www-authenticate` challenges to an {@link AuthFn}
235
270
  * without changing its call signature or behavior. {@link routeAuth} reads
@@ -463,3 +498,4 @@ export declare function jwtEcdsa(config: VerifyJwtEcdsaConfig): AuthFn<Request>;
463
498
  * for {@link routeAuth}'s 401.
464
499
  */
465
500
  export declare function oidc(config: VerifyOidcConfig): AuthFn<Request>;
501
+ export {};