experimental-ash 0.35.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/docs/internals/context.md +6 -5
- package/dist/docs/internals/core-beliefs.md +2 -2
- package/dist/docs/internals/hooks.md +16 -11
- package/dist/docs/internals/mechanical-invariants.md +4 -4
- package/dist/docs/internals/testing.md +1 -1
- package/dist/docs/public/README.md +1 -1
- package/dist/docs/public/auth-and-route-protection.md +4 -4
- package/dist/docs/public/channels/{README.md → index.md} +2 -2
- package/dist/docs/public/channels/slack.md +3 -3
- package/dist/docs/public/cli-build-and-debugging.md +1 -1
- package/dist/docs/public/faqs.md +4 -5
- package/dist/docs/public/hooks.md +18 -23
- package/dist/docs/public/meta.json +4 -4
- package/dist/docs/public/sandbox.md +9 -11
- package/dist/docs/public/schedules.md +1 -1
- package/dist/docs/public/session-context.md +25 -27
- package/dist/docs/public/skills.md +3 -4
- package/dist/docs/public/subagents.md +1 -1
- package/dist/docs/public/tools.md +13 -17
- package/dist/docs/public/typescript-api.md +10 -11
- package/dist/src/channel/session.d.ts +3 -29
- package/dist/src/channel/session.js +1 -1
- package/dist/src/context/build-callback-context.d.ts +8 -0
- package/dist/src/context/build-callback-context.js +1 -0
- package/dist/src/context/hook-lifecycle.js +1 -1
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/sandbox/bash-tool.d.ts +2 -1
- package/dist/src/execution/sandbox/bash-tool.js +1 -1
- package/dist/src/execution/sandbox/glob-tool.d.ts +2 -1
- package/dist/src/execution/sandbox/glob-tool.js +3 -3
- package/dist/src/execution/sandbox/grep-tool.d.ts +2 -1
- package/dist/src/execution/sandbox/grep-tool.js +3 -3
- package/dist/src/execution/sandbox/read-file-tool.d.ts +2 -1
- package/dist/src/execution/sandbox/read-file-tool.js +1 -1
- package/dist/src/execution/sandbox/write-file-tool.d.ts +2 -1
- package/dist/src/execution/sandbox/write-file-tool.js +1 -1
- package/dist/src/execution/tool-compaction.js +1 -1
- package/dist/src/harness/code-mode-approval.js +1 -1
- package/dist/src/harness/code-mode.js +1 -1
- package/dist/src/harness/tool-loop.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/workflow-bundle/builder.js +2 -2
- package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/index.js +1 -1
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/runtime/manager.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/runtime/worker-source.js +408 -0
- package/dist/src/packages/ash-scaffold/src/channels.js +2 -12
- package/dist/src/packages/ash-scaffold/src/pnpm-workspace.js +11 -0
- package/dist/src/packages/ash-scaffold/src/project.js +1 -1
- package/dist/src/public/context/index.d.ts +3 -2
- package/dist/src/public/context/index.js +1 -1
- package/dist/src/public/definitions/callback-context.d.ts +22 -0
- package/dist/src/public/definitions/callback-context.js +1 -0
- package/dist/src/public/definitions/hook.d.ts +9 -49
- package/dist/src/public/definitions/tool.d.ts +14 -15
- package/dist/src/public/hooks/index.d.ts +1 -1
- package/dist/src/public/sandbox/index.d.ts +0 -1
- package/dist/src/public/sandbox/index.js +1 -1
- package/dist/src/public/skills/index.d.ts +0 -1
- package/dist/src/public/skills/index.js +1 -1
- package/dist/src/public/tools/defaults.js +1 -1
- package/dist/src/public/tools/define-bash-tool.js +1 -1
- package/dist/src/public/tools/define-glob-tool.js +1 -1
- package/dist/src/public/tools/define-grep-tool.js +1 -1
- package/dist/src/public/tools/define-read-file-tool.js +1 -1
- package/dist/src/public/tools/define-write-file-tool.js +1 -1
- package/dist/src/public/tools/index.d.ts +2 -1
- package/dist/src/public/tools/internal.d.ts +4 -0
- package/dist/src/public/tools/internal.js +1 -1
- package/dist/src/runtime/framework-tools/bash.js +1 -1
- package/dist/src/runtime/framework-tools/connection-search.js +1 -1
- package/dist/src/runtime/framework-tools/connection-tools.js +1 -1
- package/dist/src/runtime/framework-tools/file-state.d.ts +2 -2
- package/dist/src/runtime/framework-tools/file-state.js +1 -1
- package/dist/src/runtime/framework-tools/glob.js +1 -1
- package/dist/src/runtime/framework-tools/grep.js +1 -1
- package/dist/src/runtime/framework-tools/read-file.js +2 -2
- package/dist/src/runtime/framework-tools/todo.js +1 -1
- package/dist/src/runtime/framework-tools/write-file.js +1 -1
- package/dist/src/runtime/types.d.ts +2 -2
- package/package.json +2 -2
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/runtime/manager.js +0 -1
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/runtime/worker-source.js +0 -1153
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/runtime-assets.js +0 -1
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/approval-continuation.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/approval-response.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/code-mode-tool.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/continuation-capability.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/errors.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/fetch-policy.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/host-interrupt.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/interrupt-continuation.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/options.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/run-code-mode.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/runtime/max-workers.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/serialization.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/source-cache.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/telemetry.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/tool-invocation.js +0 -0
- /package/dist/src/node_modules/.pnpm/{experimental-ai-sdk-code-mode@1.0.9_ai@7.0.0-canary.154_zod@4.4.3_ → experimental-ai-sdk-code-mode@1.0.10_ai@7.0.0-canary.154_zod@4.4.3_}/node_modules/experimental-ai-sdk-code-mode/dist/tool-prompt.js +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{dirname,join,relative,resolve}from"node:path";import{cp,mkdir,readFile,rm,writeFile}from"node:fs/promises";import{resolvePackageSourceDirectoryPath,resolveWorkflowModulePath}from"#internal/application/package.js";import{normalizeEsmImportSpecifier}from"#internal/application/import-specifier.js";import{buildWithNitroRolldown,getSingleRolldownChunk}from"#internal/bundler/nitro-rolldown.js";import{prepareAshVersionedCacheDirectory,writeAshVersionedCacheMetadata}from"#internal/application/cache-metadata.js";import{WORKFLOW_BUILDER_DEFERRED_PACKAGES,WORKFLOW_STEP_EXTERNAL_PACKAGES,copyNitroFunctionDirectory,createWorkflowFunctionEnvironment,retargetNitroFunctionDirectoryToWorkflowRoute}from"#internal/workflow-bundle/vercel-workflow-output.js";import{WORKFLOW_QUEUE_TRIGGER,detectWorkflowPatterns}from"#internal/workflow-bundle/workflow-builders.js";import{
|
|
2
|
-
`);return await bundleFinalWorkflowOutput({bundleFinalOutput:t,code:getSingleRolldownChunk(await buildWithNitroRolldown({cwd:this.config.workingDir,input:WORKFLOW_VIRTUAL_ENTRY_ID,platform:`neutral`,plugins:[createWorkflowVirtualEntryPlugin(h),createWorkflowPseudoPackagePlugin(),createAshPackageImportsPlugin(this.config.workingDir,{workflowCondition:!0}),createWorkflowTransformPlugin({manifest:
|
|
1
|
+
import{dirname,join,relative,resolve}from"node:path";import{cp,mkdir,readFile,rm,writeFile}from"node:fs/promises";import{resolvePackageSourceDirectoryPath,resolveWorkflowModulePath}from"#internal/application/package.js";import{normalizeEsmImportSpecifier}from"#internal/application/import-specifier.js";import{Buffer}from"node:buffer";import{buildWithNitroRolldown,getSingleRolldownChunk}from"#internal/bundler/nitro-rolldown.js";import{prepareAshVersionedCacheDirectory,writeAshVersionedCacheMetadata}from"#internal/application/cache-metadata.js";import{WORKFLOW_BUILDER_DEFERRED_PACKAGES,WORKFLOW_STEP_EXTERNAL_PACKAGES,copyNitroFunctionDirectory,createWorkflowFunctionEnvironment,retargetNitroFunctionDirectoryToWorkflowRoute}from"#internal/workflow-bundle/vercel-workflow-output.js";import{WORKFLOW_QUEUE_TRIGGER,detectWorkflowPatterns}from"#internal/workflow-bundle/workflow-builders.js";import{WORKFLOW_VIRTUAL_ENTRY_ID,atomicWriteFile,bundleFinalWorkflowOutput,collectWorkflowInputFiles,convertClassesManifest,convertStepsManifest,convertWorkflowsManifest,createAshPackageImportsPlugin,createWorkflowImport,createWorkflowNodeBuiltinGuardPlugin,createWorkflowPseudoPackagePlugin,createWorkflowTransformPlugin,createWorkflowVirtualEntryPlugin}from"#internal/workflow-bundle/builder-support.js";import{writeNitroStepEntrypoint}from"#internal/workflow-bundle/nitro-step-entry.js";const workflowBundleBuildLocks=new Map;var WorkflowBundleBuilder=class{#e;#t;config;#n=new WeakMap;constructor(e){let t=[resolvePackageSourceDirectoryPath(`src/execution`)];e.includeTestFixtures===!0&&t.push(resolvePackageSourceDirectoryPath(`src/internal/testing`)),this.config={buildTarget:`standalone`,dirs:t,externalPackages:[...WORKFLOW_STEP_EXTERNAL_PACKAGES,...WORKFLOW_BUILDER_DEFERRED_PACKAGES],projectRoot:e.appRoot,watch:e.watch,workingDir:e.rootDir},this.#e=e.compiledArtifactsBootstrapPath,this.#t=e.outDir}async build(e={}){let t=(workflowBundleBuildLocks.get(this.#t)??Promise.resolve()).then(()=>this.#r(e));workflowBundleBuildLocks.set(this.#t,t.catch(()=>{})),await t}async#r(n){await prepareAshVersionedCacheDirectory(this.#t);let r=await this.#i();if(r.length===0)throw Error(`Expected the execution workflow source file under "${resolvePackageSourceDirectoryPath(`src/execution`)}".`);let i=await this.findTsConfigPath();await mkdir(this.#t,{recursive:!0});let o=await this.discoverEntries(r,this.#t,i),s=join(this.#t,`workflows.mjs`),{manifest:c}=await this.createWorkflowsBundle({discoveredEntries:o,keepInterimBundleContext:!1,outfile:s,bundleFinalOutput:!1,format:`esm`,inputFiles:r,tsconfigPath:i}),d=join(this.#t,`steps.mjs`),f=await writeNitroStepEntrypoint({builtinsPath:resolveWorkflowModulePath(`workflow/internal/builtins`),discoveredEntries:o,outfile:d,preferAbsoluteFileImports:!0,projectRoot:this.config.projectRoot??this.config.workingDir,workingDir:this.config.workingDir}),p=n.nitroStepOutfile;p!==void 0&&p!==d&&await writeNitroStepEntrypoint({builtinsPath:resolveWorkflowModulePath(`workflow/internal/builtins`),discoveredEntries:o,outfile:p,preferAbsoluteFileImports:!0,projectRoot:this.config.projectRoot??this.config.workingDir,workingDir:this.config.workingDir}),await addStepRegistrationsImport(s,d),await rewriteWorkflowRuntimeImports(s),await rewriteWorkflowCodeLiteral(s);let m=n.nitroWorkflowOutfile;m!==void 0&&m!==s&&(await mkdir(dirname(m),{recursive:!0}),await mirrorFileBypassingUnlink(s,m),p!==void 0&&(await addStepRegistrationsImport(m,p),await rewriteWorkflowRuntimeImports(m),await rewriteWorkflowCodeLiteral(m))),await this.createManifest({workflowBundlePath:join(this.#t,`workflows.mjs`),manifestDir:this.#t,manifest:{steps:{...f.steps,...c.steps},workflows:{...f.workflows,...c.workflows},classes:{...f.classes,...c.classes}}}),await writeAshVersionedCacheMetadata(this.#t)}get transformProjectRoot(){return this.config.projectRoot??this.config.workingDir}async findTsConfigPath(){let n=this.config.workingDir;for(;;){for(let e of[`tsconfig.json`,`jsconfig.json`]){let r=join(n,e);try{return await readFile(r),r}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}}let r=dirname(n);if(r===n)return;n=r}}async getInputFiles(){let e=this.config.dirs.map(e=>resolve(this.config.workingDir,e));return(await Promise.all(e.map(e=>collectWorkflowInputFiles(e)))).flat()}async discoverEntries(e,t,n){let r=this.#n.get(e);if(r!==void 0)return r;let i={discoveredSerdeFiles:[],discoveredSteps:[],discoveredWorkflows:[]};for(let t of e){let e=detectWorkflowPatterns(await readFile(t,`utf8`));e.hasUseStep&&i.discoveredSteps.push(t),e.hasUseWorkflow&&i.discoveredWorkflows.push(t),e.hasSerde&&i.discoveredSerdeFiles.push(t)}return this.#n.set(e,i),i}async createWorkflowsBundle({bundleFinalOutput:t=!0,discoveredEntries:n,format:r=`cjs`,inputFiles:i,keepInterimBundleContext:a=this.config.watch,outfile:o,tsconfigPath:s}){let c=n??await this.discoverEntries(i,dirname(o),s),l=[...c.discoveredWorkflows].sort(),u=new Set(l),d=[...c.discoveredSerdeFiles].sort().filter(e=>!u.has(e)),f={},h=[...l.map(e=>createWorkflowImport(e,this.config.workingDir)),...d.map(e=>createWorkflowImport(e,this.config.workingDir))].join(`
|
|
2
|
+
`);return await bundleFinalWorkflowOutput({bundleFinalOutput:t,code:getSingleRolldownChunk(await buildWithNitroRolldown({cwd:this.config.workingDir,input:WORKFLOW_VIRTUAL_ENTRY_ID,platform:`neutral`,plugins:[createWorkflowVirtualEntryPlugin(h),createWorkflowPseudoPackagePlugin(),createAshPackageImportsPlugin(this.config.workingDir,{workflowCondition:!0}),createWorkflowTransformPlugin({manifest:f,projectRoot:this.transformProjectRoot,sideEffectFiles:[...l,...d],workingDir:this.config.workingDir}),createWorkflowNodeBuiltinGuardPlugin()],resolve:{conditionNames:[`ash-source`,`workflow`,`node`,`import`,`default`],extensions:[`.ts`,`.tsx`,`.mts`,`.cts`,`.js`,`.jsx`,`.mjs`,`.cjs`],mainFields:[`module`,`main`]},tsconfig:s??!1,write:!1,output:{banner:`globalThis.__private_workflows = new Map();`,codeSplitting:!1,comments:!1,format:`cjs`,sourcemap:`inline`}}),`intermediate workflow bundle for "${o}"`).code,format:r,outfile:o,workingDir:this.config.workingDir}),a?{bundleFinal:async e=>{await bundleFinalWorkflowOutput({bundleFinalOutput:t,code:e,format:r,outfile:o,workingDir:this.config.workingDir})},interimBundleCtx:void 0,manifest:f}:{manifest:f}}async createManifest({manifest:e,manifestDir:n}){let r={version:`1.0.0`,steps:convertStepsManifest(e.steps),workflows:convertWorkflowsManifest(e.workflows),classes:convertClassesManifest(e.classes)},i=JSON.stringify(r,null,2);return await mkdir(n,{recursive:!0}),await writeFile(join(n,`manifest.json`),i),i}async buildVercelOutput(e){await this.build();let n=join(this.#t,`vercel-build-output`,`functions`,`.well-known`,`workflow`,`v1`),r=join(n,`flow.func`),o=join(e.outputDir,`functions`,`.well-known`,`workflow`,`v1`),c=join(e.flowNitroOutputDir,`functions`,`__server.func`),l=join(e.flowNitroOutputDir,`functions`,`.well-known`,`workflow`,`v1`,`flow.func`),u=join(o,`flow.func`),d=join(o,`step.func`),f=join(o,`webhook`,`[token].func`);await copyNitroFunctionDirectory({fallbackPath:c,sourcePath:l,targetPath:r}),await Promise.all([this.#a(r,{experimentalTriggers:Array.from([WORKFLOW_QUEUE_TRIGGER]),maxDuration:`max`,runtime:e.runtime??null,shouldAddHelpers:!1}),cp(join(this.#t,`manifest.json`),join(n,`manifest.json`))]),await retargetNitroFunctionDirectoryToWorkflowRoute({functionDirectoryPath:r,workflowRoutePath:`/.well-known/workflow/v1/flow`}),await Promise.all([rm(u,{force:!0,recursive:!0}),rm(d,{force:!0,recursive:!0}),rm(f,{force:!0,recursive:!0})]),await mkdir(o,{recursive:!0}),await Promise.all([cp(r,u,{recursive:!0}),cp(join(n,`manifest.json`),join(o,`manifest.json`))])}async#i(){return[...await this.getInputFiles(),this.#e]}async#a(e,n){let r=join(e,`.vc-config.json`),i=await this.#o(r),a={...i};a.environment=createWorkflowFunctionEnvironment(i.environment),n.runtime!==null&&(a.runtime=n.runtime),n.maxDuration!==void 0&&(a.maxDuration=n.maxDuration),n.shouldAddHelpers!==void 0&&(a.shouldAddHelpers=n.shouldAddHelpers),n.shouldAddSourcemapSupport!==void 0&&(a.shouldAddSourcemapSupport=n.shouldAddSourcemapSupport),n.experimentalTriggers!==void 0&&(a.experimentalTriggers=[...n.experimentalTriggers]),await writeFile(r,`${JSON.stringify(a,null,2)}\n`)}async#o(e){try{let t=JSON.parse(await readFile(e,`utf8`));if(typeof t==`object`&&t)return t}catch{}return{}}};async function addStepRegistrationsImport(t,n){let r=await readTextFileIfPresent(t);if(r===null||r.includes(`__ashWorkflowStepsRegistered`))return;let i=createRelativeImportSpecifier(dirname(t),n),a=[`import { __steps_registered as __ashWorkflowStepsRegistered } from ${JSON.stringify(i)};`,`void __ashWorkflowStepsRegistered;`,``].join(`
|
|
3
3
|
`),o=r.match(/^import\s.+?;\n/m);if(o===null||o.index===void 0){await atomicWriteFile(t,`${a}${r}`);return}let s=o.index+o[0].length;await atomicWriteFile(t,`${r.slice(0,s)}${a}${r.slice(s)}`)}async function rewriteWorkflowRuntimeImports(e){let t=await readTextFileIfPresent(e);if(t===null)return;let n=t;for(let e of[`workflow`,`workflow/api`,`workflow/internal/builtins`,`workflow/internal/private`,`workflow/runtime`]){let t=normalizeImportSpecifierPath(resolveWorkflowModulePath(e));n=replaceStringLiteralSpecifier(n,e,t)}n!==t&&await atomicWriteFile(e,n)}async function rewriteWorkflowCodeLiteral(e){let t=await readTextFileIfPresent(e);if(t===null)return;let n=t.indexOf(`const workflowCode = `),r=t.lastIndexOf(`;
|
|
4
4
|
|
|
5
5
|
export const POST = workflowEntrypoint(workflowCode);`);if(n===-1||r===-1||r<=n)return;let i=n+21,a=t.slice(i,r);if(!a.trimStart().startsWith("`"))return;let o=decodeWorkflowCodeTemplateLiteral(a,e),s=`${t.slice(0,i)}${encodeWorkflowCodeLiteral(o)}${t.slice(r)}`;s!==t&&await atomicWriteFile(e,s)}function encodeWorkflowCodeLiteral(e){let t=Buffer.from(e,`utf8`).toString(`base64`).match(/.{1,16384}/g)??[``];return`Buffer.from(${JSON.stringify(t)}.join(""), "base64").toString("utf8")`}function decodeWorkflowCodeTemplateLiteral(e,t){let n=e.trim();if(!n.startsWith("`")||!n.endsWith("`"))throw Error(`Expected generated workflow code literal in "${t}" to be a template.`);let r=n.slice(1,-1),i=``;for(let e=0;e<r.length;e+=1){let t=r[e];if(t!==`\\`){i+=t;continue}let n=r[e+1];if(n===`\\`||n==="`"||n===`$`){i+=n,e+=1;continue}i+=t}return i}function replaceStringLiteralSpecifier(e,t,n){return e.replaceAll(JSON.stringify(t),JSON.stringify(n)).replaceAll(`'${t}'`,JSON.stringify(n))}function normalizeImportSpecifierPath(e){return normalizeEsmImportSpecifier(e)}function createRelativeImportSpecifier(e,t){let r=relative(e,t).replaceAll(`\\`,`/`);return r.startsWith(`.`)?r:`./${r}`}async function readTextFileIfPresent(e){try{return await readFile(e,`utf8`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return null;throw e}}async function readBinaryFileIfPresent(e){try{return await readFile(e)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return null;throw e}}async function mirrorFileBypassingUnlink(e,t){let n=await readFile(e),r=await readBinaryFileIfPresent(t);r!==null&&r.equals(n)||await atomicWriteFile(t,n)}export{WorkflowBundleBuilder};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./errors.js";import"./continuation-capability.js";import"./host-interrupt.js";import"./runtime/max-workers.js";import"./runtime/manager.js";import"./run-code-mode.js";import"./approval-continuation.js";import"./interrupt-continuation.js";import"./code-mode-tool.js";
|
|
1
|
+
import"./errors.js";import"./continuation-capability.js";import"./host-interrupt.js";import"./runtime/max-workers.js";import"./runtime/manager.js";import"./run-code-mode.js";import"./approval-continuation.js";import"./interrupt-continuation.js";import"./code-mode-tool.js";export{};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CodeModeAbortedError,CodeModeBridgeLimitError,CodeModeConcurrencyError,CodeModeDetachedBridgeRequestError,CodeModeProtocolError,CodeModeTimeoutError,CodeModeToolApprovalDeniedError,deserializeError,serializeBridgeErrorForGuest,serializeError}from"../errors.js";import{assertCodeModeApprovalResponse}from"../approval-response.js";import{signCodeModeContinuation,verifyCodeModeContinuation}from"../continuation-capability.js";import{executeHostFetch}from"../fetch-policy.js";import{normalizeOptions}from"../options.js";import{toJsonPayload}from"../serialization.js";import{assertSourceSize,transformSource}from"../source-cache.js";import{addTelemetryEvent,endTelemetrySpan,recordTelemetryError,startTelemetrySpan}from"../telemetry.js";import{invokeHostTool}from"../tool-invocation.js";import{getMaxWorkers}from"./max-workers.js";import{INLINE_CODE_MODE_WORKER_SOURCE}from"./worker-source.js";import{randomBytes}from"node:crypto";import{Buffer}from"node:buffer";import{Worker}from"node:worker_threads";let activeInvocations=0,invocationCounter=0,inlineWorkerUrl;const idleWorkers=[];function getCodeModeWorkerUrl(){return getDefaultCodeModeWorkerUrl()}function getDefaultCodeModeWorkerUrl(){return getInlineWorkerUrl()}async function runManagedCodeMode(t){let r=normalizeOptions(t.options),i=getMaxWorkers({memoryLimitBytes:r.memoryLimitBytes,activeWorkers:activeInvocations});if(activeInvocations>=i)throw new CodeModeConcurrencyError(i);activeInvocations++;let a=!0;try{if(t.toolExecutionOptions?.abortSignal?.aborted)throw new CodeModeAbortedError;assertSourceSize(t.js,r.maxSourceBytes);let n=transformSource(t.js);assertContinuationInput({js:n,continuation:t.continuation,approvalResponse:t.approvalResponse,interruptResolution:t.interruptResolution});let o=startWorkerRun({...t,js:n,normalizedOptions:r,maxWorkers:i});return a=!1,o.accountingDone.then(()=>releaseInvocationSlot(r.memoryLimitBytes),()=>releaseInvocationSlot(r.memoryLimitBytes)),await o.result}finally{a&&releaseInvocationSlot(r.memoryLimitBytes)}}function assertContinuationInput({js:e,continuation:t,approvalResponse:n,interruptResolution:r}){if(n!==void 0&&assertCodeModeApprovalResponse(n),n!==void 0&&r!==void 0)throw new CodeModeProtocolError(`A code-mode continuation cannot be resumed with both an approval response and a generic interrupt resolution.`,{approvalId:n.approvalId,interruptId:r.interruptId});if(t===void 0){if(n!==void 0||r!==void 0)throw new CodeModeProtocolError(`A code-mode continuation response was provided without continuation state.`,{hasApprovalResponse:n!==void 0,hasInterruptResolution:r!==void 0});return}if(verifyCodeModeContinuation(t),t.version!==1)throw new CodeModeProtocolError(`Unsupported code-mode continuation version.`,{version:t.version});if(t.js!==e)throw new CodeModeProtocolError(`Code mode continuation source does not match the resumed source.`,{continuationSourceBytes:byteLength(t.js),resumedSourceBytes:byteLength(e)});if(typeof t.outerToolCallId!=`string`)throw new CodeModeProtocolError(`Code mode continuation outerToolCallId must be a string.`,{outerToolCallId:t.outerToolCallId});if(assertDeterminismState(t.determinism),assertContinuationLedgerShape(t),n!==void 0){let e=t.ledger.filter(e=>e.kind===`tool`&&e.status===`approval-required`&&e.approvalId===n.approvalId);if(e.length!==1)throw new CodeModeProtocolError(`Approval response does not match exactly one pending continuation ledger entry.`,{approvalId:n.approvalId,matches:e.length})}if(r!==void 0){let e=t.ledger.filter(e=>e.kind===`tool`&&e.status===`interrupted`&&e.interruptId===r.interruptId);if(e.length!==1)throw new CodeModeProtocolError(`Interrupt resolution does not match exactly one pending continuation ledger entry.`,{interruptId:r.interruptId,matches:e.length})}}function startWorkerRun({js:n,tools:s,toolExecutionOptions:u,options:f,continuation:m,approvalResponse:g,interruptResolution:_,normalizedOptions:v,maxWorkers:y}){let b=`code-mode-${++invocationCounter}`,x=acquireWorker(y),S=x.worker,C=u?.abortSignal,w=new AbortController,T=getMaxNestedToolCounter(m?.ledger??[]),E,D=!1,O=!1,k=!1,A=!1,j=0,M=0,N,P=new Set,F=cloneLedger(m?.ledger??[]),I=m?.determinism??createDeterminismState(),L=u?.context??u?.experimental_context,R=u?.experimental_context??u?.context,z={toolCallId:u?.toolCallId??m?.outerToolCallId??b,messages:u?.messages??[],abortSignal:w.signal,...R===void 0?{}:{experimental_context:R},...L===void 0?{}:{context:L}},B=Date.now(),V={invocationId:b,outerToolCallId:z.toolCallId,status:`completed`,startedAtMs:B,completedAtMs:B,durationMs:0,bridgeRequests:[]},H=!1,U=startTelemetrySpan(f?.telemetry,`ai.code_mode.execute`,{"code_mode.invocation.id":b,"code_mode.outer_tool_call.id":z.toolCallId,"code_mode.continuation":m!==void 0,"code_mode.fetch.enabled":v.fetchEnabled,"code_mode.max_workers":y,...f?.telemetry?.recordInputs===!1?{}:{"code_mode.source.bytes":byteLength(n)}}),emitNestedToolCall=async e=>{await emitLifecycleHook(`onNestedToolCall`,e)},emitNestedToolResult=async e=>{await emitLifecycleHook(`onNestedToolResult`,e)},emitInterrupt=async e=>{await emitLifecycleHook(`onInterrupt`,{invocationId:b,outerToolCallId:z.toolCallId,interrupt:e})},emitLifecycleHook=async(e,t)=>{let n=f?.lifecycle,r=n?.[e];if(r!==void 0)try{await r(t)}catch(r){try{await n?.onHookError?.(r,{hook:e,event:t})}catch{}}},emitFetchRequest=async e=>{await emitLifecycleHook(`onFetchRequest`,e)},emitFetchResult=async e=>{await emitLifecycleHook(`onFetchResult`,e)},emitTrace=async e=>{await emitLifecycleHook(`onTrace`,e)},W,finishTrace=(e,t={})=>{if(H)return W??Promise.resolve();H=!0;let n=Date.now();return V.status=e,V.completedAtMs=n,V.durationMs=Math.max(0,n-V.startedAtMs),t.interruptedBy!==void 0&&(V.interruptedBy=t.interruptedBy,addTelemetryEvent(U,`code_mode.interrupt`,{"code_mode.interrupt.type":t.interruptedBy})),t.error!==void 0&&(V.error=serializeError(t.error),recordTelemetryError(U,t.error)),U?.setAttributes?.({"code_mode.status":e,"code_mode.duration_ms":V.durationMs,"code_mode.bridge_requests.count":V.bridgeRequests.length,"code_mode.bridge_requests.replayed_count":V.bridgeRequests.filter(e=>e.replayed).length}),endTelemetrySpan(U),W=emitTrace(cloneTrace(V)),W},makeToolCallEvent=({bridgeIndex:e,toolName:t,input:n,inputJson:r,toolCallId:i,replayed:a,startedAtMs:o})=>({invocationId:b,outerToolCallId:z.toolCallId,bridgeIndex:e,toolName:t,input:n,inputBytes:byteLength(r),toolCallId:i,replayed:a,startedAtMs:o}),pushToolTrace=e=>{let t={kind:`tool`,bridgeIndex:e.bridgeIndex,toolName:e.toolName,toolCallId:e.toolCallId,status:e.status,replayed:e.replayed,startedAtMs:e.startedAtMs,completedAtMs:e.completedAtMs,durationMs:e.durationMs,inputBytes:e.inputBytes,...e.status===`fulfilled`?{outputBytes:e.outputBytes}:{},...e.status===`rejected`?{error:toTraceError(e.error)}:{},...e.status===`interrupted`?{interruptType:e.interrupt.type}:{}};return V.bridgeRequests.push(t),t},makeFetchRequestEvent=({bridgeIndex:e,inputJson:t,request:n,replayed:r,startedAtMs:i})=>({invocationId:b,outerToolCallId:z.toolCallId,bridgeIndex:e,url:n.url,method:n.method??`GET`,inputBytes:byteLength(t),replayed:r,startedAtMs:i}),pushFetchTrace=e=>{let t={kind:`fetch`,bridgeIndex:e.bridgeIndex,url:e.url,method:e.method,status:e.status,replayed:e.replayed,startedAtMs:e.startedAtMs,completedAtMs:e.completedAtMs,durationMs:e.durationMs,inputBytes:e.inputBytes,...e.status===`fulfilled`?{outputBytes:e.outputBytes}:{},...e.status===`rejected`?{error:toTraceError(e.error)}:{}};return V.bridgeRequests.push(t),t},finishToolEvent=async e=>{pushToolTrace(e),addTelemetryEvent(U,`code_mode.nested_tool.result`,{"code_mode.bridge.index":e.bridgeIndex,"code_mode.tool.name":e.toolName,"code_mode.tool_call.id":e.toolCallId,"code_mode.status":e.status,"code_mode.replayed":e.replayed,...e.status===`fulfilled`&&f?.telemetry?.recordOutputs!==!1?{"code_mode.tool.output.bytes":e.outputBytes}:{}}),await emitNestedToolResult(e)},finishFetchEvent=async e=>{pushFetchTrace(e),addTelemetryEvent(U,`code_mode.fetch.result`,{"code_mode.bridge.index":e.bridgeIndex,"code_mode.fetch.url":e.url,"code_mode.fetch.method":e.method,"code_mode.status":e.status,"code_mode.replayed":e.replayed,...e.status===`fulfilled`&&f?.telemetry?.recordOutputs!==!1?{"code_mode.fetch.output.bytes":e.outputBytes}:{}}),await emitFetchResult(e)},startNestedToolSpan=e=>startTelemetrySpan(f?.telemetry,`ai.code_mode.nested_tool`,{"code_mode.invocation.id":b,"code_mode.outer_tool_call.id":z.toolCallId,"code_mode.bridge.index":e.bridgeIndex,"code_mode.tool.name":e.toolName,"code_mode.tool_call.id":e.toolCallId,"code_mode.replayed":e.replayed,...f?.telemetry?.recordInputs===!1?{}:{"code_mode.tool.input.bytes":e.inputBytes}}),startFetchSpan=e=>startTelemetrySpan(f?.telemetry,`ai.code_mode.fetch`,{"code_mode.invocation.id":b,"code_mode.outer_tool_call.id":z.toolCallId,"code_mode.bridge.index":e.bridgeIndex,"code_mode.fetch.url":e.url,"code_mode.fetch.method":e.method,"code_mode.replayed":e.replayed,...f?.telemetry?.recordInputs===!1?{}:{"code_mode.fetch.input.bytes":e.inputBytes}}),G,K,q=new Promise((e,t)=>{G=e,K=t}),J,Y=new Promise(e=>{J=e}),abortInvocation=e=>{w.signal.aborted||w.abort(e)},cleanupWorker=e=>{A||(A=!0,clearTimeout(X),C?.removeEventListener(`abort`,onAbort),S.off(`message`,onMessage),S.off(`error`,onError),S.off(`exit`,onExit),e?releaseWorker(x):destroyWorker(x))},settleAccountingIfDone=()=>{!O&&D&&M===0&&(O=!0,J())},settleCaller=e=>{if(!D){D=!0,settleAccountingIfDone();try{e()}catch(e){K(e)}finally{settleAccountingIfDone()}}},failTerminal=e=>{k||(k=!0,abortInvocation(e),cleanupWorker(!1),(async()=>{await finishTrace(`failed`,{error:e}),settleCaller(()=>K(e))})())},onAbort=()=>{failTerminal(new CodeModeAbortedError)},X=setTimeout(()=>{failTerminal(new CodeModeTimeoutError(v.timeoutMs))},v.timeoutMs),onMessage=e=>{if(e.invocationId!==b){failTerminal(new CodeModeProtocolError(`Worker message invocationId mismatch: expected ${b}, received ${e.invocationId}.`,{expectedInvocationId:b,receivedInvocationId:e.invocationId,messageType:e.type}));return}if(e.type===`result`){if(E!==void 0){failTerminal(new CodeModeProtocolError(`Worker sent duplicate result for invocation ${b}.`,{invocationId:b}));return}E=e;return}if(e.type===`ready`){handleReadyMessage(e);return}if(e.type===`tool-request`){let t=markWorkerRequest(e);t!==void 0&&handleToolRequest(e,t);return}if(e.type===`fetch-request`){let t=markWorkerRequest(e);t!==void 0&&handleFetchRequest(e,t)}},onError=e=>{failTerminal(e)},onExit=e=>{!k&&e!==0&&failTerminal(Error(`Code mode worker exited with code ${e}.`))};S.on(`message`,onMessage),S.on(`error`,onError),S.on(`exit`,onExit),C?.addEventListener(`abort`,onAbort,{once:!0}),C?.aborted&&onAbort();let Z={type:`run`,invocationId:b,js:n,determinism:I,options:{timeoutMs:v.timeoutMs,memoryLimitBytes:v.memoryLimitBytes,maxStackSizeBytes:v.maxStackSizeBytes,maxResultBytes:v.maxResultBytes,fetchEnabled:v.fetchEnabled}};if(!k)try{S.postMessage(Z)}catch(e){failTerminal(e)}return{result:q,accountingDone:Y};async function handleToolRequest(e,t){let n=F[t-1],r=fromJsonPayload(e.inputJson);try{if(n!==void 0){if(assertReplayEntryMatches(n,{kind:`tool`,name:e.toolName,inputJson:e.inputJson}),n.kind!==`tool`)throw new CodeModeProtocolError(`Continuation replay expected a tool ledger entry.`,{invocationId:b,bridgeIndex:t,kind:n.kind});if(n.status===`fulfilled`){let i=Date.now(),a=makeToolCallEvent({bridgeIndex:t,toolName:e.toolName,input:r,inputJson:e.inputJson,toolCallId:n.toolCallId,replayed:!0,startedAtMs:i});await emitNestedToolCall(a);let o=Date.now();await finishToolEvent({...a,status:`fulfilled`,completedAtMs:o,durationMs:o-i,outputBytes:byteLength(n.valueJson),output:fromJsonPayload(n.valueJson)}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!0,dateNowMs:n.dateNowMs,valueJson:n.valueJson});return}if(n.status===`rejected`){let i=Date.now(),a=makeToolCallEvent({bridgeIndex:t,toolName:e.toolName,input:r,inputJson:e.inputJson,toolCallId:n.toolCallId,replayed:!0,startedAtMs:i});await emitNestedToolCall(a);let o=Date.now();await finishToolEvent({...a,status:`rejected`,completedAtMs:o,durationMs:o-i,error:n.error}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!1,dateNowMs:n.dateNowMs,error:n.error});return}if(n.status===`approval-required`){if(g?.approvalId===n.approvalId&&g.approved===!0){let a=Date.now(),o=makeToolCallEvent({bridgeIndex:t,toolName:e.toolName,input:r,inputJson:e.inputJson,toolCallId:n.toolCallId,replayed:!1,startedAtMs:a});await emitNestedToolCall(o);let c=startNestedToolSpan(o),l=await invokeHostTool({toolName:e.toolName,inputJson:e.inputJson,tools:s,baseExecutionOptions:z,codeModeOptions:f??{},maxToolInputBytes:v.maxToolInputBytes,maxToolOutputBytes:v.maxToolOutputBytes,toolCallId:n.toolCallId,skipApproval:!0}).catch(e=>{throw recordTelemetryError(c,e),e}).finally(()=>endTelemetrySpan(c));if(l.type===`approval-required`)throw new CodeModeProtocolError(`Approved continuation for ${e.toolName} requested approval again.`,{invocationId:b,requestId:e.requestId,toolName:e.toolName,approvalId:n.approvalId});if(l.type===`interrupted`){let r=`${n.toolCallId}:interrupt`;F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:n.toolCallId,interruptId:r,interruptPayload:l.payload,status:`interrupted`},requestInterrupt(t-1);return}let u=Date.now();F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:n.toolCallId,status:`fulfilled`,dateNowMs:u,valueJson:l.valueJson},await finishToolEvent({...o,status:`fulfilled`,completedAtMs:u,durationMs:u-a,outputBytes:byteLength(l.valueJson),output:fromJsonPayload(l.valueJson)}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!0,dateNowMs:u,valueJson:l.valueJson});return}if(g?.approvalId===n.approvalId&&g.approved===!1){let i=new CodeModeToolApprovalDeniedError(n.name,n.approvalInput,n.toolCallId,g.reason),a=serializeError(i),s=serializeBridgeErrorForGuest(i,`tool`),u=Date.now();F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:n.toolCallId,status:`rejected`,dateNowMs:u,error:s},await finishToolEvent({invocationId:b,outerToolCallId:z.toolCallId,bridgeIndex:t,toolName:e.toolName,input:r,inputBytes:byteLength(e.inputJson),toolCallId:n.toolCallId,replayed:!1,startedAtMs:u,status:`rejected`,completedAtMs:u,durationMs:0,error:a}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!1,dateNowMs:u,error:s});return}requestInterrupt(t-1);return}if(n.status===`interrupted`){if(_?.interruptId===n.interruptId){let i={interruptId:n.interruptId,payload:n.interruptPayload,resolution:_.resolution},a=Date.now(),o=makeToolCallEvent({bridgeIndex:t,toolName:e.toolName,input:r,inputJson:e.inputJson,toolCallId:n.toolCallId,replayed:!1,startedAtMs:a});await emitNestedToolCall(o);let c=startNestedToolSpan(o),l=await invokeHostTool({toolName:e.toolName,inputJson:e.inputJson,tools:s,baseExecutionOptions:z,codeModeOptions:f??{},maxToolInputBytes:v.maxToolInputBytes,maxToolOutputBytes:v.maxToolOutputBytes,toolCallId:n.toolCallId,codeModeInterrupt:i,skipApproval:!0}).catch(e=>{throw recordTelemetryError(c,e),e}).finally(()=>endTelemetrySpan(c));if(l.type===`approval-required`){F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:n.toolCallId,approvalId:createApprovalId(n.toolCallId),approvalInput:l.input,status:`approval-required`},requestInterrupt(t-1);return}if(l.type===`interrupted`){F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:n.toolCallId,interruptId:`${n.toolCallId}:interrupt`,interruptPayload:l.payload,status:`interrupted`},requestInterrupt(t-1);return}let u=Date.now();F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:n.toolCallId,status:`fulfilled`,dateNowMs:u,valueJson:l.valueJson},await finishToolEvent({...o,status:`fulfilled`,completedAtMs:u,durationMs:u-a,outputBytes:byteLength(l.valueJson),output:fromJsonPayload(l.valueJson)}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!0,dateNowMs:u,valueJson:l.valueJson});return}if(_!==void 0&&_.interruptId!==n.interruptId)throw new CodeModeProtocolError(`Interrupt resolution ${_.interruptId} does not match pending code-mode interrupt ${n.interruptId}.`,{expectedInterruptId:n.interruptId,receivedInterruptId:_.interruptId});requestInterrupt(t-1);return}return}let a=`${z.toolCallId}:tool-${++T}`,u=Date.now(),d=makeToolCallEvent({bridgeIndex:t,toolName:e.toolName,input:r,inputJson:e.inputJson,toolCallId:a,replayed:!1,startedAtMs:u});await emitNestedToolCall(d);let p=startNestedToolSpan(d),m=await invokeHostTool({toolName:e.toolName,inputJson:e.inputJson,tools:s,baseExecutionOptions:z,codeModeOptions:f??{},maxToolInputBytes:v.maxToolInputBytes,maxToolOutputBytes:v.maxToolOutputBytes,toolCallId:a}).catch(e=>{throw recordTelemetryError(p,e),e}).finally(()=>endTelemetrySpan(p));if(m.type===`approval-required`){F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:a,approvalId:createApprovalId(a),approvalInput:m.input,status:`approval-required`},requestInterrupt(t-1);return}if(m.type===`interrupted`){F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:a,interruptId:`${a}:interrupt`,interruptPayload:m.payload,status:`interrupted`},requestInterrupt(t-1);return}let h=Date.now();F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:a,status:`fulfilled`,dateNowMs:h,valueJson:m.valueJson},await finishToolEvent({...d,status:`fulfilled`,completedAtMs:h,durationMs:h-u,outputBytes:byteLength(m.valueJson),output:fromJsonPayload(m.valueJson)}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!0,dateNowMs:h,valueJson:m.valueJson})}catch(a){if(a instanceof CodeModeProtocolError){failTerminal(a);return}let o=serializeError(a),s=serializeBridgeErrorForGuest(a,`tool`),u=Date.now(),d=n?.kind===`tool`?n.toolCallId:`${z.toolCallId}:tool-${T}`;n?.kind===`tool`&&(n.status===`approval-required`||n.status===`interrupted`)&&(n.status===`approval-required`&&g?.approvalId===n.approvalId&&g.approved===!0||n.status===`interrupted`&&_?.interruptId===n.interruptId)?F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:n.toolCallId,status:`rejected`,dateNowMs:u,error:s}:n===void 0&&(F[t-1]={kind:`tool`,name:e.toolName,inputJson:e.inputJson,toolCallId:d,status:`rejected`,dateNowMs:u,error:s}),await finishToolEvent({invocationId:b,outerToolCallId:z.toolCallId,bridgeIndex:t,toolName:e.toolName,input:r,inputBytes:byteLength(e.inputJson),toolCallId:d,replayed:!1,startedAtMs:u,status:`rejected`,completedAtMs:u,durationMs:0,error:o}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!1,dateNowMs:u,error:s})}finally{M--,settleInterruptIfReady(),settleAccountingIfDone()}}async function handleFetchRequest(e,t){let n=JSON.stringify(e.request),r=F[t-1];try{if(r!==void 0){if(assertReplayEntryMatches(r,{kind:`fetch`,name:e.request.url,inputJson:n}),r.kind!==`fetch`)throw new CodeModeProtocolError(`Continuation replay expected a fetch ledger entry.`,{invocationId:b,bridgeIndex:t,kind:r.kind});if(r.status===`fulfilled`){let i=Date.now(),a=makeFetchRequestEvent({bridgeIndex:t,inputJson:n,request:e.request,replayed:!0,startedAtMs:i});await emitFetchRequest(a);let o=Date.now();await finishFetchEvent({...a,status:`fulfilled`,completedAtMs:o,durationMs:o-i,outputBytes:byteLength(r.valueJson)}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!0,dateNowMs:r.dateNowMs,valueJson:r.valueJson});return}if(r.status===`rejected`){let i=Date.now(),a=makeFetchRequestEvent({bridgeIndex:t,inputJson:n,request:e.request,replayed:!0,startedAtMs:i});await emitFetchRequest(a);let o=Date.now();await finishFetchEvent({...a,status:`rejected`,completedAtMs:o,durationMs:o-i,error:r.error}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!1,dateNowMs:r.dateNowMs,error:r.error});return}throw new CodeModeProtocolError(`Continuation ledger entry for fetch cannot be interrupted.`,{invocationId:b,requestId:e.requestId})}let a=Date.now(),o=makeFetchRequestEvent({bridgeIndex:t,inputJson:n,request:e.request,replayed:!1,startedAtMs:a});await emitFetchRequest(o);let s=startFetchSpan(o),c=toJsonPayload(await executeHostFetch({request:e.request,fetch:v.fetch,policy:v.fetchPolicy,signal:w.signal}).catch(e=>{throw recordTelemetryError(s,e),e}).finally(()=>endTelemetrySpan(s)),v.maxResultBytes,`fetch response`),l=Date.now();F[t-1]={kind:`fetch`,name:e.request.url,inputJson:n,status:`fulfilled`,dateNowMs:l,valueJson:c},await finishFetchEvent({...o,status:`fulfilled`,completedAtMs:l,durationMs:l-a,outputBytes:byteLength(c)}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!0,dateNowMs:l,valueJson:c})}catch(a){if(a instanceof CodeModeProtocolError){failTerminal(a);return}let o=serializeError(a),s=serializeBridgeErrorForGuest(a,`fetch`),u=Date.now();r===void 0&&(F[t-1]={kind:`fetch`,name:e.request.url,inputJson:n,status:`rejected`,dateNowMs:u,error:s}),await finishFetchEvent({invocationId:b,outerToolCallId:z.toolCallId,bridgeIndex:t,url:e.request.url,method:e.request.method??`GET`,inputBytes:byteLength(n),replayed:!1,startedAtMs:u,status:`rejected`,completedAtMs:u,durationMs:0,error:o}),postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!1,dateNowMs:u,error:s})}finally{M--,settleInterruptIfReady(),settleAccountingIfDone()}}function markWorkerRequest(e){if(!k&&N===void 0){if(E!==void 0){failTerminal(new CodeModeProtocolError(`Worker sent ${e.type} after result for invocation ${b}.`,{invocationId:b,requestId:e.requestId,messageType:e.type}));return}if(P.has(e.requestId)){failTerminal(new CodeModeProtocolError(`Worker reused requestId ${e.requestId} for invocation ${b}.`,{invocationId:b,requestId:e.requestId,messageType:e.type}));return}if(P.add(e.requestId),j>=v.maxBridgeRequests){let n=new CodeModeBridgeLimitError(`Code mode exceeded the maxBridgeRequests limit (${v.maxBridgeRequests}).`,{invocationId:b,requestId:e.requestId,maxBridgeRequests:v.maxBridgeRequests});postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!1,dateNowMs:Date.now(),error:serializeBridgeErrorForGuest(n,`bridge`)});return}if(M>=v.maxInFlightBridgeRequests){let n=new CodeModeBridgeLimitError(`Code mode exceeded the maxInFlightBridgeRequests limit (${v.maxInFlightBridgeRequests}).`,{invocationId:b,requestId:e.requestId,maxInFlightBridgeRequests:v.maxInFlightBridgeRequests});postBridgeResponse({type:`bridge-response`,invocationId:b,requestId:e.requestId,success:!1,dateNowMs:Date.now(),error:serializeBridgeErrorForGuest(n,`bridge`)});return}return j++,M++,j}}function postBridgeResponse(e){if(!(k||A))try{S.postMessage(e)}catch(e){failTerminal(e)}}function requestInterrupt(e){N??=e}function settleInterruptIfReady(){if(N===void 0||k||M>0)return;let e=N,t=F[e];if(t===void 0||t.kind!==`tool`){failTerminal(new CodeModeProtocolError(`Code mode interruption references a missing tool ledger entry.`,{invocationId:b,interruptEntryIndex:N}));return}if(t.status!==`approval-required`&&t.status!==`interrupted`){failTerminal(new CodeModeProtocolError(`Code mode interruption references a non-pending ledger entry.`,{invocationId:b,interruptEntryIndex:N,status:t.status}));return}let r=signCodeModeContinuation({version:1,js:n,outerToolCallId:z.toolCallId,determinism:{...I},ledger:cloneLedger(F)}),a=t.status===`approval-required`?createApprovalInterrupt(t,r):createGenericInterrupt(t,r);k=!0,abortInvocation(a),cleanupWorker(!1),(async()=>{let n=Date.now(),r=makeToolCallEvent({bridgeIndex:e+1,toolName:t.name,input:fromJsonPayload(t.inputJson),inputJson:t.inputJson,toolCallId:t.toolCallId,replayed:!1,startedAtMs:n});t.status===`interrupted`?await finishToolEvent({...r,status:`interrupted`,completedAtMs:n,durationMs:0,interrupt:a}):await finishToolEvent({...r,status:`approval-required`,completedAtMs:n,durationMs:0,approvalId:t.approvalId}),await emitInterrupt(a),await finishTrace(`interrupted`,{interruptedBy:a.type}),settleCaller(()=>G(a))})()}function createApprovalInterrupt(e,t){return{type:`code-mode-approval-required`,approvalId:e.approvalId,toolCallId:e.toolCallId,toolName:e.name,input:e.approvalInput,continuation:t}}function createGenericInterrupt(e,t){let n={type:`code-mode-interrupt`,interruptId:e.interruptId,kind:e.interruptPayload.kind,toolCallId:e.toolCallId,toolName:e.name,input:fromJsonPayload(e.inputJson),payload:structuredClone(e.interruptPayload)},r={type:`code-mode-pending-continuation`,version:1,outerToolCallId:t.outerToolCallId,interruptId:e.interruptId,requestMessages:[],continuation:t,interrupt:n};return{...n,pendingContinuation:r}}async function handleReadyMessage(e){if(k)return;if(N!==void 0){settleInterruptIfReady();return}if(E===void 0){failTerminal(new CodeModeProtocolError(`Code mode worker became ready without a result for ${e.invocationId}.`,{invocationId:e.invocationId}));return}let t=E;if(t.invocationId!==e.invocationId){failTerminal(new CodeModeProtocolError(`Worker result/ready invocationId mismatch: result was ${t.invocationId}, ready was ${e.invocationId}.`,{resultInvocationId:t.invocationId,readyInvocationId:e.invocationId}));return}if(k=!0,M>0){let e=t.success?new CodeModeDetachedBridgeRequestError(`Code mode returned while ${M} bridge request(s) were still in flight.`,{invocationId:b,inFlightBridgeRequests:M,totalBridgeRequests:j}):deserializeResultError(t);abortInvocation(e),cleanupWorker(!1),await finishTrace(`failed`,{error:e}),settleCaller(()=>K(e));return}if(m!==void 0&&j<F.length){let e=new CodeModeProtocolError(`Code mode continuation returned before replaying the full bridge ledger.`,{invocationId:b,replayedBridgeRequests:j,ledgerEntries:F.length,nextLedgerEntry:F[j]});abortInvocation(e),cleanupWorker(!1),await finishTrace(`failed`,{error:e}),settleCaller(()=>K(e));return}t.success?await finishTrace(`completed`):await finishTrace(`failed`,{error:deserializeResultError(t)}),cleanupWorker(!0),settleCaller(()=>settleWithResultMessage(t,G,K))}}function acquireWorker(e){let t=idleWorkers.pop();for(;t?.destroyed;)t=idleWorkers.pop();return t??=createWorker(),t.worker.removeAllListeners(`exit`),t.worker.ref(),trimIdleWorkers(Math.max(0,e-activeInvocations)),t}function createWorker(){return{worker:new Worker(getInlineWorkerUrl()),destroyed:!1}}function getInlineWorkerUrl(){return inlineWorkerUrl??=new URL(`data:text/javascript;base64,${Buffer.from(INLINE_CODE_MODE_WORKER_SOURCE).toString(`base64`)}`),inlineWorkerUrl}function releaseWorker(e){e.destroyed||(e.worker.once(`exit`,()=>{e.destroyed=!0;let t=idleWorkers.indexOf(e);t!==-1&&idleWorkers.splice(t,1)}),e.worker.unref(),idleWorkers.push(e))}function destroyWorker(e){e.destroyed||(e.destroyed=!0,e.worker.removeAllListeners(),e.worker.terminate())}function trimIdleWorkers(e){for(;idleWorkers.length>e;){let e=idleWorkers.pop();e!==void 0&&destroyWorker(e)}}function releaseInvocationSlot(e){activeInvocations=Math.max(0,activeInvocations-1);let t=getMaxWorkers({memoryLimitBytes:e,activeWorkers:activeInvocations});trimIdleWorkers(Math.max(0,t-activeInvocations))}function deserializeResultError(e){return deserializeError(e.error??{name:`Error`,message:`Unknown worker error.`})}function settleWithResultMessage(e,t,n){if(!e.success){n(deserializeResultError(e));return}t(e.valueJson===``||e.valueJson===void 0?void 0:JSON.parse(e.valueJson))}function fromJsonPayload(e){return e===``?void 0:JSON.parse(e)}function cloneLedger(e){return e.map(e=>{switch(e.status){case`fulfilled`:return{...e};case`rejected`:return{...e,error:{...e.error}};case`approval-required`:return{...e,approvalInput:structuredClone(e.approvalInput)};case`interrupted`:return{...e,interruptPayload:structuredClone(e.interruptPayload)};default:return e}})}function assertReplayEntryMatches(e,t){if(e.kind!==t.kind||e.name!==t.name||e.inputJson!==t.inputJson)throw new CodeModeProtocolError(`Code mode continuation replay diverged from the recorded bridge ledger.`,{expected:{kind:e.kind,name:e.name,inputJson:e.inputJson},received:t})}function assertDeterminismState(e){if(!Number.isFinite(e.dateNowMs)||!Number.isInteger(e.dateNowMs))throw new CodeModeProtocolError(`Code mode continuation determinism dateNowMs must be an integer.`,{dateNowMs:e.dateNowMs});if(!/^[0-9a-f]{32}$/i.test(e.randomSeed))throw new CodeModeProtocolError(`Code mode continuation determinism randomSeed must be a 128-bit hex string.`,{randomSeed:e.randomSeed})}function assertContinuationLedgerShape(e){let t=new Set;for(let[n,r]of e.ledger.entries()){if(r.kind!==`tool`&&r.kind!==`fetch`)throw new CodeModeProtocolError(`Code mode continuation ledger entry has an unknown kind.`,{index:n,kind:r.kind});if(typeof r.name!=`string`)throw new CodeModeProtocolError(`Code mode continuation ledger entry name must be a string.`,{index:n,name:r.name});if(assertJsonPayload(r.inputJson,`ledger[${n}].inputJson`),r.kind===`fetch`){if(r.status===`fulfilled`){assertFiniteDateNow(r.dateNowMs,n),assertJsonPayload(r.valueJson,`ledger[${n}].valueJson`);continue}if(r.status===`rejected`){assertFiniteDateNow(r.dateNowMs,n),assertSerializableError(r.error,n);continue}throw new CodeModeProtocolError(`Fetch continuation ledger entry cannot be pending.`,{index:n,status:r.status})}if(typeof r.toolCallId!=`string`||!r.toolCallId.startsWith(`${e.outerToolCallId}:tool-`))throw new CodeModeProtocolError(`Tool continuation ledger entry has an unexpected toolCallId.`,{index:n,toolCallId:r.toolCallId,outerToolCallId:e.outerToolCallId});if(t.has(r.toolCallId))throw new CodeModeProtocolError(`Tool continuation ledger contains a duplicate toolCallId.`,{index:n,toolCallId:r.toolCallId});switch(t.add(r.toolCallId),r.status){case`fulfilled`:assertFiniteDateNow(r.dateNowMs,n),assertJsonPayload(r.valueJson,`ledger[${n}].valueJson`);break;case`rejected`:assertFiniteDateNow(r.dateNowMs,n),assertSerializableError(r.error,n);break;case`approval-required`:if(typeof r.approvalId!=`string`||!r.approvalId.startsWith(`${r.toolCallId}:approval-`))throw new CodeModeProtocolError(`Approval continuation ledger entry has an unexpected approvalId.`,{index:n,toolCallId:r.toolCallId,approvalId:r.approvalId});break;case`interrupted`:if(r.interruptId!==`${r.toolCallId}:interrupt`)throw new CodeModeProtocolError(`Generic interruption ledger entry has an unexpected interruptId.`,{index:n,toolCallId:r.toolCallId,interruptId:r.interruptId});if(typeof r.interruptPayload!=`object`||r.interruptPayload===null||Array.isArray(r.interruptPayload)||typeof r.interruptPayload.kind!=`string`||r.interruptPayload.kind.length===0)throw new CodeModeProtocolError(`Generic interruption ledger entry payload must include a string kind.`,{index:n,interruptPayload:r.interruptPayload});break;default:throw new CodeModeProtocolError(`Tool continuation ledger entry has an unknown status.`,{index:n,status:r.status})}}}function assertJsonPayload(e,t){if(typeof e!=`string`)throw new CodeModeProtocolError(`${t} must be a string.`,{value:e});if(e!==``)try{JSON.parse(e)}catch(e){throw new CodeModeProtocolError(`${t} must be valid JSON.`,{cause:e instanceof Error?e.message:String(e)})}}function assertFiniteDateNow(e,t){if(!Number.isFinite(e)||!Number.isInteger(e))throw new CodeModeProtocolError(`Continuation ledger dateNowMs must be an integer.`,{index:t,dateNowMs:e})}function assertSerializableError(e,t){let n=e;if(typeof e!=`object`||!e||Array.isArray(e)||typeof n.name!=`string`||typeof n.message!=`string`)throw new CodeModeProtocolError(`Rejected continuation ledger entry has an invalid serialized error.`,{index:t,error:e})}function getMaxNestedToolCounter(e){let t=0;for(let n of e){if(n.kind!==`tool`)continue;let e=/:tool-(\d+)$/.exec(n.toolCallId);e&&(t=Math.max(t,Number(e[1])))}return t}function createDeterminismState(){return{dateNowMs:Date.now(),randomSeed:randomBytes(16).toString(`hex`)}}function createApprovalId(e){return`${e}:approval-${randomBytes(16).toString(`hex`)}`}function byteLength(e){return new TextEncoder().encode(e).byteLength}function toTraceError(e){return isSerializableError(e)?{name:e.name,message:e.message,...e.stack===void 0?{}:{stack:e.stack},...e.code===void 0?{}:{code:e.code},...e.details===void 0?{}:{details:e.details}}:serializeError(e)}function isSerializableError(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return typeof t.name==`string`&&typeof t.message==`string`&&(t.stack===void 0||typeof t.stack==`string`)&&(t.code===void 0||typeof t.code==`string`)}function cloneTrace(e){return{...e,bridgeRequests:e.bridgeRequests.map(e=>({...e,...e.error===void 0?{}:{error:{...e.error}}})),...e.error===void 0?{}:{error:{...e.error}}}}export{getCodeModeWorkerUrl,getDefaultCodeModeWorkerUrl,runManagedCodeMode};
|