eve 0.37.1 → 0.38.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.
Files changed (215) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/src/chunks/{use-eve-agent-DbKUBhl-.js → use-eve-agent-BbSsu99c.js} +70 -31
  3. package/dist/src/chunks/{use-eve-agent-Bi5fRxcZ.js → use-eve-agent-Dt8Y5QtW.js} +69 -30
  4. package/dist/src/cli/acp/command.d.ts +2 -1
  5. package/dist/src/cli/acp/command.js +2 -2
  6. package/dist/src/cli/application-command.d.ts +8 -0
  7. package/dist/src/cli/application-command.js +1 -0
  8. package/dist/src/cli/application-root.d.ts +8 -0
  9. package/dist/src/cli/application-root.js +1 -0
  10. package/dist/src/cli/commands/build.d.ts +2 -1
  11. package/dist/src/cli/commands/build.js +1 -1
  12. package/dist/src/cli/commands/init-repl.js +1 -1
  13. package/dist/src/cli/commands/register-integration-commands.d.ts +2 -1
  14. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  15. package/dist/src/cli/commands/register-project-commands.d.ts +2 -1
  16. package/dist/src/cli/commands/register-project-commands.js +1 -1
  17. package/dist/src/cli/commands/register-registry-commands.d.ts +2 -1
  18. package/dist/src/cli/commands/register-registry-commands.js +4 -1
  19. package/dist/src/cli/commands/registry-recovery.d.ts +14 -0
  20. package/dist/src/cli/commands/registry-recovery.js +1 -0
  21. package/dist/src/cli/commands/registry.d.ts +2 -5
  22. package/dist/src/cli/commands/registry.js +1 -1
  23. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  24. package/dist/src/cli/dev/environment.js +1 -1
  25. package/dist/src/cli/invoke/command.d.ts +3 -2
  26. package/dist/src/cli/invoke/command.js +1 -1
  27. package/dist/src/cli/run.d.ts +3 -2
  28. package/dist/src/cli/run.js +3 -3
  29. package/dist/src/client/eve-agent-store.d.ts +15 -3
  30. package/dist/src/client/eve-agent-store.js +2 -2
  31. package/dist/src/client/message-response.d.ts +10 -2
  32. package/dist/src/client/message-response.js +1 -1
  33. package/dist/src/client/session.js +1 -1
  34. package/dist/src/compiled/.vendor-stamp.json +4 -1
  35. package/dist/src/compiled/@ai-sdk/otel/index.js +3 -3
  36. package/dist/src/compiled/@chat-adapter/slack/index.js +25 -25
  37. package/dist/src/compiled/@opentelemetry/api/index.js +1 -1
  38. package/dist/src/compiled/@opentelemetry/otlp-transformer/index.js +1 -1
  39. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +61 -61
  40. package/dist/src/compiled/@vercel/oidc/index.js +14 -14
  41. package/dist/src/compiled/@vercel/otel/index.js +1 -1
  42. package/dist/src/compiled/@vercel/sandbox/index.js +1 -1
  43. package/dist/src/compiled/@workflow/core/index.js +1 -1
  44. package/dist/src/compiled/@workflow/core/private.js +1 -1
  45. package/dist/src/compiled/@workflow/core/runtime.js +2 -2
  46. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  47. package/dist/src/compiled/@workflow/errors/index.js +1 -1
  48. package/dist/src/compiled/@workflow/world-local/index.js +5 -5
  49. package/dist/src/compiled/@workflow/world-vercel/index.js +13 -13
  50. package/dist/src/compiled/_chunks/workflow/{attribute-changes-BoH7JsWp.js → attribute-changes-DZtQkszH.js} +1 -1
  51. package/dist/src/compiled/_chunks/workflow/chunk-5MU5Z6L3-B_3nkJFi.js +1 -0
  52. package/dist/src/compiled/_chunks/workflow/{chunk-NWCAEW5Y-Oxw40oRR.js → chunk-NWCAEW5Y-BgbcH0OK.js} +1 -1
  53. package/dist/src/compiled/_chunks/workflow/{dist-DlFv0aHY.js → dist-CPlyFOVo.js} +1 -1
  54. package/dist/src/compiled/_chunks/workflow/{dist-tJoQXAF6.js → dist-DpYyXbJv.js} +1 -1
  55. package/dist/src/compiled/_chunks/workflow/{dist-CRTn4Sg8.js → dist-xQXN70ED.js} +1 -1
  56. package/dist/src/compiled/_chunks/workflow/esm-seIr7a6j.js +1 -0
  57. package/dist/src/compiled/_chunks/workflow/{frames-CTpeJYEQ.js → frames-BBs-9k1d.js} +2 -2
  58. package/dist/src/compiled/_chunks/workflow/{functions-CeeNvKsq.js → functions-DAYiHNti.js} +1 -1
  59. package/dist/src/compiled/_chunks/workflow/{getMachineId-bsd-WEBNKY2R-CEYkx6Nv.js → getMachineId-bsd-WEBNKY2R-BTaxrQ52.js} +1 -1
  60. package/dist/src/compiled/_chunks/workflow/{getMachineId-darwin-LT47KAXP-DPwWlhif.js → getMachineId-darwin-LT47KAXP-DhYmwE_R.js} +1 -1
  61. package/dist/src/compiled/_chunks/workflow/{getMachineId-linux-LTVQO6VW-DAFXHwZp.js → getMachineId-linux-LTVQO6VW-Dru_L5ru.js} +1 -1
  62. package/dist/src/compiled/_chunks/workflow/{getMachineId-unsupported-UKWBA27G-BZKOI8mG.js → getMachineId-unsupported-UKWBA27G-DGfoqVW1.js} +1 -1
  63. package/dist/src/compiled/_chunks/workflow/{getMachineId-win-NLJKOPY6-r7_CJB5o.js → getMachineId-win-NLJKOPY6-CLM98q4X.js} +1 -1
  64. package/dist/src/compiled/_chunks/workflow/{private-tvMBynnC.js → private-UQtz8ZcW.js} +1 -1
  65. package/dist/src/compiled/_chunks/workflow/{resume-hook-BPQHjeY5.js → resume-hook-CYtSorp6.js} +1 -1
  66. package/dist/src/compiled/_chunks/workflow/{rolldown-runtime-DaDcL9Zw.js → rolldown-runtime-8V8biNmG.js} +1 -1
  67. package/dist/src/compiled/_chunks/workflow/{run-DQ5dOyjm.js → run-Cjo0A3NO.js} +1 -1
  68. package/dist/src/compiled/_chunks/workflow/{signal-exit-C8vsI6zj.js → signal-exit-o3IPQwwv.js} +1 -1
  69. package/dist/src/compiled/_chunks/workflow/sleep-C1P0OWBm.js +1 -0
  70. package/dist/src/compiled/_chunks/workflow/{token-DHD-q-fS.js → token-DGzfw-Vb.js} +1 -1
  71. package/dist/src/compiled/_chunks/workflow/{token-DtCUEpJs.js → token-DNbxVpeq.js} +1 -1
  72. package/dist/src/compiled/_chunks/workflow/token-util-BneBe0g5.js +27 -0
  73. package/dist/src/compiled/_chunks/workflow/{token-util-Ldar52H7.js → token-util-DjMgNdXS.js} +1 -1
  74. package/dist/src/compiled/_chunks/workflow/{undici-CUIybhQ2.js → undici-BBG5cZTy.js} +1 -1
  75. package/dist/src/compiled/_chunks/workflow/{wait-until-DK2lnH6U.js → wait-until-CT1ve8qB.js} +3 -3
  76. package/dist/src/compiled/_chunks/workflow/{wrapper-CMGju7QA.js → wrapper-CQNxP9mU.js} +3 -3
  77. package/dist/src/compiled/_chunks/workflow/{ws-transport-Csi6Cydc.js → ws-transport-beXxD0s_.js} +1 -1
  78. package/dist/src/compiled/env-runner/node-worker.js +1 -1
  79. package/dist/src/compiled/jose/index.js +1 -1
  80. package/dist/src/compiled/shadcn-registry/index.js +403 -403
  81. package/dist/src/compiler/artifacts.js +1 -1
  82. package/dist/src/compiler/compile-agent.js +2 -2
  83. package/dist/src/compiler/extension-compatibility.d.ts +10 -0
  84. package/dist/src/compiler/extension-compatibility.js +1 -1
  85. package/dist/src/compiler/normalize-extension.d.ts +8 -5
  86. package/dist/src/compiler/normalize-extension.js +1 -1
  87. package/dist/src/compiler/normalize-manifest.js +1 -1
  88. package/dist/src/discover/discover-agent.js +1 -1
  89. package/dist/src/discover/extensions.d.ts +0 -6
  90. package/dist/src/discover/extensions.js +1 -1
  91. package/dist/src/evals/cli/eval.d.ts +1 -1
  92. package/dist/src/evals/cli/eval.js +1 -1
  93. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -1
  94. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  95. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -1
  96. package/dist/src/execution/sandbox/prewarm.js +1 -1
  97. package/dist/src/harness/instrumentation/providers.js +1 -1
  98. package/dist/src/harness/instrumentation/runtime-context.d.ts +2 -0
  99. package/dist/src/harness/instrumentation/runtime-context.js +1 -1
  100. package/dist/src/harness/instrumentation/runtime.d.ts +3 -1
  101. package/dist/src/harness/tool-loop.js +1 -1
  102. package/dist/src/internal/application/cache-metadata.js +1 -1
  103. package/dist/src/internal/application/compiled-artifacts.js +2 -2
  104. package/dist/src/internal/application/optional-package-install.js +1 -1
  105. package/dist/src/internal/application/output-publication-lock.js +1 -1
  106. package/dist/src/internal/application/package.js +1 -1
  107. package/dist/src/internal/application/paths.js +1 -1
  108. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  109. package/dist/src/internal/authored-module-evaluation-error.js +4 -4
  110. package/dist/src/internal/authored-module-loader.js +3 -3
  111. package/dist/src/internal/authored-package-boundary.js +1 -1
  112. package/dist/src/internal/authored-relative-extension-resolver.js +1 -1
  113. package/dist/src/internal/bundler/extension-scope-plugin.js +1 -1
  114. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  115. package/dist/src/internal/instrumentation-layout.js +1 -1
  116. package/dist/src/internal/materialized-authored-modules.js +1 -1
  117. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.js +1 -1
  118. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  119. package/dist/src/internal/nitro/dev-runtime-source-snapshot-copy.js +1 -1
  120. package/dist/src/internal/nitro/dev-runtime-source-snapshot-local-roots.js +1 -1
  121. package/dist/src/internal/nitro/dev-runtime-source-snapshot.js +1 -1
  122. package/dist/src/internal/nitro/host/application-route-registry.d.ts +88 -0
  123. package/dist/src/internal/nitro/host/application-route-registry.js +1 -0
  124. package/dist/src/internal/nitro/host/build-application.js +1 -1
  125. package/dist/src/internal/nitro/host/build-extension.js +1 -1
  126. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  127. package/dist/src/internal/nitro/host/channel-routes.d.ts +4 -11
  128. package/dist/src/internal/nitro/host/channel-routes.js +3 -3
  129. package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
  130. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  131. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  132. package/dist/src/internal/nitro/host/dev-runner.js +1 -1
  133. package/dist/src/internal/nitro/host/dev-workspace-extensions.js +1 -1
  134. package/dist/src/internal/nitro/host/extension-capability-requirements.js +1 -1
  135. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  136. package/dist/src/internal/nitro/host/nitro-bundler-config.js +1 -1
  137. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  138. package/dist/src/internal/nitro/host/start-production-server.js +2 -2
  139. package/dist/src/internal/nitro/host/vercel-build-output-config.js +1 -1
  140. package/dist/src/internal/process/pnpm.js +1 -1
  141. package/dist/src/internal/workflow/development-world-client.js +1 -1
  142. package/dist/src/internal/workflow/development-world-server.js +1 -1
  143. package/dist/src/internal/workflow-bundle/builder-support.d.ts +12 -8
  144. package/dist/src/internal/workflow-bundle/builder-support.js +8 -7
  145. package/dist/src/internal/workflow-bundle/builder.d.ts +1 -1
  146. package/dist/src/internal/workflow-bundle/builder.js +2 -3
  147. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  148. package/dist/src/public/channels/discord/discordChannel.d.ts +2 -0
  149. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  150. package/dist/src/public/channels/eve.d.ts +2 -0
  151. package/dist/src/public/channels/eve.js +1 -1
  152. package/dist/src/public/channels/github/dispatch.js +1 -1
  153. package/dist/src/public/channels/github/githubChannel.d.ts +2 -0
  154. package/dist/src/public/channels/linear/linearChannel.d.ts +2 -0
  155. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  156. package/dist/src/public/channels/photon/photonIMessageChannel.d.ts +2 -0
  157. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -1
  158. package/dist/src/public/channels/slack/slackChannel.d.ts +3 -1
  159. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  160. package/dist/src/public/channels/teams/teamsChannel.d.ts +2 -0
  161. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  162. package/dist/src/public/channels/telegram/telegramChannel.d.ts +2 -0
  163. package/dist/src/public/channels/telegram/telegramChannel.js +1 -1
  164. package/dist/src/public/channels/twilio/twilioChannel.d.ts +2 -0
  165. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  166. package/dist/src/public/instrumentation/index.d.ts +9 -3
  167. package/dist/src/public/next/server.js +1 -1
  168. package/dist/src/public/nuxt/dev-server.js +1 -1
  169. package/dist/src/public/sveltekit/dev-server.js +1 -1
  170. package/dist/src/react/use-eve-agent.d.ts +4 -4
  171. package/dist/src/react/use-eve-agent.js +1 -1
  172. package/dist/src/services/inspect-application.js +1 -1
  173. package/dist/src/setup/primitives/pm/pnpm.js +2 -2
  174. package/dist/src/setup/primitives/run-vercel.js +1 -1
  175. package/dist/src/setup/scaffold/create/extension.js +1 -1
  176. package/dist/src/setup/scaffold/create/project.js +1 -1
  177. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  178. package/dist/src/setup/scaffold/create/web-template.js +8 -86
  179. package/dist/src/setup/scaffold/version-tokens.js +1 -1
  180. package/dist/src/setup/scaffold/workspace-root.js +1 -1
  181. package/dist/src/svelte/index.js +1 -1
  182. package/dist/src/svelte/use-eve-agent.d.ts +3 -3
  183. package/dist/src/svelte/use-eve-agent.js +1 -1
  184. package/dist/src/tracing/install-instrumentation-runtime.d.ts +2 -1
  185. package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
  186. package/dist/src/tracing/otel-declaration.d.ts +32 -3
  187. package/dist/src/tracing/otel-declaration.js +1 -1
  188. package/dist/src/tracing/otel-registration.js +1 -1
  189. package/dist/src/vue/index.js +1 -1
  190. package/dist/src/vue/use-eve-agent.d.ts +3 -3
  191. package/dist/src/vue/use-eve-agent.js +1 -1
  192. package/docs/channels/custom.mdx +1 -1
  193. package/docs/channels/discord.mdx +1 -1
  194. package/docs/channels/eve.mdx +1 -2
  195. package/docs/channels/github.mdx +1 -1
  196. package/docs/channels/linear.mdx +1 -1
  197. package/docs/channels/overview.mdx +1 -1
  198. package/docs/channels/photon.mdx +1 -1
  199. package/docs/channels/slack.mdx +1 -1
  200. package/docs/channels/teams.mdx +1 -1
  201. package/docs/channels/telegram.mdx +1 -1
  202. package/docs/channels/twilio.mdx +1 -1
  203. package/docs/extensions.md +10 -6
  204. package/docs/guides/client/streaming.mdx +6 -5
  205. package/docs/guides/frontend/overview.mdx +10 -8
  206. package/docs/guides/frontend/use-eve-agent-svelte.mdx +10 -10
  207. package/docs/guides/frontend/use-eve-agent-vue.mdx +10 -10
  208. package/docs/install-integrations.mdx +4 -0
  209. package/docs/reference/cli.md +1 -1
  210. package/docs/schedules.mdx +2 -2
  211. package/package.json +1 -1
  212. package/dist/src/compiled/_chunks/workflow/chunk-5MU5Z6L3-CaJgXkVg.js +0 -1
  213. package/dist/src/compiled/_chunks/workflow/sleep-CzdoBiqy.js +0 -1
  214. package/dist/src/compiled/_chunks/workflow/src-Cj3P1ChQ.js +0 -1
  215. package/dist/src/compiled/_chunks/workflow/token-util-DNwIAn_u.js +0 -27
@@ -0,0 +1,14 @@
1
+ export interface RegistryCommandLogger {
2
+ error(message: string): void;
3
+ log(message: string): void;
4
+ }
5
+ export declare function errorMessage(error: unknown): string;
6
+ export declare function runRegistryAction<T>(logger: RegistryCommandLogger, appRoot: string, action: () => Promise<T>): Promise<T | undefined>;
7
+ export declare function resolveRegistryItemForAdd<T>(logger: RegistryCommandLogger, loadItem: () => Promise<T>, printSuggestions: () => Promise<void>): Promise<{
8
+ found: true;
9
+ item: T;
10
+ } | {
11
+ found: false;
12
+ }>;
13
+ export declare function setupResumeCommand(item: string): string;
14
+ export declare function setupReminder(item: string, outcome: "cancelled" | "skipped"): string;
@@ -0,0 +1 @@
1
+ import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject}from"#setup/scaffold/index.js";import{WizardCancelledError}from"#setup/step.js";function errorMessage(e){return e instanceof Error?e.message:String(e)}function isRegistryNotFoundError(e){return e instanceof Error&&`code`in e&&e.code===`NOT_FOUND`}async function runRegistryAction(r,i,a){if(!await isEveProject(i)){r.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{return await a()}catch(e){if(e instanceof WizardCancelledError)return;r.error(errorMessage(e)),process.exitCode=1;return}}async function resolveRegistryItemForAdd(e,t,n){try{return{found:!0,item:await t()}}catch(t){if(!isRegistryNotFoundError(t))throw t;return e.error(errorMessage(t)),await n(),process.exitCode=1,{found:!1}}}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}export{errorMessage,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand};
@@ -1,10 +1,8 @@
1
1
  import { type Prompter } from "#setup/prompter.js";
2
2
  import type { RegistrySetupCompletion } from "#setup/registry-setup-protocol.js";
3
+ import { type RegistryCommandLogger } from "./registry-recovery.js";
3
4
  import type { runRegistrySetupCommand } from "./registry-setup-command.js";
4
- export interface RegistryCommandLogger {
5
- error(message: string): void;
6
- log(message: string): void;
7
- }
5
+ export type { RegistryCommandLogger } from "./registry-recovery.js";
8
6
  export interface AddCommandOptions {
9
7
  skipInstall?: boolean;
10
8
  overwrite?: boolean;
@@ -89,4 +87,3 @@ export declare function runRegistryListCommand(logger: RegistryCommandLogger, ap
89
87
  export declare function runRegistrySearchCommand(logger: RegistryCommandLogger, appRoot: string, query: string, source?: string, options?: RegistrySearchCommandOptions): Promise<void>;
90
88
  /** Inspects one official, configured, or URL-addressed registry item. */
91
89
  export declare function runRegistryViewCommand(logger: RegistryCommandLogger, appRoot: string, item: string, options?: RegistryCommandOptions): Promise<void>;
92
- export {};
@@ -1 +1 @@
1
- import{NOT_AN_AGENT_MESSAGE,hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function errorMessage(e){return e instanceof Error?e.message:String(e)}async function runRegistryAction(t,n,r){if(!await isEveProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{return await r()}catch(e){if(e instanceof WizardCancelledError)return;t.error(errorMessage(e)),process.exitCode=1;return}}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}function registryManifestTitle(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e.title;return typeof t==`string`?t:void 0}async function browseRegistryCatalog(e,t={}){let{config:n,result:r}=await searchRegistryCatalog(e,t),i=await Promise.all(r.items.map(async e=>{let[t]=await getRegistryItems([e.addCommandArgument],{config:n});return t}));return{items:r.items.map((e,t)=>{let n={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry},r=registryManifestTitle(i[t]);return r!==void 0&&(n.title=r),e.type!==void 0&&(n.type=e.type),e.description!==void 0&&(n.description=e.description),n}),total:r.pagination.total,errors:r.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:c,metadataByAddress:l}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),u=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...l.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(c,o,l)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of u)e.error(`${t.registry}: ${t.message}`);u.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,t,o,s,c=defaultAddCommandDependencies){return runRegistryAction(e,t,async()=>{let l=await readEveRegistryConfig(t),u=itemAddress(o);if(s.skipInstall===!0){if(s.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(s.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(u))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let[d]=await getRegistryItems([u],{config:l}),f=isOfficialItemAddress(u)?eveMetadataFromRegistryItem(d):void 0;if(assertCompatibleEveVersion(f?.requires),f?.components!==void 0){if(!isOfficialItemAddress(u))throw Error(`Registry packages require the official eve registry.`);let n=await runRegistryPackage({logger:e,appRoot:t,item:o,components:f.components,config:l,options:s,dependencies:c,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:i,prompter:a})=>runDeclaredSetups({logger:e,appRoot:t,item:n,setups:i,options:{yes:s.yes,nonInteractive:s.nonInteractive,answers:s.answers,prompter:a,signal:s.signal},dependencies:c,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)}),setupReminder:e=>setupReminder(e,`skipped`)}});return n===!1?void 0:n}if(s.skipInstall===!0){if(f?.setup===void 0)throw Error(`Registry item "${o}" does not declare a setup flow.`);let n=await runDeclaredSetups({logger:e,appRoot:t,item:o,setups:f.setup,options:s,dependencies:c,cancelledReminder:setupReminder(o,`cancelled`),resumeCommand:setupResumeCommand(o)});return n===!1?void 0:n}if(await addRegistryItems([u],{config:l,cwd:t,overwrite:s.overwrite,silent:s.silent}),f?.setup===void 0)return;let p=c.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(s.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:s.skipInstall?`Setup ${o}`:`Installed ${o}`})),s.skipSetup===!0||!s.nonInteractive&&!s.yes&&!p&&s.setupAuthorized!==!0){e.log(setupReminder(o,`skipped`));return}if(!s.nonInteractive&&!s.yes&&s.setupAuthorized!==!0)try{if(await(s.prompter??c.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${o} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(o,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(o,`cancelled`));return}let m=await runDeclaredSetups({logger:e,appRoot:t,item:o,setups:f.setup,options:s,dependencies:c,cancelledReminder:setupReminder(o,`cancelled`),resumeCommand:setupResumeCommand(o)});return m!==!1&&s.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`completed`,item:o,completedItems:[o],...m.deploymentRequired===!0?{deploymentRequired:!0,next:{command:`eve`,args:[`deploy`]}}:{}})),m===!1?void 0:m})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
1
+ import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{errorMessage,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let{resultsBySource:r,sources:i,metadataByAddress:a}=await searchRegistryCatalog(t,{limit:5,query:n}),s=searchPresentationSections(i,r,a);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:n,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let d=[...o.values()];return{config:n,result:{items:d.flatMap(e=>e.items),pagination:{hasMore:d.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:d.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}function registryManifestTitle(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e.title;return typeof t==`string`?t:void 0}async function browseRegistryCatalog(e,t={}){let{config:n,result:r}=await searchRegistryCatalog(e,t),i=await Promise.all(r.items.map(async e=>{let[t]=await getRegistryItems([e.addCommandArgument],{config:n});return t}));return{items:r.items.map((e,t)=>{let n={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry},r=registryManifestTitle(i[t]);return r!==void 0&&(n.title=r),e.type!==void 0&&(n.type=e.type),e.description!==void 0&&(n.description=e.description),n}),total:r.pagination.total,errors:r.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:s,sources:c,metadataByAddress:l}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),u=a.errors??[];if(i.json||s.size>0){let t=a.items.map(e=>({...e,...l.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(c,s,l)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of u)e.error(`${t.registry}: ${t.message}`);u.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,a,o,s,c=defaultAddCommandDependencies){return runRegistryAction(e,a,async()=>{let l=await readEveRegistryConfig(a),u=itemAddress(o);if(s.skipInstall===!0){if(s.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(s.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(u))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let f=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([u],{config:l}))[0],()=>printAddSuggestions(e,a,o));if(!f.found)return;let p=f.item,m=isOfficialItemAddress(u)?eveMetadataFromRegistryItem(p):void 0;if(assertCompatibleEveVersion(m?.requires),m?.components!==void 0){if(!isOfficialItemAddress(u))throw Error(`Registry packages require the official eve registry.`);let t=await runRegistryPackage({logger:e,appRoot:a,item:o,components:m.components,config:l,options:s,dependencies:c,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:t,setups:r,prompter:i})=>runDeclaredSetups({logger:e,appRoot:a,item:t,setups:r,options:{yes:s.yes,nonInteractive:s.nonInteractive,answers:s.answers,prompter:i,signal:s.signal},dependencies:c,cancelledReminder:setupReminder(t,`cancelled`),resumeCommand:setupResumeCommand(t)}),setupReminder:e=>setupReminder(e,`skipped`)}});return t===!1?void 0:t}if(s.skipInstall===!0){if(m?.setup===void 0)throw Error(`Registry item "${o}" does not declare a setup flow.`);let t=await runDeclaredSetups({logger:e,appRoot:a,item:o,setups:m.setup,options:s,dependencies:c,cancelledReminder:setupReminder(o,`cancelled`),resumeCommand:setupResumeCommand(o)});return t===!1?void 0:t}if(await addRegistryItems([u],{config:l,cwd:a,overwrite:s.overwrite,silent:s.silent}),m?.setup===void 0)return;let h=c.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(s.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:s.skipInstall?`Setup ${o}`:`Installed ${o}`})),s.skipSetup===!0||!s.nonInteractive&&!s.yes&&!h&&s.setupAuthorized!==!0){e.log(setupReminder(o,`skipped`));return}if(!s.nonInteractive&&!s.yes&&s.setupAuthorized!==!0)try{if(await(s.prompter??c.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${o} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(o,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(o,`cancelled`));return}let g=await runDeclaredSetups({logger:e,appRoot:a,item:o,setups:m.setup,options:s,dependencies:c,cancelledReminder:setupReminder(o,`cancelled`),resumeCommand:setupResumeCommand(o)});return g!==!1&&s.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`completed`,item:o,completedItems:[o],...g.deploymentRequired===!0?{deploymentRequired:!0,next:{command:`eve`,args:[`deploy`]}}:{}})),g===!1?void 0:g})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
@@ -1 +1 @@
1
- import{access,readdir,stat,writeFile}from"node:fs/promises";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{constants}from"node:fs";import{delimiter,join,relative,sep}from"node:path";import{LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH}from"#internal/workflow/local-world-data-directory.js";import{captureVercel,resolveVercelInvocation}from"#setup/primitives/run-vercel.js";function createDevDiagnosticDump(e,t,n={}){let i=t.replace(/\.log$/,`.dump`),a=n.now??(()=>new Date),o=a().getTime(),s,c,l=Promise.resolve(),u=!1,d=!1,write=()=>{if(d||u)return;let e=formatDump({at:a(),durationMs:a().getTime()-o,environment:s,stats:c});l=l.then(()=>writeFile(i,e,{encoding:`utf8`,mode:384})).catch(()=>{u=!0})};return write(),(n.environment??(()=>collectDevEnvironmentInfo(e)))().then(e=>{s=e,write()}).catch(()=>{}),{path:i,displayPath:relative(e,i).split(sep).join(`/`),updateSessionStats(e){c=e,write()},async close(){d||(write(),d=!0,await l)}}}function formatDump(e){let t={updatedAt:e.at.toISOString(),durationMs:e.durationMs,environment:e.environment??null,session:e.stats??null};return`${JSON.stringify(t,null,2)}\n`}async function collectDevEnvironmentInfo(e){let[t,n]=await Promise.all([detectVercelCli(e),measureSessionsDirectory(e)]),r={eveVersion:resolveInstalledPackageInfo().version,nodeVersion:process.version,platform:`${process.platform} ${process.arch}`,...t};return n!==void 0&&(r.sessionsDirectory=n),r}async function detectVercelCli(e){let t=resolveVercelInvocation(e),[n,r]=await Promise.all([captureVercel([`--version`],{cwd:e,nonInteractive:!0,timeoutMs:5e3}),t.command===`vercel`?findOnPath(`vercel`):Promise.resolve(t.command)]),i=n.ok?n.stdout:`${n.failure.stdout}\n${n.failure.stderr}`,a=/(\d+\.\d+\.\d+\S*)/.exec(i)?.[1],o={};return a!==void 0&&(o.vercelCliVersion=a),r!==void 0&&(o.vercelCliPath=r),o}async function findOnPath(t){let n=(process.env.PATH??``).split(delimiter).filter(e=>e.length>0);for(let r of n){let n=join(r,t);try{return await access(n,constants.X_OK),n}catch{}}}async function measureSessionsDirectory(e){let r=join(e,LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH),i;try{i=await readdir(r,{recursive:!0,withFileTypes:!0})}catch{return}let a=0,o=0;for(let e of i)if(e.isFile()){a+=1;try{o+=(await stat(join(e.parentPath,e.name))).size}catch{}}return{path:LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH,files:a,bytes:o}}export{collectDevEnvironmentInfo,createDevDiagnosticDump,measureSessionsDirectory};
1
+ import{access,readdir,stat,writeFile}from"node:fs/promises";import{delimiter,join,relative,sep}from"node:path";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{constants}from"node:fs";import{LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH}from"#internal/workflow/local-world-data-directory.js";import{captureVercel,resolveVercelInvocation}from"#setup/primitives/run-vercel.js";function createDevDiagnosticDump(e,t,n={}){let i=t.replace(/\.log$/,`.dump`),a=n.now??(()=>new Date),c=a().getTime(),l,u,d=Promise.resolve(),f=!1,p=!1,write=()=>{if(p||f)return;let e=formatDump({at:a(),durationMs:a().getTime()-c,environment:l,stats:u});d=d.then(()=>writeFile(i,e,{encoding:`utf8`,mode:384})).catch(()=>{f=!0})};return write(),(n.environment??(()=>collectDevEnvironmentInfo(e)))().then(e=>{l=e,write()}).catch(()=>{}),{path:i,displayPath:relative(e,i).split(sep).join(`/`),updateSessionStats(e){u=e,write()},async close(){p||(write(),p=!0,await d)}}}function formatDump(e){let t={updatedAt:e.at.toISOString(),durationMs:e.durationMs,environment:e.environment??null,session:e.stats??null};return`${JSON.stringify(t,null,2)}\n`}async function collectDevEnvironmentInfo(e){let[t,n]=await Promise.all([detectVercelCli(e),measureSessionsDirectory(e)]),r={eveVersion:resolveInstalledPackageInfo().version,nodeVersion:process.version,platform:`${process.platform} ${process.arch}`,...t};return n!==void 0&&(r.sessionsDirectory=n),r}async function detectVercelCli(e){let t=resolveVercelInvocation(e),[n,r]=await Promise.all([captureVercel([`--version`],{cwd:e,nonInteractive:!0,timeoutMs:5e3}),t.command===`vercel`?findOnPath(`vercel`):Promise.resolve(t.command)]),i=n.ok?n.stdout:`${n.failure.stdout}\n${n.failure.stderr}`,a=/(\d+\.\d+\.\d+\S*)/.exec(i)?.[1],o={};return a!==void 0&&(o.vercelCliVersion=a),r!==void 0&&(o.vercelCliPath=r),o}async function findOnPath(t){let n=(process.env.PATH??``).split(delimiter).filter(e=>e.length>0);for(let r of n){let n=join(r,t);try{return await access(n,constants.X_OK),n}catch{}}}async function measureSessionsDirectory(e){let r=join(e,LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH),i;try{i=await readdir(r,{recursive:!0,withFileTypes:!0})}catch{return}let o=0,s=0;for(let e of i)if(e.isFile()){o+=1;try{s+=(await stat(join(e.parentPath,e.name))).size}catch{}}return{path:LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH,files:o,bytes:s}}export{collectDevEnvironmentInfo,createDevDiagnosticDump,measureSessionsDirectory};
@@ -1 +1 @@
1
- import{readFileSync}from"node:fs";import{join,resolve}from"node:path";import{parseEnv}from"node:util";import{isObject}from"#shared/guards.js";const DEVELOPMENT_ENV_FILE_NAMES=[`.env.development.local`,`.env.local`,`.env.development`,`.env`];function isMissingEnvironmentFileError(e){return isObject(e)&&e.code===`ENOENT`}const developmentEnvironmentLoaders=new Map;function getDevelopmentEnvironmentFilePaths(e){let r=resolve(e);return DEVELOPMENT_ENV_FILE_NAMES.map(e=>join(r,e))}function loadDevelopmentEnvironmentFiles(e){getDevelopmentEnvironmentLoader(e).reload()}function stageDevelopmentEnvironmentFiles(e){return getDevelopmentEnvironmentLoader(e).stageReload()}function readDevelopmentEnvironmentHostValues(e){let t={},r=readDevelopmentEnvironmentValues(resolve(e));for(let e of[...r.keys()].sort((e,t)=>e.localeCompare(t)))t[e]=process.env[e]??null;return t}function getDevelopmentEnvironmentLoader(e){let t=resolve(e),r=developmentEnvironmentLoaders.get(t);if(r!==void 0)return r;let i=createDevelopmentEnvironmentLoader(t);return developmentEnvironmentLoaders.set(t,i),i}function createDevelopmentEnvironmentLoader(e){let t=new Set(Object.keys(process.env)),n=new Map,stageReload=()=>{let r=new Map(n),i=readDevelopmentEnvironmentValues(e),a=new Set([...n.keys(),...i.keys()]),o=new Map([...a].map(e=>[e,process.env[e]])),s=!1;return applyDevelopmentEnvironmentValues({managedValues:n,nextValues:i,protectedKeys:t}),{commit(){s=!0},rollback(){if(!s){s=!0,n.clear();for(let[e,t]of r)n.set(e,t);for(let[e,t]of o)t===void 0?delete process.env[e]:process.env[e]=t}}}};return{reload(){stageReload().commit()},stageReload}}function applyDevelopmentEnvironmentValues(e){for(let[t,n]of e.managedValues)e.nextValues.has(t)||e.protectedKeys.has(t)||(process.env[t]===n&&delete process.env[t],e.managedValues.delete(t));for(let[t,n]of e.nextValues)e.protectedKeys.has(t)||(process.env[t]=n,e.managedValues.set(t,n))}function readDevelopmentEnvironmentValues(n){let i=new Map;for(let o of[...DEVELOPMENT_ENV_FILE_NAMES].reverse())try{let a=parseEnv(readFileSync(join(n,o),`utf8`));for(let[e,t]of Object.entries(a))t!==void 0&&i.set(e,t)}catch(e){if(!isMissingEnvironmentFileError(e))throw e}return i}export{DEVELOPMENT_ENV_FILE_NAMES,getDevelopmentEnvironmentFilePaths,loadDevelopmentEnvironmentFiles,readDevelopmentEnvironmentHostValues,stageDevelopmentEnvironmentFiles};
1
+ import{join,resolve}from"node:path";import{readFileSync}from"node:fs";import{parseEnv}from"node:util";import{isObject}from"#shared/guards.js";const DEVELOPMENT_ENV_FILE_NAMES=[`.env.development.local`,`.env.local`,`.env.development`,`.env`];function isMissingEnvironmentFileError(e){return isObject(e)&&e.code===`ENOENT`}const developmentEnvironmentLoaders=new Map;function getDevelopmentEnvironmentFilePaths(n){let r=resolve(n);return DEVELOPMENT_ENV_FILE_NAMES.map(t=>join(r,t))}function loadDevelopmentEnvironmentFiles(e){getDevelopmentEnvironmentLoader(e).reload()}function stageDevelopmentEnvironmentFiles(e){return getDevelopmentEnvironmentLoader(e).stageReload()}function readDevelopmentEnvironmentHostValues(e){let n={},r=readDevelopmentEnvironmentValues(resolve(e));for(let e of[...r.keys()].sort((e,t)=>e.localeCompare(t)))n[e]=process.env[e]??null;return n}function getDevelopmentEnvironmentLoader(e){let n=resolve(e),r=developmentEnvironmentLoaders.get(n);if(r!==void 0)return r;let i=createDevelopmentEnvironmentLoader(n);return developmentEnvironmentLoaders.set(n,i),i}function createDevelopmentEnvironmentLoader(e){let t=new Set(Object.keys(process.env)),n=new Map,stageReload=()=>{let r=new Map(n),i=readDevelopmentEnvironmentValues(e),a=new Set([...n.keys(),...i.keys()]),o=new Map([...a].map(e=>[e,process.env[e]])),s=!1;return applyDevelopmentEnvironmentValues({managedValues:n,nextValues:i,protectedKeys:t}),{commit(){s=!0},rollback(){if(!s){s=!0,n.clear();for(let[e,t]of r)n.set(e,t);for(let[e,t]of o)t===void 0?delete process.env[e]:process.env[e]=t}}}};return{reload(){stageReload().commit()},stageReload}}function applyDevelopmentEnvironmentValues(e){for(let[t,n]of e.managedValues)e.nextValues.has(t)||e.protectedKeys.has(t)||(process.env[t]===n&&delete process.env[t],e.managedValues.delete(t));for(let[t,n]of e.nextValues)e.protectedKeys.has(t)||(process.env[t]=n,e.managedValues.set(t,n))}function readDevelopmentEnvironmentValues(t){let i=new Map;for(let o of[...DEVELOPMENT_ENV_FILE_NAMES].reverse())try{let a=parseEnv(readFileSync(join(t,o),`utf8`));for(let[e,t]of Object.entries(a))t!==void 0&&i.set(e,t)}catch(e){if(!isMissingEnvironmentFileError(e))throw e}return i}export{DEVELOPMENT_ENV_FILE_NAMES,getDevelopmentEnvironmentFilePaths,loadDevelopmentEnvironmentFiles,readDevelopmentEnvironmentHostValues,stageDevelopmentEnvironmentFiles};
@@ -1,4 +1,5 @@
1
1
  import { type Command } from "#compiled/commander/index.js";
2
+ import { type CliApplicationContext } from "#cli/application-command.js";
2
3
  import type { DevelopmentServer, DevelopmentServerOptions } from "#internal/nitro/host/types.js";
3
4
  import { type RunInvokeInput } from "./invoke.js";
4
5
  import { type InvokeResult } from "./result.js";
@@ -17,14 +18,14 @@ interface InvokeCommandLogger {
17
18
  }
18
19
  /** Registers the invoke command with lazily loaded production dependencies. */
19
20
  export declare function registerRuntimeInvokeCommand(input: {
20
- readonly appRoot: string;
21
+ readonly applicationContext: CliApplicationContext;
21
22
  readonly logger: InvokeCommandLogger;
22
23
  readonly program: Command;
23
24
  readonly runtime: Partial<InvokeCliRuntimeDependencies>;
24
25
  }): void;
25
26
  /** Registers the non-interactive invoke command. */
26
27
  export declare function registerInvokeCommand(input: {
27
- readonly appRoot: string;
28
+ readonly applicationContext: CliApplicationContext;
28
29
  readonly deps: InvokeCommandDependencies;
29
30
  readonly logger: InvokeCommandLogger;
30
31
  readonly program: Command;
@@ -1 +1 @@
1
- import{invokeResultJsonSchema,parseInvokeResumeInput}from"./result.js";import{resolveInvokeOperation}from"./invoke.js";import{InvalidArgumentError}from"#compiled/commander/index.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";function registerRuntimeInvokeCommand(e){registerInvokeCommand({...e,deps:{loadEnvironment:async e=>(await import(`#cli/dev/environment.js`)).loadDevelopmentEnvironmentFiles(e),runInvoke:async t=>await(e.runtime.runInvoke??(await import(`./invoke.js`)).runInvoke)(t),startHost:async t=>(e.runtime.startHost??(await import(`#internal/nitro/host.js`)).createDevelopmentServer)(t,{existing:`reject`})}})}function registerInvokeCommand(e){e.program.command(`invoke`).description(`Invoke an eve agent without a terminal UI.`).argument(`[prompt]`,`Prompt, follow-up message, or answer to a pending input`).option(`-u, --url <url>`,`Invoke an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--resume`,`Read a previous resumable result from stdin`).option(`--scope <team>`,`Vercel team that owns the URL target`).option(`--json-schema`,`Print the invoke result JSON Schema and exit`).action((t,n)=>runInvokeCommand({...e,options:n,prompt:t}))}async function runInvokeCommand(i){let{options:o}=i;if(o.jsonSchema===!0){assertSchemaOnly(i.prompt,o),i.logger.log(JSON.stringify(invokeResultJsonSchema,null,2));return}let s=o.resume===!0?parseInvokeResumeInput(await readJsonFromStdin()):void 0,c=s?.resume.target;if(c?.kind===`local`&&o.url!==void 0)throw new InvalidArgumentError(`A local invocation cannot be resumed against --url.`);let l=o.url??(c?.kind===`remote`?c.serverUrl:void 0),u=resolveDevelopmentUrlTarget({header:o.header,url:l},void 0);if(o.scope!==void 0&&u===void 0)throw new InvalidArgumentError(`The --scope option requires a URL target.`);if(c?.kind===`remote`&&o.url!==void 0&&u!==void 0&&u.serverUrl!==c.serverUrl)throw new InvalidArgumentError(`Session target ${c.serverUrl} does not match ${u.serverUrl}.`);let d=resolveInvokeOperation({previous:s,prompt:i.prompt});if(await i.deps.loadEnvironment(i.appRoot),u!==void 0){await executeWithSignals(i,{kind:`remote`,serverUrl:u.serverUrl,workspaceRoot:i.appRoot},u.headers,d,o.scope);return}let f=await i.deps.startHost(i.appRoot);try{let e=await f.start();await executeWithSignals(i,{kind:`local`,serverUrl:e.url,workspaceRoot:e.appRoot},void 0,d)}finally{await f.close()}}async function executeWithSignals(e,t,n,r,i){let a=new AbortController,o,handleSigint=()=>{o=130,a.abort()},handleSigterm=()=>{o=143,a.abort()};process.once(`SIGINT`,handleSigint),process.once(`SIGTERM`,handleSigterm);try{let s=n===void 0?{operation:r,signal:a.signal,target:t}:{headers:n,operation:r,signal:a.signal,target:t},c=i===void 0?s:{...s,vercelScope:i},l=await e.deps.runInvoke(c);e.logger.log(JSON.stringify(l,null,2)),process.exitCode=o??invokeExitCode(l)}finally{process.off(`SIGINT`,handleSigint),process.off(`SIGTERM`,handleSigterm)}}function assertSchemaOnly(e,t){if(e!==void 0||t.resume===!0||t.scope!==void 0||t.url!==void 0||t.header!==void 0)throw new InvalidArgumentError(`--json-schema cannot be combined with invoke options or a prompt.`)}async function readJsonFromStdin(){let e=``;process.stdin.setEncoding(`utf8`);for await(let t of process.stdin)e+=t;if(e.trim().length===0)throw new InvalidArgumentError(`--resume expected a resumable eve invoke result on stdin.`);try{return JSON.parse(e)}catch{throw new InvalidArgumentError(`--resume received invalid JSON on stdin.`)}}function invokeExitCode(e){return e.status===`failed`||e.status===`authentication-required`||e.status===`ready`&&e.outcome.status===`failed`?1:e.status===`input-required`||e.status===`authorization-required`?3:0}export{registerInvokeCommand,registerRuntimeInvokeCommand};
1
+ import{invokeResultJsonSchema,parseInvokeResumeInput}from"./result.js";import{resolveInvokeOperation}from"./invoke.js";import{InvalidArgumentError}from"#compiled/commander/index.js";import{applicationCommand}from"#cli/application-command.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";function registerRuntimeInvokeCommand(e){registerInvokeCommand({...e,deps:{loadEnvironment:async e=>(await import(`#cli/dev/environment.js`)).loadDevelopmentEnvironmentFiles(e),runInvoke:async t=>await(e.runtime.runInvoke??(await import(`./invoke.js`)).runInvoke)(t),startHost:async t=>(e.runtime.startHost??(await import(`#internal/nitro/host.js`)).createDevelopmentServer)(t,{existing:`reject`})}})}function registerInvokeCommand(e){applicationCommand(e.program.command(`invoke`),e.applicationContext,e=>{let t=e.opts();return t.url===void 0&&t.jsonSchema!==!0}).description(`Invoke an eve agent without a terminal UI.`).argument(`[prompt]`,`Prompt, follow-up message, or answer to a pending input`).option(`-u, --url <url>`,`Invoke an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--resume`,`Read a previous resumable result from stdin`).option(`--scope <team>`,`Vercel team that owns the URL target`).option(`--json-schema`,`Print the invoke result JSON Schema and exit`).action((t,n)=>runInvokeCommand({...e,options:n,prompt:t}))}async function runInvokeCommand(i){let{options:a}=i;if(a.jsonSchema===!0){assertSchemaOnly(i.prompt,a),i.logger.log(JSON.stringify(invokeResultJsonSchema,null,2));return}let s=a.resume===!0?parseInvokeResumeInput(await readJsonFromStdin()):void 0,c=s?.resume.target;if(c?.kind===`local`&&a.url!==void 0)throw new InvalidArgumentError(`A local invocation cannot be resumed against --url.`);let l=a.url??(c?.kind===`remote`?c.serverUrl:void 0),u=resolveDevelopmentUrlTarget({header:a.header,url:l},void 0);if(a.scope!==void 0&&u===void 0)throw new InvalidArgumentError(`The --scope option requires a URL target.`);if(c?.kind===`remote`&&a.url!==void 0&&u!==void 0&&u.serverUrl!==c.serverUrl)throw new InvalidArgumentError(`Session target ${c.serverUrl} does not match ${u.serverUrl}.`);let d=resolveInvokeOperation({previous:s,prompt:i.prompt});if(await i.deps.loadEnvironment(i.applicationContext.root),u!==void 0){await executeWithSignals(i,{kind:`remote`,serverUrl:u.serverUrl,workspaceRoot:i.applicationContext.root},u.headers,d,a.scope);return}let f=await i.deps.startHost(i.applicationContext.root);try{let e=await f.start();await executeWithSignals(i,{kind:`local`,serverUrl:e.url,workspaceRoot:e.appRoot},void 0,d)}finally{await f.close()}}async function executeWithSignals(e,t,n,r,i){let a=new AbortController,o,handleSigint=()=>{o=130,a.abort()},handleSigterm=()=>{o=143,a.abort()};process.once(`SIGINT`,handleSigint),process.once(`SIGTERM`,handleSigterm);try{let s=n===void 0?{operation:r,signal:a.signal,target:t}:{headers:n,operation:r,signal:a.signal,target:t},c=i===void 0?s:{...s,vercelScope:i},l=await e.deps.runInvoke(c);e.logger.log(JSON.stringify(l,null,2)),process.exitCode=o??invokeExitCode(l)}finally{process.off(`SIGINT`,handleSigint),process.off(`SIGTERM`,handleSigterm)}}function assertSchemaOnly(e,t){if(e!==void 0||t.resume===!0||t.scope!==void 0||t.url!==void 0||t.header!==void 0)throw new InvalidArgumentError(`--json-schema cannot be combined with invoke options or a prompt.`)}async function readJsonFromStdin(){let e=``;process.stdin.setEncoding(`utf8`);for await(let t of process.stdin)e+=t;if(e.trim().length===0)throw new InvalidArgumentError(`--resume expected a resumable eve invoke result on stdin.`);try{return JSON.parse(e)}catch{throw new InvalidArgumentError(`--resume received invalid JSON on stdin.`)}}function invokeExitCode(e){return e.status===`failed`||e.status===`authentication-required`||e.status===`ready`&&e.outcome.status===`failed`?1:e.status===`input-required`||e.status===`authorization-required`?3:0}export{registerInvokeCommand,registerRuntimeInvokeCommand};
@@ -12,7 +12,7 @@ interface CliLogger {
12
12
  }
13
13
  interface CliRuntimeDependencies {
14
14
  isCodingAgentLaunch(): Promise<boolean>;
15
- isEveProject(appRoot: string): Promise<boolean>;
15
+ findApplicationRoot(cwd: string): Promise<string | undefined>;
16
16
  isActiveDevelopmentServerForApp(input: {
17
17
  readonly appRoot: string;
18
18
  readonly serverUrl: string;
@@ -25,8 +25,9 @@ interface CliRuntimeDependencies {
25
25
  }): Promise<void>;
26
26
  runDevelopmentTui(input: RunDevelopmentTuiInput): Promise<void>;
27
27
  runInvoke: InvokeCliRuntimeDependencies["runInvoke"];
28
- runEvalCommand(evalIds: readonly string[], options: EvalCliOptions, logger: CliLogger): Promise<void>;
28
+ runEvalCommand(evalIds: readonly string[], options: EvalCliOptions, logger: CliLogger, appRoot: string): Promise<void>;
29
29
  startHost(appRoot: string, options?: DevelopmentServerOptions): DevelopmentServer;
30
+ resolveApplicationRoot(cwd: string): Promise<string>;
30
31
  startProductionHost(appRoot: string, options?: {
31
32
  host?: string;
32
33
  port?: number;
@@ -1,4 +1,4 @@
1
- import{createLogger}from"#internal/logging.js";import{Command,CommanderError,InvalidArgumentError}from"#compiled/commander/index.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal,waitForShutdownSignal}from"#cli/shutdown.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{registerBuildCommand}from"#cli/commands/build.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{registerIntegrationCommands}from"#cli/commands/register-integration-commands.js";import{registerProjectCommands}from"#cli/commands/register-project-commands.js";import{registerRegistryCommands}from"#cli/commands/register-registry-commands.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"#cli/dev/ui-options.js";import{registerAcpCommand}from"#cli/acp/command.js";import{waitForServerOrStop,waitForUiOrServer}from"#cli/dev/wait-for-ui.js";import{registerRuntimeInvokeCommand}from"#cli/invoke/command.js";import{parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseReasoningOption,parseStatsMode}from"#cli/option-parsers.js";import{resolveTuiTitle}from"#cli/dev/tui/target.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";const devBootLog=createLogger(`dev.boot`);function createDevBootProgressReporter(e){return t=>{switch(t.type){case`phase-started`:e?.update(`Building your agent`,t.phase),devBootLog.debug(t.phase);return;case`phase-finished`:devBootLog.debug(`${t.phase} finished`,{ms:t.elapsedMs});return;case`before-first-paint`:e?.stop();return;default:return t}}}async function loadPrintApplicationInfo(){return(await import(`#cli/commands/info.js`)).printApplicationInfo}async function loadRunDevelopmentTui(){return(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui}async function loadRunEvalCommand(){return(await import(`#evals/cli/eval.js`)).runEvalCommand}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}async function loadIsEveProject(){return(await import(`#setup/scaffold/index.js`)).isEveProject}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;async function loadStartProductionHost(){return(await import(`#internal/nitro/host.js`)).startProductionServer}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function createCliProgram(e,n,f){let h=resolveInstalledPackageInfo().version,y=new Command,b=createCliTheme();y.name(`eve`).description(`Build and run an eve application.`).version(h).showHelpAfterError().exitOverride().hook(`preAction`,(t,n)=>{[`info`,`dev`,`init`].includes(n.name())&&e.log(eveCliBanner())}).configureOutput({writeErr:t=>{e.error(t.trimEnd())},writeOut:t=>{e.log(t.trimEnd())}}),y.command(`channels`).description(`Manage user-authored channels in the current project.`).command(`list`).description(`List user-authored channels in the current project.`).option(`--json`,`Output as JSON`).action(async t=>{let{runChannelsListCommand:n}=await import(`#cli/commands/channels.js`);await n(e,f,t)}),registerIntegrationCommands({program:y,logger:e,appRoot:f});let x=y.command(`extension`).description(`Create and build reusable eve extension packages.`);x.command(`init [target]`).description(`Create a new eve extension package.`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve extension init.`);let{runExtensionInitCommand:r}=await import(`#cli/commands/extension-init.js`);await r(e,f,t)}),x.command(`build`).description(`Build the current package as an eve extension.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);t(f);let{runExtensionBuildCommand:n}=await import(`#cli/commands/extension-build.js`);await n(e,f)}),registerRegistryCommands({program:y,logger:e,appRoot:f}),y.command(`init [target]`).description(`Create a new eve agent, or add one to an existing project directory.`).option(`--channel-web-nextjs`,`Add the Web Chat application (Next.js)`).option(`--model <model>`,`Set the agent model (provider/model-id)`).option(`--reasoning <effort>`,`Set reasoning (provider-default|none|minimal|low|medium|high|xhigh)`,parseReasoningOption).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve init.`);let{runInitCommand:r}=await import(`#cli/commands/init.js`);await r(e,f,t,{channelWebNextjs:n.channelWebNextjs,model:n.model,reasoning:n.reasoning})}),y.command(`set`).description(`Change root agent model settings.`).option(`--model <model>`,`Set the agent model (provider/model-id)`).option(`--reasoning <effort>`,`Set reasoning (provider-default|none|minimal|low|medium|high|xhigh)`,parseReasoningOption).action(async t=>{let{runSetCommand:n}=await import(`#cli/commands/set.js`);await n(e,f,t)}),registerProjectCommands({program:y,logger:e,appRoot:f}),registerBuildCommand({appRoot:f,buildHost:n.buildHost,logger:e,program:y}),y.command(`start`).description(`Start a built eve application.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,parsePortOption).action(async t=>{let{loadDevelopmentEnvironmentFiles:r}=await import(`#cli/dev/environment.js`);r(f);let i=await(n.startProductionHost??await loadStartProductionHost())(f,{host:t.host,port:t.port});e.log(renderCliTaggedLine(b,{message:`server listening at ${i.url}`,tag:`start`,tone:`success`})),await waitForShutdownSignal({close:()=>i.close(),wait:()=>i.wait()})}),registerRuntimeInvokeCommand({appRoot:f,logger:e,program:y,runtime:n}),registerAcpCommand({appRoot:f,eveVersion:h,program:y,resolveVerifiedRemoteDevelopmentClient:n.resolveVerifiedRemoteDevelopmentClient,runAcpServer:n.runAcpServer,startHost:n.startHost}),y.command(`dev`).description(`Start the eve development server or connect to an existing URL.`).argument(`[url]`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input, or start onboarding with /model`).option(`--tools <mode>`,`How tool calls render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--reasoning <mode>`,`How reasoning renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--subagents <mode>`,`How subagent sections render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--connection-auth <mode>`,`How connection authorization renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--assistant-response-stats <mode>`,`Assistant header statistic: tokens | tokensPerSecond`,parseStatsMode).option(`--context-size <tokens>`,`Model context window size, shown as a usage percentage`,parseContextSizeOption).option(`--logs <mode>`,`Which server/agent logs to show: all | stderr | sandbox | none`,parseLogsMode).addHelpText(`after`,`
1
+ import{createLogger}from"#internal/logging.js";import{Command,CommanderError,InvalidArgumentError}from"#compiled/commander/index.js";import{applicationCommand}from"#cli/application-command.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal,waitForShutdownSignal}from"#cli/shutdown.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{registerBuildCommand}from"#cli/commands/build.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{findCliApplicationRoot,resolveCliApplicationRoot}from"#cli/application-root.js";import{registerIntegrationCommands}from"#cli/commands/register-integration-commands.js";import{registerProjectCommands}from"#cli/commands/register-project-commands.js";import{registerRegistryCommands}from"#cli/commands/register-registry-commands.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"#cli/dev/ui-options.js";import{registerAcpCommand}from"#cli/acp/command.js";import{waitForServerOrStop,waitForUiOrServer}from"#cli/dev/wait-for-ui.js";import{registerRuntimeInvokeCommand}from"#cli/invoke/command.js";import{parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseReasoningOption,parseStatsMode}from"#cli/option-parsers.js";import{resolveTuiTitle}from"#cli/dev/tui/target.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";const devBootLog=createLogger(`dev.boot`);function createDevBootProgressReporter(e){return t=>{switch(t.type){case`phase-started`:e?.update(`Building your agent`,t.phase),devBootLog.debug(t.phase);return;case`phase-finished`:devBootLog.debug(`${t.phase} finished`,{ms:t.elapsedMs});return;case`before-first-paint`:e?.stop();return;default:return t}}}async function loadPrintApplicationInfo(){return(await import(`#cli/commands/info.js`)).printApplicationInfo}async function loadRunDevelopmentTui(){return(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui}async function loadRunEvalCommand(){return(await import(`#evals/cli/eval.js`)).runEvalCommand}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;async function loadStartProductionHost(){return(await import(`#internal/nitro/host.js`)).startProductionServer}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function createCliProgram(e,n,p){let g=resolveInstalledPackageInfo().version,_=new Command,v=createCliTheme();_.name(`eve`).description(`Build and run an eve application.`).version(g).showHelpAfterError().exitOverride().hook(`preAction`,(t,n)=>{[`info`,`dev`,`init`].includes(n.name())&&e.log(eveCliBanner())}).configureOutput({writeErr:t=>{e.error(t.trimEnd())},writeOut:t=>{e.log(t.trimEnd())}}),applicationCommand(_.command(`channels`).description(`Manage user-authored channels in the current project.`).command(`list`),p).description(`List user-authored channels in the current project.`).option(`--json`,`Output as JSON`).action(async t=>{let{runChannelsListCommand:n}=await import(`#cli/commands/channels.js`);await n(e,p.root,t)}),registerIntegrationCommands({program:_,logger:e,applicationContext:p});let b=_.command(`extension`).description(`Create and build reusable eve extension packages.`);b.command(`init [target]`).description(`Create a new eve extension package.`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve extension init.`);let{runExtensionInitCommand:r}=await import(`#cli/commands/extension-init.js`);await r(e,p.root,t)}),b.command(`build`).description(`Build the current package as an eve extension.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);t(p.root);let{runExtensionBuildCommand:n}=await import(`#cli/commands/extension-build.js`);await n(e,p.root)}),registerRegistryCommands({program:_,logger:e,applicationContext:p}),_.command(`init [target]`).description(`Create a new eve agent, or add one to an existing project directory.`).option(`--channel-web-nextjs`,`Add the Web Chat application (Next.js)`).option(`--model <model>`,`Set the agent model (provider/model-id)`).option(`--reasoning <effort>`,`Set reasoning (provider-default|none|minimal|low|medium|high|xhigh)`,parseReasoningOption).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve init.`);let{runInitCommand:r}=await import(`#cli/commands/init.js`);await r(e,p.root,t,{channelWebNextjs:n.channelWebNextjs,model:n.model,reasoning:n.reasoning})}),applicationCommand(_.command(`set`),p).description(`Change root agent model settings.`).option(`--model <model>`,`Set the agent model (provider/model-id)`).option(`--reasoning <effort>`,`Set reasoning (provider-default|none|minimal|low|medium|high|xhigh)`,parseReasoningOption).action(async t=>{let{runSetCommand:n}=await import(`#cli/commands/set.js`);await n(e,p.root,t)}),registerProjectCommands({program:_,logger:e,applicationContext:p}),registerBuildCommand({applicationContext:p,buildHost:n.buildHost,logger:e,program:_}),applicationCommand(_.command(`start`),p).description(`Start a built eve application.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,parsePortOption).action(async t=>{let{loadDevelopmentEnvironmentFiles:r}=await import(`#cli/dev/environment.js`);r(p.root);let i=await(n.startProductionHost??await loadStartProductionHost())(p.root,{host:t.host,port:t.port});e.log(renderCliTaggedLine(v,{message:`server listening at ${i.url}`,tag:`start`,tone:`success`})),await waitForShutdownSignal({close:()=>i.close(),wait:()=>i.wait()})}),registerRuntimeInvokeCommand({applicationContext:p,logger:e,program:_,runtime:n}),registerAcpCommand({applicationContext:p,eveVersion:g,program:_,resolveVerifiedRemoteDevelopmentClient:n.resolveVerifiedRemoteDevelopmentClient,runAcpServer:n.runAcpServer,startHost:n.startHost}),applicationCommand(_.command(`dev`),p,e=>resolveDevelopmentUrlTarget(e.opts(),e.processedArgs[0])===void 0).description(`Start the eve development server or connect to an existing URL.`).argument(`[url]`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input, or start onboarding with /model`).option(`--tools <mode>`,`How tool calls render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--reasoning <mode>`,`How reasoning renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--subagents <mode>`,`How subagent sections render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--connection-auth <mode>`,`How connection authorization renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--assistant-response-stats <mode>`,`Assistant header statistic: tokens | tokensPerSecond`,parseStatsMode).option(`--context-size <tokens>`,`Model context window size, shown as a usage percentage`,parseContextSizeOption).option(`--logs <mode>`,`Which server/agent logs to show: all | stderr | sandbox | none`,parseLogsMode).addHelpText(`after`,`
2
2
  You can also pass a bare URL, for example: eve dev https://example.com
3
- `).action(async(t,i)=>{let o=resolveDevelopmentUrlTarget(i,t),l=o?.serverUrl,u=hasInteractiveTerminal(),d=resolveDevUiMode({options:i,interactive:u});if(i.input!==void 0&&d===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let p=!1;l!==void 0&&(p=await(n.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:f,serverUrl:l}));let runInteractiveUi=async(e,t,r)=>{let a=await devBootPhase(`loading interactive UI`,async()=>n.runDevelopmentTui??await loadRunDevelopmentTui(),t),s=resolveTuiDisplayOptions(i),c=l===void 0||p?{kind:`local`,serverUrl:e.serverUrl,workspaceRoot:e.appRoot??f}:{kind:`remote`,serverUrl:e.serverUrl,workspaceRoot:f},u=resolveTuiTitle({name:i.name,target:c});u!==void 0&&(s.name=u);let d={target:c,initialInput:i.input,onBootProgress:t,lifecycle:r,...s};c.kind===`local`&&(d.withExclusiveTerminal=async t=>await(async()=>{if(!await suspendDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);try{return await t()}finally{await resumeDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl,silent:!0})}})()),o?.headers===void 0?await a(d):await a({...d,headers:o.headers})};if(l){let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);if(t(f),e.log(`↗ ${p?`local`:`remote`} mode targeting ${b.info(new URL(l).host)}`),d===`headless`){e.log(renderCliTaggedLine(b,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}e.log(``);let n=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveUi({serverUrl:l},void 0,n)}finally{n.dispose()}return}d===`tui`&&e.log(``);let m=d===`tui`?startCliLiveRow(e):void 0,h=createDevBootProgressReporter(m);m?.update(`Building your agent`);let g,_,closeServer=()=>g===void 0?Promise.resolve():(_??=g.close(),_.catch(()=>void 0),_),v=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS,onStop:()=>{closeServer()}});try{g=(n.startHost??await loadStartHost())(f,{existing:d===`tui`?`attach-if-unconfigured`:`reject`,host:i.host,onBootProgress:h,port:i.port});let t=(await Promise.race([g.start().then(e=>({handle:e})),v.stopped.then(()=>({handle:void 0}))])).handle;if(t===void 0)return;if(d!==`tui`&&e.log(renderCliTaggedLine(b,{message:`server listening at ${t.url}`,tag:`dev`,tone:`success`})),d===`headless`){i.ui!==!1&&!u&&e.log(renderCliTaggedLine(b,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForServerOrStop(g,v);return}await waitForUiOrServer({handle:t,lifecycle:v,server:g,runUi:async()=>await runInteractiveUi({appRoot:t.appRoot,serverUrl:t.url},h,v)})}finally{m?.stop(),await closeServer(),v.dispose()}});let S=y.command(`logs`).description("Inspect local `eve dev` diagnostic logs (.eve/logs).");return S.command(`show [logid]`,{isDefault:!0}).description(`Print a diagnostic log (the most recent when logid is omitted).`).option(`--dump`,`Prepend the log's environment dump (.dump sibling)`).option(`--events`,`Interleave session events from the local workflow store`).action(async(t,n)=>{let{runLogsShowCommand:r}=await import(`#cli/commands/logs.js`);await r(e,f,t,n)}),S.command(`ls`).description(`List diagnostic logs, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runLogsListCommand:n}=await import(`#cli/commands/logs.js`);await n(e,f,t)}),y.command(`traces [trace]`).usage(`[options] [trace]
4
- eve traces ls [options]`).description("Show a local `eve dev` trace (the most recent when trace is omitted).").option(`--verbose`,`Expand every span with all attributes and events`).option(`--json`,`Output as JSON`).action(async(t,n)=>{let{runTraceShowCommand:r}=await import(`#cli/commands/trace.js`);await r(e,f,t,n)}).command(`ls`).description(`List local traces, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runTraceListCommand:n}=await import(`#cli/commands/trace.js`);await n(e,f,t)}),y.command(`info`).description(`Print resolved application information.`).option(`--json`,`Output as JSON`).action(async t=>{await(n.printApplicationInfo??await loadPrintApplicationInfo())(e,f,t)}),y.command(`eval`).description(`Run evals against an eve agent.`).argument(`[evalIds...]`,`Eval ids (or directory prefixes) to run (all discovered evals when omitted)`).option(`--url <url>`,`Remote agent URL (skip local host startup)`,parseDevelopmentServerUrl).option(`--tag <tag...>`,`Run only evals carrying a tag`).option(`--exclude-tag <tag...>`,`Skip evals carrying a tag`).option(`--strict`,`Fail the exit code when any score falls below its threshold`).option(`--list`,`Print discovered evals without running them`).option(`--timeout <ms>`,`Per-eval timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent eval executions`).option(`--json`,`Output results as JSON`).option(`--junit <path>`,`Write JUnit XML results to a file`).option(`--skip-report`,`Skip eval-defined reporters (e.g. Braintrust)`).option(`--verbose`,`Stream per-eval t.log lines to stdout`).action(async(t,r)=>{await(n.runEvalCommand??await loadRunEvalCommand())(t,r,e)}),y}async function runCli(e=process.argv.slice(2),t=console,r={}){let i=resolveApplicationRoot(),a=createCliProgram(t,r,i),o=e;o.length===0&&(o=[await(r.isEveProject??await loadIsEveProject())(i)?`dev`:`init`]);try{await a.parseAsync(o,{from:`user`})}catch(e){if(e instanceof CommanderError){if(e.exitCode===0)return;let n=await(r.isCodingAgentLaunch??isCodingAgentLaunch)();if(o[0]===`init`&&n){let{initAgentInstructions:e}=await import(`#cli/commands/agent-instructions.js`);t.log(e())}throw Error(e.message)}throw e}}export{resolveDevUiMode,resolveTuiDisplayOptions,runCli};
3
+ `).action(async(t,i)=>{let a=resolveDevelopmentUrlTarget(i,t),s=a?.serverUrl,u=hasInteractiveTerminal(),d=resolveDevUiMode({options:i,interactive:u});if(i.input!==void 0&&d===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let f=!1;s!==void 0&&(f=await(n.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:p.root,serverUrl:s}));let runInteractiveUi=async(e,t,r)=>{let o=await devBootPhase(`loading interactive UI`,async()=>n.runDevelopmentTui??await loadRunDevelopmentTui(),t),c=resolveTuiDisplayOptions(i),l=s===void 0||f?{kind:`local`,serverUrl:e.serverUrl,workspaceRoot:e.appRoot??p.root}:{kind:`remote`,serverUrl:e.serverUrl,workspaceRoot:p.root},u=resolveTuiTitle({name:i.name,target:l});u!==void 0&&(c.name=u);let d={target:l,initialInput:i.input,onBootProgress:t,lifecycle:r,...c};l.kind===`local`&&(d.withExclusiveTerminal=async t=>await(async()=>{if(!await suspendDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);try{return await t()}finally{await resumeDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl,silent:!0})}})()),a?.headers===void 0?await o(d):await o({...d,headers:a.headers})};if(s){let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);if(t(p.root),e.log(`↗ ${f?`local`:`remote`} mode targeting ${v.info(new URL(s).host)}`),d===`headless`){e.log(renderCliTaggedLine(v,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}e.log(``);let n=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveUi({serverUrl:s},void 0,n)}finally{n.dispose()}return}d===`tui`&&e.log(``);let m=d===`tui`?startCliLiveRow(e):void 0,h=createDevBootProgressReporter(m);m?.update(`Building your agent`);let g,_,closeServer=()=>g===void 0?Promise.resolve():(_??=g.close(),_.catch(()=>void 0),_),y=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS,onStop:()=>{closeServer()}});try{g=(n.startHost??await loadStartHost())(p.root,{existing:d===`tui`?`attach-if-unconfigured`:`reject`,host:i.host,onBootProgress:h,port:i.port});let t=(await Promise.race([g.start().then(e=>({handle:e})),y.stopped.then(()=>({handle:void 0}))])).handle;if(t===void 0)return;if(d!==`tui`&&e.log(renderCliTaggedLine(v,{message:`server listening at ${t.url}`,tag:`dev`,tone:`success`})),d===`headless`){i.ui!==!1&&!u&&e.log(renderCliTaggedLine(v,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForServerOrStop(g,y);return}await waitForUiOrServer({handle:t,lifecycle:y,server:g,runUi:async()=>await runInteractiveUi({appRoot:t.appRoot,serverUrl:t.url},h,y)})}finally{m?.stop(),await closeServer(),y.dispose()}});let x=_.command(`logs`).description("Inspect local `eve dev` diagnostic logs (.eve/logs).");return applicationCommand(x.command(`show [logid]`,{isDefault:!0}),p).description(`Print a diagnostic log (the most recent when logid is omitted).`).option(`--dump`,`Prepend the log's environment dump (.dump sibling)`).option(`--events`,`Interleave session events from the local workflow store`).action(async(t,n)=>{let{runLogsShowCommand:r}=await import(`#cli/commands/logs.js`);await r(e,p.root,t,n)}),applicationCommand(x.command(`ls`),p).description(`List diagnostic logs, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runLogsListCommand:n}=await import(`#cli/commands/logs.js`);await n(e,p.root,t)}),applicationCommand(_.command(`traces [trace]`),p).usage(`[options] [trace]
4
+ eve traces ls [options]`).description("Show a local `eve dev` trace (the most recent when trace is omitted).").option(`--verbose`,`Expand every span with all attributes and events`).option(`--json`,`Output as JSON`).action(async(t,n)=>{let{runTraceShowCommand:r}=await import(`#cli/commands/trace.js`);await r(e,p.root,t,n)}).command(`ls`).description(`List local traces, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runTraceListCommand:n}=await import(`#cli/commands/trace.js`);await n(e,p.root,t)}),applicationCommand(_.command(`info`),p).description(`Print resolved application information.`).option(`--json`,`Output as JSON`).action(async t=>{await(n.printApplicationInfo??await loadPrintApplicationInfo())(e,p.root,t)}),applicationCommand(_.command(`eval`),p).description(`Run evals against an eve agent.`).argument(`[evalIds...]`,`Eval ids (or directory prefixes) to run (all discovered evals when omitted)`).option(`--url <url>`,`Remote agent URL (skip local host startup)`,parseDevelopmentServerUrl).option(`--tag <tag...>`,`Run only evals carrying a tag`).option(`--exclude-tag <tag...>`,`Skip evals carrying a tag`).option(`--strict`,`Fail the exit code when any score falls below its threshold`).option(`--list`,`Print discovered evals without running them`).option(`--timeout <ms>`,`Per-eval timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent eval executions`).option(`--json`,`Output results as JSON`).option(`--junit <path>`,`Write JUnit XML results to a file`).option(`--skip-report`,`Skip eval-defined reporters (e.g. Braintrust)`).option(`--verbose`,`Stream per-eval t.log lines to stdout`).action(async(t,r)=>{await(n.runEvalCommand??await loadRunEvalCommand())(t,r,e,p.root)}),_}async function runCli(e=process.argv.slice(2),t=console,r={}){let i={root:resolveApplicationRoot(),async resolve(){i.root=await(r.resolveApplicationRoot??resolveCliApplicationRoot)(i.root)}},a=createCliProgram(t,r,i),o=e;if(o.length===0){let e=await(r.findApplicationRoot??findCliApplicationRoot)(i.root);e===void 0?o=[`init`]:(i.root=e,o=[`dev`])}try{await a.parseAsync(o,{from:`user`})}catch(e){if(e instanceof CommanderError){if(e.exitCode===0)return;let n=await(r.isCodingAgentLaunch??isCodingAgentLaunch)();if(o[0]===`init`&&n){let{initAgentInstructions:e}=await import(`#cli/commands/agent-instructions.js`);t.log(e())}throw Error(e.message)}throw e}}export{resolveDevUiMode,resolveTuiDisplayOptions,runCli};
@@ -1,7 +1,7 @@
1
1
  import type { EveAgentReducer } from "#client/reducer.js";
2
2
  import type { ClientSession } from "#client/session.js";
3
3
  import type { MessageStreamEvent } from "#protocol/message.js";
4
- import type { ClientAuth, HeadersValue, SendTurnPayload, ClientSessionState } from "#client/types.js";
4
+ import type { CancelSessionResult, ClientAuth, HeadersValue, SendTurnPayload, ClientSessionState } from "#client/types.js";
5
5
  /**
6
6
  * Lifecycle state of an {@link EveAgentStore}: `ready` (idle), `submitted`
7
7
  * (turn sent, awaiting the first event), `streaming` (events arriving), and
@@ -67,6 +67,7 @@ export interface EveAgentStoreInit<TData> {
67
67
  readonly reducer: EveAgentReducer<TData>;
68
68
  readonly session?: ClientSession;
69
69
  }
70
+ declare const detachStore: unique symbol;
70
71
  /**
71
72
  * Framework-agnostic state machine for an eve agent session.
72
73
  *
@@ -77,7 +78,8 @@ export interface EveAgentStoreInit<TData> {
77
78
  * Drives one turn at a time: `send` rejects if a turn is already submitted or
78
79
  * streaming. Read the latest projection via the `snapshot` getter, observe
79
80
  * changes with `subscribe`, register lifecycle hooks with `setCallbacks`,
80
- * abort the in-flight turn with `stop`, and discard all state with `reset`.
81
+ * cancel the durable in-flight turn with `cancel`, and discard all state with
82
+ * `reset`.
81
83
  */
82
84
  export declare class EveAgentStore<TData> {
83
85
  #private;
@@ -86,6 +88,16 @@ export declare class EveAgentStore<TData> {
86
88
  setCallbacks(callbacks: EveAgentStoreCallbacks<TData>): void;
87
89
  subscribe(callback: () => void): () => void;
88
90
  send<TOutput = unknown>(input: SendTurnPayload<TOutput>): Promise<void>;
89
- stop(): void;
91
+ /**
92
+ * Requests cooperative cancellation of the active durable turn.
93
+ *
94
+ * If the server has not emitted `turn.started` yet, the request waits for
95
+ * that turn ID. The event stream stays attached until the turn settles.
96
+ */
97
+ cancel(): Promise<CancelSessionResult>;
98
+ [detachStore](): void;
90
99
  reset(): void;
91
100
  }
101
+ /** @internal Detaches local transport without cancelling durable server work. */
102
+ export declare function detachEveAgentStore<TData>(store: EveAgentStore<TData>): void;
103
+ export {};
@@ -1,2 +1,2 @@
1
- import{toError}from"#shared/errors.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{Client}from"#client/client.js";var EveAgentStore=class{#e;#t;#n;#r;#i=new Set;#a=createEventDeduper();#o;#s={};#c;#l;#u;#d=0;#f;#p;#m;#h;#g=`ready`;constructor(e){this.#t=e.session!==void 0,this.#e=this.#t?void 0:new Client({auth:e.auth,headers:e.headers,host:e.host??``});let t=[];for(let n of e.initialEvents??[])this.#a.admit(n)&&t.push(n);this.#u=t,this.#p=[...this.#u],this.#n=e.optimistic??!0,this.#r=e.reducer,this.#m=e.session??(e.initialSession===void 0?void 0:this.#e?.sessions.attach(e.initialSession.sessionId,{streamIndex:e.initialSession.streamIndex})),this.#c=this.#k(this.#p),this.#h=this.#A()}get snapshot(){return this.#h}setCallbacks(e){this.#s=e}subscribe(e){return this.#i.add(e),()=>{this.#i.delete(e)}}async send(t){if(this.#g===`streaming`||this.#g===`submitted`)throw Error(`eve session is already processing a turn.`);let n=this.#y(),r=new AbortController;this.#o=r,this.#l=void 0,this.#g=`submitted`,this.#j();try{let e=await this.#s.prepareSend?.(t)??t;if(assertExclusiveTurnInput(e),!this.#x(n))return;this.#S(e),this.#C(e),this.#j();let i={...e,signal:createAbortSignal(e.signal,r.signal)},a=await this.#v(i),o=!1;for await(let e of a){if(!this.#x(n))return;o||(o=!0,this.#g=`streaming`),this.#a.admit(e)&&(this.#u=[...this.#u,e],this.#w(e),this.#s.onEvent?.(e),this.#T(e),this.#j())}if(!this.#x(n))return;this.#g=this.#l===void 0?`ready`:`error`}catch(t){if(!this.#x(n))return;isAbortError(t)?(this.#g=`ready`,this.#E(toError(t))):(this.#l=toError(t),this.#g=`error`,this.#E(this.#l),this.#s.onError?.(this.#l))}finally{this.#x(n)&&(this.#o=void 0,this.#s.onSessionChange?.(this.#m?.state),this.#j(),this.#s.onFinish?.(this.#h))}}stop(){this.#o?.abort()}reset(){this.#b(),this.stop(),this.#o=void 0,this.#t||(this.#m=void 0),this.#u=[],this.#a=createEventDeduper(),this.#f=void 0,this.#p=[],this.#c=this.#r.initial(),this.#l=void 0,this.#g=`ready`,this.#s.onSessionChange?.(this.#m?.state),this.#j()}async#_(e){if(this.#e===void 0)throw Error(`An external eve session is required before sending.`);if(e.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let t=await this.#e.sessions.create({...e,message:e.message});return this.#m=t.session,this.#s.onSessionChange?.(t.session.state),this.#j(),t.response}async#v(e){if(this.#m===void 0)return await this.#_(e);if(e.inputResponses===void 0){let{message:t,...n}=e;return await this.#m.send(t,n)}let{inputResponses:t,...n}=e;return await this.#m.respond(t,n)}#y(){return this.#d+=1,this.#d}#b(){this.#d+=1}#x(e){return this.#d===e}#S(e){if(!this.#n||e.message===void 0)return;let t=createSubmissionId(),n={createdAt:Date.now(),id:t,message:summarizeUserContent(e.message)};this.#f=n,this.#D({data:{createdAt:n.createdAt,message:n.message,submissionId:n.id},type:`client.message.submitted`})}#C(e){e.inputResponses===void 0||e.inputResponses.length===0||this.#D({data:{createdAt:Date.now(),responses:e.inputResponses},type:`client.input.responded`})}#w(e){if(e.type===`message.received`&&this.#f!==void 0){let t=this.#f.id;this.#f=void 0,this.#O(e=>e.type===`client.message.submitted`&&e.data.submissionId===t,e);return}this.#D(e)}#T(e){let t=toTerminalStreamFailureError(e);t!==void 0&&(this.#g=`error`,this.#E(t),this.#l===void 0&&(this.#l=t,this.#s.onError?.(t)))}#E(e){let t=this.#f;t!==void 0&&(this.#f=void 0,this.#O(e=>e.type===`client.message.submitted`&&e.data.submissionId===t.id,{data:{createdAt:t.createdAt,error:{message:e.message},message:t.message,submissionId:t.id},type:`client.message.failed`}))}#D(e){this.#p=[...this.#p,e],this.#c=this.#r.reduce(this.#c,e)}#O(e,t){let n=!1;this.#p=this.#p.map(r=>!n&&e(r)?(n=!0,t):r),n||(this.#p=[...this.#p,t]),this.#c=this.#k(this.#p)}#k(e){let t=this.#r.initial();for(let n of e)t=this.#r.reduce(t,n);return t}#A(){return{data:this.#c,error:this.#l,events:this.#u,session:this.#m?.state,status:this.#g}}#j(){this.#h=this.#A();for(let e of this.#i)e()}};function assertExclusiveTurnInput(e){if(e.message!==void 0==(e.inputResponses!==void 0))throw Error(`A turn requires exactly one of message or inputResponses.`)}let submissionSequence=0;function createSubmissionId(){let e=globalThis.crypto?.randomUUID;return e===void 0?(submissionSequence+=1,`submission_${submissionSequence.toString()}`):e.call(globalThis.crypto)}function createAbortSignal(e,t){return e?AbortSignal.any([e,t]):t}function summarizeUserContent(e){if(typeof e==`string`)return e;let t=[];for(let n of e){if(n.type===`text`){t.push(n.text);continue}n.type===`file`&&t.push(n.filename?`[file: ${n.filename}]`:`[file]`)}return t.join(`
2
- `)}function isAbortError(e){return e instanceof Error&&e.name===`AbortError`}function toTerminalStreamFailureError(e){if(e.type!==`session.failed`)return;let t=Error(e.data.message);return t.name=e.data.code,t}export{EveAgentStore};
1
+ import{toError}from"#shared/errors.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{Client}from"#client/client.js";const detachStore=Symbol(`detachEveAgentStore`);var EveAgentStore=class{#e;#t;#n;#r;#i=new Set;#a=createEventDeduper();#o;#s={};#c;#l;#u;#d;#f;#p;#m;#h=`ready`;constructor(e){this.#t=e.session!==void 0,this.#e=this.#t?void 0:new Client({auth:e.auth,headers:e.headers,host:e.host??``});let t=[];for(let n of e.initialEvents??[])this.#a.admit(n)&&t.push(n);this.#u=t,this.#f=[...this.#u],this.#n=e.optimistic??!0,this.#r=e.reducer,this.#p=e.session??(e.initialSession===void 0?void 0:this.#e?.sessions.attach(e.initialSession.sessionId,{streamIndex:e.initialSession.streamIndex})),this.#c=this.#E(this.#f),this.#m=this.#D()}get snapshot(){return this.#m}setCallbacks(e){this.#s=e}subscribe(e){return this.#i.add(e),()=>{this.#i.delete(e)}}async send(t){if(this.#h===`streaming`||this.#h===`submitted`)throw Error(`eve session is already processing a turn.`);let n=Promise.withResolvers(),r={abortController:new AbortController,response:n.promise,resolveResponse:n.resolve};this.#o=r,this.#l=void 0,this.#h=`submitted`,this.#O();try{let e=await this.#s.prepareSend?.(t)??t;if(assertExclusiveTurnInput(e),!this.#v(r))return;this.#y(e),this.#b(e),this.#O();let n={...e,signal:createAbortSignal(e.signal,r.abortController.signal)},i=await this.#_(n);if(!this.#v(r))return;r.resolveResponse(i);let a=!1;for await(let e of i){if(!this.#v(r))return;a||(a=!0,this.#h=`streaming`),this.#a.admit(e)&&(this.#u=[...this.#u,e],this.#x(e),this.#s.onEvent?.(e),this.#S(e),this.#O())}if(!this.#v(r))return;this.#h=this.#l===void 0?`ready`:`error`}catch(t){if(!this.#v(r))return;isAbortError(t)?(this.#h=`ready`,this.#C(toError(t))):(this.#l=toError(t),this.#h=`error`,this.#C(this.#l),this.#s.onError?.(this.#l))}finally{this.#v(r)&&(r.resolveResponse(void 0),this.#o=void 0,this.#s.onSessionChange?.(this.#p?.state),this.#O(),this.#s.onFinish?.(this.#m))}}cancel(){let e=this.#o;return e===void 0?Promise.resolve({status:`no_active_turn`}):e.response.then(e=>e===void 0?{status:`no_active_turn`}:e.cancel())}[detachStore](){this.#o?.abortController.abort()}reset(){let e=this.#o;this.#o=void 0,e?.resolveResponse(void 0),e?.abortController.abort(),this.#t||(this.#p=void 0),this.#u=[],this.#a=createEventDeduper(),this.#d=void 0,this.#f=[],this.#c=this.#r.initial(),this.#l=void 0,this.#h=`ready`,this.#s.onSessionChange?.(this.#p?.state),this.#O()}async#g(e){if(this.#e===void 0)throw Error(`An external eve session is required before sending.`);if(e.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let t=await this.#e.sessions.create({...e,message:e.message});return this.#p=t.session,this.#s.onSessionChange?.(t.session.state),this.#O(),t.response}async#_(e){if(this.#p===void 0)return await this.#g(e);if(e.inputResponses===void 0){let{message:t,...n}=e;return await this.#p.send(t,n)}let{inputResponses:t,...n}=e;return await this.#p.respond(t,n)}#v(e){return this.#o===e}#y(e){if(!this.#n||e.message===void 0)return;let t=createSubmissionId(),n={createdAt:Date.now(),id:t,message:summarizeUserContent(e.message)};this.#d=n,this.#w({data:{createdAt:n.createdAt,message:n.message,submissionId:n.id},type:`client.message.submitted`})}#b(e){e.inputResponses===void 0||e.inputResponses.length===0||this.#w({data:{createdAt:Date.now(),responses:e.inputResponses},type:`client.input.responded`})}#x(e){if(e.type===`message.received`&&this.#d!==void 0){let t=this.#d.id;this.#d=void 0,this.#T(e=>e.type===`client.message.submitted`&&e.data.submissionId===t,e);return}this.#w(e)}#S(e){let t=toTerminalStreamFailureError(e);t!==void 0&&(this.#h=`error`,this.#C(t),this.#l===void 0&&(this.#l=t,this.#s.onError?.(t)))}#C(e){let t=this.#d;t!==void 0&&(this.#d=void 0,this.#T(e=>e.type===`client.message.submitted`&&e.data.submissionId===t.id,{data:{createdAt:t.createdAt,error:{message:e.message},message:t.message,submissionId:t.id},type:`client.message.failed`}))}#w(e){this.#f=[...this.#f,e],this.#c=this.#r.reduce(this.#c,e)}#T(e,t){let n=!1;this.#f=this.#f.map(r=>!n&&e(r)?(n=!0,t):r),n||(this.#f=[...this.#f,t]),this.#c=this.#E(this.#f)}#E(e){let t=this.#r.initial();for(let n of e)t=this.#r.reduce(t,n);return t}#D(){return{data:this.#c,error:this.#l,events:this.#u,session:this.#p?.state,status:this.#h}}#O(){this.#m=this.#D();for(let e of this.#i)e()}};function detachEveAgentStore(e){e[detachStore]()}function assertExclusiveTurnInput(e){if(e.message!==void 0==(e.inputResponses!==void 0))throw Error(`A turn requires exactly one of message or inputResponses.`)}let submissionSequence=0;function createSubmissionId(){let e=globalThis.crypto?.randomUUID;return e===void 0?(submissionSequence+=1,`submission_${submissionSequence.toString()}`):e.call(globalThis.crypto)}function createAbortSignal(e,t){return e?AbortSignal.any([e,t]):t}function summarizeUserContent(e){if(typeof e==`string`)return e;let t=[];for(let n of e){if(n.type===`text`){t.push(n.text);continue}n.type===`file`&&t.push(n.filename?`[file: ${n.filename}]`:`[file]`)}return t.join(`
2
+ `)}function isAbortError(e){return e instanceof Error&&e.name===`AbortError`}function toTerminalStreamFailureError(e){if(e.type!==`session.failed`)return;let t=Error(e.data.message);return t.name=e.data.code,t}export{EveAgentStore,detachEveAgentStore};
@@ -1,9 +1,10 @@
1
- import type { MessageStreamEvent } from "#protocol/message.js";
2
- import type { MessageResult } from "#client/types.js";
1
+ import { type MessageStreamEvent } from "#protocol/message.js";
2
+ import type { CancelSessionResult, MessageResult } from "#client/types.js";
3
3
  /**
4
4
  * Internal configuration passed to construct a {@link MessageResponse}.
5
5
  */
6
6
  interface MessageResponseInput {
7
+ readonly cancelTurn: (turnId: string) => Promise<CancelSessionResult>;
7
8
  readonly createStream: () => AsyncGenerator<MessageStreamEvent>;
8
9
  readonly sessionId: string;
9
10
  }
@@ -22,6 +23,13 @@ export declare class MessageResponse<TOutput = unknown> implements AsyncIterable
22
23
  readonly sessionId: string;
23
24
  /** @internal */
24
25
  constructor(input: MessageResponseInput);
26
+ /**
27
+ * Requests cooperative cancellation of this exact turn.
28
+ *
29
+ * The request waits for the response stream to identify the turn when
30
+ * necessary. Continue consuming the stream to observe its durable boundary.
31
+ */
32
+ cancel(): Promise<CancelSessionResult>;
25
33
  /**
26
34
  * Consumes the full event stream and returns the aggregated
27
35
  * {@link MessageResult}.
@@ -1 +1 @@
1
- import{summarizeTurnEvents}from"#client/session-utils.js";import{extractCompletedResult}from"#client/output-schema.js";var MessageResponse=class{sessionId;#e=!1;#t;constructor(e){this.sessionId=e.sessionId,this.#t=e.createStream}async result(){let t=[];for await(let e of this)t.push(e);let n=summarizeTurnEvents(t);return{data:extractCompletedResult(t),events:t,inputRequests:n.inputRequests,message:n.message,sessionId:this.sessionId,status:n.status}}[Symbol.asyncIterator](){if(this.#e)throw Error(`MessageResponse has already been consumed.`);return this.#e=!0,this.#t()}};export{MessageResponse};
1
+ import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{summarizeTurnEvents}from"#client/session-utils.js";import{extractCompletedResult}from"#client/output-schema.js";var MessageResponse=class{sessionId;#e;#t;#n=!1;#r;#i=!1;#a=Promise.withResolvers();constructor(e){this.#e=e.cancelTurn,this.sessionId=e.sessionId,this.#r=e.createStream}cancel(){if(this.#i)return Promise.resolve({status:`no_active_turn`});if(this.#t!==void 0)return this.#t;let e=this.#a.promise.then(e=>e===void 0?{status:`no_active_turn`}:this.#e(e));return this.#t=e,e.catch(()=>{!this.#i&&this.#t===e&&(this.#t=void 0)}),e}async result(){let e=[];for await(let t of this)e.push(t);let n=summarizeTurnEvents(e);return{data:extractCompletedResult(e),events:e,inputRequests:n.inputRequests,message:n.message,sessionId:this.sessionId,status:n.status}}[Symbol.asyncIterator](){if(this.#n)throw Error(`MessageResponse has already been consumed.`);return this.#n=!0,this.#o()}async*#o(){try{for await(let t of this.#r())t.type===`turn.started`?this.#a.resolve(t.data.turnId):isCurrentTurnBoundaryEvent(t)&&(this.#i=!0,this.#a.resolve(void 0)),yield t}finally{this.#a.resolve(void 0)}}};export{MessageResponse};
@@ -1 +1 @@
1
- import{EVE_SESSION_ROUTE_PATH,createEveSessionRoutePath}from"#protocol/routes.js";import{EVE_SESSION_ID_HEADER,isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{ClientError}from"#client/client-error.js";import{createClientUrl}from"#client/url.js";import{MessageResponse}from"#client/message-response.js";import{followStreamIterable}from"#client/open-stream.js";import{cancelClientSession,clearClientSession,compactClientSession,resetClientSession}from"#client/session-controls.js";import{serializeOutputSchema}from"#shared/tool-schema.js";var ClientSession=class ClientSession{#e;#t;constructor(e,t){this.#e=e,this.#t=t}static async create(t,n){let r=await postTurn(t,EVE_SESSION_ROUTE_PATH,n,!0),i=await readSessionId(r),a=new ClientSession(t,{sessionId:i,streamIndex:0});return{response:a.#r(r,n,0),session:a}}get state(){return this.#t}async snapshot(e){e?.signal?.throwIfAborted();let t=[];for await(let n of this.#o({follow:!1,signal:e?.signal,startIndex:0}))t.push(n);return e?.signal?.throwIfAborted(),{events:t,session:{sessionId:this.#t.sessionId,streamIndex:t.length}}}async send(e,t={}){return await this.#n({...t,message:e})}async respond(e,t={}){if(e.length===0)throw Error(`ClientSession.respond() requires at least one input response.`);return await this.#n({...t,inputResponses:e})}async#n(e){let n=this.#t.streamIndex,r=await postTurn(this.#e,createEveSessionRoutePath(this.#t.sessionId),e,!1);if(await readSessionId(r,this.#t.sessionId)!==this.#t.sessionId)throw Error(`Message route returned a different session id.`);return this.#r(r,e,n)}async cancel(e){return await cancelClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}async clear(){return await clearClientSession({context:this.#e,sessionId:this.#t.sessionId})}async compact(){return await compactClientSession({context:this.#e,sessionId:this.#t.sessionId})}async reset(e){return await resetClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}stream(e){if(e?.follow===!1&&(e.startIndex??this.#t.streamIndex)<0)throw Error(`stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.`);return this.#a(e)}#r(e,t,n){return e.body?.cancel().catch(()=>{}),new MessageResponse({createStream:()=>this.#i(n,t),sessionId:this.#t.sessionId})}async*#i(e,t){let n=0;try{for await(let i of this.#o({headers:t.headers,keepAlive:shouldKeepActiveTurnAlive(t.streamReconnectPolicy),signal:t.signal,startIndex:e,streamReconnectPolicy:t.streamReconnectPolicy}))if(n+=1,yield i,isCurrentTurnBoundaryEvent(i))break}finally{this.#t={sessionId:this.#t.sessionId,streamIndex:e+n}}}async*#a(e){let t=e?.startIndex??this.#t.streamIndex,n=0;try{for await(let r of this.#o({follow:e?.follow,signal:e?.signal,startIndex:t,streamReconnectPolicy:e?.streamReconnectPolicy}))n+=1,yield r}finally{t>=0&&(this.#t={sessionId:this.#t.sessionId,streamIndex:t+n})}}#o(e){return followStreamIterable({follow:e.follow,host:this.#e.host,keepAlive:e.keepAlive,resolveHeaders:()=>this.#e.resolveHeaders(e.headers),redirect:this.#e.redirect,sessionId:this.#t.sessionId,signal:e.signal,startIndex:e.startIndex,streamReconnectPolicy:e.streamReconnectPolicy})}};function shouldKeepActiveTurnAlive(e){return e&&`reconnect`in e?!1:e?.streamIdleReconnectPolicy?.maxAttempts===void 0}async function postTurn(e,t,n,r){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 inputResponses.`);let s=await e.resolveHeaders(n.headers);s.set(`content-type`,`application/json`);let c=await fetch(createClientUrl(e.host,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 new ClientError(c.status,e,c.headers)}return c}async function readSessionId(e,t){let r=await e.json(),i=(typeof r.sessionId==`string`?r.sessionId:void 0)??e.headers.get(EVE_SESSION_ID_HEADER)?.trim()??t;if(!i)throw Error(`Message route did not return a session id.`);return i}function createMessageBody(e,t){let n={};e.message!==void 0&&(n.message=e.message),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses),!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.inputResponses===void 0?null:n}export{ClientSession};
1
+ import{EVE_SESSION_ROUTE_PATH,createEveSessionRoutePath}from"#protocol/routes.js";import{EVE_SESSION_ID_HEADER,isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{ClientError}from"#client/client-error.js";import{createClientUrl}from"#client/url.js";import{MessageResponse}from"#client/message-response.js";import{followStreamIterable}from"#client/open-stream.js";import{cancelClientSession,clearClientSession,compactClientSession,resetClientSession}from"#client/session-controls.js";import{serializeOutputSchema}from"#shared/tool-schema.js";var ClientSession=class ClientSession{#e;#t;constructor(e,t){this.#e=e,this.#t=t}static async create(t,n){let r=await postTurn(t,EVE_SESSION_ROUTE_PATH,n,!0),i=await readSessionId(r),a=new ClientSession(t,{sessionId:i,streamIndex:0});return{response:a.#r(r,n,0),session:a}}get state(){return this.#t}async snapshot(e){e?.signal?.throwIfAborted();let t=[];for await(let n of this.#o({follow:!1,signal:e?.signal,startIndex:0}))t.push(n);return e?.signal?.throwIfAborted(),{events:t,session:{sessionId:this.#t.sessionId,streamIndex:t.length}}}async send(e,t={}){return await this.#n({...t,message:e})}async respond(e,t={}){if(e.length===0)throw Error(`ClientSession.respond() requires at least one input response.`);return await this.#n({...t,inputResponses:e})}async#n(e){let n=this.#t.streamIndex,r=await postTurn(this.#e,createEveSessionRoutePath(this.#t.sessionId),e,!1);if(await readSessionId(r,this.#t.sessionId)!==this.#t.sessionId)throw Error(`Message route returned a different session id.`);return this.#r(r,e,n)}async cancel(e){return await cancelClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}async clear(){return await clearClientSession({context:this.#e,sessionId:this.#t.sessionId})}async compact(){return await compactClientSession({context:this.#e,sessionId:this.#t.sessionId})}async reset(e){return await resetClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}stream(e){if(e?.follow===!1&&(e.startIndex??this.#t.streamIndex)<0)throw Error(`stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.`);return this.#a(e)}#r(e,t,n){return e.body?.cancel().catch(()=>{}),new MessageResponse({cancelTurn:async e=>await this.cancel({turnId:e}),createStream:()=>this.#i(n,t),sessionId:this.#t.sessionId})}async*#i(e,t){let n=0;try{for await(let i of this.#o({headers:t.headers,keepAlive:shouldKeepActiveTurnAlive(t.streamReconnectPolicy),signal:t.signal,startIndex:e,streamReconnectPolicy:t.streamReconnectPolicy}))if(n+=1,yield i,isCurrentTurnBoundaryEvent(i))break}finally{this.#t={sessionId:this.#t.sessionId,streamIndex:e+n}}}async*#a(e){let t=e?.startIndex??this.#t.streamIndex,n=0;try{for await(let r of this.#o({follow:e?.follow,signal:e?.signal,startIndex:t,streamReconnectPolicy:e?.streamReconnectPolicy}))n+=1,yield r}finally{t>=0&&(this.#t={sessionId:this.#t.sessionId,streamIndex:t+n})}}#o(e){return followStreamIterable({follow:e.follow,host:this.#e.host,keepAlive:e.keepAlive,resolveHeaders:()=>this.#e.resolveHeaders(e.headers),redirect:this.#e.redirect,sessionId:this.#t.sessionId,signal:e.signal,startIndex:e.startIndex,streamReconnectPolicy:e.streamReconnectPolicy})}};function shouldKeepActiveTurnAlive(e){return e&&`reconnect`in e?!1:e?.streamIdleReconnectPolicy?.maxAttempts===void 0}async function postTurn(e,t,n,r){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 inputResponses.`);let s=await e.resolveHeaders(n.headers);s.set(`content-type`,`application/json`);let c=await fetch(createClientUrl(e.host,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 new ClientError(c.status,e,c.headers)}return c}async function readSessionId(e,t){let r=await e.json(),i=(typeof r.sessionId==`string`?r.sessionId:void 0)??e.headers.get(EVE_SESSION_ID_HEADER)?.trim()??t;if(!i)throw Error(`Message route did not return a session id.`);return i}function createMessageBody(e,t){let n={};e.message!==void 0&&(n.message=e.message),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses),!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.inputResponses===void 0?null:n}export{ClientSession};
@@ -45,5 +45,8 @@
45
45
  "zod": "4.4.3",
46
46
  "zod-validation-error": "5.0.0"
47
47
  },
48
- "scriptHash": "bd91763436d47835c8e6d32a2a7949344c7e96657eda8bb10b7872e9464e2e7b"
48
+ "scriptHash": "d6805a01fe53c75ceb5bc0815fcc6354b57746fda18ce55c168188cb9b6c2c57",
49
+ "toolVersions": {
50
+ "rolldown": "1.1.5"
51
+ }
49
52
  }