experimental-ash 0.30.0 → 0.31.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 +17 -0
- package/dist/src/cli/run.d.ts +0 -1
- package/dist/src/cli/run.js +2 -2
- package/dist/src/compiled/.vendor-stamp.json +6 -6
- package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +2 -2
- package/dist/src/compiled/@ai-sdk/anthropic/index.js +2 -2
- package/dist/src/compiled/@ai-sdk/anthropic/package.json +1 -1
- package/dist/src/compiled/@ai-sdk/google/index.d.ts +14 -1
- package/dist/src/compiled/@ai-sdk/google/index.js +6 -6
- package/dist/src/compiled/@ai-sdk/google/package.json +1 -1
- package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
- package/dist/src/compiled/@ai-sdk/mcp/package.json +1 -1
- package/dist/src/compiled/@ai-sdk/openai/index.js +2 -2
- package/dist/src/compiled/@ai-sdk/openai/package.json +1 -1
- package/dist/src/compiled/@ai-sdk/otel/index.js +1 -1
- package/dist/src/compiled/@ai-sdk/otel/package.json +1 -1
- package/dist/src/compiled/@vercel/sandbox/index.d.ts +34 -11
- package/dist/src/compiled/_chunks/workflow/{dist-DZZY3Zyp.js → dist-Dl-X5RB3.js} +1 -1
- package/dist/src/compiled/just-bash/index.d.ts +48 -0
- package/dist/src/execution/await-authorization-orchestrator.d.ts +2 -0
- package/dist/src/execution/await-authorization-orchestrator.js +1 -1
- package/dist/src/execution/code-mode-authorization-lifecycle.d.ts +15 -0
- package/dist/src/execution/code-mode-authorization-lifecycle.js +1 -0
- package/dist/src/execution/connection-auth-steps.d.ts +15 -0
- package/dist/src/execution/connection-auth-steps.js +1 -1
- package/dist/src/execution/connection-auth-tool-result.d.ts +2 -0
- package/dist/src/execution/connection-auth-tool-result.js +1 -0
- package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
- package/dist/src/execution/node-step.d.ts +12 -1
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/remote-agent-dispatch.js +1 -1
- package/dist/src/execution/sandbox/bash-tool.js +1 -1
- package/dist/src/execution/sandbox/bindings/local.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
- package/dist/src/execution/sandbox/glob-tool.js +1 -1
- package/dist/src/execution/sandbox/grep-tool.js +1 -1
- package/dist/src/execution/sandbox/ripgrep-probe.js +1 -1
- package/dist/src/execution/sandbox/session.d.ts +3 -1
- package/dist/src/execution/sandbox/session.js +1 -1
- package/dist/src/execution/sandbox/shell-quote.d.ts +1 -1
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/workflow-callback-url.d.ts +12 -0
- package/dist/src/execution/workflow-callback-url.js +1 -0
- package/dist/src/execution/workflow-entry.js +1 -1
- package/dist/src/execution/workflow-steps.d.ts +2 -0
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/code-mode-approval.d.ts +22 -0
- package/dist/src/harness/code-mode-approval.js +1 -0
- package/dist/src/harness/code-mode.d.ts +31 -0
- package/dist/src/harness/code-mode.js +1 -0
- package/dist/src/harness/input-extraction.js +1 -1
- package/dist/src/harness/step-hooks.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/nitro/host/build-application.js +1 -1
- package/dist/src/internal/nitro/host/code-mode-worker-asset.d.ts +18 -0
- package/dist/src/internal/nitro/host/code-mode-worker-asset.js +1 -0
- package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
- package/dist/src/internal/nitro/host/create-application-nitro.d.ts +0 -1
- package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
- package/dist/src/internal/nitro/host/dev-authored-source-watcher.d.ts +0 -1
- package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
- package/dist/src/internal/nitro/host/dispatch-schedule-in-dev.d.ts +41 -0
- package/dist/src/internal/nitro/host/dispatch-schedule-in-dev.js +1 -0
- package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
- package/dist/src/internal/nitro/host/start-development-server.d.ts +6 -1
- package/dist/src/internal/nitro/host/start-development-server.js +1 -1
- package/dist/src/internal/nitro/routes/dev-schedule-dispatch.d.ts +15 -0
- package/dist/src/internal/nitro/routes/dev-schedule-dispatch.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/approval-continuation.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/approval-response.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/code-mode-tool.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/continuation-capability.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/errors.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/fetch-policy.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/host-interrupt.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/index.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/interrupt-continuation.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/options.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/run-code-mode.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_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.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/runtime/max-workers.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/runtime-assets.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/serialization.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/source-cache.js +4 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/telemetry.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/tool-invocation.js +1 -0
- package/dist/src/node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/tool-prompt.js +9 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/checks.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/coerce.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/compat.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/errors.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/from-json-schema.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/iso.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/parse.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/api.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/checks.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/core.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/doc.js +3 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/errors.js +2 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/index.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/json-schema-generator.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/json-schema-processors.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/json-schema.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/parse.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/regexes.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/registries.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/schemas.js +60 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/to-json-schema.js +3 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/util.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/versions.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ar.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/az.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/be.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/bg.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ca.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/cs.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/da.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/de.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/el.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/en.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/eo.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/es.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/fa.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/fi.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/fr-CA.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/fr.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/he.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/hr.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/hu.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/hy.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/id.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/index.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/is.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/it.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ja.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ka.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/kh.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/km.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ko.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/lt.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/mk.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ms.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/nl.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/no.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ota.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/pl.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ps.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/pt.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ro.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ru.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/sl.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/sv.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ta.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/th.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/tr.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ua.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/uk.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ur.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/uz.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/vi.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/yo.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/zh-CN.js +1 -0
- package/dist/src/node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/zh-TW.js +1 -0
- package/dist/src/protocol/routes.d.ts +20 -0
- package/dist/src/protocol/routes.js +1 -1
- package/dist/src/public/definitions/sandbox.d.ts +1 -1
- package/dist/src/public/sandbox/index.d.ts +1 -1
- package/dist/src/runtime/agent/mock-model-adapter.js +4 -3
- package/dist/src/runtime/framework-tools/code-mode-connection-auth.d.ts +32 -0
- package/dist/src/runtime/framework-tools/code-mode-connection-auth.js +1 -0
- package/dist/src/runtime/framework-tools/connection-search.d.ts +3 -0
- package/dist/src/runtime/framework-tools/connection-search.js +1 -1
- package/dist/src/runtime/framework-tools/connection-tools.d.ts +18 -1
- package/dist/src/runtime/framework-tools/connection-tools.js +1 -1
- package/dist/src/runtime/resolve-agent-graph.js +1 -1
- package/dist/src/shared/code-mode.d.ts +2 -0
- package/dist/src/shared/code-mode.js +1 -0
- package/dist/src/shared/sandbox-session.d.ts +38 -10
- package/package.json +9 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CODE_MODE_QUICKJS_WASM_FILE_NAME,CODE_MODE_QUICKJS_WASM_SPECIFIER,CODE_MODE_WORKER_FILE_NAME,CODE_MODE_WORKER_SPECIFIER}from"../../../node_modules/.pnpm/experimental-ai-sdk-code-mode@1.0.7_ai@7.0.0-canary.154_zod@4.4.3_/node_modules/experimental-ai-sdk-code-mode/dist/runtime-assets.js";import{isBuiltin}from"node:module";import{join}from"node:path";import{readFile,readdir,writeFile}from"node:fs/promises";import{fileURLToPath}from"node:url";import{buildWithNitroRolldown,getSingleRolldownChunk}from"#internal/bundler/nitro-rolldown.js";const MODULE_PACKAGE_JSON=`${JSON.stringify({type:`module`},null,2)}\n`;let codeModeWorkerBundlePromise;async function materializeCodeModeWorkerAssets(e){let t=await findCodeModeBundleDirectories(e);if(t.size===0)return;let n=await getCodeModeWorkerBundle();await Promise.all([...t].map(e=>writeCodeModeWorkerBundle(e,n)))}async function materializeCodeModeWorkerRuntimeAssets(e){await writeCodeModeWorkerBundle(e,await getCodeModeWorkerBundle())}async function findCodeModeBundleDirectories(e){let t=new Set;async function visit(e){let n;try{n=await readdir(e,{withFileTypes:!0})}catch(e){if(isMissingFileError(e))return;throw e}await Promise.all(n.map(async n=>{let r=join(e,n.name);if(n.isDirectory()){await visit(r);return}n.isFile()&&n.name===`experimental-ai-sdk-code-mode.mjs`&&t.add(e)}))}return await visit(e),t}function isMissingFileError(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}async function getCodeModeWorkerBundle(){return codeModeWorkerBundlePromise??=bundleCodeModeWorker(),await codeModeWorkerBundlePromise}async function bundleCodeModeWorker(){let n=await buildWithNitroRolldown({input:resolveCodeModeWorkerEntryPath(),platform:`node`,write:!1,external(e){return isBuiltin(e)},output:{codeSplitting:!1,comments:!1,format:`esm`,sourcemap:!1}}),r=n.output.filter(e=>e.type===`asset`).map(e=>({fileName:e.fileName,source:e.source}));return r.some(e=>e.fileName===`emscripten-module.wasm`)||r.push({fileName:CODE_MODE_QUICKJS_WASM_FILE_NAME,source:await readFile(resolvePackageAssetPath(CODE_MODE_QUICKJS_WASM_SPECIFIER))}),{assets:r,code:getSingleRolldownChunk(n,`code-mode worker asset`).code}}async function writeCodeModeWorkerBundle(e,t){await Promise.all([writeFile(join(e,CODE_MODE_WORKER_FILE_NAME),t.code),...t.assets.map(t=>writeFile(join(e,t.fileName),t.source)),writeFile(join(e,`package.json`),MODULE_PACKAGE_JSON)])}function resolveCodeModeWorkerEntryPath(){return resolvePackageAssetPath(CODE_MODE_WORKER_SPECIFIER)}function resolvePackageAssetPath(e){return fileURLToPath(import.meta.resolve(e))}export{materializeCodeModeWorkerAssets,materializeCodeModeWorkerRuntimeAssets};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{ASH_HEALTH_ROUTE_PATH,ASH_INFO_ROUTE_PATH}from"#protocol/routes.js";import{dirname,join,relative}from"node:path";import{mkdir,writeFile}from"node:fs/promises";import{resolvePackageRoot,resolvePackageSourceFilePath,resolveWorkflowModulePath}from"#internal/application/package.js";import{normalizeEsmImportSpecifier,stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";import{WorkflowBundleBuilder}from"#internal/workflow-bundle/builder.js";import{WORKFLOW_RUNS_API_ROUTE_PATH,WORKFLOW_RUN_EVENTS_ROUTE_PATTERN,WORKFLOW_RUN_ROUTE_PATTERN,WORKFLOW_RUN_STEPS_ROUTE_PATTERN}from"#internal/nitro/routes/workflow-route-helpers.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{computeChannelRouteRegistrations,registerChannelVirtualHandlers}from"#internal/nitro/host/channel-routes.js";function includesApplicationRoutes(e){return e===`all`||e===`app`}function includesWorkflowBundles(e){return includesWorkflowRoute(e)}function includesWorkflowRoute(e){return e===`all`||e===`flow`}function registerHandler(e,t){let n=`#ash-route-handler/${t.method??`ALL`} ${t.route}`,r=stringifyEsmImportSpecifier(t.handlerPath);e.options.handlers.push({handler:n,method:t.method,route:t.route}),e.options.virtual[n]=[`import handler from ${r};`,`export default handler;`].join(`
|
|
2
|
-
`)}function resolveNitroWorkflowBuildDirectory(e){return join(e.options.buildDir,`workflow`)}function createRelativeImportSpecifier(e,t){let n=relative(e,t).replaceAll(`\\`,`/`);return n.startsWith(`.`)?n:`./${n}`}async function addWorkflowFileHandler(e,t){let
|
|
1
|
+
import{ASH_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN,ASH_HEALTH_ROUTE_PATH,ASH_INFO_ROUTE_PATH}from"#protocol/routes.js";import{dirname,join,relative}from"node:path";import{mkdir,writeFile}from"node:fs/promises";import{resolvePackageRoot,resolvePackageSourceFilePath,resolveWorkflowModulePath}from"#internal/application/package.js";import{normalizeEsmImportSpecifier,stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";import{WorkflowBundleBuilder}from"#internal/workflow-bundle/builder.js";import{WORKFLOW_RUNS_API_ROUTE_PATH,WORKFLOW_RUN_EVENTS_ROUTE_PATTERN,WORKFLOW_RUN_ROUTE_PATTERN,WORKFLOW_RUN_STEPS_ROUTE_PATTERN}from"#internal/nitro/routes/workflow-route-helpers.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{computeChannelRouteRegistrations,registerChannelVirtualHandlers}from"#internal/nitro/host/channel-routes.js";function includesApplicationRoutes(e){return e===`all`||e===`app`}function includesWorkflowBundles(e){return includesWorkflowRoute(e)}function includesWorkflowRoute(e){return e===`all`||e===`flow`}function registerHandler(e,t){let n=`#ash-route-handler/${t.method??`ALL`} ${t.route}`,r=stringifyEsmImportSpecifier(t.handlerPath);e.options.handlers.push({handler:n,method:t.method,route:t.route}),e.options.virtual[n]=[`import handler from ${r};`,`export default handler;`].join(`
|
|
2
|
+
`)}function resolveNitroWorkflowBuildDirectory(e){return join(e.options.buildDir,`workflow`)}function createRelativeImportSpecifier(e,t){let n=relative(e,t).replaceAll(`\\`,`/`);return n.startsWith(`.`)?n:`./${n}`}async function addWorkflowFileHandler(e,t){let n=join(resolveNitroWorkflowBuildDirectory(e),`${t.bundleName}-handler.mjs`),i=dirname(n),s=createRelativeImportSpecifier(i,t.bundlePath),c=(t.directHandlers??[]).map(e=>{let t=createRelativeImportSpecifier(i,e.bundlePath);return{importSpecifier:t,isOwnBundle:t===s,queuePrefix:e.queuePrefix}});await mkdir(i,{recursive:!0}),await writeFile(n,buildWorkflowFileHandlerSource({bundlePath:s,directHandlers:c,runtimeImportSpecifier:t.runtimeImportSpecifier})),e.options.handlers.push({handler:n,route:t.route})}function buildWorkflowFileHandlerSource(e){let t=[`// Generated by Ash. Do not edit by hand.`,`import { POST } from ${JSON.stringify(e.bundlePath)};`];if(e.directHandlers.length>0&&e.runtimeImportSpecifier!==void 0){let n=0,r=e.directHandlers.map(e=>{if(e.isOwnBundle)return{...e,binding:`POST`};let t=`__ashWorkflowDirectHandler${n}`;return n+=1,{...e,binding:t}});for(let e of r)e.isOwnBundle||t.push(`import { POST as ${e.binding} } from ${JSON.stringify(e.importSpecifier)};`);t.push(`import { getWorld as __ashGetWorkflowWorld } from ${JSON.stringify(e.runtimeImportSpecifier)};`,``,`try {`,` const __ashWorkflowWorld = await __ashGetWorkflowWorld();`,` if (typeof __ashWorkflowWorld?.registerHandler === "function") {`);for(let e of r)t.push(` __ashWorkflowWorld.registerHandler(${JSON.stringify(e.queuePrefix)}, ${e.binding});`);t.push(` }`,`} catch (err) {`,` console.warn("[ash] Failed to register direct workflow queue handlers:", err);`,`}`)}return t.push(``,`export default async ({ req }) => {`,` return await POST(req);`,`};`,``),t.join(`
|
|
3
3
|
`)}function addFrameworkVirtualHandler(e,t){let n=`#ash-route${t.route}`,r=stringifyEsmImportSpecifier(t.modulePath);e.options.handlers.push({handler:n,method:t.method,route:t.route}),e.options.virtual[n]=[`import { ${t.handlerExport} } from ${r};`,`export default async (event) => ${t.handlerExport}(${t.args}, event.req);`].join(`
|
|
4
|
-
`)}async function configureNitroRoutes(
|
|
4
|
+
`)}async function configureNitroRoutes(r,i,a){if(includesWorkflowBundles(a.surface)){let e=resolvePackageRoot(),t=new WorkflowBundleBuilder({appRoot:i.appRoot,compiledArtifactsBootstrapPath:i.compiledArtifacts.bootstrapPath,outDir:i.workflowBuildDir,rootDir:e,watch:r.options.dev}),n=Promise.resolve(),buildWorkflowArtifacts=async()=>{await t.build({nitroStepOutfile:includesWorkflowRoute(a.surface)?join(resolveNitroWorkflowBuildDirectory(r),`steps.mjs`):void 0,nitroWorkflowOutfile:r.options.dev&&includesWorkflowRoute(a.surface)?join(resolveNitroWorkflowBuildDirectory(r),`workflows.mjs`):void 0})},syncWorkflowArtifacts=async()=>{let e=n.then(buildWorkflowArtifacts);n=e.catch(()=>{}),await e},o=!0;await syncWorkflowArtifacts(),r.hooks.hook(`build:before`,async()=>{if(o){o=!1;return}await syncWorkflowArtifacts()}),r.options.dev&&r.hooks.hook(`dev:reload`,async()=>{await syncWorkflowArtifacts()})}let o=createNitroArtifactsConfig({appRoot:i.appRoot,dev:r.options.dev});includesApplicationRoutes(a.surface)&&(registerHandler(r,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/index.ts`),method:`GET`,route:`/`}),registerHandler(r,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/health.ts`),method:`GET`,route:ASH_HEALTH_ROUTE_PATH}),addFrameworkVirtualHandler(r,{args:JSON.stringify({appRoot:o.appRoot}),handlerExport:`handleAgentInfoRequest`,method:`GET`,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/info.ts`),route:ASH_INFO_ROUTE_PATH}),registerHandler(r,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/workflow-runs.ts`),method:`GET`,route:WORKFLOW_RUNS_API_ROUTE_PATH}),registerHandler(r,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/workflow-run.ts`),method:`GET`,route:WORKFLOW_RUN_ROUTE_PATTERN}),registerHandler(r,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/workflow-run-steps.ts`),method:`GET`,route:WORKFLOW_RUN_STEPS_ROUTE_PATTERN}),registerHandler(r,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/workflow-run-events.ts`),method:`GET`,route:WORKFLOW_RUN_EVENTS_ROUTE_PATTERN}),registerChannelVirtualHandlers(r,{artifactsConfig:o,registrations:computeChannelRouteRegistrations(i)}),r.options.dev&&addFrameworkVirtualHandler(r,{args:JSON.stringify({appRoot:o.appRoot}),handlerExport:`handleDevScheduleDispatchRequest`,method:`POST`,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/dev-schedule-dispatch.ts`),route:ASH_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN}));let l=resolveNitroWorkflowBuildDirectory(r),u=includesWorkflowRoute(a.surface)?r.options.dev?join(l,`workflows.mjs`):join(i.workflowBuildDir,`workflows.mjs`):void 0,d=r.options.dev&&u!==void 0?[{bundlePath:u,queuePrefix:`__wkf_workflow_`}]:[],f=d.length>0?normalizeEsmImportSpecifier(resolveWorkflowModulePath(`workflow/runtime`)):void 0;u&&await addWorkflowFileHandler(r,{bundleName:`workflows`,bundlePath:u,directHandlers:d,route:`/.well-known/workflow/v1/flow`,runtimeImportSpecifier:f}),r.routing.sync()}export{configureNitroRoutes};
|
|
@@ -10,6 +10,5 @@ import type { NitroBuildSurface, PreparedApplicationHost } from "#internal/nitro
|
|
|
10
10
|
*/
|
|
11
11
|
export declare function createApplicationNitro(preparedHost: PreparedApplicationHost, dev: boolean, options?: {
|
|
12
12
|
outputDir?: string;
|
|
13
|
-
schedules?: boolean;
|
|
14
13
|
surface?: NitroBuildSurface;
|
|
15
14
|
}): Promise<Nitro>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{dirname,isAbsolute,join,relative,resolve}from"node:path";import{readFile}from"node:fs/promises";import{resolveNitroBuildDirectory}from"#internal/application/paths.js";import{resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath}from"#internal/application/package.js";import{ASH_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";import{createNitro}from"nitro/builder";import{prepareAshVersionedCacheDirectory,writeAshVersionedCacheMetadata}from"#internal/application/cache-metadata.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{createCompiledSandboxBackendPrunePlugin}from"#internal/nitro/host/compiled-sandbox-backend-prune-plugin.js";import{configureNitroRoutes}from"#internal/nitro/host/configure-nitro-routes.js";import{applyAshCronHandlerRoute}from"#internal/nitro/host/cron-handler-route.js";import{createNitroBundlerConfig}from"#internal/nitro/host/nitro-bundler-config.js";import{addNitroRoutingImportSpecifierPlugin}from"#internal/nitro/host/nitro-routing-import-specifier-plugin.js";import{registerScheduleTaskHandlers}from"#internal/nitro/host/schedule-task-routes.js";import{SERVER_EXTERNAL_PACKAGES}from"#internal/nitro/host/server-external-packages.js";import{createAshVercelOptions}from"#internal/nitro/host/vercel-build-output-config.js";import{applyWorkflowTransform}from"#internal/workflow-bundle/workflow-builders.js";const WORKFLOW_ALIAS_SPECIFIERS=[`workflow`,`workflow/api`,`workflow/errors`,`workflow/internal/builtins`,`workflow/internal/private`,`workflow/runtime`],WORKFLOW_TRANSFORM_PATCHED=Symbol(`ash.workflow-transform-patched`),FRAMEWORK_HOSTED_EXTERNAL_PACKAGES=[`@napi-rs/keyring`];function resolveWorkflowAliases(){let e={};for(let t of WORKFLOW_ALIAS_SPECIFIERS)e[t]=resolveWorkflowModulePath(t);return e}function resolveNitroPreset(e){if(!e&&process.env.VERCEL)return`vercel`}function includesApplicationSurface(e){return e===`all`||e===`app`}function includesWorkflowSurface(e){return e===`all`||e===`flow`}function includesWorkflowStepRegistrations(e){return includesWorkflowSurface(e)}function resolveWorkflowStepEntrypointPath(e,t){return e.options.dev?join(e.options.buildDir,`workflow`,`steps.mjs`):join(t.workflowBuildDir,`steps.mjs`)}function collectHostedTraceDependencies(e){let t=e.compileResult.manifest.config.build;return[...new Set([...FRAMEWORK_HOSTED_EXTERNAL_PACKAGES,...SERVER_EXTERNAL_PACKAGES,...t?.externalDependencies??[]])].filter(e=>e!==ASH_PACKAGE_NAME)}function normalizePath(e){return e.replaceAll(`\\`,`/`)}function stripPathQueryAndHash(e){let t=e.indexOf(`?`),n=e.indexOf(`#`),r=t===-1?n:n===-1?t:Math.min(t,n);return r===-1?e:e.slice(0,r)}function stripFileSystemPrefix(e){return e.startsWith(`/@fs/`)?e.slice(4):e}function resolveNitroModuleComparisonPath(e,n){return n.startsWith(`file://`)?normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(fileURLToPath(n)))):isAbsolute(n)?normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(n))):normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(resolve(e,n))))}function isWorkflowBundlePath(e,t){let n=normalizePath(e);return n.startsWith(t)||n.includes(`/.ash/workflow-cache/`)}function normalizeStepTransformComparisonPath(e){let t=normalizePath(e);return process.platform===`win32`?t.toLowerCase():t}function parseImportedModuleSpecifiers(e){let t=/^\s*import\s+(?:.+?\s+from\s+)?["']([^"']+)["'];?\s*$/gm,n=[];for(let r of e.matchAll(t)){let e=r[1];e!==void 0&&n.push(e)}return n}function resolveNitroImportPath(t,n,r){return n.startsWith(`workflow`)?resolveWorkflowModulePath(n):n.startsWith(`.`)||n.startsWith(`/`)||n.startsWith(`file://`)?resolveNitroModuleComparisonPath(r===void 0?t:dirname(resolveNitroModuleComparisonPath(t,r)),n):null}async function collectNitroStepTransformTargets(e,t){let n=await readFile(e,`utf8`),r=new Set;for(let i of parseImportedModuleSpecifiers(n)){let n=resolveNitroImportPath(t,i,e);n!==null&&r.add(normalizeStepTransformComparisonPath(n))}return r}async function addNitroStepNoExternals(e,t){if(e.options.noExternals===!0)return;let n;try{n=await collectNitroStepTransformTargets(t,e.options.rootDir)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let r=Array.isArray(e.options.noExternals)?[...e.options.noExternals]:[];e.options.noExternals=[...new Set([...r,...n])]}function createRelativeTransformFilename(e,t){let n=normalizePath(e).replace(/\/$/,``),i=normalizePath(t),a=n.toLowerCase(),o=i.toLowerCase();if(o.startsWith(`${a}/`))return i.slice(n.length+1);if(o===a)return`.`;let s=relative(n,i).replaceAll(`\\`,`/`);if(s.startsWith(`../`)&&(s=s.split(`/`).filter(e=>e!==`..`).join(`/`)),s.includes(`:`)||s.startsWith(`/`)){let e=i.split(`/`).pop();return e===void 0||e.length===0?`unknown.ts`:e}return s}function addWorkflowModuleSideEffectsPlugin(e,t){let r=[t,join(e.options.buildDir,`workflow`)].map(t=>resolveNitroModuleComparisonPath(e.options.rootDir,t));e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({name:`ash:workflow-module-side-effects`,resolveId(t,n){let i=resolveNitroImportPath(e.options.rootDir,t,n)??resolveNitroModuleComparisonPath(e.options.rootDir,t);return r.some(e=>isWorkflowBundlePath(i,e))?{id:i,moduleSideEffects:`no-treeshake`}:null}})})}function addNitroStepModuleSideEffectsPlugin(e,t){let n=null,getStepTransformTargets=async()=>(n===null&&(n=await collectNitroStepTransformTargets(t.stepEntrypointPath,e.options.rootDir)),n);e.hooks.hook(`build:before`,()=>{n=null}),e.options.dev&&e.hooks.hook(`dev:reload`,()=>{n=null}),e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({name:`ash:workflow-step-module-side-effects`,async resolveId(t,n){let r=resolveNitroImportPath(e.options.rootDir,t,n);return r===null||!(await getStepTransformTargets()).has(normalizeStepTransformComparisonPath(r))?null:{id:r,moduleSideEffects:`no-treeshake`}}})})}function addNitroStepTransformPlugin(e,t){let n=null,getStepTransformTargets=async()=>(n===null&&(n=await collectNitroStepTransformTargets(t.stepEntrypointPath,e.options.rootDir)),n);e.hooks.hook(`build:before`,()=>{n=null}),e.options.dev&&e.hooks.hook(`dev:reload`,()=>{n=null}),e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({async transform(t,n){let r=await getStepTransformTargets(),i=resolveNitroModuleComparisonPath(e.options.rootDir,n);return r.has(normalizeStepTransformComparisonPath(i))?{code:(await applyWorkflowTransform(createRelativeTransformFilename(e.options.rootDir,i),t,`step`,i,e.options.rootDir)).code,map:null}:null},name:`ash:workflow-step-transform`})})}function addInstrumentationModuleSideEffectsPlugin(e,t){let n=normalizePath(t);e.hooks.hook(`rollup:before`,(e,t)=>{Array.isArray(t.plugins)&&t.plugins.unshift({name:`ash:instrumentation-module-side-effects`,resolveId(e){return normalizePath(e)===n?{id:e,moduleSideEffects:`no-treeshake`}:null}})})}function patchWorkflowTransformExcludePath(e,t){let n=normalizePath(t);e.hooks.hook(`rollup:before`,(e,t)=>{if(Array.isArray(t.plugins))for(let e of t.plugins){if(typeof e!=`object`||!e)continue;let t=e;if(t.name!==`workflow:transform`||t[WORKFLOW_TRANSFORM_PATCHED]===!0||typeof t.transform!=`function`)continue;let r=t.transform;t.transform=function(e,t,...i){return isWorkflowBundlePath(t,n)?null:r.call(this,e,t,...i)},t[WORKFLOW_TRANSFORM_PATCHED]=!0}})}async function createApplicationNitro(e,t,r={}){let i=r.surface??`all`,a
|
|
1
|
+
import{dirname,isAbsolute,join,relative,resolve}from"node:path";import{readFile}from"node:fs/promises";import{resolveNitroBuildDirectory}from"#internal/application/paths.js";import{resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath}from"#internal/application/package.js";import{ASH_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";import{createNitro}from"nitro/builder";import{prepareAshVersionedCacheDirectory,writeAshVersionedCacheMetadata}from"#internal/application/cache-metadata.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{createCompiledSandboxBackendPrunePlugin}from"#internal/nitro/host/compiled-sandbox-backend-prune-plugin.js";import{configureNitroRoutes}from"#internal/nitro/host/configure-nitro-routes.js";import{applyAshCronHandlerRoute}from"#internal/nitro/host/cron-handler-route.js";import{createNitroBundlerConfig}from"#internal/nitro/host/nitro-bundler-config.js";import{addNitroRoutingImportSpecifierPlugin}from"#internal/nitro/host/nitro-routing-import-specifier-plugin.js";import{registerScheduleTaskHandlers}from"#internal/nitro/host/schedule-task-routes.js";import{SERVER_EXTERNAL_PACKAGES}from"#internal/nitro/host/server-external-packages.js";import{createAshVercelOptions}from"#internal/nitro/host/vercel-build-output-config.js";import{applyWorkflowTransform}from"#internal/workflow-bundle/workflow-builders.js";const WORKFLOW_ALIAS_SPECIFIERS=[`workflow`,`workflow/api`,`workflow/errors`,`workflow/internal/builtins`,`workflow/internal/private`,`workflow/runtime`],WORKFLOW_TRANSFORM_PATCHED=Symbol(`ash.workflow-transform-patched`),FRAMEWORK_HOSTED_EXTERNAL_PACKAGES=[`@napi-rs/keyring`];function resolveWorkflowAliases(){let e={};for(let t of WORKFLOW_ALIAS_SPECIFIERS)e[t]=resolveWorkflowModulePath(t);return e}function resolveNitroPreset(e){if(!e&&process.env.VERCEL)return`vercel`}function includesApplicationSurface(e){return e===`all`||e===`app`}function includesWorkflowSurface(e){return e===`all`||e===`flow`}function includesWorkflowStepRegistrations(e){return includesWorkflowSurface(e)}function resolveWorkflowStepEntrypointPath(e,t){return e.options.dev?join(e.options.buildDir,`workflow`,`steps.mjs`):join(t.workflowBuildDir,`steps.mjs`)}function collectHostedTraceDependencies(e){let t=e.compileResult.manifest.config.build;return[...new Set([...FRAMEWORK_HOSTED_EXTERNAL_PACKAGES,...SERVER_EXTERNAL_PACKAGES,...t?.externalDependencies??[]])].filter(e=>e!==ASH_PACKAGE_NAME)}function normalizePath(e){return e.replaceAll(`\\`,`/`)}function stripPathQueryAndHash(e){let t=e.indexOf(`?`),n=e.indexOf(`#`),r=t===-1?n:n===-1?t:Math.min(t,n);return r===-1?e:e.slice(0,r)}function stripFileSystemPrefix(e){return e.startsWith(`/@fs/`)?e.slice(4):e}function resolveNitroModuleComparisonPath(e,n){return n.startsWith(`file://`)?normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(fileURLToPath(n)))):isAbsolute(n)?normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(n))):normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(resolve(e,n))))}function isWorkflowBundlePath(e,t){let n=normalizePath(e);return n.startsWith(t)||n.includes(`/.ash/workflow-cache/`)}function normalizeStepTransformComparisonPath(e){let t=normalizePath(e);return process.platform===`win32`?t.toLowerCase():t}function parseImportedModuleSpecifiers(e){let t=/^\s*import\s+(?:.+?\s+from\s+)?["']([^"']+)["'];?\s*$/gm,n=[];for(let r of e.matchAll(t)){let e=r[1];e!==void 0&&n.push(e)}return n}function resolveNitroImportPath(t,n,r){return n.startsWith(`workflow`)?resolveWorkflowModulePath(n):n.startsWith(`.`)||n.startsWith(`/`)||n.startsWith(`file://`)?resolveNitroModuleComparisonPath(r===void 0?t:dirname(resolveNitroModuleComparisonPath(t,r)),n):null}async function collectNitroStepTransformTargets(e,t){let n=await readFile(e,`utf8`),r=new Set;for(let i of parseImportedModuleSpecifiers(n)){let n=resolveNitroImportPath(t,i,e);n!==null&&r.add(normalizeStepTransformComparisonPath(n))}return r}async function addNitroStepNoExternals(e,t){if(e.options.noExternals===!0)return;let n;try{n=await collectNitroStepTransformTargets(t,e.options.rootDir)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let r=Array.isArray(e.options.noExternals)?[...e.options.noExternals]:[];e.options.noExternals=[...new Set([...r,...n])]}function createRelativeTransformFilename(e,t){let n=normalizePath(e).replace(/\/$/,``),i=normalizePath(t),a=n.toLowerCase(),o=i.toLowerCase();if(o.startsWith(`${a}/`))return i.slice(n.length+1);if(o===a)return`.`;let s=relative(n,i).replaceAll(`\\`,`/`);if(s.startsWith(`../`)&&(s=s.split(`/`).filter(e=>e!==`..`).join(`/`)),s.includes(`:`)||s.startsWith(`/`)){let e=i.split(`/`).pop();return e===void 0||e.length===0?`unknown.ts`:e}return s}function addWorkflowModuleSideEffectsPlugin(e,t){let r=[t,join(e.options.buildDir,`workflow`)].map(t=>resolveNitroModuleComparisonPath(e.options.rootDir,t));e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({name:`ash:workflow-module-side-effects`,resolveId(t,n){let i=resolveNitroImportPath(e.options.rootDir,t,n)??resolveNitroModuleComparisonPath(e.options.rootDir,t);return r.some(e=>isWorkflowBundlePath(i,e))?{id:i,moduleSideEffects:`no-treeshake`}:null}})})}function addNitroStepModuleSideEffectsPlugin(e,t){let n=null,getStepTransformTargets=async()=>(n===null&&(n=await collectNitroStepTransformTargets(t.stepEntrypointPath,e.options.rootDir)),n);e.hooks.hook(`build:before`,()=>{n=null}),e.options.dev&&e.hooks.hook(`dev:reload`,()=>{n=null}),e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({name:`ash:workflow-step-module-side-effects`,async resolveId(t,n){let r=resolveNitroImportPath(e.options.rootDir,t,n);return r===null||!(await getStepTransformTargets()).has(normalizeStepTransformComparisonPath(r))?null:{id:r,moduleSideEffects:`no-treeshake`}}})})}function addNitroStepTransformPlugin(e,t){let n=null,getStepTransformTargets=async()=>(n===null&&(n=await collectNitroStepTransformTargets(t.stepEntrypointPath,e.options.rootDir)),n);e.hooks.hook(`build:before`,()=>{n=null}),e.options.dev&&e.hooks.hook(`dev:reload`,()=>{n=null}),e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({async transform(t,n){let r=await getStepTransformTargets(),i=resolveNitroModuleComparisonPath(e.options.rootDir,n);return r.has(normalizeStepTransformComparisonPath(i))?{code:(await applyWorkflowTransform(createRelativeTransformFilename(e.options.rootDir,i),t,`step`,i,e.options.rootDir)).code,map:null}:null},name:`ash:workflow-step-transform`})})}function addInstrumentationModuleSideEffectsPlugin(e,t){let n=normalizePath(t);e.hooks.hook(`rollup:before`,(e,t)=>{Array.isArray(t.plugins)&&t.plugins.unshift({name:`ash:instrumentation-module-side-effects`,resolveId(e){return normalizePath(e)===n?{id:e,moduleSideEffects:`no-treeshake`}:null}})})}function patchWorkflowTransformExcludePath(e,t){let n=normalizePath(t);e.hooks.hook(`rollup:before`,(e,t)=>{if(Array.isArray(t.plugins))for(let e of t.plugins){if(typeof e!=`object`||!e)continue;let t=e;if(t.name!==`workflow:transform`||t[WORKFLOW_TRANSFORM_PATCHED]===!0||typeof t.transform!=`function`)continue;let r=t.transform;t.transform=function(e,t,...i){return isWorkflowBundlePath(t,n)?null:r.call(this,e,t,...i)},t[WORKFLOW_TRANSFORM_PATCHED]=!0}})}async function createApplicationNitro(e,t,r={}){let i=r.surface??`all`,a=!t&&includesApplicationSurface(i)&&e.scheduleRegistrations.length>0,c=resolveNitroPreset(t),l=c===`vercel`?createCompiledSandboxBackendPrunePlugin():null,u=l===null?[]:[l],d=createNitroBundlerConfig(u),f=createNitroBundlerConfig(u),p=collectHostedTraceDependencies(e),m=resolveNitroBuildDirectory(e.appRoot,i),h=e.compiledArtifacts.instrumentationPluginPath===void 0?[e.compiledArtifacts.bootstrapPath]:[e.compiledArtifacts.instrumentationPluginPath,e.compiledArtifacts.bootstrapPath];await prepareAshVersionedCacheDirectory(m);let g=await createNitro({_cli:{command:t?`dev`:`build`},buildDir:m,dev:t,logLevel:t?1:void 0,output:r.outputDir===void 0?void 0:{dir:r.outputDir},preset:c,plugins:h,publicAssets:[],scanDirs:includesWorkflowStepRegistrations(i)?[resolvePackageSourceDirectoryPath(`src/execution`)]:void 0,rolldownConfig:d,rollupConfig:f,rootDir:e.appRoot,serverDir:!1,traceDeps:p,vercel:createAshVercelOptions(c===`vercel`&&includesApplicationSurface(i))},t?{watch:!0}:void 0);if(await writeAshVersionedCacheMetadata(m),addNitroRoutingImportSpecifierPlugin(g),includesWorkflowSurface(i)){let t=resolveWorkflowAliases();for(let[e,n]of Object.entries(t))g.options.alias[e]=n;addWorkflowModuleSideEffectsPlugin(g,e.workflowBuildDir),patchWorkflowTransformExcludePath(g,e.workflowBuildDir)}if(includesWorkflowStepRegistrations(i)){let t=resolveWorkflowStepEntrypointPath(g,e);addNitroStepModuleSideEffectsPlugin(g,{stepEntrypointPath:t}),addNitroStepTransformPlugin(g,{stepEntrypointPath:t})}if(e.compiledArtifacts.instrumentationSourcePath!==void 0&&addInstrumentationModuleSideEffectsPlugin(g,e.compiledArtifacts.instrumentationSourcePath),t&&includesWorkflowSurface(i)){let t=e.workflowBuildDir,r=new Set([normalizePath(join(t,`workflows.mjs`))]);g.hooks.hook(`rollup:before`,(e,t)=>{let n=t.external;t.external=(e,...t)=>{if(r.has(normalizePath(e)))return!0;if(typeof n==`function`)return n(e,...t)}})}return a&&(applyAshCronHandlerRoute(g),registerScheduleTaskHandlers(g,{artifactsConfig:createNitroArtifactsConfig({appRoot:e.appRoot,dev:g.options.dev}),dispatchModulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/schedule-task.ts`),registrations:e.scheduleRegistrations})),await configureNitroRoutes(g,e,{surface:i}),includesWorkflowStepRegistrations(i)&&await addNitroStepNoExternals(g,resolveWorkflowStepEntrypointPath(g,e)),g}export{createApplicationNitro};
|
|
@@ -25,6 +25,5 @@ export interface AuthoredSourceWatcherHandle {
|
|
|
25
25
|
export declare function startAuthoredSourceWatcher(input: {
|
|
26
26
|
nitro: DevelopmentWatcherNitro;
|
|
27
27
|
preparedHost: PreparedApplicationHost;
|
|
28
|
-
schedulesEnabled?: boolean;
|
|
29
28
|
}): Promise<AuthoredSourceWatcherHandle>;
|
|
30
29
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire}from"node:module";import{toErrorMessage}from"#shared/errors.js";import{dirname,isAbsolute,join,resolve}from"node:path";import{readFile,readdir}from"node:fs/promises";import{existsSync}from"node:fs";import{
|
|
1
|
+
import{createRequire}from"node:module";import{toErrorMessage}from"#shared/errors.js";import{dirname,isAbsolute,join,resolve}from"node:path";import{readFile,readdir}from"node:fs/promises";import{existsSync}from"node:fs";import{getDevelopmentEnvironmentFilePaths,loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{clearCompiledRuntimeAgentBundleCache}from"#runtime/sessions/compiled-agent-cache.js";import{parse}from"#compiled/jsonc-parser/index.js";import{prepareApplicationHost}from"#internal/nitro/host/prepare-application-host.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{computeChannelRouteRegistrations,syncChannelVirtualHandlers}from"#internal/nitro/host/channel-routes.js";import{watch}from"#compiled/chokidar/index.js";import{prewarmAppSandboxes}from"#execution/sandbox/prewarm.js";const WATCHED_LOCKFILE_NAMES=[`pnpm-lock.yaml`,`package-lock.json`,`yarn.lock`,`bun.lock`,`bun.lockb`],WATCH_ROOT_MARKER_NAMES=[`.git`,`pnpm-workspace.yaml`],WATCHER_IGNORED_PATTERNS=[`**/.ash/**`,`**/.git/**`,`**/.output/**`,`**/.turbo/**`,`**/.vercel/**`,`**/.workflow-data/**`,`**/node_modules/**`];async function startAuthoredSourceWatcher(e){let n=e.preparedHost,r=!1,i=Promise.resolve(),a,o=new Set,s=new Set,c=await resolveAuthoredWatchPaths(n),l=createWatchPathMap(c),u=watch(c,{awaitWriteFinish:{pollInterval:50,stabilityThreshold:160},followSymlinks:!1,ignoreInitial:!0,ignored:WATCHER_IGNORED_PATTERNS}),f=waitForWatcherReady(u),flush=()=>{r||(i=i.then(async()=>{if(r)return;let i=o.size,a=[...s];o.clear(),s.clear();let c=n,d=hasDevelopmentEnvironmentFileChange(c.appRoot,a);console.log(`[ash:dev] change detected (${i} event${i===1?``:`s`}), rebuilding authored artifacts...`);try{d&&loadDevelopmentEnvironmentFiles(c.appRoot);let t=await prepareApplicationHost(c.appRoot);await prewarmAppSandboxes({appRoot:t.appRoot,log:e=>console.log(e)});let r=createNitroArtifactsConfig({appRoot:t.appRoot,dev:e.nitro.options.dev===!0}),i=syncChannelVirtualHandlers(e.nitro,{artifactsConfig:r,next:computeChannelRouteRegistrations(t),previous:computeChannelRouteRegistrations(c)});clearCompiledRuntimeAgentBundleCache(),n=t,i||d?(console.log(`[ash:dev] structural change detected, reloading Nitro worker...`),await e.nitro.hooks.callHook(`rollup:reload`)):console.log(`[ash:dev] authored artifacts updated.`),l=syncWatcherPaths({nextWatchPaths:await resolveAuthoredWatchPaths(t),previousWatchPathsByKey:l,watcher:u})}catch(e){console.error(`[ash:dev] rebuild failed: ${toErrorMessage(e)}`)}}).catch(e=>{console.error(`[ash:dev] rebuild queue error: ${toErrorMessage(e)}`)}))};return u.on(`all`,(e,t)=>{r||(o.add(`${e}:${t}`),s.add(t),a!==void 0&&clearTimeout(a),a=setTimeout(()=>{a=void 0,flush()},120))}),await f,{async close(){r=!0,a!==void 0&&(clearTimeout(a),a=void 0),await u.close(),await i}}}async function waitForWatcherReady(e){await new Promise((t,n)=>{e.on(`ready`,()=>{t()}),e.on(`error`,e=>{n(e)})})}async function resolveAuthoredWatchPaths(e){let t=new Set([e.compileResult.project.agentRoot,join(e.appRoot,`package.json`),join(e.appRoot,`jsconfig.json`),join(e.appRoot,`tsconfig.json`),join(e.appRoot,`tsconfig.*.json`)]),n=await resolveTsConfigWatchPaths(e.appRoot);for(let n of getDevelopmentEnvironmentFilePaths(e.appRoot))t.add(n);for(let e of n)t.add(e);for(let n of resolveLockfileSearchDirectories(e.appRoot))for(let e of WATCHED_LOCKFILE_NAMES)t.add(join(n,e));return[...t].sort((e,t)=>e.localeCompare(t))}function createWatchPathMap(e){let t=new Map;for(let n of e)t.set(toWatchPathKey(n),n);return t}function syncWatcherPaths(e){let t=createWatchPathMap(e.nextWatchPaths),n=[],r=[];for(let[r,i]of t)e.previousWatchPathsByKey.has(r)||n.push(i);for(let[n,i]of e.previousWatchPathsByKey)t.has(n)||r.push(i);return n.length>0&&e.watcher.add(n),r.length>0&&e.watcher.unwatch(r),t}function toWatchPathKey(e){return e.replaceAll(`\\`,`/`)}function hasDevelopmentEnvironmentFileChange(e,t){let n=new Set(getDevelopmentEnvironmentFilePaths(e).map(e=>toWatchPathKey(resolve(e))));return t.some(e=>n.has(toWatchPathKey(resolve(e))))}function resolveLockfileSearchDirectories(e){let t=[],r=resolve(e);for(;t.push(r),!hasWatchRootMarker(r);){let e=dirname(r);if(e===r)break;r=e}return t}function hasWatchRootMarker(e){return WATCH_ROOT_MARKER_NAMES.some(t=>existsSync(join(e,t)))}async function resolveTsConfigWatchPaths(e){let t=await resolveRootTsConfigPaths(e),n=new Set,r=new Set;for(let e of t)await collectTsConfigWatchPaths({configPath:e,resolvedConfigPaths:n,visitingConfigPaths:r});return[...n].sort((e,t)=>e.localeCompare(t))}async function resolveRootTsConfigPaths(e){let t=new Set([join(e,`tsconfig.json`),join(e,`jsconfig.json`)]);try{let n=await readdir(e,{withFileTypes:!0});for(let r of n)r.isFile()&&/^tsconfig\..+\.json$/i.test(r.name)&&t.add(join(e,r.name))}catch{}return[...t]}async function collectTsConfigWatchPaths(e){let t=resolve(e.configPath);if(e.resolvedConfigPaths.has(t)||e.visitingConfigPaths.has(t))return;let n=await readTextFileIfExists(t);if(n!==void 0){e.resolvedConfigPaths.add(t),e.visitingConfigPaths.add(t);try{let r=extractTsConfigExtendsSpecifiers(n);for(let n of r)for(let r of resolveTsConfigExtendsTargetPaths({configPath:t,extendsSpecifier:n}))await collectTsConfigWatchPaths({configPath:r,resolvedConfigPaths:e.resolvedConfigPaths,visitingConfigPaths:e.visitingConfigPaths})}finally{e.visitingConfigPaths.delete(t)}}}async function readTextFileIfExists(e){try{return await readFile(e,`utf8`)}catch{return}}function extractTsConfigExtendsSpecifiers(e){let t=[],n=parse(e,t,{allowTrailingComma:!0});if(t.length>0||typeof n!=`object`||!n||Array.isArray(n))return[];let r=n.extends;return typeof r==`string`?r.length>0?[r]:[]:Array.isArray(r)?r.filter(e=>typeof e==`string`&&e.length>0):[]}function resolveTsConfigExtendsTargetPaths(e){let t=new Set;if(isTsConfigFilePath(e.extendsSpecifier))for(let n of resolveFileExtendsCandidates({configPath:e.configPath,extendsSpecifier:e.extendsSpecifier}))t.add(n);else for(let n of resolvePackageExtendsCandidates({configPath:e.configPath,extendsSpecifier:e.extendsSpecifier}))t.add(n);return[...t]}function resolveFileExtendsCandidates(e){let t=resolve(dirname(e.configPath),e.extendsSpecifier),r=new Set;return r.add(t),t.endsWith(`.json`)||(r.add(`${t}.json`),r.add(join(t,`tsconfig.json`))),[...r]}function resolvePackageExtendsCandidates(t){let n=new Set([t.extendsSpecifier]);t.extendsSpecifier.endsWith(`.json`)||(n.add(`${t.extendsSpecifier}.json`),n.add(`${t.extendsSpecifier}/tsconfig.json`));let r=new Set,i=createRequire(t.configPath);for(let e of n)try{r.add(i.resolve(e))}catch{}return[...r]}function isTsConfigFilePath(e){return e.startsWith(`.`)||isAbsolute(e)?!0:/^[A-Za-z]:[\\/]/.test(e)}export{startAuthoredSourceWatcher};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of dispatching one authored schedule via the dev-only HTTP route.
|
|
3
|
+
*/
|
|
4
|
+
export interface DispatchScheduleInDevResult {
|
|
5
|
+
readonly scheduleId: string;
|
|
6
|
+
readonly sessionIds: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Error raised when the dev-only schedule dispatch route is given a
|
|
10
|
+
* schedule id that does not match any compiled authored schedule.
|
|
11
|
+
*
|
|
12
|
+
* The route handler maps this to an HTTP 404 with the list of available
|
|
13
|
+
* schedule ids so callers can correct their request without grepping the
|
|
14
|
+
* server's logs.
|
|
15
|
+
*/
|
|
16
|
+
export declare class UnknownDevScheduleError extends Error {
|
|
17
|
+
readonly availableScheduleIds: readonly string[];
|
|
18
|
+
readonly scheduleId: string;
|
|
19
|
+
constructor(scheduleId: string, availableScheduleIds: readonly string[]);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Dispatches one compiled authored schedule in-process inside the running
|
|
23
|
+
* dev server. Used by the dev-only `POST /ash/v1/dev/schedules/:scheduleId`
|
|
24
|
+
* HTTP route to fire a schedule out-of-band without registering it with
|
|
25
|
+
* Nitro's cron scheduler.
|
|
26
|
+
*
|
|
27
|
+
* The dispatch path is the same one the production cron handler uses:
|
|
28
|
+
* `dispatchScheduleTask` resolves the compiled schedule, loads the agent
|
|
29
|
+
* bundle, and invokes `ScheduleDispatcher.trigger(...)`. The dev server's
|
|
30
|
+
* workflow runtime owns the resulting sessions, so the caller can stream
|
|
31
|
+
* them via the existing `/ash/v1/session/:sessionId/stream` route as soon
|
|
32
|
+
* as this resolves.
|
|
33
|
+
*
|
|
34
|
+
* Re-resolves authored schedule registrations from disk on every call so
|
|
35
|
+
* the route picks up edits made by the authored-source watcher without a
|
|
36
|
+
* dev-server restart.
|
|
37
|
+
*/
|
|
38
|
+
export declare function dispatchScheduleInDev(input: {
|
|
39
|
+
readonly appRoot: string;
|
|
40
|
+
readonly scheduleId: string;
|
|
41
|
+
}): Promise<DispatchScheduleInDevResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createAuthoredSourceRuntimeCompiledArtifactsSource}from"#internal/application/runtime-compiled-artifacts-source.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{createScheduleRegistrations}from"#runtime/schedules/register.js";import{loadResolvedCompiledSchedules}from"#runtime/schedules/resolve-schedule.js";var UnknownDevScheduleError=class extends Error{availableScheduleIds;scheduleId;constructor(e,t){let n=t.length===0?`No schedules are defined in this app.`:`Available schedules: ${t.map(e=>`"${e}"`).join(`, `)}.`;super(`Unknown schedule "${e}". ${n}`),this.name=`UnknownDevScheduleError`,this.scheduleId=e,this.availableScheduleIds=t}};async function dispatchScheduleInDev(r){let i=createScheduleRegistrations(await loadResolvedCompiledSchedules({compiledArtifactsSource:createAuthoredSourceRuntimeCompiledArtifactsSource(r.appRoot)})),a=i.find(e=>e.scheduleId===r.scheduleId);if(a===void 0)throw new UnknownDevScheduleError(r.scheduleId,i.map(e=>e.scheduleId));let{dispatchScheduleTask:o}=await import(`#internal/nitro/routes/schedule-task.js`),s=createNitroArtifactsConfig({appRoot:r.appRoot,dev:!0}),c=await o(a.taskName,s);return{scheduleId:c.scheduleId,sessionIds:[...c.sessionIds]}}export{UnknownDevScheduleError,dispatchScheduleInDev};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveWorkflowBuildDirectory}from"#internal/application/paths.js";import{createAuthoredSourceRuntimeCompiledArtifactsSource}from"#internal/application/runtime-compiled-artifacts-source.js";import{
|
|
1
|
+
import{resolveWorkflowBuildDirectory}from"#internal/application/paths.js";import{createAuthoredSourceRuntimeCompiledArtifactsSource}from"#internal/application/runtime-compiled-artifacts-source.js";import{createScheduleRegistrations}from"#runtime/schedules/register.js";import{loadResolvedCompiledSchedules}from"#runtime/schedules/resolve-schedule.js";import{compileAgent}from"#compiler/compile-agent.js";import{writeCompiledArtifactsFiles}from"#internal/application/compiled-artifacts.js";async function prepareApplicationHost(e){let t=await compileAgent({startPath:e}),n=await loadResolvedCompiledSchedules({compiledArtifactsSource:createAuthoredSourceRuntimeCompiledArtifactsSource(t.project.appRoot)}),r=createScheduleRegistrations(n),i=resolveWorkflowBuildDirectory(t.project.appRoot),a=await writeCompiledArtifactsFiles({compileResult:t,outDir:t.paths.compileDirectoryPath});return{appRoot:t.project.appRoot,compileResult:t,compiledArtifacts:a,scheduleRegistrations:r,schedules:n,workflowBuildDir:i}}export{prepareApplicationHost};
|
|
@@ -7,9 +7,14 @@ import type { DevelopmentServerHandle } from "#internal/nitro/host/types.js";
|
|
|
7
7
|
export declare function normalizeDevelopmentServerClientUrl(serverUrl: string): string;
|
|
8
8
|
/**
|
|
9
9
|
* Starts the development Nitro server for an Ash application.
|
|
10
|
+
*
|
|
11
|
+
* Authored schedules are never registered with Nitro's cron scheduler in
|
|
12
|
+
* dev mode. To fire one authored schedule on demand, `POST` the dev-only
|
|
13
|
+
* `/ash/v1/dev/schedules/:scheduleId` route — the handler returns
|
|
14
|
+
* `{ scheduleId, sessionIds }` so callers can subscribe to the existing
|
|
15
|
+
* per-session stream route.
|
|
10
16
|
*/
|
|
11
17
|
export declare function startDevelopmentServer(rootDir: string, options?: {
|
|
12
18
|
host?: string;
|
|
13
19
|
port?: number;
|
|
14
|
-
schedules?: boolean;
|
|
15
20
|
}): Promise<DevelopmentServerHandle>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{build,createDevServer,prepare}from"nitro/builder";import{createApplicationNitro}from"#internal/nitro/host/create-application-nitro.js";import{prepareApplicationHost}from"#internal/nitro/host/prepare-application-host.js";import{prewarmAppSandboxes}from"#execution/sandbox/prewarm.js";const MAX_ALLOWED_DEVELOPMENT_SERVER_PORT=65535,WORKFLOW_LOCAL_BASE_URL_ENV=`WORKFLOW_LOCAL_BASE_URL`,PORT_ENV=`PORT`,WILDCARD_LISTEN_HOSTNAMES=new Set([`[::]`,`::`,`0.0.0.0`]);function normalizeDevelopmentServerClientUrl(e){let t=new URL(e);return WILDCARD_LISTEN_HOSTNAMES.has(t.hostname)?(t.hostname=`127.0.0.1`,t.toString()):e}function isAddressInUseError(e){return e instanceof Error&&`code`in e&&e.code===`EADDRINUSE`}function resolveDevelopmentServerPort(e){let t=typeof e==`string`?Number(e):e??3e3;if(!Number.isInteger(t)||t<0||t>MAX_ALLOWED_DEVELOPMENT_SERVER_PORT)throw Error(`Invalid development server port "${String(e)}". Expected an integer between 0 and ${MAX_ALLOWED_DEVELOPMENT_SERVER_PORT}.`);return t}function readEnvironmentPort(){let e=process.env[PORT_ENV];if(e===void 0||e.trim()===``)return;let t=Number(e);if(!Number.isInteger(t)||t<0||t>MAX_ALLOWED_DEVELOPMENT_SERVER_PORT)throw Error(`Invalid ${PORT_ENV} environment variable "${e}". Expected an integer between 0 and ${MAX_ALLOWED_DEVELOPMENT_SERVER_PORT}.`);return t}function resolveDevelopmentServerPorts(e){let t=resolveDevelopmentServerPort(e.port);if(t===0||!e.retryOnAddressInUse)return[t];let n=[];for(let e=0;e<10;e+=1){let r=t+e;if(r>65535)break;n.push(r)}return n}function installWorkflowLocalQueueEnvironment(e){let t=process.env[WORKFLOW_LOCAL_BASE_URL_ENV],n=process.env[PORT_ENV],r=new URL(normalizeDevelopmentServerClientUrl(e));return process.env[WORKFLOW_LOCAL_BASE_URL_ENV]=r.origin,r.port&&(process.env[PORT_ENV]=r.port),()=>{t===void 0?delete process.env[WORKFLOW_LOCAL_BASE_URL_ENV]:process.env[WORKFLOW_LOCAL_BASE_URL_ENV]=t,n===void 0?delete process.env[PORT_ENV]:process.env[PORT_ENV]=n}}function attachTemporarySocketErrorHandler(e){let onSocketError=()=>{};return e.once(`error`,onSocketError),()=>{e.off(`error`,onSocketError)}}function guardDevelopmentServerWebSocketUpgrades(e){let t
|
|
1
|
+
import{join}from"node:path";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{build,createDevServer,prepare}from"nitro/builder";import{createApplicationNitro}from"#internal/nitro/host/create-application-nitro.js";import{materializeCodeModeWorkerRuntimeAssets}from"#internal/nitro/host/code-mode-worker-asset.js";import{prepareApplicationHost}from"#internal/nitro/host/prepare-application-host.js";import{prewarmAppSandboxes}from"#execution/sandbox/prewarm.js";const MAX_ALLOWED_DEVELOPMENT_SERVER_PORT=65535,WORKFLOW_LOCAL_BASE_URL_ENV=`WORKFLOW_LOCAL_BASE_URL`,PORT_ENV=`PORT`,WILDCARD_LISTEN_HOSTNAMES=new Set([`[::]`,`::`,`0.0.0.0`]);function normalizeDevelopmentServerClientUrl(e){let t=new URL(e);return WILDCARD_LISTEN_HOSTNAMES.has(t.hostname)?(t.hostname=`127.0.0.1`,t.toString()):e}function isAddressInUseError(e){return e instanceof Error&&`code`in e&&e.code===`EADDRINUSE`}function resolveDevelopmentServerPort(e){let t=typeof e==`string`?Number(e):e??3e3;if(!Number.isInteger(t)||t<0||t>MAX_ALLOWED_DEVELOPMENT_SERVER_PORT)throw Error(`Invalid development server port "${String(e)}". Expected an integer between 0 and ${MAX_ALLOWED_DEVELOPMENT_SERVER_PORT}.`);return t}function readEnvironmentPort(){let e=process.env[PORT_ENV];if(e===void 0||e.trim()===``)return;let t=Number(e);if(!Number.isInteger(t)||t<0||t>MAX_ALLOWED_DEVELOPMENT_SERVER_PORT)throw Error(`Invalid ${PORT_ENV} environment variable "${e}". Expected an integer between 0 and ${MAX_ALLOWED_DEVELOPMENT_SERVER_PORT}.`);return t}function resolveDevelopmentServerPorts(e){let t=resolveDevelopmentServerPort(e.port);if(t===0||!e.retryOnAddressInUse)return[t];let n=[];for(let e=0;e<10;e+=1){let r=t+e;if(r>65535)break;n.push(r)}return n}function installWorkflowLocalQueueEnvironment(e){let t=process.env[WORKFLOW_LOCAL_BASE_URL_ENV],n=process.env[PORT_ENV],r=new URL(normalizeDevelopmentServerClientUrl(e));return process.env[WORKFLOW_LOCAL_BASE_URL_ENV]=r.origin,r.port&&(process.env[PORT_ENV]=r.port),()=>{t===void 0?delete process.env[WORKFLOW_LOCAL_BASE_URL_ENV]:process.env[WORKFLOW_LOCAL_BASE_URL_ENV]=t,n===void 0?delete process.env[PORT_ENV]:process.env[PORT_ENV]=n}}function attachTemporarySocketErrorHandler(e){let onSocketError=()=>{};return e.once(`error`,onSocketError),()=>{e.off(`error`,onSocketError)}}function shouldProxyDevelopmentServerWebSocketUpgrades(e){return e.options.features.websocket===!0||e.options.experimental.websocket===!0}function guardDevelopmentServerWebSocketUpgrades(e,t){let n=t.upgrade.bind(t),r=shouldProxyDevelopmentServerWebSocketUpgrades(e);t.upgrade=async(e,t,i)=>{if(!r){t.destroyed||t.destroy();return}let a=attachTemporarySocketErrorHandler(t);try{await n(e,t,i)}catch{t.destroyed||t.destroy()}finally{a()}}}async function listenForDevelopmentServer(e){let t=resolveDevelopmentServerPorts({port:e.port,retryOnAddressInUse:e.retryOnAddressInUse}),n;for(let r of t){let t=e.devServer.listen({hostname:e.host,port:r,silent:!0});try{return await t.ready(),t}catch(r){if(n=r,await t.close().catch(()=>{}),!isAddressInUseError(r)||!e.retryOnAddressInUse)throw r}}throw Error(`Failed to start Nitro dev server after ${t.length} attempts. Tried ports ${t.join(`, `)}.`,{cause:n})}async function startDevelopmentServer(s,c={}){loadDevelopmentEnvironmentFiles(s);let l=await prepareApplicationHost(s);await prewarmAppSandboxes({appRoot:l.appRoot,log:e=>console.log(e)});let u=await createApplicationNitro(l,!0),d=createDevServer(u);guardDevelopmentServerWebSocketUpgrades(u,d);let f=c.host??u.options.devServer.hostname,p=c.port??readEnvironmentPort(),m=p??u.options.devServer.port,h=p===void 0,g,_;try{let t=await listenForDevelopmentServer({devServer:d,host:f,port:m,retryOnAddressInUse:h});if(!t.url)throw Error(`Nitro dev server did not expose a URL.`);g=installWorkflowLocalQueueEnvironment(t.url),await prepare(u),await build(u),await materializeCodeModeWorkerRuntimeAssets(join(u.options.buildDir,`dev`));let{startAuthoredSourceWatcher:r}=await import(`#internal/nitro/host/dev-authored-source-watcher.js`);_=await r({nitro:u,preparedHost:l});let a=g;if(a===void 0)throw Error(`Workflow local queue environment was not initialized.`);let o=_;return{async close(){try{await o.close(),await d.close(),await u.close()}finally{a()}},url:normalizeDevelopmentServerClientUrl(t.url)}}catch(e){throw await _?.close().catch(()=>{}),g?.(),await d.close().catch(()=>{}),await u.close().catch(()=>{}),e}}export{normalizeDevelopmentServerClientUrl,startDevelopmentServer};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the dev-only dispatch response for one authored schedule.
|
|
3
|
+
*
|
|
4
|
+
* Only mounted by `configure-nitro-routes.ts` when Nitro is running in
|
|
5
|
+
* dev mode — production builds never see this handler. The handler reads
|
|
6
|
+
* the schedule id straight off the request URL, hands off to
|
|
7
|
+
* `dispatchScheduleInDev` for the production-equivalent dispatch path,
|
|
8
|
+
* and returns `{ scheduleId, sessionIds }` so callers can subscribe to
|
|
9
|
+
* the existing per-session stream route for each id.
|
|
10
|
+
*
|
|
11
|
+
* Auth: none. The dev server is local-only and the route is dev-only.
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleDevScheduleDispatchRequest(input: {
|
|
14
|
+
appRoot: string;
|
|
15
|
+
}, request: Request): Promise<Response>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ASH_ROUTE_PREFIX}from"#protocol/routes.js";import{UnknownDevScheduleError,dispatchScheduleInDev}from"#internal/nitro/host/dispatch-schedule-in-dev.js";const DEV_DISPATCH_SCHEDULE_PATH_PATTERN=RegExp(`^${ASH_ROUTE_PREFIX.replace(/\//g,`\\/`)}\\/dev\\/schedules\\/([^/]+)$`);async function handleDevScheduleDispatchRequest(e,n){let r=new URL(n.url).pathname.match(DEV_DISPATCH_SCHEDULE_PATH_PATTERN)?.[1];if(typeof r!=`string`||r.length===0)return Response.json({error:`Missing schedule id.`},{status:400});let i;try{i=decodeURIComponent(r)}catch{return Response.json({error:`Schedule id is not a valid URI component.`},{status:400})}if(i.length===0)return Response.json({error:`Missing schedule id.`},{status:400});try{let t=await dispatchScheduleInDev({appRoot:e.appRoot,scheduleId:i});return Response.json({scheduleId:t.scheduleId,sessionIds:t.sessionIds})}catch(e){if(e instanceof UnknownDevScheduleError)return Response.json({error:e.message,availableScheduleIds:e.availableScheduleIds},{status:404});throw e}}export{handleDevScheduleDispatchRequest};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CodeModeProtocolError}from"./errors.js";import{assertCodeModeApprovalResponse}from"./approval-response.js";import{hasValidCodeModeContinuationCapability,verifyCodeModeContinuation}from"./continuation-capability.js";import{runCodeMode}from"./run-code-mode.js";import"ai";function isCodeModeApprovalInterrupt(e){if(isRecord(e)&&e.type===`code-mode-approval-required`&&typeof e.approvalId==`string`&&typeof e.toolCallId==`string`&&typeof e.toolName==`string`&&isRecord(e.continuation)&&e.continuation.version===1&&hasValidCodeModeContinuationCapability(e.continuation))try{return assertApprovalContinuationMatchesInterrupt(e),!0}catch{return!1}return!1}async function continueCodeModeApproval({interrupt:n,approvalResponse:i,tools:a,options:o={},toolExecutionOptions:s}){if(verifyCodeModeContinuation(n.continuation),assertCodeModeApprovalResponse(i),i.approvalId!==n.approvalId)throw new CodeModeProtocolError(`Approval response ${i.approvalId} does not match pending code-mode approval ${n.approvalId}.`,{expectedApprovalId:n.approvalId,receivedApprovalId:i.approvalId});return assertApprovalContinuationMatchesInterrupt(n),await runCodeMode({js:n.continuation.js,tools:a,options:withInterruptApproval(o),continuation:n.continuation,approvalResponse:i,...s===void 0?{}:{toolExecutionOptions:s}})}function toCodeModeApprovalMessages(e){return[{role:`assistant`,content:[{type:`tool-call`,toolCallId:e.toolCallId,toolName:e.toolName,input:e.input},{type:`tool-approval-request`,approvalId:e.approvalId,toolCallId:e.toolCallId}]}]}function getCodeModeApprovalResponse(e,t){for(let n=e.length-1;n>=0;n--){let r=e[n];if(r?.role===`tool`){for(let e of r.content)if(e.type===`tool-approval-response`&&e.approvalId===t.approvalId&&typeof e.approved==`boolean`&&(e.reason===void 0||typeof e.reason==`string`)&&(!(`toolCallId`in e)||e.toolCallId===t.toolCallId))return{approvalId:e.approvalId,approved:e.approved,...e.reason===void 0?{}:{reason:e.reason}}}}}function getCodeModeApprovalInterrupt(e){if(!isRecord(e))return;let t=e.toolResults;if(Array.isArray(t)){for(let e of t)if(isRecord(e)&&isCodeModeApprovalInterrupt(e.output))return e.output}let n=e.content;if(Array.isArray(n)){for(let e of n)if(isRecord(e)&&e.type===`tool-result`&&isCodeModeApprovalInterrupt(e.output))return e.output}}function attachCodeModeApprovalResult(e){let t=getCodeModeApprovalInterrupt(e);return Object.assign(e,{codeModeApproval:t,codeModeApprovalMessages:t===void 0?[]:toCodeModeApprovalMessages(t)})}function withInterruptApproval(e){return{...e,approval:{...e.approval,mode:`interrupt`}}}function assertApprovalContinuationMatchesInterrupt(t){let n=t.continuation.ledger.filter(e=>e.kind===`tool`&&e.status===`approval-required`&&e.approvalId===t.approvalId&&e.toolCallId===t.toolCallId&&e.name===t.toolName&&jsonEqual(e.approvalInput,t.input));if(n.length!==1)throw new CodeModeProtocolError(`Code-mode approval continuation ledger does not match the approval interrupt.`,{approvalId:t.approvalId,toolCallId:t.toolCallId,toolName:t.toolName,matches:n.length})}function jsonEqual(e,t){return JSON.stringify(e)===JSON.stringify(t)}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{attachCodeModeApprovalResult,continueCodeModeApproval,getCodeModeApprovalInterrupt,getCodeModeApprovalResponse,isCodeModeApprovalInterrupt,toCodeModeApprovalMessages};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CodeModeProtocolError}from"./errors.js";function assertCodeModeApprovalResponse(e){if(typeof e!=`object`||!e||Array.isArray(e)||typeof e.approvalId!=`string`||typeof e.approved!=`boolean`||`reason`in e&&e.reason!==void 0&&typeof e.reason!=`string`)throw new CodeModeProtocolError(`Code mode approval response is malformed.`)}export{assertCodeModeApprovalResponse};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{runCodeMode}from"./run-code-mode.js";import{object,string}from"../../../../zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../../../../zod@4.4.3/node_modules/zod/index.js";import{unwrapCodeModeResult}from"./interrupt-continuation.js";import{buildCodeModeToolDescription}from"./tool-prompt.js";import{randomBytes}from"node:crypto";import{tool}from"ai";const TRACE_ID=Symbol(`codeModeTraceId`);function createCodeModeTool(a,o={}){let s=buildCodeModeToolDescription(a,o),c=new Map,l=o.modelOutput?.includeNestedToolSummary===!0;return tool({description:s,inputSchema:object({js:string().describe("Code-mode TypeScript source to execute. The tool description lists the available global `tools` API, input types, and call examples.")}),...l?{toModelOutput:({input:e,output:t})=>{let n=readTraceId(e);if(unwrapCodeModeResult(t).status===`interrupted`)return n!==void 0&&c.delete(n),toDefaultModelOutput(t);let i=n===void 0?void 0:c.get(n);return n!==void 0&&c.delete(n),toDefaultModelOutput({result:t===void 0?null:t,nestedTools:summarizeTrace(i,o.modelOutput)})}}:{},execute:async(t,n)=>{let{js:r}=t,i=`code-mode-trace-${randomId()}`;return rememberInputTraceId(t,i),await runCodeMode({js:r,tools:a,toolExecutionOptions:n,options:l?withTraceCapture(o,e=>{rememberTrace(c,i,e)}):o})}})}function rememberInputTraceId(e,t){Object.defineProperty(e,TRACE_ID,{configurable:!0,value:t})}function readTraceId(e){let t=e[TRACE_ID];return typeof t==`string`?t:void 0}function withTraceCapture(e,t){let n=e.lifecycle?.onTrace;return{...e,lifecycle:{...e.lifecycle,onTrace:async e=>{t(cloneTrace(e)),await n?.(e)}}}}function summarizeTrace(e,t){if(e===void 0)return[];let n=t?.includeFetchSummary===!0,r=Math.max(0,t?.maxSummaryEntries??32),i=[];for(let t of e.bridgeRequests){if(i.length>=r)break;if(t.kind===`tool`){i.push({kind:`tool`,toolName:t.toolName,toolCallId:t.toolCallId,status:t.status,replayed:t.replayed});continue}n&&i.push({kind:`fetch`,url:t.url,method:t.method,status:t.status,replayed:t.replayed})}return i}function toDefaultModelOutput(e){return typeof e==`string`?{type:`text`,value:e}:{type:`json`,value:e===void 0?null:e}}function rememberTrace(e,t,n){for(e.set(t,n);e.size>256;){let t=e.keys().next().value;if(t===void 0)return;e.delete(t)}}function randomId(){return randomBytes(16).toString(`hex`)}function cloneTrace(e){return{...e,bridgeRequests:e.bridgeRequests.map(e=>({...e})),...e.error===void 0?{}:{error:{...e.error}}}}export{createCodeModeTool};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CodeModeProtocolError}from"./errors.js";import{createHmac,randomBytes,timingSafeEqual}from"node:crypto";const SIGNATURE_ALGORITHM=`HMAC-SHA256`;let signingKey=randomBytes(32);function signCodeModeContinuation(e){let t=Date.now(),r={alg:SIGNATURE_ALGORITHM,nonce:randomBytes(16).toString(`hex`),issuedAtMs:t,expiresAtMs:t+36e5},a=signContinuationPayload({...e,auth:r});return{...structuredClone(e),auth:{...r,signature:a}}}function verifyCodeModeContinuation(t){let n=t.auth;assertAuthShape(n);let r=Date.now();if(n.expiresAtMs<r)throw new CodeModeProtocolError(`Code mode continuation has expired.`,{expiresAtMs:n.expiresAtMs,now:r});if(n.issuedAtMs>r+6e4)throw new CodeModeProtocolError(`Code mode continuation was issued in the future.`,{issuedAtMs:n.issuedAtMs,now:r});let i=signContinuationPayload(stripSignature(t));if(!constantTimeEqual(n.signature,i))throw new CodeModeProtocolError(`Code mode continuation signature is invalid.`)}function hasValidCodeModeContinuationCapability(e){try{return verifyCodeModeContinuation(e),!0}catch{return!1}}function signContinuationPayload(e){return createHmac(`sha256`,signingKey).update(canonicalJson(e)).digest(`base64url`)}function stripSignature(e){let{auth:t,...n}=e,{signature:r,...i}=t;return{...n,auth:i}}function assertAuthShape(t){if(typeof t!=`object`||!t||Array.isArray(t)||t.alg!==SIGNATURE_ALGORITHM||typeof t.nonce!=`string`||!/^[0-9a-f]{32}$/i.test(t.nonce)||typeof t.issuedAtMs!=`number`||!Number.isInteger(t.issuedAtMs)||typeof t.expiresAtMs!=`number`||!Number.isInteger(t.expiresAtMs)||t.expiresAtMs<=t.issuedAtMs||typeof t.signature!=`string`||t.signature.length===0)throw new CodeModeProtocolError(`Code mode continuation is missing valid signed auth metadata.`)}function constantTimeEqual(e,t){let n=Buffer.from(e),i=Buffer.from(t);return n.byteLength===i.byteLength&&timingSafeEqual(n,i)}function canonicalJson(t){if(t===null)return`null`;let n=typeof t;if(n===`string`||n===`boolean`)return JSON.stringify(t);if(n===`number`){if(!Number.isFinite(t))throw new CodeModeProtocolError(`Code mode continuation contains a non-finite number.`);return JSON.stringify(t)}if(n===`undefined`||n===`function`||n===`symbol`||n===`bigint`)throw new CodeModeProtocolError(`Code mode continuation contains a non-JSON value.`);if(typeof t!=`object`)return JSON.stringify(t);if(Array.isArray(t))return`[${t.map(e=>canonicalJson(e)).join(`,`)}]`;let r=Object.getPrototypeOf(t);if(r!==Object.prototype&&r!==null)throw new CodeModeProtocolError(`Code mode continuation contains a non-plain object.`);let i=t;return`{${Object.keys(i).sort().map(e=>`${JSON.stringify(e)}:${canonicalJson(i[e])}`).join(`,`)}}`}export{hasValidCodeModeContinuationCapability,signCodeModeContinuation,verifyCodeModeContinuation};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var CodeModeError=class extends Error{code;details;constructor(e,t=`CODE_MODE_ERROR`,n){super(e),this.name=new.target.name,this.code=t,this.details=n}},CodeModeTimeoutError=class extends CodeModeError{constructor(e){super(`Code mode execution timed out after ${e}ms.`,`CODE_MODE_TIMEOUT`,{timeoutMs:e})}},CodeModeAbortedError=class extends CodeModeError{constructor(){super(`Code mode execution was aborted.`,`CODE_MODE_ABORTED`)}},CodeModeConcurrencyError=class extends CodeModeError{constructor(e){super(`Code mode maxWorkers limit reached (${e}).`,`CODE_MODE_CONCURRENCY_LIMIT`,{maxWorkers:e})}},CodeModeSourceTooLargeError=class extends CodeModeError{constructor(e,t){super(`Code mode source exceeds the ${t} byte size limit.`,`CODE_MODE_SOURCE_TOO_LARGE`,{bytes:e,maxBytes:t})}},CodeModeBridgeLimitError=class extends CodeModeError{constructor(e,t){super(e,`CODE_MODE_BRIDGE_LIMIT`,t)}},CodeModeDetachedBridgeRequestError=class extends CodeModeError{constructor(e,t){super(e,`CODE_MODE_DETACHED_BRIDGE_REQUEST`,t)}},CodeModeProtocolError=class extends CodeModeError{constructor(e,t){super(e,`CODE_MODE_PROTOCOL_ERROR`,t)}},CodeModeToolError=class extends CodeModeError{constructor(e,t){super(e,`CODE_MODE_TOOL_ERROR`,t)}},CodeModeToolApprovalRequiredError=class extends CodeModeToolError{constructor(e,t,n){super(`Tool "${e}" requires approval before execution.`,{toolName:e,input:t,toolCallId:n}),this.name=`CodeModeToolApprovalRequiredError`,this.code=`CODE_MODE_TOOL_APPROVAL_REQUIRED`}},CodeModeToolApprovalDeniedError=class extends CodeModeToolError{constructor(e,t,n,r){super(`Tool "${e}" approval was denied.`,{toolName:e,input:t,toolCallId:n,reason:r}),this.name=`CodeModeToolApprovalDeniedError`,this.code=`CODE_MODE_TOOL_APPROVAL_DENIED`}},CodeModeFetchError=class extends CodeModeError{constructor(e,t){super(e,`CODE_MODE_FETCH_ERROR`,t)}};function serializeError(e){if(e instanceof CodeModeError){let t=compactError({name:e.name,message:e.message,code:e.code});return e.stack!==void 0&&(t.stack=e.stack),e.details!==void 0&&(t.details=e.details),t}if(e instanceof Error){let t=compactError({name:e.name,message:e.message});e.stack!==void 0&&(t.stack=e.stack);let n=e;return typeof n.code==`string`&&(t.code=n.code),n.details!==void 0&&(t.details=n.details),t}return{name:`Error`,message:String(e)}}function serializeBridgeErrorForGuest(e,t){if(e instanceof CodeModeError)return compactError({name:e.name,message:e.message,code:e.code});let n=t===`tool`?{message:`Host tool failed.`,code:`CODE_MODE_HOST_TOOL_ERROR`}:t===`fetch`?{message:`Host fetch failed.`,code:`CODE_MODE_HOST_FETCH_ERROR`}:{message:`Host bridge request failed.`,code:`CODE_MODE_HOST_BRIDGE_ERROR`};return{name:`Error`,message:n.message,code:n.code}}function compactError(e){return{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}}}function deserializeError(e){if(e.code===`CODE_MODE_SOURCE_TOO_LARGE`){let t=e.details,n=new CodeModeSourceTooLargeError(t?.bytes??0,t?.maxBytes??0);return restoreStack(n,e),n}if(e.code===`CODE_MODE_BRIDGE_LIMIT`){let t=new CodeModeBridgeLimitError(e.message,e.details);return restoreStack(t,e),t}if(e.code===`CODE_MODE_DETACHED_BRIDGE_REQUEST`){let t=new CodeModeDetachedBridgeRequestError(e.message,e.details);return restoreStack(t,e),t}if(e.code===`CODE_MODE_PROTOCOL_ERROR`){let t=new CodeModeProtocolError(e.message,e.details);return restoreStack(t,e),t}if(e.code===`CODE_MODE_TOOL_APPROVAL_REQUIRED`){let t=e.details,n=new CodeModeToolApprovalRequiredError(t?.toolName??`unknown`,t?.input,t?.toolCallId??`unknown`);return restoreStack(n,e),n}if(e.code===`CODE_MODE_TOOL_APPROVAL_DENIED`){let t=e.details,n=new CodeModeToolApprovalDeniedError(t?.toolName??`unknown`,t?.input,t?.toolCallId??`unknown`,t?.reason);return restoreStack(n,e),n}let t=new CodeModeError(e.message,e.code??`CODE_MODE_ERROR`,e.details);return t.name=e.name,restoreStack(t,e),t}function restoreStack(e,t){t.stack&&(e.stack=t.stack)}export{CodeModeAbortedError,CodeModeBridgeLimitError,CodeModeConcurrencyError,CodeModeDetachedBridgeRequestError,CodeModeError,CodeModeFetchError,CodeModeProtocolError,CodeModeSourceTooLargeError,CodeModeTimeoutError,CodeModeToolApprovalDeniedError,CodeModeToolApprovalRequiredError,CodeModeToolError,deserializeError,serializeBridgeErrorForGuest,serializeError};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CodeModeFetchError}from"./errors.js";const REDIRECT_STATUSES=new Set([301,302,303,307,308]);async function executeHostFetch({request:t,fetch:n,policy:r,signal:i}){if(!n)throw new CodeModeFetchError(`fetch is not enabled for this code-mode tool.`);throwIfAborted(i);let{response:a,url:o}=await fetchWithPolicyRedirects({request:normalizeFetchRequest(t,r),fetch:n,policy:r,signal:i,redirectsRemaining:r.maxRedirects??10}),s=r.maxResponseBytes??1024*1024;validateContentLength(a,s);let c=await readResponseBody(a,s,i),l={};return a.headers.forEach((e,t)=>{l[t.toLowerCase()]=e}),{url:o,status:a.status,statusText:a.statusText,headers:l,body:c}}async function fetchWithPolicyRedirects({request:n,fetch:r,policy:i,signal:a,redirectsRemaining:o}){let s=await fetchOnce(n,r,a),c=validateUrl(s.url||n.url,i);if(!REDIRECT_STATUSES.has(s.status)||i.allowRedirects!==!0)return{response:s,url:c};let l=s.headers.get(`location`);if(l===null)return{response:s,url:c};if(o<=0){let t=i.maxRedirects??10;throw new CodeModeFetchError(`fetch exceeded the ${t} redirect limit.`,{maxRedirects:t})}let u=new URL(l,c).href,d=normalizeRedirectRequest(s.status,n,u,i);return s.body?.cancel().catch(()=>void 0),await fetchWithPolicyRedirects({request:d,fetch:r,policy:i,signal:a,redirectsRemaining:o-1})}async function fetchOnce(e,t,n){let r={method:e.method,redirect:`manual`,...e.headers===void 0?{}:{headers:e.headers},...e.method!==`GET`&&e.method!==`HEAD`&&e.body!==void 0?{body:e.body}:{},...n===void 0?{}:{signal:n}};try{return await t(e.url,r)}catch(e){throw throwIfAborted(n),e}}function normalizeFetchRequest(e,t){let n=validateUrl(e.url,t),r=(e.method??`GET`).toUpperCase();return validateMethod(r,t),compactRequest({url:n,method:r,...e.headers===void 0?{}:{headers:e.headers},...e.body===void 0?{}:{body:e.body}})}function normalizeRedirectRequest(e,t,n,r){let i=t.method,a=t.body,o=t.headers;return(e===303||(e===301||e===302)&&i===`POST`)&&(i=`GET`,a=void 0,o=removeBodyHeaders(o)),normalizeFetchRequest(compactRequest({url:n,method:i,...o===void 0?{}:{headers:o},...a===void 0?{}:{body:a}}),r)}function validateMethod(t,n){let r=n.allowedMethods?.map(e=>e.toUpperCase())??[`GET`,`HEAD`];if(!r.includes(t))throw new CodeModeFetchError(`fetch method "${t}" is not allowed.`,{method:t,allowedMethods:r})}function removeBodyHeaders(e){if(e!==void 0)return Object.fromEntries(Object.entries(e).filter(([e])=>e.toLowerCase()!==`content-length`&&e.toLowerCase()!==`content-type`))}function compactRequest(e){return e}function validateUrl(t,n){let r;try{r=new URL(t)}catch{throw new CodeModeFetchError(`Invalid fetch URL: ${t}`)}if(r.protocol!==`http:`&&r.protocol!==`https:`)throw new CodeModeFetchError(`Only http and https fetch URLs are allowed.`,{url:t});if(r.username!==``||r.password!==``)throw new CodeModeFetchError(`Fetch URLs with embedded credentials are not allowed.`,{url:r.href});let i=n.allowedOrigins?.some(e=>e===r.origin)??!1,a=n.allowedUrlPrefixes?.some(e=>urlMatchesPrefix(r,validateUrlPrefix(e)))??!1;if(!i&&!a)throw new CodeModeFetchError(`fetch URL is not allowed: ${r.href}`,{url:r.href,allowedOrigins:n.allowedOrigins,allowedUrlPrefixes:n.allowedUrlPrefixes});return r.href}function validateUrlPrefix(t){let n;try{n=new URL(t)}catch{throw new CodeModeFetchError(`Invalid allowedUrlPrefixes entry: ${t}`,{prefix:t})}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw new CodeModeFetchError(`allowedUrlPrefixes entries must use http or https.`,{prefix:t});if(n.username!==``||n.password!==``)throw new CodeModeFetchError(`allowedUrlPrefixes entries with embedded credentials are not allowed.`,{prefix:t});if(n.search!==``||n.hash!==``)throw new CodeModeFetchError(`allowedUrlPrefixes entries must not include query strings or fragments.`,{prefix:t});return n}function urlMatchesPrefix(e,t){if(e.origin!==t.origin)return!1;if(e.pathname===t.pathname)return!0;let n=t.pathname.endsWith(`/`)?t.pathname:`${t.pathname}/`;return e.pathname.startsWith(n)}function validateContentLength(t,n){let r=t.headers.get(`content-length`);if(r===null)return;let i=Number(r);if(Number.isFinite(i)&&i>n)throw new CodeModeFetchError(`fetch response exceeds the ${n} byte size limit.`,{bytes:i,maxResponseBytes:n})}async function readResponseBody(t,n,r){if(throwIfAborted(r),t.body!==null&&t.body!==void 0&&typeof t.body.getReader==`function`)return await readStreamBody(t.body,n,r);let i=await withAbort(t.text(),r),a=new TextEncoder().encode(i).byteLength;if(a>n)throw new CodeModeFetchError(`fetch response exceeds the ${n} byte size limit.`,{bytes:a,maxResponseBytes:n});return i}async function readStreamBody(t,n,r){let i=t.getReader(),a=[],o=0;try{for(;;){throwIfAborted(r);let{done:t,value:s}=await withAbort(i.read(),r);if(t)break;if(s!==void 0){if(o+=s.byteLength,o>n){let t=new CodeModeFetchError(`fetch response exceeds the ${n} byte size limit.`,{bytes:o,maxResponseBytes:n});throw i.cancel(t).catch(()=>void 0),t}a.push(s)}}}catch(e){throw i.cancel(e).catch(()=>void 0),e}finally{i.releaseLock()}let s=new Uint8Array(o),c=0;for(let e of a)s.set(e,c),c+=e.byteLength;return new TextDecoder().decode(s)}async function withAbort(e,t){return t===void 0?await e:(throwIfAborted(t),await new Promise((n,r)=>{let onAbort=()=>r(createAbortError(t));t.addEventListener(`abort`,onAbort,{once:!0}),e.then(n,r).finally(()=>{t.removeEventListener(`abort`,onAbort)})}))}function throwIfAborted(e){if(e?.aborted)throw createAbortError(e)}function createAbortError(t){let n=t.reason;return new CodeModeFetchError(`fetch was aborted.`,{reason:n instanceof Error?{name:n.name,message:n.message}:String(n??`aborted`)})}export{executeHostFetch};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const CODE_MODE_HOST_INTERRUPT_SIGNAL=Symbol.for(`experimental-ai-sdk-code-mode.host-interrupt`);function requestCodeModeInterrupt(e){if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(`Code mode interrupt payload must be an object.`);if(typeof e.kind!=`string`||e.kind.length===0)throw TypeError(`Code mode interrupt payload must include a string kind.`);let t=Error(`Code mode host interruption requested.`);throw t.name=`CodeModeHostInterruptSignal`,Object.defineProperties(t,{[CODE_MODE_HOST_INTERRUPT_SIGNAL]:{value:!0},payload:{value:e}}),t}function isCodeModeHostInterruptSignal(e){return typeof e==`object`&&!!e&&e[CODE_MODE_HOST_INTERRUPT_SIGNAL]===!0&&typeof e.payload==`object`&&e.payload!==null}export{isCodeModeHostInterruptSignal,requestCodeModeInterrupt};
|
|
@@ -0,0 +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";import"./runtime-assets.js";export{};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CodeModeProtocolError}from"./errors.js";import{hasValidCodeModeContinuationCapability,verifyCodeModeContinuation}from"./continuation-capability.js";import{runCodeMode}from"./run-code-mode.js";import{isCodeModeApprovalInterrupt}from"./approval-continuation.js";function isCodeModeInterrupt(e){if(isRecord(e)&&e.type===`code-mode-interrupt`&&typeof e.interruptId==`string`&&typeof e.kind==`string`&&typeof e.toolCallId==`string`&&typeof e.toolName==`string`&&isRecord(e.payload)&&typeof e.payload.kind==`string`&&isRecord(e.pendingContinuation)&&e.pendingContinuation.type===`code-mode-pending-continuation`&&e.pendingContinuation.version===1&&e.pendingContinuation.interruptId===e.interruptId&&isRecord(e.pendingContinuation.continuation)&&hasValidCodeModeContinuationCapability(e.pendingContinuation.continuation))try{return assertPendingContinuationMatchesInterrupt(e),!0}catch{return!1}return!1}async function continueCodeModeInterrupt({interrupt:t,resolution:i,tools:a,options:o={},toolExecutionOptions:s}){let c=t.pendingContinuation;if(verifyCodeModeContinuation(c.continuation),c.interruptId!==t.interruptId)throw new CodeModeProtocolError(`Pending continuation ${c.interruptId} does not match code-mode interrupt ${t.interruptId}.`,{pendingInterruptId:c.interruptId,interruptId:t.interruptId});assertPendingContinuationMatchesInterrupt(t);let l={interruptId:t.interruptId,resolution:i};return await runCodeMode({js:c.continuation.js,tools:a,options:o,continuation:c.continuation,interruptResolution:l,...s===void 0?{}:{toolExecutionOptions:s}})}function getCodeModeInterrupt(e){let t=readInterruptValue(e);if(t!==void 0)return t;if(!isRecord(e))return;let n=e.toolResults;if(Array.isArray(n))for(let e of n){if(!isRecord(e))continue;let t=readInterruptValue(e.output);if(t!==void 0)return t}let r=e.content;if(Array.isArray(r))for(let e of r){if(!isRecord(e)||e.type!==`tool-result`)continue;let t=readInterruptValue(e.output);if(t!==void 0)return t}}function unwrapCodeModeResult(e){let t=getCodeModeInterrupt(e);return t===void 0?{status:`completed`,output:e}:{status:`interrupted`,interrupt:t}}function replaceCodeModeInterruptResult(t,n,r){let i=0,a=!1,o=toModelToolOutput(r),s=t.map(t=>{let r=t;if(!Array.isArray(r.content))return t;let s=!1,c=r.content.map(t=>{if(!isRecord(t)||t.type!==`tool-result`||t.toolCallId!==n.outerToolCallId)return t;if(a=!0,!toolResultOutputContainsInterrupt(t.output,n.interruptId))throw new CodeModeProtocolError(`Outer code_mode tool result ${n.outerToolCallId} does not contain pending interrupt ${n.interruptId}.`,{outerToolCallId:n.outerToolCallId,interruptId:n.interruptId});return i++,s=!0,{...t,output:o}});return s?{...t,content:c}:t});if(i===0)throw new CodeModeProtocolError(a?`Outer code_mode tool result ${n.outerToolCallId} was not replaced.`:`Missing outer code_mode tool result ${n.outerToolCallId}.`,{outerToolCallId:n.outerToolCallId,interruptId:n.interruptId});if(i>1)throw new CodeModeProtocolError(`Found multiple outer code_mode tool results for pending interrupt ${n.interruptId}.`,{outerToolCallId:n.outerToolCallId,interruptId:n.interruptId,replacements:i});return s}function readInterruptValue(e){if(isCodeModeInterrupt(e)||isCodeModeApprovalInterrupt(e))return e;if(isRecord(e)&&(e.type===`json`||e.type===`text`)&&`value`in e)return readInterruptValue(e.value)}function toolResultOutputContainsInterrupt(e,t){let n=readInterruptValue(e);return isCodeModeInterrupt(n)&&n.interruptId===t}function toModelToolOutput(e){return typeof e==`string`?{type:`text`,value:e}:{type:`json`,value:e===void 0?null:e}}function assertPendingContinuationMatchesInterrupt(t){let n=t.pendingContinuation;if(n.outerToolCallId!==n.continuation.outerToolCallId)throw new CodeModeProtocolError(`Pending code-mode continuation outer tool call id does not match its continuation.`,{pendingOuterToolCallId:n.outerToolCallId,continuationOuterToolCallId:n.continuation.outerToolCallId});if(n.interrupt.interruptId!==t.interruptId||n.interrupt.toolCallId!==t.toolCallId||n.interrupt.toolName!==t.toolName||n.interrupt.kind!==t.kind||!jsonEqual(n.interrupt.input,t.input)||!jsonEqual(n.interrupt.payload,t.payload))throw new CodeModeProtocolError(`Pending code-mode continuation interrupt metadata does not match the interrupt.`,{interruptId:t.interruptId,toolCallId:t.toolCallId,toolName:t.toolName});let r=n.continuation.ledger.filter(e=>e.kind===`tool`&&e.status===`interrupted`&&e.interruptId===t.interruptId&&e.toolCallId===t.toolCallId&&e.name===t.toolName&&jsonEqual(fromJsonPayload(e.inputJson),t.input)&&jsonEqual(e.interruptPayload,t.payload));if(r.length!==1)throw new CodeModeProtocolError(`Pending code-mode continuation ledger does not match the interrupt.`,{interruptId:t.interruptId,toolCallId:t.toolCallId,toolName:t.toolName,matches:r.length})}function jsonEqual(e,t){return JSON.stringify(e)===JSON.stringify(t)}function fromJsonPayload(t){if(t!==``)try{return JSON.parse(t)}catch(t){throw new CodeModeProtocolError(`Pending code-mode continuation ledger input is not valid JSON.`,{cause:t instanceof Error?t.message:String(t)})}}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{continueCodeModeInterrupt,getCodeModeInterrupt,isCodeModeInterrupt,replaceCodeModeInterruptResult,unwrapCodeModeResult};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function normalizeOptions(e={}){let t=e.executionPolicy??{},n=e.fetchPolicy===!1?void 0:e.fetchPolicy,r=n?.fetch??globalThis.fetch;if(n!==void 0&&typeof r!=`function`)throw TypeError(`fetchPolicy.fetch must be provided when global fetch is unavailable.`);return{timeoutMs:positiveInteger(t.timeoutMs,3e4,`executionPolicy.timeoutMs`),memoryLimitBytes:positiveInteger(t.memoryLimitBytes,67108864,`executionPolicy.memoryLimitBytes`),maxStackSizeBytes:positiveInteger(t.maxStackSizeBytes,2097152,`executionPolicy.maxStackSizeBytes`),maxResultBytes:positiveInteger(t.maxResultBytes,1048576,`executionPolicy.maxResultBytes`),maxSourceBytes:positiveInteger(t.maxSourceBytes,262144,`executionPolicy.maxSourceBytes`),maxToolInputBytes:positiveInteger(t.maxToolInputBytes,1048576,`executionPolicy.maxToolInputBytes`),maxToolOutputBytes:positiveInteger(t.maxToolOutputBytes,4194304,`executionPolicy.maxToolOutputBytes`),maxBridgeRequests:positiveInteger(t.maxBridgeRequests,256,`executionPolicy.maxBridgeRequests`),maxInFlightBridgeRequests:positiveInteger(t.maxInFlightBridgeRequests,32,`executionPolicy.maxInFlightBridgeRequests`),fetch:n===void 0?void 0:r,fetchEnabled:n!==void 0,fetchPolicy:{...n?.allowedOrigins===void 0?{}:{allowedOrigins:n.allowedOrigins},...n?.allowedUrlPrefixes===void 0?{}:{allowedUrlPrefixes:n.allowedUrlPrefixes},...n?.allowedMethods===void 0?{}:{allowedMethods:n.allowedMethods},maxResponseBytes:positiveInteger(n?.maxResponseBytes,1048576,`fetchPolicy.maxResponseBytes`),allowRedirects:n?.allowRedirects??!1,maxRedirects:positiveInteger(n?.maxRedirects,10,`fetchPolicy.maxRedirects`)}}}function positiveInteger(e,t,n){if(e===void 0)return t;if(!Number.isInteger(e)||e<=0)throw TypeError(`${n} must be a positive integer.`);return e}export{normalizeOptions};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{runManagedCodeMode}from"./runtime/manager.js";async function runCodeMode(e){return await runManagedCodeMode(e)}export{runCodeMode};
|
|
@@ -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{randomBytes}from"node:crypto";import{Worker}from"node:worker_threads";let activeInvocations=0,invocationCounter=0;const idleWorkers=[];function getCodeModeWorkerUrl(){return getDefaultCodeModeWorkerUrl()}function getDefaultCodeModeWorkerUrl(){return new URL(`./worker.js`,import.meta.url)}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(getCodeModeWorkerUrl()),destroyed:!1}}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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import os from"node:os";function getMaxWorkers({memoryLimitBytes:e,activeWorkers:t}){let n=e+50331648,r=Math.floor(availableMemory()/n);return Math.max(1,Math.min(32,t+r))}function availableMemory(){let t=process,n=typeof t.availableMemory==`function`?t.availableMemory():os.freemem();return Number.isFinite(n)&&n>0?n:0}export{getMaxWorkers};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const CODE_MODE_WORKER_SPECIFIER=`experimental-ai-sdk-code-mode/worker`,CODE_MODE_WORKER_FILE_NAME=`worker.js`,CODE_MODE_QUICKJS_WASM_SPECIFIER=`experimental-ai-sdk-code-mode/quickjs-wasm`,CODE_MODE_QUICKJS_WASM_FILE_NAME=`emscripten-module.wasm`;export{CODE_MODE_QUICKJS_WASM_FILE_NAME,CODE_MODE_QUICKJS_WASM_SPECIFIER,CODE_MODE_WORKER_FILE_NAME,CODE_MODE_WORKER_SPECIFIER};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CodeModeError}from"./errors.js";function assertJsonSerializable(t,n,r){if(t===void 0)return;let i=new WeakSet;function visit(t,n){if(t===null)return;let a=typeof t;if(a===`string`||a===`number`||a===`boolean`){if(a===`number`&&!Number.isFinite(t))throw new CodeModeError(`${r} contains a non-finite number at ${n}.`,`CODE_MODE_SERIALIZATION_ERROR`);return}if(a===`undefined`||a===`function`||a===`symbol`||a===`bigint`)throw new CodeModeError(`${r} is not JSON-serializable at ${n}.`,`CODE_MODE_SERIALIZATION_ERROR`);if(typeof t!=`object`)return;if(i.has(t))throw new CodeModeError(`${r} contains a circular reference at ${n}.`,`CODE_MODE_SERIALIZATION_ERROR`);if(i.add(t),Array.isArray(t)){t.forEach((e,t)=>{visit(e,`${n}[${t}]`)});return}let o=Object.getPrototypeOf(t);if(o!==Object.prototype&&o!==null)throw new CodeModeError(`${r} contains a non-plain object at ${n}.`,`CODE_MODE_SERIALIZATION_ERROR`);for(let[e,r]of Object.entries(t))visit(r,`${n}.${e}`)}visit(t,`$`);let a=JSON.stringify(t);if(a===void 0)throw new CodeModeError(`${r} is not JSON-serializable.`,`CODE_MODE_SERIALIZATION_ERROR`);let o=new TextEncoder().encode(a).byteLength;if(o>n)throw new CodeModeError(`${r} exceeds the ${n} byte size limit.`,`CODE_MODE_SERIALIZATION_ERROR`,{bytes:o,maxBytes:n})}function toJsonPayload(e,t,n){return assertJsonSerializable(e,t,n),e===void 0?``:JSON.stringify(e)}export{assertJsonSerializable,toJsonPayload};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{CodeModeSourceTooLargeError}from"./errors.js";import{stripTypeScriptTypes}from"node:module";import{createHash}from"node:crypto";const transformedSourceCache=new Map;let transformedSourceCacheBytes=0;function assertSourceSize(t,n){let r=byteLength(t);if(r>n)throw new CodeModeSourceTooLargeError(r,n)}function transformSource(e){let t=createHash(`sha256`).update(`strip:`).update(e).digest(`hex`),i=transformedSourceCache.get(t);if(i!==void 0)return transformedSourceCache.delete(t),transformedSourceCache.set(t,i),i.source;let a=stripSnippetTypes(e),o=byteLength(a);return o<=65536&&(transformedSourceCache.set(t,{source:a,bytes:o}),transformedSourceCacheBytes+=o,evictTransformedSourceCache()),a}function stripSnippetTypes(e){let n=`async function __codeModeUser__(){
|
|
2
|
+
`,r=stripTypeScriptTypes(`${n}${e}
|
|
3
|
+
}`);return!r.startsWith(n)||!r.endsWith(`
|
|
4
|
+
}`)?e:r.slice(35,-2)}function evictTransformedSourceCache(){for(;transformedSourceCache.size>256||transformedSourceCacheBytes>4194304;){let e=transformedSourceCache.keys().next().value;if(e===void 0)return;let t=transformedSourceCache.get(e);transformedSourceCache.delete(e),transformedSourceCacheBytes-=t?.bytes??0}}function byteLength(e){return new TextEncoder().encode(e).byteLength}export{assertSourceSize,transformSource};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{serializeError}from"./errors.js";function startTelemetrySpan(e,t,n){return e?.isEnabled===!0?e.tracer?.startSpan?.(t,{attributes:compactAttributes({...baseTelemetryAttributes(e),...n})}):void 0}function addTelemetryEvent(e,t,n={}){e?.addEvent?.(t,compactAttributes(n))}function recordTelemetryError(t,n){if(t===void 0)return;let r=serializeError(n);t.recordException?.(n),t.setStatus?.({code:2,message:r.message}),t.setAttributes?.(compactAttributes({"code_mode.error.name":r.name,"code_mode.error.message":r.message,"code_mode.error.code":r.code}))}function endTelemetrySpan(e){e?.end?.()}function baseTelemetryAttributes(e){return{"ai.telemetry.functionId":e.functionId,"resource.name":e.functionId,...Object.fromEntries(Object.entries(e.metadata??{}).map(([e,t])=>[`ai.telemetry.metadata.${e}`,t]))}}function compactAttributes(e){let t={};for(let[n,r]of Object.entries(e))if(r!=null){if(typeof r==`string`||typeof r==`number`||typeof r==`boolean`){t[n]=r;continue}Array.isArray(r)&&r.every(e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`)&&(t[n]=r)}return t}export{addTelemetryEvent,endTelemetrySpan,recordTelemetryError,startTelemetrySpan};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CodeModeProtocolError,CodeModeToolApprovalDeniedError,CodeModeToolApprovalRequiredError,CodeModeToolError}from"./errors.js";import{assertJsonSerializable,toJsonPayload}from"./serialization.js";import{isCodeModeHostInterruptSignal}from"./host-interrupt.js";import{asSchema}from"ai";async function invokeHostTool({toolName:o,inputJson:s,tools:c,baseExecutionOptions:l,codeModeOptions:u,maxToolInputBytes:d,maxToolOutputBytes:f,toolCallId:p,codeModeInterrupt:m,skipApproval:h=!1}){let g=c[o];if(!g)throw new CodeModeToolError(`Unknown tool: ${o}`,{toolName:o,availableTools:Object.keys(c)});if(g.execute==null)throw new CodeModeToolError(`Tool "${o}" does not have execute().`,{toolName:o});let _=s===``?void 0:JSON.parse(s);assertJsonSerializable(_,d,`Tool "${o}" input`);let v=await validateToolInput(g.inputSchema,_);if(!v.success)throw new CodeModeToolError(`Invalid input for tool "${o}": ${v.error.message}`,{toolName:o,input:_,cause:v.error.message});let y=v.value;if(!h&&await resolveApproval(g,y,{toolCallId:p,messages:l.messages,experimental_context:l.experimental_context,context:l.context})){if(u.approval?.mode===`interrupt`)return{type:`approval-required`,toolName:o,input:y,toolCallId:p};let r=await u.approval?.onApprovalRequired?.({toolName:o,input:y,toolCallId:p});if(r===void 0)throw new CodeModeToolApprovalRequiredError(o,y,p);if(typeof r!=`string`&&(typeof r!=`object`||!r))throw new CodeModeProtocolError(`Tool "${o}" approval callback returned a malformed approval decision.`,{toolName:o,toolCallId:p});let i=typeof r==`string`?r===`approved`:r.approved,a=typeof r==`string`?void 0:r.reason;if(typeof i!=`boolean`)throw new CodeModeProtocolError(`Tool "${o}" approval callback returned a malformed approval decision.`,{toolName:o,toolCallId:p});if(a!==void 0&&typeof a!=`string`)throw new CodeModeProtocolError(`Tool "${o}" approval callback returned a malformed approval reason.`,{toolName:o,toolCallId:p});if(!i)throw new CodeModeToolApprovalDeniedError(o,y,p,a)}let b={...l,toolCallId:p,...m===void 0?{}:{codeModeInterrupt:m}},x;try{x=await executeHostTool(g.execute.bind(g),{input:y,options:b})}catch(e){if(isCodeModeHostInterruptSignal(e))return assertJsonSerializable(e.payload,f,`Tool "${o}" interrupt payload`),{type:`interrupted`,toolName:o,input:y,toolCallId:p,payload:structuredClone(e.payload)};throw e}return{type:`success`,valueJson:toJsonPayload(x,f,`Tool "${o}" output`)}}async function resolveApproval(e,t,n){return e.needsApproval==null?!1:typeof e.needsApproval==`boolean`?e.needsApproval:await e.needsApproval(t,n)}async function validateToolInput(e,t){let n=asSchema(e);return n.validate===void 0?{success:!0,value:t}:await n.validate(t)}async function executeHostTool(e,{input:t,options:n}){let r=e(t,n);if(isAsyncIterable(r)){let e;for await(let t of r)e=t;return e}return await r}function isAsyncIterable(e){return typeof e==`object`&&!!e&&Symbol.asyncIterator in e&&typeof e[Symbol.asyncIterator]==`function`}export{invokeHostTool};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{asSchema}from"ai";const DEFAULT_FETCH_METHODS=[`GET`,`HEAD`];function buildCodeModeToolDescription(e,t={}){let n=Object.entries(e),r=n.length===0?"No host tools. Do not call `tools.*`.":["```ts",`declare const tools: {`,...n.flatMap(renderToolType),`};`,"```"].join(`
|
|
2
|
+
`),i=n.length===0?``:[``,`Tool call examples:`,"```ts",...renderToolExamples(n),"```"].join(`
|
|
3
|
+
`),a=[`Execute code-mode TypeScript in an isolated sandbox.`,``,"Put the full program in `js`; top-level `await`/`return` work. Return a JSON-serializable result.","Call host tools only as async `tools.name(input)`; await each or use `Promise.all` for independent calls.","Use exact names/types below. `JSON.parse`/`JSON.stringify` are available.",t.fetchPolicy!==void 0&&t.fetchPolicy!==!1?renderFetchPolicyLine(t):"Fetch: `fetch` is not available."];return a.push(``,`Tools:`,r),i.length>0&&a.push(i),a.join(`
|
|
4
|
+
`)}function renderFetchPolicyLine(e){let n=e.fetchPolicy;if(n===void 0||n===!1)return"Fetch: `fetch` is not available.";let r=[];n.allowedOrigins!==void 0&&n.allowedOrigins.length>0&&r.push(`origins=${formatInlineList(n.allowedOrigins)}`),n.allowedUrlPrefixes!==void 0&&n.allowedUrlPrefixes.length>0&&r.push(`prefixes=${formatInlineList(n.allowedUrlPrefixes)}`),r.length===0&&r.push(`no origins or URL prefixes allowed`);let i=n.allowedMethods??DEFAULT_FETCH_METHODS;return r.push(`methods=${formatInlineList(i.map(e=>e.toUpperCase()))}`),r.push(`maxBody=${n.maxResponseBytes??1048576}`),r.push(n.allowRedirects===!0?`redirects=same-policy,max=${n.maxRedirects??10}`:`redirects=none`),`Fetch: \`fetch\` is available; policy: ${r.join(`; `)}.`}function renderToolType([e,t]){let n=resolveInputSchema(t),r=n===void 0?`unknown`:schemaToType(n,n),i=resolveOutputSchema(t),a=i===void 0?`unknown`:schemaToType(i,i),o=firstString(t.description,t.title),s=[];return o!==void 0&&s.push(` /** ${toComment(o)} */`),s.push(` ${formatObjectKey(e)}: (input: ${indentType(r,2)}) => Promise<${indentType(a,2)}>;`),s}function renderToolExamples(e){if(e.length===1){let t=e[0],n=renderToolProjection(`result`,t[1]);return[`const result = await ${renderToolExampleCall(t)};`,`return ${n};`]}let t=uniqueToolVariableNames(e.map(([e])=>e)),n=e.map(e=>` ${renderToolExampleCall(e)},`);return[`const [${t.join(`, `)}] = await Promise.all([`,...n,`]);`,`return {`,...e.map(([e,n],r)=>{let i=renderToolProjection(t[r],n);return` ${formatObjectKey(e)}: ${i},`}),`};`]}function renderToolExampleCall([e,t]){let n=resolveInputSchema(t),r=firstInputExample(t)??(n===void 0?{}:sampleFromSchema(n,n));return`tools${formatPropertyAccess(e)}(${JSON.stringify(r)})`}function renderToolProjection(e,t){let n=firstObjectProperty(resolveOutputSchema(t));return n===void 0?e:`{ ${formatObjectKey(n)}: ${e}${formatPropertyAccess(n)} }`}function firstObjectProperty(e){if(!(e===void 0||!isRecord(e.properties)))return Object.entries(e.properties).find(e=>isRecord(e[1]))?.[0]}function resolveInputSchema(t){try{let n=asSchema(t.inputSchema).jsonSchema;return isPromiseLike(n)||!isRecord(n)?void 0:n}catch{return}}function resolveOutputSchema(t){try{let n=t.outputSchema;if(n===void 0)return;let r=asSchema(n).jsonSchema;return isPromiseLike(r)||!isRecord(r)?void 0:r}catch{return}}function schemaToType(e,t){return schemaToTypeInner(e,{root:t,seenRefs:new Set,depth:0})}function schemaToTypeInner(e,t){if(t.depth>8)return`unknown`;let n=firstString(e.$ref);if(n!==void 0){let e=resolveRef(n,t.root,t.seenRefs);return e===void 0?`unknown`:schemaToTypeInner(e,nextContext(t))}let r=e.const;if(r!==void 0)return literalType(r);let i=asArray(e.enum);if(i!==void 0)return union(i.map(literalType));let a=schemaArray(e.oneOf);if(a!==void 0)return union(a.map(e=>schemaToTypeInner(e,nextContext(t))));let o=schemaArray(e.anyOf);if(o!==void 0)return union(o.map(e=>schemaToTypeInner(e,nextContext(t))));let s=schemaArray(e.allOf);if(s!==void 0)return s.map(e=>schemaToTypeInner(e,nextContext(t))).join(` & `);let c=e.type;return Array.isArray(c)?union(c.map(n=>schemaToTypeInner({...e,type:n},t))):c===`object`||isRecord(e.properties)?objectType(e,t):c===`array`||e.items!==void 0?arrayType(e,t):c===`string`?`string`:c===`number`||c===`integer`?`number`:c===`boolean`?`boolean`:c===`null`?`null`:`unknown`}function objectType(e,t){let n=isRecord(e.properties)?e.properties:{},r=new Set(asArray(e.required)?.filter(isString)??[]),i=Object.entries(n).filter(e=>isRecord(e[1]));if(i.length===0){let n=e.additionalProperties;return isRecord(n)?`Record<string, ${schemaToTypeInner(n,nextContext(t))}>`:n===!0?`Record<string, unknown>`:`{}`}let a=i.flatMap(([e,n])=>{let i=[],a=firstString(n.description);return a!==void 0&&i.push(` /** ${toComment(a)} */`),i.push(` ${formatObjectKey(e)}${r.has(e)?``:`?`}: ${indentType(schemaToTypeInner(n,nextContext(t)),2)};`),i}),o=e.additionalProperties;isRecord(o)?a.push(` [key: string]: ${schemaToTypeInner(o,nextContext(t))};`):o===!0&&a.push(` [key: string]: unknown;`);let s=compactObjectType(a);return s===void 0?`{\n${a.join(`
|
|
5
|
+
`)}\n}`:s}function arrayType(e,t){let n=e.items;if(Array.isArray(n))return`[${n.map(e=>isRecord(e)?schemaToTypeInner(e,nextContext(t)):`unknown`).join(`, `)}]`;if(isRecord(n)){let e=schemaToTypeInner(n,nextContext(t));return needsParentheses(e)||e.includes(`
|
|
6
|
+
`)?`Array<${e}>`:`${e}[]`}return`unknown[]`}function sampleFromSchema(e,t){return sampleFromSchemaInner(e,{root:t,seenRefs:new Set,depth:0})}function sampleFromSchemaInner(e,t){if(t.depth>8)return null;if(e.default!==void 0)return e.default;let n=firstString(e.$ref);if(n!==void 0){let e=resolveRef(n,t.root,t.seenRefs);return e===void 0?null:sampleFromSchemaInner(e,nextContext(t))}if(e.const!==void 0)return e.const;let r=asArray(e.enum);if(r!==void 0)return r[0]??null;let i=schemaArray(e.oneOf);if(i!==void 0)return sampleFromSchemaInner(i[0]??{},nextContext(t));let a=schemaArray(e.anyOf);if(a!==void 0)return sampleFromSchemaInner(a[0]??{},nextContext(t));let o=e.type;if(Array.isArray(o))return sampleFromSchemaInner({...e,type:o.find(e=>e!==`null`)??o[0]},t);if(o===`object`||isRecord(e.properties)){let n=isRecord(e.properties)?e.properties:{};return Object.fromEntries(Object.entries(n).filter(e=>isRecord(e[1])).map(([e,n])=>[e,sampleFromSchemaInner(n,nextContext(t))]))}if(o===`array`||e.items!==void 0){let n=Array.isArray(e.items)?e.items[0]:e.items;return[isRecord(n)?sampleFromSchemaInner(n,nextContext(t)):null]}if(o===`number`||o===`integer`)return 1;if(o===`boolean`)return!0;if(o===`null`)return null;if(o===`string`||o===void 0){let t=asArray(e.examples);if(t?.[0]!==void 0)return t[0];let n=firstString(e.format);return n===`uri`||n===`url`?`https://example.com`:n===`date-time`?`2026-01-01T00:00:00.000Z`:n===`date`?`2026-01-01`:`string`}return null}function firstInputExample(e){let t=asArray(e.inputExamples)?.[0];return isRecord(t)&&`input`in t?t.input:void 0}function resolveRef(e,t,n){if(!e.startsWith(`#/`)||n.has(e))return;n.add(e);let r=e.slice(2).split(`/`).map(e=>e.replace(/~1/g,`/`).replace(/~0/g,`~`)).reduce((e,t)=>{if(isRecord(e))return e[t]},t);return isRecord(r)?r:void 0}function nextContext(e){return{...e,depth:e.depth+1}}function union(e){let t=[...new Set(e)];return t.length===0?`unknown`:t.join(` | `)}function literalType(e){return typeof e==`string`?JSON.stringify(e):typeof e==`number`||typeof e==`boolean`||e===null?String(e):`unknown`}function indentType(e,t){if(!e.includes(`
|
|
7
|
+
`))return e;let n=` `.repeat(t);return e.replaceAll(`
|
|
8
|
+
`,`\n${n}`)}function needsParentheses(e){return e.includes(` | `)||e.includes(` & `)}function formatObjectKey(e){return isIdentifier(e)?e:JSON.stringify(e)}function formatPropertyAccess(e){return isIdentifier(e)?`.${e}`:`[${JSON.stringify(e)}]`}function formatInlineList(e){return e.map(e=>`\`${e}\``).join(`, `)}function uniqueToolVariableNames(e){let t=new Map;return e.map(e=>{let n=toIdentifier(e),r=t.get(n)??0;return t.set(n,r+1),r===0?n:`${n}${r+1}`})}function toIdentifier(e){let t=e.replace(/[^A-Za-z0-9_$]/g,`_`).replace(/^[^A-Za-z_$]+/,``);return t.length===0?`tool`:t}function isIdentifier(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}function compactObjectType(e){if(e.length===0||e.some(e=>e.includes(`/**`)))return;let t=e.map(e=>e.trim());if(t.some(e=>e.includes(`
|
|
9
|
+
`)))return;let n=`{ ${t.join(` `)} }`;return n.length<=120?n:void 0}function toComment(e){return e.replaceAll(`*/`,`* /`).replace(/\s+/g,` `).trim()}function firstString(...e){return e.find(isString)}function schemaArray(e){let t=asArray(e);if(!(t===void 0||!t.every(isRecord)))return t}function asArray(e){return Array.isArray(e)?e:void 0}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function isString(e){return typeof e==`string`}function isPromiseLike(e){return isRecord(e)&&typeof e.then==`function`}export{buildCodeModeToolDescription};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./v4/core/core.js";import"./v4/core/util.js";import"./v4/core/errors.js";import"./v4/core/regexes.js";import"./v4/locales/index.js";import"./v4/core/registries.js";import"./v4/core/api.js";import"./v4/core/json-schema-processors.js";import"./v4/core/index.js";import"./v4/classic/iso.js";import"./v4/classic/errors.js";import"./v4/classic/parse.js";import"./v4/classic/schemas.js";import"./v4/classic/compat.js";import"./v4/classic/from-json-schema.js";import"./v4/classic/coerce.js";import"./v4/classic/external.js";export{};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{__exportAll}from"../../../../../../../_virtual/_rolldown/runtime.js";import{_endsWith,_gt,_gte,_includes,_length,_lowercase,_lt,_lte,_maxLength,_maxSize,_mime,_minLength,_minSize,_multipleOf,_negative,_nonnegative,_nonpositive,_normalize,_overwrite,_positive,_property,_regex,_size,_slugify,_startsWith,_toLowerCase,_toUpperCase,_trim,_uppercase}from"../core/api.js";import"../core/index.js";var checks_exports=__exportAll({endsWith:()=>_endsWith,gt:()=>_gt,gte:()=>_gte,includes:()=>_includes,length:()=>_length,lowercase:()=>_lowercase,lt:()=>_lt,lte:()=>_lte,maxLength:()=>_maxLength,maxSize:()=>_maxSize,mime:()=>_mime,minLength:()=>_minLength,minSize:()=>_minSize,multipleOf:()=>_multipleOf,negative:()=>_negative,nonnegative:()=>_nonnegative,nonpositive:()=>_nonpositive,normalize:()=>_normalize,overwrite:()=>_overwrite,positive:()=>_positive,property:()=>_property,regex:()=>_regex,size:()=>_size,slugify:()=>_slugify,startsWith:()=>_startsWith,toLowerCase:()=>_toLowerCase,toUpperCase:()=>_toUpperCase,trim:()=>_trim,uppercase:()=>_uppercase});export{checks_exports};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{__exportAll}from"../../../../../../../_virtual/_rolldown/runtime.js";import{_coercedBigint,_coercedBoolean,_coercedDate,_coercedNumber,_coercedString}from"../core/api.js";import"../core/index.js";import{ZodBigInt,ZodBoolean,ZodDate,ZodNumber,ZodString}from"./schemas.js";var coerce_exports=__exportAll({bigint:()=>bigint,boolean:()=>boolean,date:()=>date,number:()=>number,string:()=>string});function string(e){return _coercedString(ZodString,e)}function number(e){return _coercedNumber(ZodNumber,e)}function boolean(e){return _coercedBoolean(ZodBoolean,e)}function bigint(e){return _coercedBigint(ZodBigInt,e)}function date(e){return _coercedDate(ZodDate,e)}export{coerce_exports};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{config}from"../core/core.js";import"../core/index.js";const ZodIssueCode={invalid_type:`invalid_type`,too_big:`too_big`,too_small:`too_small`,invalid_format:`invalid_format`,not_multiple_of:`not_multiple_of`,unrecognized_keys:`unrecognized_keys`,invalid_union:`invalid_union`,invalid_key:`invalid_key`,invalid_element:`invalid_element`,invalid_value:`invalid_value`,custom:`custom`};function setErrorMap(t){config({customError:t})}function getErrorMap(){return config().customError}var ZodFirstPartyTypeKind;(function(e){})(ZodFirstPartyTypeKind||={});export{ZodFirstPartyTypeKind,ZodIssueCode,getErrorMap,setErrorMap};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$constructor}from"../core/core.js";import{jsonStringifyReplacer}from"../core/util.js";import{$ZodError,flattenError,formatError}from"../core/errors.js";import"../core/index.js";const initializer=(e,r)=>{$ZodError.init(e,r),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>formatError(e,t)},flatten:{value:t=>flattenError(e,t)},addIssue:{value:n=>{e.issues.push(n),e.message=JSON.stringify(e.issues,jsonStringifyReplacer,2)}},addIssues:{value:n=>{e.issues.push(...n),e.message=JSON.stringify(e.issues,jsonStringifyReplacer,2)}},isEmpty:{get(){return e.issues.length===0}}})},ZodError=$constructor(`ZodError`,initializer),ZodRealError=$constructor(`ZodError`,initializer,{Parent:Error});export{ZodError,ZodRealError};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{__exportAll}from"../../../../../../../_virtual/_rolldown/runtime.js";import{$brand,NEVER,config}from"../core/core.js";import{clone,util_exports}from"../core/util.js";import{flattenError,formatError,prettifyError,treeifyError}from"../core/errors.js";import{regexes_exports}from"../core/regexes.js";import en_default from"../locales/en.js";import{locales_exports}from"../locales/index.js";import{$input,$output,globalRegistry,registry}from"../core/registries.js";import{TimePrecision,_endsWith,_gt,_gte,_includes,_length,_lowercase,_lt,_lte,_maxLength,_maxSize,_mime,_minLength,_minSize,_multipleOf,_negative,_nonnegative,_nonpositive,_normalize,_overwrite,_positive,_property,_regex,_size,_slugify,_startsWith,_toLowerCase,_toUpperCase,_trim,_uppercase}from"../core/api.js";import{toJSONSchema}from"../core/json-schema-processors.js";import{core_exports}from"../core/index.js";import"./checks.js";import{ZodISODate,ZodISODateTime,ZodISODuration,ZodISOTime,iso_exports}from"./iso.js";import{ZodError,ZodRealError}from"./errors.js";import{decode,decodeAsync,encode,encodeAsync,parse,parseAsync,safeDecode,safeDecodeAsync,safeEncode,safeEncodeAsync,safeParse,safeParseAsync}from"./parse.js";import{ZodAny,ZodArray,ZodBase64,ZodBase64URL,ZodBigInt,ZodBigIntFormat,ZodBoolean,ZodCIDRv4,ZodCIDRv6,ZodCUID,ZodCUID2,ZodCatch,ZodCodec,ZodCustom,ZodCustomStringFormat,ZodDate,ZodDefault,ZodDiscriminatedUnion,ZodE164,ZodEmail,ZodEmoji,ZodEnum,ZodExactOptional,ZodFile,ZodFunction,ZodGUID,ZodIPv4,ZodIPv6,ZodIntersection,ZodJWT,ZodKSUID,ZodLazy,ZodLiteral,ZodMAC,ZodMap,ZodNaN,ZodNanoID,ZodNever,ZodNonOptional,ZodNull,ZodNullable,ZodNumber,ZodNumberFormat,ZodObject,ZodOptional,ZodPipe,ZodPrefault,ZodPreprocess,ZodPromise,ZodReadonly,ZodRecord,ZodSet,ZodString,ZodStringFormat,ZodSuccess,ZodSymbol,ZodTemplateLiteral,ZodTransform,ZodTuple,ZodType,ZodULID,ZodURL,ZodUUID,ZodUndefined,ZodUnion,ZodUnknown,ZodVoid,ZodXID,ZodXor,_ZodString,_catch,_default,_enum,_function,_instanceof,_null,_undefined,_void,any,array,base64,base64url,bigint,boolean,check,cidrv4,cidrv6,codec,cuid,cuid2,custom,date,describe,discriminatedUnion,e164,email,emoji,exactOptional,file,float32,float64,guid,hash,hex,hostname,httpUrl,int,int32,int64,intersection,invertCodec,ipv4,ipv6,json,jwt,keyof,ksuid,lazy,literal,looseObject,looseRecord,mac,map,meta,nan,nanoid,nativeEnum,never,nonoptional,nullable,nullish,number,object,optional,partialRecord,pipe,prefault,preprocess,promise,readonly,record,refine,set,strictObject,string,stringFormat,stringbool,success,superRefine,symbol,templateLiteral,transform,tuple,uint32,uint64,ulid,union,unknown,url,uuid,uuidv4,uuidv6,uuidv7,xid,xor}from"./schemas.js";import{ZodFirstPartyTypeKind,ZodIssueCode,getErrorMap,setErrorMap}from"./compat.js";import{fromJSONSchema}from"./from-json-schema.js";import{coerce_exports}from"./coerce.js";var external_exports=__exportAll({$brand:()=>$brand,$input:()=>$input,$output:()=>$output,NEVER:()=>NEVER,TimePrecision:()=>TimePrecision,ZodAny:()=>ZodAny,ZodArray:()=>ZodArray,ZodBase64:()=>ZodBase64,ZodBase64URL:()=>ZodBase64URL,ZodBigInt:()=>ZodBigInt,ZodBigIntFormat:()=>ZodBigIntFormat,ZodBoolean:()=>ZodBoolean,ZodCIDRv4:()=>ZodCIDRv4,ZodCIDRv6:()=>ZodCIDRv6,ZodCUID:()=>ZodCUID,ZodCUID2:()=>ZodCUID2,ZodCatch:()=>ZodCatch,ZodCodec:()=>ZodCodec,ZodCustom:()=>ZodCustom,ZodCustomStringFormat:()=>ZodCustomStringFormat,ZodDate:()=>ZodDate,ZodDefault:()=>ZodDefault,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion,ZodE164:()=>ZodE164,ZodEmail:()=>ZodEmail,ZodEmoji:()=>ZodEmoji,ZodEnum:()=>ZodEnum,ZodError:()=>ZodError,ZodExactOptional:()=>ZodExactOptional,ZodFile:()=>ZodFile,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind,ZodFunction:()=>ZodFunction,ZodGUID:()=>ZodGUID,ZodIPv4:()=>ZodIPv4,ZodIPv6:()=>ZodIPv6,ZodISODate:()=>ZodISODate,ZodISODateTime:()=>ZodISODateTime,ZodISODuration:()=>ZodISODuration,ZodISOTime:()=>ZodISOTime,ZodIntersection:()=>ZodIntersection,ZodIssueCode:()=>ZodIssueCode,ZodJWT:()=>ZodJWT,ZodKSUID:()=>ZodKSUID,ZodLazy:()=>ZodLazy,ZodLiteral:()=>ZodLiteral,ZodMAC:()=>ZodMAC,ZodMap:()=>ZodMap,ZodNaN:()=>ZodNaN,ZodNanoID:()=>ZodNanoID,ZodNever:()=>ZodNever,ZodNonOptional:()=>ZodNonOptional,ZodNull:()=>ZodNull,ZodNullable:()=>ZodNullable,ZodNumber:()=>ZodNumber,ZodNumberFormat:()=>ZodNumberFormat,ZodObject:()=>ZodObject,ZodOptional:()=>ZodOptional,ZodPipe:()=>ZodPipe,ZodPrefault:()=>ZodPrefault,ZodPreprocess:()=>ZodPreprocess,ZodPromise:()=>ZodPromise,ZodReadonly:()=>ZodReadonly,ZodRealError:()=>ZodRealError,ZodRecord:()=>ZodRecord,ZodSet:()=>ZodSet,ZodString:()=>ZodString,ZodStringFormat:()=>ZodStringFormat,ZodSuccess:()=>ZodSuccess,ZodSymbol:()=>ZodSymbol,ZodTemplateLiteral:()=>ZodTemplateLiteral,ZodTransform:()=>ZodTransform,ZodTuple:()=>ZodTuple,ZodType:()=>ZodType,ZodULID:()=>ZodULID,ZodURL:()=>ZodURL,ZodUUID:()=>ZodUUID,ZodUndefined:()=>ZodUndefined,ZodUnion:()=>ZodUnion,ZodUnknown:()=>ZodUnknown,ZodVoid:()=>ZodVoid,ZodXID:()=>ZodXID,ZodXor:()=>ZodXor,_ZodString:()=>_ZodString,_default:()=>_default,_function:()=>_function,any:()=>any,array:()=>array,base64:()=>base64,base64url:()=>base64url,bigint:()=>bigint,boolean:()=>boolean,catch:()=>_catch,check:()=>check,cidrv4:()=>cidrv4,cidrv6:()=>cidrv6,clone:()=>clone,codec:()=>codec,coerce:()=>coerce_exports,config:()=>config,core:()=>core_exports,cuid:()=>cuid,cuid2:()=>cuid2,custom:()=>custom,date:()=>date,decode:()=>decode,decodeAsync:()=>decodeAsync,describe:()=>describe,discriminatedUnion:()=>discriminatedUnion,e164:()=>e164,email:()=>email,emoji:()=>emoji,encode:()=>encode,encodeAsync:()=>encodeAsync,endsWith:()=>_endsWith,enum:()=>_enum,exactOptional:()=>exactOptional,file:()=>file,flattenError:()=>flattenError,float32:()=>float32,float64:()=>float64,formatError:()=>formatError,fromJSONSchema:()=>fromJSONSchema,function:()=>_function,getErrorMap:()=>getErrorMap,globalRegistry:()=>globalRegistry,gt:()=>_gt,gte:()=>_gte,guid:()=>guid,hash:()=>hash,hex:()=>hex,hostname:()=>hostname,httpUrl:()=>httpUrl,includes:()=>_includes,instanceof:()=>_instanceof,int:()=>int,int32:()=>int32,int64:()=>int64,intersection:()=>intersection,invertCodec:()=>invertCodec,ipv4:()=>ipv4,ipv6:()=>ipv6,iso:()=>iso_exports,json:()=>json,jwt:()=>jwt,keyof:()=>keyof,ksuid:()=>ksuid,lazy:()=>lazy,length:()=>_length,literal:()=>literal,locales:()=>locales_exports,looseObject:()=>looseObject,looseRecord:()=>looseRecord,lowercase:()=>_lowercase,lt:()=>_lt,lte:()=>_lte,mac:()=>mac,map:()=>map,maxLength:()=>_maxLength,maxSize:()=>_maxSize,meta:()=>meta,mime:()=>_mime,minLength:()=>_minLength,minSize:()=>_minSize,multipleOf:()=>_multipleOf,nan:()=>nan,nanoid:()=>nanoid,nativeEnum:()=>nativeEnum,negative:()=>_negative,never:()=>never,nonnegative:()=>_nonnegative,nonoptional:()=>nonoptional,nonpositive:()=>_nonpositive,normalize:()=>_normalize,null:()=>_null,nullable:()=>nullable,nullish:()=>nullish,number:()=>number,object:()=>object,optional:()=>optional,overwrite:()=>_overwrite,parse:()=>parse,parseAsync:()=>parseAsync,partialRecord:()=>partialRecord,pipe:()=>pipe,positive:()=>_positive,prefault:()=>prefault,preprocess:()=>preprocess,prettifyError:()=>prettifyError,promise:()=>promise,property:()=>_property,readonly:()=>readonly,record:()=>record,refine:()=>refine,regex:()=>_regex,regexes:()=>regexes_exports,registry:()=>registry,safeDecode:()=>safeDecode,safeDecodeAsync:()=>safeDecodeAsync,safeEncode:()=>safeEncode,safeEncodeAsync:()=>safeEncodeAsync,safeParse:()=>safeParse,safeParseAsync:()=>safeParseAsync,set:()=>set,setErrorMap:()=>setErrorMap,size:()=>_size,slugify:()=>_slugify,startsWith:()=>_startsWith,strictObject:()=>strictObject,string:()=>string,stringFormat:()=>stringFormat,stringbool:()=>stringbool,success:()=>success,superRefine:()=>superRefine,symbol:()=>symbol,templateLiteral:()=>templateLiteral,toJSONSchema:()=>toJSONSchema,toLowerCase:()=>_toLowerCase,toUpperCase:()=>_toUpperCase,transform:()=>transform,treeifyError:()=>treeifyError,trim:()=>_trim,tuple:()=>tuple,uint32:()=>uint32,uint64:()=>uint64,ulid:()=>ulid,undefined:()=>_undefined,union:()=>union,unknown:()=>unknown,uppercase:()=>_uppercase,url:()=>url,util:()=>util_exports,uuid:()=>uuid,uuidv4:()=>uuidv4,uuidv6:()=>uuidv6,uuidv7:()=>uuidv7,void:()=>_void,xid:()=>xid,xor:()=>xor});config(en_default());export{external_exports};
|