eve 0.84.0 → 0.85.0
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 +46 -0
- package/dist/src/channel/channel-operations.d.ts +2 -18
- package/dist/src/channel/compiled-channel.d.ts +3 -7
- package/dist/src/channel/cross-channel-receive.d.ts +13 -11
- package/dist/src/channel/cross-channel-receive.js +1 -1
- package/dist/src/channel/delivery.js +1 -1
- package/dist/src/channel/schedule.js +1 -1
- package/dist/src/channel/session.d.ts +26 -4
- package/dist/src/channel/session.js +1 -1
- package/dist/src/channel/types.d.ts +2 -0
- package/dist/src/chunks/{use-eve-agent-BbbguIdB.js → use-eve-agent-B2jCfcnG.js} +29 -12
- package/dist/src/chunks/{use-eve-agent-DWjyzplb.js → use-eve-agent-DCLFi26P.js} +29 -12
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/client/client.js +1 -1
- package/dist/src/client/delivery.d.ts +2 -0
- package/dist/src/client/delivery.js +1 -1
- package/dist/src/client/open-stream.js +1 -1
- package/dist/src/client/optimistic-message-submissions.js +1 -1
- package/dist/src/client/session-store.js +1 -1
- package/dist/src/client/session.js +1 -1
- package/dist/src/client/sessions.d.ts +1 -0
- package/dist/src/client/sessions.js +1 -1
- package/dist/src/client/types.d.ts +7 -4
- package/dist/src/compiled/.vendor-stamp.json +2 -2
- package/dist/src/compiled/@chat-adapter/slack/index.js +13 -13
- package/dist/src/compiled/@vercel/sandbox/api-client/api-client.d.ts +75 -0
- package/dist/src/compiled/@vercel/sandbox/api-client/validators.d.ts +4 -0
- package/dist/src/compiled/@vercel/sandbox/command.d.ts +78 -0
- package/dist/src/compiled/@vercel/sandbox/drive.d.ts +41 -1
- package/dist/src/compiled/@vercel/sandbox/index.js +13 -13
- package/dist/src/compiled/@vercel/sandbox/network-policy.d.ts +35 -4
- package/dist/src/compiled/@vercel/sandbox/sandbox.d.ts +18 -4
- package/dist/src/compiled/@vercel/sandbox/session.d.ts +29 -3
- package/dist/src/compiled/@vercel/sandbox/utils/pipe-stdin.d.ts +19 -0
- package/dist/src/compiled/_chunks/client/{core-CspsxXR-.js → core-BsvaaMUJ.js} +1 -1
- package/dist/src/compiled/_chunks/node/{auth-Dztlx9pE.js → auth-v5pS3mLo.js} +1 -1
- package/dist/src/compiled/_chunks/node/is-stream-DsuQX_bd.js +1 -0
- package/dist/src/compiled/_chunks/node/token-DHGH-jVc.js +1 -0
- package/dist/src/compiled/_chunks/node/token-util-BH2pw9Qm.js +25 -0
- package/dist/src/compiled/_chunks/node/token-util-CcvxNv76.js +1 -0
- package/dist/src/compiled/_chunks/node/version-C2PfNyEv.js +1 -0
- package/dist/src/compiled/zod/index.js +1 -1
- package/dist/src/compiled/zod/v4/core.js +1 -1
- package/dist/src/compiled/zod-validation-error/index.js +1 -1
- package/dist/src/compiler/artifacts.d.ts +1 -0
- package/dist/src/compiler/artifacts.js +1 -1
- package/dist/src/compiler/manifest.d.ts +2 -2
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/model-catalog.d.ts +8 -18
- package/dist/src/compiler/model-catalog.js +1 -1
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/compiler/normalize-manifest-types.d.ts +3 -0
- package/dist/src/compiler/normalize-manifest.js +1 -1
- package/dist/src/context/keys.d.ts +7 -8
- package/dist/src/context/keys.js +1 -1
- package/dist/src/eve-channel/index.js +1 -1
- package/dist/src/eve-channel/request.d.ts +1 -0
- package/dist/src/eve-channel/request.js +1 -1
- package/dist/src/eve-channel/support.js +1 -1
- package/dist/src/execution/agent-sessions/context.d.ts +5 -1
- package/dist/src/execution/agent-sessions/context.js +1 -1
- package/dist/src/execution/agent-sessions/steps.js +1 -1
- package/dist/src/execution/dynamic-workflow/tool.js +1 -1
- package/dist/src/execution/legacy-session/snapshot.d.ts +1 -2
- package/dist/src/execution/legacy-session/snapshot.js +1 -1
- package/dist/src/execution/proxied-deliver-step.js +1 -1
- package/dist/src/execution/public-destination.d.ts +3 -0
- package/dist/src/execution/public-destination.js +1 -1
- package/dist/src/execution/publish-session-events.js +1 -1
- package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +2 -0
- package/dist/src/execution/sandbox/bindings/docker-cli.js +1 -1
- package/dist/src/execution/sandbox/bindings/docker-connection.js +1 -1
- package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
- package/dist/src/execution/sandbox/multiplexed-command.d.ts +11 -1
- package/dist/src/execution/sandbox/multiplexed-command.js +1 -1
- package/dist/src/execution/sandbox/session.js +1 -1
- package/dist/src/execution/session/checkpoint-migrations.d.ts +16 -5
- package/dist/src/execution/session/checkpoint-migrations.js +1 -1
- package/dist/src/execution/session/checkpoint-refusal.d.ts +4 -0
- package/dist/src/execution/session/checkpoint-refusal.js +1 -0
- package/dist/src/execution/session/entry.js +1 -1
- package/dist/src/execution/session/handoff-steps.d.ts +7 -1
- package/dist/src/execution/session/handoff-steps.js +1 -1
- package/dist/src/execution/session/imported-conversation.d.ts +2 -0
- package/dist/src/execution/session/imported-conversation.js +1 -0
- package/dist/src/execution/session/interrupted-step.js +1 -1
- package/dist/src/execution/session/pre-v27-checkpoint.d.ts +36 -0
- package/dist/src/execution/session/pre-v27-checkpoint.js +1 -0
- package/dist/src/execution/session/program.d.ts +2 -0
- package/dist/src/execution/session/program.js +1 -1
- package/dist/src/execution/session/turn-step.js +1 -1
- package/dist/src/execution/session-callback-request.js +1 -1
- package/dist/src/execution/session-inbox/address.d.ts +1 -0
- package/dist/src/execution/session-inbox/handle.d.ts +7 -0
- package/dist/src/execution/session-inbox/handle.js +1 -0
- package/dist/src/execution/session-inbox/owner.d.ts +4 -4
- package/dist/src/execution/session-inbox/owner.js +1 -1
- package/dist/src/execution/session-inbox/resume.d.ts +1 -0
- package/dist/src/execution/session-inbox/resume.js +1 -1
- package/dist/src/execution/tool-auth.js +1 -1
- package/dist/src/execution/tools/agent-router-workflow.js +1 -1
- package/dist/src/execution/tools/channel-to.d.ts +12 -0
- package/dist/src/execution/tools/channel-to.js +1 -0
- package/dist/src/execution/tools/workflow/body.d.ts +3 -0
- package/dist/src/execution/tools/workflow/body.js +1 -1
- package/dist/src/execution/tools/workflow/step-context.d.ts +5 -0
- package/dist/src/execution/tools/workflow/step-execution.js +1 -1
- package/dist/src/execution/tools/workflow/step.js +1 -1
- package/dist/src/execution/workflow-callback-url.d.ts +2 -3
- package/dist/src/execution/workflow-callback-url.js +1 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/harness/compaction/step.js +1 -1
- package/dist/src/harness/model-call/call.d.ts +3 -1
- package/dist/src/harness/model-call/call.js +1 -1
- package/dist/src/harness/model-call/run.js +1 -1
- package/dist/src/harness/semantic-errors/rules/gateway.js +1 -1
- package/dist/src/harness/session-machine/transitions.js +1 -1
- package/dist/src/internal/application/compiled-artifacts.d.ts +2 -0
- package/dist/src/internal/application/compiled-artifacts.js +2 -2
- package/dist/src/internal/application/optional-package-install.js +1 -1
- package/dist/src/internal/application/stamped-package-version.js +1 -1
- package/dist/src/internal/attachments/limited-read.d.ts +2 -0
- package/dist/src/internal/attachments/limited-read.js +1 -1
- package/dist/src/internal/attachments/url-refs.js +1 -1
- package/dist/src/internal/capability-error.d.ts +3 -0
- package/dist/src/internal/capability-error.js +1 -0
- package/dist/src/internal/model-catalog.d.ts +39 -16
- package/dist/src/internal/model-catalog.js +1 -1
- package/dist/src/internal/nitro/host/dev-build-host.js +1 -1
- package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
- package/dist/src/protocol/delivery.d.ts +1 -0
- package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +1 -1
- package/dist/src/public/channels/discord/discordChannel.js +1 -1
- package/dist/src/public/channels/github/githubChannel.js +1 -1
- package/dist/src/public/channels/linear/linearChannel.js +1 -1
- package/dist/src/public/channels/linq/inboundContent.js +1 -1
- package/dist/src/public/channels/slack/answers.d.ts +2 -3
- package/dist/src/public/channels/slack/answers.js +1 -1
- package/dist/src/public/channels/slack/api.d.ts +23 -3
- package/dist/src/public/channels/slack/api.js +1 -1
- package/dist/src/public/channels/slack/app-manifest.d.ts +2 -0
- package/dist/src/public/channels/slack/app-manifest.js +1 -1
- package/dist/src/public/channels/slack/auth.d.ts +2 -1
- package/dist/src/public/channels/slack/auth.js +1 -1
- package/dist/src/public/channels/slack/code-channel.d.ts +42 -0
- package/dist/src/public/channels/slack/code-channel.js +1 -0
- package/dist/src/public/channels/slack/defaults.d.ts +7 -3
- package/dist/src/public/channels/slack/defaults.js +3 -3
- package/dist/src/public/channels/slack/hitl.d.ts +7 -17
- package/dist/src/public/channels/slack/hitl.js +1 -1
- package/dist/src/public/channels/slack/index.d.ts +4 -3
- package/dist/src/public/channels/slack/index.js +1 -1
- package/dist/src/public/channels/slack/interaction-cards.d.ts +0 -2
- package/dist/src/public/channels/slack/interaction-cards.js +1 -1
- package/dist/src/public/channels/slack/interactions.js +1 -1
- package/dist/src/public/channels/slack/open-code-channel.d.ts +30 -0
- package/dist/src/public/channels/slack/open-code-channel.js +1 -0
- package/dist/src/public/channels/slack/private-approval-delivery.d.ts +16 -4
- package/dist/src/public/channels/slack/private-approval-delivery.js +1 -1
- package/dist/src/public/channels/slack/renderers.d.ts +58 -6
- package/dist/src/public/channels/slack/renderers.js +1 -1
- package/dist/src/public/channels/slack/reply-delivery.d.ts +4 -0
- package/dist/src/public/channels/slack/reply-delivery.js +1 -1
- package/dist/src/public/channels/slack/request-card-render.d.ts +45 -0
- package/dist/src/public/channels/slack/request-card-render.js +1 -0
- package/dist/src/public/channels/slack/request-cards.d.ts +35 -0
- package/dist/src/public/channels/slack/request-cards.js +3 -0
- package/dist/src/public/channels/slack/sign-in-cancel.d.ts +3 -5
- package/dist/src/public/channels/slack/sign-in-cancel.js +1 -1
- package/dist/src/public/channels/slack/slackChannel.d.ts +109 -22
- package/dist/src/public/channels/slack/slackChannel.js +1 -1
- package/dist/src/public/channels/slack/task-card.d.ts +3 -3
- package/dist/src/public/channels/slack/task-card.js +1 -1
- package/dist/src/public/channels/slack/thread-status.js +1 -1
- package/dist/src/public/channels/teams/api.js +1 -1
- package/dist/src/public/channels/teams/defaults.js +1 -1
- package/dist/src/public/channels/teams/teamsChannel.js +1 -1
- package/dist/src/public/channels/teams/verify.d.ts +9 -5
- package/dist/src/public/channels/teams/verify.js +1 -1
- package/dist/src/public/channels/telegram/telegramChannel.js +1 -1
- package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
- package/dist/src/public/nuxt/module.js +1 -1
- package/dist/src/public/schedules/subscription.d.ts +10 -1
- package/dist/src/reactions/kinds/model.js +1 -1
- package/dist/src/reactions/kinds/subagent.js +1 -1
- package/dist/src/runtime/agent/resolve-model.d.ts +3 -4
- package/dist/src/runtime/agent/resolve-model.js +1 -1
- package/dist/src/runtime/loaders/artifact-paths.d.ts +1 -0
- package/dist/src/runtime/loaders/artifact-paths.js +1 -1
- package/dist/src/runtime/loaders/bundled-artifacts.d.ts +2 -0
- package/dist/src/runtime/loaders/bundled-artifacts.js +1 -1
- package/dist/src/runtime/loaders/model-metadata.d.ts +4 -0
- package/dist/src/runtime/loaders/model-metadata.js +1 -0
- package/dist/src/runtime/resolve-agent.js +1 -1
- package/dist/src/runtime/sessions/compiled-agent-cache.d.ts +3 -0
- package/dist/src/runtime/sessions/compiled-agent-cache.js +1 -1
- package/dist/src/runtime/subagents/dynamic-agent-config.d.ts +2 -2
- package/dist/src/runtime/subagents/dynamic-agent-config.js +1 -1
- package/dist/src/runtime/subagents/workflow.js +1 -1
- package/dist/src/sandbox/provider.d.ts +2 -0
- package/dist/src/setup/flows/model-source-change.js +1 -1
- package/dist/src/setup/index.d.ts +1 -1
- package/dist/src/setup/primitives/index.d.ts +1 -1
- package/dist/src/setup/primitives/pm/run.d.ts +0 -2
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +0 -1
- package/dist/src/shared/channel-definition.d.ts +4 -4
- package/dist/src/shared/sandbox-session.d.ts +4 -0
- package/dist/src/subagents/adapter.js +1 -1
- package/dist/src/subagents/parent-notification.js +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/tools/definition.d.ts +21 -0
- package/dist/src/tools/provided/ask-question-workflow.js +1 -1
- package/dist/src/tools/provided/sleep-workflow.js +1 -1
- package/dist/src/tools/workflow-definition.d.ts +4 -4
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/agent-config.md +5 -4
- package/docs/channels/custom.mdx +16 -3
- package/docs/channels/eve.mdx +2 -0
- package/docs/channels/linq.mdx +1 -1
- package/docs/channels/slack.mdx +185 -18
- package/docs/channels/teams.mdx +6 -2
- package/docs/concepts/default-harness.md +6 -0
- package/docs/concepts/upgrade-to-v27-events.md +2 -2
- package/docs/evals/judge.mdx +13 -0
- package/docs/experimental/dynamic-schedules.mdx +2 -2
- package/docs/guides/client/overview.mdx +24 -2
- package/docs/guides/remote-agents.md +8 -0
- package/docs/patterns/fork-conversations-into-new-threads.md +159 -0
- package/docs/patterns/meta.json +1 -0
- package/docs/reference/cli.md +1 -1
- package/docs/sandbox/custom-providers.mdx +1 -1
- package/docs/sandbox/index.mdx +1 -1
- package/docs/schedules.mdx +1 -1
- package/docs/tools/overview.mdx +34 -0
- package/docs/tools/workflows.mdx +51 -5
- package/package.json +2 -2
- package/dist/src/compiled/_chunks/node/token-Bedbhv5z.js +0 -1
- package/dist/src/compiled/_chunks/node/token-util-DpJNusVS.js +0 -1
- package/dist/src/compiled/_chunks/node/token-util-DwHQ2a3c.js +0 -1
- package/dist/src/compiled/_chunks/node/version-C__MqbLM.js +0 -1
- package/dist/src/public/channels/slack/approval-cards.d.ts +0 -25
- package/dist/src/public/channels/slack/approval-cards.js +0 -2
- package/dist/src/runtime/agent/model-catalog.d.ts +0 -10
- package/dist/src/runtime/agent/model-catalog.js +0 -1
|
@@ -32,8 +32,7 @@ export declare function createBrowserCallbackUrl(baseUrl: string, callbackPath:
|
|
|
32
32
|
/**
|
|
33
33
|
* Builds a framework-owned callback URL for server-to-server delivery.
|
|
34
34
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* protected deployment.
|
|
35
|
+
* The URL carries only the callback's scoped capability. Deployment protection
|
|
36
|
+
* credentials belong to the delivering deployment's trusted-origin transport.
|
|
38
37
|
*/
|
|
39
38
|
export declare function createWorkflowCallbackUrl(baseUrl: string, callbackPath: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{joinEveRoutePath}from"#shared/eve-route-path.js";import{EVE_PUBLIC_ROUTE_PREFIX_ENV,normalizePublicRoutePrefix}from"#shared/public-route-prefix.js";function resolveVercelProductionCallbackBaseUrl(){return process.env.VERCEL_ENV===`production`&&process.env.VERCEL_PROJECT_PRODUCTION_URL?`https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`:null}function resolveWorkflowCallbackBaseUrl(e){let t=process.env.WORKFLOW_LOCAL_BASE_URL?.trim()||void 0,n=(resolveVercelProductionCallbackBaseUrl()??t??e).replace(/\/$/,``),r=normalizePublicRoutePrefix(process.env[EVE_PUBLIC_ROUTE_PREFIX_ENV]);return r===void 0?n:`${n}${r}`}function createBrowserCallbackUrl(e,t){let n=new URL(t,`http://eve.local`),r=new URL(e);return r.pathname=joinEveRoutePath(r.pathname,n.pathname),r.search=n.search,r.toString()}function createWorkflowCallbackUrl(e,t){
|
|
1
|
+
import{joinEveRoutePath}from"#shared/eve-route-path.js";import{EVE_PUBLIC_ROUTE_PREFIX_ENV,normalizePublicRoutePrefix}from"#shared/public-route-prefix.js";function resolveVercelProductionCallbackBaseUrl(){return process.env.VERCEL_ENV===`production`&&process.env.VERCEL_PROJECT_PRODUCTION_URL?`https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`:null}function resolveWorkflowCallbackBaseUrl(e){let t=process.env.WORKFLOW_LOCAL_BASE_URL?.trim()||void 0,n=(resolveVercelProductionCallbackBaseUrl()??t??e).replace(/\/$/,``),r=normalizePublicRoutePrefix(process.env[EVE_PUBLIC_ROUTE_PREFIX_ENV]);return r===void 0?n:`${n}${r}`}function createBrowserCallbackUrl(e,t){let n=new URL(t,`http://eve.local`),r=new URL(e);return r.pathname=joinEveRoutePath(r.pathname,n.pathname),r.search=n.search,r.toString()}function createWorkflowCallbackUrl(e,t){return createBrowserCallbackUrl(e,t)}export{createBrowserCallbackUrl,createWorkflowCallbackUrl,resolveVercelProductionCallbackBaseUrl,resolveWorkflowCallbackBaseUrl};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger,logError}from"#internal/logging.js";import{validateDeliveryIdempotencyKey}from"#channel/delivery-idempotency.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{SessionStrandedError,describeStrandedSession}from"#channel/session-stranded-error.js";import{sessionCommandHookToken,sessionInboxHookToken}from"#execution/session-inbox/address.js";import{SessionPredecessorKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{validateToolStubTargets}from"#tool-stubs/validate-targets.js";import{getHookByToken,getRun,getWorld,start}from"#internal/workflow/runtime.js";import{assertSessionHistoryReadable,readSessionEventHistory,readSessionEventStream,readSessionRecordHistory,readSessionRecords,readSessionStreamTailIndex}from"#execution/session-event-stream.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{serializeContext}from"#context/serialize.js";import{AcceptedSessionIdentityError,SessionHandoffPendingError,logicalSessionToken,resolveSessionInbox,resumeSessionInbox}from"#execution/session-inbox/resume.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{StrandedSessionOwnerError,assertRunnableSessionInbox,assertRunnableSessionOwner,findSessionHookHolder}from"#execution/session-inbox/owner.js";import{initializeSessionInstrumentation}from"#instrumentation/runtime.js";import{EVE_PREWARM_ATTRIBUTE,EVE_VERSION_ATTRIBUTE,buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{endStrandedSession}from"#execution/session-inbox/end-stranded-session.js";import{SESSION_HOOK_HANDOVER_TIMEOUT_MS,waitForSessionHooksRelease}from"#execution/session-inbox/hook-release.js";import{CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME,CONNECTION_EVENT_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME}from"#execution/stable-workflow-names.js";import{readRemoteChildBinding}from"#execution/child-binding.js";import{prewarmWorkflowSession}from"#execution/session-prewarm.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{buildRunContext}from"#execution/runtime-context.js";import{buildInvocationAttributes}from"#internal/invocation/metadata.js";import{isAgentTraceContext}from"#tracing/eve/agent-trace-context.js";const EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),STABLE_ID_BASE=EVE_PACKAGE_INFO.name,log=createLogger(`execution.workflow-runtime`),workflowEntryReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_ENTRY_NAME}`},sessionTimeoutWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${SESSION_TIMEOUT_WORKFLOW_NAME}`},workflowToolRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_TOOL_RUN_WORKFLOW_NAME}`},connectionEventWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${CONNECTION_EVENT_WORKFLOW_NAME}`},connectionEventDeliveryWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME}`};function createWorkflowRuntime(e){let startSession=async(t,n)=>{validateDeliveryIdempotencyKey(t.idempotencyKey),t.input.message!==void 0&&t.delivery===void 0&&(t={...t,delivery:createChannelDeliveryMetadata({channelKind:t.adapter.kind,channelName:t.channelName??t.adapter.kind,requestId:t.requestId})});let r=t.continuationConflictCommand;r!==void 0&&r.delivery===void 0&&(t={...t,continuationConflictCommand:{...r,delivery:t.delivery}});let i=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId});t.toolStubs!==void 0&&t.toolStubs.rootSessionId===void 0&&validateToolStubTargets(t.toolStubs.rules,i.graph);let a=buildRunContext({agentSessionRuntimeOverrides:e.agentSessionRuntimeOverrides,bundle:i,dynamicSubagentAgentConfig:e.dynamicSubagentAgentConfig,run:t});n!==void 0&&a.set(SessionPredecessorKey,n);let o=resolveEffectiveAgentRuntime(i,a),s=initializeSessionInstrumentation({agentName:o.turnAgent.id,ctx:a}),c=o.limits?.sessionTimeoutMs,l=i.resolvedAgent.config?.experimental?.workflow?.retention??(s.action===`record`&&s.recordInputs&&s.recordOutputs?void 0:0),u=serializeContext(a),d=readParentLineage(u),f={idempotencyKey:t.idempotencyKey,kind:`initial`,input:t.input,ownerDeploymentId:await resolveCurrentWorkflowDeploymentId(),serializedContext:u};t.continuationConflictCommand!==void 0&&(f.continuationConflictCommand=t.continuationConflictCommand),c!==void 0&&(f.sessionTimeoutMs=c),l!==void 0&&(f.retention=l);let p={...d.sessionId===void 0?buildSessionAttributes({serializedContext:u}):buildSubagentRootAttributes({identity:{nodeId:i.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:d.callId,parentSessionId:d.sessionId,parentTurnId:d.turnId,rootSessionId:d.rootSessionId??d.sessionId,serializedContext:u}),[EVE_PREWARM_ATTRIBUTE]:`1`,...t.externalInvocation===void 0?{}:buildInvocationAttributes(t.externalInvocation)},m;try{let e={allowReservedAttributes:!0,attributes:normalizeEveAttributes(p)};l!==void 0&&(e.experimental_retention=l),m=await startWorkflowOnDeployment(workflowEntryReference,[f],f.ownerDeploymentId,e)}catch(e){throw logError(log,`failed to start workflow run`,e,{continuationToken:t.continuationToken}),e}let h=m.runId;if(t.idempotencyKey!==void 0&&t.continuationToken!==void 0){let e=await pollUntil(()=>resolveContinuation(t.continuationToken),SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(e===void 0)throw Error(`Delivery accepted, but its session identity is not ready. Retry with the same idempotencyKey.`);h=e.sessionId}let g,getEvents=()=>(g??=readSessionEventStream(h),g);return{get events(){return getEvents()},sessionId:h,...t.delivery!==void 0&&{deliveryId:t.delivery.deliveryId}}};return{async createSession(e){return await startSession(e)},async dispatchContinuation(e){let{continuationToken:t,successor:n}=e,r=identifyCommand(e.command);try{return await dispatchWorkflowCommand(t,r)}catch(e){if(!(e instanceof StrandedSessionOwnerError))throw e;if(r.kind!==`send`||n===void 0)return await settleStrandedCommand(t,r,e);if((r.payload.answers?.length??0)>0)throw sessionStrandedError(e,`Its pending requests can no longer be answered; send a new message to start a fresh session.`);let i=await endStrandedSession(e,t,`message`);return{sessionId:(await startSession({...n,delivery:r.delivery},{sessionId:i})).sessionId,deliveryId:r.delivery?.deliveryId,status:`accepted`}}},async dispatchSession(e){return await dispatchWorkflowSessionCommand(e)},async getEventStream(e,t){return t?.follow===!1?readSessionEventHistory(e,t.startIndex,t.signal):(await assertFollowableSession(e),readSessionEventStream(e,t?.startIndex,t?.signal))},async getLineStream(e,t){return t?.follow===!1?readSessionRecordHistory(e,t.startIndex):(await assertFollowableSession(e),readSessionRecords(e,t?.startIndex))},async getStreamTailIndex(e){return await readSessionStreamTailIndex(e)},async readChildBinding(e,t){return await readRemoteChildBinding(e,t)},async hasRunnableOwner(e){let t=sessionInboxHookToken(sessionCommandHookToken(e)),n=await findSessionHookHolder(t);if(n===void 0)return!1;try{return await assertRunnableSessionOwner(n),!0}catch(e){if(e instanceof StrandedSessionOwnerError)return!1;throw e}},resolveContinuation}}async function dispatchWorkflowCommand(e,t){if(t.kind===`prewarm`)return typeof e==`string`?{status:`unsupported`}:await prewarmWorkflowSession(e.sessionId,t.targetDeploymentId);let n;try{let r=await resumeSessionInbox(e,t);n={runId:r.ownerRunId,sessionId:await r.sessionId}}catch(n){if(n instanceof StrandedSessionOwnerError)throw n;let r=t.kind===`send`&&typeof e!=`string`,i={status:`session_not_active`,retryable:!0};if(n instanceof SessionHandoffPendingError){if(r)return i;throw n}if(isInactiveCommandTarget(n))return r&&await isRunActive(e.sessionId)?i:inactiveCommandResult(t);throw logError(log,`failed to dispatch session command`,n,{command:t.kind,token:e}),n}return t.kind===`reset`&&await waitForSessionHooksRelease([sessionCommandHookToken(n.sessionId),logicalSessionToken(e)],{ownerRunId:n.runId,sessionId:n.sessionId}),activeCommandResult(t,n.sessionId)}async function settleStrandedCommand(e,t,n){switch(t.kind){case`reset`:return{previousSessionId:await endStrandedSession(n,e,`reset`,t),status:`reset`};case`send`:case`clear`:throw sessionStrandedError(n);default:return inactiveCommandResult(t)}}async function assertFollowableSession(e){try{await Promise.all([assertRunnableSessionInbox(sessionInboxHookToken(sessionCommandHookToken(e))),assertSessionHistoryReadable(e)])}catch(e){throw e instanceof StrandedSessionOwnerError?sessionStrandedError(e):e}}function sessionStrandedError(e,t){let n=e.eveVersion===void 0?{}:{eveVersion:e.eveVersion};return new SessionStrandedError(n,describeStrandedSession(n,t))}function activeCommandResult(e,t){return e.kind===`reset`?{previousSessionId:t,status:`reset`}:e.kind===`send`&&e.delivery!==void 0?{sessionId:t,status:`accepted`,deliveryId:e.delivery.deliveryId}:{sessionId:t,status:`accepted`}}function inactiveCommandResult(e){return e.kind===`send`?{status:`session_not_active`}:e.kind===`cancel`?{status:`no_active_turn`}:{status:`no_active_session`}}async function dispatchWorkflowSessionCommand(e){let t={sessionId:e.sessionId},n=identifyCommand(e.command);try{return await dispatchWorkflowCommand(t,n)}catch(e){if(!(e instanceof StrandedSessionOwnerError))throw e;return await settleStrandedCommand(t,n,e)}}async function isRunActive(e){try{let t=await getRun(e).status;return t===`pending`||t===`running`}catch(e){if(isInactiveCommandTarget(e))return!1;throw e}}function isInactiveCommandTarget(e){if(e instanceof AcceptedSessionIdentityError)return!1;if(HookNotFoundError.is(e))return!0;for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t)||RunExpiredError.is(t)||EntityConflictError.is(t))return!0;return!1}async function resolveContinuation(e,t){let n;try{n=await resolveSessionInbox(e)}catch(t){if(HookNotFoundError.is(t))return;throw logError(log,`failed to resolve session by continuation token`,t,{continuationToken:e}),t}if(t?.runnable!==!0)return n;try{await assertRunnableSessionInbox(sessionInboxHookToken(sessionCommandHookToken(n.sessionId)))}catch(e){throw e instanceof StrandedSessionOwnerError?sessionStrandedError(e):e}return n}async function waitForCommandHookOwner(e){let t=await pollUntil(async()=>{try{return normalizeWorkflowHook(await getHookByToken(e))}catch(e){if(!HookNotFoundError.is(e))throw e;return}},SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(t===void 0)throw new HookNotFoundError(e);return t}async function waitForSessionInbox(e){let t=sessionInboxHookToken(sessionCommandHookToken(e)),n=await pollUntil(async()=>await findSessionHookHolder(t)!==void 0||!await hasRunEnded(e)&&void 0,SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(n===void 0)throw Error(`Session "${e}" did not start taking commands within ${SESSION_HOOK_HANDOVER_TIMEOUT_MS/1e3} seconds.`);return n}async function pollUntil(e,t){let n=Date.now()+t;for(let t=20;;t=Math.min(t*2,200)){let r=await e();if(r!==void 0||Date.now()>=n)return r;await new Promise(e=>setTimeout(e,t))}}async function hasRunEnded(e){try{let t=await getRun(e).status;return t!==`pending`&&t!==`running`}catch(e){for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t))return!1;if(isInactiveCommandTarget(e))return!0;throw e}}async function startWorkflowOnCurrentDeployment(e,t,n){return await startWorkflowOnDeployment(e,t,await resolveCurrentWorkflowDeploymentId(),n)}async function startWorkflowOnDeployment(e,t,n,r){return await withWorkflowStartContext(async()=>{if(n.length===0||n===`latest`)throw Error(`Workflow starts require an exact deployment id.`);return await start(e,t,{...r,allowReservedAttributes:!0,attributes:{...r?.attributes,[EVE_VERSION_ATTRIBUTE]:EVE_PACKAGE_INFO.version},deploymentId:n})})}async function resolveCurrentWorkflowDeploymentId(){let e=process.env.VERCEL_DEPLOYMENT_ID?.trim()||await(await getWorld()).getDeploymentId();if(e.length===0||e===`latest`)throw Error(`Workflow runtime could not resolve an exact deployment id.`);return e}async function withWorkflowStartContext(e){let t=context.active(),n=isAgentTraceContext(t)?trace.deleteSpan(t):t;return await context.with(n,e)}function normalizeWorkflowHook(e){if(typeof e!=`object`||!e||!(`runId`in e))throw Error(`Workflow hook did not include a run id.`);let t=e.runId;if(typeof t!=`string`||t.length===0)throw Error(`Workflow hook did not include a run id.`);return{runId:t}}function identifyCommand(e){if(e.kind!==`send`||e.delivery!==void 0)return e;let t=e.caller===void 0?e.schedule===void 0?`http`:`schedule`:`subagent`;return{...e,delivery:createChannelDeliveryMetadata({channelKind:t,channelName:t,requestId:e.requestId})}}export{connectionEventDeliveryWorkflowReference,connectionEventWorkflowReference,createWorkflowRuntime,dispatchWorkflowSessionCommand,hasRunEnded,pollUntil,resolveContinuation,sessionTimeoutWorkflowReference,startWorkflowOnCurrentDeployment,startWorkflowOnDeployment,waitForCommandHookOwner,waitForSessionInbox,workflowEntryReference,workflowToolRunWorkflowReference};
|
|
1
|
+
import{createLogger}from"#internal/logging.js";import{validateDeliveryIdempotencyKey}from"#channel/delivery-idempotency.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{SessionStrandedError,describeStrandedSession}from"#channel/session-stranded-error.js";import{sessionCommandHookToken,sessionInboxHookToken}from"#execution/session-inbox/address.js";import{SessionPredecessorKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{validateToolStubTargets}from"#tool-stubs/validate-targets.js";import{getHookByToken,getRun,getWorld,start}from"#internal/workflow/runtime.js";import{assertSessionHistoryReadable,readSessionEventHistory,readSessionEventStream,readSessionRecordHistory,readSessionRecords,readSessionStreamTailIndex}from"#execution/session-event-stream.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{serializeContext}from"#context/serialize.js";import{AcceptedSessionIdentityError,SessionHandoffPendingError,logicalSessionToken,resolveSessionInbox,resumeSessionInbox}from"#execution/session-inbox/resume.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{StrandedSessionOwnerError,assertRunnableSessionInbox,assertRunnableSessionOwner,findSessionHookHolder}from"#execution/session-inbox/owner.js";import{initializeSessionInstrumentation}from"#instrumentation/runtime.js";import{EVE_PREWARM_ATTRIBUTE,EVE_VERSION_ATTRIBUTE,buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{endStrandedSession}from"#execution/session-inbox/end-stranded-session.js";import{SESSION_HOOK_HANDOVER_TIMEOUT_MS,waitForSessionHooksRelease}from"#execution/session-inbox/hook-release.js";import{CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME,CONNECTION_EVENT_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME}from"#execution/stable-workflow-names.js";import{readRemoteChildBinding}from"#execution/child-binding.js";import{prewarmWorkflowSession}from"#execution/session-prewarm.js";import{formatCapabilityError}from"#internal/capability-error.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{buildRunContext}from"#execution/runtime-context.js";import{buildInvocationAttributes}from"#internal/invocation/metadata.js";import{isAgentTraceContext}from"#tracing/eve/agent-trace-context.js";const EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),STABLE_ID_BASE=EVE_PACKAGE_INFO.name,log=createLogger(`execution.workflow-runtime`),workflowEntryReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_ENTRY_NAME}`},sessionTimeoutWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${SESSION_TIMEOUT_WORKFLOW_NAME}`},workflowToolRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_TOOL_RUN_WORKFLOW_NAME}`},connectionEventWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${CONNECTION_EVENT_WORKFLOW_NAME}`},connectionEventDeliveryWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME}`};function createWorkflowRuntime(e){let startSession=async(t,n)=>{validateDeliveryIdempotencyKey(t.idempotencyKey),t.input.message!==void 0&&t.delivery===void 0&&(t={...t,delivery:createChannelDeliveryMetadata({channelKind:t.adapter.kind,channelName:t.channelName??t.adapter.kind,requestId:t.requestId})});let r=t.continuationConflictCommand;r!==void 0&&r.delivery===void 0&&(t={...t,continuationConflictCommand:{...r,delivery:t.delivery}});let i=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId});t.toolStubs!==void 0&&t.toolStubs.rootSessionId===void 0&&validateToolStubTargets(t.toolStubs.rules,i.graph);let a=buildRunContext({agentSessionRuntimeOverrides:e.agentSessionRuntimeOverrides,bundle:i,dynamicSubagentAgentConfig:e.dynamicSubagentAgentConfig,run:t});n!==void 0&&a.set(SessionPredecessorKey,n);let o=resolveEffectiveAgentRuntime(i,a),s=initializeSessionInstrumentation({agentName:o.turnAgent.id,ctx:a}),c=o.limits?.sessionTimeoutMs,l=i.resolvedAgent.config?.experimental?.workflow?.retention??(s.action===`record`&&s.recordInputs&&s.recordOutputs?void 0:0),u=serializeContext(a),d=readParentLineage(u),f={idempotencyKey:t.idempotencyKey,kind:`initial`,input:t.input,ownerDeploymentId:await resolveCurrentWorkflowDeploymentId(),serializedContext:u};t.continuationConflictCommand!==void 0&&(f.continuationConflictCommand=t.continuationConflictCommand),c!==void 0&&(f.sessionTimeoutMs=c),l!==void 0&&(f.retention=l);let p={...d.sessionId===void 0?buildSessionAttributes({serializedContext:u}):buildSubagentRootAttributes({identity:{nodeId:i.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:d.callId,parentSessionId:d.sessionId,parentTurnId:d.turnId,rootSessionId:d.rootSessionId??d.sessionId,serializedContext:u}),[EVE_PREWARM_ATTRIBUTE]:`1`,...t.externalInvocation===void 0?{}:buildInvocationAttributes(t.externalInvocation)},m;try{let e={allowReservedAttributes:!0,attributes:normalizeEveAttributes(p)};l!==void 0&&(e.experimental_retention=l),m=await startWorkflowOnDeployment(workflowEntryReference,[f],f.ownerDeploymentId,e)}catch(e){throw log.error(`failed to start workflow run`,{error:formatCapabilityError(e,[t.continuationToken])}),e}let h=m.runId;if(t.idempotencyKey!==void 0&&t.continuationToken!==void 0){let e=await pollUntil(()=>resolveContinuation(t.continuationToken),SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(e===void 0)throw Error(`Delivery accepted, but its session identity is not ready. Retry with the same idempotencyKey.`);h=e.sessionId}let g,getEvents=()=>(g??=readSessionEventStream(h),g);return{get events(){return getEvents()},sessionId:h,...t.delivery!==void 0&&{deliveryId:t.delivery.deliveryId}}};return{async createSession(e){return await startSession(e)},async dispatchContinuation(e){let{continuationToken:t,successor:n}=e,r=identifyCommand(e.command);try{return await dispatchWorkflowCommand(t,r)}catch(e){if(!(e instanceof StrandedSessionOwnerError))throw e;if(r.kind!==`send`||n===void 0)return await settleStrandedCommand(t,r,e);if((r.payload.answers?.length??0)>0)throw sessionStrandedError(e,`Its pending requests can no longer be answered; send a new message to start a fresh session.`);let i=await endStrandedSession(e,t,`message`);return{sessionId:(await startSession({...n,delivery:r.delivery},{sessionId:i})).sessionId,deliveryId:r.delivery?.deliveryId,status:`accepted`}}},async dispatchSession(e){return await dispatchWorkflowSessionCommand(e)},async getEventStream(e,t){return t?.follow===!1?readSessionEventHistory(e,t.startIndex,t.signal):(await assertFollowableSession(e),readSessionEventStream(e,t?.startIndex,t?.signal))},async getLineStream(e,t){return t?.follow===!1?readSessionRecordHistory(e,t.startIndex):(await assertFollowableSession(e),readSessionRecords(e,t?.startIndex))},async getStreamTailIndex(e){return await readSessionStreamTailIndex(e)},async readChildBinding(e,t){return await readRemoteChildBinding(e,t)},async hasRunnableOwner(e){let t=sessionInboxHookToken(sessionCommandHookToken(e)),n=await findSessionHookHolder(t);if(n===void 0)return!1;try{return await assertRunnableSessionOwner(n),!0}catch(e){if(e instanceof StrandedSessionOwnerError)return!1;throw e}},resolveContinuation}}async function dispatchWorkflowCommand(e,t){if(t.kind===`prewarm`)return typeof e==`string`?{status:`unsupported`}:await prewarmWorkflowSession(e.sessionId,t.targetDeploymentId);let n,r;try{let i=await resumeSessionInbox(e,t);r=i.inbox,n={runId:i.ownerRunId,sessionId:await i.sessionId}}catch(n){if(n instanceof StrandedSessionOwnerError)throw n;let r=t.kind===`send`&&typeof e!=`string`,i={status:`session_not_active`,retryable:!0};if(n instanceof SessionHandoffPendingError){if(r)return i;throw n}if(isInactiveCommandTarget(n))return r&&await isRunActive(e.sessionId)?i:inactiveCommandResult(t);let a=logicalSessionToken(e);throw log.error(`failed to dispatch session command`,{command:t.kind,error:formatCapabilityError(n,[a,sessionInboxHookToken(a)])}),n}t.kind===`reset`&&await waitForSessionHooksRelease([sessionCommandHookToken(n.sessionId),logicalSessionToken(e)],{ownerRunId:n.runId,sessionId:n.sessionId});let i=activeCommandResult(t,n.sessionId);return i.status===`accepted`?{...i,inbox:r}:i}async function settleStrandedCommand(e,t,n){switch(t.kind){case`reset`:return{previousSessionId:await endStrandedSession(n,e,`reset`,t),status:`reset`};case`send`:case`clear`:throw sessionStrandedError(n);default:return inactiveCommandResult(t)}}async function assertFollowableSession(e){try{await Promise.all([assertRunnableSessionInbox(sessionInboxHookToken(sessionCommandHookToken(e))),assertSessionHistoryReadable(e)])}catch(e){throw e instanceof StrandedSessionOwnerError?sessionStrandedError(e):e}}function sessionStrandedError(e,t){let n=e.eveVersion===void 0?{}:{eveVersion:e.eveVersion};return new SessionStrandedError(n,describeStrandedSession(n,t))}function activeCommandResult(e,t){return e.kind===`reset`?{previousSessionId:t,status:`reset`}:e.kind===`send`&&e.delivery!==void 0?{sessionId:t,status:`accepted`,deliveryId:e.delivery.deliveryId}:{sessionId:t,status:`accepted`}}function inactiveCommandResult(e){return e.kind===`send`?{status:`session_not_active`}:e.kind===`cancel`?{status:`no_active_turn`}:{status:`no_active_session`}}async function dispatchWorkflowSessionCommand(e){let t={sessionId:e.sessionId,inbox:e.inbox},n=identifyCommand(e.command);try{return await dispatchWorkflowCommand(t,n)}catch(e){if(!(e instanceof StrandedSessionOwnerError))throw e;return await settleStrandedCommand(t,n,e)}}async function isRunActive(e){try{let t=await getRun(e).status;return t===`pending`||t===`running`}catch(e){if(isInactiveCommandTarget(e))return!1;throw e}}function isInactiveCommandTarget(e){if(e instanceof AcceptedSessionIdentityError)return!1;if(HookNotFoundError.is(e))return!0;for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t)||RunExpiredError.is(t)||EntityConflictError.is(t))return!0;return!1}async function resolveContinuation(e,t){let n;try{n=await resolveSessionInbox(e)}catch(t){if(HookNotFoundError.is(t))return;throw log.error(`failed to resolve session by continuation token`,{error:formatCapabilityError(t,[e])}),t}if(t?.runnable!==!0)return n;try{await assertRunnableSessionInbox(sessionInboxHookToken(sessionCommandHookToken(n.sessionId)))}catch(e){throw e instanceof StrandedSessionOwnerError?sessionStrandedError(e):e}return n}async function waitForCommandHookOwner(e){let t=await pollUntil(async()=>{try{return normalizeWorkflowHook(await getHookByToken(e))}catch(e){if(!HookNotFoundError.is(e))throw e;return}},SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(t===void 0)throw new HookNotFoundError(e);return t}async function waitForSessionInbox(e){let t=sessionInboxHookToken(sessionCommandHookToken(e)),n=await pollUntil(async()=>await findSessionHookHolder(t)!==void 0||!await hasRunEnded(e)&&void 0,SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(n===void 0)throw Error(`Session "${e}" did not start taking commands within ${SESSION_HOOK_HANDOVER_TIMEOUT_MS/1e3} seconds.`);return n}async function pollUntil(e,t){let n=Date.now()+t;for(let t=20;;t=Math.min(t*2,200)){let r=await e();if(r!==void 0||Date.now()>=n)return r;await new Promise(e=>setTimeout(e,t))}}async function hasRunEnded(e){try{let t=await getRun(e).status;return t!==`pending`&&t!==`running`}catch(e){for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t))return!1;if(isInactiveCommandTarget(e))return!0;throw e}}async function startWorkflowOnCurrentDeployment(e,t,n){return await startWorkflowOnDeployment(e,t,await resolveCurrentWorkflowDeploymentId(),n)}async function startWorkflowOnDeployment(e,t,n,r){return await withWorkflowStartContext(async()=>{if(n.length===0||n===`latest`)throw Error(`Workflow starts require an exact deployment id.`);return await start(e,t,{...r,allowReservedAttributes:!0,attributes:{...r?.attributes,[EVE_VERSION_ATTRIBUTE]:EVE_PACKAGE_INFO.version},deploymentId:n})})}async function resolveCurrentWorkflowDeploymentId(){let e=process.env.VERCEL_DEPLOYMENT_ID?.trim()||await(await getWorld()).getDeploymentId();if(e.length===0||e===`latest`)throw Error(`Workflow runtime could not resolve an exact deployment id.`);return e}async function withWorkflowStartContext(e){let t=context.active(),n=isAgentTraceContext(t)?trace.deleteSpan(t):t;return await context.with(n,e)}function normalizeWorkflowHook(e){if(typeof e!=`object`||!e||!(`runId`in e))throw Error(`Workflow hook did not include a run id.`);let t=e.runId;if(typeof t!=`string`||t.length===0)throw Error(`Workflow hook did not include a run id.`);return{runId:t}}function identifyCommand(e){if(e.kind!==`send`||e.delivery!==void 0)return e;let t=e.caller===void 0?e.schedule===void 0?`http`:`schedule`:`subagent`;return{...e,delivery:createChannelDeliveryMetadata({channelKind:t,channelName:t,requestId:e.requestId})}}export{connectionEventDeliveryWorkflowReference,connectionEventWorkflowReference,createWorkflowRuntime,dispatchWorkflowSessionCommand,hasRunEnded,pollUntil,resolveContinuation,sessionTimeoutWorkflowReference,startWorkflowOnCurrentDeployment,startWorkflowOnDeployment,waitForCommandHookOwner,waitForSessionInbox,workflowEntryReference,workflowToolRunWorkflowReference};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{openWork}from"#protocol/session-projection/selectors.js";import{streamText}from"ai";import{createLogger,logError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{takeCompactionCaptureFailure}from"#reactions/kinds/memory.js";import{addTokenUsage}from"#shared/token-usage-math.js";import{isUserModelMessage,validateHarnessModelMessages}from"#harness/messages.js";import{controlDeliveryFor}from"#harness/session-machine/transitions.js";import{
|
|
1
|
+
import{openWork}from"#protocol/session-projection/selectors.js";import{streamText}from"ai";import{createLogger,logError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{takeCompactionCaptureFailure}from"#reactions/kinds/memory.js";import{addTokenUsage}from"#shared/token-usage-math.js";import{isUserModelMessage,validateHarnessModelMessages}from"#harness/messages.js";import{controlDeliveryFor}from"#harness/session-machine/transitions.js";import{NO_USAGE,markUsageReported}from"#harness/session-usage.js";import{nextChangeId,nextRunId}from"#protocol/session-projection.js";import{contextStarted,controlAdmitted,deliveryApplied,fact,runRequested,runSettledFacts,runStarted,usageOf}from"#harness/facts.js";import{CompactionOverLimitError}from"#harness/compaction/over-limit-error.js";import{estimateTokens}from"#harness/token-estimate.js";import{compactMessages,getInputTokenCount,shouldCompact,withoutPromptMeasurement}from"#harness/compaction/engine.js";import{requireSessionModelReference}from"#harness/types.js";import{buildGatewayAttributionHeaders,resolveEffectiveRuntimeModel,withGatewayTraceContext}from"#harness/model-call/model.js";import{normalizeModelStreamError}from"#harness/model-call/errors.js";import{runModelCallWithRetries}from"#harness/model-call/retry.js";import{extractGatewayCostUsd,extractTokenUsageDelta,gatewayModelId}from"#harness/model-call/usage.js";import{resolveModelProfile}from"#harness/model-profile.js";import{resolveCallProviderOptions}from"#harness/provider-safety.js";const log=createLogger(`harness.tool-loop`);function assertFixedPartFits(e){let t=e.requestEnvelopeTokens+e.protectedTokens;if(t>=e.threshold)throw new CompactionOverLimitError(`The agent's system prompt, tools, memory and context take ~${Math.round(t)} tokens, over this model's ~${e.threshold}-token compaction limit. Shorten the instructions, remove tools or trim memory.`)}async function compactHistory(e){let{config:t}=e,{projection:n}=e.view(),r=controlDeliveryFor(e.view(),t.controlDelivery),{deliveryId:i}=r,a=nextChangeId(n);if(e.session.history.length===0)return await e.apply([controlAdmitted(r,`compact`),deliveryApplied(i)]),{next:null,session:e.session};let o=validateHarnessModelMessages(e.session.history);await e.apply([controlAdmitted(r,`compact`),contextStarted({cause:{deliveryId:i},changeId:a,kind:`compaction`})],o);let s=nextRunId(e.view().projection),c=`applied`;try{await e.apply([runRequested({changeId:a},s)],o);let n=await resolveEffectiveRuntimeModel({config:t,ctx:e.ctx,session:e.session});e.session=n.session;let r=e.session.agent.compactionModelReference??requireSessionModelReference(e.session);await e.publish(runStarted({attempt:0,modelId:r.id,runId:s}));let i=await maybeCompact({abortSignal:t.abortSignal,auth:e.ctx?.get(AuthKey)??null,betweenTurns:!0,change:{announced:!0,changeId:a,summaryRunId:s},ctx:e.ctx,emissionState:e.position(),force:!0,messages:[...e.session.history],model:n.model,publish:e.publish,view:()=>e.view().projection.view,requestEnvelopeTokens:e.session.compaction.requestEnvelopeTokens,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:e.session,prepareTelemetry:t=>e.instrumentation?.prepareAttempt({runId:t,attempt:0}).telemetry,traceContextHeaders:e.instrumentation?.gatewayTraceContextHeaders});if(e.session=i.session,i.failure!==void 0)throw i.failure.error}catch(t){c=`failed`;let n=summaryFailed(e.view().projection.view,{changeId:a,error:t});n.length>0&&await e.publish(n),logError(log,`manual session compaction failed`,t,{sessionId:e.session.sessionId})}let l=c===`failed`?`compaction-failed`:void 0;return await e.apply([fact(`delivery.settled`,{deliveryId:i,outcome:c,reason:l})]),{next:null,session:e.session}}function summaryUsageOf(e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.reduce((e,t)=>addTokenUsage(e,usageOf(t)),NO_USAGE)}function summaryFailed(e,t){if(e.changes[t.changeId]?.status!==`running`)return[];let n={code:`COMPACTION_FAILED`,message:toErrorMessage(t.error)},r=openWork(e,{changeId:t.changeId}).runs,{spent:i}=t;return[...r.flatMap(({runId:e})=>runSettledFacts({error:n,outcome:`failed`,runId:e,...i?.runId===e&&{usage:i.usage}})),{data:{changeId:t.changeId,error:n,kind:e.changes[t.changeId]?.kind??`compaction`,outcome:`failed`},type:`context.settled`}]}function replaceSessionHistory(e,t){return contextStorage.getStore()?.delete(HistoryStateKey),{...e,history:t,compaction:withoutPromptMeasurement(e.compaction)}}async function maybeCompact(e){try{return await compactOnce(e)}catch(t){let n=summaryFailed(e.view(),{changeId:e.change.changeId,error:t});throw n.length>0&&await e.publish(n),t}}async function compactOnce(e){let{emissionState:t,publish:n}=e,r=e.messages,i=e.session,a=e.promptMessages??r,o=validateHarnessModelMessages(a),s=e.force===!0||shouldCompact(o,i.compaction,e.requestEnvelopeTokens,i.compaction.requestEnvelopeTokens);if(!s)return{compacted:!1,messages:r,session:i};let c=requireSessionModelReference(i),l=i.agent.compactionModelReference??c,u=l===c?e.model:await e.resolveModel(l),d=resolveModelProfile(u),f=resolveCallProviderOptions({auth:e.auth,profile:d,providerOptions:l.providerOptions,session:i}),p={abortSignal:e.abortSignal,headers:buildGatewayAttributionHeaders(d,e.runtimeIdentity),model:withGatewayTraceContext(u,d,e.traceContextHeaders),providerOptions:f,telemetry:e.telemetry&&{...e.telemetry,functionId:`eve.compaction`}},m,h=[],{change:g}=e,_=g.announced===!0,summarize=async r=>{_||(_=!0,await n([runRequested({changeId:g.changeId},g.summaryRunId),runStarted({attempt:0,modelId:gatewayModelId(u)??`unknown`,runId:g.summaryRunId})]));let a=await runModelCallWithRetries(()=>streamCompactionSummary({...p,telemetry:m??p.telemetry,...r}),{sessionId:i.sessionId,turnId:t.turnId},e.abortSignal);if(h.push(a.usage),a.text.trim().length===0)throw Error(`The compaction model returned an empty summary. Finish reason: ${a.finishReason}.`);return a.text};if(g.announced!==!0){let t=getInputTokenCount(o,i.compaction,e.requestEnvelopeTokens,i.compaction.requestEnvelopeTokens);await n(contextStarted({cause:g.cause,changeId:g.changeId,kind:`compaction`,trigger:e.force===!0||t===null?void 0:{inputTokens:t},turnId:g.turnId}),o)}s&&(m=e.prepareTelemetry?.(g.summaryRunId));let v=validateHarnessModelMessages(r),y=e.requestEnvelopeTokens??0,b=Math.max(0,estimateTokens(o)-estimateTokens(v)),x={...i.compaction,threshold:Math.max(1,i.compaction.threshold-y-b),lastKnownInputTokens:i.compaction.lastKnownInputTokens===void 0?void 0:Math.max(0,i.compaction.lastKnownInputTokens-Math.min(i.compaction.requestEnvelopeTokens??0,y))},S=[...v],C=takeCompactionCaptureFailure(e.ctx),w=C===void 0?void 0:{error:C};try{s&&w===void 0&&(assertFixedPartFits({protectedTokens:b,requestEnvelopeTokens:y,threshold:i.compaction.threshold}),S=await compactMessages([...v],x,summarize,e.force===!0,e.requestEnvelopeTokens===void 0?void 0:Math.max(0,getInputTokenCount(o,i.compaction,y,i.compaction.requestEnvelopeTokens)-y-b)))}catch(e){w={error:e}}let T=s?summaryUsageOf(h):void 0;T!==void 0&&e.betweenTurns===!0&&(i=markUsageReported(i,T));let E=g.summaryRunId;if(w!==void 0)return await n(summaryFailed(e.view(),{changeId:g.changeId,error:w.error,...T!==void 0&&{spent:{runId:E,usage:T}}})),{compacted:!1,failure:w,messages:e.messages,session:i};r=validateHarnessModelMessages(S);{let e=h.length>0?runSettledFacts({finishReason:`stop`,outcome:`completed`,runId:E,usage:T}):_?runSettledFacts({outcome:`abandoned`,runId:E}):[];e.push({data:{changeId:g.changeId,kind:`compaction`,outcome:`completed`},type:`context.settled`}),await n(e,r)}return{compacted:!0,messages:r,session:replaceSessionHistory(i,r)}}function compactedTurnInput(e){return e.findLast(e=>isUserModelMessage(e)&&e.kind===`user`)}async function streamCompactionSummary(e){let t=streamText({...e,onError:()=>{}});for await(let e of t.fullStream)if(e.type===`error`)throw normalizeModelStreamError(e.error);let[n,r,i,a]=await Promise.all([t.text,t.finishReason,t.usage,t.providerMetadata]);return{finishReason:r,text:n,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(a),usage:i})}}export{assertFixedPartFits,compactHistory,compactedTurnInput,maybeCompact,replaceSessionHistory};
|
|
@@ -73,7 +73,9 @@ export declare class ModelCaller {
|
|
|
73
73
|
/**
|
|
74
74
|
* A failed compaction fails the step, whatever recovery the call attempted.
|
|
75
75
|
* One that left the history over the limit ends the session with its message;
|
|
76
|
-
* any other failure
|
|
76
|
+
* any other failure is reported like a failed model call, since its summary
|
|
77
|
+
* call already retried. Rethrowing would make the workflow replay the step and
|
|
78
|
+
* then end the session.
|
|
77
79
|
*/
|
|
78
80
|
failIfCompactionFailed(): Promise<StepResult | undefined>;
|
|
79
81
|
/** Steering interrupted the call: the step ends with what it committed, and runs again. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{modelCallErrorInfo,reportCompactionFailure}from"./failure.js";import{buildGatewayAttributionHeaders,withGatewayTraceContext}from"./model.js";import{isEmptyModelResponse,recoverModelCall,rethrowNoOutputAsEmptyResponse}from"./recovery.js";import{modelInstructions,requestMessages,withTrailingUserNote}from"./request.js";import{answerSkippedToolCalls,extractToolResultCallIds,withCallResults}from"./response.js";import{ALLOW_RETRY,STOP_RETRY,runModelCallWithRetries}from"./retry.js";import{withUniqueCallIds}from"./unique-call-ids.js";import{prepareModelTools}from"./tools.js";import{extractGatewayCostUsd,extractTokenUsageDelta}from"./usage.js";import{ToolLoopAgent,isStepCount}from"ai";import{createLogger,logError}from"#internal/logging.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{activeTurnId}from"#harness/session-machine/view.js";import{hydrateSandboxAttachments,moveToolResultFilesToUserMessages}from"#harness/attachment-staging.js";import{workingTaskIds}from"#execution/tasks/model-step.js";import{historyCallNames,toEntryStep,toEntryStream}from"#harness/execute-call.js";import{discardAttempt}from"#harness/session-machine/transitions.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{fact,usageOf}from"#harness/facts.js";import{nextChangeId,nextRunId}from"#protocol/session-projection.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{compactedTurnInput,maybeCompact}from"#harness/compaction/step.js";import{CompactionOverLimitError}from"#harness/compaction/over-limit-error.js";import{estimateTokens}from"#harness/token-estimate.js";import{withoutPromptMeasurement}from"#harness/compaction/engine.js";import{requireSessionModelReference}from"#harness/types.js";import{ContentFilteredModelResponseError,EmptyModelResponseError,ModelStreamStalledError}from"#harness/model-call/errors.js";import{resolveModelProfile}from"#harness/model-profile.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{NO_INLINE_CALLS,executeInlineCalls}from"#harness/call-executor.js";import{emitStreamContent}from"#harness/emission.js";import{estimateRequestEnvelope}from"#harness/request-envelope.js";import{compactPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";const environment=process.env.NODE_ENV??`unknown`,log=createLogger(`harness.tool-loop`),MODEL_OUTPUT_TIMEOUT_MS=6e5;var ModelCaller=class{profile;attributionHeaders;projectedMessages;turnMessages;request;modelMessages=[];requestEnvelopeTokens=0;interruptedUsage;compactionFailure;attemptIndex=0;started;acceptedOutput=!1;step;prompt;input;constructor(e,t,n){this.step=e,this.prompt=t,this.input=n,this.profile=resolveModelProfile(n.model,requireSessionModelReference(e.session).promptCache),this.attributionHeaders=buildGatewayAttributionHeaders(this.profile,e.config.runtimeIdentity),this.projectedMessages=n.projectedMessages,this.turnMessages=n.turnMessages,this.request=this.buildRequest()}async call(){let e={},t={policies:[()=>this.compactionFailure===void 0?ALLOW_RETRY:STOP_RETRY],onRetry:e=>this.prepareRetry(e),sessionId:this.step.session.sessionId,turnId:this.step.position().turnId};for(;;)try{return await runModelCallWithRetries(()=>this.attempt(e),t,this.input.generation.signal)}catch(n){if(this.compactionFailure!==void 0)throw this.compactionFailure.error;throwIfTurnAborted(this.step.config.abortSignal),this.input.generation.check();let r=recoverModelCall(n,e,t);if(r===void 0)throw n;await this.prepareRetry(n),e=r}}async prepareRetry(e){let{step:t}=this,n=t.position().runId,r=this.started;if(this.started=void 0,n!==void 0){if(this.acceptedOutput){await t.apply(discardAttempt(t.view(),{ending:`retried`,runId:n})),this.acceptedOutput=!1,await this.input.newRun();return}r!==void 0&&await t.apply([fact(`model.retried`,{attempt:r,error:modelCallErrorInfo(e),runId:n})])}}async failIfCompactionFailed(){if(this.compactionFailure===void 0)return;let{error:e}=this.compactionFailure;if(e instanceof CompactionOverLimitError)return reportCompactionFailure(this.step,e);throw e}async steered(){let{step:e}=this;throwIfTurnAborted(e.config.abortSignal),this.input.generation.end(),e.ctx?.set(HistoryStateKey,this.request.historyState);let t=e.position().runId;return t!==void 0&&await e.apply(discardAttempt(e.view(),{ending:`steered`,runId:t,usage:this.interruptedUsage===void 0?void 0:usageOf(this.interruptedUsage)})),{next:e.runStep,session:{...e.session,history:[...this.request.history]},steered:!0}}clearInterruptedUsage(){this.interruptedUsage=void 0}buildRequest(){return requestMessages(this.step,{catalog:this.input.catalog,messages:this.prompt.messages,pendingApprovalsNote:this.input.pendingApprovalsNote,projectedMessages:this.projectedMessages,turnMessages:this.turnMessages})}instructions(e){return modelInstructions({anthropicCache:this.profile.anthropicCache,extraSystemNote:e,session:this.step.session,systemMessages:this.request.systemMessages})}async prepare(e){let t=await prepareModelTools(this.step,{catalog:this.input.catalog,disabledProviderTools:e.disabledProviderTools,profile:this.profile});return this.request=this.buildRequest(),this.requestEnvelopeTokens=await estimateRequestEnvelope({history:this.projectedMessages,instructions:this.instructions(e.extraSystemNote),messages:withTrailingUserNote(this.request.nonSystemMessages,e.trailingUserNote),tools:t}),t}async compact(e,t){let{step:n,prompt:r}=this,{config:i}=n,a;try{let{projection:e}=n.view();if(a=await maybeCompact({abortSignal:i.abortSignal,auth:n.ctx?.get(AuthKey)??null,change:{changeId:nextChangeId(e),summaryRunId:nextRunId(e),turnId:n.position().turnId},ctx:n.ctx,emissionState:n.position(),messages:[...r.messages],model:this.input.model,promptMessages:withClientContext(r),publish:n.publish,view:()=>n.view().projection.view,requestEnvelopeTokens:this.requestEnvelopeTokens,resolveModel:i.resolveModel,runtimeIdentity:i.runtimeIdentity,session:n.session,prepareTelemetry:e=>n.instrumentation?.prepareAttempt({runId:e,attempt:0,turnId:activeTurnId(n.position())}).telemetry,traceContextHeaders:n.instrumentation?.gatewayTraceContextHeaders}),n.session=a.session,a.failure!==void 0)throw a.failure.error}catch(e){throw this.compactionFailure={error:e},e}if(!a.compacted)return t;compactPrompt(n,r,a.messages);let o=compactedTurnInput(r.messages);return this.turnMessages=o===void 0?this.input.turnMessages:[...this.input.turnMessages,o],n.session={...n.session,compaction:withoutPromptMeasurement(n.session.compaction)},this.projectedMessages=projectPrompt(r),await this.prepare(e)}async attempt(e){let{step:t}=this,{generation:n,model:r}=this.input,i=await this.compact(e,await this.prepare(e)),a=this.attemptIndex++;await this.input.startRun(a),this.started=a,this.requestEnvelopeTokens=Math.max(0,this.requestEnvelopeTokens-(estimateTokens(this.request.history)-estimateTokens(this.prompt.messages))),n.begin(),this.modelMessages=await hydrateSandboxAttachments(this.request.nonSystemMessages),this.profile.filesOutsideToolResults&&(this.modelMessages=moveToolResultFilesToUserMessages(this.modelMessages));let o=this.instructions(e.extraSystemNote),s=t.instrumentation?.resolveRuntimeContext({attempt:a,emissionState:t.position(),environment,modelInput:{instructions:o,messages:this.modelMessages},session:t.session})??{};e.retryReason&&(s[`eve.retry.reason`]=e.retryReason);let c=withTrailingUserNote(this.modelMessages,e.trailingUserNote),l=t.position(),u=t.instrumentation?.prepareAttempt({isFrameworkTool:e=>t.frameworkToolNames.has(e),runId:l.runId,attempt:a,runtimeContext:s,stepIndex:l.stepIndex,turnId:activeTurnId(l)}),d=buildStepHooks({auth:t.ctx?.get(AuthKey)??null,profile:this.profile,session:t.session}),f={headers:this.attributionHeaders,instructions:o,model:withUniqueCallIds(withGatewayTraceContext(r,this.profile,this.step.instrumentation?.gatewayTraceContextHeaders),[...Object.keys(t.view().projection.view.calls),...historyCallNames(c).keys()]),onLanguageModelCallEnd:e=>{n.interrupted||(this.interruptedUsage=extractTokenUsageDelta({costUsd:extractGatewayCostUsd(e.providerMetadata),usage:e.usage}))},onError(e){n.interrupted||summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:d.onStepEnd,onStepStart:d.onStepStart,prepareStep:d.prepareStep,reasoning:t.session.agent.modelReference?.reasoning??t.session.agent.reasoning,runtimeContext:s,stopWhen:isStepCount(1),telemetry:u?.telemetry,timeout:{chunkMs:MODEL_OUTPUT_TIMEOUT_MS,firstChunkMs:MODEL_OUTPUT_TIMEOUT_MS},tools:i},p=new ToolLoopAgent(f);try{return await this.stream(p,c,d.stepResult,u?.telemetry)}catch(e){if(n.check(),isAbortError(e)&&!n.signal.aborted)throw new ModelStreamStalledError({cause:e});return rethrowNoOutputAsEmptyResponse(e)}}async stream(e,t,n,r){let{step:i}=this,{catalog:a,generation:o}=this.input,s=new Set([REPLY_TOOL_NAME]),c=await e.stream({abortSignal:o.signal,messages:t}),{invalidInputToolCallIds:l,trailingInlineToolResultParts:u}=await emitStreamContent(async(e,t)=>{this.acceptedOutput=!0,await i.publish(e,t)},i.position(),toEntryStream(interruptStreamOnFailure(c.fullStream,o.signal),a.resolve),{excludedActionToolNames:s,held:i.finalReplyOnly&&workingTaskIds(i.session).length>0,finalReplyOnly:i.finalReplyOnly,tools:a,interruptSignal:o.signal});throwIfTurnAborted(i.config.abortSignal),o.check();let[d,f]=toEntryStep(...await Promise.all([n,c.responseMessages]),a.resolve);assertUsableResponse(d,f,{allowEmptyStop:!i.hasDelegatedCaller,hasInlineResults:u.length>0});let p=await this.runInlineCalls(d,t,{excludedCallIds:l,telemetry:r}),m=answerSkippedToolCalls(d,a,l);return await emitStepActions(i.publish,i.position(),d,m),withCallResults({answers:[...u,...m],calls:p,invalidInputToolCallIds:l,responseMessages:f,stepResult:d})}async runInlineCalls(e,t,n){let{finishReason:r}=e;if(r!==`stop`&&r!==`tool-calls`)return NO_INLINE_CALLS;let{step:i}=this,a=await executeInlineCalls({abortSignal:this.input.generation.signal,approvalMemory:this.input.approvalMemory,beforeExecute:()=>this.input.generation.protectToolExecution(),excludedCallIds:n.excludedCallIds??new Set,messages:t,modelCallId:e.callId,publish:i.publish,telemetry:n.telemetry,toolCalls:e.toolCalls??[],tools:this.input.catalog});return throwIfTurnAborted(i.config.abortSignal),a}};function assertUsableResponse(e,t,n){if(e.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(e.providerMetadata));if(!(n.allowEmptyStop&&e.finishReason===`stop`)&&isEmptyModelResponse(e)&&extractToolResultCallIds(t).size===0&&!n.hasInlineResults)throw new EmptyModelResponseError}function isAbortError(e){return e instanceof Error&&(e.name===`AbortError`||e.name===`TimeoutError`)}export{ModelCaller};
|
|
1
|
+
import{modelCallErrorInfo,reportCompactionFailure,reportModelCallFailure}from"./failure.js";import{buildGatewayAttributionHeaders,withGatewayTraceContext}from"./model.js";import{isEmptyModelResponse,recoverModelCall,rethrowNoOutputAsEmptyResponse}from"./recovery.js";import{modelInstructions,requestMessages,withTrailingUserNote}from"./request.js";import{answerSkippedToolCalls,extractToolResultCallIds,withCallResults}from"./response.js";import{ALLOW_RETRY,STOP_RETRY,runModelCallWithRetries}from"./retry.js";import{withUniqueCallIds}from"./unique-call-ids.js";import{prepareModelTools}from"./tools.js";import{extractGatewayCostUsd,extractTokenUsageDelta}from"./usage.js";import{ToolLoopAgent,isStepCount}from"ai";import{createLogger,logError}from"#internal/logging.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{activeTurnId}from"#harness/session-machine/view.js";import{hydrateSandboxAttachments,moveToolResultFilesToUserMessages}from"#harness/attachment-staging.js";import{workingTaskIds}from"#execution/tasks/model-step.js";import{historyCallNames,toEntryStep,toEntryStream}from"#harness/execute-call.js";import{discardAttempt}from"#harness/session-machine/transitions.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{nextChangeId,nextRunId}from"#protocol/session-projection.js";import{fact,usageOf}from"#harness/facts.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{compactedTurnInput,maybeCompact}from"#harness/compaction/step.js";import{CompactionOverLimitError}from"#harness/compaction/over-limit-error.js";import{estimateTokens}from"#harness/token-estimate.js";import{withoutPromptMeasurement}from"#harness/compaction/engine.js";import{requireSessionModelReference}from"#harness/types.js";import{ContentFilteredModelResponseError,EmptyModelResponseError,ModelStreamStalledError}from"#harness/model-call/errors.js";import{resolveModelProfile}from"#harness/model-profile.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{NO_INLINE_CALLS,executeInlineCalls}from"#harness/call-executor.js";import{emitStreamContent}from"#harness/emission.js";import{estimateRequestEnvelope}from"#harness/request-envelope.js";import{compactPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";const environment=process.env.NODE_ENV??`unknown`,log=createLogger(`harness.tool-loop`),MODEL_OUTPUT_TIMEOUT_MS=6e5;var ModelCaller=class{profile;attributionHeaders;projectedMessages;turnMessages;request;modelMessages=[];requestEnvelopeTokens=0;interruptedUsage;compactionFailure;attemptIndex=0;started;acceptedOutput=!1;step;prompt;input;constructor(e,t,n){this.step=e,this.prompt=t,this.input=n,this.profile=resolveModelProfile(n.model,requireSessionModelReference(e.session).promptCache),this.attributionHeaders=buildGatewayAttributionHeaders(this.profile,e.config.runtimeIdentity),this.projectedMessages=n.projectedMessages,this.turnMessages=n.turnMessages,this.request=this.buildRequest()}async call(){let e={},t={policies:[()=>this.compactionFailure===void 0?ALLOW_RETRY:STOP_RETRY],onRetry:e=>this.prepareRetry(e),sessionId:this.step.session.sessionId,turnId:this.step.position().turnId};for(;;)try{return await runModelCallWithRetries(()=>this.attempt(e),t,this.input.generation.signal)}catch(n){if(this.compactionFailure!==void 0)throw this.compactionFailure.error;throwIfTurnAborted(this.step.config.abortSignal),this.input.generation.check();let r=recoverModelCall(n,e,t);if(r===void 0)throw n;await this.prepareRetry(n),e=r}}async prepareRetry(e){let{step:t}=this,n=t.position().runId,r=this.started;if(this.started=void 0,n!==void 0){if(this.acceptedOutput){await t.apply(discardAttempt(t.view(),{ending:`retried`,runId:n})),this.acceptedOutput=!1,await this.input.newRun();return}r!==void 0&&await t.apply([fact(`model.retried`,{attempt:r,error:modelCallErrorInfo(e),runId:n})])}}async failIfCompactionFailed(){if(this.compactionFailure===void 0)return;let{error:e}=this.compactionFailure;return e instanceof CompactionOverLimitError?reportCompactionFailure(this.step,e):reportModelCallFailure(this.step,e)}async steered(){let{step:e}=this;throwIfTurnAborted(e.config.abortSignal),this.input.generation.end(),e.ctx?.set(HistoryStateKey,this.request.historyState);let t=e.position().runId;return t!==void 0&&await e.apply(discardAttempt(e.view(),{ending:`steered`,runId:t,usage:this.interruptedUsage===void 0?void 0:usageOf(this.interruptedUsage)})),{next:e.runStep,session:{...e.session,history:[...this.request.history]},steered:!0}}clearInterruptedUsage(){this.interruptedUsage=void 0}buildRequest(){return requestMessages(this.step,{catalog:this.input.catalog,messages:this.prompt.messages,pendingApprovalsNote:this.input.pendingApprovalsNote,projectedMessages:this.projectedMessages,turnMessages:this.turnMessages})}instructions(e){return modelInstructions({anthropicCache:this.profile.anthropicCache,extraSystemNote:e,session:this.step.session,systemMessages:this.request.systemMessages})}async prepare(e){let t=await prepareModelTools(this.step,{catalog:this.input.catalog,disabledProviderTools:e.disabledProviderTools,profile:this.profile});return this.request=this.buildRequest(),this.requestEnvelopeTokens=await estimateRequestEnvelope({history:this.projectedMessages,instructions:this.instructions(e.extraSystemNote),messages:withTrailingUserNote(this.request.nonSystemMessages,e.trailingUserNote),tools:t}),t}async compact(e,t){let{step:n,prompt:r}=this,{config:i}=n,a;try{let{projection:e}=n.view();if(a=await maybeCompact({abortSignal:i.abortSignal,auth:n.ctx?.get(AuthKey)??null,change:{changeId:nextChangeId(e),summaryRunId:nextRunId(e),turnId:n.position().turnId},ctx:n.ctx,emissionState:n.position(),messages:[...r.messages],model:this.input.model,promptMessages:withClientContext(r),publish:n.publish,view:()=>n.view().projection.view,requestEnvelopeTokens:this.requestEnvelopeTokens,resolveModel:i.resolveModel,runtimeIdentity:i.runtimeIdentity,session:n.session,prepareTelemetry:e=>n.instrumentation?.prepareAttempt({runId:e,attempt:0,turnId:activeTurnId(n.position())}).telemetry,traceContextHeaders:n.instrumentation?.gatewayTraceContextHeaders}),n.session=a.session,a.failure!==void 0)throw a.failure.error}catch(e){throw this.compactionFailure={error:e},e}if(!a.compacted)return t;compactPrompt(n,r,a.messages);let o=compactedTurnInput(r.messages);return this.turnMessages=o===void 0?this.input.turnMessages:[...this.input.turnMessages,o],n.session={...n.session,compaction:withoutPromptMeasurement(n.session.compaction)},this.projectedMessages=projectPrompt(r),await this.prepare(e)}async attempt(e){let{step:t}=this,{generation:n,model:r}=this.input,i=await this.compact(e,await this.prepare(e)),a=this.attemptIndex++;await this.input.startRun(a),this.started=a,this.requestEnvelopeTokens=Math.max(0,this.requestEnvelopeTokens-(estimateTokens(this.request.history)-estimateTokens(this.prompt.messages))),n.begin(),this.modelMessages=await hydrateSandboxAttachments(this.request.nonSystemMessages),this.profile.filesOutsideToolResults&&(this.modelMessages=moveToolResultFilesToUserMessages(this.modelMessages));let o=this.instructions(e.extraSystemNote),s=t.instrumentation?.resolveRuntimeContext({attempt:a,emissionState:t.position(),environment,modelInput:{instructions:o,messages:this.modelMessages},session:t.session})??{};e.retryReason&&(s[`eve.retry.reason`]=e.retryReason);let c=withTrailingUserNote(this.modelMessages,e.trailingUserNote),l=t.position(),u=t.instrumentation?.prepareAttempt({isFrameworkTool:e=>t.frameworkToolNames.has(e),runId:l.runId,attempt:a,runtimeContext:s,stepIndex:l.stepIndex,turnId:activeTurnId(l)}),d=buildStepHooks({auth:t.ctx?.get(AuthKey)??null,profile:this.profile,session:t.session}),f={headers:this.attributionHeaders,instructions:o,model:withUniqueCallIds(withGatewayTraceContext(r,this.profile,this.step.instrumentation?.gatewayTraceContextHeaders),[...Object.keys(t.view().projection.view.calls),...historyCallNames(c).keys()]),onLanguageModelCallEnd:e=>{n.interrupted||(this.interruptedUsage=extractTokenUsageDelta({costUsd:extractGatewayCostUsd(e.providerMetadata),usage:e.usage}))},onError(e){n.interrupted||summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:d.onStepEnd,onStepStart:d.onStepStart,prepareStep:d.prepareStep,reasoning:t.session.agent.modelReference?.reasoning??t.session.agent.reasoning,runtimeContext:s,stopWhen:isStepCount(1),telemetry:u?.telemetry,timeout:{chunkMs:MODEL_OUTPUT_TIMEOUT_MS,firstChunkMs:MODEL_OUTPUT_TIMEOUT_MS},tools:i},p=new ToolLoopAgent(f);try{return await this.stream(p,c,d.stepResult,u?.telemetry)}catch(e){if(n.check(),isAbortError(e)&&!n.signal.aborted)throw new ModelStreamStalledError({cause:e});return rethrowNoOutputAsEmptyResponse(e)}}async stream(e,t,n,r){let{step:i}=this,{catalog:a,generation:o}=this.input,s=new Set([REPLY_TOOL_NAME]),c=await e.stream({abortSignal:o.signal,messages:t}),{invalidInputToolCallIds:l,trailingInlineToolResultParts:u}=await emitStreamContent(async(e,t)=>{this.acceptedOutput=!0,await i.publish(e,t)},i.position(),toEntryStream(interruptStreamOnFailure(c.fullStream,o.signal),a.resolve),{excludedActionToolNames:s,held:i.finalReplyOnly&&workingTaskIds(i.session).length>0,finalReplyOnly:i.finalReplyOnly,tools:a,interruptSignal:o.signal});throwIfTurnAborted(i.config.abortSignal),o.check();let[d,f]=toEntryStep(...await Promise.all([n,c.responseMessages]),a.resolve);assertUsableResponse(d,f,{allowEmptyStop:!i.hasDelegatedCaller,hasInlineResults:u.length>0});let p=await this.runInlineCalls(d,t,{excludedCallIds:l,telemetry:r}),m=answerSkippedToolCalls(d,a,l);return await emitStepActions(i.publish,i.position(),d,m),withCallResults({answers:[...u,...m],calls:p,invalidInputToolCallIds:l,responseMessages:f,stepResult:d})}async runInlineCalls(e,t,n){let{finishReason:r}=e;if(r!==`stop`&&r!==`tool-calls`)return NO_INLINE_CALLS;let{step:i}=this,a=await executeInlineCalls({abortSignal:this.input.generation.signal,approvalMemory:this.input.approvalMemory,beforeExecute:()=>this.input.generation.protectToolExecution(),excludedCallIds:n.excludedCallIds??new Set,messages:t,modelCallId:e.callId,publish:i.publish,telemetry:n.telemetry,toolCalls:e.toolCalls??[],tools:this.input.catalog});return throwIfTurnAborted(i.config.abortSignal),a}};function assertUsableResponse(e,t,n){if(e.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(e.providerMetadata));if(!(n.allowEmptyStop&&e.finishReason===`stop`)&&isEmptyModelResponse(e)&&extractToolResultCallIds(t).size===0&&!n.hasInlineResults)throw new EmptyModelResponseError}function isAbortError(e){return e instanceof Error&&(e.name===`AbortError`||e.name===`TimeoutError`)}export{ModelCaller};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{reportModelCallFailure}from"./failure.js";import{resolveEffectiveRuntimeModel}from"./model.js";import{endsTurnTools,frameworkToolNames}from"./tools.js";import{recordModelUsage}from"./usage.js";import{ModelCaller}from"./call.js";import{HistoryStateKey}from"#context/keys.js";import{activeTurnId}from"#harness/session-machine/view.js";import{enforceBudget,humanInputContext}from"#harness/hitl/index.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{
|
|
1
|
+
import{reportModelCallFailure}from"./failure.js";import{resolveEffectiveRuntimeModel}from"./model.js";import{endsTurnTools,frameworkToolNames}from"./tools.js";import{recordModelUsage}from"./usage.js";import{ModelCaller}from"./call.js";import{HistoryStateKey}from"#context/keys.js";import{activeTurnId}from"#harness/session-machine/view.js";import{enforceBudget,humanInputContext}from"#harness/hitl/index.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{nextRunId}from"#protocol/session-projection.js";import{runRequested,runStarted}from"#harness/facts.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{requireSessionModelReference}from"#harness/types.js";import{buildStepCatalog,recordOfferedCatalogTools}from"#execution/catalog/step-catalog.js";import{buildPrompt,previewPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{handleStepResult}from"#harness/step/after-model.js";import{failBoundaryEvent,failModelSelection,prepareModelCall}from"#harness/step/context.js";async function runModelStep(e,t){let{generation:n}=t,r=await prepareModelCall(e,previewPrompt(e,t.turn));if(r!==void 0)return r;let i=await buildPrompt(e,t.turn),a=await enforceBudget(e,i.messages);if(a!==void 0)return a;let o=await requestRun(e,i);if(`failed`in o)return o.failed;let s=projectPrompt(i),c=!e.hasDelegatedCaller&&e.session.outputSchema===void 0,l=buildStepCatalog({agentTools:e.config.tools,ctx:e.ctx,endsTurn:c,session:e.session});recordOfferedCatalogTools(e.ctx,l),e.frameworkToolNames=frameworkToolNames(l);let{approvalMemory:u,pendingApprovalsNote:d}=humanInputContext(e),f=new ModelCaller(e,i,{approvalMemory:u,catalog:l,generation:n,model:o.model,newRun:async()=>{if(`failed`in await requestRun(e,i))throw Error(`The model run's replacement found no model.`)},startRun:async t=>await startRun(e,t),pendingApprovalsNote:d,projectedMessages:s,turnMessages:t.turn.messages}),p;try{p=await f.call()}catch(t){throwIfTurnAborted(e.config.abortSignal);let r=await f.failIfCompactionFailed();return r===void 0?n.interrupted?f.steered():reportModelCallFailure(e,t):r}await recordModelUsage(e,{model:o.model}),f.clearInterruptedUsage();let m;try{n.check(),m=await handleStepResult(e,{catalog:l,durableModelPromptMessageCount:i.clientContext===void 0||i.clientContext.messages.length===0?f.modelMessages.length:void 0,endsTurnTools:endsTurnTools(l,c),promptMessages:f.request.history,requestEnvelopeTokens:f.requestEnvelopeTokens,result:p})}catch(t){if(throwIfTurnAborted(e.config.abortSignal),n.interrupted)return f.steered();throw t}return e.ctx?.set(HistoryStateKey,f.request.historyState),m}async function requestRun(e,t){let{config:n,ctx:r}=e;try{await e.apply([runRequested({turnId:activeTurnId(e.position())},nextRunId(e.view().projection))],validateHarnessModelMessages(withClientContext(t)))}catch(t){return{failed:await failBoundaryEvent(e,t)}}try{let t=await resolveEffectiveRuntimeModel({config:n,ctx:r,session:e.session});return e.session=t.session,{model:t.model}}catch(t){return{failed:await failModelSelection(e,t)}}}async function startRun(e,t){let n=e.position().runId;if(n===void 0)return;let r=requireSessionModelReference(e.session).id;await e.apply([runStarted({attempt:t,modelId:r,runId:n})])}export{runModelStep};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{allOf,anyOf,messageMatches,nameIs,typeIs}from"../rule.js";const GATEWAY_AUTH_FAILURE_SUMMARY_NAME=`AI Gateway authentication failed`,gatewayAuthenticationFailure=anyOf(nameIs(`GatewayAuthenticationError`),typeIs(`authentication_error`),messageMatches(/AI Gateway authentication/i)),GATEWAY_RULES=[{id:`gateway-billing-required`,name:`AI Gateway billing setup required`,tags:[`gateway`,`config`,`recoverable`],when:messageMatches(/AI Gateway requires a valid credit card on file/),message:e=>e.message,hint:`Add a valid credit card or credits in the Vercel dashboard, then retry.`},{id:`gateway-credit-exhausted`,name:`AI Gateway credit balance exhausted`,tags:[`gateway`,`config`,`recoverable`],when:anyOf(typeIs(`insufficient_funds`),messageMatches(/A positive credit balance is required/i)),message:`AI Gateway requires a positive credit balance to process requests.`,hint:`Add credits in the Vercel dashboard, then retry.`},{id:`gateway-budget-exhausted`,name:`AI Gateway project budget exceeded`,tags:[`gateway`,`config`,`recoverable`],when:anyOf(typeIs(`quota_for_entity_exceeded`),messageMatches(/Project budget exceeded/i)),message:`The AI Gateway project budget has been exceeded.`,hint:`Ask your administrator to increase the project budget, then retry.`},{id:`gateway-free-tier-model-restricted`,name:`Model unavailable on AI Gateway free tier`,tags:[`gateway`,`config`,`recoverable`],when:messageMatches(/Free tier users do not have access to this model/),message:e=>e.message,hint:`Switch to a model available on the free tier or upgrade your Vercel plan, then retry.`},{id:`gateway-free-tier-rate-limited`,name:`AI Gateway free tier rate limit exceeded`,tags:[`gateway`,`recoverable`],when:messageMatches(/Free tier requests on this model are rate-limited/),message:e=>e.message,hint:`Wait for the free-tier limit to reset or upgrade your Vercel plan, then retry.`},{id:`gateway-auth-invalid-api-key`,name:GATEWAY_AUTH_FAILURE_SUMMARY_NAME,tags:[`gateway`,`config`],when:allOf(gatewayAuthenticationFailure,messageMatches(/Invalid API key/i)),message:`AI Gateway rejected the provided API key.`,hint:"Update or unset `AI_GATEWAY_API_KEY` (check your shell profile if you did not set it for this project) — manage keys at https://vercel.com/dashboard/ai/api-keys. Unsetting it falls back to OIDC via `eve link`."},{id:`gateway-auth-invalid-oidc-token`,name:GATEWAY_AUTH_FAILURE_SUMMARY_NAME,tags:[`gateway`,`config`],when:allOf(gatewayAuthenticationFailure,messageMatches(/Invalid OIDC token/i)),message:`AI Gateway rejected the OIDC token.`,hint:"Run `eve link` to refresh `VERCEL_OIDC_TOKEN` in `.env.local`, or set `AI_GATEWAY_API_KEY` — create a key at https://vercel.com/dashboard/ai/api-keys."},{id:`gateway-auth-missing-credentials`,name:GATEWAY_AUTH_FAILURE_SUMMARY_NAME,tags:[`gateway`,`config`],when:gatewayAuthenticationFailure,message:`AI Gateway received no credentials.`,hint:"Run `eve link` to populate `VERCEL_OIDC_TOKEN`, or set `AI_GATEWAY_API_KEY` — create a key at https://vercel.com/dashboard/ai/api-keys."},{id:`model-not-found`,name:`Model not found`,tags:[`gateway`,`config`],when:anyOf(nameIs(`GatewayModelNotFoundError`,`AI_NoSuchModelError`),typeIs(`model_not_found`)),message:`The requested model is not available.`,hint:"Check the model id in `agent.ts` (`model:`) or switch models with `/model` in `eve dev` — browse available models at https://vercel.com/ai-gateway/models."},{id:`gateway-rate-limited`,name:`AI Gateway rate limit exceeded`,tags:[`gateway`,`transient`],when:anyOf(nameIs(`GatewayRateLimitError`),typeIs(`rate_limit_exceeded`)),message:`AI Gateway rate-limited the request.`,hint:`Retries are automatic; if it persists, reduce request volume or review your plan limits at https://vercel.com/ai-gateway.`},{id:`gateway-upstream-unavailable`,name:`Model provider unavailable`,tags:[`gateway`,`transient`],when:anyOf(nameIs(`GatewayTimeoutError`),typeIs(`timeout_error`,`overloaded_error`)),message:`The model provider is overloaded or timing out upstream of AI Gateway.`,hint:"This is transient — retry shortly, or switch models with `/model` in `eve dev`."}];export{GATEWAY_RULES};
|
|
1
|
+
import{allOf,anyOf,messageMatches,nameIs,typeIs}from"../rule.js";const GATEWAY_AUTH_FAILURE_SUMMARY_NAME=`AI Gateway authentication failed`,gatewayAuthenticationFailure=anyOf(nameIs(`GatewayAuthenticationError`),typeIs(`authentication_error`),messageMatches(/AI Gateway authentication/i)),GATEWAY_RULES=[{id:`gateway-billing-required`,name:`AI Gateway billing setup required`,tags:[`gateway`,`config`,`recoverable`],when:messageMatches(/AI Gateway requires a valid credit card on file/),message:e=>e.message,hint:`Add a valid credit card or credits in the Vercel dashboard, then retry.`},{id:`gateway-credit-check-throttled`,name:`AI Gateway credit check throttled`,tags:[`gateway`,`transient`],when:messageMatches(/credit balance verification is temporarily throttled/i),message:`AI Gateway temporarily throttled its credit balance check.`,hint:`Retries are automatic; if it persists, wait a moment and retry.`},{id:`gateway-credit-exhausted`,name:`AI Gateway credit balance exhausted`,tags:[`gateway`,`config`,`recoverable`],when:anyOf(typeIs(`insufficient_funds`),messageMatches(/A positive credit balance is required/i)),message:`AI Gateway requires a positive credit balance to process requests.`,hint:`Add credits in the Vercel dashboard, then retry.`},{id:`gateway-budget-exhausted`,name:`AI Gateway project budget exceeded`,tags:[`gateway`,`config`,`recoverable`],when:anyOf(typeIs(`quota_for_entity_exceeded`),messageMatches(/Project budget exceeded/i)),message:`The AI Gateway project budget has been exceeded.`,hint:`Ask your administrator to increase the project budget, then retry.`},{id:`gateway-free-tier-model-restricted`,name:`Model unavailable on AI Gateway free tier`,tags:[`gateway`,`config`,`recoverable`],when:messageMatches(/Free tier users do not have access to this model/),message:e=>e.message,hint:`Switch to a model available on the free tier or upgrade your Vercel plan, then retry.`},{id:`gateway-free-tier-rate-limited`,name:`AI Gateway free tier rate limit exceeded`,tags:[`gateway`,`recoverable`],when:messageMatches(/Free tier requests on this model are rate-limited/),message:e=>e.message,hint:`Wait for the free-tier limit to reset or upgrade your Vercel plan, then retry.`},{id:`gateway-auth-invalid-api-key`,name:GATEWAY_AUTH_FAILURE_SUMMARY_NAME,tags:[`gateway`,`config`],when:allOf(gatewayAuthenticationFailure,messageMatches(/Invalid API key/i)),message:`AI Gateway rejected the provided API key.`,hint:"Update or unset `AI_GATEWAY_API_KEY` (check your shell profile if you did not set it for this project) — manage keys at https://vercel.com/dashboard/ai/api-keys. Unsetting it falls back to OIDC via `eve link`."},{id:`gateway-auth-invalid-oidc-token`,name:GATEWAY_AUTH_FAILURE_SUMMARY_NAME,tags:[`gateway`,`config`],when:allOf(gatewayAuthenticationFailure,messageMatches(/Invalid OIDC token/i)),message:`AI Gateway rejected the OIDC token.`,hint:"Run `eve link` to refresh `VERCEL_OIDC_TOKEN` in `.env.local`, or set `AI_GATEWAY_API_KEY` — create a key at https://vercel.com/dashboard/ai/api-keys."},{id:`gateway-auth-missing-credentials`,name:GATEWAY_AUTH_FAILURE_SUMMARY_NAME,tags:[`gateway`,`config`],when:gatewayAuthenticationFailure,message:`AI Gateway received no credentials.`,hint:"Run `eve link` to populate `VERCEL_OIDC_TOKEN`, or set `AI_GATEWAY_API_KEY` — create a key at https://vercel.com/dashboard/ai/api-keys."},{id:`model-not-found`,name:`Model not found`,tags:[`gateway`,`config`],when:anyOf(nameIs(`GatewayModelNotFoundError`,`AI_NoSuchModelError`),typeIs(`model_not_found`)),message:`The requested model is not available.`,hint:"Check the model id in `agent.ts` (`model:`) or switch models with `/model` in `eve dev` — browse available models at https://vercel.com/ai-gateway/models."},{id:`gateway-rate-limited`,name:`AI Gateway rate limit exceeded`,tags:[`gateway`,`transient`],when:anyOf(nameIs(`GatewayRateLimitError`),typeIs(`rate_limit_exceeded`)),message:`AI Gateway rate-limited the request.`,hint:`Retries are automatic; if it persists, reduce request volume or review your plan limits at https://vercel.com/ai-gateway.`},{id:`gateway-upstream-unavailable`,name:`Model provider unavailable`,tags:[`gateway`,`transient`],when:anyOf(nameIs(`GatewayTimeoutError`),typeIs(`timeout_error`,`overloaded_error`)),message:`The model provider is overloaded or timing out upstream of AI Gateway.`,hint:"This is transient — retry shortly, or switch models with `/model` in `eve dev`."}];export{GATEWAY_RULES};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{activeTurnId,answeredCallIds,turnPosition}from"./view.js";import{isComplete,stepCallIds,suspend,withResult,withoutResults}from"./suspended-steps.js";import{activeTurn,interactionOwner}from"#protocol/session-projection/selectors.js";import{isOpen}from"#protocol/session-projection/tree.js";import{callSettledFrom}from"#harness/call-facts.js";import{contextStarted,controlAdmitted,defined,delegatedUsageFact,deliveryApplied,errorInfoOf,fact,runSettledFacts,sessionEndedFacts,turnSettled}from"#harness/facts.js";import{activeTurnIdOf,nextChangeId,openRunOf}from"#protocol/session-projection.js";import{closeUnder}from"#harness/session-machine/cascade.js";import{interruptedCallResult}from"#harness/interrupted-attempt.js";import{interactionSettled,responseAdmitted,responseSettled,responseSubmitted,signInInteractionId}from"#harness/interaction-facts.js";import{signInAttemptKey}from"#harness/hitl/sign-ins.js";const unchanged=(e,t)=>({events:t,turn:e.turn});function followedTurn(e){let t=e.view.selection;return t===null?null:t?.turnId??e.view.session.latestTurnId??null}function waitingDeliveries(e,t){return t.filter(({deliveryId:t})=>e.view?.deliveries[t]?.status===`admitted`)}function consumed(e,t){return fact(`delivery.consumed`,{deliveryId:e.deliveryId,history:(e.history?.length??0)>0?e.history:void 0,parts:e.parts,turnId:t})}function receive(e,t){let{projection:n}=e,r=turnPosition(n),i=activeTurnId(r),a=waitingDeliveries(n,t.deliveries??[]),o=a[0],s=o===void 0?t.cause??{policy:`system`}:{deliveryId:o.deliveryId},{parent:c,predecessor:l,runtime:u,trace:d}=t,f=[];return r.sessionStarted||f.push(fact(`session.started`,{parent:c,predecessor:l,runtime:u,trace:d})),r.turnId===``&&f.push(fact(`turn.started`,{cause:s,follows:followedTurn(n),trace:d,turnId:i})),f.push(...a.map(e=>consumed(e,i))),unchanged(e,f)}function join(e,t){let{projection:n}=e,r=waitingDeliveries(n,t.deliveries),i=activeTurnIdOf(n);return unchanged(e,i===void 0?r.map(({deliveryId:e})=>deliveryApplied(e)):r.map(e=>consumed(e,i)))}function fail(e,t){let n=e.turn.suspended.filter(e=>(e.approved?.length??0)>0),r=errorInfoOf(t),i=activeTurnIdOf(e.projection),a=i===void 0?void 0:openRunOf(e.projection,i),o=[...a===void 0?[]:runSettledFacts({runId:a,outcome:`failed`,error:r}),...t.terminal===void 0?turnSettled(e.projection,{error:r,outcome:`failed`}):sessionEndedFacts(e.projection,{cause:i===void 0?void 0:{turnId:i},error:r,outcome:`failed`})];return{...commitSteps(e.turn,n,cancelledTranscript),events:o}}function settle(e,t){let n=[],r=[...e.turn.suspended];for(let{part:i,result:a,usage:o}of t.results){let t=r.findIndex(e=>stepCallIds(e).has(i.toolCallId)),s=r[t];if(s===void 0)continue;r[t]=withoutApproved({...s,messages:withResult(s.messages,i)},new Set([i.toolCallId]));let c=a===void 0?void 0:e.projection.view.calls[a.callId];a!==void 0&&c!==void 0&&c.taskId===void 0&&c.status!==`settled`&&(n.push(callSettledFrom(a)),o!==void 0&&n.push(delegatedUsageFact(a.callId,o)))}let i=r.filter(isComplete);return{...commitSteps({...e.turn,suspended:r},i),events:n}}function discardAttempt(e,t){let n=e.projection.view,r={family:`run`,id:t.runId},i=t.ending===`steered`?closeUnder(n,r,`steered`):[];if(!isOpen(n,r))return unchanged(e,i);let a=t.ending===`retried`?{outcome:`abandoned`,runId:t.runId,usage:t.usage}:{finishReason:`other`,outcome:`completed`,runId:t.runId,usage:t.usage};return unchanged(e,[...i,...runSettledFacts(a)])}function suspendStep(e,t){return{events:[],turn:suspend(e.turn,{...t,requests:[]})}}function withoutApproved(e,t){if(e.approved===void 0)return e;let n=e.approved.filter(e=>!t.has(e.call.callId));if(n.length===e.approved.length)return e;let{approved:r,...i}=e;return n.length===0?i:{...i,approved:n}}function runnableCalls(e,t){let n=new Set(e.signIns.map(signInAttemptKey));return(t.approved??[]).filter(e=>(e.signIns??[]).every(e=>!n.has(signInAttemptKey(e))))}function startTask(e,t,n){let r=[];return(n?.has(t.taskId)??e.projection.view.tasks[t.taskId]!==void 0)||(n?.add(t.taskId),r.push({type:`task.started`,data:{taskId:t.taskId,kind:t.kind,name:t.name,startedBy:{callId:t.callId}}})),r.push({type:`call.started`,data:defined({callId:t.callId,taskId:t.taskId,clearedBy:t.clearedBy})}),unchanged(e,r)}function settleTask(e,t){let{outcome:n}=t,r=n.status===`completed`?n.output:void 0,i=t.calls[0]?.callId,a=t.calls.map(({callId:e},t)=>fact(`call.settled`,{callId:e,error:n.status===`failed`?{code:`TASK_FAILED`,message:n.error}:void 0,outcome:n.status===`cancelled`?`interrupted`:n.status,output:t===0?r:void 0,outputOf:t>0&&r!==void 0&&i!==void 0?{callId:i}:void 0,reason:n.status===`cancelled`?n.reason??`task-cancelled`:void 0}));return unchanged(e,a)}function endTask(e,t){let n=e.projection.view.tasks[t.taskId];if(n===void 0||n.status===`ended`)return unchanged(e,[]);let{outcome:r}=t;return unchanged(e,[fact(`task.ended`,{error:r.status===`failed`?{code:`TASK_FAILED`,message:r.error}:void 0,outcome:r.status,reason:r.status===`cancelled`?r.reason??`task-ended`:void 0,taskId:t.taskId})])}function finishRun(e,t){let n=new Set(t.requestIds),r=e.projection.view,i=Object.values(r.interactions).filter(e=>e.status===`open`&&(n.has(e.interactionId)||t.taskId!==void 0&&interactionOwner(r,e).taskId===t.taskId));return unchanged(e,i.map(e=>withdrawInteraction(e.interactionId,`asker-ended`)))}function withdrawInteraction(e,t,n=`withdrawn`){return interactionSettled(e,n,{reason:t})}function relay(e,t){let{payload:n}=t,r=e.projection.view,i=n.route===void 0?void 0:{...n.route,...t.workflowAsk!==void 0&&{workflowAsk:t.workflowAsk},...t.runId!==void 0&&{runId:t.runId}},a=[],o={};for(let e of n.events){let t=e.data.interactionId,s=r.interactions[t];if(e.type===`interaction.opened`||s?.origin!==void 0&&`callId`in s.subject&&s.subject.callId===n.callId)switch(e.type){case`interaction.opened`:if(s!==void 0)break;a.push({data:{...e.data,origin:e.data.origin??{interactionId:t,sessionId:n.childSessionId},subject:{callId:n.callId}},type:`interaction.opened`}),i!==void 0&&e.data.request.kind!==`sign-in`&&(o[t]=i);break;case`interaction.settled`:if(s?.status!==`open`)break;a.push(...mirrorSettled(r,e.data));break;case`response.admitted`:{let t=s===void 0?void 0:forwardedAnswer(r,e.data);t!==void 0&&r.responses[t]?.status===`submitted`&&a.push(responseAdmitted(t));break}case`response.settled`:{let t=s===void 0?void 0:forwardedAnswer(r,e.data);t!==void 0&&e.data.outcome!==`applied`&&a.push(responseSettled(t,e.data.outcome,e.data.reason));break}}}return Object.keys(o).length>0?{...unchanged(e,a),relays:o}:unchanged(e,a)}function mirrorSettled(e,t){let n=Object.values(e.responses).filter(e=>e.interactionId===t.interactionId&&e.status!==`settled`).sort((e,t)=>e.introducedAt-t.introducedAt),r=t.outcome===`accepted`||t.outcome===`declined`||t.outcome===`invalid`?n.at(-1):void 0,i=r===void 0?[]:[responseSettled(r.responseId,`applied`,t.reason)],a=r===void 0?t.cause:{responseId:r.responseId};return i.push(fact(`interaction.settled`,{...t,cause:a})),i}function forwardedAnswer(e,t){let n=Object.values(e.responses).filter(e=>e.interactionId===t.interactionId&&e.status!==`settled`).sort((e,t)=>e.introducedAt-t.introducedAt);return(n.find(e=>t.deliveryId!==void 0&&e.deliveryId===t.deliveryId)??n.at(-1))?.responseId}function routeAnswer(e,t){let n=e.projection.view,r=[],i=new Set;for(let e of t.deliveries){if(n.deliveries[e.deliveryId]!==void 0||i.has(e.deliveryId))continue;i.add(e.deliveryId);let{deliveryId:t,principal:a,source:o}=e;r.push(fact(`delivery.admitted`,{deliveryId:t,principal:a,source:o})),e.consumed!==void 0&&r.push(consumed({deliveryId:t,parts:e.consumed.parts},e.consumed.turnId))}let known=e=>i.has(e)||n.deliveries[e]!==void 0,a=new Map;for(let e of t.forwarded)n.responses[e.responseId]===void 0&&n.interactions[e.interactionId]?.status===`open`&&known(e.deliveryId)&&(a.set(e.responseId,e),r.push(responseSubmitted(e)));for(let{answer:e,outcome:i}of t.decided){let t=n.interactions[e.interactionId];if(t?.status!==`open`)continue;let o=[...Object.values(n.responses).filter(e=>e.interactionId===t.interactionId&&e.status!==`settled`).map(e=>e.responseId),...[...a.values()].filter(e=>e.interactionId===t.interactionId).map(e=>e.responseId)].at(-1);o!==void 0&&r.push(responseSettled(o,`applied`)),r.push(interactionSettled(t.interactionId,i,{cause:o===void 0?void 0:{responseId:o},response:e}))}for(let e of t.deliveries)e.consumed===void 0&&e.continues!==!0&&i.has(e.deliveryId)&&r.push(deliveryApplied(e.deliveryId));return unchanged(e,r)}function matchSignIns(e,t){let n=new Set(t.attemptIds);return{...unchanged(e,[]),signIns:e.signIns.filter(e=>!n.has(signInAttemptKey(e)))}}function callSignIns(e){return e.suspended.flatMap(e=>(e.approved??[]).flatMap(e=>e.signIns??[]))}function awaitSignIns(e,t){let n=stepCallIds(e),r=t.stopped.filter(({call:e})=>n.has(e.callId));if(r.length===0)return e;let i=r.map(({approval:n,call:r,connections:i})=>{let a=e.approved?.find(e=>e.call.callId===r.callId),o=n?.interactionId??a?.interactionId,s=n?.responder??a?.responder;return{call:r,...o!==void 0&&{interactionId:o},...s!==void 0&&{responder:s},signIns:[...a?.signIns??[],...t.challenges.filter(e=>i.includes(e.name))]}}),a=new Set(i.map(e=>e.call.callId));return{...e,messages:withoutResults(e.messages,a),approved:[...(e.approved??[]).filter(e=>!a.has(e.call.callId)),...i]}}function signInCallbackFacts(e,t,n){let r=signInInteractionId(t);if(e.interactions[r]?.status!==`open`)return[];let i=`callback_${r}`,a=`response_${i}`,o=interactionSettled(r,n.outcome,{cause:{responseId:a},...n.reason!==void 0&&{reason:n.reason}});return[{data:{deliveryId:i,source:{callback:`authorization`}},type:`delivery.admitted`},responseSubmitted({deliveryId:i,interactionId:r,responseId:a}),responseSettled(a,`applied`),n.retryable===!1?{...o,data:{...o.data,response:{retryable:!1}}}:o,deliveryApplied(i)]}function callSignInsSettled(e,t,n){let r=e.projection.view,i=n===void 0?{outcome:`accepted`}:{...n,outcome:`failed`};return(t.signIns??[]).flatMap(e=>signInCallbackFacts(r,e,i))}function completeSignIn(e,t){let n=e.projection.view,r=new Set(callSignIns(e.turn).map(signInAttemptKey));return unchanged(e,t.completions.filter(e=>!r.has(signInAttemptKey(e))).flatMap(e=>signInCallbackFacts(n,e,{outcome:`accepted`})))}function controlDeliveryFor(e,t){return t??{deliveryId:`control_${String(e.projection.view.position)}`}}function controlled(e,t,n){if(e===void 0)return n(void 0);let r=n({deliveryId:e.deliveryId});return{...r,events:[controlAdmitted(e,t),...r.events,deliveryApplied(e.deliveryId)]}}const CANCELLED_CALL_RESULT=`The turn was cancelled before this call finished.`;function cancel(e,t={}){let{projection:n}=e,r=activeTurnIdOf(n),i=e.turn.suspended.filter(e=>r!==void 0&&e.event.turnId===r||e.tasks.some(t=>!answeredCallIds(e.messages).has(t.callId))||(e.approved?.length??0)>0),a=new Set(i.flatMap(e=>e.requests.map(e=>e.interactionId))),o=n.view,s=Object.values(o.interactions).filter(t=>t.status===`open`&&(e.relayedRequestIds.has(t.interactionId)||a.has(t.interactionId)||t.request.kind===`budget`)).map(e=>withdrawInteraction(e.interactionId,`Cancelled.`,`interrupted`));s.push(...turnSettled(n,{cause:t.cause,outcome:`cancelled`},activeTurn(o)?.turnId??r),...unreadSettled(e));let{queued:c,...l}=e.turn;return{...commitSteps(l,i,cancelledTranscript),events:s,signIns:[]}}function unreadSettled(e){let t=e.projection.view;return(e.turn.queued?.deliveries??[]).filter(({deliveryId:e})=>t.deliveries[e]?.status===`admitted`).map(({deliveryId:e})=>fact(`delivery.settled`,{deliveryId:e,outcome:`ignored`}))}function cancelledTranscript(e){return stoppedTranscript(e,()=>CANCELLED_CALL_RESULT)}function stopInterruptedSteps(e,t){let n=e.turn.suspended.filter(e=>e.requests.some(e=>t.settledInteractions.has(e.interactionId))||[...stepCallIds(e)].some(e=>t.calls.get(e)?.started===!0));return{...commitSteps(e.turn,n,e=>stoppedTranscript(e,e=>interruptedCallResult(t.calls.get(e)))),events:[]}}function commitSteps(e,t,n=e=>e.messages){let r=new Set(t);return{commit:t.flatMap(n),turn:{...e,suspended:e.suspended.filter(e=>!r.has(e))}}}function stoppedTranscript(e,t){let n=answeredCallIds(e.messages),r=[...e.messages];for(let i of e.messages)if(i.role===`assistant`&&typeof i.content!=`string`)for(let e of i.content)e.type===`tool-call`&&e.providerExecuted!==!0&&(n.has(e.toolCallId)||(r=withResult(r,{output:{type:`text`,value:t(e.toolCallId)},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})));return r}function clear(e,t={}){let{projection:n}=e,r=nextChangeId(n);return{clearsHistory:!0,signIns:[],events:[...clearedInteractions(e),...turnSettled(n,{cause:t.cause,outcome:`cancelled`}),...unreadSettled(e),contextStarted({cause:t.cause,changeId:r,kind:`clear`}),fact(`context.settled`,{changeId:r,kind:`clear`,outcome:`completed`,selects:null})],turn:{remembered:e.turn.remembered,suspended:[]}}}function clearedInteractions(e){let t=e.projection.view;return Object.values(t.interactions).filter(t=>t.status===`open`&&!e.relayedRequestIds.has(t.interactionId)).map(e=>withdrawInteraction(e.interactionId,`The context was cleared.`,`interrupted`))}export{CANCELLED_CALL_RESULT,awaitSignIns,callSignIns,callSignInsSettled,cancel,clear,completeSignIn,controlDeliveryFor,controlled,discardAttempt,endTask,fail,finishRun,join,matchSignIns,receive,relay,routeAnswer,runnableCalls,settle,settleTask,startTask,stopInterruptedSteps,suspendStep,withoutApproved};
|
|
1
|
+
import{activeTurnId,answeredCallIds,turnPosition}from"./view.js";import{isComplete,stepCallIds,suspend,withResult,withoutResults}from"./suspended-steps.js";import{activeTurn,interactionOwner}from"#protocol/session-projection/selectors.js";import{isOpen}from"#protocol/session-projection/tree.js";import{callSettledFrom}from"#harness/call-facts.js";import{activeTurnIdOf,nextChangeId,openRunOf}from"#protocol/session-projection.js";import{contextStarted,controlAdmitted,defined,delegatedUsageFact,deliveryApplied,errorInfoOf,fact,runSettledFacts,sessionEndedFacts,turnSettled}from"#harness/facts.js";import{closeUnder}from"#harness/session-machine/cascade.js";import{interruptedCallResult}from"#harness/interrupted-attempt.js";import{interactionSettled,responseAdmitted,responseSettled,responseSubmitted,signInInteractionId}from"#harness/interaction-facts.js";import{signInAttemptKey}from"#harness/hitl/sign-ins.js";const unchanged=(e,t)=>({events:t,turn:e.turn});function followedTurn(e){let t=e.view.selection;return t===null?null:t?.turnId??e.view.session.latestTurnId??null}function waitingDeliveries(e,t){return t.filter(({deliveryId:t})=>e.view?.deliveries[t]?.status===`admitted`)}function consumed(e,t){return fact(`delivery.consumed`,{deliveryId:e.deliveryId,history:(e.history?.length??0)>0?e.history:void 0,parts:e.parts,turnId:t})}function receive(e,t){let{projection:n}=e,r=turnPosition(n),i=activeTurnId(r),a=waitingDeliveries(n,t.deliveries??[]),o=a[0],s=o===void 0?t.cause??{policy:`system`}:{deliveryId:o.deliveryId},{parent:c,predecessor:l,runtime:u,trace:d}=t,f=[];return r.sessionStarted||f.push(fact(`session.started`,{parent:c,predecessor:l,runtime:u,trace:d})),r.turnId===``&&f.push(fact(`turn.started`,{cause:s,follows:followedTurn(n),trace:d,turnId:i})),f.push(...a.map(e=>consumed(e,i))),unchanged(e,f)}function join(e,t){let{projection:n}=e,r=waitingDeliveries(n,t.deliveries),i=activeTurnIdOf(n);return unchanged(e,i===void 0?r.map(({deliveryId:e})=>deliveryApplied(e)):r.map(e=>consumed(e,i)))}function fail(e,t){let n=e.turn.suspended.filter(e=>(e.approved?.length??0)>0),r=errorInfoOf(t),i=activeTurnIdOf(e.projection),a=i===void 0?void 0:openRunOf(e.projection,i),o=[...a===void 0?[]:runSettledFacts({runId:a,outcome:`failed`,error:r}),...t.terminal===void 0?turnSettled(e.projection,{error:r,outcome:`failed`}):sessionEndedFacts(e.projection,{cause:i===void 0?void 0:{turnId:i},error:r,outcome:`failed`})];return{...commitSteps(e.turn,n,cancelledTranscript),events:o}}function settle(e,t){let n=[],r=[...e.turn.suspended];for(let{part:i,result:a,usage:o}of t.results){let t=r.findIndex(e=>stepCallIds(e).has(i.toolCallId)),s=r[t];if(s===void 0)continue;r[t]=withoutApproved({...s,messages:withResult(s.messages,i)},new Set([i.toolCallId]));let c=a===void 0?void 0:e.projection.view.calls[a.callId];a!==void 0&&c!==void 0&&c.taskId===void 0&&c.status!==`settled`&&(n.push(callSettledFrom(a)),o!==void 0&&n.push(delegatedUsageFact(a.callId,o)))}let i=r.filter(isComplete);return{...commitSteps({...e.turn,suspended:r},i),events:n}}function discardAttempt(e,t){let n=e.projection.view,r={family:`run`,id:t.runId},i=t.ending===`steered`?closeUnder(n,r,`steered`):[];if(!isOpen(n,r))return unchanged(e,i);let a=t.ending===`retried`?{outcome:`abandoned`,runId:t.runId,usage:t.usage}:{finishReason:`other`,outcome:`completed`,runId:t.runId,usage:t.usage};return unchanged(e,[...i,...runSettledFacts(a)])}function suspendStep(e,t){return{events:[],turn:suspend(e.turn,{...t,requests:[]})}}function withoutApproved(e,t){if(e.approved===void 0)return e;let n=e.approved.filter(e=>!t.has(e.call.callId));if(n.length===e.approved.length)return e;let{approved:r,...i}=e;return n.length===0?i:{...i,approved:n}}function runnableCalls(e,t){let n=new Set(e.signIns.map(signInAttemptKey));return(t.approved??[]).filter(e=>(e.signIns??[]).every(e=>!n.has(signInAttemptKey(e))))}function startTask(e,t,n){let r=[];return(n?.has(t.taskId)??e.projection.view.tasks[t.taskId]!==void 0)||(n?.add(t.taskId),r.push({type:`task.started`,data:{taskId:t.taskId,kind:t.kind,name:t.name,startedBy:{callId:t.callId}}})),r.push({type:`call.started`,data:defined({callId:t.callId,taskId:t.taskId,clearedBy:t.clearedBy})}),unchanged(e,r)}function settleTask(e,t){let{outcome:n}=t,r=n.status===`completed`?n.output:void 0,i=t.calls[0]?.callId,a=t.calls.map(({callId:e},t)=>fact(`call.settled`,{callId:e,error:n.status===`failed`?{code:`TASK_FAILED`,message:n.error}:void 0,outcome:n.status===`cancelled`?`interrupted`:n.status,output:t===0?r:void 0,outputOf:t>0&&r!==void 0&&i!==void 0?{callId:i}:void 0,reason:n.status===`cancelled`?n.reason??`task-cancelled`:void 0}));return unchanged(e,a)}function endTask(e,t){let n=e.projection.view.tasks[t.taskId];if(n===void 0||n.status===`ended`)return unchanged(e,[]);let{outcome:r}=t;return unchanged(e,[fact(`task.ended`,{error:r.status===`failed`?{code:`TASK_FAILED`,message:r.error}:void 0,outcome:r.status,reason:r.status===`cancelled`?r.reason??`task-ended`:void 0,taskId:t.taskId})])}function finishRun(e,t){let n=new Set(t.requestIds),r=e.projection.view,i=Object.values(r.interactions).filter(e=>e.status===`open`&&(n.has(e.interactionId)||t.taskId!==void 0&&interactionOwner(r,e).taskId===t.taskId));return unchanged(e,i.map(e=>withdrawInteraction(e.interactionId,`asker-ended`)))}function withdrawInteraction(e,t,n=`withdrawn`){return interactionSettled(e,n,{reason:t})}function relay(e,t){let{payload:n}=t,r=e.projection.view,i=n.route===void 0?void 0:{...n.route,...t.workflowAsk!==void 0&&{workflowAsk:t.workflowAsk},...t.runId!==void 0&&{runId:t.runId}},a=[],o={};for(let e of n.events){let t=e.data.interactionId,s=r.interactions[t];if(e.type===`interaction.opened`||s?.origin!==void 0&&`callId`in s.subject&&s.subject.callId===n.callId)switch(e.type){case`interaction.opened`:if(s!==void 0)break;a.push({data:{...e.data,origin:e.data.origin??{interactionId:t,sessionId:n.childSessionId},subject:{callId:n.callId}},type:`interaction.opened`}),i!==void 0&&e.data.request.kind!==`sign-in`&&(o[t]=i);break;case`interaction.settled`:if(s?.status!==`open`)break;a.push(...mirrorSettled(r,e.data));break;case`response.admitted`:{let t=s===void 0?void 0:forwardedAnswer(r,e.data);t!==void 0&&r.responses[t]?.status===`submitted`&&a.push(responseAdmitted(t));break}case`response.settled`:{let t=s===void 0?void 0:forwardedAnswer(r,e.data);t!==void 0&&e.data.outcome!==`applied`&&a.push(responseSettled(t,e.data.outcome,e.data.reason));break}}}return Object.keys(o).length>0?{...unchanged(e,a),relays:o}:unchanged(e,a)}function mirrorSettled(e,t){let n=Object.values(e.responses).filter(e=>e.interactionId===t.interactionId&&e.status!==`settled`).sort((e,t)=>e.introducedAt-t.introducedAt),r=t.outcome===`accepted`||t.outcome===`declined`||t.outcome===`invalid`?n.at(-1):void 0,i=r===void 0?[]:[responseSettled(r.responseId,`applied`,t.reason)],a=r===void 0?t.cause:{responseId:r.responseId};return i.push(fact(`interaction.settled`,{...t,cause:a})),i}function forwardedAnswer(e,t){let n=Object.values(e.responses).filter(e=>e.interactionId===t.interactionId&&e.status!==`settled`).sort((e,t)=>e.introducedAt-t.introducedAt);return(n.find(e=>t.deliveryId!==void 0&&e.deliveryId===t.deliveryId)??n.at(-1))?.responseId}function routeAnswer(e,t){let n=e.projection.view,r=[],i=new Set;for(let e of t.deliveries){if(n.deliveries[e.deliveryId]!==void 0||i.has(e.deliveryId))continue;i.add(e.deliveryId);let{deliveryId:t,principal:a,source:o}=e;r.push(fact(`delivery.admitted`,{deliveryId:t,principal:a,source:o})),e.consumed!==void 0&&r.push(consumed({deliveryId:t,parts:e.consumed.parts},e.consumed.turnId))}let known=e=>i.has(e)||n.deliveries[e]!==void 0,a=new Map;for(let e of t.forwarded)n.responses[e.responseId]===void 0&&n.interactions[e.interactionId]?.status===`open`&&known(e.deliveryId)&&(a.set(e.responseId,e),r.push(responseSubmitted(e)));for(let{answer:e,outcome:i}of t.decided){let t=n.interactions[e.interactionId];if(t?.status!==`open`)continue;let o=[...Object.values(n.responses).filter(e=>e.interactionId===t.interactionId&&e.status!==`settled`).map(e=>e.responseId),...[...a.values()].filter(e=>e.interactionId===t.interactionId).map(e=>e.responseId)].at(-1);o!==void 0&&r.push(responseSettled(o,`applied`)),r.push(interactionSettled(t.interactionId,i,{cause:o===void 0?void 0:{responseId:o},response:e}))}for(let e of t.deliveries)e.consumed===void 0&&e.continues!==!0&&i.has(e.deliveryId)&&r.push(deliveryApplied(e.deliveryId));return unchanged(e,r)}function matchSignIns(e,t){let n=new Set(t.attemptIds);return{...unchanged(e,[]),signIns:e.signIns.filter(e=>!n.has(signInAttemptKey(e)))}}function callSignIns(e){return e.suspended.flatMap(e=>(e.approved??[]).flatMap(e=>e.signIns??[]))}function awaitSignIns(e,t){let n=stepCallIds(e),r=t.stopped.filter(({call:e})=>n.has(e.callId));if(r.length===0)return e;let i=r.map(({approval:n,call:r,connections:i})=>{let a=e.approved?.find(e=>e.call.callId===r.callId),o=n?.interactionId??a?.interactionId,s=n?.responder??a?.responder;return{call:r,...o!==void 0&&{interactionId:o},...s!==void 0&&{responder:s},signIns:[...a?.signIns??[],...t.challenges.filter(e=>i.includes(e.name))]}}),a=new Set(i.map(e=>e.call.callId));return{...e,messages:withoutResults(e.messages,a),approved:[...(e.approved??[]).filter(e=>!a.has(e.call.callId)),...i]}}function signInCallbackFacts(e,t,n){let r=signInInteractionId(t);if(e.interactions[r]?.status!==`open`)return[];let i=`callback_${r}`,a=`response_${i}`,o=interactionSettled(r,n.outcome,{cause:{responseId:a},...n.reason!==void 0&&{reason:n.reason}});return[{data:{deliveryId:i,source:{callback:`authorization`}},type:`delivery.admitted`},responseSubmitted({deliveryId:i,interactionId:r,responseId:a}),responseSettled(a,`applied`),n.retryable===!1?{...o,data:{...o.data,response:{retryable:!1}}}:o,deliveryApplied(i)]}function callSignInsSettled(e,t,n){let r=e.projection.view,i=n===void 0?{outcome:`accepted`}:{...n,outcome:`failed`};return(t.signIns??[]).flatMap(e=>signInCallbackFacts(r,e,i))}function completeSignIn(e,t){let n=e.projection.view,r=new Set(callSignIns(e.turn).map(signInAttemptKey));return unchanged(e,t.completions.filter(e=>!r.has(signInAttemptKey(e))).flatMap(e=>signInCallbackFacts(n,e,{outcome:`accepted`})))}function controlDeliveryFor(e,t){return t??{deliveryId:`control_${String(e.projection.view.position)}`}}function controlled(e,t,n){if(e===void 0)return n(void 0);let r=n({deliveryId:e.deliveryId});return{...r,events:[controlAdmitted(e,t),...r.events,deliveryApplied(e.deliveryId)]}}const CANCELLED_CALL_RESULT=`The turn was cancelled before this call finished.`;function cancel(e,t={}){let{projection:n}=e,r=activeTurnIdOf(n),i=e.turn.suspended.filter(e=>r!==void 0&&e.event.turnId===r||e.tasks.some(t=>!answeredCallIds(e.messages).has(t.callId))||(e.approved?.length??0)>0),a=new Set(i.flatMap(e=>e.requests.map(e=>e.interactionId))),o=n.view,s=Object.values(o.interactions).filter(t=>t.status===`open`&&(e.relayedRequestIds.has(t.interactionId)||a.has(t.interactionId)||t.request.kind===`budget`)).map(e=>withdrawInteraction(e.interactionId,`Cancelled.`,`interrupted`));s.push(...turnSettled(n,{cause:t.cause,outcome:`cancelled`},activeTurn(o)?.turnId??r),...unreadSettled(e));let{queued:c,...l}=e.turn;return{...commitSteps(l,i,cancelledTranscript),events:s,signIns:[]}}function unreadSettled(e){let t=e.projection.view;return(e.turn.queued?.deliveries??[]).filter(({deliveryId:e})=>t.deliveries[e]?.status===`admitted`).map(({deliveryId:e})=>fact(`delivery.settled`,{deliveryId:e,outcome:`ignored`}))}function cancelledTranscript(e){return stoppedTranscript(e,()=>CANCELLED_CALL_RESULT)}function stopInterruptedSteps(e,t){let n=e.turn.suspended.filter(e=>e.requests.some(e=>t.settledInteractions.has(e.interactionId))||[...stepCallIds(e)].some(e=>t.calls.get(e)?.started===!0));return{...commitSteps(e.turn,n,e=>stoppedTranscript(e,e=>interruptedCallResult(t.calls.get(e)))),events:[]}}function commitSteps(e,t,n=e=>e.messages){let r=new Set(t);return{commit:t.flatMap(n),turn:{...e,suspended:e.suspended.filter(e=>!r.has(e))}}}function stoppedTranscript(e,t){let n=answeredCallIds(e.messages),r=[...e.messages];for(let i of e.messages)if(i.role===`assistant`&&typeof i.content!=`string`)for(let e of i.content)e.type===`tool-call`&&e.providerExecuted!==!0&&(n.has(e.toolCallId)||(r=withResult(r,{output:{type:`text`,value:t(e.toolCallId)},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})));return r}function clear(e,t={}){let{projection:n}=e,r=nextChangeId(n);return{clearsHistory:!0,signIns:[],events:[...clearedInteractions(e),...turnSettled(n,{cause:t.cause,outcome:`cancelled`}),...unreadSettled(e),contextStarted({cause:t.cause,changeId:r,kind:`clear`}),fact(`context.settled`,{changeId:r,kind:`clear`,outcome:`completed`,selects:null})],turn:{remembered:e.turn.remembered,suspended:[]}}}function clearedInteractions(e){let t=e.projection.view;return Object.values(t.interactions).filter(t=>t.status===`open`&&!e.relayedRequestIds.has(t.interactionId)).map(e=>withdrawInteraction(e.interactionId,`The context was cleared.`,`interrupted`))}export{CANCELLED_CALL_RESULT,awaitSignIns,callSignIns,callSignInsSettled,cancel,clear,completeSignIn,controlDeliveryFor,controlled,discardAttempt,endTask,fail,finishRun,join,matchSignIns,receive,relay,routeAnswer,runnableCalls,settle,settleTask,startTask,stopInterruptedSteps,suspendStep,withoutApproved};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { AuthoredWorkflowModules } from "#internal/workflow-bundle/builder-support.js";
|
|
2
2
|
import type { CompileMetadata } from "#compiler/artifacts.js";
|
|
3
3
|
import type { CompileAgentResult } from "#compiler/compile-agent.js";
|
|
4
|
+
import { type ModelMetadata } from "#internal/model-catalog.js";
|
|
4
5
|
import type { AgentWorkflowWorldDefinition } from "#shared/agent-definition.js";
|
|
5
6
|
import { type SandboxPreparedArtifactsManifest } from "#shared/sandbox-prepared-artifacts.js";
|
|
6
7
|
export type BuiltInWorkflowWorldTarget = "local" | "vercel";
|
|
@@ -56,6 +57,7 @@ export declare function createCompiledArtifactsBootstrapSource(input: {
|
|
|
56
57
|
compileResult: CompileAgentResult;
|
|
57
58
|
installModulePath: string;
|
|
58
59
|
metadata: CompileMetadata;
|
|
60
|
+
modelMetadata: ModelMetadata;
|
|
59
61
|
moduleMapImportPath: string;
|
|
60
62
|
sandboxPreparedArtifacts: SandboxPreparedArtifactsManifest;
|
|
61
63
|
}): string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{copyFile,mkdir,readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{resolvePackageCompiledFilePath,resolvePackageSourceFilePath}from"#internal/application/package.js";import{buildPackageUserAgent}from"#internal/user-agent.js";import{sandboxPreparedArtifactsManifestSchema}from"#shared/sandbox-prepared-artifacts.js";import{stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";import{usesParentDevelopmentWorkflowWorld}from"#internal/workflow/development-world-protocol.js";import{prepareAuthoredRuntimeModules}from"#internal/authored-runtime-modules.js";import{readMaterializedAuthoredModuleIndex}from"#internal/materialized-authored-modules.js";import"#internal/instrumentation-layout.js";import{resolveWorkflowWorldImport}from"#internal/workflow/world-target.js";import{BUILD_DEPLOYMENT_ID_PLACEHOLDER}from"#internal/nitro/host/build-deployment-id.js";async function writeCompiledArtifactsFiles(e){let t=join(e.outDir,`compiled-artifacts-bootstrap.mjs`),n=join(e.outDir,`compiled-artifacts-module-map.mjs`),r=join(e.outDir,`compiled-artifacts-instrumentation.mjs`),i=join(e.outDir,`compiled-artifacts-workflow-world.mjs`),a=sandboxPreparedArtifactsManifestSchema.parse(JSON.parse(await readFile(e.compileResult.paths.sandboxPreparedArtifactsPath,`utf8`))),o=await prepareAuthoredRuntimeModules({appRoot:e.compileResult.project.appRoot,manifest:e.compileResult.manifest,moduleMapPath:e.compileResult.paths.moduleMapPath});await mkdir(e.outDir,{recursive:!0}),await writeFile(n,
|
|
2
|
-
`)}function createCompiledArtifactsBootstrapSource(e){let t=e.compileResult.manifest.config.name;return[`// Generated by eve. Do not edit by hand.`,`import moduleMap from ${stringifyEsmImportSpecifier(e.moduleMapImportPath)};`,`import { installBundledCompiledArtifacts } from ${stringifyEsmImportSpecifier(e.installModulePath)};`,`import { installEveWorkflowQueueNamespace } from ${stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/queue-namespace.ts`))};`,``,`installEveWorkflowQueueNamespace(${JSON.stringify(t)});`,``,`const metadata = ${JSON.stringify(e.metadata,null,2)};`,``,`const manifest = ${JSON.stringify(e.compileResult.manifest,null,2)};`,``,`const sandboxPreparedArtifacts = ${JSON.stringify(e.sandboxPreparedArtifacts,null,2)};`,``,`export { moduleMap };`,``,`export function installCompiledArtifactsBootstrap() {`,` installBundledCompiledArtifacts({`,` manifest,`,` metadata,`,` moduleMap,`,` sandboxPreparedArtifacts,`,` });`,`}`,``,`installCompiledArtifactsBootstrap();`,``,`// Default export satisfies the Nitro plugin contract so this file`,`// can be used directly as a Nitro plugin without a separate wrapper.`,`export default function installCompiledArtifactsPlugin() {`,` // Already installed on import above.`,`}`,``].join(`
|
|
1
|
+
import{copyFile,mkdir,readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{resolvePackageCompiledFilePath,resolvePackageSourceFilePath}from"#internal/application/package.js";import{buildPackageUserAgent}from"#internal/user-agent.js";import{sandboxPreparedArtifactsManifestSchema}from"#shared/sandbox-prepared-artifacts.js";import{modelMetadataSchema}from"#internal/model-catalog.js";import{stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";import{usesParentDevelopmentWorkflowWorld}from"#internal/workflow/development-world-protocol.js";import{prepareAuthoredRuntimeModules}from"#internal/authored-runtime-modules.js";import{readMaterializedAuthoredModuleIndex}from"#internal/materialized-authored-modules.js";import"#internal/instrumentation-layout.js";import{resolveWorkflowWorldImport}from"#internal/workflow/world-target.js";import{BUILD_DEPLOYMENT_ID_PLACEHOLDER}from"#internal/nitro/host/build-deployment-id.js";async function writeCompiledArtifactsFiles(e){let t=join(e.outDir,`compiled-artifacts-bootstrap.mjs`),n=join(e.outDir,`compiled-artifacts-module-map.mjs`),r=join(e.outDir,`compiled-artifacts-instrumentation.mjs`),i=join(e.outDir,`compiled-artifacts-workflow-world.mjs`),a=sandboxPreparedArtifactsManifestSchema.parse(JSON.parse(await readFile(e.compileResult.paths.sandboxPreparedArtifactsPath,`utf8`))),o=modelMetadataSchema.parse(JSON.parse(await readFile(e.compileResult.paths.modelMetadataPath,`utf8`))),s=await prepareAuthoredRuntimeModules({appRoot:e.compileResult.project.appRoot,manifest:e.compileResult.manifest,moduleMapPath:e.compileResult.paths.moduleMapPath});await mkdir(e.outDir,{recursive:!0}),await writeFile(n,s.moduleMapCode),await writeFile(t,createCompiledArtifactsBootstrapSource({compileResult:e.compileResult,installModulePath:resolvePackageSourceFilePath(`src/runtime/loaders/bundled-artifacts.ts`),metadata:e.compileResult.metadata,modelMetadata:o,moduleMapImportPath:n,sandboxPreparedArtifacts:a})),await writeFile(i,createWorkflowWorldPluginSource({compiledArtifactsBootstrapPath:t,configuredWorld:e.compileResult.manifest.config.experimental?.workflow?.world,defaultWorld:e.defaultWorkflowWorld}));let c={authoredWorkflowModules:s.authoredWorkflowModules,bootstrapPath:t,workflowWorldPluginPath:i},l=await writePreparedInstrumentation({instrumentation:s.instrumentation,outDir:e.outDir});return await writeFile(r,createInstrumentationPluginSource({agentName:e.compileResult.manifest.config.name,layout:l})),c.instrumentationPluginPath=r,c.instrumentationLayout=generatedInstrumentationLayout(l),c.instrumentationSourcePaths=instrumentationSourcePathsOf(l),c}async function writePreparedInstrumentation(e){let writeOne=async(t,n)=>{let r=join(e.outDir,`compiled-artifacts-instrumentation-${t}.mjs`);return await writeFile(r,n),r},t={};for(let[n,r]of Object.entries(e.instrumentation.moduleCodeBySlot))t[n]=await writeOne(n,r);return{kind:`directory`,modulePathsBySlot:t}}function instrumentationSourcePathsOf(e){return Object.values(e.modulePathsBySlot)}async function writeDevelopmentCompiledArtifactsFiles(e){let t=join(e.outDir,`compiled-artifacts-bootstrap.mjs`),n=join(e.outDir,`compiled-artifacts-instrumentation.mjs`),r=join(e.outDir,`compiled-artifacts-workflow-world.mjs`),i=await readMaterializedAuthoredModuleIndex(e.runtimeAppRoot);if(i===void 0)throw Error(`Development generation at "${e.runtimeAppRoot}" is not materialized.`);await mkdir(e.outDir,{recursive:!0}),await writeFile(t,createDevelopmentCompiledArtifactsBootstrapSource(e.compileResult.manifest.config.name)),await writeFile(r,createDevelopmentWorkflowWorldPluginSource({compiledArtifactsBootstrapPath:t,configuredWorld:e.compileResult.manifest.config.experimental?.workflow?.world}));let a={authoredWorkflowModules:e.authoredWorkflowModules,bootstrapPath:t,workflowWorldPluginPath:r};if(i.instrumentation!==void 0){let t=await copyMaterializedInstrumentation({instrumentation:i.instrumentation,outDir:e.outDir,runtimeAppRoot:e.runtimeAppRoot});await writeFile(n,createInstrumentationPluginSource({agentName:e.compileResult.manifest.config.name,layout:t})),a.instrumentationPluginPath=n,a.instrumentationLayout=generatedInstrumentationLayout(t),a.instrumentationSourcePaths=instrumentationSourcePathsOf(t)}return a}function generatedInstrumentationLayout(e){return{kind:`directory`,slots:Object.keys(e.modulePathsBySlot)}}async function copyMaterializedInstrumentation(e){let t=join(e.runtimeAppRoot,`.eve`,`compile`),copyOne=async(n,r)=>{let i=join(e.outDir,`compiled-artifacts-instrumentation-${n}.mjs`);return await copyFile(join(t,r),i),i},n={};for(let[t,r]of Object.entries(e.instrumentation.modulePathsBySlot))n[t]=await copyOne(t,r);return{kind:`directory`,modulePathsBySlot:n}}function createDevelopmentCompiledArtifactsBootstrapSource(e){return[`// Generated by eve. Do not edit by hand.`,`import { installEveWorkflowQueueNamespace } from ${stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/queue-namespace.ts`))};`,``,`installEveWorkflowQueueNamespace(${JSON.stringify(e)});`,``,`export default function installDevelopmentCompiledArtifactsPlugin() {}`,``].join(`
|
|
2
|
+
`)}function createCompiledArtifactsBootstrapSource(e){let t=e.compileResult.manifest.config.name;return[`// Generated by eve. Do not edit by hand.`,`import moduleMap from ${stringifyEsmImportSpecifier(e.moduleMapImportPath)};`,`import { installBundledCompiledArtifacts } from ${stringifyEsmImportSpecifier(e.installModulePath)};`,`import { installEveWorkflowQueueNamespace } from ${stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/queue-namespace.ts`))};`,``,`installEveWorkflowQueueNamespace(${JSON.stringify(t)});`,``,`const metadata = ${JSON.stringify(e.metadata,null,2)};`,``,`const manifest = ${JSON.stringify(e.compileResult.manifest,null,2)};`,``,`const sandboxPreparedArtifacts = ${JSON.stringify(e.sandboxPreparedArtifacts,null,2)};`,``,`const modelMetadata = ${JSON.stringify(e.modelMetadata)};`,``,`export { moduleMap };`,``,`export function installCompiledArtifactsBootstrap() {`,` installBundledCompiledArtifacts({`,` manifest,`,` metadata,`,` modelMetadata,`,` moduleMap,`,` sandboxPreparedArtifacts,`,` });`,`}`,``,`installCompiledArtifactsBootstrap();`,``,`// Default export satisfies the Nitro plugin contract so this file`,`// can be used directly as a Nitro plugin without a separate wrapper.`,`export default function installCompiledArtifactsPlugin() {`,` // Already installed on import above.`,`}`,``].join(`
|
|
3
3
|
`)}function resolveInstallWorldImportSpecifier(){return resolvePackageSourceFilePath(`src/execution/install-workflow-world.ts`)}function resolveWorkflowWorldWiring(e){if(e===`@workflow/world-local`){let t=stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/local-world-data-directory.ts`)),n=stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/local-world-delivery-timeouts.ts`)),r=stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/local-world-delivery-auth.ts`));return{moduleImportSpecifier:resolvePackageCompiledFilePath(`src/compiled/${e}/index.js`),extraImportLines:`
|
|
4
4
|
import { applyLocalWorkflowWorldDeliveryTimeoutDefaults } from ${n};
|
|
5
5
|
import { authenticateLocalWorkflowDeliveries } from ${r};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{mkdir,rm,stat,writeFile}from"node:fs/promises";import{EVE_DEV_ENV_FLAG,isEveDevEnvironment}from"#internal/application/dev-environment.js";import{existsSync,realpathSync}from"node:fs";import{dirname,join,resolve}from"node:path";import{spawn}from"node:child_process";import{ensurePnpmOptionalDependencyDefaults}from"#setup/primitives/pm/pnpm-build-policy.js";import{importInstalledEnginePackage,importInstalledEnginePackage as importInstalledEnginePackage$1,resolveInstalledEnginePackageEntrypointHref}from"#internal/application/optional-package-import.js";import{Worker}from"node:worker_threads";function detectProjectPackageManager(e){return resolveProjectInstallation(e).packageManager}function resolveProjectInstallation(e){let t=resolve(e);try{t=realpathSync.native(t)}catch{}let n=t;for(;;){if(existsSync(join(t,`pnpm-lock.yaml`))||existsSync(join(t,`pnpm-workspace.yaml`)))return{root:t,packageManager:`pnpm`};if(existsSync(join(t,`yarn.lock`)))return{root:t,packageManager:`yarn`};if(existsSync(join(t,`bun.lock`))||existsSync(join(t,`bun.lockb`)))return{root:t,packageManager:`bun`};if(existsSync(join(t,`package-lock.json`)))return{root:t,packageManager:`npm`};let e=dirname(t);if(e===t)return{root:n,packageManager:`npm`};t=e}}const INSTALL_ARGUMENTS={bun:[`add`,`--dev`],npm:[`install`,`--save-dev`],pnpm:[`add`,`-D`],yarn:[`add`,`-D`]},OPTIONAL_PACKAGE_LOCK_TIMEOUT_MS=6e5,pendingOptionalPackageInstalls=new Map;async function installPackageIntoProject(e){let t=detectProjectPackageManager(e.appRoot);t===`pnpm`&&e.ignoredOptionalDependencies?.length&&await ensurePnpmOptionalDependencyDefaults(e.appRoot,e.ignoredOptionalDependencies);let n=[...INSTALL_ARGUMENTS[t],e.packageName];console.info(`[eve:dev] installing optional dependency "${e.packageName}" via \`${t} ${n.join(` `)}\`...`);let r=spawn(t,n,{cwd:e.appRoot,shell:shouldSpawnPackageManagerWithShell(),stdio:[`ignore`,`pipe`,`pipe`]}),i=[];r.stdout?.on(`data`,e=>i.push(e)),r.stderr?.on(`data`,e=>i.push(e));let a=await new Promise((e,t)=>{r.on(`error`,t),r.on(`close`,t=>e(t??1))});if(a!==0){let n=Buffer.concat(i).toString(`utf8`).trim();throw Error(`Failed to install "${e.packageName}" with ${t} (exit ${a}).`+(n.length>0?`\n${n.slice(-2e3)}`:``))}console.info(`[eve:dev] installed "${e.packageName}".`)}async function loadOptionalEnginePackage(e){try{return await e.importModule()}catch(t){if(!e.autoInstall||!isEveDevEnvironment())throw Error(e.missingMessage,{cause:t});let n=e.importInstalledModule??(async()=>await importInstalledEnginePackage$1({appRoot:e.appRoot,packageName:e.packageName})),r=e.importInstalledModule===void 0?async()=>await isInstalledEnginePackageLoadable(e):async()=>{try{return await n(),!0}catch{return!1}};try{await withOptionalPackageInstallLock(e,async()=>{await r()||await installPackageIntoProject({appRoot:e.appRoot,packageName:e.installPackageName??e.packageName,ignoredOptionalDependencies:e.ignoredOptionalDependencies})})}catch(t){throw Error(`${e.missingMessage} Automatic installation failed: ${toMessage(t)}`,{cause:t})}try{return await n()}catch(t){throw Error(`${e.missingMessage} Automatic installation completed, but "${e.packageName}" still could not be loaded from "${e.appRoot}". This usually means the package manager installed into a different workspace, node_modules is unavailable, or the Node/package-manager environment changed while eve dev was running. Last load error: ${toMessage(t)}`,{cause:t})}}}async function isInstalledEnginePackageLoadable(e){try{return await importEntrypointInWorker(await resolveInstalledEnginePackageEntrypointHref(e)),!0}catch{return!1}}async function importEntrypointInWorker(e){let t=new Worker(`
|
|
1
|
+
import{mkdir,rm,stat,writeFile}from"node:fs/promises";import{EVE_DEV_ENV_FLAG,isEveDevEnvironment}from"#internal/application/dev-environment.js";import{existsSync,realpathSync}from"node:fs";import{dirname,join,resolve}from"node:path";import{spawn}from"node:child_process";import{ensurePnpmOptionalDependencyDefaults}from"#setup/primitives/pm/pnpm-build-policy.js";import{importInstalledEnginePackage,importInstalledEnginePackage as importInstalledEnginePackage$1,resolveInstalledEnginePackageEntrypointHref}from"#internal/application/optional-package-import.js";import{Worker}from"node:worker_threads";function detectProjectPackageManager(e){return resolveProjectInstallation(e).packageManager}function resolveProjectInstallation(e){let t=resolve(e);try{t=realpathSync.native(t)}catch{}let n=t;for(;;){if(existsSync(join(t,`pnpm-lock.yaml`))||existsSync(join(t,`pnpm-workspace.yaml`)))return{root:t,packageManager:`pnpm`};if(existsSync(join(t,`yarn.lock`)))return{root:t,packageManager:`yarn`};if(existsSync(join(t,`bun.lock`))||existsSync(join(t,`bun.lockb`)))return{root:t,packageManager:`bun`};if(existsSync(join(t,`package-lock.json`)))return{root:t,packageManager:`npm`};let e=dirname(t);if(e===t)return{root:n,packageManager:`npm`};t=e}}const INSTALL_ARGUMENTS={bun:[`add`,`--dev`],npm:[`install`,`--save-dev`],pnpm:[`add`,`-D`],yarn:[`add`,`-D`]},OPTIONAL_PACKAGE_LOCK_TIMEOUT_MS=6e5,pendingOptionalPackageInstalls=new Map;async function installPackageIntoProject(e){let t=detectProjectPackageManager(e.appRoot);t===`pnpm`&&e.ignoredOptionalDependencies?.length&&await ensurePnpmOptionalDependencyDefaults(e.appRoot,e.ignoredOptionalDependencies);let n=[...INSTALL_ARGUMENTS[t],e.packageName];console.info(`[eve:dev] installing optional dependency "${e.packageName}" via \`${t} ${n.join(` `)}\`...`);let r=spawn(t,n,{cwd:e.appRoot,shell:shouldSpawnPackageManagerWithShell(),stdio:[`ignore`,`pipe`,`pipe`],windowsHide:!0}),i=[];r.stdout?.on(`data`,e=>i.push(e)),r.stderr?.on(`data`,e=>i.push(e));let a=await new Promise((e,t)=>{r.on(`error`,t),r.on(`close`,t=>e(t??1))});if(a!==0){let n=Buffer.concat(i).toString(`utf8`).trim();throw Error(`Failed to install "${e.packageName}" with ${t} (exit ${a}).`+(n.length>0?`\n${n.slice(-2e3)}`:``))}console.info(`[eve:dev] installed "${e.packageName}".`)}async function loadOptionalEnginePackage(e){try{return await e.importModule()}catch(t){if(!e.autoInstall||!isEveDevEnvironment())throw Error(e.missingMessage,{cause:t});let n=e.importInstalledModule??(async()=>await importInstalledEnginePackage$1({appRoot:e.appRoot,packageName:e.packageName})),r=e.importInstalledModule===void 0?async()=>await isInstalledEnginePackageLoadable(e):async()=>{try{return await n(),!0}catch{return!1}};try{await withOptionalPackageInstallLock(e,async()=>{await r()||await installPackageIntoProject({appRoot:e.appRoot,packageName:e.installPackageName??e.packageName,ignoredOptionalDependencies:e.ignoredOptionalDependencies})})}catch(t){throw Error(`${e.missingMessage} Automatic installation failed: ${toMessage(t)}`,{cause:t})}try{return await n()}catch(t){throw Error(`${e.missingMessage} Automatic installation completed, but "${e.packageName}" still could not be loaded from "${e.appRoot}". This usually means the package manager installed into a different workspace, node_modules is unavailable, or the Node/package-manager environment changed while eve dev was running. Last load error: ${toMessage(t)}`,{cause:t})}}}async function isInstalledEnginePackageLoadable(e){try{return await importEntrypointInWorker(await resolveInstalledEnginePackageEntrypointHref(e)),!0}catch{return!1}}async function importEntrypointInWorker(e){let t=new Worker(`
|
|
2
2
|
const { parentPort, workerData } = require("node:worker_threads");
|
|
3
3
|
|
|
4
4
|
(async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const STAMPED_PACKAGE_VERSION=`0.
|
|
1
|
+
const STAMPED_PACKAGE_VERSION=`0.85.0`;function readStampedPackageVersion(){return STAMPED_PACKAGE_VERSION.startsWith(`__`)?void 0:STAMPED_PACKAGE_VERSION}export{readStampedPackageVersion};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EveAttachmentError } from "#internal/attachments/errors.js";
|
|
1
2
|
import type { UploadPolicy } from "#public/channels/upload-policy.js";
|
|
2
3
|
/** The byte cap an upload policy sets; a disabled policy accepts nothing. */
|
|
3
4
|
export declare function maxBytesOf(policy: UploadPolicy): number;
|
|
@@ -14,3 +15,4 @@ export declare function readLimitedBytes(response: Pick<Response, "body" | "head
|
|
|
14
15
|
export declare function limitedFetch(fetchImpl: typeof globalThis.fetch, maxBytes: number, adapterKind: string): typeof globalThis.fetch;
|
|
15
16
|
/** Fails a download whose bytes arrived some other way than a `Response`, once they're in hand. */
|
|
16
17
|
export declare function assertWithinLimit(bytes: Uint8Array, maxBytes: number, adapterKind: string): void;
|
|
18
|
+
export declare function overLimit(maxBytes: number, adapterKind: string): EveAttachmentError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EveAttachmentError}from"#internal/attachments/errors.js";function maxBytesOf(e){return e===`disabled`?0:e.maxBytes}async function readLimitedBytes(e,t,n){let r=Number(e.headers.get(`content-length`)??NaN);if(Number.isFinite(r)&&r>t)throw await e.body?.cancel(),overLimit(t,n);if(e.body===null)return Buffer.alloc(0);let i=e.body.getReader(),a=[],o=0;for(;;){let{done:e,value:r}=await i.read();if(e)break;if(o+=r.byteLength,o>t)throw await i.cancel(),overLimit(t,n);a.push(r)}return Buffer.concat(a)}function limitedFetch(e,t,n){return async(r,i)=>{let a=await e(r,i),o=Number(a.headers.get(`content-length`)??NaN);if(Number.isFinite(o)&&o>t)throw await a.body?.cancel(),overLimit(t,n);if(a.body===null)return a;let s=0,c=a.body.pipeThrough(new TransformStream({transform(e,r){s+=e.byteLength,s>t?r.error(overLimit(t,n)):r.enqueue(e)}}));return new Response(c,{headers:a.headers,status:a.status,statusText:a.statusText})}}function assertWithinLimit(e,t,n){if(e.byteLength>t)throw overLimit(t,n)}function overLimit(e,t){return new EveAttachmentError({adapterKind:t,kind:`resolver-threw`,message:`it is over the ${formatMegabytes(e)} upload limit.`})}function formatMegabytes(e){let t=e/1048576;return`${Number.isInteger(t)?t:t.toFixed(1)} MB`}export{assertWithinLimit,limitedFetch,maxBytesOf,readLimitedBytes};
|
|
1
|
+
import{EveAttachmentError}from"#internal/attachments/errors.js";function maxBytesOf(e){return e===`disabled`?0:e.maxBytes}async function readLimitedBytes(e,t,n){let r=Number(e.headers.get(`content-length`)??NaN);if(Number.isFinite(r)&&r>t)throw await e.body?.cancel(),overLimit(t,n);if(e.body===null)return Buffer.alloc(0);let i=e.body.getReader(),a=[],o=0;for(;;){let{done:e,value:r}=await i.read();if(e)break;if(o+=r.byteLength,o>t)throw await i.cancel(),overLimit(t,n);a.push(r)}return Buffer.concat(a)}function limitedFetch(e,t,n){return async(r,i)=>{let a=await e(r,i),o=Number(a.headers.get(`content-length`)??NaN);if(Number.isFinite(o)&&o>t)throw await a.body?.cancel(),overLimit(t,n);if(a.body===null)return a;let s=0,c=a.body.pipeThrough(new TransformStream({transform(e,r){s+=e.byteLength,s>t?r.error(overLimit(t,n)):r.enqueue(e)}}));return new Response(c,{headers:a.headers,status:a.status,statusText:a.statusText})}}function assertWithinLimit(e,t,n){if(e.byteLength>t)throw overLimit(t,n)}function overLimit(e,t){return new EveAttachmentError({adapterKind:t,kind:`resolver-threw`,message:`it is over the ${formatMegabytes(e)} upload limit.`})}function formatMegabytes(e){let t=e/1048576;return`${Number.isInteger(t)?t:t.toFixed(1)} MB`}export{assertWithinLimit,limitedFetch,maxBytesOf,overLimit,readLimitedBytes};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SANDBOX_URL_SCHEME}from"#internal/attachments/sandbox-refs.js";const EVE_URL_SCHEME=`eve-url:`;function serializeUrlFilePart(e){return`${EVE_URL_SCHEME}${e.href}`}function isSerializedUrlFilePart(e){return typeof e==`string`&&e.startsWith(EVE_URL_SCHEME)}function deserializeUrlFilePart(e){return new URL(e.slice(8))}const INTERNAL_REF_SCHEMES=[EVE_URL_SCHEME,SANDBOX_URL_SCHEME];function hasInternalRefScheme(e){
|
|
1
|
+
import{SANDBOX_URL_SCHEME}from"#internal/attachments/sandbox-refs.js";import{CHAT_SDK_FILE_PROTOCOL}from"#public/channels/chat-sdk/attachment-refs.js";const EVE_URL_SCHEME=`eve-url:`;function serializeUrlFilePart(e){return`${EVE_URL_SCHEME}${e.href}`}function isSerializedUrlFilePart(e){return typeof e==`string`&&e.startsWith(EVE_URL_SCHEME)}function deserializeUrlFilePart(e){return new URL(e.slice(8))}const INTERNAL_REF_SCHEMES=[EVE_URL_SCHEME,SANDBOX_URL_SCHEME,CHAT_SDK_FILE_PROTOCOL];function hasInternalRefScheme(e){let t=/^\s*([a-z][a-z\d+.-]*:)/i.exec(e)?.[1]?.toLowerCase();return t!==void 0&&INTERNAL_REF_SCHEMES.includes(t)}export{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart,serializeUrlFilePart};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{formatError}from"#internal/logging.js";function formatCapabilityError(e,t){let n=t.filter(e=>e!==void 0&&e.length>0).flatMap(e=>[e,encodeURIComponent(e)]).sort((e,t)=>t.length-e.length);return Object.fromEntries(Object.entries(formatError(e)).map(([e,t])=>[e,typeof t==`string`?n.reduce((e,t)=>e.replaceAll(t,`[redacted]`),t):t]))}export{formatCapabilityError};
|
|
@@ -3,7 +3,6 @@ export declare const catalogModelProviderSchema: z.ZodObject<{
|
|
|
3
3
|
provider: z.ZodString;
|
|
4
4
|
providerModelId: z.ZodString;
|
|
5
5
|
contextWindowTokens: z.ZodOptional<z.ZodNumber>;
|
|
6
|
-
maxOutputTokens: z.ZodOptional<z.ZodNumber>;
|
|
7
6
|
}, z.core.$loose>;
|
|
8
7
|
export declare const catalogModelSchema: z.ZodObject<{
|
|
9
8
|
slug: z.ZodString;
|
|
@@ -11,7 +10,6 @@ export declare const catalogModelSchema: z.ZodObject<{
|
|
|
11
10
|
provider: z.ZodString;
|
|
12
11
|
providerModelId: z.ZodString;
|
|
13
12
|
contextWindowTokens: z.ZodOptional<z.ZodNumber>;
|
|
14
|
-
maxOutputTokens: z.ZodOptional<z.ZodNumber>;
|
|
15
13
|
}, z.core.$loose>>;
|
|
16
14
|
}, z.core.$loose>;
|
|
17
15
|
export declare const modelCatalogResponseSchema: z.ZodObject<{
|
|
@@ -21,27 +19,52 @@ export declare const modelCatalogResponseSchema: z.ZodObject<{
|
|
|
21
19
|
provider: z.ZodString;
|
|
22
20
|
providerModelId: z.ZodString;
|
|
23
21
|
contextWindowTokens: z.ZodOptional<z.ZodNumber>;
|
|
24
|
-
maxOutputTokens: z.ZodOptional<z.ZodNumber>;
|
|
25
22
|
}, z.core.$loose>>;
|
|
26
23
|
}, z.core.$loose>>;
|
|
27
24
|
providerAliases: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
28
25
|
}, z.core.$loose>;
|
|
29
26
|
export type CatalogModelProvider = z.infer<typeof catalogModelProviderSchema>;
|
|
30
27
|
export type CatalogModel = z.infer<typeof catalogModelSchema>;
|
|
31
|
-
|
|
28
|
+
/** The parts of the AI Gateway model catalog that eve's lookups read. */
|
|
29
|
+
export interface ModelCatalog {
|
|
30
|
+
readonly models: readonly CatalogModel[];
|
|
31
|
+
readonly providerAliases: Readonly<Record<string, string>>;
|
|
32
|
+
}
|
|
33
|
+
/** A catalog match: the canonical Gateway slug and the context window eve compacts against. */
|
|
34
|
+
export interface ModelCatalogEntry {
|
|
32
35
|
readonly contextWindowTokens: number;
|
|
33
|
-
readonly
|
|
36
|
+
readonly slug: string;
|
|
34
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* The model metadata one build bakes into its compiled artifacts. Runtime model selections
|
|
40
|
+
* resolve context windows from this snapshot and never call AI Gateway themselves.
|
|
41
|
+
*/
|
|
42
|
+
export declare const modelMetadataSchema: z.ZodObject<{
|
|
43
|
+
fetchedAt: z.ZodNullable<z.ZodString>;
|
|
44
|
+
kind: z.ZodLiteral<"eve-model-metadata">;
|
|
45
|
+
models: z.ZodArray<z.ZodObject<{
|
|
46
|
+
slug: z.ZodString;
|
|
47
|
+
providers: z.ZodArray<z.ZodObject<{
|
|
48
|
+
contextWindowTokens: z.ZodNumber;
|
|
49
|
+
provider: z.ZodString;
|
|
50
|
+
providerModelId: z.ZodString;
|
|
51
|
+
}, z.core.$strict>>;
|
|
52
|
+
}, z.core.$strict>>;
|
|
53
|
+
providerAliases: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
54
|
+
version: z.ZodLiteral<1>;
|
|
55
|
+
}, z.core.$strict>;
|
|
56
|
+
export type ModelMetadata = z.infer<typeof modelMetadataSchema>;
|
|
57
|
+
/**
|
|
58
|
+
* Projects a catalog onto the snapshot a build ships: only providers with a usable context
|
|
59
|
+
* window, and only the fields eve's lookups read.
|
|
60
|
+
*/
|
|
61
|
+
export declare function createModelMetadata(input: {
|
|
62
|
+
readonly catalog: ModelCatalog;
|
|
63
|
+
readonly fetchedAt: string;
|
|
64
|
+
} | null): ModelMetadata;
|
|
35
65
|
export declare function normalizeCatalogModelId(modelId: string): string;
|
|
36
66
|
export declare function findCatalogModelBySlug(models: readonly CatalogModel[], slug: string): CatalogModel | undefined;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
readonly providerModelId: string;
|
|
42
|
-
}): {
|
|
43
|
-
readonly model: CatalogModel;
|
|
44
|
-
readonly provider: CatalogModelProvider;
|
|
45
|
-
} | null;
|
|
46
|
-
export declare function modelCatalogLimitsFromProvider(provider: CatalogModelProvider): ModelCatalogLimits | null;
|
|
47
|
-
export {};
|
|
67
|
+
/** Looks up an AI Gateway model id, such as `anthropic/claude-sonnet-5`. */
|
|
68
|
+
export declare function lookupCatalogModelBySlug(catalog: ModelCatalog, slug: string): ModelCatalogEntry | null;
|
|
69
|
+
/** Looks up an AI SDK provider model, such as `anthropic.messages` and `claude-sonnet-5`. */
|
|
70
|
+
export declare function lookupCatalogModelByProviderModelId(catalog: ModelCatalog, provider: string, providerModelId: string): ModelCatalogEntry | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z}from"#compiled/zod/index.js";const catalogModelProviderSchema=z.object({provider:z.string().min(1),providerModelId:z.string().min(1),contextWindowTokens:z.number().int().nonnegative().optional(),
|
|
1
|
+
import{z}from"#compiled/zod/index.js";const MODEL_METADATA_KIND=`eve-model-metadata`,catalogModelProviderSchema=z.object({provider:z.string().min(1),providerModelId:z.string().min(1),contextWindowTokens:z.number().int().nonnegative().optional()}).passthrough(),catalogModelSchema=z.object({slug:z.string().min(1),providers:z.array(catalogModelProviderSchema).min(1)}).passthrough(),modelCatalogResponseSchema=z.object({models:z.array(catalogModelSchema),providerAliases:z.record(z.string(),z.string())}).passthrough(),modelMetadataSchema=z.object({fetchedAt:z.string().nullable(),kind:z.literal(MODEL_METADATA_KIND),models:z.array(z.object({slug:z.string().min(1),providers:z.array(z.object({contextWindowTokens:z.number().int().positive(),provider:z.string().min(1),providerModelId:z.string().min(1)}).strict()).min(1)}).strict()),providerAliases:z.record(z.string(),z.string()),version:z.literal(1)}).strict();function createModelMetadata(e){let t=[];for(let n of e?.catalog.models??[]){let e=n.providers.flatMap(({contextWindowTokens:e,provider:t,providerModelId:n})=>e===void 0||e<=0?[]:[{contextWindowTokens:e,provider:t,providerModelId:n}]);e.length>0&&t.push({slug:n.slug,providers:e})}return{fetchedAt:e?.fetchedAt??null,kind:MODEL_METADATA_KIND,models:t,providerAliases:{...e?.catalog.providerAliases},version:1}}function normalizeCatalogModelId(e){return e.endsWith(`-thinking`)?e.slice(0,-9):e}function findCatalogModelBySlug(e,t){let n=e.find(e=>e.slug===t);if(n!==void 0)return n;let r=normalizeCatalogModelId(t);return r===t?void 0:e.find(e=>e.slug===r)}function lookupCatalogModelBySlug(e,t){let n=findCatalogModelBySlug(e.models,t);if(n===void 0)return null;for(let e of n.providers){let t=contextWindowOf(e);if(t!==null)return{contextWindowTokens:t,slug:n.slug}}return null}function lookupCatalogModelByProviderModelId(e,t,n){let r=t.split(`.`)[0],i=e.providerAliases[r]??r,a=normalizeCatalogModelId(n);for(let t of e.models)for(let e of t.providers){let n=contextWindowOf(e);if(n!==null&&e.provider===i&&normalizeCatalogModelId(e.providerModelId)===a)return{contextWindowTokens:n,slug:t.slug}}return null}function contextWindowOf(e){return e.contextWindowTokens===void 0||e.contextWindowTokens<=0?null:e.contextWindowTokens}export{catalogModelProviderSchema,catalogModelSchema,createModelMetadata,findCatalogModelBySlug,lookupCatalogModelByProviderModelId,lookupCatalogModelBySlug,modelCatalogResponseSchema,modelMetadataSchema,normalizeCatalogModelId};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{fork}from"node:child_process";import{fileURLToPath}from"node:url";import{toError}from"#shared/errors.js";import{LINUX_DOCKER_AVAILABILITY_ENV}from"#execution/sandbox/bindings/docker-cli.js";import{createDevelopmentHostWorkspace,removeDevelopmentHostWorkspace}from"#internal/nitro/host/dev-host-workspace.js";const DEVELOPMENT_BUILD_MESSAGE_KIND=`eve:development-build`;let prewarmedProcess,nextRequestId=0;function prewarmDevelopmentBuildProcess(){isSourceCheckout()||(prewarmedProcess??=new DevelopmentBuildProcess)}function createDevelopmentBuilds(){if(isSourceCheckout())return{begin:createInProcessSession,close(){}};let e=prewarmedProcess;prewarmedProcess=void 0;let t=new Set,n=!1;return{begin(){if(n)throw Error(`The dev server is closed, so it cannot start another build.`);let r=e?.alive===!0?e:new DevelopmentBuildProcess;e!==r&&e?.close(),e=void 0,t.add(r);let i=!1;return{async prepare(e){let t=await createDevelopmentHostWorkspace(e.appRoot);try{return await r.request(`prepare`,{...e,workspace:t})}catch(e){throw await removeDevelopmentHostWorkspace(t).catch(()=>void 0),e}},buildHost:async e=>await r.request(`buildHost`,e),close(){i||(i=!0,t.delete(r),r.close(),n||(e??=new DevelopmentBuildProcess))}}},close(){n=!0,e?.close(),e=void 0;for(let e of t)e.close();t.clear()}}}function isSourceCheckout(){return import.meta.url.endsWith(`.ts`)}function createInProcessSession(){let e=import(`#internal/nitro/host/dev-build-operations.js`);return{prepare:async t=>await(await e).prepareDevelopmentBuild(t),buildHost:async t=>await(await e).buildDevelopmentHost(t),close(){}}}var DevelopmentBuildProcess=class{#e;#t;#n=new Map;constructor(){this.#e=fork(fileURLToPath(new URL(`./dev-build-process.js`,import.meta.url)),[],{serialization:`advanced`,stdio:[`ignore`,`inherit`,`inherit`,`ipc`]}),this.#e.on(`message`,e=>{if(e?.kind!==`eve:development-build`||e.id===void 0)return;let t=this.#n.get(e.id);if(t===void 0)return;this.#n.delete(e.id),this.#i(),publishDockerAvailability(e.dockerAvailability);let n=e;n.ok?t.resolve(n.value):t.reject(deserializeError(n.error))}),this.#e.once(`error`,e=>this.#r(e)),this.#e.once(`exit`,(e,t)=>this.#r(createExitError(e,t))),this.#i()}get alive(){return this.#t===void 0&&this.#e.connected}request(e,t){if(this.#t!==void 0)return Promise.reject(this.#t);let n=++nextRequestId,r={environment:{...process.env},id:n,input:t,kind:DEVELOPMENT_BUILD_MESSAGE_KIND,operation:e};return new Promise((e,t)=>{this.#n.set(n,{reject:t,resolve:e}),this.#e.ref(),this.#e.channel?.ref?.(),this.#e.send(r,e=>{e!==null&&this.#r(e)})})}close(){this.#e.connected&&this.#e.disconnect(),this.#e.exitCode===null&&this.#e.signalCode===null&&this.#e.kill()}#r(e){this.#t??=e;for(let e of this.#n.values())e.reject(this.#t);this.#n.clear()}#i(){this.#n.size>0||(this.#e.unref(),this.#e.channel?.unref?.())}};function publishDockerAvailability(e){e!==void 0&&process.env[LINUX_DOCKER_AVAILABILITY_ENV]===void 0&&(process.env[LINUX_DOCKER_AVAILABILITY_ENV]=e?`1`:`0`)}function createExitError(e,t){return Error(e===0?`The agent build stopped before it finished: its process ran out of work to do. This usually means an authored module awaits a promise that never settles at the top level, or calls process.exit().`:t===`SIGABRT`||e===134?`The agent build process aborted, most likely because it ran out of memory. Reduce what authored modules import when they load, or raise the heap limit by starting eve dev with NODE_OPTIONS=--max-old-space-size=<megabytes>.`:t===`SIGKILL`?`The agent build process was killed before it finished. If the system ran low on memory, reduce what authored modules import when they load.`:`The agent build process exited (${t??`code ${String(e)}`}) before finishing.`)}function serializeError(e,t=0){let n=toError(e),r=n.cause,i={message:n.message,name:n.name};return n.stack!==void 0&&(i.stack=n.stack),r!==void 0&&t<8&&(i.cause=serializeError(r,t+1)),i}function deserializeError(e){let t=toError(e);return e.cause!==void 0&&(t.cause=deserializeError(e.cause)),t}export{DEVELOPMENT_BUILD_MESSAGE_KIND,createDevelopmentBuilds,prewarmDevelopmentBuildProcess,serializeError};
|
|
1
|
+
import{fork}from"node:child_process";import{fileURLToPath}from"node:url";import{toError}from"#shared/errors.js";import{LINUX_DOCKER_AVAILABILITY_ENV}from"#execution/sandbox/bindings/docker-cli.js";import{createDevelopmentHostWorkspace,removeDevelopmentHostWorkspace}from"#internal/nitro/host/dev-host-workspace.js";const DEVELOPMENT_BUILD_MESSAGE_KIND=`eve:development-build`;let prewarmedProcess,nextRequestId=0;function prewarmDevelopmentBuildProcess(){isSourceCheckout()||(prewarmedProcess??=new DevelopmentBuildProcess)}function createDevelopmentBuilds(){if(isSourceCheckout())return{begin:createInProcessSession,close(){}};let e=prewarmedProcess;prewarmedProcess=void 0;let t=new Set,n=!1;return{begin(){if(n)throw Error(`The dev server is closed, so it cannot start another build.`);let r=e?.alive===!0?e:new DevelopmentBuildProcess;e!==r&&e?.close(),e=void 0,t.add(r);let i=!1;return{async prepare(e){let t=await createDevelopmentHostWorkspace(e.appRoot);try{return await r.request(`prepare`,{...e,workspace:t})}catch(e){throw await removeDevelopmentHostWorkspace(t).catch(()=>void 0),e}},buildHost:async e=>await r.request(`buildHost`,e),close(){i||(i=!0,t.delete(r),r.close(),n||(e??=new DevelopmentBuildProcess))}}},close(){n=!0,e?.close(),e=void 0;for(let e of t)e.close();t.clear()}}}function isSourceCheckout(){return import.meta.url.endsWith(`.ts`)}function createInProcessSession(){let e=import(`#internal/nitro/host/dev-build-operations.js`);return{prepare:async t=>await(await e).prepareDevelopmentBuild(t),buildHost:async t=>await(await e).buildDevelopmentHost(t),close(){}}}var DevelopmentBuildProcess=class{#e;#t;#n=new Map;constructor(){this.#e=fork(fileURLToPath(new URL(`./dev-build-process.js`,import.meta.url)),[],{serialization:`advanced`,stdio:[`ignore`,`inherit`,`inherit`,`ipc`],windowsHide:!0}),this.#e.on(`message`,e=>{if(e?.kind!==`eve:development-build`||e.id===void 0)return;let t=this.#n.get(e.id);if(t===void 0)return;this.#n.delete(e.id),this.#i(),publishDockerAvailability(e.dockerAvailability);let n=e;n.ok?t.resolve(n.value):t.reject(deserializeError(n.error))}),this.#e.once(`error`,e=>this.#r(e)),this.#e.once(`exit`,(e,t)=>this.#r(createExitError(e,t))),this.#i()}get alive(){return this.#t===void 0&&this.#e.connected}request(e,t){if(this.#t!==void 0)return Promise.reject(this.#t);let n=++nextRequestId,r={environment:{...process.env},id:n,input:t,kind:DEVELOPMENT_BUILD_MESSAGE_KIND,operation:e};return new Promise((e,t)=>{this.#n.set(n,{reject:t,resolve:e}),this.#e.ref(),this.#e.channel?.ref?.(),this.#e.send(r,e=>{e!==null&&this.#r(e)})})}close(){this.#e.connected&&this.#e.disconnect(),this.#e.exitCode===null&&this.#e.signalCode===null&&this.#e.kill()}#r(e){this.#t??=e;for(let e of this.#n.values())e.reject(this.#t);this.#n.clear()}#i(){this.#n.size>0||(this.#e.unref(),this.#e.channel?.unref?.())}};function publishDockerAvailability(e){e!==void 0&&process.env[LINUX_DOCKER_AVAILABILITY_ENV]===void 0&&(process.env[LINUX_DOCKER_AVAILABILITY_ENV]=e?`1`:`0`)}function createExitError(e,t){return Error(e===0?`The agent build stopped before it finished: its process ran out of work to do. This usually means an authored module awaits a promise that never settles at the top level, or calls process.exit().`:t===`SIGABRT`||e===134?`The agent build process aborted, most likely because it ran out of memory. Reduce what authored modules import when they load, or raise the heap limit by starting eve dev with NODE_OPTIONS=--max-old-space-size=<megabytes>.`:t===`SIGKILL`?`The agent build process was killed before it finished. If the system ran low on memory, reduce what authored modules import when they load.`:`The agent build process exited (${t??`code ${String(e)}`}) before finishing.`)}function serializeError(e,t=0){let n=toError(e),r=n.cause,i={message:n.message,name:n.name};return n.stack!==void 0&&(i.stack=n.stack),r!==void 0&&t<8&&(i.cause=serializeError(r,t+1)),i}function deserializeError(e){let t=toError(e);return e.cause!==void 0&&(t.cause=deserializeError(e.cause)),t}export{DEVELOPMENT_BUILD_MESSAGE_KIND,createDevelopmentBuilds,prewarmDevelopmentBuildProcess,serializeError};
|