eve 0.24.0 → 0.24.2

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 (136) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/src/cli/run.js +2 -2
  3. package/dist/src/cli/vercel-service-output.d.ts +4 -0
  4. package/dist/src/cli/vercel-service-output.js +1 -0
  5. package/dist/src/compiled/.vendor-stamp.json +11 -11
  6. package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +1 -1
  7. package/dist/src/compiled/@ai-sdk/anthropic/index.js +2 -2
  8. package/dist/src/compiled/@ai-sdk/google/index.d.ts +7 -0
  9. package/dist/src/compiled/@ai-sdk/google/index.js +6 -6
  10. package/dist/src/compiled/@ai-sdk/mcp/index.d.ts +42 -1
  11. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  12. package/dist/src/compiled/@ai-sdk/openai/index.d.ts +34 -6
  13. package/dist/src/compiled/@ai-sdk/openai/index.js +2 -2
  14. package/dist/src/compiled/@ai-sdk/otel/index.js +1 -1
  15. package/dist/src/compiled/@ai-sdk/provider/index.d.ts +245 -3
  16. package/dist/src/compiled/@ai-sdk/provider-utils/index.d.ts +273 -15
  17. package/dist/src/compiled/@workflow/core/index.js +1 -1
  18. package/dist/src/compiled/@workflow/core/runtime/start.d.ts +12 -0
  19. package/dist/src/compiled/@workflow/core/runtime.js +1 -1
  20. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  21. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  22. package/dist/src/compiled/@workflow/world/analytics.d.ts +56 -21
  23. package/dist/src/compiled/@workflow/world/index.d.ts +1 -1
  24. package/dist/src/compiled/@workflow/world/interfaces.d.ts +46 -0
  25. package/dist/src/compiled/@workflow/world/queue.d.ts +12 -0
  26. package/dist/src/compiled/@workflow/world-local/index.js +3 -3
  27. package/dist/src/compiled/@workflow/world-vercel/index.js +16 -16
  28. package/dist/src/compiled/_chunks/workflow/attribute-changes-MGTOG_uX.js +20 -0
  29. package/dist/src/compiled/_chunks/workflow/{dist-CQenixFf.js → dist-Blxnyb7-.js} +2 -2
  30. package/dist/src/compiled/_chunks/workflow/dist-zLevmMyU.js +77 -0
  31. package/dist/src/compiled/_chunks/workflow/{resume-hook-BH01MfRF.js → resume-hook-DHP5ql3-.js} +1 -1
  32. package/dist/src/compiled/_chunks/workflow/run-D8hv1ptT.js +1 -0
  33. package/dist/src/compiled/_chunks/workflow/{sleep-BkAHCD_s.js → sleep-uA9pS-PT.js} +1 -1
  34. package/dist/src/compiler/artifacts.d.ts +7 -6
  35. package/dist/src/compiler/artifacts.js +1 -1
  36. package/dist/src/compiler/compile-agent.d.ts +15 -2
  37. package/dist/src/compiler/compile-agent.js +3 -3
  38. package/dist/src/execution/sandbox/prewarm.d.ts +1 -0
  39. package/dist/src/execution/sandbox/prewarm.js +1 -1
  40. package/dist/src/harness/compaction-prompt.d.ts +16 -0
  41. package/dist/src/harness/compaction-prompt.js +24 -0
  42. package/dist/src/harness/compaction.d.ts +2 -1
  43. package/dist/src/harness/compaction.js +1 -4
  44. package/dist/src/harness/input-requests.d.ts +1 -0
  45. package/dist/src/harness/input-requests.js +1 -1
  46. package/dist/src/harness/instrumentation-runtime-context.d.ts +1 -1
  47. package/dist/src/harness/tool-loop.js +3 -1
  48. package/dist/src/internal/application/build-workspace.d.ts +36 -0
  49. package/dist/src/internal/application/build-workspace.js +1 -0
  50. package/dist/src/internal/application/compiled-artifacts.d.ts +5 -0
  51. package/dist/src/internal/application/compiled-artifacts.js +4 -3
  52. package/dist/src/internal/application/output-publication-artifacts.d.ts +7 -0
  53. package/dist/src/internal/application/output-publication-artifacts.js +1 -0
  54. package/dist/src/internal/application/output-publication-journal.d.ts +30 -0
  55. package/dist/src/internal/application/output-publication-journal.js +1 -0
  56. package/dist/src/internal/application/output-publication-lock.d.ts +10 -0
  57. package/dist/src/internal/application/output-publication-lock.js +1 -0
  58. package/dist/src/internal/application/output-publication.d.ts +33 -0
  59. package/dist/src/internal/application/output-publication.js +1 -0
  60. package/dist/src/internal/application/package.js +1 -1
  61. package/dist/src/internal/application/paths.d.ts +2 -0
  62. package/dist/src/internal/application/paths.js +1 -1
  63. package/dist/src/internal/application/production-compiler-artifacts.d.ts +4 -0
  64. package/dist/src/internal/application/production-compiler-artifacts.js +1 -0
  65. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  66. package/dist/src/internal/authored-directive-prologue.d.ts +4 -0
  67. package/dist/src/internal/authored-directive-prologue.js +1 -0
  68. package/dist/src/internal/authored-module-loader.d.ts +15 -5
  69. package/dist/src/internal/authored-module-loader.js +4 -2
  70. package/dist/src/internal/authored-module-map-loader.js +1 -1
  71. package/dist/src/internal/authored-package-boundary.d.ts +25 -0
  72. package/dist/src/internal/authored-package-boundary.js +1 -0
  73. package/dist/src/internal/authored-package-tsconfig-paths.js +1 -1
  74. package/dist/src/internal/bundler/nitro-node-file-trace.d.ts +10 -0
  75. package/dist/src/internal/bundler/nitro-node-file-trace.js +1 -0
  76. package/dist/src/internal/materialize-authored-external-dependencies.d.ts +10 -0
  77. package/dist/src/internal/materialize-authored-external-dependencies.js +2 -0
  78. package/dist/src/internal/materialized-authored-modules.d.ts +15 -0
  79. package/dist/src/internal/materialized-authored-modules.js +1 -0
  80. package/dist/src/internal/nitro/dev-runtime-artifacts.d.ts +1 -9
  81. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  82. package/dist/src/internal/nitro/development-generation.d.ts +12 -0
  83. package/dist/src/internal/nitro/development-generation.js +1 -0
  84. package/dist/src/internal/nitro/host/artifacts-config.d.ts +9 -11
  85. package/dist/src/internal/nitro/host/artifacts-config.js +1 -1
  86. package/dist/src/internal/nitro/host/build-application.js +1 -1
  87. package/dist/src/internal/nitro/host/build-vercel-agent-summary.d.ts +1 -7
  88. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  89. package/dist/src/internal/nitro/host/channel-routes.d.ts +3 -3
  90. package/dist/src/internal/nitro/host/configure-nitro-routes.d.ts +9 -5
  91. package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
  92. package/dist/src/internal/nitro/host/copy-host-middleware.d.ts +12 -0
  93. package/dist/src/internal/nitro/host/copy-host-middleware.js +1 -0
  94. package/dist/src/internal/nitro/host/create-application-nitro.d.ts +18 -10
  95. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  96. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  97. package/dist/src/internal/nitro/host/dispatch-schedule-in-dev.d.ts +2 -2
  98. package/dist/src/internal/nitro/host/dispatch-schedule-in-dev.js +1 -1
  99. package/dist/src/internal/nitro/host/prepare-application-host.d.ts +13 -5
  100. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  101. package/dist/src/internal/nitro/host/schedule-task-routes.d.ts +3 -3
  102. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  103. package/dist/src/internal/nitro/host/types.d.ts +4 -0
  104. package/dist/src/internal/nitro/routes/agent-info/load-agent-info-data.d.ts +3 -6
  105. package/dist/src/internal/nitro/routes/agent-info/load-agent-info-data.js +1 -1
  106. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  107. package/dist/src/internal/nitro/routes/dev-schedule-dispatch.d.ts +2 -2
  108. package/dist/src/internal/nitro/routes/info.d.ts +1 -6
  109. package/dist/src/internal/nitro/routes/info.js +1 -1
  110. package/dist/src/internal/nitro/routes/runtime-artifacts.d.ts +9 -5
  111. package/dist/src/internal/nitro/routes/runtime-artifacts.js +1 -1
  112. package/dist/src/internal/workflow-bundle/build-queue.d.ts +1 -0
  113. package/dist/src/internal/workflow-bundle/build-queue.js +1 -0
  114. package/dist/src/internal/workflow-bundle/builder-support.d.ts +0 -1
  115. package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
  116. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  117. package/dist/src/internal/workflow-bundle/nitro-step-entry.d.ts +1 -0
  118. package/dist/src/internal/workflow-bundle/nitro-step-entry.js +2 -2
  119. package/dist/src/public/instrumentation/index.d.ts +3 -3
  120. package/dist/src/public/next/vercel-output-config.js +1 -1
  121. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  122. package/dist/src/setup/scaffold/create/project.js +2 -2
  123. package/dist/src/setup/scaffold/update/channels.js +1 -1
  124. package/dist/src/shared/atomic-write-file.d.ts +11 -0
  125. package/dist/src/shared/atomic-write-file.js +1 -0
  126. package/dist/src/shared/guards.d.ts +7 -0
  127. package/dist/src/shared/guards.js +1 -1
  128. package/dist/src/shared/path-exists.d.ts +9 -0
  129. package/dist/src/shared/path-exists.js +1 -0
  130. package/docs/agent-config.md +1 -1
  131. package/docs/concepts/default-harness.md +1 -1
  132. package/docs/reference/cli.md +4 -2
  133. package/package.json +14 -14
  134. package/dist/src/compiled/_chunks/workflow/attribute-changes-Dmf_myUv.js +0 -20
  135. package/dist/src/compiled/_chunks/workflow/dist-D7CzPkf8.js +0 -77
  136. package/dist/src/compiled/_chunks/workflow/run-CL3mguvM.js +0 -1
@@ -1 +1 @@
1
- import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{join,relative,resolve}from"node:path";import{mkdir,writeFile}from"node:fs/promises";import{createHash}from"node:crypto";import{summarizeDiscoverDiagnostics}from"#discover/diagnostics.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{createCompiledModuleMapSource}from"#compiler/module-map.js";import{compileAgentManifest}from"#compiler/normalize-manifest.js";import{materializeWorkspaceResources}from"#compiler/workspace-resources.js";const COMPILE_METADATA_KIND=`eve-compile-metadata`,COMPILE_METADATA_VERSION=5;function resolveCompilerArtifactPaths(e){let n=resolve(e),i=join(n,`.eve`,`discovery`),a=join(n,`.eve`,`compile`);return{appRoot:n,compiledManifestPath:join(a,`compiled-agent-manifest.json`),compileDirectoryPath:a,compileMetadataPath:join(a,`compile-metadata.json`),diagnosticsPath:join(i,`diagnostics.json`),discoveryManifestPath:join(i,`agent-discovery-manifest.json`),discoveryDirectoryPath:i,moduleMapPath:join(a,`module-map.mjs`)}}function createDiscoveryDiagnosticsArtifact(e){return{diagnostics:[...e],kind:`eve-discovery-diagnostics`,summary:summarizeDiscoverDiagnostics(e),version:1}}function createCompileMetadata(t){let n=resolveInstalledPackageInfo(),r=createContentHash(t.discoveryManifestJson),i=createContentHash(t.diagnosticsArtifactJson),a=createContentHash(t.moduleMapSource);return{compile:{moduleMap:{path:toArtifactRelativePath(t.appRoot,t.paths.moduleMapPath),sha256:a}},discovery:{diagnostics:{path:toArtifactRelativePath(t.appRoot,t.paths.diagnosticsPath),sha256:i},manifest:{path:toArtifactRelativePath(t.appRoot,t.paths.discoveryManifestPath),sha256:r},sourceGraphHash:createContentHash(`${r}:${i}:${a}`),summary:t.diagnosticsSummary},generator:{name:n.name,version:n.version},kind:COMPILE_METADATA_KIND,status:t.diagnosticsSummary.errors>0?`failed`:`ready`,version:5}}async function writeCompilerArtifacts(e){let t=resolveCompilerArtifactPaths(e.appRoot),n=createDiscoveryDiagnosticsArtifact(e.diagnostics),r=await materializeWorkspaceResources({compileDirectoryPath:t.compileDirectoryPath,manifest:await compileAgentManifest(e.manifest)}),o=serializeArtifactJson(r),s=serializeArtifactJson(e.manifest),c=serializeArtifactJson(n),l=createCompiledModuleMapSource({manifest:r,moduleMapPath:t.moduleMapPath}),u=createCompileMetadata({appRoot:e.appRoot,diagnosticsArtifactJson:c,diagnosticsSummary:n.summary,discoveryManifestJson:s,moduleMapSource:l,paths:t}),d=serializeArtifactJson(u);return await mkdir(t.discoveryDirectoryPath,{recursive:!0}),await mkdir(t.compileDirectoryPath,{recursive:!0}),await Promise.all([writeFile(t.compiledManifestPath,o),writeFile(t.diagnosticsPath,c),writeFile(t.discoveryManifestPath,s),writeFile(t.moduleMapPath,l),writeFile(t.compileMetadataPath,d)]),{compiledManifest:r,diagnosticsArtifact:n,metadata:u,moduleMapSource:l,paths:t}}function createContentHash(e){return createHash(`sha256`).update(e).digest(`hex`)}function serializeArtifactJson(e){return`${JSON.stringify(e,null,2)}\n`}function toArtifactRelativePath(e,t){return normalizeLogicalPath(relative(resolve(e),t))}export{COMPILE_METADATA_KIND,COMPILE_METADATA_VERSION,createCompileMetadata,resolveCompilerArtifactPaths,writeCompilerArtifacts};
1
+ import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{join,relative,resolve}from"node:path";import{mkdir,writeFile}from"node:fs/promises";import{createHash}from"node:crypto";import{summarizeDiscoverDiagnostics}from"#discover/diagnostics.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{createCompiledModuleMapSource}from"#compiler/module-map.js";import{compileAgentManifest}from"#compiler/normalize-manifest.js";import{materializeWorkspaceResources}from"#compiler/workspace-resources.js";const COMPILE_METADATA_KIND=`eve-compile-metadata`,COMPILE_METADATA_VERSION=5;function resolveCompilerArtifactPaths(e){return resolveCompilerArtifactPathsAt(e,join(resolve(e),`.eve`))}function resolveCompilerArtifactPathsAt(e,n){let i=resolve(e),a=resolve(n),o=join(a,`discovery`),s=join(a,`compile`);return{appRoot:i,compiledManifestPath:join(s,`compiled-agent-manifest.json`),compileDirectoryPath:s,compileMetadataPath:join(s,`compile-metadata.json`),diagnosticsPath:join(o,`diagnostics.json`),discoveryManifestPath:join(o,`agent-discovery-manifest.json`),discoveryDirectoryPath:o,moduleMapPath:join(s,`module-map.mjs`)}}function createDiscoveryDiagnosticsArtifact(e){return{diagnostics:[...e],kind:`eve-discovery-diagnostics`,summary:summarizeDiscoverDiagnostics(e),version:1}}function createCompileMetadata(t){let n=resolveInstalledPackageInfo(),r=createContentHash(t.discoveryManifestJson),i=createContentHash(t.diagnosticsArtifactJson),a=createContentHash(t.moduleMapSource);return{compile:{moduleMap:{path:toArtifactRelativePath(t.appRoot,t.paths.moduleMapPath),sha256:a}},discovery:{diagnostics:{path:toArtifactRelativePath(t.appRoot,t.paths.diagnosticsPath),sha256:i},manifest:{path:toArtifactRelativePath(t.appRoot,t.paths.discoveryManifestPath),sha256:r},sourceGraphHash:createContentHash(`${r}:${i}:${a}`),summary:t.diagnosticsSummary},generator:{name:n.name,version:n.version},kind:COMPILE_METADATA_KIND,status:t.diagnosticsSummary.errors>0?`failed`:`ready`,version:5}}async function writeCompilerArtifacts(e){let t=resolveCompilerArtifactPathsAt(e.appRoot,e.artifactLocations.writeRoot),n=resolveCompilerArtifactPathsAt(e.appRoot,e.artifactLocations.publishedRoot),r=createDiscoveryDiagnosticsArtifact(e.diagnostics),o=await materializeWorkspaceResources({compileDirectoryPath:t.compileDirectoryPath,manifest:await compileAgentManifest(e.manifest)}),s=serializeArtifactJson(o),c=serializeArtifactJson(e.manifest),l=serializeArtifactJson(r),u=createCompiledModuleMapSource({manifest:o,moduleMapPath:n.moduleMapPath}),d=createCompileMetadata({appRoot:e.appRoot,diagnosticsArtifactJson:l,diagnosticsSummary:r.summary,discoveryManifestJson:c,moduleMapSource:u,paths:n}),f=serializeArtifactJson(d);return await mkdir(t.discoveryDirectoryPath,{recursive:!0}),await mkdir(t.compileDirectoryPath,{recursive:!0}),await Promise.all([writeFile(t.compiledManifestPath,s),writeFile(t.diagnosticsPath,l),writeFile(t.discoveryManifestPath,c),writeFile(t.moduleMapPath,u),writeFile(t.compileMetadataPath,f)]),{compiledManifest:o,diagnosticsArtifact:r,metadata:d,moduleMapSource:u,paths:t}}function createContentHash(e){return createHash(`sha256`).update(e).digest(`hex`)}function serializeArtifactJson(e){return`${JSON.stringify(e,null,2)}\n`}function toArtifactRelativePath(e,t){return normalizeLogicalPath(relative(resolve(e),t))}export{COMPILE_METADATA_KIND,COMPILE_METADATA_VERSION,createCompileMetadata,resolveCompilerArtifactPaths,writeCompilerArtifacts};
@@ -1,7 +1,7 @@
1
1
  import type { DiscoverDiagnostic } from "#discover/diagnostics.js";
2
2
  import type { ResolvedDiscoveryProject } from "#discover/project.js";
3
3
  import { type ProjectSource } from "#discover/project-source.js";
4
- import { type CompileMetadata, type CompilerArtifactPaths } from "#compiler/artifacts.js";
4
+ import { type CompileMetadata, type CompilerArtifactLocations, type CompilerArtifactPaths } from "#compiler/artifacts.js";
5
5
  import type { CompiledAgentManifest } from "#compiler/manifest.js";
6
6
  /**
7
7
  * Input for compiling the current authored agent into framework-owned
@@ -32,10 +32,23 @@ export interface CompileAgentResult {
32
32
  */
33
33
  export declare class CompileAgentError extends Error {
34
34
  readonly result: CompileAgentResult;
35
- constructor(result: CompileAgentResult);
35
+ private constructor();
36
+ static fromDurableArtifacts(result: CompileAgentResult): CompileAgentError;
37
+ static fromTransientArtifacts(result: CompileAgentResult): CompileAgentError;
36
38
  }
37
39
  /**
38
40
  * Runs discovery, writes compiler-owned artifacts, and throws when discovery
39
41
  * produced errors.
40
42
  */
41
43
  export declare function compileAgent(input?: CompileAgentInput): Promise<CompileAgentResult>;
44
+ /**
45
+ * Compiles an agent for a production build. Artifacts are written to the
46
+ * invocation-owned `writeRoot` (a throwaway build workspace), while the
47
+ * metadata and module map record paths under the stable `publishedRoot`
48
+ * where publication later installs them — so the recorded paths stay
49
+ * relocatable and identical across builds of the same source.
50
+ */
51
+ export declare function compileAgentInBuildWorkspace(input: {
52
+ readonly artifactLocations: CompilerArtifactLocations;
53
+ readonly startPath: string;
54
+ }): Promise<CompileAgentResult>;
@@ -1,3 +1,3 @@
1
- import{discoverAgent}from"#discover/discover-agent.js";import{hasDiscoverErrors,summarizeDiscoverDiagnostics}from"#discover/diagnostics.js";import{resolveDiscoveryProject}from"#discover/project.js";import{createDiskProjectSource}from"#discover/project-source.js";import{writeCompilerArtifacts}from"#compiler/artifacts.js";var CompileAgentError=class extends Error{result;constructor(e){super(formatCompileAgentErrorMessage({diagnostics:e.diagnostics,diagnosticsPath:e.paths.diagnosticsPath})),this.name=`CompileAgentError`,this.result=e}};async function compileAgent(n={}){let i=n.source??createDiskProjectSource(),a=await resolveDiscoveryProject(n.startPath,{source:i}),o=await discoverAgent({...a,source:i}),s=await writeCompilerArtifacts({appRoot:a.appRoot,diagnostics:o.diagnostics,manifest:o.manifest}),c={diagnostics:o.diagnostics,manifest:s.compiledManifest,metadata:s.metadata,paths:s.paths,project:a};if(hasDiscoverErrors(o.diagnostics))throw new CompileAgentError(c);return reportDiscoverWarnings(o.diagnostics),c}function reportDiscoverWarnings(e){let t=e.filter(e=>e.severity===`warning`);if(t.length!==0)for(let e of t)console.warn(`Warning [${e.code}]: ${e.message}\n source: ${e.sourcePath}`)}function formatCompileAgentErrorMessage(e){let t=summarizeDiscoverDiagnostics(e.diagnostics),r=[`Discovery failed with ${t.errors} error(s) and ${t.warnings} warning(s).`];if(e.diagnosticsPath!==void 0&&r.push(`Diagnostics artifact: ${e.diagnosticsPath}`),e.diagnostics.length===0)return r.join(`
2
- `);r.push(`Discovery diagnostics:`);for(let t of e.diagnostics)r.push(`- ${formatDiagnosticSeverity(t.severity)}: ${t.message}`),r.push(` source: ${t.sourcePath}`);return r.join(`
3
- `)}function formatDiagnosticSeverity(e){return e===`error`?`Error`:`Warning`}export{CompileAgentError,compileAgent};
1
+ import{join}from"node:path";import{discoverAgent}from"#discover/discover-agent.js";import{hasDiscoverErrors,summarizeDiscoverDiagnostics}from"#discover/diagnostics.js";import{resolveDiscoveryProject}from"#discover/project.js";import{createDiskProjectSource}from"#discover/project-source.js";import{writeCompilerArtifacts}from"#compiler/artifacts.js";var CompileAgentError=class CompileAgentError extends Error{result;constructor(e,t){super(t),this.name=`CompileAgentError`,this.result=e}static fromDurableArtifacts(e){let[t,...n]=formatCompileAgentErrorLines(e.diagnostics);return new CompileAgentError(e,[t,`Diagnostics artifact: ${e.paths.diagnosticsPath}`,...n].join(`
2
+ `))}static fromTransientArtifacts(e){return new CompileAgentError(e,formatCompileAgentErrorLines(e.diagnostics).join(`
3
+ `))}};async function compileAgent(t={}){let n=await discoverAgentForCompilation(t),r=join(n.project.appRoot,`.eve`);return finishAgentCompilation(await writeAgentCompilation(n,{publishedRoot:r,writeRoot:r}),CompileAgentError.fromDurableArtifacts)}async function compileAgentInBuildWorkspace(e){return finishAgentCompilation(await writeAgentCompilation(await discoverAgentForCompilation({startPath:e.startPath}),e.artifactLocations),CompileAgentError.fromTransientArtifacts)}async function discoverAgentForCompilation(e){let n=e.source??createDiskProjectSource(),r=await resolveDiscoveryProject(e.startPath,{source:n}),i=await discoverAgent({...r,source:n});return{diagnostics:i.diagnostics,manifest:i.manifest,project:r}}async function writeAgentCompilation(e,t){let n=await writeCompilerArtifacts({appRoot:e.project.appRoot,artifactLocations:t,diagnostics:e.diagnostics,manifest:e.manifest});return{diagnostics:e.diagnostics,manifest:n.compiledManifest,metadata:n.metadata,paths:n.paths,project:e.project}}function finishAgentCompilation(e,t){if(hasDiscoverErrors(e.diagnostics))throw t(e);return reportDiscoverWarnings(e.diagnostics),e}function reportDiscoverWarnings(e){let t=e.filter(e=>e.severity===`warning`);if(t.length!==0)for(let e of t)console.warn(`Warning [${e.code}]: ${e.message}\n source: ${e.sourcePath}`)}function formatCompileAgentErrorLines(e){let t=summarizeDiscoverDiagnostics(e),n=[`Discovery failed with ${t.errors} error(s) and ${t.warnings} warning(s).`];if(e.length===0)return n;n.push(`Discovery diagnostics:`);for(let t of e)n.push(`- ${formatDiagnosticSeverity(t.severity)}: ${t.message}`),n.push(` source: ${t.sourcePath}`);return n}function formatDiagnosticSeverity(e){return e===`error`?`Error`:`Warning`}export{CompileAgentError,compileAgent,compileAgentInBuildWorkspace};
@@ -14,6 +14,7 @@ export type SandboxBackendPrewarmDispatch = (input: {
14
14
  }) => Promise<SandboxBackendPrewarmResult>;
15
15
  interface PrewarmSandboxesInput {
16
16
  readonly appRoot: string;
17
+ readonly compileDirectoryPath: string;
17
18
  readonly compiledArtifactsSource: RuntimeCompiledArtifactsSource;
18
19
  readonly graph: ResolvedAgentGraphBundle;
19
20
  readonly log?: (message: string) => void;
@@ -1,2 +1,2 @@
1
- import{withSandboxTemplatePrewarmLock}from"./template-prewarm-lock.js";import{toErrorMessage}from"#shared/errors.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{createBundledRuntimeCompiledArtifactsSource,getRuntimeCompiledArtifactsSandboxAppRoot}from"#runtime/compiled-artifacts-source.js";import{loadCompiledModuleMapFromAuthoredSource}from"#internal/authored-module-map-loader.js";import{createAuthoredSourceRuntimeCompiledArtifactsSource}from"#internal/application/runtime-compiled-artifacts-source.js";import{loadCompileMetadata}from"#runtime/loaders/compile-metadata.js";import{withBundledCompiledArtifacts}from"#runtime/loaders/bundled-artifacts.js";import{loadCompiledManifest}from"#runtime/loaders/manifest.js";import{resolveRuntimeCompilerArtifactPaths}from"#runtime/loaders/artifact-paths.js";import{resolveRuntimeAgentGraph}from"#runtime/resolve-agent-graph.js";import{createRuntimeSandboxTemplateKey}from"#runtime/sandbox/keys.js";import{createRuntimeSandboxTemplatePlan}from"#runtime/sandbox/template-plan.js";import{materializeWorkspaceDirectory}from"#runtime/workspace/seed-files.js";async function prewarmSandboxes(n){let r=await collectPrewarmTargets(n);if(r.length===0)return;let i=createPrewarmSignature(r);if(n.shouldPrewarmSignature?.(i)===!1)return;let a=n.dispatch??(async({backend:e,input:t})=>await e.prewarm(t));n.log?.(`eve: initializing ${formatSandboxTemplateCount(r.length)}...`);let o=(await Promise.all(r.map(async({backend:r,label:i,input:o})=>{let logBackendProgress=e=>{shouldLogSandboxPrewarmProgress(e)&&n.log?.(`eve: sandbox template "${i}" (${r.name}): ${e}`)},s;try{s=await withSandboxTemplatePrewarmLock({appRoot:o.runtimeContext.appRoot,backendName:r.name,templateKey:o.templateKey},async()=>await a({backend:r,input:{...o,log:n.log===void 0?void 0:logBackendProgress}}))}catch(e){let a=formatPrewarmFailureForEnvironment({backendName:r.name,error:e});throw n.log?.(`eve: failed to initialize sandbox template "${i}" on backend "${r.name}": ${toErrorMessage(a)}`),a}return s}))).filter(e=>e.reused).length;n.log?.(`eve: initialized ${formatSandboxTemplateCount(r.length)} (${o} reused, ${r.length-o} built).`),n.onPrewarmSignature?.(i)}async function prewarmAppSandboxes(e){let t=e.compiledArtifactsSource??createAuthoredSourceRuntimeCompiledArtifactsSource(e.appRoot);if(t.kind!==`disk`)throw Error(`prewarmAppSandboxes requires disk-backed compiled artifacts.`);let n=await(e.loadAgentGraph??loadGraphFromArtifacts)({compiledArtifactsSource:t});await prewarmSandboxes({appRoot:getRuntimeCompiledArtifactsSandboxAppRoot(t)??e.appRoot,compiledArtifactsSource:t,dispatch:e.dispatch,graph:n,log:e.log,onPrewarmSignature:e.onPrewarmSignature,shouldPrewarmSignature:e.shouldPrewarmSignature})}async function prewarmBuiltAppSandboxes(e){let t=createAuthoredSourceRuntimeCompiledArtifactsSource(e.appRoot),[n,i,l]=await Promise.all([loadCompileMetadata({compiledArtifactsSource:t}),loadCompiledManifest({compiledArtifactsSource:t}),loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:t})]);await withBundledCompiledArtifacts({manifest:i,metadata:n??void 0,moduleMap:l,sessionId:`built-app-prewarm`},async()=>{let t=createBundledRuntimeCompiledArtifactsSource(),n=await resolveRuntimeAgentGraph({manifest:i,moduleMap:l});await prewarmSandboxes({appRoot:e.appRoot,compiledArtifactsSource:t,dispatch:e.dispatch,graph:n,log:e.log})})}async function collectPrewarmTargets(e){let t=resolveRuntimeCompilerArtifactPaths(e.appRoot).compileDirectoryPath,n={appRoot:e.appRoot},r=[];return await Promise.all(collectNodeSandboxes(e.graph).map(async({definition:i,nodeId:a,workspaceResourceRoot:o})=>{let s=createRuntimeSandboxTemplatePlan({definition:i,workspaceResourceRoot:o}),c=await createRuntimeSandboxTemplateKey({backendName:i.backend.name,compiledArtifactsSource:e.compiledArtifactsSource,nodeId:a,sourceId:i.sourceId,templatePlan:s});c!==null&&r.push({backend:i.backend,label:formatLabel(a),input:{bootstrap:i.bootstrap,seedFiles:await loadResourceRootSeedFiles({compileDirectoryPath:t,workspaceResourceRoot:o}),runtimeContext:n,templateKey:c},signature:`${i.backend.name}:${a}:${c}`})})),r.sort((e,t)=>e.label.localeCompare(t.label))}async function loadResourceRootSeedFiles(e){return e.workspaceResourceRoot.contentHash===void 0&&e.workspaceResourceRoot.rootEntries.length===0?[]:(await materializeWorkspaceDirectory(`${e.compileDirectoryPath}/${e.workspaceResourceRoot.logicalPath}`)).map(e=>({content:e.content,path:e.path}))}async function loadGraphFromArtifacts(e){let[t,n]=await Promise.all([loadCompiledManifest({compiledArtifactsSource:e.compiledArtifactsSource}),loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:e.compiledArtifactsSource})]);return await resolveRuntimeAgentGraph({manifest:t,moduleMap:n})}function collectNodeSandboxes(e){return[...e.nodesByNodeId.entries()].flatMap(([e,t])=>{let n=t.sandboxRegistry.sandbox;return n===null?[]:[{...n,nodeId:e}]})}function formatLabel(e){return e===ROOT_RUNTIME_AGENT_NODE_ID?`root`:e}function createPrewarmSignature(e){return e.map(e=>e.signature).sort().join(`
1
+ import{withSandboxTemplatePrewarmLock}from"./template-prewarm-lock.js";import{resolvePackageSourceFilePath}from"#internal/application/package.js";import{join}from"node:path";import{toErrorMessage}from"#shared/errors.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{createBundledRuntimeCompiledArtifactsSource,createDiskRuntimeCompiledArtifactsSource,getRuntimeCompiledArtifactsSandboxAppRoot}from"#runtime/compiled-artifacts-source.js";import{loadCompiledModuleMapFromAuthoredSource}from"#internal/authored-module-map-loader.js";import{createAuthoredSourceRuntimeCompiledArtifactsSource}from"#internal/application/runtime-compiled-artifacts-source.js";import{loadCompileMetadata}from"#runtime/loaders/compile-metadata.js";import{withBundledCompiledArtifacts}from"#runtime/loaders/bundled-artifacts.js";import{loadCompiledManifest}from"#runtime/loaders/manifest.js";import{resolveRuntimeCompilerArtifactPaths}from"#runtime/loaders/artifact-paths.js";import{resolveRuntimeAgentGraph}from"#runtime/resolve-agent-graph.js";import{createRuntimeSandboxTemplateKey}from"#runtime/sandbox/keys.js";import{createRuntimeSandboxTemplatePlan}from"#runtime/sandbox/template-plan.js";import{materializeWorkspaceDirectory}from"#runtime/workspace/seed-files.js";async function prewarmSandboxes(t){let n=await collectPrewarmTargets(t);if(n.length===0)return;let i=createPrewarmSignature(n);if(t.shouldPrewarmSignature?.(i)===!1)return;let a=t.dispatch??(async({backend:e,input:t})=>await e.prewarm(t));t.log?.(`eve: initializing ${formatSandboxTemplateCount(n.length)}...`);let o=(await Promise.all(n.map(async({backend:n,label:i,input:o})=>{let logBackendProgress=e=>{shouldLogSandboxPrewarmProgress(e)&&t.log?.(`eve: sandbox template "${i}" (${n.name}): ${e}`)},s;try{s=await withSandboxTemplatePrewarmLock({appRoot:o.runtimeContext.appRoot,backendName:n.name,templateKey:o.templateKey},async()=>await a({backend:n,input:{...o,log:t.log===void 0?void 0:logBackendProgress}}))}catch(e){let a=formatPrewarmFailureForEnvironment({backendName:n.name,error:e});throw t.log?.(`eve: failed to initialize sandbox template "${i}" on backend "${n.name}": ${toErrorMessage(a)}`),a}return s}))).filter(e=>e.reused).length;t.log?.(`eve: initialized ${formatSandboxTemplateCount(n.length)} (${o} reused, ${n.length-o} built).`),t.onPrewarmSignature?.(i)}async function prewarmAppSandboxes(e){let t=e.compiledArtifactsSource??createAuthoredSourceRuntimeCompiledArtifactsSource(e.appRoot);if(t.kind!==`disk`)throw Error(`prewarmAppSandboxes requires disk-backed compiled artifacts.`);let n=await(e.loadAgentGraph??loadGraphFromArtifacts)({compiledArtifactsSource:t});await prewarmSandboxes({appRoot:getRuntimeCompiledArtifactsSandboxAppRoot(t)??e.appRoot,compileDirectoryPath:resolveRuntimeCompilerArtifactPaths(t.appRoot).compileDirectoryPath,compiledArtifactsSource:t,dispatch:e.dispatch,graph:n,log:e.log,onPrewarmSignature:e.onPrewarmSignature,shouldPrewarmSignature:e.shouldPrewarmSignature})}async function prewarmBuiltAppSandboxes(e){let r=join(e.appRoot,`.output`),i=createDiskRuntimeCompiledArtifactsSource(r,{moduleMapLoaderPath:resolvePackageSourceFilePath(`src/internal/authored-module-map-loader.ts`),sandboxAppRoot:e.appRoot}),[s,c,l]=await Promise.all([loadCompileMetadata({compiledArtifactsSource:i}),loadCompiledManifest({compiledArtifactsSource:i}),loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:i})]);await withBundledCompiledArtifacts({manifest:c,metadata:s??void 0,moduleMap:l,sessionId:`built-app-prewarm`},async()=>{let t=createBundledRuntimeCompiledArtifactsSource(),n=await resolveRuntimeAgentGraph({manifest:c,moduleMap:l});await prewarmSandboxes({appRoot:e.appRoot,compileDirectoryPath:resolveRuntimeCompilerArtifactPaths(r).compileDirectoryPath,compiledArtifactsSource:t,dispatch:e.dispatch,graph:n,log:e.log})})}async function collectPrewarmTargets(e){let t={appRoot:e.appRoot},n=[];return await Promise.all(collectNodeSandboxes(e.graph).map(async({definition:r,nodeId:i,workspaceResourceRoot:a})=>{let o=createRuntimeSandboxTemplatePlan({definition:r,workspaceResourceRoot:a}),s=await createRuntimeSandboxTemplateKey({backendName:r.backend.name,compiledArtifactsSource:e.compiledArtifactsSource,nodeId:i,sourceId:r.sourceId,templatePlan:o});s!==null&&n.push({backend:r.backend,label:formatLabel(i),input:{bootstrap:r.bootstrap,seedFiles:await loadResourceRootSeedFiles({compileDirectoryPath:e.compileDirectoryPath,workspaceResourceRoot:a}),runtimeContext:t,templateKey:s},signature:`${r.backend.name}:${i}:${s}`})})),n.sort((e,t)=>e.label.localeCompare(t.label))}async function loadResourceRootSeedFiles(e){return e.workspaceResourceRoot.contentHash===void 0&&e.workspaceResourceRoot.rootEntries.length===0?[]:(await materializeWorkspaceDirectory(`${e.compileDirectoryPath}/${e.workspaceResourceRoot.logicalPath}`)).map(e=>({content:e.content,path:e.path}))}async function loadGraphFromArtifacts(e){let[t,n]=await Promise.all([loadCompiledManifest({compiledArtifactsSource:e.compiledArtifactsSource}),loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:e.compiledArtifactsSource})]);return await resolveRuntimeAgentGraph({manifest:t,moduleMap:n})}function collectNodeSandboxes(e){return[...e.nodesByNodeId.entries()].flatMap(([e,t])=>{let n=t.sandboxRegistry.sandbox;return n===null?[]:[{...n,nodeId:e}]})}function formatLabel(e){return e===ROOT_RUNTIME_AGENT_NODE_ID?`root`:e}function createPrewarmSignature(e){return e.map(e=>e.signature).sort().join(`
2
2
  `)}function formatSandboxTemplateCount(e){return`${e} sandbox ${e===1?`template`:`templates`}`}function shouldLogSandboxPrewarmProgress(e){return!e.startsWith(`checking `)&&!e.startsWith(`reusing `)&&e!==`loading microsandbox runtime`&&e!==`microsandbox runtime ready`}function formatPrewarmFailureForEnvironment(e){return!isVercelEnvironment()||!isLocalSandboxBackend(e.backendName)?e.error:Error(`The ${e.backendName} sandbox backend is not available when deploying on Vercel. Vercel build containers cannot run local Docker containers or microsandbox VMs. Use defaultBackend() so eve selects Vercel Sandbox on Vercel, or configure a Vercel-compatible backend explicitly, such as vercel(). Original ${e.backendName} error: ${toErrorMessage(e.error)}`,{cause:e.error})}function isVercelEnvironment(){return!!process.env.VERCEL?.trim()}function isLocalSandboxBackend(e){return e===`docker`||e===`microsandbox`}export{prewarmAppSandboxes,prewarmBuiltAppSandboxes,prewarmSandboxes};
@@ -0,0 +1,16 @@
1
+ import type { ModelMessage } from "ai";
2
+ export declare const COMPACTION_CHECKPOINT_MARKER = "Summary of our conversation so far:";
3
+ export interface CompactionPrompt {
4
+ readonly prompt: string;
5
+ readonly system: string;
6
+ }
7
+ /** Static prompt text added around checkpoint and conversation content. */
8
+ export declare const COMPACTION_PROMPT_ENVELOPE: {
9
+ prompt: string;
10
+ system: string;
11
+ };
12
+ /** Builds the compaction model input from framework-owned checkpoint state and older messages. */
13
+ export declare function createCompactionPrompt(input: {
14
+ readonly messages: readonly ModelMessage[];
15
+ readonly previousCheckpoint: string | undefined;
16
+ }): CompactionPrompt;
@@ -0,0 +1,24 @@
1
+ const COMPACTION_CHECKPOINT_MARKER=`Summary of our conversation so far:`,COMPACTION_SYSTEM_PROMPT=`You are performing a CONTEXT CHECKPOINT COMPACTION. Create a handoff summary for another LLM that will resume the task.
2
+
3
+ Include:
4
+
5
+ - Current progress and key decisions made
6
+ - Important context, constraints, or user preferences
7
+ - What remains to be done, with clear next steps
8
+ - Any critical data, examples, or references needed to continue
9
+
10
+ Be concise, structured, and focused on helping the next LLM seamlessly continue the work. Write in the same language as the conversation. Do not continue the conversation, answer its questions, or invent facts. Only output the handoff summary.`,COMPACTION_PROMPT_ENVELOPE={prompt:formatCompactionPrompt({previousCheckpoint:``,transcript:``}),system:COMPACTION_SYSTEM_PROMPT};function createCompactionPrompt(e){let n=e.messages.map(e=>({content:summarizeCompactionMessageContent(e),role:e.role}));return{prompt:formatCompactionPrompt({previousCheckpoint:e.previousCheckpoint?.trim()??`(none)`,transcript:formatCompactionTranscript(n)}),system:COMPACTION_SYSTEM_PROMPT}}function formatCompactionPrompt(e){return`<previous-checkpoint>
11
+ ${e.previousCheckpoint}
12
+ </previous-checkpoint>
13
+
14
+ <conversation>
15
+ Conversation transcript:
16
+ ${e.transcript}
17
+ </conversation>
18
+
19
+ Update the previous checkpoint with the newer information in the conversation. If there is no previous checkpoint, create one from the conversation.
20
+
21
+ Make completed work explicit so the next model does not repeat it. Keep completed work separate from current and remaining work, and do not describe completed work as pending unless later messages show it must be redone. Preserve exact file paths, function names, commands, error messages, identifiers, and measured values when they are needed to continue.`}function formatCompactionTranscript(e){let t=e.filter(e=>e.content.trim().length>0).map(e=>`### ${e.role}\n${e.content.trim()}`);return t.length===0?`(empty)`:t.join(`
22
+
23
+ `)}function summarizeCompactionMessageContent(e){return typeof e.content==`string`?summarizeText(e.content):e.content.map(e=>summarizeCompactionContentPart(e)).filter(e=>e.length>0).join(`
24
+ `).trim()}function summarizeCompactionContentPart(e){switch(e.type){case`text`:return summarizeText(e.text);case`reasoning`:return``;case`file`:return e.filename?`Attached file ${e.filename} (${e.mediaType})`:`Attached file attachment (${e.mediaType})`;case`tool-call`:return summarizeToolCallPart(e);case`tool-result`:return summarizeToolResultPart(e);default:return``}}function summarizeToolCallPart(e){let t=e.input===void 0?``:summarizeCompactValue(e.input);return t?`Called ${e.toolName} with ${t}`:`Called ${e.toolName}`}function summarizeToolResultPart(e){let t=e.output===void 0?``:summarizeCompactValue(e.output),n=e.isError?`errored`:`returned`;return t?`Tool ${e.toolName} ${n} ${t}`:`Tool ${e.toolName} ${n}`}function summarizeCompactValue(e,t=0){if(e===null)return`null`;if(e===void 0)return``;if(typeof e==`string`)return summarizeText(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(Array.isArray(e)){if(e.length===0)return`array(0)`;if(t>=2)return`array(${e.length})`;let n=e.slice(0,3).map(e=>summarizeCompactValue(e,t+1)),r=e.length>3?`, …`:``;return`array(${e.length}: ${n.join(`, `)}${r})`}if(typeof e==`object`){let n=Object.entries(e);if(n.length===0)return`object(0)`;if(t>=2)return`object(${n.length} keys)`;let r=n.slice(0,3).map(([e,n])=>`${e}=${summarizeCompactValue(n,t+1)}`),i=n.length>3?`, …`:``;return`object(${r.join(`, `)}${i})`}return``}function summarizeText(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=280?t:`${t.slice(0,280).trimEnd()}…`}export{COMPACTION_CHECKPOINT_MARKER,COMPACTION_PROMPT_ENVELOPE,createCompactionPrompt};
@@ -17,7 +17,8 @@ export declare function estimateTokens(value: unknown): number;
17
17
  */
18
18
  export declare function getInputTokenCount(messages: readonly ModelMessage[], config: CompactionConfig): number;
19
19
  /**
20
- * Returns true when the message history exceeds the compaction threshold.
20
+ * Returns true when the message history and fixed compaction-prompt envelope
21
+ * exceed the compaction threshold.
21
22
  */
22
23
  export declare function shouldCompact(messages: readonly ModelMessage[], config: CompactionConfig): boolean;
23
24
  /**
@@ -1,4 +1 @@
1
- import{generateText}from"ai";const COMPACTION_SYSTEM_PROMPT=[`You are a conversation summarizer.`,`Write a concise but useful summary for continuing the work.`,`Preserve the goal, important instructions, technical decisions, discoveries, open work, and relevant tool results.`,`Use the same language as the conversation.`,`Prefer short labeled sections such as Goal, Instructions, Discoveries, Accomplished, and Next steps when helpful.`,`Do not answer questions or invent facts.`].join(` `);function estimateTokens(e){return JSON.stringify(e).length/4}function getInputTokenCount(e,t){let n=t.lastKnownInputTokens,r=t.lastKnownPromptMessageCount;return n===void 0||r===void 0||!Number.isInteger(r)||r<0||r>e.length?estimateTokens(e):n+estimateTokens(e.slice(r))}function shouldCompact(e,t){return getInputTokenCount(e,t)>t.threshold}async function resolveCompactionModel(e){let t=e.compactionModelReference??e.modelReference;return{model:t===e.modelReference?e.model:await e.resolveModel(t),providerOptions:t.providerOptions}}async function compactMessages(n,r,i,a,o,s,c){let l=selectRecentWindowSize(n,i);for(;;){let{older:u,recent:d}=splitMessagesForCompaction(n,l);if(u.length===0)return keepNonToolResultMessages(d);let f=await generateText({abortSignal:c,headers:s,model:r,prompt:formatCompactionPrompt(u.map(e=>({content:summarizeCompactionMessageContent(e),role:e.role}))),providerOptions:a,system:COMPACTION_SYSTEM_PROMPT,telemetry:o?{...o,functionId:`eve.compaction`}:void 0,temperature:0}),p=keepNonToolResultMessages(d),m=p.at(-1)?.role,h=m===void 0||m===`assistant`?[{role:`user`,content:`Continue.`}]:[],g=[{content:`Summary of our conversation so far:`,role:`user`},{content:f.text,role:`assistant`},...p,...h];if(estimateTokens(g)<=i.threshold||l===0)return g;--l}}function keepNonToolResultMessages(e){let t=[];for(let n of e)if(n.role!==`tool`){if(n.role===`assistant`){let e=assistantMessageText(n);e.length>0&&t.push({content:e,role:`assistant`});continue}t.push(n)}return t}function assistantMessageText(e){return typeof e.content==`string`?e.content.trim():e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()}function selectRecentWindowSize(e,t){let n=Math.min(t.recentWindowSize,Math.max(e.length-1,0)),r=resolveCompactionSummaryReserve(t),i=0,a=0;for(let o=e.length-1;o>=0&&i<n;--o){let n=e[o];if(n===void 0)continue;let s=estimateTokens([n]);if(a+s+r>t.threshold)break;a+=s,i+=1}return i}function resolveCompactionSummaryReserve(e){return Math.min(2048,Math.max(64,Math.floor(e.threshold/4)))}function splitMessagesForCompaction(e,t){return t<=0?{older:[...e],recent:[]}:{older:e.slice(0,-t),recent:e.slice(-t)}}function formatCompactionPrompt(e){let t=e.filter(e=>e.content.trim().length>0).map(e=>`### ${e.role}\n${e.content.trim()}`);return t.length===0?`Summarize the conversation so far.`:[`Conversation transcript:`,...t].join(`
2
-
3
- `)}function summarizeCompactionMessageContent(e){return typeof e.content==`string`?summarizeText(e.content):e.content.map(e=>summarizeCompactionContentPart(e)).filter(e=>e.length>0).join(`
4
- `).trim()}function summarizeCompactionContentPart(e){switch(e.type){case`text`:return summarizeText(e.text);case`reasoning`:return``;case`file`:return e.filename?`Attached file ${e.filename} (${e.mediaType})`:`Attached file attachment (${e.mediaType})`;case`tool-call`:return summarizeToolCallPart(e);case`tool-result`:return summarizeToolResultPart(e);default:return``}}function summarizeToolCallPart(e){let t=e.input===void 0?``:summarizeCompactValue(e.input);return t?`Called ${e.toolName} with ${t}`:`Called ${e.toolName}`}function summarizeToolResultPart(e){let t=e.output===void 0?``:summarizeCompactValue(e.output),n=e.isError?`errored`:`returned`;return t?`Tool ${e.toolName} ${n} ${t}`:`Tool ${e.toolName} ${n}`}function summarizeCompactValue(e,t=0){if(e===null)return`null`;if(e===void 0)return``;if(typeof e==`string`)return summarizeText(e);if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);if(Array.isArray(e)){if(e.length===0)return`array(0)`;if(t>=2)return`array(${e.length})`;let n=e.slice(0,3).map(e=>summarizeCompactValue(e,t+1)),r=e.length>3?`, …`:``;return`array(${e.length}: ${n.join(`, `)}${r})`}if(typeof e==`object`){let n=Object.entries(e);if(n.length===0)return`object(0)`;if(t>=2)return`object(${n.length} keys)`;let r=n.slice(0,3).map(([e,n])=>`${e}=${summarizeCompactValue(n,t+1)}`),i=n.length>3?`, …`:``;return`object(${r.join(`, `)}${i})`}return``}function summarizeText(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=280?t:`${t.slice(0,280).trimEnd()}…`}export{compactMessages,estimateTokens,getInputTokenCount,resolveCompactionModel,shouldCompact};
1
+ import{generateText}from"ai";import{COMPACTION_CHECKPOINT_MARKER,COMPACTION_PROMPT_ENVELOPE,createCompactionPrompt}from"#harness/compaction-prompt.js";function estimateTokens(e){return JSON.stringify(e).length/4}const COMPACTION_PROMPT_OVERHEAD_TOKENS=estimateTokens([{content:COMPACTION_PROMPT_ENVELOPE.system,role:`system`},{content:COMPACTION_PROMPT_ENVELOPE.prompt,role:`user`}]);function getInputTokenCount(e,t){let n=t.lastKnownInputTokens,r=t.lastKnownPromptMessageCount;return n===void 0||r===void 0||!Number.isInteger(r)||r<0||r>e.length?estimateTokens(e):n+estimateTokens(e.slice(r))}function shouldCompact(e,t){return e.length>0&&getInputTokenCount(e,t)+COMPACTION_PROMPT_OVERHEAD_TOKENS>t.threshold}async function resolveCompactionModel(e){let t=e.compactionModelReference??e.modelReference;return{model:t===e.modelReference?e.model:await e.resolveModel(t),providerOptions:t.providerOptions}}async function compactMessages(n,i,a,o,s,c,l){let{conversation:u,previousCheckpoint:d}=extractPreviousCheckpoint(n),f=selectRecentWindowSize(u,a);for(;;){let{older:n,recent:p}=splitMessagesForCompaction(u,f);if(n.length===0&&d===void 0)return keepNonToolResultMessages(p);let m=createCompactionPrompt({messages:n,previousCheckpoint:d}),h=await generateText({abortSignal:l,headers:c,model:i,prompt:m.prompt,providerOptions:o,system:m.system,telemetry:s?{...s,functionId:`eve.compaction`}:void 0,temperature:0}),g=keepNonToolResultMessages(p),_=g.at(-1)?.role,v=_===void 0||_===`assistant`?[{role:`user`,content:`Continue.`}]:[],y=[{content:COMPACTION_CHECKPOINT_MARKER,role:`user`},{content:h.text,role:`assistant`},...g,...v];if(estimateTokens(y)<=a.threshold||f===0)return y;--f}}function extractPreviousCheckpoint(e){let n=e[0],r=e[1];return n?.role!==`user`||n.content!==COMPACTION_CHECKPOINT_MARKER||r?.role!==`assistant`?{conversation:[...e],previousCheckpoint:void 0}:{conversation:e.slice(2),previousCheckpoint:assistantMessageText(r)}}function keepNonToolResultMessages(e){let t=[];for(let n of e)if(n.role!==`tool`){if(n.role===`assistant`){let e=assistantMessageText(n);e.length>0&&t.push({content:e,role:`assistant`});continue}t.push(n)}return t}function assistantMessageText(e){return typeof e.content==`string`?e.content.trim():e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()}function selectRecentWindowSize(e,t){let n=Math.min(t.recentWindowSize,Math.max(e.length-1,0)),r=resolveCompactionSummaryReserve(t),i=0,a=0;for(let o=e.length-1;o>=0&&i<n;--o){let n=e[o];if(n===void 0)continue;let s=estimateTokens([n]);if(a+s+r>t.threshold)break;a+=s,i+=1}return i}function resolveCompactionSummaryReserve(e){return Math.min(2048,Math.max(64,Math.floor(e.threshold/4)))}function splitMessagesForCompaction(e,t){return t<=0?{older:[...e],recent:[]}:{older:e.slice(0,-t),recent:e.slice(-t)}}export{compactMessages,estimateTokens,getInputTokenCount,resolveCompactionModel,shouldCompact};
@@ -61,6 +61,7 @@ export declare function resolvePendingInput(input: {
61
61
  }): ResolvePendingInputResult;
62
62
  type ResolvePendingInputResult = {
63
63
  readonly consumedMessage?: boolean;
64
+ readonly deferredContext?: boolean;
64
65
  readonly deferredMessage?: boolean;
65
66
  /**
66
67
  * Present when the resolved batch answered a session-limit continuation
@@ -1 +1 @@
1
- import{resolveTextToResponses}from"#channel/resolve-text.js";import{parseJsonObject}from"#shared/json.js";import{coalesceTurnInputs}from"#harness/messages.js";import{isSessionLimitContinuationRequest,resolveSessionLimitContinuation}from"#harness/session-limit-continuation.js";const PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,APPROVED_TOOLS_KEY=`eve.runtime.hitl.approvedTools`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`,TOOL_EXECUTION_DENIED_MESSAGE=`Tool execution was denied.`;function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}function consumeDeferredStepInput(e){let t=getDeferredStepInput(e.session);if(t===void 0)return e;let r=clearDeferredStepInput(e.session);return e.input===void 0?{input:t,session:r}:{input:coalesceTurnInputs(t,e.input),session:r}}function hasDeferredStepInput(e){return getDeferredStepInput(e)!==void 0}function resolvePendingInput(e){let{stepInput:t}=e,n=e.session,r=[...e.history??n.history],a=getPendingInputBatch(n.state);if(a===void 0)return{outcome:`continue`,messages:r,session:n};let o=resolveTextMessageInput(a,t),s=o?.inputResponses??[];if(s.length===0&&o?.message===void 0)return{outcome:`unresolved`,messages:r,session:n};if(a.requests.some(e=>isApprovalRequest(e))&&hasUnansweredApproval({pendingBatch:a,responses:s}))return n=queueDeferredStepInput(n,compactStepInput(o)),{deferredMessage:!0,outcome:`unresolved`,messages:r,session:n};if(s.length===0&&o?.message!==void 0){let e=buildToolResponseParts(a,[]),t=[...r,...a.responseMessages];e.length>0&&t.push({content:e,role:`tool`});let i=buildRejectedActionBatch(a,[]);return n=clearPendingInputBatch(n),{consumedMessage:o?.messageConsumed,outcome:`resolved`,messages:t,rejectedActions:i,session:n}}let c=resolveSessionLimitContinuation({requests:a.requests,responses:s});n=recordApprovedTools({pendingBatch:a,resolveApprovalKey:e.resolveApprovalKey,responses:s,session:n});let l=buildToolResponseParts(a,s),u=[...r,...a.responseMessages];l.length>0&&u.push({content:l,role:`tool`});let d=buildRejectedActionBatch(a,s);return n=clearPendingInputBatch(n),o?.message!==void 0&&a.requests.some(e=>isApprovalRequest(e))?(n=queueDeferredStepInput(n,{message:o.message}),{consumedMessage:o?.messageConsumed,deferredMessage:!0,limitContinuation:c,outcome:`resolved`,messages:u,rejectedActions:d,session:n}):{consumedMessage:o?.messageConsumed,limitContinuation:c,outcome:`resolved`,messages:u,rejectedActions:d,session:n}}function resolveTextMessageInput(t,n){if(typeof n?.message!=`string`||(n.inputResponses?.length??0)>0)return n;let r=resolveTextToResponses(n.message,t.requests);return r.length===0?n:compactStepInput({...n,inputResponses:r,messageConsumed:!0,message:void 0})}function compactStepInput(e){if(e===void 0)return{};let t={};return(e.context?.length??0)>0&&(t.context=e.context),(e.inputResponses?.length??0)>0&&(t.inputResponses=e.inputResponses),e.message!==void 0&&(t.message=e.message),e.messageConsumed===!0&&(t.messageConsumed=!0),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),t}function hasUnansweredApproval(e){let t=new Set(e.responses.map(e=>e.requestId));return e.pendingBatch.requests.some(e=>isApprovalRequest(e)&&!t.has(e.requestId))}function hasPendingInputBatch(e){return getPendingInputBatch(e)!==void 0}function getPendingInputBatch(e){let t=e?.[PENDING_INPUT_BATCH_KEY];if(typeof t!=`object`||!t)return;let n=t;if(!(!Array.isArray(n.requests)||!Array.isArray(n.responseMessages)))return n}function setPendingInputBatch(e){let t={...e.session.state};return t[PENDING_INPUT_BATCH_KEY]={event:e.event,requests:[...e.requests],responseMessages:[...e.responseMessages]},{...e.session,state:t}}function clearPendingInputBatch(e){if(e.state?.[PENDING_INPUT_BATCH_KEY]===void 0)return e;let t={...e.state};return delete t[PENDING_INPUT_BATCH_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}function getDeferredStepInput(e){return e.state?.[DEFERRED_STEP_INPUT_KEY]}function queueDeferredStepInput(e,t){let r=getDeferredStepInput(e),i=r===void 0?t:coalesceTurnInputs(r,t),a={...e.state};return a[DEFERRED_STEP_INPUT_KEY]=i,{...e,state:a}}function clearDeferredStepInput(e){if(e.state?.[DEFERRED_STEP_INPUT_KEY]===void 0)return e;let t={...e.state};return delete t[DEFERRED_STEP_INPUT_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}function getApprovedTools(e){let t=e.state?.[APPROVED_TOOLS_KEY];return Array.isArray(t)?new Set(t):new Set}function recordApprovedTools(e){let t=new Set(e.responses.filter(e=>e.optionId===`approve`).map(e=>e.requestId)),n=e.pendingBatch.requests.filter(e=>t.has(e.requestId)).map(t=>e.resolveApprovalKey?.(t)??t.action.toolName);if(n.length===0)return e.session;let r=getApprovedTools(e.session),i=[...new Set([...r,...n])],a={...e.session.state};return a[APPROVED_TOOLS_KEY]=i,{...e.session,state:a}}function resolveApprovalOutcome(e){return e===void 0?{approved:!1,reason:`Ignored because the user continued without responding.`,status:`ignored`}:e.optionId===`approve`?{approved:!0,reason:void 0,status:`approved`}:e.optionId===`deny`?{approved:!1,reason:TOOL_EXECUTION_DENIED_MESSAGE,status:`denied`}:{approved:!1,reason:`Invalid approval response.`,status:`invalid`}}function buildRejectedActionBatch(e,t){if(e.event===void 0)return;let n=new Map(t.map(e=>[e.requestId,e])),r=[];for(let t of e.requests){if(!isApprovalRequest(t))continue;let{approved:e,reason:i,status:a}=resolveApprovalOutcome(n.get(t.requestId));e||r.push({callId:t.action.callId,isError:!0,kind:`tool-result`,output:{approval:{requestId:t.requestId,status:a},code:`TOOL_EXECUTION_DENIED`,message:i??TOOL_EXECUTION_DENIED_MESSAGE,tool:{result:`not_run`}},toolName:t.action.toolName})}return r.length>0?{event:e.event,results:r}:void 0}function buildToolResponseParts(e,t){let n=new Map(t.map(e=>[e.requestId,e])),r=[];for(let t of e.requests)r.push(...buildToolResponsePartsForRequest(t,n.get(t.requestId)));return r}function buildToolResponsePartsForRequest(e,t){if(isSessionLimitContinuationRequest(e))return[];if(isApprovalRequest(e)){let{approved:n,reason:r}=resolveApprovalOutcome(t),i=[{approvalId:e.requestId,approved:n,reason:r,type:`tool-approval-response`}];return n||i.push({output:{type:`execution-denied`,reason:r},toolCallId:e.action.callId,toolName:e.action.toolName,type:`tool-result`}),i}return[{output:{type:`json`,value:t===void 0?{status:`ignored`}:{optionId:t.optionId,text:t.text,status:`answered`}},toolCallId:e.action.callId,toolName:e.action.toolName,type:`tool-result`}]}function isApprovalRequest(e){return e.options?.length===2&&e.options[0]?.id===`approve`&&e.options[1]?.id===`deny`}function createRuntimeToolCallActionFromToolCall(e){return{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}function resolveToolCallInputObject(e,n){if(e==null)return{};try{return parseJsonObject(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw TypeError(`Failed to parse tool-call arguments for "${n.toolName}" (${n.callId}): ${t}`,{cause:e})}}export{consumeDeferredStepInput,createRuntimeToolCallActionFromToolCall,getApprovedTools,hasDeferredStepInput,hasPendingInputBatch,hasStepInput,resolvePendingInput,setPendingInputBatch};
1
+ import{resolveTextToResponses}from"#channel/resolve-text.js";import{parseJsonObject}from"#shared/json.js";import{coalesceTurnInputs}from"#harness/messages.js";import{isSessionLimitContinuationRequest,resolveSessionLimitContinuation}from"#harness/session-limit-continuation.js";const PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,APPROVED_TOOLS_KEY=`eve.runtime.hitl.approvedTools`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`,TOOL_EXECUTION_DENIED_MESSAGE=`Tool execution was denied.`;function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}function consumeDeferredStepInput(e){let t=getDeferredStepInput(e.session);if(t===void 0)return e;let r=clearDeferredStepInput(e.session);return e.input===void 0?{input:t,session:r}:{input:coalesceTurnInputs(t,e.input),session:r}}function hasDeferredStepInput(e){return getDeferredStepInput(e)!==void 0}function resolvePendingInput(e){let{stepInput:t}=e,n=e.session,r=[...e.history??n.history],a=getPendingInputBatch(n.state);if(a===void 0)return{outcome:`continue`,messages:r,session:n};let o=resolveTextMessageInput(a,t),s=o?.inputResponses??[],c=a.requests.some(e=>isApprovalRequest(e));if(s.length===0&&o?.message===void 0)return{outcome:`unresolved`,messages:r,session:n};if(c&&hasUnansweredApproval({pendingBatch:a,responses:s}))return n=queueDeferredStepInput(n,compactStepInput(o)),{deferredMessage:!0,outcome:`unresolved`,messages:r,session:n};if(s.length===0&&o?.message!==void 0){let e=buildToolResponseParts(a,[]),t=[...r,...a.responseMessages];e.length>0&&t.push({content:e,role:`tool`});let i=buildRejectedActionBatch(a,[]);return n=clearPendingInputBatch(n),{consumedMessage:o?.messageConsumed,outcome:`resolved`,messages:t,rejectedActions:i,session:n}}let l=resolveSessionLimitContinuation({requests:a.requests,responses:s});n=recordApprovedTools({pendingBatch:a,resolveApprovalKey:e.resolveApprovalKey,responses:s,session:n});let u=buildToolResponseParts(a,s),d=[...r,...a.responseMessages];u.length>0&&d.push({content:u,role:`tool`});let f=buildRejectedActionBatch(a,s);if(n=clearPendingInputBatch(n),c){let e={};if((o?.context?.length??0)>0&&(e.context=o?.context),o?.message!==void 0&&(e.message=o.message),e.context!==void 0||e.message!==void 0)return n=queueDeferredStepInput(n,e),{consumedMessage:o?.messageConsumed,deferredContext:e.context===void 0?void 0:!0,deferredMessage:e.message===void 0?void 0:!0,limitContinuation:l,outcome:`resolved`,messages:d,rejectedActions:f,session:n}}return{consumedMessage:o?.messageConsumed,limitContinuation:l,outcome:`resolved`,messages:d,rejectedActions:f,session:n}}function resolveTextMessageInput(t,n){if(typeof n?.message!=`string`||(n.inputResponses?.length??0)>0)return n;let r=resolveTextToResponses(n.message,t.requests);return r.length===0?n:compactStepInput({...n,inputResponses:r,messageConsumed:!0,message:void 0})}function compactStepInput(e){if(e===void 0)return{};let t={};return(e.context?.length??0)>0&&(t.context=e.context),(e.inputResponses?.length??0)>0&&(t.inputResponses=e.inputResponses),e.message!==void 0&&(t.message=e.message),e.messageConsumed===!0&&(t.messageConsumed=!0),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),t}function hasUnansweredApproval(e){let t=new Set(e.responses.map(e=>e.requestId));return e.pendingBatch.requests.some(e=>isApprovalRequest(e)&&!t.has(e.requestId))}function hasPendingInputBatch(e){return getPendingInputBatch(e)!==void 0}function getPendingInputBatch(e){let t=e?.[PENDING_INPUT_BATCH_KEY];if(typeof t!=`object`||!t)return;let n=t;if(!(!Array.isArray(n.requests)||!Array.isArray(n.responseMessages)))return n}function setPendingInputBatch(e){let t={...e.session.state};return t[PENDING_INPUT_BATCH_KEY]={event:e.event,requests:[...e.requests],responseMessages:[...e.responseMessages]},{...e.session,state:t}}function clearPendingInputBatch(e){if(e.state?.[PENDING_INPUT_BATCH_KEY]===void 0)return e;let t={...e.state};return delete t[PENDING_INPUT_BATCH_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}function getDeferredStepInput(e){return e.state?.[DEFERRED_STEP_INPUT_KEY]}function queueDeferredStepInput(e,t){let r=getDeferredStepInput(e),i=r===void 0?t:coalesceTurnInputs(r,t),a={...e.state};return a[DEFERRED_STEP_INPUT_KEY]=i,{...e,state:a}}function clearDeferredStepInput(e){if(e.state?.[DEFERRED_STEP_INPUT_KEY]===void 0)return e;let t={...e.state};return delete t[DEFERRED_STEP_INPUT_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}function getApprovedTools(e){let t=e.state?.[APPROVED_TOOLS_KEY];return Array.isArray(t)?new Set(t):new Set}function recordApprovedTools(e){let t=new Set(e.responses.filter(e=>e.optionId===`approve`).map(e=>e.requestId)),n=e.pendingBatch.requests.filter(e=>t.has(e.requestId)).map(t=>e.resolveApprovalKey?.(t)??t.action.toolName);if(n.length===0)return e.session;let r=getApprovedTools(e.session),i=[...new Set([...r,...n])],a={...e.session.state};return a[APPROVED_TOOLS_KEY]=i,{...e.session,state:a}}function resolveApprovalOutcome(e){return e===void 0?{approved:!1,reason:`Ignored because the user continued without responding.`,status:`ignored`}:e.optionId===`approve`?{approved:!0,reason:void 0,status:`approved`}:e.optionId===`deny`?{approved:!1,reason:TOOL_EXECUTION_DENIED_MESSAGE,status:`denied`}:{approved:!1,reason:`Invalid approval response.`,status:`invalid`}}function buildRejectedActionBatch(e,t){if(e.event===void 0)return;let n=new Map(t.map(e=>[e.requestId,e])),r=[];for(let t of e.requests){if(!isApprovalRequest(t))continue;let{approved:e,reason:i,status:a}=resolveApprovalOutcome(n.get(t.requestId));e||r.push({callId:t.action.callId,isError:!0,kind:`tool-result`,output:{approval:{requestId:t.requestId,status:a},code:`TOOL_EXECUTION_DENIED`,message:i??TOOL_EXECUTION_DENIED_MESSAGE,tool:{result:`not_run`}},toolName:t.action.toolName})}return r.length>0?{event:e.event,results:r}:void 0}function buildToolResponseParts(e,t){let n=new Map(t.map(e=>[e.requestId,e])),r=[];for(let t of e.requests)r.push(...buildToolResponsePartsForRequest(t,n.get(t.requestId)));return r}function buildToolResponsePartsForRequest(e,t){if(isSessionLimitContinuationRequest(e))return[];if(isApprovalRequest(e)){let{approved:n,reason:r}=resolveApprovalOutcome(t),i=[{approvalId:e.requestId,approved:n,reason:r,type:`tool-approval-response`}];return n||i.push({output:{type:`execution-denied`,reason:r},toolCallId:e.action.callId,toolName:e.action.toolName,type:`tool-result`}),i}return[{output:{type:`json`,value:t===void 0?{status:`ignored`}:{optionId:t.optionId,text:t.text,status:`answered`}},toolCallId:e.action.callId,toolName:e.action.toolName,type:`tool-result`}]}function isApprovalRequest(e){return e.options?.length===2&&e.options[0]?.id===`approve`&&e.options[1]?.id===`deny`}function createRuntimeToolCallActionFromToolCall(e){return{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}function resolveToolCallInputObject(e,n){if(e==null)return{};try{return parseJsonObject(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw TypeError(`Failed to parse tool-call arguments for "${n.toolName}" (${n.callId}): ${t}`,{cause:e})}}export{consumeDeferredStepInput,createRuntimeToolCallActionFromToolCall,getApprovedTools,hasDeferredStepInput,hasPendingInputBatch,hasStepInput,resolvePendingInput,setPendingInputBatch};
@@ -8,7 +8,7 @@ export interface BuildTelemetryRuntimeContextInput {
8
8
  readonly emissionState: HarnessEmissionState;
9
9
  readonly environment: string;
10
10
  readonly modelInput: {
11
- readonly instructions: string | readonly SystemModelMessage[] | undefined;
11
+ readonly instructions: string | SystemModelMessage | undefined;
12
12
  readonly messages: readonly ModelMessage[];
13
13
  };
14
14
  readonly session: HarnessSession;
@@ -1 +1,3 @@
1
- import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ParentSessionKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,isNoOutputGeneratedError,summarizeKnownModelCallConfigError,summarizeKnownModelCallRequestError}from"#harness/model-call-error.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createResultCompletedEvent,createStepStartedEvent}from"#protocol/message.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{ToolLoopAgent,isStepCount}from"ai";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection}from"#context/dynamic-model-lifecycle.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{resolveAssistantStepText}from"#harness/messages.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{consumeDeferredStepInput,getApprovedTools,hasDeferredStepInput,hasStepInput,resolvePendingInput,setPendingInputBatch}from"#harness/input-requests.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools}from"#harness/workflow-sandbox.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{getInvalidToolCallInputError}from"#harness/tool-call-input-errors.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{createWorkflowLifecycle}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionTokenLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{getInstrumentationConfig}from"#harness/instrumentation-config.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{ensureOtelIntegration}from"#harness/otel-integration.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions,isInvalidToolCall}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#runtime/framework-tools/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function enrichTelemetry(e,t,n){if(e===void 0)return;let r={};for(let e of Object.keys(n??{}))r[e]=!0;return{functionId:e.functionId??t,includeRuntimeContext:r,isEnabled:!0,recordInputs:e.recordInputs??!0,recordOutputs:e.recordOutputs??!0}}function buildGatewayAttributionHeaders(e,t){if(typeof e!=`string`)return;let n=t?.agentName??t?.agentId,r=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,i=r?`https://${r}`:void 0;if(!n&&!i)return;let a={};return n&&(a[`x-title`]=n),i&&(a[`http-referer`]=i),a}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0)return{model:await e.config.resolveModel(e.session.agent.modelReference),session:e.session};let t=e.session.agent.dynamicModelDefaultReference??e.session.agent.modelReference,n=getActiveDynamicModelSelection(e.ctx);return n===null?{model:await e.config.resolveModel(t),session:updateSessionModelReference(e.session,t)}:{model:n.model===void 0?await e.config.resolveModel(n.reference):n.model,session:updateSessionModelReference(e.session,n.reference)}}function updateSessionModelReference(e,t){let n=e.agent.modelReference;return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t,priorReference:n})}}function updateCompactionThresholdForModelReference(e){if(e.modelReference.contextWindowTokens===void 0||e.priorReference.contextWindowTokens===void 0)return e.compaction;let t=e.compaction.threshold/e.priorReference.contextWindowTokens;return{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*t))}}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}function createToolLoopHarness(t){let n=t.handleEvent,c=getInstrumentationConfig();c!==void 0&&ensureOtelIntegration();let f=c===void 0?void 0:trace.getTracer(`eve`),p=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(f&&hasStepInput(t)){let t=c?.functionId??p,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=f.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(f,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(f,v,y){let b=f;y&&(b=setTurnTraceState(b,y.spanContext()));let x=getHarnessEmissionState(b.state),S=consumeDeferredStepInput({input:v,session:b});b=S.session;let O=await resolvePendingRuntimeActions({emit:n,session:b,stepInput:S.input});if(O.outcome===`unresolved`)return{next:null,session:O.session};b=O.session;let M=resolvePendingInput({history:O.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:b,stepInput:S.input});if(M.outcome===`unresolved`)return n&&M.deferredMessage===!0&&hasStepInput(v)?(x=await emitTurnPreamble(n,v??{},x,t.runtimeIdentity),x=await emitTurnEpilogue(n,x,t.mode),{next:null,session:setHarnessEmissionState(M.session,x)}):{next:null,session:M.session};if(n&&M.rejectedActions)for(let e of M.rejectedActions.results)await n(createActionResultEvent({rejected:!0,result:e,sequence:M.rejectedActions.event.sequence,stepIndex:M.rejectedActions.event.stepIndex,turnId:M.rejectedActions.event.turnId}));n&&hasStepInput(v)&&(x=await emitTurnPreamble(n,v??{},x,t.runtimeIdentity),b=setHarnessEmissionState(b,x),y&&y.setAttribute(`eve.turn.id`,x.turnId)),b=M.session;let N=M.messages,P=await applySessionLimitContinuation({config:t,emit:n,emissionState:x,limitContinuation:M.limitContinuation,session:b});if(P.result!==null)return P.result;if(b=P.session,S.input?.context!==void 0)for(let e of S.input.context)N.push({content:e,role:`user`});if(S.input?.message!==void 0&&!M.deferredMessage&&!M.consumedMessage){let e=await stageAttachmentsToSandbox(S.input.message);N.push({content:e,role:`user`})}let F=contextStorage.getStore();F!==void 0&&t.dispatchDynamicModelEvent!==void 0&&await t.dispatchDynamicModelEvent({ctx:F,event:createStepStartedEvent({sequence:x.sequence,stepIndex:x.stepIndex,turnId:x.turnId}),fallback:b.agent.dynamicModelDefaultReference??b.agent.modelReference,messages:N});let I=await resolveActiveRuntimeModel({config:t,ctx:F,session:b});b=I.session;let L=I.model,R=detectPromptCachePath(L),z=R.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,B=buildGatewayAttributionHeaders(L,t.runtimeIdentity);({messages:N,session:b}=await maybeCompact({abortSignal:t.abortSignal,emit:n,emissionState:x,headers:B,messages:N,model:L,onCompaction:t.onCompaction,resolveModel:t.resolveModel,session:b,telemetry:enrichTelemetry(c,p)??void 0}));let V=getApprovedTools(b),H=b.outputSchema===void 0&&F!==void 0&&isScheduleAppAuth(F.get(AuthKey))&&F.get(ParentSessionKey)===void 0,U=await hydrateSandboxAttachments(N),W=[],G=[];for(let e of U)e.role===`system`?W.push(e):G.push(e);if(F!==void 0){W.push(...buildDynamicInstructionMessages(F));let e=F.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&W.push({role:`system`,content:e})}H&&W.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let K=G,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=b.agent.system?[{role:`system`,content:b.agent.system}]:[],r=W.length>0||t.length>0?[...t,...n,...W]:void 0,i=r!==void 0&&z?applySystemCacheBreakpoint(r,z):r??b.agent.system??void 0;return{instructions:i,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:c,emissionState:x,environment,modelInput:{instructions:i,messages:K},session:b})}},runSingleModelCall=async e=>{let{instructions:i,telemetryRuntimeContext:a={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(a[`eve.retry.reason`]=e.retryReason);let o=e.trailingUserNote?[...K,{role:`user`,content:e.trailingUserNote}]:K,s=getAdvertisedTools({session:b,tools:t.tools}),u=await buildToolSetWithProviderTools({approvedTools:V,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:b.agent.modelReference,tools:s});if(F!==void 0){let n=getAdvertisedTools({session:b,tools:buildDynamicTools(F)}),r=buildToolSetFromDefinitions({approvedTools:V,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r))u[e]=t}b.outputSchema!==void 0&&(u[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(b.outputSchema));let d=n===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:n,emissionState:x,tools:e}),f=t.workflow===!0?{lifecycle:d,maxSubagents:t.workflowMaxSubagents}:void 0,h=await getAdvertisedTools({modelTools:u,session:b,tools:s,workflow:f});b=h.session;let g=h.modelTools,_=z?applyLastToolCacheBreakpoint(g,z):g,v=buildStepHooks({cachePath:R,emit:n,emissionState:x,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:z,session:b}),y=new ToolLoopAgent({headers:B,instructions:i,model:L,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownModelCallConfigError(e.error)===null&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:v.onStepFinish,prepareStep:v.prepareStep,reasoning:b.agent.reasoning,runtimeContext:a,stopWhen:isStepCount(1),telemetry:enrichTelemetry(c,p,a),toolApproval:buildToolApproval(g),tools:_});return(async()=>{if(n){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&s.get(e)===void 0).map(([e])=>e),r=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),i=await y.stream({abortSignal:t.abortSignal,messages:o}),{emittedActionCallIds:a,handledInlineToolResultCallIds:c,invalidInputToolCallIds:u,inlineAuthorizationResults:d,trailingInlineToolResultParts:f}=await emitStreamContent(n,x,i.fullStream,{excludedActionToolNames:r,tools:t.tools});throwIfTurnAborted(t.abortSignal);let[p,m]=await Promise.all([v.stepResult,i.responseMessages]);if(isEmptyModelResponse(p)&&extractToolResultCallIds(m).size===0&&d.length===0&&f.length===0)throw new EmptyModelResponseError;await emitStepActions(n,x,p,{emittedActionCallIds:a,excludedActionCallIds:u,excludedActionToolNames:r,handledInlineToolResultCallIds:c,tools:s});let h=p.toolResults,g=new Map(h.map(e=>[e.toolCallId,e]));for(let e of d)g.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:u,responseMessages:appendMissingToolResultMessages({append:f,responseMessages:m}),stepResult:p,toolResults:[...g.values()]})}let e=await y.generate({abortSignal:t.abortSignal,messages:o});throwIfTurnAborted(t.abortSignal);let r=await v.stepResult;if(isEmptyModelResponse(r)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:r})})().catch(rethrowNoOutputAsEmptyResponse)},runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t===1?e.suppressStepStartedEmission:!0}),{sessionId:b.sessionId,turnId:x.turnId},t.abortSignal),q=prepareModelCallInput();n&&await emitStepStarted(n,x,N);let J=await continuePendingWorkflowInterrupt({childResults:S.input?.runtimeActionResults,config:t,emit:n,emissionState:x,runStep,session:b});if(J!==null)return J;let Y=await enforceSessionTokenLimit({config:t,emit:n,emissionState:x,messages:N,session:b});if(Y!==null)return Y;let X;try{X=await runOneModelCall({preparedInput:q,suppressStepStartedEmission:!0})}catch(r){throwIfTurnAborted(t.abortSignal);let a=await runModelCallRecoveryPipeline({error:r,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:b.sessionId,turnId:x.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:H,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:b.sessionId,turnId:x.turnId})]});if(throwIfTurnAborted(t.abortSignal),a.outcome===`recovered`)X=a.result;else{let r=a.error;if(y&&recordErrorOnSpan(y,r),!n)throw r;let o=extractWorkflowStreamWriteErrorDetails(r);if(o!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...o,errorId:t,error:r,sessionId:b.sessionId,turnId:x.turnId}),x=await emitRecoverableFailedTurn(n,x,{code:`WORKFLOW_STREAM_WRITE_FAILED`,details:{...o,errorId:t},message:toErrorMessage(r)}),{next:null,session:setHarnessEmissionState(b,x)}}let s=classifyModelCallError(r),c=createErrorId(),f=s===`terminal`?summarizeKnownModelCallConfigError(r):null,p=f===null?summarizeKnownModelCallRequestError(r):null,_=f?.message??p?.message??toErrorMessage(r),v=extractModelCallErrorDetails(r),S=buildModelCallFailureDetails({configSummary:f,error:r,errorId:c,modelCallDetails:v,requestSummary:p}),C=buildModelCallFailureLogFields({error:r,errorId:c,modelCallDetails:v,requestSummary:p,sessionId:b.sessionId,turnId:x.turnId});if(s===`terminal`)return f===null?log.error(p?.message??`model call failed terminally`,C):log.error(`${f.name}: ${f.message}`,{errorId:c,sessionId:b.sessionId,turnId:x.turnId}),await emitFailedStep(n,x,{code:`MODEL_CALL_FAILED`,details:S,message:_,sessionId:b.sessionId}),{next:t.mode===`task`?{done:!0,isError:!0,output:_}:{done:!0,output:``},session:b};if(t.mode===`task`){if(s===`recoverable`&&!(r instanceof EmptyModelResponseError))throw log.warn(p?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,C),r;return log.error(p?.message??`model call failed; failing the task run`,C),await emitFailedStep(n,x,{code:`MODEL_CALL_FAILED`,details:S,message:_,sessionId:b.sessionId}),{next:{done:!0,isError:!0,output:_},session:b}}return log.error(p?.message??`model call failed — parking session for retry by the user`,C),x=await emitRecoverableFailedTurn(n,x,{code:`MODEL_CALL_FAILED`,details:S,message:_}),{next:null,session:setHarnessEmissionState(b,x)}}}let Z=accumulateTurnUsage({previous:getTurnUsageState(b.state),turnId:x.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(X.providerMetadata),usage:X.usage})});b=setTurnUsageState(b,Z);let Q;try{Q=formatLanguageModelGatewayId(L)}catch{Q=void 0}return await setEveAttributes({"$eve.model":Q,"$eve.input_tokens":Z.inputTokens,"$eve.output_tokens":Z.outputTokens,"$eve.cache_read_tokens":Z.cacheReadTokens,"$eve.cache_write_tokens":Z.cacheWriteTokens,"$eve.cost_usd":Z.sawCost?Z.costUsd:void 0,"$eve.tool_count":t.tools.size}),handleStepResult({config:t,emit:n,emissionState:x,promptMessages:N,result:X,runStep,session:b})}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(!(t===void 0&&e.costUsd===void 0))return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{configSummary:t,error:r,errorId:i,modelCallDetails:a,requestSummary:o}=e;return t===null?o===null?{...formatError(r,i),...a}:{errorId:i,message:toErrorMessage(r),name:o.name,...a}:{errorId:i,message:t.message,name:t.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.requestSummary===null?{...t,error:e.error}:{...t,details:e.modelCallDetails}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(!(n.role!==`tool`||!Array.isArray(n.content)))for(let e of n.content)e.type===`tool-result`&&t.add(e.toolCallId);return t}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),d=new Set([...i.invalidInputToolCallIds??[],...u.map(e=>e.toolCallId)]),f=l?[]:appendMissingToolResultMessages({append:u.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),p=l?null:c,m=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&m.add(e.toolCallId);let h=normalizeProviderToolHistory({messages:f,providerExecutedOutcomeIds:m}),g=h.messages,_={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},y=t.workflow===!0?readWorkflowContinuationSecurity(_):void 0;if(y!==void 0){let e=await getWorkflowSandboxInterrupt(i,y);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:_,emissionState:o,interrupt:e,promptMessages:r,responseMessages:g})}}let b=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:d}),S=new Set(b.map(e=>e.action.callId)),C=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...d,...S])}),w=[...b,...C],T=getAdvertisedTools({session:_,tools:t.tools}),E=(i.toolCalls??[]).filter(e=>!isInvalidToolCall(e)).filter(e=>!d.has(e.toolCallId)).filter(e=>t.tools.get(e.toolName)?.runtimeAction!==void 0).filter(e=>T.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:_.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:T}));if(E.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:E,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:g,session:{..._,history:[...r]}}),o)};if(w.length>0){let e=setPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:w,responseMessages:g,session:{..._,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:w,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),e=setHarnessEmissionState(e,o))),{next:null,session:e}}let D=findAuthorizationSignalFromToolResults(i.toolResults);if(D){let{challenges:e}=D;if(n)for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));return{next:null,session:setHarnessEmissionState({..._,history:[...r],state:setPendingAuthorization(_.state,{challenges:e})},o)}}let k=g,A=[...r,...k],j={..._,history:A};return!(j.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(k.at(-1)?.role===`tool`||h.outcomeEndsResponse||hasDeferredStepInput(j))?(n&&(o=advanceStep(o),j=setHarnessEmissionState(j,o)),{next:a,session:j}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:j.outputSchema,session:j,stepOutput:p}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:j.outputSchema,session:j})}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME)?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i}=e,{emissionState:a,session:o}=e;if(i===void 0)return t&&(a=await emitTurnEpilogue(t,a,`conversation`),o=setHarnessEmissionState(o,a)),{next:null,session:o};let s=extractFinalOutput(r);return s===void 0?(t&&(a=await emitRecoverableFailedTurn(t,a,OUTPUT_SCHEMA_NOT_FULFILLED),o=setHarnessEmissionState(o,a)),{next:null,session:o}):(o=persistStructuredAssistantTurn(o,n,s),t&&(a=await emitStructuredResult(t,a,s,`conversation`),o=setHarnessEmissionState(o,a)),{next:null,session:o})}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.config.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.config.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let e=await unwrapWorkflowSandboxResult(o,a);if(e.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(e.interrupt)||c+1>=r.length)break;let n=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(n===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=n}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,l=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=l.slice(0,t),r=l.slice(t);return u={...u,history:n},parkOnWorkflowInterrupt({baseSession:u,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:u}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:i.agent.modelReference,resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,e.headers,e.abortSignal),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}export{createToolLoopHarness};
1
+ import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ParentSessionKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,isNoOutputGeneratedError,summarizeKnownModelCallConfigError,summarizeKnownModelCallRequestError}from"#harness/model-call-error.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createResultCompletedEvent,createStepStartedEvent}from"#protocol/message.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{ToolLoopAgent,isStepCount}from"ai";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection}from"#context/dynamic-model-lifecycle.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{resolveAssistantStepText}from"#harness/messages.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{consumeDeferredStepInput,getApprovedTools,hasDeferredStepInput,hasStepInput,resolvePendingInput,setPendingInputBatch}from"#harness/input-requests.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools}from"#harness/workflow-sandbox.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{getInvalidToolCallInputError}from"#harness/tool-call-input-errors.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{createWorkflowLifecycle}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionTokenLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{getInstrumentationConfig}from"#harness/instrumentation-config.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{ensureOtelIntegration}from"#harness/otel-integration.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions,isInvalidToolCall}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#runtime/framework-tools/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function enrichTelemetry(e,t,n){if(e===void 0)return;let r={};for(let e of Object.keys(n??{}))r[e]=!0;return{functionId:e.functionId??t,includeRuntimeContext:r,isEnabled:!0,recordInputs:e.recordInputs??!0,recordOutputs:e.recordOutputs??!0}}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
2
+
3
+ `)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){if(typeof e!=`string`)return;let n=t?.agentName??t?.agentId,r=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,i=r?`https://${r}`:void 0;if(!n&&!i)return;let a={};return n&&(a[`x-title`]=n),i&&(a[`http-referer`]=i),a}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0)return{model:await e.config.resolveModel(e.session.agent.modelReference),session:e.session};let t=e.session.agent.dynamicModelDefaultReference??e.session.agent.modelReference,n=getActiveDynamicModelSelection(e.ctx);return n===null?{model:await e.config.resolveModel(t),session:updateSessionModelReference(e.session,t)}:{model:n.model===void 0?await e.config.resolveModel(n.reference):n.model,session:updateSessionModelReference(e.session,n.reference)}}function updateSessionModelReference(e,t){let n=e.agent.modelReference;return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t,priorReference:n})}}function updateCompactionThresholdForModelReference(e){if(e.modelReference.contextWindowTokens===void 0||e.priorReference.contextWindowTokens===void 0)return e.compaction;let t=e.compaction.threshold/e.priorReference.contextWindowTokens;return{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*t))}}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}function createToolLoopHarness(t){let n=t.handleEvent,c=getInstrumentationConfig();c!==void 0&&ensureOtelIntegration();let f=c===void 0?void 0:trace.getTracer(`eve`),p=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(f&&hasStepInput(t)){let t=c?.functionId??p,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=f.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(f,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(f,v,y){let b=f;y&&(b=setTurnTraceState(b,y.spanContext()));let x=getHarnessEmissionState(b.state),S=consumeDeferredStepInput({input:v,session:b});b=S.session;let O=await resolvePendingRuntimeActions({emit:n,session:b,stepInput:S.input});if(O.outcome===`unresolved`)return{next:null,session:O.session};b=O.session;let M=resolvePendingInput({history:O.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:b,stepInput:S.input});if(M.outcome===`unresolved`)return n&&M.deferredMessage===!0&&hasStepInput(v)?(x=await emitTurnPreamble(n,v??{},x,t.runtimeIdentity),x=await emitTurnEpilogue(n,x,t.mode),{next:null,session:setHarnessEmissionState(M.session,x)}):{next:null,session:M.session};if(n&&M.rejectedActions)for(let e of M.rejectedActions.results)await n(createActionResultEvent({rejected:!0,result:e,sequence:M.rejectedActions.event.sequence,stepIndex:M.rejectedActions.event.stepIndex,turnId:M.rejectedActions.event.turnId}));n&&hasStepInput(v)&&(x=await emitTurnPreamble(n,v??{},x,t.runtimeIdentity),b=setHarnessEmissionState(b,x),y&&y.setAttribute(`eve.turn.id`,x.turnId)),b=M.session;let N=M.messages,P=await applySessionLimitContinuation({config:t,emit:n,emissionState:x,limitContinuation:M.limitContinuation,session:b});if(P.result!==null)return P.result;if(b=P.session,S.input?.context!==void 0&&M.deferredContext!==!0)for(let e of S.input.context)N.push({content:e,role:`user`});if(S.input?.message!==void 0&&!M.deferredMessage&&!M.consumedMessage){let e=await stageAttachmentsToSandbox(S.input.message);N.push({content:e,role:`user`})}let F=contextStorage.getStore();F!==void 0&&t.dispatchDynamicModelEvent!==void 0&&await t.dispatchDynamicModelEvent({ctx:F,event:createStepStartedEvent({sequence:x.sequence,stepIndex:x.stepIndex,turnId:x.turnId}),fallback:b.agent.dynamicModelDefaultReference??b.agent.modelReference,messages:N});let I=await resolveActiveRuntimeModel({config:t,ctx:F,session:b});b=I.session;let L=I.model,R=detectPromptCachePath(L),z=R.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,B=buildGatewayAttributionHeaders(L,t.runtimeIdentity);({messages:N,session:b}=await maybeCompact({abortSignal:t.abortSignal,emit:n,emissionState:x,headers:B,messages:N,model:L,onCompaction:t.onCompaction,resolveModel:t.resolveModel,session:b,telemetry:enrichTelemetry(c,p)??void 0}));let V=getApprovedTools(b),H=b.outputSchema===void 0&&F!==void 0&&isScheduleAppAuth(F.get(AuthKey))&&F.get(ParentSessionKey)===void 0,U=await hydrateSandboxAttachments(N),W=[],G=[];for(let e of U)e.role===`system`?W.push(e):G.push(e);if(F!==void 0){W.push(...buildDynamicInstructionMessages(F));let e=F.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&W.push({role:`system`,content:e})}H&&W.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let K=G,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=b.agent.system?[{role:`system`,content:b.agent.system}]:[],r=W.length>0||t.length>0?[...t,...n,...W]:void 0,i=r!==void 0&&z?applySystemCacheBreakpoint(r,z):r,a=i===void 0?b.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:c,emissionState:x,environment,modelInput:{instructions:a,messages:K},session:b})}},runSingleModelCall=async e=>{let{instructions:i,telemetryRuntimeContext:a={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(a[`eve.retry.reason`]=e.retryReason);let o=e.trailingUserNote?[...K,{role:`user`,content:e.trailingUserNote}]:K,s=getAdvertisedTools({session:b,tools:t.tools}),u=await buildToolSetWithProviderTools({approvedTools:V,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:b.agent.modelReference,tools:s});if(F!==void 0){let n=getAdvertisedTools({session:b,tools:buildDynamicTools(F)}),r=buildToolSetFromDefinitions({approvedTools:V,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r))u[e]=t}b.outputSchema!==void 0&&(u[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(b.outputSchema));let d=n===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:n,emissionState:x,tools:e}),f=t.workflow===!0?{lifecycle:d,maxSubagents:t.workflowMaxSubagents}:void 0,h=await getAdvertisedTools({modelTools:u,session:b,tools:s,workflow:f});b=h.session;let g=h.modelTools,_=z?applyLastToolCacheBreakpoint(g,z):g,v=buildStepHooks({cachePath:R,emit:n,emissionState:x,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:z,session:b}),y=new ToolLoopAgent({headers:B,instructions:i,model:L,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownModelCallConfigError(e.error)===null&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:v.onStepFinish,prepareStep:v.prepareStep,reasoning:b.agent.reasoning,runtimeContext:a,stopWhen:isStepCount(1),telemetry:enrichTelemetry(c,p,a),toolApproval:buildToolApproval(g),tools:_});return(async()=>{if(n){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&s.get(e)===void 0).map(([e])=>e),r=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),i=await y.stream({abortSignal:t.abortSignal,messages:o}),{emittedActionCallIds:a,handledInlineToolResultCallIds:c,invalidInputToolCallIds:u,inlineAuthorizationResults:d,trailingInlineToolResultParts:f}=await emitStreamContent(n,x,i.fullStream,{excludedActionToolNames:r,tools:t.tools});throwIfTurnAborted(t.abortSignal);let[p,m]=await Promise.all([v.stepResult,i.responseMessages]);if(isEmptyModelResponse(p)&&extractToolResultCallIds(m).size===0&&d.length===0&&f.length===0)throw new EmptyModelResponseError;await emitStepActions(n,x,p,{emittedActionCallIds:a,excludedActionCallIds:u,excludedActionToolNames:r,handledInlineToolResultCallIds:c,tools:s});let h=p.toolResults,g=new Map(h.map(e=>[e.toolCallId,e]));for(let e of d)g.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:u,responseMessages:appendMissingToolResultMessages({append:f,responseMessages:m}),stepResult:p,toolResults:[...g.values()]})}let e=await y.generate({abortSignal:t.abortSignal,messages:o});throwIfTurnAborted(t.abortSignal);let r=await v.stepResult;if(isEmptyModelResponse(r)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:r})})().catch(rethrowNoOutputAsEmptyResponse)},runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t===1?e.suppressStepStartedEmission:!0}),{sessionId:b.sessionId,turnId:x.turnId},t.abortSignal),q=prepareModelCallInput();n&&await emitStepStarted(n,x,N);let J=await continuePendingWorkflowInterrupt({childResults:S.input?.runtimeActionResults,config:t,emit:n,emissionState:x,runStep,session:b});if(J!==null)return J;let Y=await enforceSessionTokenLimit({config:t,emit:n,emissionState:x,messages:N,session:b});if(Y!==null)return Y;let X;try{X=await runOneModelCall({preparedInput:q,suppressStepStartedEmission:!0})}catch(r){throwIfTurnAborted(t.abortSignal);let a=await runModelCallRecoveryPipeline({error:r,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:b.sessionId,turnId:x.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:H,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:b.sessionId,turnId:x.turnId})]});if(throwIfTurnAborted(t.abortSignal),a.outcome===`recovered`)X=a.result;else{let r=a.error;if(y&&recordErrorOnSpan(y,r),!n)throw r;let o=extractWorkflowStreamWriteErrorDetails(r);if(o!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...o,errorId:t,error:r,sessionId:b.sessionId,turnId:x.turnId}),x=await emitRecoverableFailedTurn(n,x,{code:`WORKFLOW_STREAM_WRITE_FAILED`,details:{...o,errorId:t},message:toErrorMessage(r)}),{next:null,session:setHarnessEmissionState(b,x)}}let s=classifyModelCallError(r),c=createErrorId(),f=s===`terminal`?summarizeKnownModelCallConfigError(r):null,p=f===null?summarizeKnownModelCallRequestError(r):null,_=f?.message??p?.message??toErrorMessage(r),v=extractModelCallErrorDetails(r),S=buildModelCallFailureDetails({configSummary:f,error:r,errorId:c,modelCallDetails:v,requestSummary:p}),C=buildModelCallFailureLogFields({error:r,errorId:c,modelCallDetails:v,requestSummary:p,sessionId:b.sessionId,turnId:x.turnId});if(s===`terminal`)return f===null?log.error(p?.message??`model call failed terminally`,C):log.error(`${f.name}: ${f.message}`,{errorId:c,sessionId:b.sessionId,turnId:x.turnId}),await emitFailedStep(n,x,{code:`MODEL_CALL_FAILED`,details:S,message:_,sessionId:b.sessionId}),{next:t.mode===`task`?{done:!0,isError:!0,output:_}:{done:!0,output:``},session:b};if(t.mode===`task`){if(s===`recoverable`&&!(r instanceof EmptyModelResponseError))throw log.warn(p?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,C),r;return log.error(p?.message??`model call failed; failing the task run`,C),await emitFailedStep(n,x,{code:`MODEL_CALL_FAILED`,details:S,message:_,sessionId:b.sessionId}),{next:{done:!0,isError:!0,output:_},session:b}}return log.error(p?.message??`model call failed — parking session for retry by the user`,C),x=await emitRecoverableFailedTurn(n,x,{code:`MODEL_CALL_FAILED`,details:S,message:_}),{next:null,session:setHarnessEmissionState(b,x)}}}let Z=accumulateTurnUsage({previous:getTurnUsageState(b.state),turnId:x.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(X.providerMetadata),usage:X.usage})});b=setTurnUsageState(b,Z);let Q;try{Q=formatLanguageModelGatewayId(L)}catch{Q=void 0}return await setEveAttributes({"$eve.model":Q,"$eve.input_tokens":Z.inputTokens,"$eve.output_tokens":Z.outputTokens,"$eve.cache_read_tokens":Z.cacheReadTokens,"$eve.cache_write_tokens":Z.cacheWriteTokens,"$eve.cost_usd":Z.sawCost?Z.costUsd:void 0,"$eve.tool_count":t.tools.size}),handleStepResult({config:t,emit:n,emissionState:x,promptMessages:N,result:X,runStep,session:b})}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(!(t===void 0&&e.costUsd===void 0))return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{configSummary:t,error:r,errorId:i,modelCallDetails:a,requestSummary:o}=e;return t===null?o===null?{...formatError(r,i),...a}:{errorId:i,message:toErrorMessage(r),name:o.name,...a}:{errorId:i,message:t.message,name:t.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.requestSummary===null?{...t,error:e.error}:{...t,details:e.modelCallDetails}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(!(n.role!==`tool`||!Array.isArray(n.content)))for(let e of n.content)e.type===`tool-result`&&t.add(e.toolCallId);return t}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),d=new Set([...i.invalidInputToolCallIds??[],...u.map(e=>e.toolCallId)]),f=l?[]:appendMissingToolResultMessages({append:u.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),p=l?null:c,m=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&m.add(e.toolCallId);let h=normalizeProviderToolHistory({messages:f,providerExecutedOutcomeIds:m}),g=h.messages,_={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},y=t.workflow===!0?readWorkflowContinuationSecurity(_):void 0;if(y!==void 0){let e=await getWorkflowSandboxInterrupt(i,y);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:_,emissionState:o,interrupt:e,promptMessages:r,responseMessages:g})}}let b=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:d}),S=new Set(b.map(e=>e.action.callId)),C=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...d,...S])}),w=[...b,...C],T=getAdvertisedTools({session:_,tools:t.tools}),E=(i.toolCalls??[]).filter(e=>!isInvalidToolCall(e)).filter(e=>!d.has(e.toolCallId)).filter(e=>t.tools.get(e.toolName)?.runtimeAction!==void 0).filter(e=>T.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:_.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:T}));if(E.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:E,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:g,session:{..._,history:[...r]}}),o)};if(w.length>0){let e=setPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:w,responseMessages:g,session:{..._,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:w,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),e=setHarnessEmissionState(e,o))),{next:null,session:e}}let D=findAuthorizationSignalFromToolResults(i.toolResults);if(D){let{challenges:e}=D;if(n)for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));return{next:null,session:setHarnessEmissionState({..._,history:[...r],state:setPendingAuthorization(_.state,{challenges:e})},o)}}let k=g,A=[...r,...k],j={..._,history:A};return!(j.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(k.at(-1)?.role===`tool`||h.outcomeEndsResponse||hasDeferredStepInput(j))?(n&&(o=advanceStep(o),j=setHarnessEmissionState(j,o)),{next:a,session:j}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:j.outputSchema,session:j,stepOutput:p}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:j.outputSchema,session:j})}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME)?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i}=e,{emissionState:a,session:o}=e;if(i===void 0)return t&&(a=await emitTurnEpilogue(t,a,`conversation`),o=setHarnessEmissionState(o,a)),{next:null,session:o};let s=extractFinalOutput(r);return s===void 0?(t&&(a=await emitRecoverableFailedTurn(t,a,OUTPUT_SCHEMA_NOT_FULFILLED),o=setHarnessEmissionState(o,a)),{next:null,session:o}):(o=persistStructuredAssistantTurn(o,n,s),t&&(a=await emitStructuredResult(t,a,s,`conversation`),o=setHarnessEmissionState(o,a)),{next:null,session:o})}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.config.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.config.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let e=await unwrapWorkflowSandboxResult(o,a);if(e.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(e.interrupt)||c+1>=r.length)break;let n=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(n===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=n}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,l=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=l.slice(0,t),r=l.slice(t);return u={...u,history:n},parkOnWorkflowInterrupt({baseSession:u,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:u}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:i.agent.modelReference,resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,e.headers,e.abortSignal),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}export{createToolLoopHarness};
@@ -0,0 +1,36 @@
1
+ export interface ApplicationBuildWorkspace {
2
+ readonly appRoot: string;
3
+ readonly compiler: {
4
+ readonly artifactsDir: string;
5
+ readonly rootDir: string;
6
+ };
7
+ readonly host: {
8
+ readonly artifactsDir: string;
9
+ };
10
+ readonly nitro: {
11
+ readonly buildDir: string;
12
+ readonly surfaceOutputDir: string;
13
+ };
14
+ readonly publication: {
15
+ readonly output: {
16
+ readonly finalDir: string;
17
+ readonly stagedDir: string;
18
+ };
19
+ readonly summary: {
20
+ readonly finalPath: string;
21
+ readonly stagedPath: string;
22
+ };
23
+ };
24
+ readonly rootDir: string;
25
+ readonly workflow: {
26
+ readonly buildDir: string;
27
+ };
28
+ }
29
+ /**
30
+ * Creates the invocation-owned directory tree under `.eve/builds/<id>` that
31
+ * one production build compiles, bundles, and stages into. Every path a
32
+ * build touches lives here until publication renames the staged output into
33
+ * place, so concurrent builds and a running dev server never interfere.
34
+ */
35
+ export declare function createApplicationBuildWorkspace(appRoot: string, outputDirectory?: string): Promise<ApplicationBuildWorkspace>;
36
+ export declare function removeApplicationBuildWorkspace(workspace: ApplicationBuildWorkspace): Promise<void>;
@@ -0,0 +1 @@
1
+ import{join,resolve}from"node:path";import{mkdir,rm}from"node:fs/promises";import{resolveOutputDirectory}from"#internal/application/paths.js";import{randomUUID}from"node:crypto";import{VERCEL_EVE_AGENT_SUMMARY_OUTPUT_PATH}from"#internal/vercel-agent-summary.js";async function createApplicationBuildWorkspace(t,n){let r=resolve(t),i=join(r,`.eve`,`builds`,`${Date.now().toString(36)}-${randomUUID()}`),a=join(i,`compiler`),o={appRoot:r,compiler:{artifactsDir:join(a,`.eve`),rootDir:a},host:{artifactsDir:join(i,`host`)},nitro:{buildDir:join(i,`nitro`),surfaceOutputDir:join(i,`nitro-output`)},publication:{output:{finalDir:n??resolveOutputDirectory(r),stagedDir:join(i,`output`)},summary:{finalPath:join(r,VERCEL_EVE_AGENT_SUMMARY_OUTPUT_PATH),stagedPath:join(i,`agent-summary.json`)}},rootDir:i,workflow:{buildDir:join(i,`workflow`)}};return await mkdir(i,{recursive:!0}),o}async function removeApplicationBuildWorkspace(e){await rm(e.rootDir,{force:!0,recursive:!0})}export{createApplicationBuildWorkspace,removeApplicationBuildWorkspace};
@@ -37,6 +37,11 @@ export declare function writeCompiledArtifactsFiles(input: {
37
37
  defaultWorkflowWorld: BuiltInWorkflowWorldTarget;
38
38
  outDir: string;
39
39
  }): Promise<GeneratedCompiledArtifactsFiles>;
40
+ export declare function writeDevelopmentCompiledArtifactsFiles(input: {
41
+ readonly compileResult: CompileAgentResult;
42
+ readonly outDir: string;
43
+ readonly runtimeAppRoot: string;
44
+ }): Promise<GeneratedCompiledArtifactsFiles>;
40
45
  export declare function createCompiledArtifactsBootstrapSource(input: {
41
46
  compileResult: CompileAgentResult;
42
47
  installModulePath: string;
@@ -1,5 +1,6 @@
1
- import{getWorldImport}from"../../node_modules/.pnpm/@workflow_utils@5.0.0-beta.6/node_modules/@workflow/utils/dist/world-target.js";import"../../node_modules/.pnpm/@workflow_utils@5.0.0-beta.6/node_modules/@workflow/utils/dist/index.js";import{resolvePackageCompiledFilePath,resolvePackageSourceFilePath}from"#internal/application/package.js";import{existsSync}from"node:fs";import{join}from"node:path";import{mkdir,writeFile}from"node:fs/promises";import{createCompiledModuleMapSource}from"#compiler/module-map.js";import{stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";async function writeCompiledArtifactsFiles(e){let t=join(e.outDir,`compiled-artifacts-bootstrap.mjs`),r=join(e.outDir,`compiled-artifacts-instrumentation.mjs`),s=join(e.outDir,`compiled-artifacts-workflow-world.mjs`),c=resolveInstrumentationModule(e.compileResult.manifest.agentRoot);await mkdir(e.outDir,{recursive:!0}),await writeFile(t,await createCompiledArtifactsBootstrapSource({compileResult:e.compileResult,installModulePath:resolvePackageSourceFilePath(`src/runtime/loaders/bundled-artifacts.ts`),moduleMapPath:t,metadata:e.compileResult.metadata})),await writeFile(s,createWorkflowWorldPluginSource({compiledArtifactsBootstrapPath:t,configuredWorld:e.compileResult.manifest.config.experimental?.workflow?.world,defaultWorld:e.defaultWorkflowWorld})),c!==void 0&&await writeFile(r,createInstrumentationPluginSource({agentName:e.compileResult.manifest.config.name,instrumentationPath:c,registerConfigPath:resolvePackageSourceFilePath(`src/harness/instrumentation-config.ts`)}));let l={bootstrapPath:t,workflowWorldPluginPath:s};return c!==void 0&&(l.instrumentationPluginPath=r,l.instrumentationSourcePath=c),l}const INSTRUMENTATION_EXTENSIONS=[`.ts`,`.mts`,`.js`,`.mjs`];function resolveInstrumentationModule(e){for(let t of INSTRUMENTATION_EXTENSIONS){let n=join(e,`instrumentation${t}`);if(existsSync(n))return n}}function stripCompiledModuleMapExports(e){return e.replace(/^export const moduleMap = /m,`const moduleMap = `).replace(/\nexport default moduleMap;\n?$/,`
2
- `)}async function createCompiledArtifactsBootstrapSource(e){let t=e.compileResult.manifest.config.name,r=stripCompiledModuleMapExports(createCompiledModuleMapSource({importSpecifierStyle:`absolute`,manifest:e.compileResult.manifest,moduleMapPath:e.moduleMapPath})).trim();return[`// Generated by eve. Do not edit by hand.`,`import { installBundledCompiledArtifacts } from ${stringifyEsmImportSpecifier(e.installModulePath)};`,`import { installEveWorkflowQueueNamespace } from ${stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/queue-namespace.ts`))};`,``,`installEveWorkflowQueueNamespace(${JSON.stringify(t)});`,``,r,``,`const metadata = ${JSON.stringify(e.metadata,null,2)};`,``,`const manifest = ${JSON.stringify(e.compileResult.manifest,null,2)};`,``,`export function installCompiledArtifactsBootstrap() {`,` installBundledCompiledArtifacts({`,` manifest,`,` metadata,`,` moduleMap,`,` });`,`}`,``,`installCompiledArtifactsBootstrap();`,``,`// Default export satisfies the Nitro plugin contract so this file`,`// can be used directly as a Nitro plugin without a separate wrapper.`,`export default function installCompiledArtifactsPlugin() {`,` // Already installed on import above.`,`}`,``,`export async function __eveInstallCompiledArtifactsStep() {`,` "use step";`,` return null;`,`}`,``].join(`
1
+ import{getWorldImport}from"../../node_modules/.pnpm/@workflow_utils@5.0.0-beta.6/node_modules/@workflow/utils/dist/world-target.js";import"../../node_modules/.pnpm/@workflow_utils@5.0.0-beta.6/node_modules/@workflow/utils/dist/index.js";import{resolvePackageCompiledFilePath,resolvePackageSourceFilePath}from"#internal/application/package.js";import{existsSync}from"node:fs";import{join}from"node:path";import{copyFile,mkdir,writeFile}from"node:fs/promises";import{createCompiledModuleMapSource}from"#compiler/module-map.js";import{stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";import{readMaterializedAuthoredModuleIndex}from"#internal/materialized-authored-modules.js";async function writeCompiledArtifactsFiles(e){let t=join(e.outDir,`compiled-artifacts-bootstrap.mjs`),r=join(e.outDir,`compiled-artifacts-instrumentation.mjs`),a=join(e.outDir,`compiled-artifacts-workflow-world.mjs`),c=resolveInstrumentationModule(e.compileResult.manifest.agentRoot);await mkdir(e.outDir,{recursive:!0}),await writeFile(t,await createCompiledArtifactsBootstrapSource({compileResult:e.compileResult,installModulePath:resolvePackageSourceFilePath(`src/runtime/loaders/bundled-artifacts.ts`),moduleMapPath:t,metadata:e.compileResult.metadata})),await writeFile(a,createWorkflowWorldPluginSource({compiledArtifactsBootstrapPath:t,configuredWorld:e.compileResult.manifest.config.experimental?.workflow?.world,defaultWorld:e.defaultWorkflowWorld})),c!==void 0&&await writeFile(r,createInstrumentationPluginSource({agentName:e.compileResult.manifest.config.name,instrumentationPath:c,registerConfigPath:resolvePackageSourceFilePath(`src/harness/instrumentation-config.ts`)}));let l={bootstrapPath:t,workflowWorldPluginPath:a};return c!==void 0&&(l.instrumentationPluginPath=r,l.instrumentationSourcePath=c),l}async function writeDevelopmentCompiledArtifactsFiles(e){let t=join(e.outDir,`compiled-artifacts-bootstrap.mjs`),r=join(e.outDir,`compiled-artifacts-instrumentation.mjs`),c=join(e.outDir,`compiled-artifacts-instrumentation-source.mjs`),l=join(e.outDir,`compiled-artifacts-workflow-world.mjs`),u=await readMaterializedAuthoredModuleIndex(e.runtimeAppRoot);if(u===void 0)throw Error(`Development generation at "${e.runtimeAppRoot}" is not materialized.`);await mkdir(e.outDir,{recursive:!0}),await writeFile(t,createDevelopmentCompiledArtifactsBootstrapSource(e.compileResult.manifest.config.name)),await writeFile(l,createWorkflowWorldPluginSource({compiledArtifactsBootstrapPath:t,configuredWorld:e.compileResult.manifest.config.experimental?.workflow?.world,defaultWorld:`local`}));let d={bootstrapPath:t,workflowWorldPluginPath:l};return u.instrumentation!==void 0&&(await copyFile(join(e.runtimeAppRoot,`.eve`,`compile`,u.instrumentation),c),await writeFile(r,createInstrumentationPluginSource({agentName:e.compileResult.manifest.config.name,instrumentationPath:c,registerConfigPath:resolvePackageSourceFilePath(`src/harness/instrumentation-config.ts`)})),d.instrumentationPluginPath=r,d.instrumentationSourcePath=c),d}function createDevelopmentCompiledArtifactsBootstrapSource(e){return[`// Generated by eve. Do not edit by hand.`,`import { installEveWorkflowQueueNamespace } from ${stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/queue-namespace.ts`))};`,``,`installEveWorkflowQueueNamespace(${JSON.stringify(e)});`,``,`export default function installDevelopmentCompiledArtifactsPlugin() {}`,``].join(`
2
+ `)}const INSTRUMENTATION_EXTENSIONS=[`.ts`,`.mts`,`.js`,`.mjs`];function resolveInstrumentationModule(e){for(let t of INSTRUMENTATION_EXTENSIONS){let n=join(e,`instrumentation${t}`);if(existsSync(n))return n}}function stripCompiledModuleMapExports(e){return e.replace(/^export const moduleMap = /m,`const moduleMap = `).replace(/\nexport default moduleMap;\n?$/,`
3
+ `)}async function createCompiledArtifactsBootstrapSource(e){let t=e.compileResult.manifest.config.name,r=stripCompiledModuleMapExports(createCompiledModuleMapSource({importSpecifierStyle:`absolute`,manifest:e.compileResult.manifest,moduleMapPath:e.moduleMapPath})).trim();return[`// Generated by eve. Do not edit by hand.`,`import { installBundledCompiledArtifacts } from ${stringifyEsmImportSpecifier(e.installModulePath)};`,`import { installEveWorkflowQueueNamespace } from ${stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/queue-namespace.ts`))};`,``,`installEveWorkflowQueueNamespace(${JSON.stringify(t)});`,``,r,``,`const metadata = ${JSON.stringify(e.metadata,null,2)};`,``,`const manifest = ${JSON.stringify(e.compileResult.manifest,null,2)};`,``,`export function installCompiledArtifactsBootstrap() {`,` installBundledCompiledArtifacts({`,` manifest,`,` metadata,`,` moduleMap,`,` });`,`}`,``,`installCompiledArtifactsBootstrap();`,``,`// Default export satisfies the Nitro plugin contract so this file`,`// can be used directly as a Nitro plugin without a separate wrapper.`,`export default function installCompiledArtifactsPlugin() {`,` // Already installed on import above.`,`}`,``].join(`
3
4
  `)}function createWorkflowWorldPluginSource(r){let i=getWorldImport({WORKFLOW_TARGET_WORLD:r.configuredWorld??r.defaultWorld}),a=i===`@workflow/world-local`||i===`@workflow/world-vercel`?resolvePackageCompiledFilePath(`src/compiled/${i}/index.js`):i,o=resolvePackageCompiledFilePath(`src/compiled/@workflow/core/runtime.js`),s=resolvePackageSourceFilePath(`src/internal/workflow/validate-world.ts`);return[`// Generated by eve. Do not edit by hand.`,`import ${stringifyEsmImportSpecifier(r.compiledArtifactsBootstrapPath)};`,`import * as workflowWorldModule from ${stringifyEsmImportSpecifier(a)};`,`import { createWorldFromModule, getWorld, setWorld } from ${stringifyEsmImportSpecifier(o)};`,`import { validateWorkflowWorld } from ${stringifyEsmImportSpecifier(s)};`,``,`const workflowWorld = await createWorldFromModule(workflowWorldModule);`,`validateWorkflowWorld({ packageName: ${JSON.stringify(r.configuredWorld)}, world: workflowWorld });`,`setWorld(workflowWorld);`,`await getWorld();`,`await workflowWorld.start?.();`,``,`export default function installWorkflowWorldPlugin() {}`,``].join(`
4
5
  `)}function createInstrumentationPluginSource(e){return[`// Generated by eve. Do not edit by hand.`,`import * as instrumentationModule from ${stringifyEsmImportSpecifier(e.instrumentationPath)};`,`import { registerInstrumentationConfig } from ${stringifyEsmImportSpecifier(e.registerConfigPath)};`,``,`if (instrumentationModule.default != null) {`,` registerInstrumentationConfig(instrumentationModule.default, { agentName: ${JSON.stringify(e.agentName)} });`,`}`,``,`// Default export satisfies the Nitro plugin contract so this file`,`// can be used directly as a Nitro plugin without a separate wrapper.`,`export default function installInstrumentationPlugin() {}`,``].join(`
5
- `)}export{createCompiledArtifactsBootstrapSource,createWorkflowWorldPluginSource,writeCompiledArtifactsFiles};
6
+ `)}export{createCompiledArtifactsBootstrapSource,createWorkflowWorldPluginSource,writeCompiledArtifactsFiles,writeDevelopmentCompiledArtifactsFiles};
@@ -0,0 +1,7 @@
1
+ import type { OutputPublicationJournal } from "#internal/application/output-publication-journal.js";
2
+ export declare function assertStagedPublicationExists(journal: OutputPublicationJournal): Promise<void>;
3
+ export declare function prepareOutputPublication(journal: OutputPublicationJournal): Promise<void>;
4
+ export declare function backupOutputPublication(journal: OutputPublicationJournal): Promise<void>;
5
+ export declare function installOutputPublication(journal: OutputPublicationJournal, afterOutputInstall: () => Promise<void>): Promise<void>;
6
+ export declare function rollbackOutputPublication(journal: OutputPublicationJournal): Promise<void>;
7
+ export declare function removeOutputPublicationBackups(journal: OutputPublicationJournal): Promise<void>;
@@ -0,0 +1 @@
1
+ import{dirname}from"node:path";import{mkdir,rename,rm,stat}from"node:fs/promises";import{pathExists}from"#shared/path-exists.js";async function assertStagedPublicationExists(e){await Promise.all([stat(e.stagedOutputDir),stat(e.stagedSummaryPath)])}async function prepareOutputPublication(n){[n.hadOutput,n.hadSummary]=await Promise.all([pathExists(n.finalOutputDir),pathExists(n.finalSummaryPath)]),await Promise.all([mkdir(dirname(n.finalOutputDir),{recursive:!0}),mkdir(dirname(n.finalSummaryPath),{recursive:!0})])}async function backupOutputPublication(e){e.hadOutput&&await rename(e.finalOutputDir,e.outputBackupPath),e.hadSummary&&await rename(e.finalSummaryPath,e.summaryBackupPath)}async function installOutputPublication(e,t){await rename(e.stagedOutputDir,e.finalOutputDir),await t(),await rename(e.stagedSummaryPath,e.finalSummaryPath)}async function rollbackOutputPublication(e){let t=(await Promise.allSettled([rollbackArtifact({backupPath:e.outputBackupPath,finalPath:e.finalOutputDir,hadPrevious:e.hadOutput,stagedPath:e.stagedOutputDir}),rollbackArtifact({backupPath:e.summaryBackupPath,finalPath:e.finalSummaryPath,hadPrevious:e.hadSummary,stagedPath:e.stagedSummaryPath})])).flatMap(e=>e.status===`rejected`?[e.reason]:[]);if(t.length>0)throw AggregateError(t,`Failed to restore the previous build publication.`)}async function removeOutputPublicationBackups(e){await Promise.all([rm(e.outputBackupPath,{force:!0,recursive:!0}),rm(e.summaryBackupPath,{force:!0,recursive:!0})])}async function rollbackArtifact(r){if(await pathExists(r.backupPath)){!await pathExists(r.stagedPath)&&await pathExists(r.finalPath)?(await mkdir(dirname(r.stagedPath),{recursive:!0}),await rename(r.finalPath,r.stagedPath)):await rm(r.finalPath,{force:!0,recursive:!0}),await rename(r.backupPath,r.finalPath);return}!r.hadPrevious&&!await pathExists(r.stagedPath)&&await pathExists(r.finalPath)&&(await mkdir(dirname(r.stagedPath),{recursive:!0}),await rename(r.finalPath,r.stagedPath))}export{assertStagedPublicationExists,backupOutputPublication,installOutputPublication,prepareOutputPublication,removeOutputPublicationBackups,rollbackOutputPublication};
@@ -0,0 +1,30 @@
1
+ export type OutputPublicationPhase = "acquired" | "prepared" | "backed-up" | "committed";
2
+ export interface OutputPublicationJournal {
3
+ readonly finalOutputDir: string;
4
+ readonly finalSummaryPath: string;
5
+ hadOutput: boolean;
6
+ hadSummary: boolean;
7
+ liveness: "active" | "recoverable";
8
+ readonly outputBackupPath: string;
9
+ phase: OutputPublicationPhase;
10
+ readonly pid: number;
11
+ readonly scratchDir: string;
12
+ readonly stagedOutputDir: string;
13
+ readonly stagedSummaryPath: string;
14
+ readonly summaryBackupPath: string;
15
+ readonly token: string;
16
+ }
17
+ export interface RecoveryLeaseJournal {
18
+ readonly pid: number;
19
+ readonly token: string;
20
+ }
21
+ export declare function writeOutputPublicationJournal(lockPath: string, journal: OutputPublicationJournal): Promise<void>;
22
+ export declare function readOutputPublicationJournal(lockPath: string): Promise<OutputPublicationJournal | undefined>;
23
+ export declare function writeRecoveryLeaseJournal(leasePath: string, journal: RecoveryLeaseJournal): Promise<void>;
24
+ export declare function readRecoveryLeaseJournal(leasePath: string): Promise<RecoveryLeaseJournal | undefined>;
25
+ /**
26
+ * Resolves the journal file inside a lock or lease directory. Exposed so
27
+ * the lock module can heartbeat the file's mtime while a publication or
28
+ * recovery is in flight.
29
+ */
30
+ export declare function resolveJournalFilePath(path: string): string;
@@ -0,0 +1 @@
1
+ import{join}from"node:path";import{readFile}from"node:fs/promises";import{isErrnoCode}from"#shared/guards.js";import{atomicWriteFile}from"#shared/atomic-write-file.js";async function writeOutputPublicationJournal(e,t){await writeJournal(e,t)}async function readOutputPublicationJournal(e){let t=await readJournal(e);return isOutputPublicationJournal(t)?t:void 0}async function writeRecoveryLeaseJournal(e,t){await writeJournal(e,t)}async function readRecoveryLeaseJournal(e){let t=await readJournal(e);return isRecoveryLeaseJournal(t)?t:void 0}function resolveJournalFilePath(t){return join(t,`owner.json`)}async function writeJournal(e,t){await atomicWriteFile(resolveJournalFilePath(e),`${JSON.stringify(t,null,2)}\n`)}async function readJournal(e){try{return JSON.parse(await readFile(resolveJournalFilePath(e),`utf8`))}catch(e){if(isErrnoCode(e,`ENOENT`)||e instanceof SyntaxError)return;throw e}}function isOutputPublicationJournal(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.finalOutputDir==`string`&&typeof t.finalSummaryPath==`string`&&typeof t.hadOutput==`boolean`&&typeof t.hadSummary==`boolean`&&(t.liveness===`active`||t.liveness===`recoverable`)&&typeof t.outputBackupPath==`string`&&[`acquired`,`prepared`,`backed-up`,`committed`].includes(t.phase??``)&&typeof t.pid==`number`&&typeof t.scratchDir==`string`&&typeof t.stagedOutputDir==`string`&&typeof t.stagedSummaryPath==`string`&&typeof t.summaryBackupPath==`string`&&typeof t.token==`string`}function isRecoveryLeaseJournal(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.pid==`number`&&typeof t.token==`string`}export{readOutputPublicationJournal,readRecoveryLeaseJournal,resolveJournalFilePath,writeOutputPublicationJournal,writeRecoveryLeaseJournal};
@@ -0,0 +1,10 @@
1
+ import { type OutputPublicationJournal } from "#internal/application/output-publication-journal.js";
2
+ export declare function resolveOutputPublicationLockPath(appRoot: string): string;
3
+ /**
4
+ * Keeps a held lock's (or lease's) journal mtime fresh while its owner works.
5
+ * Liveness cannot rest on `process.kill(pid, 0)` alone — journals survive
6
+ * reboots, so a recycled pid (or an unrelated process answering `EPERM`)
7
+ * would make a dead owner look alive forever. Returns a stop function.
8
+ */
9
+ export declare function startPublicationJournalHeartbeat(journalDirectoryPath: string): () => void;
10
+ export declare function acquireOutputPublicationLock(lockPath: string, journal: OutputPublicationJournal, onContention: () => Promise<void>): Promise<() => Promise<void>>;
@@ -0,0 +1 @@
1
+ import{watch}from"node:fs";import{basename,dirname,isAbsolute,join,relative,resolve}from"node:path";import{mkdir,readdir,rename,rm,stat,utimes}from"node:fs/promises";import{isErrnoCode}from"#shared/guards.js";import{pathExists}from"#shared/path-exists.js";import{removeOutputPublicationBackups,rollbackOutputPublication}from"#internal/application/output-publication-artifacts.js";import{readOutputPublicationJournal,readRecoveryLeaseJournal,resolveJournalFilePath,writeOutputPublicationJournal,writeRecoveryLeaseJournal}from"#internal/application/output-publication-journal.js";const PUBLICATION_LOCK_TIMEOUT_MS=6e4,INCOMPLETE_LOCK_STALE_MS=5e3;function resolveOutputPublicationLockPath(e){return join(resolve(e),`.eve`,`locks`,`output-publication.lock`)}function startPublicationJournalHeartbeat(e){let t=resolveJournalFilePath(e),n=setInterval(()=>{let e=new Date;utimes(t,e,e).catch(()=>void 0)},1e3);return n.unref(),()=>{clearInterval(n)}}async function acquireOutputPublicationLock(e,t,r){let i=Date.now()+PUBLICATION_LOCK_TIMEOUT_MS,a=`${e}.recovery`;for(await mkdir(dirname(e),{recursive:!0});;){if(await pathExists(a)){if(await r(),await recoverStalePublication(e,a,t))continue;await waitForPublicationLockChange(e,i);continue}try{if(await mkdir(e),await pathExists(a)){await rm(e,{force:!0,recursive:!0}),await waitForPublicationLockChange(e,i);continue}try{await writeOutputPublicationJournal(e,t)}catch(t){throw await rm(e,{force:!0,recursive:!0}),t}return async()=>{if((await readOutputPublicationJournal(e))?.token!==t.token)return;let n=`${e}.released-${t.token}`;try{await rename(e,n)}catch(e){if(isErrnoCode(e,`ENOENT`))return;throw e}await rm(n,{force:!0,recursive:!0})}}catch(e){if(!isErrnoCode(e,`EEXIST`))throw e}await r(),!await recoverStalePublication(e,a,t)&&await waitForPublicationLockChange(e,i)}}async function recoverStalePublication(e,t,n){let r=await acquireRecoveryLease(t,n.token);if(r===void 0)return!1;let a=startPublicationJournalHeartbeat(join(t,`lease`)),o=!1;try{let r=await readOutputPublicationJournal(e);if(r!==void 0&&r.liveness===`active`&&isProcessAlive(r.pid)&&!await isJournalStale(e)||r===void 0&&!await isPathStale(e))return!1;if(await pathExists(e)){let r=join(t,`owner-${n.token}`);try{await rename(e,r),o=!0}catch(e){if(!isErrnoCode(e,`ENOENT`))throw e}}let a=await readdir(t,{withFileTypes:!0});o=a.some(e=>e.isDirectory()&&e.name.startsWith(`owner-`));for(let e of a)!e.isDirectory()||!e.name.startsWith(`owner-`)||await finishInterruptedPublication(join(t,e.name));return o=!1,!0}finally{a(),o?await r.release():await r.complete()}}async function acquireRecoveryLease(e,t){let n=join(e,`lease`),r={pid:process.pid,token:t};for(await mkdir(e,{recursive:!0});;){try{await mkdir(n);try{await writeRecoveryLeaseJournal(n,r)}catch(e){throw await rm(n,{force:!0,recursive:!0}),e}return{async complete(){if((await readRecoveryLeaseJournal(n))?.token!==t)return;let r=`${e}.released-${t}`;try{await rename(e,r)}catch(e){if(isErrnoCode(e,`ENOENT`))return;throw e}await rm(r,{force:!0,recursive:!0})},async release(){if((await readRecoveryLeaseJournal(n))?.token!==t)return;let e=`${n}.released-${t}`;try{await rename(n,e)}catch(e){if(isErrnoCode(e,`ENOENT`))return;throw e}await rm(e,{force:!0,recursive:!0})}}}catch(e){if(isErrnoCode(e,`ENOENT`))return;if(!isErrnoCode(e,`EEXIST`))throw e}let i=await readRecoveryLeaseJournal(n);if(i!==void 0&&isProcessAlive(i.pid)&&!await isJournalStale(n)||i===void 0&&!await isPathStale(n))return;let a=`${n}.stale-${t}`;try{await rename(n,a)}catch(e){if(isErrnoCode(e,`ENOENT`))continue;throw e}await rm(a,{force:!0,recursive:!0})}}async function finishInterruptedPublication(e){let t=await readOutputPublicationJournal(e);if(t===void 0||!hasTokenDerivedBackupPaths(t)){await rm(e,{force:!0,recursive:!0});return}t.phase===`committed`?await removeOutputPublicationBackups(t):await rollbackOutputPublication(t),await removePublicationScratchDirectory(t),await rm(e,{force:!0,recursive:!0})}function hasTokenDerivedBackupPaths(e){return e.outputBackupPath===`${e.finalOutputDir}.eve-backup-${e.token}`&&e.summaryBackupPath===`${e.finalSummaryPath}.eve-backup-${e.token}`}async function removePublicationScratchDirectory(e){let t=relative(e.scratchDir,e.stagedOutputDir);t===``||t.startsWith(`..`)||isAbsolute(t)||await rm(e.scratchDir,{force:!0,recursive:!0})}async function waitForPublicationLockChange(r,i){let a=i-Date.now();if(a<=0)throw Error(`Timed out waiting ${PUBLICATION_LOCK_TIMEOUT_MS}ms to publish completed build output.`);let o=dirname(r),s=basename(r),c=await readPublicationLockState(r);await new Promise((t,n)=>{let i=!1,l=setTimeout(settleResolve,Math.min(a,INCOMPLETE_LOCK_STALE_MS)),u=watch(o,(e,t)=>{e===`rename`&&(t===null||t.toString().startsWith(s))&&settleResolve()});function cleanup(){clearTimeout(l),u.close()}function settleResolve(){i||(i=!0,cleanup(),t())}function settleReject(e){i||(i=!0,cleanup(),n(e))}u.once(`error`,settleReject),Promise.all([readPublicationLockState(r),pathExists(r),pathExists(`${r}.recovery`)]).then(([e,t,n])=>{(!t&&!n||e!==c)&&settleResolve()},settleReject)})}async function readPublicationLockState(e){let t=`${e}.recovery`,[n,r,a,o]=await Promise.all([readOutputPublicationJournal(e),readRecoveryLeaseJournal(join(t,`lease`)),pathExists(e),pathExists(t)]);return JSON.stringify({lockExists:a,lockToken:n?.token,recoveryExists:o,recoveryToken:r?.token})}async function isPathStale(e){try{return Date.now()-(await stat(e)).mtimeMs>=INCOMPLETE_LOCK_STALE_MS}catch(e){if(isErrnoCode(e,`ENOENT`))return!0;throw e}}async function isJournalStale(e){try{let t=await stat(resolveJournalFilePath(e));return Date.now()-t.mtimeMs>=15e3}catch(e){if(isErrnoCode(e,`ENOENT`))return!0;throw e}}function isProcessAlive(e){try{return process.kill(e,0),!0}catch(e){return!isErrnoCode(e,`ESRCH`)}}export{acquireOutputPublicationLock,resolveOutputPublicationLockPath,startPublicationJournalHeartbeat};