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.
- package/CHANGELOG.md +16 -0
- package/dist/src/channel/routes.d.ts +13 -3
- package/dist/src/channel/routes.js +1 -1
- package/dist/src/channel/session-callback.js +1 -1
- package/dist/src/channel/session.d.ts +2 -1
- package/dist/src/channel/session.js +1 -1
- package/dist/src/channel/types.d.ts +41 -0
- package/dist/src/chunks/{use-eve-agent-CnppTEFk.js → use-eve-agent-Bi5fRxcZ.js} +9 -1
- package/dist/src/chunks/{use-eve-agent-COmP-H8R.js → use-eve-agent-DbKUBhl-.js} +9 -1
- package/dist/src/cli/commands/init-git.js +1 -1
- package/dist/src/cli/commands/init-recovery.d.ts +3 -0
- package/dist/src/cli/commands/init-recovery.js +3 -0
- package/dist/src/cli/commands/init-target.d.ts +21 -0
- package/dist/src/cli/commands/init-target.js +1 -0
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/dev/tui/runner.d.ts +8 -0
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/subagent-pump.d.ts +27 -22
- package/dist/src/cli/dev/tui/subagent-pump.js +1 -1
- package/dist/src/cli/dev/tui/terminal-renderer.d.ts +16 -0
- package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
- package/dist/src/cli/dev/tui/tool-presentation.js +1 -1
- package/dist/src/client/open-stream.d.ts +2 -0
- package/dist/src/client/open-stream.js +1 -1
- package/dist/src/client/session.js +1 -1
- package/dist/src/compiled/.vendor-stamp.json +2 -1
- package/dist/src/compiled/@modelcontextprotocol/server/LICENSE +216 -0
- package/dist/src/compiled/@modelcontextprotocol/server/index.d.ts +98 -0
- package/dist/src/compiled/@modelcontextprotocol/server/index.js +80 -0
- package/dist/src/compiler/extension-compatibility.d.ts +10 -10
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/compiler/normalize-manifest.js +1 -1
- package/dist/src/compiler/normalize-subagent.d.ts +1 -1
- package/dist/src/compiler/normalize-subagent.js +1 -1
- package/dist/src/context/serialized-dynamic-model-selection.d.ts +2 -0
- package/dist/src/context/serialized-dynamic-model-selection.js +1 -0
- package/dist/src/execution/agent-handle-dispatch.d.ts +15 -1
- package/dist/src/execution/agent-handle-dispatch.js +1 -1
- package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
- package/dist/src/execution/delegated-parent-notification.d.ts +17 -0
- package/dist/src/execution/delegated-parent-notification.js +1 -1
- package/dist/src/execution/deliver-payloads.js +1 -1
- package/dist/src/execution/dispatch-runtime-actions-shared.d.ts +155 -0
- package/dist/src/execution/dispatch-runtime-actions-shared.js +1 -0
- package/dist/src/execution/dispatch-runtime-actions-step.d.ts +18 -14
- package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
- package/dist/src/execution/dispatch-workflow-runtime-actions-step.d.ts +7 -2
- package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +1 -1
- package/dist/src/execution/effective-output-schema.d.ts +21 -0
- package/dist/src/execution/effective-output-schema.js +1 -0
- package/dist/src/execution/eve-workflow-attributes.d.ts +2 -0
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/parked-delivery-wait.d.ts +8 -12
- package/dist/src/execution/parked-delivery-wait.js +1 -1
- package/dist/src/execution/{route-proxied-deliver-step.d.ts → proxied-deliver-step.d.ts} +7 -4
- package/dist/src/execution/proxied-deliver-step.js +1 -0
- package/dist/src/execution/remote-agent-dispatch.d.ts +32 -0
- package/dist/src/execution/remote-agent-dispatch.js +1 -1
- package/dist/src/execution/remote-agent-route-url.d.ts +2 -0
- package/dist/src/execution/remote-agent-route-url.js +1 -0
- package/dist/src/execution/route-child-delivery.d.ts +2 -1
- package/dist/src/execution/route-child-delivery.js +1 -1
- package/dist/src/execution/session-callback-step.d.ts +11 -0
- package/dist/src/execution/session-callback-step.js +1 -1
- package/dist/src/execution/session-command-wire.js +1 -1
- package/dist/src/execution/session-state-cursor.d.ts +25 -0
- package/dist/src/execution/session-state-cursor.js +1 -0
- package/dist/src/execution/settle-cancelled-turn-step.d.ts +2 -0
- package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
- package/dist/src/execution/subagent-event-proxy-step.d.ts +15 -0
- package/dist/src/execution/subagent-event-proxy-step.js +1 -1
- package/dist/src/execution/subagent-hitl-proxy.d.ts +14 -7
- package/dist/src/execution/subagent-hitl-proxy.js +1 -1
- package/dist/src/execution/subagent-start-local.d.ts +29 -0
- package/dist/src/execution/subagent-start-local.js +1 -0
- package/dist/src/execution/subagent-start-remote.d.ts +23 -0
- package/dist/src/execution/subagent-start-remote.js +1 -0
- package/dist/src/execution/task-event-callback.d.ts +13 -0
- package/dist/src/execution/task-event-callback.js +1 -0
- package/dist/src/execution/task-input-capability.d.ts +4 -0
- package/dist/src/execution/task-input-capability.js +1 -0
- package/dist/src/execution/tasks/child/steps.d.ts +46 -0
- package/dist/src/execution/tasks/child/steps.js +1 -0
- package/dist/src/execution/tasks/child/workflow.d.ts +31 -0
- package/dist/src/execution/tasks/child/workflow.js +1 -0
- package/dist/src/execution/tasks/parent/agent-identity.d.ts +13 -0
- package/dist/src/execution/tasks/parent/agent-identity.js +1 -0
- package/dist/src/execution/tasks/parent/agent-views.d.ts +6 -0
- package/dist/src/execution/tasks/parent/agent-views.js +1 -0
- package/dist/src/execution/tasks/parent/continuation-dispatch.d.ts +37 -0
- package/dist/src/execution/tasks/parent/continuation-dispatch.js +1 -0
- package/dist/src/execution/tasks/parent/control-shared.d.ts +36 -0
- package/dist/src/execution/tasks/parent/control-shared.js +1 -0
- package/dist/src/execution/tasks/parent/delegate.d.ts +70 -0
- package/dist/src/execution/tasks/parent/delegate.js +1 -0
- package/dist/src/execution/tasks/parent/dispatch-task-step.d.ts +19 -0
- package/dist/src/execution/tasks/parent/dispatch-task-step.js +1 -0
- package/dist/src/execution/tasks/parent/dispatch.d.ts +33 -0
- package/dist/src/execution/tasks/parent/dispatch.js +1 -0
- package/dist/src/execution/tasks/parent/hitl-proxy-steps.d.ts +29 -0
- package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -0
- package/dist/src/execution/tasks/parent/run-parent.d.ts +72 -0
- package/dist/src/execution/tasks/parent/run-parent.js +1 -0
- package/dist/src/execution/tasks/parent/send.d.ts +25 -0
- package/dist/src/execution/tasks/parent/send.js +1 -0
- package/dist/src/execution/tasks/workflow-target.d.ts +2 -0
- package/dist/src/execution/tasks/workflow-target.js +1 -0
- package/dist/src/execution/terminate-child-sessions-step.d.ts +1 -0
- package/dist/src/execution/terminate-child-sessions-step.js +1 -1
- package/dist/src/execution/turn-control-receiver.d.ts +10 -0
- package/dist/src/execution/turn-control-receiver.js +1 -1
- package/dist/src/execution/turn-dispatch.d.ts +2 -0
- package/dist/src/execution/turn-dispatch.js +1 -1
- package/dist/src/execution/turn-execution-cursor.d.ts +2 -8
- package/dist/src/execution/turn-execution-cursor.js +1 -1
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/workflow-callback-url.d.ts +5 -0
- package/dist/src/execution/workflow-callback-url.js +1 -1
- package/dist/src/execution/workflow-entry.js +1 -1
- package/dist/src/execution/workflow-runtime.d.ts +9 -0
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/execution/workflow-steps.d.ts +7 -21
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/advertised-tools.js +1 -1
- package/dist/src/harness/authorization.js +1 -1
- package/dist/src/harness/execute-tool.d.ts +7 -0
- package/dist/src/harness/handles/prompt.d.ts +12 -0
- package/dist/src/harness/handles/prompt.js +2 -1
- package/dist/src/harness/handles/query.js +1 -1
- package/dist/src/harness/handles/store.d.ts +9 -2
- package/dist/src/harness/handles/store.js +1 -1
- package/dist/src/harness/handles/transitions.d.ts +10 -1
- package/dist/src/harness/handles/transitions.js +1 -1
- package/dist/src/harness/proxy-input-requests.d.ts +21 -4
- package/dist/src/harness/proxy-input-requests.js +1 -1
- package/dist/src/harness/runtime-actions.d.ts +2 -0
- package/dist/src/harness/runtime-actions.js +1 -1
- package/dist/src/harness/session-limit-enforcement.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/workflow-runtime-action-state.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/core.js +1 -1
- package/dist/src/internal/invocation/agent-invocation.d.ts +54 -0
- package/dist/src/internal/invocation/agent-invocation.js +1 -0
- package/dist/src/internal/invocation/attributes.d.ts +2 -0
- package/dist/src/internal/invocation/attributes.js +1 -0
- package/dist/src/internal/invocation/metadata.d.ts +9 -0
- package/dist/src/internal/invocation/metadata.js +1 -0
- package/dist/src/internal/invocation/workflow-execution.d.ts +32 -0
- package/dist/src/internal/invocation/workflow-execution.js +1 -0
- package/dist/src/internal/mcp/http-security.d.ts +12 -0
- package/dist/src/internal/mcp/http-security.js +1 -0
- package/dist/src/internal/mcp/protected-resource.d.ts +9 -0
- package/dist/src/internal/mcp/protected-resource.js +1 -0
- package/dist/src/internal/mcp/streamable-http-server.d.ts +51 -0
- package/dist/src/internal/mcp/streamable-http-server.js +1 -0
- package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
- package/dist/src/internal/nitro/routes/channel-route-context.d.ts +14 -0
- package/dist/src/internal/nitro/routes/channel-route-context.js +1 -1
- package/dist/src/internal/nitro/routes/runtime-stack.d.ts +2 -0
- package/dist/src/internal/nitro/routes/runtime-stack.js +1 -1
- package/dist/src/internal/vercel-agent-summary.d.ts +1 -1
- package/dist/src/protocol/message.d.ts +28 -0
- package/dist/src/protocol/message.js +2 -2
- package/dist/src/protocol/routes.d.ts +14 -0
- package/dist/src/protocol/routes.js +1 -1
- package/dist/src/public/channels/auth.d.ts +36 -0
- package/dist/src/public/channels/auth.js +1 -1
- package/dist/src/public/channels/eve.js +1 -1
- package/dist/src/public/channels/mcp.d.ts +19 -0
- package/dist/src/public/channels/mcp.js +1 -0
- package/dist/src/public/definitions/channel.d.ts +2 -2
- package/dist/src/public/definitions/channel.js +1 -1
- package/dist/src/react/use-eve-agent.js +1 -1
- package/dist/src/runtime/actions/types.d.ts +9 -0
- package/dist/src/runtime/actions/types.js +1 -1
- package/dist/src/runtime/agent/bootstrap.js +1 -1
- package/dist/src/runtime/connections/authorization-complete-page.js +70 -28
- package/dist/src/runtime/framework-channels/index.js +1 -1
- package/dist/src/runtime/framework-tools/index.js +1 -1
- package/dist/src/runtime/framework-tools/tasks.d.ts +95 -0
- package/dist/src/runtime/framework-tools/tasks.js +1 -0
- package/dist/src/runtime/prompt/compose.d.ts +1 -0
- package/dist/src/runtime/prompt/compose.js +1 -1
- package/dist/src/runtime/resolve-agent-graph.js +1 -1
- package/dist/src/runtime/resolve-agent.js +1 -1
- package/dist/src/runtime/session-callback-route.js +1 -1
- package/dist/src/runtime/task-input-response-route.d.ts +5 -0
- package/dist/src/runtime/task-input-response-route.js +1 -0
- package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +7 -0
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/tasks/json.d.ts +88 -0
- package/dist/src/tasks/json.js +1 -0
- package/dist/src/tasks/session-index.d.ts +48 -0
- package/dist/src/tasks/session-index.js +1 -0
- package/dist/src/tasks/task-id.d.ts +34 -0
- package/dist/src/tasks/task-id.js +1 -0
- package/dist/src/tasks/transitions.d.ts +23 -0
- package/dist/src/tasks/transitions.js +1 -0
- package/dist/src/tasks/types.d.ts +295 -0
- package/dist/src/tasks/types.js +1 -0
- package/dist/src/tasks/wire.d.ts +26 -0
- package/dist/src/tasks/wire.js +1 -0
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/channels/eve.mdx +14 -0
- package/docs/guides/client/streaming.mdx +1 -1
- package/docs/tools/human-in-the-loop.md +3 -1
- package/package.json +7 -1
- 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 @@
|
|
|
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))
|
|
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,
|
|
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(
|
|
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 {};
|