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
|
@@ -1 +1 @@
|
|
|
1
|
-
import{initAgentDevHandoff,initAgentReadySummary}from"./agent-instructions.js";import{hasInteractiveTerminal}from"./preconditions.js";import{tryInitializeGit}from"./init-git.js";import{InitTargetError}from"./init-telemetry.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace,formatWorkspaceRootMutationWarning}from"./init-agent-workspace.js";import{createInstallDiagnostics,packageManagerInstallFailureCode}from"./init-install.js";import{reportExistingProjectChanges}from"./init-project.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{resolveInitAgentSettings}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK,eveCliBanner}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,hasInteractiveTerminal,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,...resolveInitAgentSettings(t),packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),d=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let f={projectName:u===void 0?`.`:n?basename(e):t,...resolveInitAgentSettings(i),evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{d.push(e)}},p=await a.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{d.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(d)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}async function runInitSteps(e){let{agentLaunched:t,dependencies:n,interactive:r,logger:i,options:a,parentDirectory:o,target:s,trackStep:c,trackTerminal:l}=e,u=isLogLevelEnabled(`debug`),d=await resolveInitTarget({parentDirectory:o,target:s}),f=resolveInitEvePackageOverride(),p=n.now(),m={animate:r&&!t&&!process.env.CI&&process.env.TERM!==`dumb`,elapsed:!0,logPhases:!0},h=startCliLiveRow(i,m),g=`scaffold`,_;try{let e=d.kind===`fresh`?`creating agent`:`adding agent`;c?.(g),h.update(d.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let r=n.now(),o;if(d.kind===`fresh`){let e=await resolveScaffoldPackageManager(d.projectPath,n),t=isPackageManagerWorkspaceMember(e,d.projectPath),r;try{r=await scaffoldProject(d.projectPath,d.projectName,d.createInPlace,e,a,n,f,d.overwriteExisting)}catch(e){if(d.failurePolicy===`clear`){let n=await cleanupFreshInitTarget(d.projectPath,d.failurePolicy,d.preservedEntries),r=e instanceof Error?e.message:String(e),i=n?`eve restored "${d.projectPath}" to its original state.`:`eve could not completely clean "${d.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(t)}`)}if(d.failurePolicy===`remove`&&t){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}o={failurePolicy:d.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:d.preservedEntries,projectPath:r.projectPath,retryCommand:`eve init ${d.projectPath}`,workspaceMember:t,workspaceRootMutations:r.workspaceRootMutations}}else{let e=await addToExistingProject(d.projectPath,a,n,f);o=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:d.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:d.projectPath}}let s=n.now()-r;initLog.debug(`${e} done`,{ms:s}),o.kind===`added`&&(h.stop(),reportExistingProjectChanges(i,o),h=startCliLiveRow(i,m)),g=`install_dependencies`,c?.(g),h.update(`Installing dependencies`,o.packageManager),initLog.debug(`installing dependencies with ${o.packageManager}`);let l=n.now(),v=createInstallDiagnostics(),y=await n.runPackageManagerInstall(o.packageManager,o.projectPath,{autoApprove:!0,bypassMinimumReleaseAge:!0,progressDetails:!1,onOutput:e=>{v.append(e.text),u&&initLog.debug(e.text)}}),b=n.now()-l;if(!packageManagerInstallSucceeded(y)){_=packageManagerInstallFailureCode(y),initLog.debug(`dependency installation failed`,{ms:b}),h.stop();let{lines:e,truncated:t}=v.result();t&&i.error(`Earlier install output omitted; showing the final diagnostics.`);for(let t of e)i.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(y);e!==void 0&&i.error(e)}if(o.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(o.projectPath,o.failurePolicy,o.preservedTargetEntries)){let e=o.failurePolicy===`remove`?`eve removed the incomplete project at "${o.projectPath}".`:`eve restored "${o.projectPath}" to its original state.`,t=o.workspaceMember||o.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${o.retryCommand}${workspaceFailureNote(t)}`)}let e=o.workspaceMember||o.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${o.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${o.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${o.packageManager} in "${o.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}if(initLog.debug(`dependencies installed`,{ms:b}),o.kind===`created`){g=`initialize_git`,c?.(g),h.update(`Initializing Git`),initLog.debug(`initializing git repository`);let e=await n.tryInitializeGit(o.projectPath);return{...o,elapsedMs:n.now()-p,agentLaunched:t,gitResult:e}}return{...o,elapsedMs:n.now()-p,agentLaunched:t}}catch(e){throw l?.(g,`error`,g===`install_dependencies`?_:void 0),e}finally{h.stop()}}async function runInitCommand(e,t,n,r,i=defaultDependencies,a,o){let s=await i.isCodingAgentLaunch(),c=i.hasInteractiveTerminal(),l=c&&!s&&!r.nonInteractive;c&&!s&&e.log(``),a?.(`resolve_target`);let u;try{if(await addAgentsToWorkspace(e,t,n,r,i.validateModelSlug)){a?.(`handoff`),o?.(`handoff`,`completed`);return}l||e.log(eveCliBanner()),u=await runInitSteps({agentLaunched:s,interactive:c,dependencies:i,logger:e,options:r,parentDirectory:t,target:n,trackStep:a,trackTerminal:o})}catch(e){if(e instanceof WizardCancelledError){o?.(`resolve_target`,`cancelled`);return}throw e instanceof InitTargetError&&o?.(`resolve_target`,`error`,e.failureCode),e}if(a?.(`handoff`),u.kind===`created`){e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(u.projectPath)} ${pc.dim(`in ${formatElapsed(u.elapsedMs)}`)}`);for(let t of u.workspaceRootMutations)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(u.projectPath)} ${pc.dim(`in ${formatElapsed(u.elapsedMs)}`)}`);u.kind===`created`&&u.gitResult.kind===`failed`&&(e.error(pc.yellow(`Git initialization failed during ${u.gitResult.stage}: ${u.gitResult.reason}`)),u.gitResult.stage===`commit`&&e.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${u.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(u.projectPath)} commit -m "Initial commit from eve"`)));let d=eveDevArguments(u.packageManager),f=[u.packageManager,...d].join(` `),p=initAgentDevHandoff({projectPath:u.projectPath,devCommand:f});if(u.agentLaunched){e.log(initAgentReadySummary(r.model,u.projectPath,{workspace:r.agents!==void 0})),e.log(p);return}if(!l){e.log(p);return}let m=u.kind===`created`,h=[...u.packageManager===`pnpm`?[`--reporter=silent`]:[],...d,...m?[`--onboard`]:[]];if(e.log(``),!resultSucceeded(await i.spawnPackageManager(u.packageManager,u.projectPath,h)))throw Error(`Development server exited unsuccessfully in "${u.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
|
|
1
|
+
import{initAgentDevHandoff,initAgentReadySummary}from"./agent-instructions.js";import{hasInteractiveTerminal}from"./preconditions.js";import{tryInitializeGit}from"./init-git.js";import{InitTargetError}from"./init-telemetry.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace,formatWorkspaceRootMutationWarning}from"./init-agent-workspace.js";import{createInstallDiagnostics,packageManagerInstallFailureCode}from"./init-install.js";import{reportExistingProjectChanges}from"./init-project.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{resolveInitTarget}from"./init-target.js";import{mkdir,mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{resolveInitAgentSettings}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK,eveCliBanner}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,hasInteractiveTerminal,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,...resolveInitAgentSettings(t),packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);await mkdir(c,{recursive:!0});let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),d=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let f={projectName:u===void 0?`.`:n?basename(e):t,...resolveInitAgentSettings(i),evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{d.push(e)}},p=await a.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{d.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(d)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}async function runInitSteps(e){let{agentLaunched:t,dependencies:n,interactive:r,logger:i,options:a,parentDirectory:o,target:s,trackStep:c,trackTerminal:l}=e,u=isLogLevelEnabled(`debug`),d=await resolveInitTarget({parentDirectory:o,target:s}),f=resolveInitEvePackageOverride(),p=n.now(),m={animate:r&&!t&&!process.env.CI&&process.env.TERM!==`dumb`,elapsed:!0,logPhases:!0},h=startCliLiveRow(i,m),g=`scaffold`,_;try{let e=d.kind===`fresh`?`creating agent`:`adding agent`;c?.(g),h.update(d.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let r=n.now(),o;if(d.kind===`fresh`){let e=await resolveScaffoldPackageManager(d.projectPath,n),t=isPackageManagerWorkspaceMember(e,d.projectPath),r;try{r=await scaffoldProject(d.projectPath,d.projectName,d.createInPlace,e,a,n,f,d.overwriteExisting)}catch(e){if(d.failurePolicy===`clear`){let n=await cleanupFreshInitTarget(d.projectPath,d.failurePolicy,d.preservedEntries),r=e instanceof Error?e.message:String(e),i=n?`eve restored "${d.projectPath}" to its original state.`:`eve could not completely clean "${d.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(t)}`)}if(d.failurePolicy===`remove`&&t){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}o={failurePolicy:d.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:d.preservedEntries,projectPath:r.projectPath,retryCommand:`eve init ${d.projectPath}`,workspaceMember:t,workspaceRootMutations:r.workspaceRootMutations}}else{let e=await addToExistingProject(d.projectPath,a,n,f);o=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:d.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:d.projectPath}}let s=n.now()-r;initLog.debug(`${e} done`,{ms:s}),o.kind===`added`&&(h.stop(),reportExistingProjectChanges(i,o),h=startCliLiveRow(i,m)),g=`install_dependencies`,c?.(g),h.update(`Installing dependencies`,o.packageManager),initLog.debug(`installing dependencies with ${o.packageManager}`);let l=n.now(),v=createInstallDiagnostics(),y=await n.runPackageManagerInstall(o.packageManager,o.projectPath,{autoApprove:!0,bypassMinimumReleaseAge:!0,progressDetails:!1,onOutput:e=>{v.append(e.text),u&&initLog.debug(e.text)}}),b=n.now()-l;if(!packageManagerInstallSucceeded(y)){_=packageManagerInstallFailureCode(y),initLog.debug(`dependency installation failed`,{ms:b}),h.stop();let{lines:e,truncated:t}=v.result();t&&i.error(`Earlier install output omitted; showing the final diagnostics.`);for(let t of e)i.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(y);e!==void 0&&i.error(e)}if(o.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(o.projectPath,o.failurePolicy,o.preservedTargetEntries)){let e=o.failurePolicy===`remove`?`eve removed the incomplete project at "${o.projectPath}".`:`eve restored "${o.projectPath}" to its original state.`,t=o.workspaceMember||o.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${o.retryCommand}${workspaceFailureNote(t)}`)}let e=o.workspaceMember||o.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${o.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${o.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${o.packageManager} in "${o.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}if(initLog.debug(`dependencies installed`,{ms:b}),o.kind===`created`){g=`initialize_git`,c?.(g),h.update(`Initializing Git`),initLog.debug(`initializing git repository`);let e=await n.tryInitializeGit(o.projectPath);return{...o,elapsedMs:n.now()-p,agentLaunched:t,gitResult:e}}return{...o,elapsedMs:n.now()-p,agentLaunched:t}}catch(e){throw l?.(g,`error`,g===`install_dependencies`?_:void 0),e}finally{h.stop()}}async function runInitCommand(e,t,n,r,i=defaultDependencies,a,o){let s=await i.isCodingAgentLaunch(),c=i.hasInteractiveTerminal(),l=c&&!s&&!r.nonInteractive;c&&!s&&e.log(``),a?.(`resolve_target`);let u;try{if(await addAgentsToWorkspace(e,t,n,r,i.validateModelSlug)){a?.(`handoff`),o?.(`handoff`,`completed`);return}l||e.log(eveCliBanner()),u=await runInitSteps({agentLaunched:s,interactive:c,dependencies:i,logger:e,options:r,parentDirectory:t,target:n,trackStep:a,trackTerminal:o})}catch(e){if(e instanceof WizardCancelledError){o?.(`resolve_target`,`cancelled`);return}throw e instanceof InitTargetError&&o?.(`resolve_target`,`error`,e.failureCode),e}if(a?.(`handoff`),u.kind===`created`){e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(u.projectPath)} ${pc.dim(`in ${formatElapsed(u.elapsedMs)}`)}`);for(let t of u.workspaceRootMutations)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(u.projectPath)} ${pc.dim(`in ${formatElapsed(u.elapsedMs)}`)}`);u.kind===`created`&&u.gitResult.kind===`failed`&&(e.error(pc.yellow(`Git initialization failed during ${u.gitResult.stage}: ${u.gitResult.reason}`)),u.gitResult.stage===`commit`&&e.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${u.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(u.projectPath)} commit -m "Initial commit from eve"`)));let d=eveDevArguments(u.packageManager),f=[u.packageManager,...d].join(` `),p=initAgentDevHandoff({projectPath:u.projectPath,devCommand:f});if(u.agentLaunched){e.log(initAgentReadySummary(r.model,u.projectPath,{workspace:r.agents!==void 0})),e.log(p);return}if(!l){e.log(p);return}let m=u.kind===`created`,h=[...u.packageManager===`pnpm`?[`--reporter=silent`]:[],...d,...m?[`--onboard`]:[]];if(e.log(``),!resultSucceeded(await i.spawnPackageManager(u.packageManager,u.projectPath,h)))throw Error(`Development server exited unsuccessfully in "${u.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH}from"#protocol/routes.js";import{encodeBasicCredentials}from"#internal/http/basic-auth.js";import{ClientError}from"#client/client-error.js";import{AgentInfoResponseError}from"#client/agent-info-error.js";import{HealthResponseError}from"#client/health-response-error.js";import{HealthResultSchema}from"#client/health-schema.js";import{AgentInfoResultSchema}from"#client/agent-info-schema.js";import{ClientSessions}from"#client/sessions.js";import{createClientUrl}from"#client/url.js";import{VERCEL_TRUSTED_OIDC_IDP_TOKEN_HEADER}from"#client/types.js";var Client=class{#e;#t;#n;#r;sessions;constructor(e){this.#n=e.baseUrl,this.#e=e.auth,this.#t=e.headers,this.#r=e.redirect
|
|
1
|
+
import{EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH}from"#protocol/routes.js";import{encodeBasicCredentials}from"#internal/http/basic-auth.js";import{ClientError}from"#client/client-error.js";import{AgentInfoResponseError}from"#client/agent-info-error.js";import{HealthResponseError}from"#client/health-response-error.js";import{HealthResultSchema}from"#client/health-schema.js";import{AgentInfoResultSchema}from"#client/agent-info-schema.js";import{ClientSessions}from"#client/sessions.js";import{createClientUrl}from"#client/url.js";import{VERCEL_TRUSTED_OIDC_IDP_TOKEN_HEADER}from"#client/types.js";var Client=class{#e;#t;#n;#r;sessions;constructor(e){this.#n=e.baseUrl,this.#e=e.auth,this.#t=e.headers,this.#r=e.redirect??`error`,this.sessions=new ClientSessions({baseUrl:this.#n,redirect:this.#r,resolveHeaders:e=>this.#i(e)})}async health(){let e=createClientUrl(this.#n,EVE_HEALTH_ROUTE_PATH),t=await this.#i(),n=await fetch(e,withRedirectPolicy({headers:t},this.#r));if(!n.ok){let e=await n.text();throw new ClientError(n.status,e,n.headers)}let r;try{r=await n.json()}catch{throw new HealthResponseError}let i=HealthResultSchema.safeParse(r);if(!i.success)throw new HealthResponseError(i.error.issues.slice(0,5).map(e=>{let t=e.path.join(`.`);return t.length===0?e.message:`${t}: ${e.message}`}));return i.data}async info(e={}){let t=await this.fetch(EVE_INFO_ROUTE_PATH,e);if(!t.ok){let e=await t.text();throw new ClientError(t.status,e,t.headers)}let n;try{n=await t.json()}catch{throw new AgentInfoResponseError}let r=AgentInfoResultSchema.safeParse(n);if(!r.success)throw new AgentInfoResponseError(r.error.issues.slice(0,5).map(e=>{let t=e.path.join(`.`);return t.length===0?e.message:`${t}: ${e.message}`}));return r.data}async fetch(e,t={}){let n=createClientUrl(this.#n,e),r=await this.#i(headersInitToRecord(t.headers));return await fetch(n,withRedirectPolicy({...t,headers:r},this.#r))}async#i(e){let t=new Headers,[n,r]=await Promise.all([resolveHeadersValue(this.#t),this.#a()]);for(let[e,r]of Object.entries(n))t.set(e,r);for(let[e,n]of Object.entries(r))t.set(e,n);if(e)for(let[n,r]of Object.entries(e))t.set(n,r);return t}async#a(){let e=this.#e;if(!e)return{};if(`vercelOidc`in e){let t=(await resolveTokenValue(e.vercelOidc.token)).trim();return t.length===0?{}:{authorization:`Bearer ${t}`,[VERCEL_TRUSTED_OIDC_IDP_TOKEN_HEADER]:t}}if(`bearer`in e){let t=(await resolveTokenValue(e.bearer)).trim();return t.length===0?{}:{authorization:`Bearer ${t}`}}if(`basic`in e){let t=await resolveTokenValue(e.basic.password);return{authorization:`Basic ${encodeBasicCredentials(e.basic.username,t)}`}}return{}}};async function resolveTokenValue(e){return typeof e==`function`?e():e}async function resolveHeadersValue(e){return e===void 0?{}:typeof e==`function`?await e():e}function headersInitToRecord(e){return e===void 0?{}:Object.fromEntries(new Headers(e).entries())}function withRedirectPolicy(e,t){return{...e,redirect:t}}export{Client};
|
|
@@ -15,6 +15,7 @@ export interface ClientSendReceipt {
|
|
|
15
15
|
readonly acceptedAt: number;
|
|
16
16
|
}
|
|
17
17
|
interface DeliveryInput {
|
|
18
|
+
readonly inbox?: string;
|
|
18
19
|
readonly createStream: (options?: DeliveryReadOptions) => AsyncIterable<SessionStreamEvent>;
|
|
19
20
|
readonly deliveryId: string;
|
|
20
21
|
readonly receipt?: ClientSendReceipt;
|
|
@@ -25,6 +26,7 @@ export declare class StreamDelivery<TOutput = unknown> implements Delivery<TOutp
|
|
|
25
26
|
#private;
|
|
26
27
|
readonly sessionId: string;
|
|
27
28
|
readonly deliveryId: string;
|
|
29
|
+
readonly inbox?: string;
|
|
28
30
|
/** @internal */
|
|
29
31
|
constructor(input: DeliveryInput);
|
|
30
32
|
/** Independent, replayable read; exiting it never consumes the handle. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{turnSummary}from"#client/session-utils.js";import{throwIfAborted}from"#client/abort-signal.js";const sendReceipts=new WeakMap;var StreamDelivery=class{sessionId;deliveryId;#e;#t;constructor(e){this.sessionId=e.sessionId,this.deliveryId=e.deliveryId,e.receipt!==void 0&&sendReceipts.set(this,e.receipt),this.#e=e.createStream}async*stream(e){throwIfAborted(e?.signal);for await(let t of this.#e(e))throwIfAborted(e?.signal),yield t;throwIfAborted(e?.signal)}async result(e){if(throwIfAborted(e?.signal),this.#t!==void 0)return this.#t;let t=turnSummary(this.deliveryId);for await(let n of this.stream(e))t.observe(n);let n=t.result();if(n.status===`working`||n.outcome===void 0)throw Error(`The stream ended before the accepted delivery settled.`);let r={data:n.result,deliveryId:this.deliveryId,interactions:n.interactions,outcome:n.outcome,reply:n.message,sessionEnded:n.sessionEnded,sessionId:this.sessionId},i=n.status===`failed`?{...r,status:`failed`,error:n.failure??{code:`DELIVERY_FAILED`,message:`The delivery failed.`}}:{...r,status:n.status};return this.#t=i,i}};function getDeliveryReceipt(e){return sendReceipts.get(e)}export{StreamDelivery,getDeliveryReceipt};
|
|
1
|
+
import{turnSummary}from"#client/session-utils.js";import{throwIfAborted}from"#client/abort-signal.js";const sendReceipts=new WeakMap;var StreamDelivery=class{sessionId;deliveryId;inbox;#e;#t;constructor(e){this.sessionId=e.sessionId,this.inbox=e.inbox,this.deliveryId=e.deliveryId,e.receipt!==void 0&&sendReceipts.set(this,e.receipt),this.#e=e.createStream}async*stream(e){throwIfAborted(e?.signal);for await(let t of this.#e(e))throwIfAborted(e?.signal),yield t;throwIfAborted(e?.signal)}async result(e){if(throwIfAborted(e?.signal),this.#t!==void 0)return this.#t;let t=turnSummary(this.deliveryId);for await(let n of this.stream(e))t.observe(n);let n=t.result();if(n.status===`working`||n.outcome===void 0)throw Error(`The stream ended before the accepted delivery settled.`);let r={data:n.result,deliveryId:this.deliveryId,interactions:n.interactions,outcome:n.outcome,reply:n.message,sessionEnded:n.sessionEnded,sessionId:this.sessionId},i=n.status===`failed`?{...r,status:`failed`,error:n.failure??{code:`DELIVERY_FAILED`,message:`The delivery failed.`}}:{...r,status:n.status};return this.#t=i,i}};function getDeliveryReceipt(e){return sendReceipts.get(e)}export{StreamDelivery,getDeliveryReceipt};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SessionNotActiveError}from"#channel/session-not-active-error.js";import{ClientError,ClientSessionStrandedError,createClientError}from"#client/client-error.js";import{createEventReader}from"#protocol/session-lines.js";import{EVE_STREAM_TAIL_INDEX_HEADER}from"#protocol/session-http.js";import{createClientUrl}from"#client/url.js";import{throwIfAborted}from"#client/abort-signal.js";import{isV26Line}from"#protocol/v26-lines.js";import{isStreamDisconnectError,readNdjsonStream}from"#client/ndjson.js";import{readMessageStreamVersion}from"#client/stream-version.js";const RECONNECT_BACKOFF={baseDelayMs:250,maxDelayMs:5e3},DEFAULT_STREAM_RECONNECT_POLICY={reconnect:!0,retryableErrorStatuses:new Set([404,409,425,500,502,503,504]),streamOpenReconnectPolicy:{baseDelayMs:250,maxAttempts:12,maxDelayMs:5e3}},NO_STREAM_RECONNECT_POLICY={...DEFAULT_STREAM_RECONNECT_POLICY,reconnect:!1,streamOpenReconnectPolicy:{...DEFAULT_STREAM_RECONNECT_POLICY.streamOpenReconnectPolicy,maxAttempts:1}};function isRetryableStreamError(e,t=DEFAULT_STREAM_RECONNECT_POLICY.retryableErrorStatuses){return e instanceof ClientSessionStrandedError?!1:SessionNotActiveError.is(e)?t.has(409):e instanceof ClientError?e.code!==`session_version_unsupported`&&t.has(e.status):isStreamDisconnectError(e)}function resolveRetryPolicy(e,t){return{...t,...e}}function resolveStreamReconnectPolicy(e){if(e&&`reconnect`in e&&e.reconnect===!1)return NO_STREAM_RECONNECT_POLICY;let t=e;return{reconnect:!0,retryableErrorStatuses:t?.retryableErrorStatuses?new Set(t.retryableErrorStatuses):DEFAULT_STREAM_RECONNECT_POLICY.retryableErrorStatuses,streamOpenReconnectPolicy:resolveRetryPolicy(t?.streamOpenReconnectPolicy,DEFAULT_STREAM_RECONNECT_POLICY.streamOpenReconnectPolicy)}}async function*followStreamLines(e){let resolvePolicy=()=>resolveStreamReconnectPolicy(e.resolveReconnectPolicy===void 0?e.streamReconnectPolicy:e.resolveReconnectPolicy()),t=e.follow===!1||e.onCaughtUp!==void 0,n=e.startIndex,r=RECONNECT_BACKOFF.baseDelayMs,i=0,a,o=!1,passedTail=()=>a!==void 0&&n>a,noteProgress=()=>(!o&&passedTail()&&(o=!0,e.onCaughtUp?.()),e.follow===!1&&passedTail());for(;;){let o=resolvePolicy(),s;try{s=await openStreamBody({...e,retryPolicy:o,startIndex:n,requestTailIndex:(t||n<0)&&a===void 0})}catch(t){if(e.signal?.aborted)return;throw t}if((t||n<0)&&a===void 0){if(a=s.tailIndex,a===void 0)throw s.close(),Error(`This read requires the server to report the ${EVE_STREAM_TAIL_INDEX_HEADER} header. The agent may be running an older eve version.`);n<0&&(n=Math.max(0,a+1+n))}try{e.onOpen?.(s.headers)}catch(e){throw s.close(),e}if(noteProgress()){s.close();return}let c=!1,l=!1;try{for await(let t of readNdjsonStream(s.body,{signal:e.signal,idleTimeoutMs:e.streamReadIdleTimeoutMs??3e4}))switch(t.kind){case`transport`:switch(t.record.$eve){case`position`:if(t.record.next>n&&(n=t.record.next),e.onPosition?.(n),noteProgress())return;break;case`stream.lease-ended`:l=!0;break;case`stream.ended`:c=!0}continue;case`unknown-transport`:continue;case`commit`:case`progress`:case`invalid`:{if(t.kind===`invalid`&&isV26Line(t.value))throw new ClientError(409,JSON.stringify({code:`session_version_unsupported`,error:`This session was started by an earlier eve version. Start a new session.`}));let a=n;if(n+=1,i=0,r=RECONNECT_BACKOFF.baseDelayMs,yield{line:t.kind===`invalid`?void 0:t.line,position:a},e.onPosition?.(n),noteProgress())return}}}catch(e){if(!isStreamDisconnectError(e))throw e}finally{s.close()}if(c||e.signal?.aborted||!resolvePolicy().reconnect)return;if(!l){if(i+=1,e.follow===!1&&i>=o.streamOpenReconnectPolicy.maxAttempts)throw Error(`The session stream kept disconnecting before the read reached its tail.`);if(await sleep(r,e.signal),e.signal?.aborted)return;r=Math.min(r*2,RECONNECT_BACKOFF.maxDelayMs)}}}async function*followStreamIterable(e){let t=createEventReader();for await(let{line:n,position:r}of followStreamLines(e)){if(n===void 0)continue;let e=t.read(n,r);for(let[t,n]of e.entries())yield{cursor:t===e.length-1?r+1:r,event:n}}}async function openStreamBody(e){let t=e.retryPolicy??resolveStreamReconnectPolicy(e.streamReconnectPolicy),n=t.streamOpenReconnectPolicy,r,i,a,o=n.baseDelayMs,s={...e.searchParams};e.startIndex!==0&&(s.startIndex=String(e.startIndex)),e.requestTailIndex===!0&&(s.includeTailIndex=`1`),e.follow===!1&&(s.follow=`false`);for(let c=0;c<n.maxAttempts;c+=1){throwIfAborted(e.signal);let l=createClientUrl(e.baseUrl,e.path,Object.keys(s).length>0?s:void 0),u=await e.resolveHeaders();throwIfAborted(e.signal);let d=new AbortController,f=e.signal?AbortSignal.any([e.signal,d.signal]):d.signal,p;try{p=await fetch(l,{cache:`no-store`,headers:u,redirect:e.redirect,signal:f})}catch(t){if(e.signal?.aborted||!isStreamDisconnectError(t)||c===n.maxAttempts-1)throw t;await sleep(o,e.signal),o=Math.min(o*2,n.maxDelayMs);continue}if(p.ok){if(!p.body)throw new ClientError(p.status,`Response body is null.`,p.headers);try{readMessageStreamVersion(p.headers)}catch(e){throw p.body.cancel().catch(()=>{}),d.abort(),e}let e=!1;return{headers:p.headers,body:p.body,close:()=>{e||(e=!0,p.body?.cancel().catch(()=>{}),d.abort())},tailIndex:parseTailIndexHeader(p.headers)}}r=p.status,i=await p.text(),a=p.headers;let m=createClientError(p.status,i,p.headers);if(!isRetryableStreamError(m,t.retryableErrorStatuses))throw m;c<n.maxAttempts-1&&(await sleep(o,e.signal),o=Math.min(o*2,n.maxDelayMs))}throw new ClientError(r??0,i??`Failed to open message stream.`,a)}function parseTailIndexHeader(e){let t=e.get(EVE_STREAM_TAIL_INDEX_HEADER);if(t===null||!/^-?\d+$/.test(t))return;let n=Number(t);return Number.isSafeInteger(n)?n:void 0}async function sleep(e,t){t?.aborted||await new Promise(n=>{let onAbort=()=>{clearTimeout(r),n()},r=setTimeout(()=>{t?.removeEventListener(`abort`,onAbort),n()},e);t?.addEventListener(`abort`,onAbort,{once:!0})})}export{DEFAULT_STREAM_RECONNECT_POLICY,RECONNECT_BACKOFF,followStreamIterable,followStreamLines,isRetryableStreamError,openStreamBody,sleep};
|
|
1
|
+
import{SessionNotActiveError}from"#channel/session-not-active-error.js";import{ClientError,ClientSessionStrandedError,createClientError}from"#client/client-error.js";import{createEventReader}from"#protocol/session-lines.js";import{EVE_STREAM_TAIL_INDEX_HEADER}from"#protocol/session-http.js";import{createClientUrl}from"#client/url.js";import{throwIfAborted}from"#client/abort-signal.js";import{isV26Line}from"#protocol/v26-lines.js";import{isStreamDisconnectError,readNdjsonStream}from"#client/ndjson.js";import{readMessageStreamVersion}from"#client/stream-version.js";const RECONNECT_BACKOFF={baseDelayMs:250,maxDelayMs:5e3},DEFAULT_STREAM_RECONNECT_POLICY={reconnect:!0,retryableErrorStatuses:new Set([404,409,425,500,502,503,504]),streamOpenReconnectPolicy:{baseDelayMs:250,maxAttempts:12,maxDelayMs:5e3}},NO_STREAM_RECONNECT_POLICY={...DEFAULT_STREAM_RECONNECT_POLICY,reconnect:!1,streamOpenReconnectPolicy:{...DEFAULT_STREAM_RECONNECT_POLICY.streamOpenReconnectPolicy,maxAttempts:1}};function isRetryableStreamError(e,t=DEFAULT_STREAM_RECONNECT_POLICY.retryableErrorStatuses){return e instanceof ClientSessionStrandedError?!1:SessionNotActiveError.is(e)?t.has(409):e instanceof ClientError?e.code!==`session_version_unsupported`&&t.has(e.status):isStreamDisconnectError(e)}function resolveRetryPolicy(e,t){return{...t,...e}}function resolveStreamReconnectPolicy(e){if(e&&`reconnect`in e&&e.reconnect===!1)return NO_STREAM_RECONNECT_POLICY;let t=e;return{reconnect:!0,retryableErrorStatuses:t?.retryableErrorStatuses?new Set(t.retryableErrorStatuses):DEFAULT_STREAM_RECONNECT_POLICY.retryableErrorStatuses,streamOpenReconnectPolicy:resolveRetryPolicy(t?.streamOpenReconnectPolicy,DEFAULT_STREAM_RECONNECT_POLICY.streamOpenReconnectPolicy)}}async function*followStreamLines(e){let resolvePolicy=()=>resolveStreamReconnectPolicy(e.resolveReconnectPolicy===void 0?e.streamReconnectPolicy:e.resolveReconnectPolicy()),t=e.follow===!1||e.onCaughtUp!==void 0,n=e.startIndex,r=RECONNECT_BACKOFF.baseDelayMs,i=0,a,o=!1,passedTail=()=>a!==void 0&&n>a,noteProgress=()=>(!o&&passedTail()&&(o=!0,e.onCaughtUp?.()),e.follow===!1&&passedTail());for(;;){let o=resolvePolicy(),s;try{s=await openStreamBody({...e,retryPolicy:o,startIndex:n,requestTailIndex:(t||n<0)&&a===void 0})}catch(t){if(e.signal?.aborted)return;throw t}if((t||n<0)&&a===void 0){if(a=s.tailIndex,a===void 0)throw s.close(),Error(`This read requires the server to report the ${EVE_STREAM_TAIL_INDEX_HEADER} header. The agent may be running an older eve version.`);n<0&&(n=Math.max(0,a+1+n))}try{e.onOpen?.(s.headers)}catch(e){throw s.close(),e}if(noteProgress()){s.close();return}let c=!1,l=!1;try{for await(let t of readNdjsonStream(s.body,{signal:e.signal,idleTimeoutMs:e.streamReadIdleTimeoutMs??3e4}))switch(t.kind){case`transport`:switch(t.record.$eve){case`position`:if(t.record.next>n&&(n=t.record.next),e.onPosition?.(n),noteProgress())return;break;case`stream.lease-ended`:l=!0;break;case`stream.ended`:c=!0}continue;case`unknown-transport`:continue;case`commit`:case`progress`:case`invalid`:{if(t.kind===`invalid`&&isV26Line(t.value))throw new ClientError(409,JSON.stringify({code:`session_version_unsupported`,error:`This session was started by an earlier eve version. Start a new session.`}));let a=n;if(n+=1,i=0,r=RECONNECT_BACKOFF.baseDelayMs,yield{line:t.kind===`invalid`?void 0:t.line,position:a},e.onPosition?.(n),noteProgress())return}}}catch(e){if(!isStreamDisconnectError(e))throw e}finally{s.close()}if(c||e.signal?.aborted||!resolvePolicy().reconnect)return;if(!l){if(i+=1,e.follow===!1&&i>=o.streamOpenReconnectPolicy.maxAttempts)throw Error(`The session stream kept disconnecting before the read reached its tail.`);if(await sleep(r,e.signal),e.signal?.aborted)return;r=Math.min(r*2,RECONNECT_BACKOFF.maxDelayMs)}}}async function*followStreamIterable(e){let t=createEventReader();for await(let{line:n,position:r}of followStreamLines(e)){if(n===void 0)continue;let e=t.read(n,r);for(let[t,n]of e.entries())yield{cursor:t===e.length-1?r+1:r,event:n}}}async function openStreamBody(e){let t=e.retryPolicy??resolveStreamReconnectPolicy(e.streamReconnectPolicy),n=t.streamOpenReconnectPolicy,r,i,a,o=n.baseDelayMs,s={...e.searchParams};e.startIndex!==0&&(s.startIndex=String(e.startIndex)),e.requestTailIndex===!0&&(s.includeTailIndex=`1`),e.follow===!1&&(s.follow=`false`);for(let c=0;c<n.maxAttempts;c+=1){throwIfAborted(e.signal);let l=createClientUrl(e.baseUrl,e.path,Object.keys(s).length>0?s:void 0),u=await e.resolveHeaders();throwIfAborted(e.signal);let d=new AbortController,f=e.signal?AbortSignal.any([e.signal,d.signal]):d.signal,p;try{p=await fetch(l,{cache:`no-store`,headers:u,redirect:e.redirect,signal:f})}catch(t){if(e.redirect===`error`&&t instanceof Error&&t.cause instanceof Error&&t.cause.message===`unexpected redirect`)throw Error(`The session stream refused a redirect. Use the final agent URL instead.`,{cause:t});if(e.signal?.aborted||!isStreamDisconnectError(t)||c===n.maxAttempts-1)throw t;await sleep(o,e.signal),o=Math.min(o*2,n.maxDelayMs);continue}if(p.ok){if(!p.body)throw new ClientError(p.status,`Response body is null.`,p.headers);try{readMessageStreamVersion(p.headers)}catch(e){throw p.body.cancel().catch(()=>{}),d.abort(),e}let e=!1;return{headers:p.headers,body:p.body,close:()=>{e||(e=!0,p.body?.cancel().catch(()=>{}),d.abort())},tailIndex:parseTailIndexHeader(p.headers)}}r=p.status,i=await p.text(),a=p.headers;let m=createClientError(p.status,i,p.headers);if(!isRetryableStreamError(m,t.retryableErrorStatuses))throw m;c<n.maxAttempts-1&&(await sleep(o,e.signal),o=Math.min(o*2,n.maxDelayMs))}throw new ClientError(r??0,i??`Failed to open message stream.`,a)}function parseTailIndexHeader(e){let t=e.get(EVE_STREAM_TAIL_INDEX_HEADER);if(t===null||!/^-?\d+$/.test(t))return;let n=Number(t);return Number.isSafeInteger(n)?n:void 0}async function sleep(e,t){t?.aborted||await new Promise(n=>{let onAbort=()=>{clearTimeout(r),n()},r=setTimeout(()=>{t?.removeEventListener(`abort`,onAbort),n()},e);t?.addEventListener(`abort`,onAbort,{once:!0})})}export{DEFAULT_STREAM_RECONNECT_POLICY,RECONNECT_BACKOFF,followStreamIterable,followStreamLines,isRetryableStreamError,openStreamBody,sleep};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{summarizeMessage}from"#client/session-store-helpers.js";var OptimisticMessageSubmissions=class{#e;#t;#n=new Map;constructor(e,t){this.#t=e,this.#e=t}reset(){this.#n.clear(),this.#r()}submit(e,t){if(e.message===void 0)return;let n=crypto.randomUUID()
|
|
1
|
+
import{summarizeMessage}from"#client/session-store-helpers.js";let submissionSequence=0;var OptimisticMessageSubmissions=class{#e;#t;#n=new Map;constructor(e,t){this.#t=e,this.#e=t}reset(){this.#n.clear(),this.#r()}submit(e,t){if(e.message===void 0)return;let n=crypto.randomUUID?.()??`submission_${(submissionSequence+=1).toString()}`;return this.#n.set(n,{id:n,message:summarizeMessage(e.message),turnId:t}),this.#r(),n}resubmit(e,t){if(e===void 0)return this.submit(t);let n=this.#n.get(e);return t.message===void 0?this.#n.delete(e):this.#n.set(e,{...n,id:e,message:summarizeMessage(t.message)}),this.#r(),t.message===void 0?void 0:e}correlate(e,t){if(e===void 0)return;let n=this.#n.get(e);n!==void 0&&this.#n.set(e,{...n,deliveryId:t})}reconcile(e){for(let[t,n]of this.#n){let r=n.deliveryId===void 0?void 0:e.deliveries[n.deliveryId];n.turnId===void 0&&r?.turnId!==void 0&&this.#n.set(t,{...n,turnId:r.turnId}),r?.consumedAt===void 0?(r?.status===`settled`||e.session.status===`ended`)&&n.error===void 0&&this.fail(Error(r?.reason??`The message was not consumed.`),t):this.#n.delete(t)}this.#r()}fail(e,t){if(t===void 0)return;let n=this.#n.get(t);n!==void 0&&(this.#n.set(t,{...n,error:{message:e.message}}),this.#r())}get awaitingReceipt(){return[...this.#n.values()].some(e=>e.deliveryId===void 0&&e.error===void 0)}#r(){this.#t([...this.#n.values()].filter(e=>this.#e||e.error!==void 0))}};export{OptimisticMessageSubmissions};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{activeTurn,failure,idle}from"#protocol/session-projection/selectors.js";import{SessionNotActiveError}from"#channel/session-not-active-error.js";import{StreamDelivery}from"#client/delivery.js";import{toError}from"#shared/errors.js";import{assertAnswerable,assertExclusiveTurnInput,isAbortError}from"#client/session-store-helpers.js";import{throwIfAborted}from"#client/abort-signal.js";import{Client}from"#client/client.js";import{OptimisticMessageSubmissions}from"#client/optimistic-message-submissions.js";import{ConversationClient}from"#client/conversation-client.js";import{waitWithSignal}from"#shared/wait-with-signal.js";const detachStore=Symbol(`detachSessionStore`),attachStore=Symbol(`attachSessionStore`);var SessionStore=class{#e;#t;#n;#r;#i;#a=new Set;#o=new Set;#s;#c;#l=new Set;#u=new Set;#d=!1;#f=!1;#p=0;#m=!1;#h={};#g=new AbortController;#_;#v;#y;#b;#x;#S;#C;#w;#T=!1;#E=0;#D=0;#O=new Set;#k=[];constructor(e){this.#t=e.prewarm??!1,this.#n=e.followAgents??!1,this.#r=e.followWhile??(()=>!0),this.#i=e.session!==void 0,this.#e=this.#i?void 0:e.client??new Client({auth:e.auth,headers:e.headers,baseUrl:e.baseUrl??``}),this.#s=new ConversationClient(()=>this.#Z()),this.#S=(e.initialEvents??[]).filter(e=>this.#s.hydrate(e)),this.#c=new OptimisticMessageSubmissions(e=>this.#s.showSubmissions(e),e.optimistic??!0),this.#b=e.session??(e.initialSession===void 0?void 0:this.#e?.sessions.attach(e.initialSession.sessionId,{streamIndex:e.initialSession.streamIndex})),this.#x=this.#q(),this.#C=this.#X()}get snapshot(){return this.#C}observe(){this.#p+=1,this.#M();let e=!1;return()=>{e||(e=!0,--this.#p,!this.#f&&this.#p===0&&this.#N())}}setCallbacks(e){this.#h=e}subscribe(e){return this.#a.add(e),()=>void this.#a.delete(e)}async prewarm(){if(this.#b!==void 0)return await this.#L(this.#b);let e=this.#g;try{await this.#I()}catch(t){throw e===this.#g&&!isAbortError(t)&&this.#l.size===0&&this.#J(t),t}e===this.#g&&this.#r(this.#s.conversation.view)&&this.#z()}async send(e){if(this.#y!==void 0)throw Error(`eve session is resuming.`);assertExclusiveTurnInput(e),assertAnswerable(e,this.#s.conversation);let t=this.#g,n=e.signal?AbortSignal.any([t.signal,e.signal]):t.signal,r=Promise.withResolvers();this.#l.add(r.promise),this.#x=void 0;let i=this.#c.submit(e,e.turnPolicy===`steer`?activeTurn(this.#s.view)?.turnId:void 0),a=this.#s.projectAnswers(e.answers);this.#Z();let o=!1;try{let s=this.#h.prepareSend===void 0?e:await waitWithSignal(Promise.resolve(this.#h.prepareSend(e)),n);throwIfAborted(n),assertExclusiveTurnInput(s),s!==e&&(i=this.#c.resubmit(i,s),a=this.#s.replaceAnswers(a,s),this.#Z()),o=!0,this.#E+=1;let c=await this.#R({...s,signal:n});throwIfAborted(n);let l=c.deliveryId;if(l===void 0)throw Error(`The server did not identify the accepted delivery.`);return a?.accept(l),a=void 0,t===this.#g&&(i!==void 0&&(this.#s.confirmSubmission(i,l),this.#c.correlate(i,l)),this.#H(l)),r.resolve(l),new StreamDelivery({sessionId:c.sessionId,deliveryId:l,createStream:e=>c.stream(e)})}catch(e){throw t===this.#g&&(a?.(),this.#c.fail(toError(e),i),isAbortError(e)||this.#J(e)),e}finally{r.resolve(void 0),t===this.#g&&(this.#l.delete(r.promise),o&&--this.#E,this.#Z(),this.#G())}}follow(e){if(this.#b===void 0)throw Error(`An eve session is required before following.`);if(e.sessionId!==this.#b.id)throw Error(`The delivery belongs to a different eve session.`);let t=this.#s.view,n=t.deliveries[e.deliveryId];t.session.status!==`ended`&&n?.status!==`settled`&&(this.#x=void 0,this.#H(e.deliveryId),this.#u.has(e.deliveryId)&&this.#z(),this.#Z())}resume(){if(this.#y!==void 0)return this.#y;if(this.#b===void 0)return Promise.reject(Error(`An eve session is required before resuming.`));if(this.#l.size>0)return Promise.reject(Error(`eve session has pending submissions.`));let e=this.#g;this.#x=void 0;let t=this.#z({startIndex:this.#s.view.position}).caughtUp.then(()=>{e===this.#g&&(this.#x??=this.#q())}).finally(()=>{e===this.#g&&(this.#y=void 0,this.#Z(),this.#G())});return this.#y=t,this.#Z(!0),t}async cancel(){let e=this.#g,t=activeTurn(this.#s.view)?.turnId??await this.#A(e.signal);return throwIfAborted(e.signal),this.#j(e=>e.cancel({turnId:t??null}))}async#A(e){let t=new Set(this.#u.keys()),n=[...this.#l],r=n.length,i=Promise.withResolvers(),check=()=>{let e=this.#s.view;if(e.session.status===`ended`)return i.resolve(void 0);for(let n of t){let r=e.deliveries[n],a=r?.turnId===void 0?void 0:e.turns[r.turnId];if(a?.status===`running`)return i.resolve(a.turnId);(r?.status===`settled`||a?.status===`settled`)&&t.delete(n)}r===0&&t.size===0?i.resolve(void 0):this.#x!==void 0&&i.reject(this.#x)};this.#o.add(check);for(let e of n)e.then(e=>{--r,e!==void 0&&t.add(e),check()});try{return check(),await waitWithSignal(i.promise,e)}finally{this.#o.delete(check)}}compact(){return this.#j(e=>e.compact())}clear(){return this.#j(e=>e.clear())}reset(){return this.#j(e=>e.reset())}async#j(e){let t=this.#b;if(t===void 0)throw new SessionNotActiveError;let n=this.#g;this.#E+=1,this.#z(),this.#Z();try{let r=await e(t);return throwIfAborted(n.signal),this.#H(r.deliveryId),r}finally{n===this.#g&&(--this.#E,this.#Z(),this.#G())}}[attachStore](){this.#f=!0,this.#M()}#M(){if(this.#d)return;this.#d=!0,this.#B();let e=this.#m&&this.#r(this.#s.conversation.view);this.#m=!1,this.#b!==void 0&&(this.#W||e)&&this.#z(),this.#t&&this.#b===void 0&&this.prewarm().catch(()=>{})}[detachStore](){this.#f=!1,this.#p===0&&this.#N()}#N(){this.#d=!1,this.#m=this.#s.streaming,this.#P()}newSession(){this.#P(),this.#i||(this.#b=void 0),this.#u.clear(),this.#O.clear(),this.#S=[],this.#s.reset(),this.#c.reset(),this.#x=void 0,this.#d&&this.#B(),this.#h.onSessionChange?.(this.#Y),this.#Z(),this.#t&&this.#d&&this.prewarm().catch(()=>{})}#P(){this.#s.stop(),this.#g.abort(),this.#g=new AbortController,this.#_=void 0,this.#y=void 0,this.#l.clear(),this.#E=0,this.#D=0,this.#F()}#F(){this.#s.closeStream();let e=this.#S.length;for(;e>0&&this.#S[e-1].meta.endOfLine===!1;)--e;e<this.#S.length&&(this.#S=this.#S.slice(0,e)),this.#k=[],this.#T=!1}#I(e){if(this.#_!==void 0)return this.#_;let t=this.#e;if(t===void 0)return Promise.reject(Error(`This store cannot create a session.`));let n=this.#g,r=e?.signal??n.signal,i=(async()=>{let i,a;return e?.message===void 0?{session:i}=await t.sessions.create({signal:r}):{session:i,delivery:a}=await t.sessions.create({...e,message:e.message,signal:r}),throwIfAborted(n.signal),this.#b=i,this.#x=void 0,this.#h.onSessionChange?.(this.#Y),this.#B(),this.#Z(),a})();this.#_=i;let clear=()=>{this.#_===i&&(this.#_=void 0)};return i.then(clear,clear),i}#L(e){let t=this.#g;if(this.#v?.lifetime===t)return this.#v.promise;let n=e.prewarm({signal:t.signal}).then(()=>void 0),r={lifetime:t,promise:n};this.#v=r;let clear=()=>{this.#v===r&&(this.#v=void 0)};return n.then(clear,clear),n}async#R(e){if(this.#_!==void 0&&await waitWithSignal(this.#_.catch(()=>void 0),e.signal),throwIfAborted(e.signal),this.#b===void 0){if(e.message===void 0)throw Error(`Cannot answer before the session starts.`);let t=await this.#I(e);if(this.#z(e),t===void 0)throw Error(`The session was created without accepting a message.`);return t}return this.#z(e),e.answers===void 0?await this.#b.send(e.message,e):await this.#b.respond(e.answers,e)}#z(e={}){if(this.#b===void 0)throw Error(`A session is required before opening its stream.`);this.#B();let t=this.#g;return this.#s.stream(this.#b,{startIndex:this.#s.view.position,...e,onEvent:(e,n)=>{t===this.#g&&this.#V(e,n)},onError:e=>{t===this.#g&&(this.#F(),this.#J(e))}})}#B(){this.#n&&this.#b&&this.#s.follow(this.#b,this.#n)}#V(e,t){let n=this.#g;if(this.#T=e.meta.endOfLine===!1,!this.#s.observe(e,{notify:!1})||(this.#S=[...this.#S,e],this.#h.onEvent?.(e),n!==this.#g)||(e.type===`turn.started`&&!t&&(this.#x=void 0),(e.type===`turn.settled`||e.type===`session.ended`)&&this.#k.push({event:e,historical:t}),this.#T))return;let r=this.#s.view,i=new Set([...this.#u].map(e=>r.deliveries[e]?.turnId).filter(e=>e!==void 0));this.#U();for(let e of this.#k.splice(0)){if(e.event.type===`turn.settled`)e.historical?i.has(e.event.data.turnId)&&this.#l.size===0&&(this.#x??=this.#q(e.event.data.turnId)):this.#K(e.event.data.turnId);else if(e.event.data.outcome===`failed`){let t=Object.assign(Error(e.event.data.error?.message??`The session failed.`),{name:e.event.data.error?.code??`SESSION_FAILED`});e.historical?this.#l.size===0&&(this.#x??=t):this.#J(t)}if(n!==this.#g)return}for(let e of this.#o)e();this.#h.onSessionChange?.(this.#Y),n===this.#g&&(this.#Z(),n===this.#g&&(this.#s.reconcileFollowing(),n===this.#g&&this.#G()))}#H(e){this.#u.add(e),this.#U();let t=this.#s.view,n=t.deliveries[e]?.turnId;n!==void 0&&t.turns[n]?.status===`settled`&&(this.#x??=this.#q(n)),t.session.status===`ended`&&(this.#x??=this.#q())}#U(){let e=this.#s.view;e.session.status===`ended`&&this.#u.clear(),this.#c.reconcile(e);for(let t of this.#u)e.deliveries[t]?.status===`settled`&&this.#u.delete(t)}get#W(){return this.#y!==void 0||this.#E>0||this.#l.size>0||this.#u.size>0}#G(){this.#T||this.#W||this.#r(this.#s.conversation.view)||this.#s.closeStream()}#K(e){if(this.#O.has(e)||this.#s.view.turns[e]?.status!==`settled`)return;this.#O.add(e),this.#D+=1;let t=failure(this.#s.view,e);t!==void 0&&this.#J(Object.assign(Error(t.message),{name:t.code}))}#q(e=this.#s.view.session.latestTurnId){let t=this.#s.view,n=failure(t,e);return n===void 0?void 0:Object.assign(Error(n.message),{name:n.code})}#J(e){let t=this.#x!==void 0;this.#x=toError(e);for(let e of this.#o)e();t||this.#h.onError?.(this.#x),this.#Z()}get#Y(){if(this.#b===void 0)return this.#w=void 0;let e=this.#b.id,t=this.#s.view.position;return(this.#w?.sessionId!==e||this.#w.streamIndex!==t)&&(this.#w={sessionId:e,streamIndex:t}),this.#w}#X(){this.#s.holdUnconfirmedMessages(this.#E>0&&this.#c.awaitingReceipt);let e=this.#s.conversation,{view:t}=e;return{...e,view:t,error:this.#x,events:this.#S,session:this.#Y,status:this.#y===void 0?this.#W||!idle(this.#s.view)?`busy`:`idle`:`resuming`}}#Z(e=!1){if(this.#y!==void 0&&!e)return;if(this.#T){if(this.#x===void 0&&!this.#W)return;this.#C={...this.#C,error:this.#x,status:this.#y===void 0?this.#W?`busy`:this.#C.status:`resuming`};for(let e of this.#a)e();return}this.#C=this.#X();let t=this.#D,n=this.#g;this.#D=0;for(let e of this.#a)e();for(let e=0;e<t&&n===this.#g;e+=1)this.#h.onFinish?.(this.#C)}};function detachSessionStore(e){e[detachStore]()}function attachSessionStore(e){e[attachStore]()}export{SessionStore,attachSessionStore,detachSessionStore};
|
|
1
|
+
import{activeTurn,failure,idle}from"#protocol/session-projection/selectors.js";import{SessionNotActiveError}from"#channel/session-not-active-error.js";import{StreamDelivery}from"#client/delivery.js";import{toError}from"#shared/errors.js";import{assertAnswerable,assertExclusiveTurnInput,isAbortError}from"#client/session-store-helpers.js";import{throwIfAborted}from"#client/abort-signal.js";import{Client}from"#client/client.js";import{OptimisticMessageSubmissions}from"#client/optimistic-message-submissions.js";import{ConversationClient}from"#client/conversation-client.js";import{waitWithSignal}from"#shared/wait-with-signal.js";const detachStore=Symbol(`detachSessionStore`),attachStore=Symbol(`attachSessionStore`);var SessionStore=class{#e;#t;#n;#r;#i;#a=new Set;#o=new Set;#s;#c;#l=new Set;#u=new Set;#d=!1;#f=!1;#p=0;#m=!1;#h={};#g=new AbortController;#_;#v;#y;#b;#x;#S;#C;#w;#T=!1;#E=0;#D=0;#O=new Set;#k=[];constructor(e){this.#t=e.prewarm??!1,this.#n=e.followAgents??!1,this.#r=e.followWhile??(()=>!0),this.#i=e.session!==void 0,this.#e=this.#i?void 0:e.client??new Client({auth:e.auth,headers:e.headers,baseUrl:e.baseUrl??``}),this.#s=new ConversationClient(()=>this.#Z()),this.#S=(e.initialEvents??[]).filter(e=>this.#s.hydrate(e)),this.#c=new OptimisticMessageSubmissions(e=>this.#s.showSubmissions(e),e.optimistic??!0),this.#b=e.session??(e.initialSession===void 0?void 0:this.#e?.sessions.attach(e.initialSession.sessionId,{streamIndex:e.initialSession.streamIndex,inbox:e.initialSession.inbox})),this.#x=this.#q(),this.#C=this.#X()}get snapshot(){return this.#C}observe(){this.#p+=1,this.#M();let e=!1;return()=>{e||(e=!0,--this.#p,!this.#f&&this.#p===0&&this.#N())}}setCallbacks(e){this.#h=e}subscribe(e){return this.#a.add(e),()=>void this.#a.delete(e)}async prewarm(){if(this.#b!==void 0)return await this.#L(this.#b);let e=this.#g;try{await this.#I()}catch(t){throw e===this.#g&&!isAbortError(t)&&this.#l.size===0&&this.#J(t),t}e===this.#g&&this.#r(this.#s.conversation.view)&&this.#z()}async send(e){if(this.#y!==void 0)throw Error(`eve session is resuming.`);assertExclusiveTurnInput(e),assertAnswerable(e,this.#s.conversation);let t=this.#g,n=e.signal?AbortSignal.any([t.signal,e.signal]):t.signal,r=Promise.withResolvers();this.#l.add(r.promise),this.#x=void 0;let i=this.#c.submit(e,e.turnPolicy===`steer`?activeTurn(this.#s.view)?.turnId:void 0),a=this.#s.projectAnswers(e.answers);this.#Z();let o=!1;try{let s=this.#h.prepareSend===void 0?e:await waitWithSignal(Promise.resolve(this.#h.prepareSend(e)),n);throwIfAborted(n),assertExclusiveTurnInput(s),s!==e&&(i=this.#c.resubmit(i,s),a=this.#s.replaceAnswers(a,s),this.#Z()),o=!0,this.#E+=1;let c=await this.#R({...s,signal:n});throwIfAborted(n);let l=c.deliveryId;if(l===void 0)throw Error(`The server did not identify the accepted delivery.`);return a?.accept(l),a=void 0,t===this.#g&&(i!==void 0&&(this.#s.confirmSubmission(i,l),this.#c.correlate(i,l)),this.#H(l),this.#h.onSessionChange?.(this.#Y)),r.resolve(l),new StreamDelivery({sessionId:c.sessionId,deliveryId:l,createStream:e=>c.stream(e)})}catch(e){throw t===this.#g&&(a?.(),this.#c.fail(toError(e),i),isAbortError(e)||this.#J(e)),e}finally{r.resolve(void 0),t===this.#g&&(this.#l.delete(r.promise),o&&--this.#E,this.#Z(),this.#G())}}follow(e){if(this.#b===void 0)throw Error(`An eve session is required before following.`);if(e.sessionId!==this.#b.id)throw Error(`The delivery belongs to a different eve session.`);let t=this.#s.view,n=t.deliveries[e.deliveryId];t.session.status!==`ended`&&n?.status!==`settled`&&(this.#x=void 0,this.#H(e.deliveryId),this.#u.has(e.deliveryId)&&this.#z(),this.#Z())}resume(){if(this.#y!==void 0)return this.#y;if(this.#b===void 0)return Promise.reject(Error(`An eve session is required before resuming.`));if(this.#l.size>0)return Promise.reject(Error(`eve session has pending submissions.`));let e=this.#g;this.#x=void 0;let t=this.#z({startIndex:this.#s.view.position}).caughtUp.then(()=>{e===this.#g&&(this.#x??=this.#q())}).finally(()=>{e===this.#g&&(this.#y=void 0,this.#Z(),this.#G())});return this.#y=t,this.#Z(!0),t}async cancel(){let e=this.#g,t=activeTurn(this.#s.view)?.turnId??await this.#A(e.signal);return throwIfAborted(e.signal),this.#j(e=>e.cancel({turnId:t??null}))}async#A(e){let t=new Set(this.#u.keys()),n=[...this.#l],r=n.length,i=Promise.withResolvers(),check=()=>{let e=this.#s.view;if(e.session.status===`ended`)return i.resolve(void 0);for(let n of t){let r=e.deliveries[n],a=r?.turnId===void 0?void 0:e.turns[r.turnId];if(a?.status===`running`)return i.resolve(a.turnId);(r?.status===`settled`||a?.status===`settled`)&&t.delete(n)}r===0&&t.size===0?i.resolve(void 0):this.#x!==void 0&&i.reject(this.#x)};this.#o.add(check);for(let e of n)e.then(e=>{--r,e!==void 0&&t.add(e),check()});try{return check(),await waitWithSignal(i.promise,e)}finally{this.#o.delete(check)}}compact(){return this.#j(e=>e.compact())}clear(){return this.#j(e=>e.clear())}reset(){return this.#j(e=>e.reset())}async#j(e){let t=this.#b;if(t===void 0)throw new SessionNotActiveError;let n=this.#g;this.#E+=1,this.#z(),this.#Z();try{let r=await e(t);return throwIfAborted(n.signal),this.#H(r.deliveryId),r}finally{n===this.#g&&(--this.#E,this.#Z(),this.#G())}}[attachStore](){this.#f=!0,this.#M()}#M(){if(this.#d)return;this.#d=!0,this.#B();let e=this.#m&&this.#r(this.#s.conversation.view);this.#m=!1,this.#b!==void 0&&(this.#W||e)&&this.#z(),this.#t&&this.#b===void 0&&this.prewarm().catch(()=>{})}[detachStore](){this.#f=!1,this.#p===0&&this.#N()}#N(){this.#d=!1,this.#m=this.#s.streaming,this.#P()}newSession(){this.#P(),this.#i||(this.#b=void 0),this.#u.clear(),this.#O.clear(),this.#S=[],this.#s.reset(),this.#c.reset(),this.#x=void 0,this.#d&&this.#B(),this.#h.onSessionChange?.(this.#Y),this.#Z(),this.#t&&this.#d&&this.prewarm().catch(()=>{})}#P(){this.#s.stop(),this.#g.abort(),this.#g=new AbortController,this.#_=void 0,this.#y=void 0,this.#l.clear(),this.#E=0,this.#D=0,this.#F()}#F(){this.#s.closeStream();let e=this.#S.length;for(;e>0&&this.#S[e-1].meta.endOfLine===!1;)--e;e<this.#S.length&&(this.#S=this.#S.slice(0,e)),this.#k=[],this.#T=!1}#I(e){if(this.#_!==void 0)return this.#_;let t=this.#e;if(t===void 0)return Promise.reject(Error(`This store cannot create a session.`));let n=this.#g,r=e?.signal??n.signal,i=(async()=>{let i,a;return e?.message===void 0?{session:i}=await t.sessions.create({signal:r}):{session:i,delivery:a}=await t.sessions.create({...e,message:e.message,signal:r}),throwIfAborted(n.signal),this.#b=i,this.#x=void 0,this.#h.onSessionChange?.(this.#Y),this.#B(),this.#Z(),a})();this.#_=i;let clear=()=>{this.#_===i&&(this.#_=void 0)};return i.then(clear,clear),i}#L(e){let t=this.#g;if(this.#v?.lifetime===t)return this.#v.promise;let n=e.prewarm({signal:t.signal}).then(()=>void 0),r={lifetime:t,promise:n};this.#v=r;let clear=()=>{this.#v===r&&(this.#v=void 0)};return n.then(clear,clear),n}async#R(e){if(this.#_!==void 0&&await waitWithSignal(this.#_.catch(()=>void 0),e.signal),throwIfAborted(e.signal),this.#b===void 0){if(e.message===void 0)throw Error(`Cannot answer before the session starts.`);let t=await this.#I(e);if(this.#z(e),t===void 0)throw Error(`The session was created without accepting a message.`);return t}return this.#z(e),e.answers===void 0?await this.#b.send(e.message,e):await this.#b.respond(e.answers,e)}#z(e={}){if(this.#b===void 0)throw Error(`A session is required before opening its stream.`);this.#B();let t=this.#g;return this.#s.stream(this.#b,{startIndex:this.#s.view.position,...e,onEvent:(e,n)=>{t===this.#g&&this.#V(e,n)},onError:e=>{t===this.#g&&(this.#F(),this.#J(e))}})}#B(){this.#n&&this.#b&&this.#s.follow(this.#b,this.#n)}#V(e,t){let n=this.#g;if(this.#T=e.meta.endOfLine===!1,!this.#s.observe(e,{notify:!1})||(this.#S=[...this.#S,e],this.#h.onEvent?.(e),n!==this.#g)||(e.type===`turn.started`&&!t&&(this.#x=void 0),(e.type===`turn.settled`||e.type===`session.ended`)&&this.#k.push({event:e,historical:t}),this.#T))return;let r=this.#s.view,i=new Set([...this.#u].map(e=>r.deliveries[e]?.turnId).filter(e=>e!==void 0));this.#U();for(let e of this.#k.splice(0)){if(e.event.type===`turn.settled`)e.historical?i.has(e.event.data.turnId)&&this.#l.size===0&&(this.#x??=this.#q(e.event.data.turnId)):this.#K(e.event.data.turnId);else if(e.event.data.outcome===`failed`){let t=Object.assign(Error(e.event.data.error?.message??`The session failed.`),{name:e.event.data.error?.code??`SESSION_FAILED`});e.historical?this.#l.size===0&&(this.#x??=t):this.#J(t)}if(n!==this.#g)return}for(let e of this.#o)e();this.#h.onSessionChange?.(this.#Y),n===this.#g&&(this.#Z(),n===this.#g&&(this.#s.reconcileFollowing(),n===this.#g&&this.#G()))}#H(e){this.#u.add(e),this.#U();let t=this.#s.view,n=t.deliveries[e]?.turnId;n!==void 0&&t.turns[n]?.status===`settled`&&(this.#x??=this.#q(n)),t.session.status===`ended`&&(this.#x??=this.#q())}#U(){let e=this.#s.view;e.session.status===`ended`&&this.#u.clear(),this.#c.reconcile(e);for(let t of this.#u)e.deliveries[t]?.status===`settled`&&this.#u.delete(t)}get#W(){return this.#y!==void 0||this.#E>0||this.#l.size>0||this.#u.size>0}#G(){this.#T||this.#W||this.#r(this.#s.conversation.view)||this.#s.closeStream()}#K(e){if(this.#O.has(e)||this.#s.view.turns[e]?.status!==`settled`)return;this.#O.add(e),this.#D+=1;let t=failure(this.#s.view,e);t!==void 0&&this.#J(Object.assign(Error(t.message),{name:t.code}))}#q(e=this.#s.view.session.latestTurnId){let t=this.#s.view,n=failure(t,e);return n===void 0?void 0:Object.assign(Error(n.message),{name:n.code})}#J(e){let t=this.#x!==void 0;this.#x=toError(e);for(let e of this.#o)e();t||this.#h.onError?.(this.#x),this.#Z()}get#Y(){if(this.#b===void 0)return this.#w=void 0;let e=this.#b.id,t=this.#s.view.position,{inbox:n}=this.#b.state;return(this.#w?.sessionId!==e||this.#w.streamIndex!==t||this.#w.inbox!==n)&&(this.#w={sessionId:e,streamIndex:t,inbox:n}),this.#w}#X(){this.#s.holdUnconfirmedMessages(this.#E>0&&this.#c.awaitingReceipt);let e=this.#s.conversation,{view:t}=e;return{...e,view:t,error:this.#x,events:this.#S,session:this.#Y,status:this.#y===void 0?this.#W||!idle(this.#s.view)?`busy`:`idle`:`resuming`}}#Z(e=!1){if(this.#y!==void 0&&!e)return;if(this.#T){if(this.#x===void 0&&!this.#W)return;this.#C={...this.#C,error:this.#x,status:this.#y===void 0?this.#W?`busy`:this.#C.status:`resuming`};for(let e of this.#a)e();return}this.#C=this.#X();let t=this.#D,n=this.#g;this.#D=0;for(let e of this.#a)e();for(let e=0;e<t&&n===this.#g;e+=1)this.#h.onFinish?.(this.#C)}};function detachSessionStore(e){e[detachStore]()}function attachSessionStore(e){e[attachStore]()}export{SessionStore,attachSessionStore,detachSessionStore};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SessionNotActiveError}from"#channel/session-not-active-error.js";import{StreamDelivery}from"#client/delivery.js";import{deliveryEvents}from"#client/delivery-events.js";import{EVE_SESSION_ROUTE_PATH,createEveSessionRoutePath,createEveSessionStreamRoutePath}from"#protocol/routes.js";import{ClientError,createClientError}from"#client/client-error.js";import{EVE_SESSION_ID_HEADER}from"#protocol/session-http.js";import{followStreamIterable,sleep}from"#client/open-stream.js";import{createClientUrl}from"#client/url.js";import{throwIfAborted}from"#client/abort-signal.js";import{ClientAgentSession}from"#client/agent-session.js";import{messageForRequest}from"#client/file-parts.js";import{prewarmClientSession,sendClientControl}from"#client/session-controls.js";import{serializeOutputSchema}from"#tools/schema.js";const followSession=Symbol(`followClientSession`);var ClientSession=class ClientSession{#e;#t;constructor(e,t){this.#e=e,this.#t=t}static async create(e,t){let n=Date.now(),r=await postTurn(e,EVE_SESSION_ROUTE_PATH,t,!0,t.stubs),i=Date.now(),{sessionId:a,deliveryId:o}=await readAcceptedMessage(r),s=new ClientSession(e,{sessionId:a,streamIndex:0}),c={deliveryId:o,startedAt:n,notReadyMs:0,acceptedAt:i};return{delivery:s.#i(r,t,0,o,c),session:s}}static async prewarm(e,t={}){let{sessionId:n}=await readAcceptedMessage(await postCreateSession(e,t));return new ClientSession(e,{sessionId:n,streamIndex:0})}get id(){return this.#t.sessionId}get state(){return this.#t}async snapshot(e){throwIfAborted(e?.signal);let t=[],n=0;for await(let{cursor:r,event:i}of this.#c({follow:!1,signal:e?.signal,startIndex:0}))t.push(i),n=r;return throwIfAborted(e?.signal),{events:t,session:{sessionId:this.#t.sessionId,streamIndex:n}}}async send(e,t={}){return await this.#n({...t,message:e},!0)}async respond(e,t={}){if(e.length===0)throw Error(`ClientSession.respond() requires at least one answer.`);return await this.#n({...t,answers:e},!1)}async#n(e,t){let n=this.#t.streamIndex,r=createEveSessionRoutePath(this.#t.sessionId),{response:i,timing:a}=await postSessionSend(this.#e,r,e,t),{sessionId:o,deliveryId:s}=await readAcceptedMessage(i,this.#t.sessionId);if(o!==this.#t.sessionId)throw Error(`Message route returned a different session id.`);if(s===void 0)throw Error(`Message route did not return a delivery id. Update the server before sending with this client.`);return this.#i(i,e,n,s,{...a,deliveryId:s})}async prewarm(e){return await prewarmClientSession({context:this.#e,sessionId:this.#t.sessionId,signal:e?.signal})}async cancel(e){return this.#r(`cancel`,e)}async clear(e){return this.#r(`clear`,e)}async compact(e){return this.#r(`compact`,e)}async reset(e){return this.#r(`reset`,e)}async#r(e,t){let n=this.#t.streamIndex,r=await sendClientControl({context:this.#e,kind:e,options:t,sessionId:this.#t.sessionId});return new StreamDelivery({...r,createStream:t=>this.#a(n,{signal:t?.signal},r.deliveryId,e!==`reset`)})}stream(e){return this.#o(e)}agent(e){return new ClientAgentSession(this.#e,this.id,e)}[followSession](e){return this.#o(e)}#i(e,t,n,r,i){if(e.body?.cancel().catch(()=>{}),r===void 0)throw Error(`Message route did not return a delivery id.`);return new StreamDelivery({createStream:e=>this.#a(n,{...t,signal:e?.signal},r),deliveryId:r,receipt:i,sessionId:this.#t.sessionId})}#a(e,t,n,r=!0){return deliveryEvents(this.#o({follow:r,headers:t.headers,signal:t.signal,startIndex:e,streamReconnectPolicy:t.streamReconnectPolicy}),n,t.signal)}async*#o(e){let t=e?.startIndex??this.#t.streamIndex;for await(let{cursor:n,event:r}of this.#c({follow:e?.follow,headers:e?.headers,onCaughtUp:e?.onCaughtUp,resolveHeaders:e?.resolveHeaders,resolveReconnectPolicy:e?.resolveReconnectPolicy,signal:e?.signal,startIndex:t,streamReconnectPolicy:e?.streamReconnectPolicy}))this.#s(n),yield r}#s(e){this.#t={
|
|
1
|
+
import{SessionNotActiveError}from"#channel/session-not-active-error.js";import{StreamDelivery}from"#client/delivery.js";import{deliveryEvents}from"#client/delivery-events.js";import{EVE_SESSION_ROUTE_PATH,createEveSessionRoutePath,createEveSessionStreamRoutePath}from"#protocol/routes.js";import{ClientError,createClientError}from"#client/client-error.js";import{EVE_SESSION_ID_HEADER}from"#protocol/session-http.js";import{followStreamIterable,sleep}from"#client/open-stream.js";import{createClientUrl}from"#client/url.js";import{throwIfAborted}from"#client/abort-signal.js";import{ClientAgentSession}from"#client/agent-session.js";import{messageForRequest}from"#client/file-parts.js";import{prewarmClientSession,sendClientControl}from"#client/session-controls.js";import{serializeOutputSchema}from"#tools/schema.js";const followSession=Symbol(`followClientSession`);var ClientSession=class ClientSession{#e;#t;constructor(e,t){this.#e=e,this.#t=t}static async create(e,t){let n=Date.now(),r=await postTurn(e,EVE_SESSION_ROUTE_PATH,t,!0,t.stubs),i=Date.now(),{sessionId:a,deliveryId:o}=await readAcceptedMessage(r),s=new ClientSession(e,{sessionId:a,streamIndex:0}),c={deliveryId:o,startedAt:n,notReadyMs:0,acceptedAt:i};return{delivery:s.#i(r,t,0,o,c),session:s}}static async prewarm(e,t={}){let{sessionId:n}=await readAcceptedMessage(await postCreateSession(e,t));return new ClientSession(e,{sessionId:n,streamIndex:0})}get id(){return this.#t.sessionId}get state(){return this.#t}async snapshot(e){throwIfAborted(e?.signal);let t=[],n=0;for await(let{cursor:r,event:i}of this.#c({follow:!1,signal:e?.signal,startIndex:0}))t.push(i),n=r;return throwIfAborted(e?.signal),{events:t,session:{sessionId:this.#t.sessionId,streamIndex:n}}}async send(e,t={}){return await this.#n({...t,message:e},!0)}async respond(e,t={}){if(e.length===0)throw Error(`ClientSession.respond() requires at least one answer.`);return await this.#n({...t,answers:e},!1)}async#n(e,t){let n=this.#t.streamIndex,r=createEveSessionRoutePath(this.#t.sessionId),{response:i,timing:a}=await postSessionSend(this.#e,r,e,t,this.#t.inbox),{sessionId:o,deliveryId:s,inbox:c}=await readAcceptedMessage(i,this.#t.sessionId);if(o!==this.#t.sessionId)throw Error(`Message route returned a different session id.`);if(this.#t={...this.#t,inbox:c},s===void 0)throw Error(`Message route did not return a delivery id. Update the server before sending with this client.`);return this.#i(i,e,n,s,{...a,deliveryId:s})}async prewarm(e){return await prewarmClientSession({context:this.#e,sessionId:this.#t.sessionId,signal:e?.signal})}async cancel(e){return this.#r(`cancel`,e)}async clear(e){return this.#r(`clear`,e)}async compact(e){return this.#r(`compact`,e)}async reset(e){return this.#r(`reset`,e)}async#r(e,t){let n=this.#t.streamIndex,r=await sendClientControl({context:this.#e,kind:e,options:t,sessionId:this.#t.sessionId});return new StreamDelivery({...r,createStream:t=>this.#a(n,{signal:t?.signal},r.deliveryId,e!==`reset`)})}stream(e){return this.#o(e)}agent(e){return new ClientAgentSession(this.#e,this.id,e)}[followSession](e){return this.#o(e)}#i(e,t,n,r,i){if(e.body?.cancel().catch(()=>{}),r===void 0)throw Error(`Message route did not return a delivery id.`);return new StreamDelivery({createStream:e=>this.#a(n,{...t,signal:e?.signal},r),deliveryId:r,receipt:i,sessionId:this.#t.sessionId})}#a(e,t,n,r=!0){return deliveryEvents(this.#o({follow:r,headers:t.headers,signal:t.signal,startIndex:e,streamReconnectPolicy:t.streamReconnectPolicy}),n,t.signal)}async*#o(e){let t=e?.startIndex??this.#t.streamIndex;for await(let{cursor:n,event:r}of this.#c({follow:e?.follow,headers:e?.headers,onCaughtUp:e?.onCaughtUp,resolveHeaders:e?.resolveHeaders,resolveReconnectPolicy:e?.resolveReconnectPolicy,signal:e?.signal,startIndex:t,streamReconnectPolicy:e?.streamReconnectPolicy}))this.#s(n),yield r}#s(e){this.#t={...this.#t,streamIndex:Math.max(this.#t.streamIndex,e)}}#c(e){return followStreamIterable({onCaughtUp:e.onCaughtUp,follow:e.follow,baseUrl:this.#e.baseUrl,resolveHeaders:()=>this.#e.resolveHeaders(e.resolveHeaders?.()??e.headers),path:createEveSessionStreamRoutePath(this.#t.sessionId),redirect:this.#e.redirect,signal:e.signal,startIndex:e.startIndex,streamReconnectPolicy:e.streamReconnectPolicy,resolveReconnectPolicy:e.resolveReconnectPolicy})}};function followClientSession(e,t){return e[followSession](t)}async function postSessionSend(e,t,n,r,i){let a=Date.now(),o=a+2e4,s=250;for(;;){let c=Date.now();try{return{response:await postTurn(e,t,n,!1,void 0,i),timing:{startedAt:a,notReadyMs:c-a,acceptedAt:Date.now()}}}catch(e){if(!r||!isSessionNotReady(e))throw e;let t=o-Date.now();if(t<=0)throw e;await sleep(Math.min(s,t),n.signal)}throwIfAborted(n.signal),s=Math.min(s*2,2e3)}}async function postCreateSession(e,t){let n=await e.resolveHeaders(t.headers),r=t.stubs===void 0?void 0:JSON.stringify({stubs:t.stubs});r!==void 0&&n.set(`content-type`,`application/json`);let i=await fetch(createClientUrl(e.baseUrl,EVE_SESSION_ROUTE_PATH),{body:r,headers:n,method:`POST`,redirect:e.redirect,signal:t.signal??null});if(!i.ok){let e=await i.text();throw new ClientError(i.status,e,i.headers)}return i}function isSessionNotReady(e){return SessionNotActiveError.is(e)&&e.retryable}async function postTurn(e,t,n,r,i,a){let o=createMessageBody(n,r);if(o===null)throw Error(r?`Creating a session requires a non-empty message.`:`A session turn requires a non-empty message or answers.`);i!==void 0&&(o.stubs=i),a!==void 0&&(o.inbox=a);let s=await e.resolveHeaders(n.headers);s.set(`content-type`,`application/json`);let c=await fetch(createClientUrl(e.baseUrl,t),{body:JSON.stringify(o),headers:s,method:`POST`,redirect:e.redirect,signal:n.signal??null});if(!c.ok){let e=await c.text();throw createClientError(c.status,e,c.headers)}return c}async function readAcceptedMessage(e,t){let n=await e.json(),r=(typeof n.sessionId==`string`?n.sessionId:void 0)??e.headers.get(EVE_SESSION_ID_HEADER)?.trim()??t;if(!r)throw Error(`Message route did not return a session id.`);return{sessionId:r,inbox:typeof n.inbox==`string`?n.inbox:void 0,deliveryId:typeof n.deliveryId==`string`&&n.deliveryId.length>0?n.deliveryId:void 0}}function createMessageBody(e,t){let n={};e.message!==void 0&&(n.message=messageForRequest(e.message)),e.answers!==void 0&&e.answers.length>0&&(n.answers=e.answers),!t&&e.message!==void 0&&e.turnPolicy!==void 0&&(n.turnPolicy=e.turnPolicy),e.clientContext!==void 0&&(n.clientContext=e.clientContext);let r=serializeOutputSchema(e.outputSchema);return r!==void 0&&(n.outputSchema=r),t&&n.message===void 0||n.message===void 0&&n.answers===void 0?null:n}export{ClientSession,followClientSession};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ClientSession}from"#client/session.js";var ClientSessions=class{#e;constructor(e){this.#e=e}async create(e={}){return`message`in e?await ClientSession.create(this.#e,e):{session:await ClientSession.prewarm(this.#e,e)}}attach(e,t){if(e.length===0)throw Error(`sessionId must be a non-empty string.`);return new ClientSession(this.#e,{sessionId:e,streamIndex:t?.streamIndex??0})}};export{ClientSessions};
|
|
1
|
+
import{ClientSession}from"#client/session.js";var ClientSessions=class{#e;constructor(e){this.#e=e}async create(e={}){return`message`in e?await ClientSession.create(this.#e,e):{session:await ClientSession.prewarm(this.#e,e)}}attach(e,t){if(e.length===0)throw Error(`sessionId must be a non-empty string.`);return new ClientSession(this.#e,{sessionId:e,inbox:t?.inbox,streamIndex:t?.streamIndex??0})}};export{ClientSessions};
|
|
@@ -67,10 +67,11 @@ export interface ClientOptions {
|
|
|
67
67
|
*/
|
|
68
68
|
readonly headers?: HeadersValue;
|
|
69
69
|
/**
|
|
70
|
-
* Redirect policy for every request, including streams.
|
|
71
|
-
* per-request `RequestInit.redirect`.
|
|
72
|
-
* `"manual"`
|
|
73
|
-
* redirect.
|
|
70
|
+
* Redirect policy for every request, including streams. Defaults to
|
|
71
|
+
* `"error"` and overrides a per-request `RequestInit.redirect`. Use
|
|
72
|
+
* `"manual"` to stop at redirects. Browsers expose an opaque response;
|
|
73
|
+
* Node.js exposes the redirect status and headers.
|
|
74
|
+
* `"follow"` explicitly permits forwarding custom headers on redirects.
|
|
74
75
|
*/
|
|
75
76
|
readonly redirect?: ClientRedirectPolicy;
|
|
76
77
|
}
|
|
@@ -203,6 +204,8 @@ export type { Delivery, DeliveryResult } from "#shared/delivery.js";
|
|
|
203
204
|
* Serializable cursor for one fixed, ID-addressed client session.
|
|
204
205
|
*/
|
|
205
206
|
export interface ClientSessionState {
|
|
207
|
+
/** Opaque delivery routing hint; preserve it when saving and restoring a session. */
|
|
208
|
+
readonly inbox?: string;
|
|
206
209
|
readonly sessionId: string;
|
|
207
210
|
readonly streamIndex: number;
|
|
208
211
|
}
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@vercel/oidc": "3.8.0",
|
|
50
50
|
"@vercel/otel": "2.1.3",
|
|
51
51
|
"@vercel/queue": "0.5.1",
|
|
52
|
-
"@vercel/sandbox": "3.
|
|
52
|
+
"@vercel/sandbox": "3.9.0",
|
|
53
53
|
"@vercel/sdk": "1.28.8",
|
|
54
54
|
"@vercel/schedules": "0.0.0-alpha.11",
|
|
55
55
|
"@workflow/core": "5.2.3",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"zod": "4.5.4",
|
|
62
62
|
"zod-validation-error": "5.0.0"
|
|
63
63
|
},
|
|
64
|
-
"scriptHash": "
|
|
64
|
+
"scriptHash": "e131224ddb21683920afcfceb11b26db2c7ea6ff4b1295b53fb273dbb14234ae",
|
|
65
65
|
"toolVersions": {
|
|
66
66
|
"rolldown": "1.2.9",
|
|
67
67
|
"typescript": "7.0.2"
|