eve 0.7.4 → 0.8.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 +39 -0
- package/README.md +11 -11
- package/dist/src/chunks/{use-eve-agent-DErQj5hs.js → use-eve-agent-BSXZSn-R.js} +6 -1
- package/dist/src/chunks/{use-eve-agent-DoR8C4i6.js → use-eve-agent-Dlut2Qzt.js} +6 -1
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/dev/tui/blocks.d.ts +1 -1
- package/dist/src/cli/dev/tui/blocks.js +4 -3
- package/dist/src/cli/dev/tui/command-typeahead.d.ts +13 -3
- package/dist/src/cli/dev/tui/command-typeahead.js +1 -1
- package/dist/src/cli/dev/tui/line-editor.d.ts +6 -0
- package/dist/src/cli/dev/tui/line-editor.js +1 -1
- package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +2 -0
- package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
- package/dist/src/cli/dev/tui/runner.d.ts +10 -0
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/setup-commands.d.ts +11 -7
- package/dist/src/cli/dev/tui/setup-commands.js +2 -2
- package/dist/src/cli/dev/tui/setup-flow.d.ts +72 -10
- package/dist/src/cli/dev/tui/setup-issues.js +1 -1
- package/dist/src/cli/dev/tui/setup-panel.d.ts +91 -39
- package/dist/src/cli/dev/tui/setup-panel.js +3 -1
- package/dist/src/cli/dev/tui/setup-selection-input.d.ts +48 -0
- package/dist/src/cli/dev/tui/setup-selection-input.js +1 -0
- package/dist/src/cli/dev/tui/status-line.d.ts +13 -7
- package/dist/src/cli/dev/tui/status-line.js +1 -1
- package/dist/src/cli/dev/tui/stream-format.d.ts +2 -0
- package/dist/src/cli/dev/tui/stream-format.js +2 -2
- package/dist/src/cli/dev/tui/terminal-renderer.d.ts +4 -2
- package/dist/src/cli/dev/tui/terminal-renderer.js +6 -5
- package/dist/src/cli/dev/tui/theme.d.ts +3 -1
- package/dist/src/cli/dev/tui/theme.js +1 -1
- package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
- package/dist/src/cli/dev/tui/tui.d.ts +6 -0
- package/dist/src/cli/dev/tui/tui.js +1 -1
- package/dist/src/cli/dev/tui/vercel-status.d.ts +4 -4
- package/dist/src/cli/dev/tui/vercel-status.js +1 -1
- package/dist/src/cli/run.d.ts +4 -3
- package/dist/src/cli/run.js +2 -2
- package/dist/src/client/client.js +1 -1
- package/dist/src/client/session-utils.d.ts +1 -0
- package/dist/src/client/session-utils.js +1 -1
- package/dist/src/client/session.d.ts +1 -0
- package/dist/src/client/session.js +1 -1
- package/dist/src/client/types.d.ts +19 -0
- package/dist/src/compiled/.vendor-stamp.json +1 -2
- package/dist/src/compiler/compile-from-memory.js +1 -1
- package/dist/src/compiler/manifest.d.ts +28 -7
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/compiler/normalize-sandbox.js +1 -1
- package/dist/src/evals/cli/eval-client.js +1 -1
- package/dist/src/execution/sandbox/bash-tool.js +1 -1
- package/dist/src/execution/sandbox/bindings/docker-base-setup.d.ts +9 -0
- package/dist/src/execution/sandbox/bindings/docker-base-setup.js +2 -0
- package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +77 -0
- package/dist/src/execution/sandbox/bindings/docker-cli.js +2 -0
- package/dist/src/execution/sandbox/bindings/docker-container.d.ts +16 -0
- package/dist/src/execution/sandbox/bindings/docker-container.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker-network.d.ts +8 -0
- package/dist/src/execution/sandbox/bindings/docker-network.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker-options.d.ts +21 -0
- package/dist/src/execution/sandbox/bindings/docker-options.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker-session.d.ts +7 -0
- package/dist/src/execution/sandbox/bindings/docker-session.js +2 -0
- package/dist/src/execution/sandbox/bindings/docker-templates.d.ts +35 -0
- package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker-utils.d.ts +2 -0
- package/dist/src/execution/sandbox/bindings/docker-utils.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker.d.ts +33 -0
- package/dist/src/execution/sandbox/bindings/docker.js +1 -0
- package/dist/src/execution/sandbox/bindings/just-bash-runtime.d.ts +30 -0
- package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -0
- package/dist/src/execution/sandbox/bindings/just-bash.d.ts +33 -0
- package/dist/src/execution/sandbox/bindings/just-bash.js +1 -0
- package/dist/src/execution/sandbox/bindings/local-backend-utils.d.ts +23 -0
- package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -0
- package/dist/src/execution/sandbox/bindings/local-template-prune.d.ts +16 -0
- package/dist/src/execution/sandbox/bindings/local-template-prune.js +1 -0
- package/dist/src/execution/sandbox/bindings/local.d.ts +16 -25
- package/dist/src/execution/sandbox/bindings/local.js +1 -1
- package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.d.ts +16 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-metadata.d.ts +21 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-network.d.ts +18 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-network.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +34 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-platform.d.ts +22 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +178 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-process.d.ts +3 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-process.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +75 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-templates.d.ts +13 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox.d.ts +22 -0
- package/dist/src/execution/sandbox/bindings/microsandbox.js +1 -0
- package/dist/src/execution/sandbox/bindings/vercel-create-api.d.ts +20 -0
- package/dist/src/execution/sandbox/bindings/vercel-create-api.js +1 -0
- package/dist/src/execution/sandbox/bindings/vercel.d.ts +7 -8
- package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
- package/dist/src/execution/sandbox/development-cleanup.d.ts +4 -0
- package/dist/src/execution/sandbox/development-cleanup.js +1 -0
- package/dist/src/execution/sandbox/development-prewarm.d.ts +11 -0
- package/dist/src/execution/sandbox/development-prewarm.js +1 -0
- package/dist/src/execution/sandbox/development-run.d.ts +8 -0
- package/dist/src/execution/sandbox/development-run.js +1 -0
- package/dist/src/execution/sandbox/ensure.js +1 -1
- package/dist/src/execution/sandbox/lazy-backend.d.ts +1 -1
- package/dist/src/execution/sandbox/logging-session.d.ts +5 -0
- package/dist/src/execution/sandbox/logging-session.js +1 -0
- package/dist/src/execution/sandbox/prewarm.js +1 -1
- package/dist/src/execution/sandbox/template-prewarm-lock.d.ts +8 -0
- package/dist/src/execution/sandbox/template-prewarm-lock.js +1 -0
- package/dist/src/internal/application/optional-package-install.d.ts +40 -0
- package/dist/src/internal/application/optional-package-install.js +1 -0
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/sandbox.d.ts +1 -1
- package/dist/src/internal/authored-definition/sandbox.js +1 -1
- package/dist/src/internal/authored-module-loader.js +2 -2
- package/dist/src/internal/classify-model-routing.d.ts +24 -0
- package/dist/src/internal/classify-model-routing.js +1 -0
- package/dist/src/internal/nitro/host/channel-routes.js +2 -2
- package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.d.ts +5 -2
- package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.js +1 -1
- package/dist/src/internal/nitro/host/create-application-nitro.d.ts +10 -0
- package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
- package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
- package/dist/src/internal/nitro/host/dev-live-virtual-modules.d.ts +15 -0
- package/dist/src/internal/nitro/host/dev-live-virtual-modules.js +1 -0
- package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.d.ts +28 -0
- package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.js +1 -0
- package/dist/src/internal/nitro/host/start-development-server.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.d.ts +2 -0
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +4 -0
- package/dist/src/internal/nitro/routes/info.js +1 -1
- package/dist/src/internal/nitro/routes/runtime-artifacts.js +1 -1
- package/dist/src/internal/resolve-model-endpoint-status.d.ts +23 -0
- package/dist/src/internal/resolve-model-endpoint-status.js +1 -0
- package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
- package/dist/src/internal/workflow-bundle/vercel-workflow-output.d.ts +1 -1
- package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
- package/dist/src/public/definitions/sandbox-backend.js +1 -1
- package/dist/src/public/sandbox/backends/default.d.ts +37 -10
- package/dist/src/public/sandbox/backends/default.js +1 -1
- package/dist/src/public/sandbox/backends/docker.d.ts +14 -0
- package/dist/src/public/sandbox/backends/docker.js +1 -0
- package/dist/src/public/sandbox/backends/just-bash.d.ts +17 -0
- package/dist/src/public/sandbox/backends/just-bash.js +1 -0
- package/dist/src/public/sandbox/backends/microsandbox.d.ts +17 -0
- package/dist/src/public/sandbox/backends/microsandbox.js +1 -0
- package/dist/src/public/sandbox/backends/vercel.d.ts +5 -2
- package/dist/src/public/sandbox/backends/vercel.js +1 -1
- package/dist/src/public/sandbox/docker-sandbox.d.ts +45 -0
- package/dist/src/public/sandbox/index.d.ts +8 -4
- package/dist/src/public/sandbox/index.js +1 -1
- package/dist/src/public/sandbox/just-bash-sandbox.d.ts +17 -0
- package/dist/src/public/sandbox/just-bash-sandbox.js +1 -0
- package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +54 -0
- package/dist/src/public/sandbox/microsandbox-sandbox.js +1 -0
- package/dist/src/public/sandbox/vercel-sandbox.d.ts +1 -1
- package/dist/src/runtime/compiled-artifacts-source.d.ts +11 -0
- package/dist/src/runtime/compiled-artifacts-source.js +1 -1
- package/dist/src/runtime/resolve-sandbox.js +1 -1
- package/dist/src/runtime/sandbox/keys.js +1 -1
- package/dist/src/runtime/sandbox/registry.d.ts +2 -2
- package/dist/src/runtime/types.d.ts +1 -1
- package/dist/src/runtime/workspace/spec.js +1 -1
- package/dist/src/setup/boxes/add-channels.d.ts +3 -2
- package/dist/src/setup/boxes/add-channels.js +2 -2
- package/dist/src/setup/boxes/apply-ai-gateway-credential.js +1 -1
- package/dist/src/setup/boxes/deploy-project.js +1 -1
- package/dist/src/setup/boxes/link-project.js +1 -1
- package/dist/src/setup/boxes/resolve-provisioning.d.ts +6 -0
- package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
- package/dist/src/setup/boxes/select-model.d.ts +2 -2
- package/dist/src/setup/boxes/select-model.js +1 -1
- package/dist/src/setup/cli/channel-setup-prompter.d.ts +28 -0
- package/dist/src/setup/cli/channel-setup-prompter.js +1 -1
- package/dist/src/setup/cli/index.d.ts +2 -2
- package/dist/src/setup/cli/index.js +1 -1
- package/dist/src/setup/cli/option-row.d.ts +89 -0
- package/dist/src/setup/cli/option-row.js +1 -0
- package/dist/src/setup/cli/prompt-ui.d.ts +15 -29
- package/dist/src/setup/cli/prompt-ui.js +2 -2
- package/dist/src/setup/cli/select-component.d.ts +4 -3
- package/dist/src/setup/cli/select-component.js +1 -1
- package/dist/src/setup/cli/select-state.d.ts +3 -3
- package/dist/src/setup/cli/select-state.js +1 -1
- package/dist/src/setup/flows/channels.d.ts +29 -14
- package/dist/src/setup/flows/channels.js +1 -1
- package/dist/src/setup/flows/deploy.d.ts +1 -0
- package/dist/src/setup/flows/deploy.js +1 -1
- package/dist/src/setup/flows/link.d.ts +1 -0
- package/dist/src/setup/flows/link.js +1 -1
- package/dist/src/setup/flows/model.d.ts +30 -6
- package/dist/src/setup/flows/model.js +1 -1
- package/dist/src/setup/flows/vercel.d.ts +4 -1
- package/dist/src/setup/flows/vercel.js +2 -2
- package/dist/src/setup/index.js +1 -1
- package/dist/src/setup/primitives/open-url.d.ts +14 -0
- package/dist/src/setup/primitives/open-url.js +1 -0
- package/dist/src/setup/primitives/pm/pnpm.d.ts +9 -0
- package/dist/src/setup/primitives/pm/pnpm.js +2 -2
- package/dist/src/setup/primitives/pm/run.d.ts +12 -4
- package/dist/src/setup/primitives/pm/run.js +1 -1
- package/dist/src/setup/primitives/pm/types.d.ts +3 -0
- package/dist/src/setup/primitives/process-abort.d.ts +7 -0
- package/dist/src/setup/primitives/process-abort.js +1 -0
- package/dist/src/setup/primitives/run-vercel.d.ts +2 -0
- package/dist/src/setup/primitives/run-vercel.js +1 -1
- package/dist/src/setup/project-resolution.d.ts +6 -3
- package/dist/src/setup/project-resolution.js +1 -1
- package/dist/src/setup/prompter.d.ts +63 -6
- package/dist/src/setup/prompter.js +1 -1
- package/dist/src/setup/run-vercel-link.d.ts +1 -1
- package/dist/src/setup/run-vercel-link.js +1 -1
- package/dist/src/setup/runner.d.ts +2 -0
- package/dist/src/setup/runner.js +1 -1
- package/dist/src/setup/scaffold/channels-catalog.d.ts +2 -0
- package/dist/src/setup/scaffold/channels-catalog.js +1 -1
- package/dist/src/setup/scaffold/create/add-to-project.d.ts +1 -0
- package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
- package/dist/src/setup/scaffold/create/project.d.ts +2 -0
- package/dist/src/setup/scaffold/create/project.js +6 -3
- package/dist/src/setup/scaffold/update/channels.d.ts +2 -0
- package/dist/src/setup/scaffold/update/channels.js +3 -3
- package/dist/src/setup/slack-connect-lifecycle.d.ts +97 -0
- package/dist/src/setup/slack-connect-lifecycle.js +1 -0
- package/dist/src/setup/slack-connect.d.ts +51 -0
- package/dist/src/setup/slack-connect.js +1 -0
- package/dist/src/setup/slackbot.d.ts +60 -47
- package/dist/src/setup/slackbot.js +1 -1
- package/dist/src/setup/state.d.ts +2 -1
- package/dist/src/setup/state.js +1 -1
- package/dist/src/setup/step.d.ts +4 -0
- package/dist/src/setup/validate-gateway-key.d.ts +30 -0
- package/dist/src/setup/validate-gateway-key.js +1 -0
- package/dist/src/setup/vercel-project.d.ts +19 -12
- package/dist/src/setup/vercel-project.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +26 -0
- package/dist/src/shared/model-endpoint-status.d.ts +27 -0
- package/dist/src/shared/model-endpoint-status.js +1 -0
- package/dist/src/shared/sandbox-backend.d.ts +8 -2
- package/dist/src/shared/sandbox-definition.d.ts +4 -3
- package/dist/src/shared/sandbox-network-policy.d.ts +4 -2
- package/dist/src/shared/sandbox-session.d.ts +3 -2
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/{dist/docs/public → docs}/getting-started.mdx +14 -4
- package/{dist/docs/public → docs}/guides/deployment.md +3 -3
- package/{dist/docs/public → docs}/guides/dev-tui.md +2 -2
- package/{dist/docs/public → docs}/reference/cli.md +2 -1
- package/{dist/docs/public → docs}/sandbox.mdx +39 -15
- package/package.json +11 -1
- package/dist/src/compiled/just-bash/LICENSE +0 -201
- package/dist/src/compiled/just-bash/index.d.ts +0 -139
- package/dist/src/compiled/just-bash/index.js +0 -2200
- package/dist/src/compiled/just-bash/network/types.d.ts +0 -155
- package/dist/src/public/sandbox/backends/local.d.ts +0 -16
- package/dist/src/public/sandbox/backends/local.js +0 -1
- package/dist/src/public/sandbox/local-sandbox.d.ts +0 -7
- /package/dist/src/public/sandbox/{local-sandbox.js → docker-sandbox.js} +0 -0
- /package/{dist/docs/public → docs}/README.md +0 -0
- /package/{dist/docs/public → docs}/agent-config.md +0 -0
- /package/{dist/docs/public → docs}/channels/custom.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/discord.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/eve.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/github.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/linear.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/meta.json +0 -0
- /package/{dist/docs/public → docs}/channels/overview.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/slack.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/teams.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/telegram.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/twilio.mdx +0 -0
- /package/{dist/docs/public → docs}/concepts/context-control.md +0 -0
- /package/{dist/docs/public → docs}/concepts/default-harness.md +0 -0
- /package/{dist/docs/public → docs}/concepts/execution-model-and-durability.md +0 -0
- /package/{dist/docs/public → docs}/concepts/meta.json +0 -0
- /package/{dist/docs/public → docs}/concepts/security-model.md +0 -0
- /package/{dist/docs/public → docs}/concepts/sessions-runs-and-streaming.md +0 -0
- /package/{dist/docs/public → docs}/connections.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/assertions.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/cases.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/judge.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/meta.json +0 -0
- /package/{dist/docs/public → docs}/evals/overview.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/reporters.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/running.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/targets.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/auth-and-route-protection.md +0 -0
- /package/{dist/docs/public → docs}/guides/client/continuations.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/client/messages.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/client/meta.json +0 -0
- /package/{dist/docs/public → docs}/guides/client/output-schema.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/client/overview.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/client/streaming.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/dynamic-capabilities.md +0 -0
- /package/{dist/docs/public → docs}/guides/dynamic-workflows.md +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/meta.json +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/nextjs.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/nuxt.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/overview.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/sveltekit.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/use-eve-agent-svelte.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/use-eve-agent-vue.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/hooks.md +0 -0
- /package/{dist/docs/public → docs}/guides/instrumentation.md +0 -0
- /package/{dist/docs/public → docs}/guides/meta.json +0 -0
- /package/{dist/docs/public → docs}/guides/remote-agents.md +0 -0
- /package/{dist/docs/public → docs}/guides/session-context.md +0 -0
- /package/{dist/docs/public → docs}/guides/state.md +0 -0
- /package/{dist/docs/public → docs}/instructions.mdx +0 -0
- /package/{dist/docs/public → docs}/introduction.md +0 -0
- /package/{dist/docs/public → docs}/meta.json +0 -0
- /package/{dist/docs/public → docs}/reference/meta.json +0 -0
- /package/{dist/docs/public → docs}/reference/project-layout.md +0 -0
- /package/{dist/docs/public → docs}/reference/typescript-api.md +0 -0
- /package/{dist/docs/public → docs}/schedules.mdx +0 -0
- /package/{dist/docs/public → docs}/skills.mdx +0 -0
- /package/{dist/docs/public → docs}/subagents.mdx +0 -0
- /package/{dist/docs/public → docs}/tools.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/connect-a-warehouse.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/first-agent.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/guard-the-spend.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/how-it-runs.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/meta.json +0 -0
- /package/{dist/docs/public → docs}/tutorial/query-sample-data.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/remember-definitions.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/run-analysis.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/ship-it.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/team-playbooks.mdx +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z}from"#compiled/zod/index.js";import{discoverDiagnosticsSummarySchema}from"#discover/diagnostics.js";import{compiledRemoteAgentNodeSchema}from"#compiler/remote-agent-node.js";import{jsonObjectSchema}from"#shared/json-schemas.js";const COMPILED_AGENT_MANIFEST_KIND=`eve-agent-compiled-manifest`,ROOT_COMPILED_AGENT_NODE_ID=`__root__`,COMPILED_AGENT_MANIFEST_VERSION=28,moduleSourceRefSchema=z.object({exportName:z.string().optional(),sourceKind:z.literal(`module`),logicalPath:z.string(),sourceId:z.string()}).strict(),channelMethodSchema=z.union([z.literal(`GET`),z.literal(`POST`),z.literal(`PUT`),z.literal(`PATCH`),z.literal(`DELETE`),z.literal(`WEBSOCKET`)]),compiledChannelDefinitionSchema=z.object({kind:z.literal(`channel`),name:z.string(),logicalPath:z.string(),method:channelMethodSchema,urlPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),exportName:z.string().optional(),adapterKind:z.string().optional()}).strict(),disabledCompiledChannelEntrySchema=z.object({kind:z.literal(`disabled`),name:z.string(),logicalPath:z.string()}).strict(),compiledChannelEntrySchema=z.union([compiledChannelDefinitionSchema,disabledCompiledChannelEntrySchema]),compiledRuntimeModelReferenceSchema=z.object({contextWindowTokens:z.number().int().positive().optional(),id:z.string(),source:moduleSourceRefSchema.optional(),providerOptions:z.record(z.string(),jsonObjectSchema).optional()}).strict(),compiledAgentBuildDefinitionSchema=z.object({externalDependencies:z.array(z.string()).optional()}).strict(),compiledAgentCompactionDefinitionSchema=z.object({model:compiledRuntimeModelReferenceSchema.optional(),thresholdPercent:z.number().finite().min(0).max(1).optional()}).strict(),compiledAgentConfigSchema=z.object({build:compiledAgentBuildDefinitionSchema.optional(),compaction:compiledAgentCompactionDefinitionSchema.optional(),description:z.string().optional(),experimental:z.object({codeMode:z.boolean().optional()}).strict().optional(),model:compiledRuntimeModelReferenceSchema,name:z.string(),outputSchema:jsonObjectSchema.optional(),source:moduleSourceRefSchema.optional()}).strict(),compiledInstructionsSchema=z.object({name:z.string(),logicalPath:z.string(),markdown:z.string(),sourceId:z.string(),sourceKind:z.union([z.literal(`markdown`),z.literal(`module`)])}).strict(),compiledSkillBaseFields={name:z.string(),description:z.string(),license:z.string().optional(),markdown:z.string(),metadata:z.record(z.string(),z.string()).optional(),sourceId:z.string(),logicalPath:z.string()},compiledSkillSourceSchema=z.discriminatedUnion(`sourceKind`,[z.object({...compiledSkillBaseFields,sourceKind:z.literal(`markdown`)}).strict(),z.object({...compiledSkillBaseFields,sourceKind:z.literal(`module`),exportName:z.string().optional()}).strict(),z.object({...compiledSkillBaseFields,sourceKind:z.literal(`skill-package`),skillId:z.string(),skillFilePath:z.string(),rootPath:z.string(),assetsPath:z.string().optional(),referencesPath:z.string().optional(),scriptsPath:z.string().optional()}).strict()]),compiledScheduleDefinitionSchema=z.object({cron:z.string(),hasRun:z.boolean(),name:z.string(),logicalPath:z.string(),markdown:z.string().optional(),sourceId:z.string(),sourceKind:z.union([z.literal(`markdown`),z.literal(`module`)])}).strict(),compiledSandboxDefinitionSchema=z.object({description:z.string().optional(),exportName:z.string().optional(),logicalPath:z.string(),revalidationKey:z.string().optional(),sourceHash:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledSandboxWorkspaceSchema=z.object({logicalPath:z.string(),rootEntries:z.array(z.string()).readonly(),sourceId:z.string(),sourcePath:z.string()}).strict(),compiledWorkspaceResourceRootSchema=z.object({contentHash:z.string().optional(),logicalPath:z.string(),rootEntries:z.array(z.string()).readonly()}).strict(),compiledConnectionDefinitionSchema=z.object({connectionName:z.string(),description:z.string(),exportName:z.string().optional(),logicalPath:z.string(),protocol:z.enum([`mcp`,`openapi`]).default(`mcp`),sourceId:z.string(),sourceKind:z.literal(`module`),url:z.string(),vercelConnect:z.object({connector:z.string()}).strict().optional()}).strict(),compiledToolDefinitionSchema=z.object({description:z.string(),exportName:z.string().optional(),inputSchema:jsonObjectSchema.nullable(),logicalPath:z.string(),name:z.string(),outputSchema:jsonObjectSchema.optional(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledDynamicToolDefinitionSchema=z.object({eventNames:z.array(z.string()).readonly(),exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledDynamicSkillDefinitionSchema=z.object({eventNames:z.array(z.string()).readonly(),exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledDynamicInstructionsDefinitionSchema=z.object({eventNames:z.array(z.string()).readonly(),exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledHookDefinitionSchema=z.object({exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledAgentNodeManifestSchema=z.object({agentRoot:z.string(),appRoot:z.string(),channels:z.array(compiledChannelEntrySchema),config:compiledAgentConfigSchema,connections:z.array(compiledConnectionDefinitionSchema),diagnosticsSummary:discoverDiagnosticsSummarySchema,disabledFrameworkTools:z.array(z.string()).readonly(),workflowEnabled:z.boolean().default(!1),dynamicInstructions:z.array(compiledDynamicInstructionsDefinitionSchema).default([]),dynamicSkills:z.array(compiledDynamicSkillDefinitionSchema).default([]),dynamicTools:z.array(compiledDynamicToolDefinitionSchema).default([]),hooks:z.array(compiledHookDefinitionSchema),sandbox:compiledSandboxDefinitionSchema.nullable(),sandboxWorkspaces:z.array(compiledSandboxWorkspaceSchema),schedules:z.array(compiledScheduleDefinitionSchema),remoteAgents:z.array(compiledRemoteAgentNodeSchema),skills:z.array(compiledSkillSourceSchema).readonly(),instructions:compiledInstructionsSchema.optional(),tools:z.array(compiledToolDefinitionSchema),workspaceResourceRoot:compiledWorkspaceResourceRootSchema}).strict(),compiledSubagentNodeSchema=z.object({agent:compiledAgentNodeManifestSchema,description:z.string(),entryPath:z.string(),logicalPath:z.string(),name:z.string(),nodeId:z.string(),rootPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),exportName:z.string().optional()}).strict(),compiledSubagentEdgeSchema=z.object({childNodeId:z.string(),parentNodeId:z.string()}).strict(),compiledAgentManifestSchema=z.object({agentRoot:z.string(),appRoot:z.string(),channels:z.array(compiledChannelEntrySchema),config:compiledAgentConfigSchema,connections:z.array(compiledConnectionDefinitionSchema),diagnosticsSummary:discoverDiagnosticsSummarySchema,disabledFrameworkTools:z.array(z.string()).readonly(),workflowEnabled:z.boolean().default(!1),dynamicInstructions:z.array(compiledDynamicInstructionsDefinitionSchema).default([]),dynamicSkills:z.array(compiledDynamicSkillDefinitionSchema).default([]),dynamicTools:z.array(compiledDynamicToolDefinitionSchema).default([]),hooks:z.array(compiledHookDefinitionSchema),kind:z.literal(COMPILED_AGENT_MANIFEST_KIND),remoteAgents:z.array(compiledRemoteAgentNodeSchema),sandbox:compiledSandboxDefinitionSchema.nullable(),sandboxWorkspaces:z.array(compiledSandboxWorkspaceSchema),schedules:z.array(compiledScheduleDefinitionSchema),skills:z.array(compiledSkillSourceSchema).readonly(),subagentEdges:z.array(compiledSubagentEdgeSchema),subagents:z.array(compiledSubagentNodeSchema),instructions:compiledInstructionsSchema.optional(),tools:z.array(compiledToolDefinitionSchema),version:z.literal(28),workspaceResourceRoot:compiledWorkspaceResourceRootSchema}).strict();function createCompiledAgentNodeManifest(e){let t={agentRoot:e.agentRoot,appRoot:e.appRoot,channels:[...e.channels??[]],connections:[...e.connections??[]],config:{build:e.config.build===void 0?void 0:{externalDependencies:e.config.build.externalDependencies===void 0?void 0:[...e.config.build.externalDependencies]},compaction:{model:e.config.compaction?.model===void 0?void 0:cloneCompiledRuntimeModelReference(e.config.compaction.model),thresholdPercent:e.config.compaction?.thresholdPercent},description:e.config.description,experimental:e.config.experimental===void 0?void 0:{codeMode:e.config.experimental.codeMode},model:cloneCompiledRuntimeModelReference(e.config.model),name:e.config.name,outputSchema:e.config.outputSchema,source:e.config.source===void 0?void 0:{...e.config.source}},diagnosticsSummary:e.diagnosticsSummary??{errors:0,warnings:0},disabledFrameworkTools:[...e.disabledFrameworkTools??[]],workflowEnabled:e.workflowEnabled??!1,dynamicInstructions:[...e.dynamicInstructions??[]],dynamicSkills:[...e.dynamicSkills??[]],dynamicTools:[...e.dynamicTools??[]],hooks:[...e.hooks??[]],remoteAgents:[...e.remoteAgents??[]],sandbox:e.sandbox??null,sandboxWorkspaces:[...e.sandboxWorkspaces??[]],schedules:[...e.schedules??[]],skills:[...e.skills??[]],tools:[...e.tools??[]],workspaceResourceRoot:e.workspaceResourceRoot??{logicalPath:``,rootEntries:deriveResourceRootEntries({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}};return e.instructions!==void 0&&(t.instructions=e.instructions),t}function deriveResourceRootEntries(e){let t=new Set;(e.skills??[]).length>0&&t.add(`skills/`);for(let n of e.sandboxWorkspaces??[])for(let e of n.rootEntries)t.add(e);return[...t].sort((e,t)=>e.localeCompare(t))}function createCompiledSubagentNodeId(e,t){return e===`__root__`?t:`${e}::${t}`}function createCompiledAgentManifest(e){return{...createCompiledAgentNodeManifest(e),kind:COMPILED_AGENT_MANIFEST_KIND,subagentEdges:[...e.subagentEdges??[]],subagents:[...e.subagents??[]],version:28}}function cloneCompiledRuntimeModelReference(e){return e.contextWindowTokens===void 0&&e.source===void 0&&e.providerOptions===void 0?{id:e.id}:e.source===void 0?e.providerOptions===void 0?{contextWindowTokens:e.contextWindowTokens,id:e.id}:{contextWindowTokens:e.contextWindowTokens,id:e.id,providerOptions:{...e.providerOptions}}:e.contextWindowTokens===void 0&&e.providerOptions===void 0?{id:e.id,source:{...e.source}}:{contextWindowTokens:e.contextWindowTokens,id:e.id,providerOptions:e.providerOptions===void 0?void 0:{...e.providerOptions},source:{...e.source}}}export{COMPILED_AGENT_MANIFEST_KIND,COMPILED_AGENT_MANIFEST_VERSION,ROOT_COMPILED_AGENT_NODE_ID,compiledAgentManifestSchema,createCompiledAgentManifest,createCompiledAgentNodeManifest,createCompiledSubagentNodeId,deriveResourceRootEntries};
|
|
1
|
+
import{z}from"#compiled/zod/index.js";import{discoverDiagnosticsSummarySchema}from"#discover/diagnostics.js";import{compiledRemoteAgentNodeSchema}from"#compiler/remote-agent-node.js";import{jsonObjectSchema}from"#shared/json-schemas.js";const COMPILED_AGENT_MANIFEST_KIND=`eve-agent-compiled-manifest`,ROOT_COMPILED_AGENT_NODE_ID=`__root__`,COMPILED_AGENT_MANIFEST_VERSION=29,moduleSourceRefSchema=z.object({exportName:z.string().optional(),sourceKind:z.literal(`module`),logicalPath:z.string(),sourceId:z.string()}).strict(),channelMethodSchema=z.union([z.literal(`GET`),z.literal(`POST`),z.literal(`PUT`),z.literal(`PATCH`),z.literal(`DELETE`),z.literal(`WEBSOCKET`)]),compiledChannelDefinitionSchema=z.object({kind:z.literal(`channel`),name:z.string(),logicalPath:z.string(),method:channelMethodSchema,urlPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),exportName:z.string().optional(),adapterKind:z.string().optional()}).strict(),disabledCompiledChannelEntrySchema=z.object({kind:z.literal(`disabled`),name:z.string(),logicalPath:z.string()}).strict(),compiledChannelEntrySchema=z.union([compiledChannelDefinitionSchema,disabledCompiledChannelEntrySchema]),modelRoutingSchema=z.union([z.object({kind:z.literal(`gateway`),target:z.string(),byok:z.string().optional()}).strict(),z.object({kind:z.literal(`external`),provider:z.string()}).strict()]),compiledRuntimeModelReferenceSchema=z.object({contextWindowTokens:z.number().int().positive().optional(),id:z.string(),source:moduleSourceRefSchema.optional(),providerOptions:z.record(z.string(),jsonObjectSchema).optional(),routing:modelRoutingSchema}).strict(),compiledAgentBuildDefinitionSchema=z.object({externalDependencies:z.array(z.string()).optional()}).strict(),compiledAgentCompactionDefinitionSchema=z.object({model:compiledRuntimeModelReferenceSchema.optional(),thresholdPercent:z.number().finite().min(0).max(1).optional()}).strict(),compiledAgentConfigSchema=z.object({build:compiledAgentBuildDefinitionSchema.optional(),compaction:compiledAgentCompactionDefinitionSchema.optional(),description:z.string().optional(),experimental:z.object({codeMode:z.boolean().optional()}).strict().optional(),model:compiledRuntimeModelReferenceSchema,name:z.string(),outputSchema:jsonObjectSchema.optional(),source:moduleSourceRefSchema.optional()}).strict(),compiledInstructionsSchema=z.object({name:z.string(),logicalPath:z.string(),markdown:z.string(),sourceId:z.string(),sourceKind:z.union([z.literal(`markdown`),z.literal(`module`)])}).strict(),compiledSkillBaseFields={name:z.string(),description:z.string(),license:z.string().optional(),markdown:z.string(),metadata:z.record(z.string(),z.string()).optional(),sourceId:z.string(),logicalPath:z.string()},compiledSkillSourceSchema=z.discriminatedUnion(`sourceKind`,[z.object({...compiledSkillBaseFields,sourceKind:z.literal(`markdown`)}).strict(),z.object({...compiledSkillBaseFields,sourceKind:z.literal(`module`),exportName:z.string().optional()}).strict(),z.object({...compiledSkillBaseFields,sourceKind:z.literal(`skill-package`),skillId:z.string(),skillFilePath:z.string(),rootPath:z.string(),assetsPath:z.string().optional(),referencesPath:z.string().optional(),scriptsPath:z.string().optional()}).strict()]),compiledScheduleDefinitionSchema=z.object({cron:z.string(),hasRun:z.boolean(),name:z.string(),logicalPath:z.string(),markdown:z.string().optional(),sourceId:z.string(),sourceKind:z.union([z.literal(`markdown`),z.literal(`module`)])}).strict(),compiledSandboxDefinitionSchema=z.object({backendName:z.string().optional(),description:z.string().optional(),exportName:z.string().optional(),logicalPath:z.string(),revalidationKey:z.string().optional(),sourceHash:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledSandboxWorkspaceSchema=z.object({logicalPath:z.string(),rootEntries:z.array(z.string()).readonly(),sourceId:z.string(),sourcePath:z.string()}).strict(),compiledWorkspaceResourceRootSchema=z.object({contentHash:z.string().optional(),logicalPath:z.string(),rootEntries:z.array(z.string()).readonly()}).strict(),compiledConnectionDefinitionSchema=z.object({connectionName:z.string(),description:z.string(),exportName:z.string().optional(),logicalPath:z.string(),protocol:z.enum([`mcp`,`openapi`]).default(`mcp`),sourceId:z.string(),sourceKind:z.literal(`module`),url:z.string(),vercelConnect:z.object({connector:z.string()}).strict().optional()}).strict(),compiledToolDefinitionSchema=z.object({description:z.string(),exportName:z.string().optional(),inputSchema:jsonObjectSchema.nullable(),logicalPath:z.string(),name:z.string(),outputSchema:jsonObjectSchema.optional(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledDynamicToolDefinitionSchema=z.object({eventNames:z.array(z.string()).readonly(),exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledDynamicSkillDefinitionSchema=z.object({eventNames:z.array(z.string()).readonly(),exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledDynamicInstructionsDefinitionSchema=z.object({eventNames:z.array(z.string()).readonly(),exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledHookDefinitionSchema=z.object({exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledAgentNodeManifestSchema=z.object({agentRoot:z.string(),appRoot:z.string(),channels:z.array(compiledChannelEntrySchema),config:compiledAgentConfigSchema,connections:z.array(compiledConnectionDefinitionSchema),diagnosticsSummary:discoverDiagnosticsSummarySchema,disabledFrameworkTools:z.array(z.string()).readonly(),workflowEnabled:z.boolean().default(!1),dynamicInstructions:z.array(compiledDynamicInstructionsDefinitionSchema).default([]),dynamicSkills:z.array(compiledDynamicSkillDefinitionSchema).default([]),dynamicTools:z.array(compiledDynamicToolDefinitionSchema).default([]),hooks:z.array(compiledHookDefinitionSchema),sandbox:compiledSandboxDefinitionSchema.nullable(),sandboxWorkspaces:z.array(compiledSandboxWorkspaceSchema),schedules:z.array(compiledScheduleDefinitionSchema),remoteAgents:z.array(compiledRemoteAgentNodeSchema),skills:z.array(compiledSkillSourceSchema).readonly(),instructions:compiledInstructionsSchema.optional(),tools:z.array(compiledToolDefinitionSchema),workspaceResourceRoot:compiledWorkspaceResourceRootSchema}).strict(),compiledSubagentNodeSchema=z.object({agent:compiledAgentNodeManifestSchema,description:z.string(),entryPath:z.string(),logicalPath:z.string(),name:z.string(),nodeId:z.string(),rootPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),exportName:z.string().optional()}).strict(),compiledSubagentEdgeSchema=z.object({childNodeId:z.string(),parentNodeId:z.string()}).strict(),compiledAgentManifestSchema=z.object({agentRoot:z.string(),appRoot:z.string(),channels:z.array(compiledChannelEntrySchema),config:compiledAgentConfigSchema,connections:z.array(compiledConnectionDefinitionSchema),diagnosticsSummary:discoverDiagnosticsSummarySchema,disabledFrameworkTools:z.array(z.string()).readonly(),workflowEnabled:z.boolean().default(!1),dynamicInstructions:z.array(compiledDynamicInstructionsDefinitionSchema).default([]),dynamicSkills:z.array(compiledDynamicSkillDefinitionSchema).default([]),dynamicTools:z.array(compiledDynamicToolDefinitionSchema).default([]),hooks:z.array(compiledHookDefinitionSchema),kind:z.literal(COMPILED_AGENT_MANIFEST_KIND),remoteAgents:z.array(compiledRemoteAgentNodeSchema),sandbox:compiledSandboxDefinitionSchema.nullable(),sandboxWorkspaces:z.array(compiledSandboxWorkspaceSchema),schedules:z.array(compiledScheduleDefinitionSchema),skills:z.array(compiledSkillSourceSchema).readonly(),subagentEdges:z.array(compiledSubagentEdgeSchema),subagents:z.array(compiledSubagentNodeSchema),instructions:compiledInstructionsSchema.optional(),tools:z.array(compiledToolDefinitionSchema),version:z.literal(29),workspaceResourceRoot:compiledWorkspaceResourceRootSchema}).strict();function createCompiledAgentNodeManifest(e){let t={agentRoot:e.agentRoot,appRoot:e.appRoot,channels:[...e.channels??[]],connections:[...e.connections??[]],config:{build:e.config.build===void 0?void 0:{externalDependencies:e.config.build.externalDependencies===void 0?void 0:[...e.config.build.externalDependencies]},compaction:{model:e.config.compaction?.model===void 0?void 0:cloneCompiledRuntimeModelReference(e.config.compaction.model),thresholdPercent:e.config.compaction?.thresholdPercent},description:e.config.description,experimental:e.config.experimental===void 0?void 0:{codeMode:e.config.experimental.codeMode},model:cloneCompiledRuntimeModelReference(e.config.model),name:e.config.name,outputSchema:e.config.outputSchema,source:e.config.source===void 0?void 0:{...e.config.source}},diagnosticsSummary:e.diagnosticsSummary??{errors:0,warnings:0},disabledFrameworkTools:[...e.disabledFrameworkTools??[]],workflowEnabled:e.workflowEnabled??!1,dynamicInstructions:[...e.dynamicInstructions??[]],dynamicSkills:[...e.dynamicSkills??[]],dynamicTools:[...e.dynamicTools??[]],hooks:[...e.hooks??[]],remoteAgents:[...e.remoteAgents??[]],sandbox:e.sandbox??null,sandboxWorkspaces:[...e.sandboxWorkspaces??[]],schedules:[...e.schedules??[]],skills:[...e.skills??[]],tools:[...e.tools??[]],workspaceResourceRoot:e.workspaceResourceRoot??{logicalPath:``,rootEntries:deriveResourceRootEntries({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}};return e.instructions!==void 0&&(t.instructions=e.instructions),t}function deriveResourceRootEntries(e){let t=new Set;(e.skills??[]).length>0&&t.add(`skills/`);for(let n of e.sandboxWorkspaces??[])for(let e of n.rootEntries)t.add(e);return[...t].sort((e,t)=>e.localeCompare(t))}function createCompiledSubagentNodeId(e,t){return e===`__root__`?t:`${e}::${t}`}function createCompiledAgentManifest(e){return{...createCompiledAgentNodeManifest(e),kind:COMPILED_AGENT_MANIFEST_KIND,subagentEdges:[...e.subagentEdges??[]],subagents:[...e.subagents??[]],version:29}}function cloneCompiledRuntimeModelReference(e){let t={id:e.id,routing:cloneModelRouting(e.routing)};return e.contextWindowTokens!==void 0&&(t.contextWindowTokens=e.contextWindowTokens),e.providerOptions!==void 0&&(t.providerOptions={...e.providerOptions}),e.source!==void 0&&(t.source={...e.source}),t}function cloneModelRouting(e){return e.kind===`external`?{kind:`external`,provider:e.provider}:e.byok===void 0?{kind:`gateway`,target:e.target}:{kind:`gateway`,target:e.target,byok:e.byok}}export{COMPILED_AGENT_MANIFEST_KIND,COMPILED_AGENT_MANIFEST_VERSION,ROOT_COMPILED_AGENT_NODE_ID,compiledAgentManifestSchema,createCompiledAgentManifest,createCompiledAgentNodeManifest,createCompiledSubagentNodeId,deriveResourceRootEntries};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isAbsolute,join,relative,resolve}from"node:path";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{toErrorMessage}from"#shared/errors.js";import{normalizeJsonSchemaDefinition}from"#shared/json-schema.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{normalizeAgentDefinition}from"#internal/authored-definition/core.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{parseJsonObject}from"#shared/json.js";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";async function compileAgentConfig(e,t){let n=e.configModule,r=n===void 0?void 0:formatAgentConfigModulePath(e,n),a=normalizeAgentDefinition(n===void 0?{model:DEFAULT_AGENT_MODEL_ID}:await loadModuleBackedDefinition({agentRoot:e.agentRoot,displayPath:r,kind:`agent config`,source:n}),n===void 0?`Expected the default agent config to match the public Eve shape.`:`Expected the agent config export "${n.exportName??`default`}" from "${r}" to match the public Eve shape.`),o=await normalizeAuthoredModelReference({modelCatalog:t.modelCatalog,purpose:`the primary compaction trigger model`,contextWindowTokens:a.modelContextWindowTokens,providerOptions:a.modelOptions?.providerOptions,source:n,sourcePath:r,value:a.model}),s={},c={compaction:s,model:o,name:e.agentId};return a.description!==void 0&&(c.description=a.description),a.experimental?.codeMode!==void 0&&(c.experimental={codeMode:a.experimental.codeMode}),a.build!==void 0&&(c.build={externalDependencies:a.build.externalDependencies===void 0?void 0:[...a.build.externalDependencies]}),a.outputSchema!==void 0&&(c.outputSchema=normalizeJsonSchemaDefinition(a.outputSchema,`output`)),n!==void 0&&(c.source={exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId}),a.compaction?.model!==void 0&&(s.model=await normalizeAuthoredModelReference({modelCatalog:t.modelCatalog,purpose:`the compaction summary model`,contextWindowTokens:a.compaction.modelContextWindowTokens,providerOptions:a.modelOptions?.providerOptions,source:n,sourcePath:r,value:a.compaction.model})),a.compaction?.thresholdPercent!==void 0&&(s.thresholdPercent=a.compaction.thresholdPercent),c}async function normalizeAuthoredModelReference(e){if(typeof e.value==`string`)return await withCompiledRuntimeModelLimits({id:formatLanguageModelGatewayId(e.value),providerOptions:parseProviderOptionsRecord(e.providerOptions)},e);let t=e.source;if(t===void 0)throw Error(`Expected ${e.purpose} to provide a valid AI SDK language model reference.`);let n=e.value,r=n.specificationVersion;if(r!==`v2`&&r!==`v3`&&r!==`v4`||typeof n.provider!=`string`||typeof n.modelId!=`string`||typeof n.doGenerate!=`function`||typeof n.doStream!=`function`)throw Error(`Expected the authored agent config export "${t.exportName??`default`}" from "${e.sourcePath??t.logicalPath}" to provide a valid AI SDK language model.`);let i={id:formatLanguageModelGatewayId(n),source:{exportName:t.exportName,sourceKind:`module`,logicalPath:t.logicalPath,sourceId:t.sourceId},providerOptions:parseProviderOptionsRecord(e.providerOptions)};if(e.contextWindowTokens===void 0){let t=await e.modelCatalog.getByProviderModelId(n.provider,n.modelId);if(t)return{...i,id:t.slug,contextWindowTokens:t.limits.contextWindowTokens}}return await withCompiledRuntimeModelLimits(i,e)}function formatAgentConfigModulePath(e,r){let i=join(e.agentRoot,r.logicalPath);return normalizeLogicalPath(relative(resolveTopLevelAgentRoot(e),i))}function resolveTopLevelAgentRoot(e){let t=resolve(e.appRoot),n=resolve(t,`agent`);return isPathInsideOrEqual(n,resolve(e.agentRoot))?n:t}function isPathInsideOrEqual(t,r){let i=relative(t,r);return i===``||!i.startsWith(`..`)&&!isAbsolute(i)}async function withCompiledRuntimeModelLimits(e,t){if(t.contextWindowTokens!==void 0)return{...e,contextWindowTokens:t.contextWindowTokens};let n;try{n=await t.modelCatalog.getModelLimits(e.id)}catch(n){throw Error(`Failed to load AI Gateway model metadata for ${t.purpose} "${e.id}". ${toErrorMessage(n)}`)}if(n===null)throw Error(`Cannot compile agent compaction because ${t.purpose} "${e.id}" does not have known AI Gateway context window metadata.`);return{...e,contextWindowTokens:n.contextWindowTokens}}function parseProviderOptionsRecord(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))t[n]=parseJsonObject(r);return t}export{compileAgentConfig};
|
|
1
|
+
import{isAbsolute,join,relative,resolve}from"node:path";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{toErrorMessage}from"#shared/errors.js";import{normalizeJsonSchemaDefinition}from"#shared/json-schema.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{classifyModelRouting}from"#internal/classify-model-routing.js";import{normalizeAgentDefinition}from"#internal/authored-definition/core.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{parseJsonObject}from"#shared/json.js";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";async function compileAgentConfig(e,t){let n=e.configModule,r=n===void 0?void 0:formatAgentConfigModulePath(e,n),a=normalizeAgentDefinition(n===void 0?{model:DEFAULT_AGENT_MODEL_ID}:await loadModuleBackedDefinition({agentRoot:e.agentRoot,displayPath:r,kind:`agent config`,source:n}),n===void 0?`Expected the default agent config to match the public Eve shape.`:`Expected the agent config export "${n.exportName??`default`}" from "${r}" to match the public Eve shape.`),o=await normalizeAuthoredModelReference({modelCatalog:t.modelCatalog,purpose:`the primary compaction trigger model`,contextWindowTokens:a.modelContextWindowTokens,providerOptions:a.modelOptions?.providerOptions,source:n,sourcePath:r,value:a.model}),s={},c={compaction:s,model:o,name:e.agentId};return a.description!==void 0&&(c.description=a.description),a.experimental?.codeMode!==void 0&&(c.experimental={codeMode:a.experimental.codeMode}),a.build!==void 0&&(c.build={externalDependencies:a.build.externalDependencies===void 0?void 0:[...a.build.externalDependencies]}),a.outputSchema!==void 0&&(c.outputSchema=normalizeJsonSchemaDefinition(a.outputSchema,`output`)),n!==void 0&&(c.source={exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId}),a.compaction?.model!==void 0&&(s.model=await normalizeAuthoredModelReference({modelCatalog:t.modelCatalog,purpose:`the compaction summary model`,contextWindowTokens:a.compaction.modelContextWindowTokens,providerOptions:a.modelOptions?.providerOptions,source:n,sourcePath:r,value:a.compaction.model})),a.compaction?.thresholdPercent!==void 0&&(s.thresholdPercent=a.compaction.thresholdPercent),c}async function normalizeAuthoredModelReference(e){if(typeof e.value==`string`)return await withCompiledRuntimeModelLimits({id:formatLanguageModelGatewayId(e.value),providerOptions:parseProviderOptionsRecord(e.providerOptions),routing:classifyModelRouting(e.value,e.providerOptions)},e);let t=e.source;if(t===void 0)throw Error(`Expected ${e.purpose} to provide a valid AI SDK language model reference.`);let n=e.value,r=n.specificationVersion;if(r!==`v2`&&r!==`v3`&&r!==`v4`||typeof n.provider!=`string`||typeof n.modelId!=`string`||typeof n.doGenerate!=`function`||typeof n.doStream!=`function`)throw Error(`Expected the authored agent config export "${t.exportName??`default`}" from "${e.sourcePath??t.logicalPath}" to provide a valid AI SDK language model.`);let i={id:formatLanguageModelGatewayId(n),source:{exportName:t.exportName,sourceKind:`module`,logicalPath:t.logicalPath,sourceId:t.sourceId},providerOptions:parseProviderOptionsRecord(e.providerOptions),routing:classifyModelRouting(n,e.providerOptions)};if(e.contextWindowTokens===void 0){let t=await e.modelCatalog.getByProviderModelId(n.provider,n.modelId);if(t)return{...i,id:t.slug,contextWindowTokens:t.limits.contextWindowTokens}}return await withCompiledRuntimeModelLimits(i,e)}function formatAgentConfigModulePath(e,r){let i=join(e.agentRoot,r.logicalPath);return normalizeLogicalPath(relative(resolveTopLevelAgentRoot(e),i))}function resolveTopLevelAgentRoot(e){let t=resolve(e.appRoot),n=resolve(t,`agent`);return isPathInsideOrEqual(n,resolve(e.agentRoot))?n:t}function isPathInsideOrEqual(t,r){let i=relative(t,r);return i===``||!i.startsWith(`..`)&&!isAbsolute(i)}async function withCompiledRuntimeModelLimits(e,t){if(t.contextWindowTokens!==void 0)return{...e,contextWindowTokens:t.contextWindowTokens};let n;try{n=await t.modelCatalog.getModelLimits(e.id)}catch(n){throw Error(`Failed to load AI Gateway model metadata for ${t.purpose} "${e.id}". ${toErrorMessage(n)}`)}if(n===null)throw Error(`Cannot compile agent compaction because ${t.purpose} "${e.id}" does not have known AI Gateway context window metadata.`);return{...e,contextWindowTokens:n.contextWindowTokens}}function parseProviderOptionsRecord(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))t[n]=parseJsonObject(r);return t}export{compileAgentConfig};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{join}from"node:path";import{readFile}from"node:fs/promises";import{toErrorMessage}from"#shared/errors.js";import{createHash}from"node:crypto";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";import{normalizeSandboxDefinition}from"#internal/authored-definition/sandbox.js";async function compileSandboxDefinition(e,t,n={}){let r=`Expected the sandbox export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Eve shape.`,o=normalizeSandboxDefinition(await loadModuleBackedDefinition({agentRoot:e,externalDependencies:n.externalDependencies,kind:`sandbox`,source:t}),r),s=o.revalidationKey===void 0?void 0:await resolveSandboxRevalidationKey({message:r,revalidationKey:o.revalidationKey,source:t});return{description:o.description,exportName:t.exportName,logicalPath:t.logicalPath,revalidationKey:s,sourceHash:await resolveSandboxSourceHash(e,t),sourceId:t.sourceId,sourceKind:`module`}}async function resolveSandboxRevalidationKey(e){let t;try{t=await e.revalidationKey()}catch(t){throw Error(`${e.message} Failed to execute the "revalidationKey" function from "${e.source.logicalPath}": ${toErrorMessage(t)}`)}if(typeof t!=`string`)throw Error(`${e.message} The "revalidationKey" function must return a string.`);if(t.trim().length===0)throw Error(`${e.message} The "revalidationKey" function must return a non-empty string.`);return t}async function resolveSandboxSourceHash(n,i){let a=await readFile(join(n,i.logicalPath));return createHash(`sha256`).update(a).digest(`hex`)}export{compileSandboxDefinition};
|
|
1
|
+
import{join}from"node:path";import{readFile}from"node:fs/promises";import{toErrorMessage}from"#shared/errors.js";import{createHash}from"node:crypto";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";import{normalizeSandboxDefinition}from"#internal/authored-definition/sandbox.js";async function compileSandboxDefinition(e,t,n={}){let r=`Expected the sandbox export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Eve shape.`,o=normalizeSandboxDefinition(await loadModuleBackedDefinition({agentRoot:e,externalDependencies:n.externalDependencies,kind:`sandbox`,source:t}),r),s=o.revalidationKey===void 0?void 0:await resolveSandboxRevalidationKey({message:r,revalidationKey:o.revalidationKey,source:t});return{backendName:resolveCompiledBackendName(o.backend),description:o.description,exportName:t.exportName,logicalPath:t.logicalPath,revalidationKey:s,sourceHash:await resolveSandboxSourceHash(e,t),sourceId:t.sourceId,sourceKind:`module`}}function resolveCompiledBackendName(e){if(e!==void 0)try{return e.name}catch{return}}async function resolveSandboxRevalidationKey(e){let t;try{t=await e.revalidationKey()}catch(t){throw Error(`${e.message} Failed to execute the "revalidationKey" function from "${e.source.logicalPath}": ${toErrorMessage(t)}`)}if(typeof t!=`string`)throw Error(`${e.message} The "revalidationKey" function must return a string.`);if(t.trim().length===0)throw Error(`${e.message} The "revalidationKey" function must return a non-empty string.`);return t}async function resolveSandboxSourceHash(n,i){let a=await readFile(join(n,i.logicalPath));return createHash(`sha256`).update(a).digest(`hex`)}export{compileSandboxDefinition};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{Client}from"#client/client.js";function resolveEvalClientOptions(t){if(t.kind===`local`)return{host:t.url};let n=resolveDevelopmentClientOptions(t.url),r=process.env.EVE_EVAL_AUTH_TOKEN?.trim();return r?{...n,auth:{bearer:r}}:n}function createEvalClient(e){return new Client(resolveEvalClientOptions(e))}export{createEvalClient,resolveEvalClientOptions};
|
|
1
|
+
import{resolveDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{Client}from"#client/client.js";function resolveEvalClientOptions(t){if(t.kind===`local`)return{host:t.url};let n={...resolveDevelopmentClientOptions(t.url),preserveCompletedSessions:!1},r=process.env.EVE_EVAL_AUTH_TOKEN?.trim();return r?{...n,auth:{bearer:r}}:n}function createEvalClient(e){return new Client(resolveEvalClientOptions(e))}export{createEvalClient,resolveEvalClientOptions};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{truncateTail}from"#execution/sandbox/truncate-output.js";async function executeBashOnSandbox(
|
|
1
|
+
import{truncateTail}from"#execution/sandbox/truncate-output.js";import{isEveDevEnvironment}from"#internal/application/optional-package-install.js";async function executeBashOnSandbox(t,n){let r=await runWithDevelopmentSandboxProgress(t,n.command),i=truncateTail(r.stdout),a=truncateTail(r.stderr),o=i.truncated||a.truncated,s=i.output;i.truncated&&(s=`[stdout truncated: showing last ${i.outputLines} of ${i.totalLines} lines]\n`+s);let c=a.output;return a.truncated&&(c=`[stderr truncated: showing last ${a.outputLines} of ${a.totalLines} lines]\n`+c),{exitCode:r.exitCode,stderr:c,stdout:s,truncated:o}}async function runWithDevelopmentSandboxProgress(e,n){if(logDevelopmentSandboxCommand(`Eve: starting sandbox command: ${formatCommand(n)}`),!isEveDevEnvironment())return await e.run({command:n});let r=Date.now(),i=setInterval(()=>{logDevelopmentSandboxCommand(`Eve: waiting for sandbox command (${Math.round((Date.now()-r)/1e3)}s elapsed): ${formatCommand(n)}`)},5e3);i.unref?.();try{let t=await e.run({command:n});return logDevelopmentSandboxCommand(`Eve: sandbox command finished (exit ${t.exitCode}): ${formatCommand(n)}`),t}catch(e){throw logDevelopmentSandboxCommand(`Eve: sandbox command failed: ${formatCommand(n)}`),e}finally{clearInterval(i)}}function logDevelopmentSandboxCommand(e){isEveDevEnvironment()&&console.log(e)}function formatCommand(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}export{executeBashOnSandbox};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-time setup applied to containers created from the raw base image
|
|
3
|
+
* (template builds and template-less sessions). Runs under `/bin/sh`
|
|
4
|
+
* because `bash` may not exist yet: ensures `/workspace`, installs
|
|
5
|
+
* `bash` (hard requirement — every command runs via `bash -lc` for
|
|
6
|
+
* parity with the Vercel backend), installs/verifies Node 24/npm, and
|
|
7
|
+
* best-effort installs `ripgrep`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildDockerBaseSetupScript(): string;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";function buildDockerBaseSetupScript(){return[`set -e`,`mkdir -p ${WORKSPACE_ROOT}`,`if command -v apt-get >/dev/null 2>&1; then export DEBIAN_FRONTEND=noninteractive; fi`,`if ! command -v bash >/dev/null 2>&1; then`,` if command -v dnf >/dev/null 2>&1; then dnf install -y bash >/dev/null 2>&1 || true;`,` elif command -v microdnf >/dev/null 2>&1; then microdnf install -y bash >/dev/null 2>&1 || true;`,` elif command -v apt-get >/dev/null 2>&1; then apt-get update >/dev/null 2>&1 && apt-get install -y --no-install-recommends bash >/dev/null 2>&1 || true;`,` elif command -v apk >/dev/null 2>&1; then apk add --no-cache bash >/dev/null 2>&1 || true;`,` fi`,`fi`,`command -v bash >/dev/null 2>&1 || { echo "the sandbox image must provide bash (or a package manager able to install it)" >&2; exit 70; }`,`if ! command -v node >/dev/null 2>&1 || ! node --version | grep -q "^v24\\."; then`,` if command -v apt-get >/dev/null 2>&1; then`,` apt-get update >/dev/null 2>&1`,` apt-get install -y --no-install-recommends ca-certificates curl gnupg >/dev/null 2>&1`,` mkdir -p /etc/apt/keyrings`,` curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg`,` echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_24.x nodistro main" > /etc/apt/sources.list.d/nodesource.list`,` apt-get update >/dev/null 2>&1`,` apt-get install -y --no-install-recommends nodejs >/dev/null 2>&1`,` elif command -v dnf >/dev/null 2>&1; then dnf install -y nodejs24 nodejs24-npm >/dev/null 2>&1 || dnf install -y nodejs24 >/dev/null 2>&1 || true;`,` elif command -v microdnf >/dev/null 2>&1; then microdnf install -y nodejs24 nodejs24-npm >/dev/null 2>&1 || microdnf install -y nodejs24 >/dev/null 2>&1 || true;`,` elif command -v apk >/dev/null 2>&1; then apk add --no-cache nodejs npm >/dev/null 2>&1 || true;`,` fi`,`fi`,`command -v node >/dev/null 2>&1 && node --version | grep -q "^v24\\." || { echo "the sandbox image must provide Node 24" >&2; exit 70; }`,`command -v npm >/dev/null 2>&1 || { echo "the sandbox image must provide npm" >&2; exit 70; }`,`if ! command -v rg >/dev/null 2>&1; then`,` if command -v dnf >/dev/null 2>&1; then dnf install -y ripgrep >/dev/null 2>&1 || true;`,` elif command -v microdnf >/dev/null 2>&1; then microdnf install -y ripgrep >/dev/null 2>&1 || true;`,` elif command -v apt-get >/dev/null 2>&1; then apt-get update >/dev/null 2>&1 && apt-get install -y --no-install-recommends ripgrep >/dev/null 2>&1 || true;`,` elif command -v apk >/dev/null 2>&1; then apk add --no-cache ripgrep >/dev/null 2>&1 || true;`,` fi`,`fi`].join(`
|
|
2
|
+
`)}export{buildDockerBaseSetupScript};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buffered result of one `docker …` invocation.
|
|
3
|
+
*
|
|
4
|
+
* `stdout` decodes the raw bytes as UTF-8 for the common text case;
|
|
5
|
+
* `stdoutBytes` preserves the exact bytes for binary payloads (for
|
|
6
|
+
* example reading a file out of a container via `cat`).
|
|
7
|
+
*/
|
|
8
|
+
export interface DockerCommandResult {
|
|
9
|
+
readonly exitCode: number;
|
|
10
|
+
readonly stderr: string;
|
|
11
|
+
readonly stdout: string;
|
|
12
|
+
readonly stdoutBytes: Buffer;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Options for one buffered {@link DockerCli.run} invocation.
|
|
16
|
+
*/
|
|
17
|
+
export interface DockerRunOptions {
|
|
18
|
+
readonly signal?: AbortSignal;
|
|
19
|
+
readonly stdin?: Uint8Array;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Handle to one streaming `docker …` invocation (e.g. `docker exec`).
|
|
23
|
+
* Mirrors the AI SDK `Experimental_SandboxProcess` stream/wait/kill
|
|
24
|
+
* shape so the sandbox engine can adapt it directly.
|
|
25
|
+
*/
|
|
26
|
+
export interface DockerProcess {
|
|
27
|
+
readonly stdout: ReadableStream<Uint8Array>;
|
|
28
|
+
readonly stderr: ReadableStream<Uint8Array>;
|
|
29
|
+
wait(): Promise<{
|
|
30
|
+
exitCode: number;
|
|
31
|
+
}>;
|
|
32
|
+
kill(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Minimal Docker CLI driver the local sandbox engine runs on. A thin
|
|
36
|
+
* subprocess wrapper in production; injectable so engine logic is unit
|
|
37
|
+
* testable without a Docker daemon.
|
|
38
|
+
*/
|
|
39
|
+
export interface DockerCli {
|
|
40
|
+
/** Runs `docker <args>` to completion, buffering stdout/stderr. */
|
|
41
|
+
run(args: readonly string[], options?: DockerRunOptions): Promise<DockerCommandResult>;
|
|
42
|
+
/** Spawns `docker <args>` with streaming stdout/stderr. */
|
|
43
|
+
stream(args: readonly string[], options?: {
|
|
44
|
+
readonly signal?: AbortSignal;
|
|
45
|
+
}): DockerProcess;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Raised when the `docker` executable cannot be spawned at all (not
|
|
49
|
+
* installed or not on `PATH`).
|
|
50
|
+
*/
|
|
51
|
+
export declare class DockerUnavailableError extends Error {
|
|
52
|
+
constructor(cause?: unknown);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Raised when the `docker` CLI exists but the daemon is not reachable.
|
|
56
|
+
*/
|
|
57
|
+
export declare class DockerDaemonUnavailableError extends Error {
|
|
58
|
+
constructor(detail: string);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Verifies the Docker daemon answers before the engine performs its
|
|
62
|
+
* first real operation, converting CLI/daemon failures into actionable
|
|
63
|
+
* errors instead of letting individual commands fail obscurely.
|
|
64
|
+
*/
|
|
65
|
+
export declare function assertDockerDaemonAvailable(cli: DockerCli): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Synchronously probes whether a Docker daemon is reachable, for
|
|
68
|
+
* `defaultBackend()`'s availability chain. The result is cached for the
|
|
69
|
+
* process lifetime: backend selection must be stable, and the probe
|
|
70
|
+
* costs a subprocess round-trip.
|
|
71
|
+
*/
|
|
72
|
+
export declare function isDockerDaemonAvailableSync(): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Creates the production {@link DockerCli} that shells out to the
|
|
75
|
+
* `docker` executable (override the binary with `EVE_DOCKER_PATH`).
|
|
76
|
+
*/
|
|
77
|
+
export declare function createDockerCli(): DockerCli;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{spawn,spawnSync}from"node:child_process";import{Readable}from"node:stream";var DockerUnavailableError=class extends Error{constructor(e){super("The Docker sandbox backend requires Docker, but the `docker` CLI was not found. Install and start Docker Desktop, OrbStack, Colima, or another runtime exposing a Docker-compatible `docker` CLI (or point EVE_DOCKER_PATH at one, e.g. Podman). Alternatively use microsandboxBackend(), the dependency-free justBashBackend(), vercelSandboxBackend(), or defaultBackend() to pick by availability.",{cause:e}),this.name=`DockerUnavailableError`}},DockerDaemonUnavailableError=class extends Error{constructor(e){super(`The Docker sandbox backend requires a running Docker daemon, but it is not reachable. Start Docker Desktop (or your Docker-compatible runtime) and retry. Alternatively use microsandboxBackend(), the dependency-free justBashBackend() (installed automatically by \`eve dev\`, or \`pnpm add -D just-bash\`), vercelSandboxBackend(), or defaultBackend() to pick by availability. Docker reported: ${e}`),this.name=`DockerDaemonUnavailableError`}};async function assertDockerDaemonAvailable(e){let t=await e.run([`version`,`--format`,`{{.Server.Version}}`]);if(t.exitCode!==0)throw new DockerDaemonUnavailableError(firstLine(t.stderr)||`exit ${t.exitCode}`)}function resolveDockerExecutable(){let e=process.env.EVE_DOCKER_PATH?.trim();return e!==void 0&&e.length>0?e:`docker`}let cachedDockerAvailability;function isDockerDaemonAvailableSync(){return cachedDockerAvailability??=probeDockerDaemonSync(),cachedDockerAvailability}function probeDockerDaemonSync(){try{return spawnSync(resolveDockerExecutable(),[`version`,`--format`,`{{.Server.Version}}`],{stdio:`ignore`,timeout:5e3}).status===0}catch{return!1}}function createDockerCli(){return{async run(t,n={}){throwIfAborted(n.signal);let r=spawn(resolveDockerExecutable(),t,{signal:n.signal,stdio:[n.stdin===void 0?`ignore`:`pipe`,`pipe`,`pipe`]}),i=[],a=[];r.stdout?.on(`data`,e=>i.push(e)),r.stderr?.on(`data`,e=>a.push(e)),n.stdin!==void 0&&r.stdin?.end(n.stdin);let o=await new Promise((e,t)=>{r.on(`error`,e=>t(adaptSpawnError(e))),r.on(`close`,t=>e(t??1))}),s=Buffer.concat(i);return{exitCode:o,stderr:Buffer.concat(a).toString(`utf8`),stdout:s.toString(`utf8`),stdoutBytes:s}},stream(t,r={}){throwIfAborted(r.signal);let i=spawn(resolveDockerExecutable(),t,{signal:r.signal,stdio:[`ignore`,`pipe`,`pipe`]}),a=new Promise((e,t)=>{i.on(`error`,e=>t(adaptSpawnError(e))),i.on(`close`,t=>e(t??1))});return a.catch(()=>{}),{stdout:Readable.toWeb(i.stdout),stderr:Readable.toWeb(i.stderr),async wait(){return{exitCode:await a}},async kill(){i.kill(`SIGKILL`),await a.catch(()=>{})}}}}}function adaptSpawnError(e){return e.code===`ENOENT`?new DockerUnavailableError(e):e.code===`ABORT_ERR`?new DOMException(`The operation was aborted.`,`AbortError`):e}function throwIfAborted(e){if(e?.aborted)throw new DOMException(`The operation was aborted.`,`AbortError`)}function firstLine(e){return e.split(`
|
|
2
|
+
`,1)[0]?.trim()??``}export{DockerDaemonUnavailableError,DockerUnavailableError,assertDockerDaemonAvailable,createDockerCli,isDockerDaemonAvailableSync};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DockerCli } from "#execution/sandbox/bindings/docker-cli.js";
|
|
2
|
+
import type { ResolvedDockerSandboxOptions } from "#execution/sandbox/bindings/docker-options.js";
|
|
3
|
+
import type { SandboxBackendTags } from "#public/definitions/sandbox-backend.js";
|
|
4
|
+
import type { DockerSandboxNetworkPolicy } from "#public/sandbox/docker-sandbox.js";
|
|
5
|
+
export declare const DOCKER_SANDBOX_LABEL = "eve.sandbox";
|
|
6
|
+
export declare function startDockerContainer(input: {
|
|
7
|
+
readonly cli: DockerCli;
|
|
8
|
+
readonly containerName: string;
|
|
9
|
+
readonly image: string;
|
|
10
|
+
readonly initialNetworkPolicy: DockerSandboxNetworkPolicy;
|
|
11
|
+
readonly options: ResolvedDockerSandboxOptions;
|
|
12
|
+
readonly role: "session" | "template-build";
|
|
13
|
+
readonly tags?: SandboxBackendTags;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
export declare function runDockerBaseSetup(cli: DockerCli, containerName: string): Promise<void>;
|
|
16
|
+
export declare function stopDockerContainerIfRunning(cli: DockerCli, containerName: string): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{buildDockerBaseSetupScript}from"#execution/sandbox/bindings/docker-base-setup.js";import{expectDockerSuccess}from"#execution/sandbox/bindings/docker-utils.js";import{withDevelopmentSandboxTags}from"#execution/sandbox/development-run.js";const DOCKER_SANDBOX_LABEL=`eve.sandbox`,DOCKER_KEEPALIVE_ARGS=[`-c`,`sleep 2147483647`];async function startDockerContainer(t){let i=[`run`,`-d`,`--name`,t.containerName,`--label`,`${DOCKER_SANDBOX_LABEL}=1`,`--label`,`${DOCKER_SANDBOX_LABEL}.role=${t.role}`];for(let[e,n]of Object.entries(withDevelopmentSandboxTags(t.tags)??{}))i.push(`--label`,`${DOCKER_SANDBOX_LABEL}.tag.${e}=${n}`);for(let[e,n]of Object.entries(t.options.env))i.push(`-e`,`${e}=${n}`);t.initialNetworkPolicy===`deny-all`&&i.push(`--network`,`none`),i.push(`--workdir`,WORKSPACE_ROOT,`--entrypoint`,`/bin/sh`,t.image,...DOCKER_KEEPALIVE_ARGS),expectDockerSuccess(await t.cli.run(i),`start sandbox container "${t.containerName}" from "${t.image}"`)}async function runDockerBaseSetup(e,r){expectDockerSuccess(await e.run([`exec`,`--user`,`root`,r,`/bin/sh`,`-c`,buildDockerBaseSetupScript()]),`prepare base runtime in sandbox container "${r}"`)}async function stopDockerContainerIfRunning(e,t){await e.run([`stop`,`-t`,`0`,t]).catch(()=>{})}export{DOCKER_SANDBOX_LABEL,runDockerBaseSetup,startDockerContainer,stopDockerContainerIfRunning};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DockerCli } from "#execution/sandbox/bindings/docker-cli.js";
|
|
2
|
+
import type { SandboxNetworkPolicy } from "#shared/sandbox-network-policy.js";
|
|
3
|
+
/**
|
|
4
|
+
* Applies a coarse-grained run-time network policy by attaching or
|
|
5
|
+
* detaching the container's networks. Domain-level policies and
|
|
6
|
+
* credential brokering require the firewall on the Vercel backend.
|
|
7
|
+
*/
|
|
8
|
+
export declare function setDockerNetworkPolicy(cli: DockerCli, containerName: string, policy: SandboxNetworkPolicy): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{expectDockerSuccess}from"#execution/sandbox/bindings/docker-utils.js";async function setDockerNetworkPolicy(e,t,n){if(n!==`allow-all`&&n!==`deny-all`)throw Error(`The local Docker sandbox backend supports only the "allow-all" and "deny-all" network policies. Domain-level allow-lists and credential brokering require the Vercel backend (vercelSandboxBackend()) or microsandboxBackend().`);let r=await e.run([`container`,`inspect`,`--format`,`{{json .NetworkSettings.Networks}}`,t]);expectDockerSuccess(r,`inspect networks of sandbox container "${t}"`);let i=Object.keys(JSON.parse(r.stdout.trim()===``?`{}`:r.stdout));if(n===`deny-all`){for(let n of i)expectDockerSuccess(await e.run([`network`,`disconnect`,`--force`,n,t]),`disconnect sandbox container "${t}" from network "${n}"`);return}i.includes(`bridge`)||(i.includes(`none`)&&expectDockerSuccess(await e.run([`network`,`disconnect`,`--force`,`none`,t]),`detach sandbox container "${t}" from the none network`),expectDockerSuccess(await e.run([`network`,`connect`,`bridge`,t]),`connect sandbox container "${t}" to the bridge network`))}export{setDockerNetworkPolicy};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DockerSandboxCreateOptions, DockerSandboxNetworkPolicy, DockerSandboxPullPolicy } from "#public/sandbox/docker-sandbox.js";
|
|
2
|
+
/**
|
|
3
|
+
* Default base image for the Docker backend: the official Ubuntu 26.04
|
|
4
|
+
* image. Framework setup installs Node 24 and baseline tools.
|
|
5
|
+
*/
|
|
6
|
+
export declare const DEFAULT_DOCKER_SANDBOX_IMAGE = "ubuntu:26.04";
|
|
7
|
+
/**
|
|
8
|
+
* Fully-defaulted Docker backend options consumed by the backend
|
|
9
|
+
* implementation.
|
|
10
|
+
*/
|
|
11
|
+
export interface ResolvedDockerSandboxOptions {
|
|
12
|
+
readonly env: Readonly<Record<string, string>>;
|
|
13
|
+
readonly image: string;
|
|
14
|
+
readonly networkPolicy: DockerSandboxNetworkPolicy;
|
|
15
|
+
readonly pullPolicy: DockerSandboxPullPolicy;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Applies defaults to `dockerBackend(opts)`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveDockerSandboxOptions(options?: DockerSandboxCreateOptions): ResolvedDockerSandboxOptions;
|
|
21
|
+
export declare function createDockerSandboxOptionsHash(options: ResolvedDockerSandboxOptions): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createHash}from"node:crypto";const DEFAULT_DOCKER_SANDBOX_IMAGE=`ubuntu:26.04`;function resolveDockerSandboxOptions(e={}){return{env:e.env??{},image:e.image??`ubuntu:26.04`,networkPolicy:e.networkPolicy??`allow-all`,pullPolicy:e.pullPolicy??`if-not-present`}}function createDockerSandboxOptionsHash(t){return createHash(`sha256`).update(JSON.stringify(dockerSandboxOptionsForHash(t))).digest(`hex`).slice(0,20)}function dockerSandboxOptionsForHash(e){return{env:sortStringRecord(e.env),image:e.image,networkPolicy:e.networkPolicy,pullPolicy:e.pullPolicy}}function sortStringRecord(e){return Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)))}export{DEFAULT_DOCKER_SANDBOX_IMAGE,createDockerSandboxOptionsHash,resolveDockerSandboxOptions};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DockerCli } from "#execution/sandbox/bindings/docker-cli.js";
|
|
2
|
+
import type { InternalSandboxSession } from "#shared/sandbox-session.js";
|
|
3
|
+
export declare function createDockerInternalSession(input: {
|
|
4
|
+
readonly cli: DockerCli;
|
|
5
|
+
readonly containerName: string;
|
|
6
|
+
readonly id: string;
|
|
7
|
+
}): InternalSandboxSession;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{randomUUID}from"node:crypto";import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{expectDockerSuccess}from"#execution/sandbox/bindings/docker-utils.js";import{dirname}from"node:path/posix";import{resolveWorkspacePath}from"#execution/sandbox/bindings/local-backend-utils.js";import{shellQuote}from"#execution/sandbox/shell-quote.js";import{bufferToStream,streamToBuffer}from"#execution/sandbox/stream-utils.js";const DOCKER_KILL_TREE_SCRIPT=[`pid_file="$1"`,`target="$(cat "$pid_file" 2>/dev/null)" || exit 0`,`[ -n "$target" ] || exit 0`,`kill_tree() {`,` local parent="$1" dir child ppid line`,` for dir in /proc/[0-9]*; do`,' child="${dir#/proc/}"',` ppid=""`,` while IFS= read -r line; do`,` case "$line" in`,' PPid:*) ppid="${line#PPid:}"; ppid="${ppid//[^0-9]/}"; break ;;',` esac`,` done < "$dir/status" 2>/dev/null`,` [ "$ppid" = "$parent" ] && kill_tree "$child"`,` done`,` kill -9 "$parent" 2>/dev/null`,`}`,`kill_tree "$target"`,`rm -f "$pid_file"`,`exit 0`].join(`
|
|
2
|
+
`);function createDockerInternalSession(s){let{cli:c,containerName:l}=s;async function killSpawnTree(e){await c.run([`exec`,l,`bash`,`-c`,DOCKER_KILL_TREE_SCRIPT,`eve-kill-tree`,e]).catch(()=>{})}return{id:s.id,resolvePath:resolveWorkspacePath,async spawn(n){let r=[`exec`,`-w`,resolveWorkspacePath(n.workingDirectory??WORKSPACE_ROOT)];for(let[e,t]of Object.entries(n.env??{}))r.push(`-e`,`${e}=${t}`);let i=`/tmp/.eve-sbx-spawn-${randomUUID()}.pid`,a=`echo "$$" > ${shellQuote(i)}; bash -lc ${shellQuote(n.command)}; status=$?; rm -f ${shellQuote(i)}; exit $status`;r.push(l,`bash`,`-c`,a);let o=c.stream(r,{signal:n.abortSignal});return n.abortSignal?.addEventListener(`abort`,()=>void killSpawnTree(i),{once:!0}),{stdout:o.stdout,stderr:o.stderr,async wait(){return await o.wait()},async kill(){await killSpawnTree(i),await o.kill()}}},async readFile(e){let t=shellQuote(e.path),r=await c.run([`exec`,l,`bash`,`-lc`,`if [ -e ${t} ]; then exec cat ${t}; else exit 43; fi`],{signal:e.abortSignal});return r.exitCode===43?null:(expectDockerSuccess(r,`read "${e.path}" from sandbox container`),bufferToStream(r.stdoutBytes))},async removePath(e){let t=`${e.recursive===!0?`r`:``}${e.force===!0?`f`:``}`,r=[`exec`,l,`rm`,...t.length>0?[`-${t}`]:[],`--`,e.path];expectDockerSuccess(await c.run(r,{signal:e.abortSignal}),`remove "${e.path}" from sandbox container`)},async writeFile(e){let t=await streamToBuffer(e.content);expectDockerSuccess(await c.run([`exec`,`-i`,l,`bash`,`-lc`,`mkdir -p ${shellQuote(dirname(e.path))} && cat > ${shellQuote(e.path)}`],{signal:e.abortSignal,stdin:t}),`write "${e.path}" into sandbox container`)}}}export{createDockerInternalSession};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type DockerCli } from "#execution/sandbox/bindings/docker-cli.js";
|
|
2
|
+
import type { ResolvedDockerSandboxOptions } from "#execution/sandbox/bindings/docker-options.js";
|
|
3
|
+
/**
|
|
4
|
+
* Local image repository holding prewarmed sandbox template images.
|
|
5
|
+
* One tag per template key; sessions run containers from these images.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DOCKER_TEMPLATE_IMAGE_REPOSITORY = "eve-sandbox-template";
|
|
8
|
+
/**
|
|
9
|
+
* Removes stale Docker sandbox template images for one application.
|
|
10
|
+
*
|
|
11
|
+
* Template usage is tracked through per-app marker files (touched on
|
|
12
|
+
* prewarm and session create) because Docker images carry only an
|
|
13
|
+
* immutable creation time. Markers beyond the retain count and recency
|
|
14
|
+
* window get their image untagged; the marker is kept when `rmi` fails
|
|
15
|
+
* (for example while a session container still references the image)
|
|
16
|
+
* so the template stays managed.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pruneDockerSandboxTemplates(input: {
|
|
19
|
+
readonly appRoot: string;
|
|
20
|
+
readonly dockerCli?: DockerCli;
|
|
21
|
+
readonly now?: number;
|
|
22
|
+
readonly recentWindowMs?: number;
|
|
23
|
+
readonly retainCount?: number;
|
|
24
|
+
}): Promise<void>;
|
|
25
|
+
export declare function dockerTemplateImageReference(input: {
|
|
26
|
+
readonly optionsHash: string;
|
|
27
|
+
readonly templateKey: string;
|
|
28
|
+
}): string;
|
|
29
|
+
export declare function resolveDockerTemplateMarkerPath(appRoot: string, input: {
|
|
30
|
+
readonly optionsHash: string;
|
|
31
|
+
readonly templateKey: string;
|
|
32
|
+
}): string;
|
|
33
|
+
export declare function touchDockerTemplateMarker(markerPath: string, imageReference: string): Promise<void>;
|
|
34
|
+
export declare function dockerImageExists(cli: DockerCli, imageReference: string): Promise<boolean>;
|
|
35
|
+
export declare function ensureDockerBaseImage(cli: DockerCli, options: ResolvedDockerSandboxOptions): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{dirname,join}from"node:path";import"node:fs";import{mkdir,readdir,rm,stat,utimes,writeFile}from"node:fs/promises";import{resolveSandboxCacheDirectory}from"#internal/application/paths.js";import{expectDockerSuccess}from"#execution/sandbox/bindings/docker-utils.js";import{createDockerCli}from"#execution/sandbox/bindings/docker-cli.js";import{LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS,LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT,selectStaleTemplateEntries}from"#execution/sandbox/bindings/local-template-prune.js";const DOCKER_TEMPLATE_IMAGE_REPOSITORY=`eve-sandbox-template`;async function pruneDockerSandboxTemplates(e){let n=e.dockerCli??createDockerCli(),i=resolveDockerTemplateMarkersDirectory(e.appRoot),a;try{a=await readdir(i,{withFileTypes:!0})}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let o=selectStaleTemplateEntries(await Promise.all(a.filter(e=>e.isFile()).map(async e=>{let n=join(i,e.name);return{imageTag:e.name,mtimeMs:(await stat(n)).mtimeMs,path:n}})),{now:e.now??Date.now(),recentWindowMs:e.recentWindowMs??LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS,retainCount:e.retainCount??LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT});for(let e of o){let t=await n.run([`rmi`,dockerTemplateImageReferenceFromTag(e.imageTag)]),r=t.exitCode!==0&&/no such image/i.test(t.stderr);(t.exitCode===0||r)&&await rm(e.path,{force:!0})}}function dockerTemplateImageReference(e){return dockerTemplateImageReferenceFromTag(dockerTemplateImageTag(e))}function dockerTemplateImageReferenceFromTag(e){return`${DOCKER_TEMPLATE_IMAGE_REPOSITORY}:${e}`}function dockerTemplateImageTag(e){return`${e.templateKey.toLowerCase()}-${e.optionsHash}`}function resolveDockerTemplateMarkerPath(e,n){return join(resolveDockerTemplateMarkersDirectory(e),dockerTemplateImageTag(n))}async function touchDockerTemplateMarker(t,r){await mkdir(dirname(t),{recursive:!0});try{let e=new Date;await utimes(t,e,e)}catch{await writeFile(t,`${r}\n`)}}async function dockerImageExists(e,t){return(await e.run([`image`,`inspect`,`--format`,`{{.Id}}`,t])).exitCode===0}async function ensureDockerBaseImage(e,t){if(t.pullPolicy===`always`){expectDockerSuccess(await e.run([`pull`,t.image]),`pull base image "${t.image}"`);return}if(!await dockerImageExists(e,t.image)){if(t.pullPolicy===`never`)throw Error(`The local sandbox base image "${t.image}" is not present locally and pullPolicy is "never". Pull the image manually or relax the pull policy.`);expectDockerSuccess(await e.run([`pull`,t.image]),`pull base image "${t.image}"`)}}function resolveDockerTemplateMarkersDirectory(e){return join(resolveSandboxCacheDirectory(e),`docker`,`templates`)}export{DOCKER_TEMPLATE_IMAGE_REPOSITORY,dockerImageExists,dockerTemplateImageReference,ensureDockerBaseImage,pruneDockerSandboxTemplates,resolveDockerTemplateMarkerPath,touchDockerTemplateMarker};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function expectDockerSuccess(e,t){if(e.exitCode!==0){let n=e.stderr.trim()||e.stdout.trim()||`exit code ${e.exitCode}`;throw Error(`Failed to ${t}: ${n}`)}}export{expectDockerSuccess};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type DockerCli } from "#execution/sandbox/bindings/docker-cli.js";
|
|
2
|
+
import type { SandboxBackend } from "#public/definitions/sandbox-backend.js";
|
|
3
|
+
import type { DockerSandboxCreateOptions } from "#public/sandbox/docker-sandbox.js";
|
|
4
|
+
export { DOCKER_TEMPLATE_IMAGE_REPOSITORY, pruneDockerSandboxTemplates, } from "#execution/sandbox/bindings/docker-templates.js";
|
|
5
|
+
/**
|
|
6
|
+
* Stable backend name. Participates in template/session key derivation
|
|
7
|
+
* and persisted reconnect state.
|
|
8
|
+
*/
|
|
9
|
+
export declare const DOCKER_BACKEND_NAME = "docker";
|
|
10
|
+
/**
|
|
11
|
+
* Construction input for {@link createDockerSandboxBackend}. Internal —
|
|
12
|
+
* the public surface is the `dockerBackend()` factory under
|
|
13
|
+
* `eve/sandbox`.
|
|
14
|
+
*/
|
|
15
|
+
export interface CreateDockerSandboxBackendInput {
|
|
16
|
+
readonly createOptions?: DockerSandboxCreateOptions;
|
|
17
|
+
/** Injectable Docker driver so backend logic is testable without a daemon. */
|
|
18
|
+
readonly dockerCli?: DockerCli;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Creates the Docker sandbox backend.
|
|
22
|
+
*
|
|
23
|
+
* Two-phase lifecycle mapped onto Docker primitives:
|
|
24
|
+
*
|
|
25
|
+
* - `prewarm` runs the base image, applies base setup, runs the
|
|
26
|
+
* authored `bootstrap`, writes seed files, then `docker commit`s the
|
|
27
|
+
* container into a reusable template image.
|
|
28
|
+
* - `create` starts (or restarts) one long-lived container per session
|
|
29
|
+
* key from the template image. The container's filesystem carries
|
|
30
|
+
* session state across reconnects; `dispose` intentionally leaves it
|
|
31
|
+
* running so reattach is instant, mirroring the Vercel backend.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createDockerSandboxBackend(input?: CreateDockerSandboxBackendInput): SandboxBackend;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{randomUUID}from"node:crypto";import{expectDockerSuccess}from"#execution/sandbox/bindings/docker-utils.js";import{writeSandboxSeedFiles}from"#execution/sandbox/bindings/local-backend-utils.js";import{assertDockerDaemonAvailable,createDockerCli}from"#execution/sandbox/bindings/docker-cli.js";import{DOCKER_SANDBOX_LABEL,runDockerBaseSetup,startDockerContainer}from"#execution/sandbox/bindings/docker-container.js";import{setDockerNetworkPolicy}from"#execution/sandbox/bindings/docker-network.js";import{createDockerSandboxOptionsHash,resolveDockerSandboxOptions}from"#execution/sandbox/bindings/docker-options.js";import{createDockerInternalSession}from"#execution/sandbox/bindings/docker-session.js";import{DOCKER_TEMPLATE_IMAGE_REPOSITORY,dockerImageExists,dockerTemplateImageReference,ensureDockerBaseImage,pruneDockerSandboxTemplates,resolveDockerTemplateMarkerPath,touchDockerTemplateMarker}from"#execution/sandbox/bindings/docker-templates.js";import{createLoggingSandboxSession}from"#execution/sandbox/logging-session.js";import{buildSandboxSession}from"#execution/sandbox/session.js";import{SandboxTemplateNotProvisionedError}from"#public/definitions/sandbox-backend.js";const DOCKER_BACKEND_NAME=`docker`;function createDockerSandboxBackend(s={}){let c=s.dockerCli??createDockerCli(),l=resolveDockerSandboxOptions(s.createOptions),u=createDockerSandboxOptionsHash(l),d;function ensureDaemon(){return d??=assertDockerDaemonAvailable(c).catch(e=>{throw d=void 0,e}),d}return{name:DOCKER_BACKEND_NAME,async prewarm(r){r.log?.(`checking Docker daemon`),await ensureDaemon();let i={optionsHash:u,templateKey:r.templateKey},a=dockerTemplateImageReference(i),o=resolveDockerTemplateMarkerPath(r.runtimeContext.appRoot,i);if(r.log?.(`checking cached template image "${a}"`),await dockerImageExists(c,a))return r.log?.(`reusing cached template image`),await touchDockerTemplateMarker(o,a),{reused:!0};r.log?.(`checking base image "${l.image}"`),await ensureDockerBaseImage(c,l);let s=`${r.templateKey}-build-${randomUUID().slice(0,8)}`;r.log?.(`starting template build container`),await startDockerContainer({cli:c,containerName:s,image:l.image,initialNetworkPolicy:`allow-all`,options:l,role:`template-build`});try{r.log?.(`preparing base runtime inside container`),await runDockerBaseSetup(c,s),l.networkPolicy!==`allow-all`&&(r.log?.(`applying network policy`),await setDockerNetworkPolicy(c,s,l.networkPolicy));let e=buildSandboxSession(createDockerInternalSession({cli:c,containerName:s,id:r.templateKey}),e=>setDockerNetworkPolicy(c,s,e));r.bootstrap!==void 0&&(r.log?.(`running sandbox bootstrap`),await r.bootstrap({use:async()=>createLoggingSandboxSession({log:r.log,session:e})})),r.seedFiles.length>0&&r.log?.(`writing ${r.seedFiles.length} seed file(s)`),await writeSandboxSeedFiles(e,r.seedFiles),r.log?.(`stopping template build container`),expectDockerSuccess(await c.run([`stop`,`-t`,`0`,s]),`stop template build container "${s}"`),r.log?.(`committing template image "${a}"`),expectDockerSuccess(await c.run([`commit`,`--change`,`LABEL ${DOCKER_SANDBOX_LABEL}=1`,`--change`,`LABEL ${DOCKER_SANDBOX_LABEL}.role=template`,`--change`,`LABEL ${DOCKER_SANDBOX_LABEL}.template-key=${r.templateKey}`,s,a]),`commit sandbox template image "${a}"`),await touchDockerTemplateMarker(o,a)}finally{await c.run([`rm`,`-f`,s]).catch(()=>{})}return{reused:!1}},async create(e){await ensureDaemon();let n=getDockerContainerName(e.existingMetadata)??e.sessionKey,r=await c.run([`container`,`inspect`,`--format`,`{{.State.Running}}`,n]);if(r.exitCode===0)r.stdout.trim()!==`true`&&expectDockerSuccess(await c.run([`start`,n]),`restart sandbox session container "${n}"`);else{let t;if(e.templateKey===null)await ensureDockerBaseImage(c,l),t=l.image;else{let n={optionsHash:u,templateKey:e.templateKey};if(t=dockerTemplateImageReference(n),!await dockerImageExists(c,t))throw new SandboxTemplateNotProvisionedError({backendName:DOCKER_BACKEND_NAME,templateKey:e.templateKey});await touchDockerTemplateMarker(resolveDockerTemplateMarkerPath(e.runtimeContext.appRoot,n),t)}await startDockerContainer({cli:c,containerName:n,image:t,initialNetworkPolicy:e.templateKey===null?`allow-all`:l.networkPolicy,options:l,role:`session`,tags:e.tags}),e.templateKey===null&&(await runDockerBaseSetup(c,n),l.networkPolicy!==`allow-all`&&await setDockerNetworkPolicy(c,n,l.networkPolicy))}let i=buildSandboxSession(createDockerInternalSession({cli:c,containerName:n,id:e.sessionKey}),e=>setDockerNetworkPolicy(c,n,e));return{session:i,useSessionFn:async()=>i,async captureState(){return{backendName:DOCKER_BACKEND_NAME,metadata:{containerName:n},sessionKey:e.sessionKey}},async dispose(){}}}}}function getDockerContainerName(e){let t=e?.containerName;return typeof t==`string`?t:void 0}export{DOCKER_BACKEND_NAME,DOCKER_TEMPLATE_IMAGE_REPOSITORY,createDockerSandboxBackend,pruneDockerSandboxTemplates};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SandboxBackendHandle } from "#public/definitions/sandbox-backend.js";
|
|
2
|
+
import type { SandboxProcess, SandboxRemovePathOptions, SandboxSpawnOptions } from "#shared/sandbox-session.js";
|
|
3
|
+
export interface BashSandbox {
|
|
4
|
+
captureState(): Promise<Record<string, unknown> | null>;
|
|
5
|
+
dispose(): Promise<void>;
|
|
6
|
+
readFileBytes(path: string): Promise<Buffer | null>;
|
|
7
|
+
removePath(options: SandboxRemovePathOptions): Promise<void>;
|
|
8
|
+
readonly rootPath: string;
|
|
9
|
+
readonly sessionKey: string;
|
|
10
|
+
spawn(options: SandboxSpawnOptions): Promise<SandboxProcess>;
|
|
11
|
+
writeFiles(files: ReadonlyArray<{
|
|
12
|
+
path: string;
|
|
13
|
+
content: string | Uint8Array;
|
|
14
|
+
}>): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createBashSandbox(input: {
|
|
17
|
+
readonly appRoot: string;
|
|
18
|
+
readonly autoInstall: boolean;
|
|
19
|
+
readonly rootPath: string;
|
|
20
|
+
readonly sessionKey: string;
|
|
21
|
+
}): Promise<BashSandbox>;
|
|
22
|
+
/**
|
|
23
|
+
* The just-bash engine cannot honor a run-time network policy: just-bash takes
|
|
24
|
+
* its `NetworkConfig` only at sandbox creation (no live update) and runs no
|
|
25
|
+
* `git` or other binaries, so credential brokering has nothing to act on.
|
|
26
|
+
* Throw rather than silently no-op so brokering code surfaces the gap instead
|
|
27
|
+
* of leaking.
|
|
28
|
+
*/
|
|
29
|
+
export declare function justBashSetNetworkPolicyUnsupported(): Promise<never>;
|
|
30
|
+
export declare function createJustBashHandle(sandbox: BashSandbox, backendName: string): SandboxBackendHandle;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{dirname}from"node:path";import{mkdir,readFile,writeFile}from"node:fs/promises";import{loadOptionalEnginePackage}from"#internal/application/optional-package-install.js";import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{createFileBackedInternalSandboxSession,pathExists}from"#execution/sandbox/bindings/local-backend-utils.js";import{shellQuote}from"#execution/sandbox/shell-quote.js";import{buildSandboxSession}from"#execution/sandbox/session.js";let justBashModulePromise;async function loadJustBashModule(e){return justBashModulePromise??=loadOptionalEnginePackage({appRoot:e.appRoot,autoInstall:e.autoInstall,importModule:async()=>await import(`just-bash`),missingMessage:"The just-bash sandbox backend requires the `just-bash` package, which is not bundled with Eve. Install it in your application (for example `pnpm add -D just-bash`), or use dockerBackend() / defaultBackend() instead.",packageName:`just-bash`}).catch(e=>{throw justBashModulePromise=void 0,e}),await justBashModulePromise}async function createBashSandbox(n){let{ReadWriteFs:r,Sandbox:i}=await loadJustBashModule({appRoot:n.appRoot,autoInstall:n.autoInstall}),o=resolveLocalSandboxFilesystemRootPath(n.rootPath),s=resolveLocalSandboxMetadataPath(n.rootPath),c=await readLocalMetadata(s);await mkdir(o,{recursive:!0});let l=new r({allowSymlinks:!0,maxFileReadSize:2**53-1,root:o});await ensureLocalSandboxDirectories(l);let u=await i.create({cwd:WORKSPACE_ROOT,env:c?.env,fs:l,network:{dangerouslyAllowFullInternetAccess:!0}});return{async captureState(){return await writeLocalMetadata(s,{env:{...u.bashEnvInstance.getEnv()},version:1}),{rootPath:n.rootPath}},async dispose(){await u.stop()},async readFileBytes(e){let t;try{t=await l.readFileBuffer(e)}catch{return null}return Buffer.from(t)},async removePath(e){await l.rm(e.path,{force:e.force,recursive:e.recursive})},rootPath:n.rootPath,sessionKey:n.sessionKey,async spawn(e){if(e.abortSignal?.aborted)throw new DOMException(`The operation was aborted.`,`AbortError`);let t=e.workingDirectory===void 0?e.command:`( cd ${shellQuote(e.workingDirectory)} && ${e.command} )`;return adaptJustBashCommandToSandboxProcess(await u.runCommand({args:[t],cmd:`eval`,detached:!0,env:e.env,signal:e.abortSignal}))},async writeFiles(t){for(let n of t){let t=dirname(n.path);await l.mkdir(t,{recursive:!0}),await l.writeFile(n.path,n.content)}}}}function adaptJustBashCommandToSandboxProcess(e){let t=new TextEncoder,n,r,i=!1,a,o=new ReadableStream({start(e){n=e}}),s=new ReadableStream({start(e){r=e}});return(async()=>{try{for await(let i of e.logs()){let e=t.encode(i.data);i.type===`stdout`?n?.enqueue(e):r?.enqueue(e)}}catch(e){a=e,n?.error(e),r?.error(e)}finally{i=!0,a===void 0&&(n?.close(),r?.close())}})(),{stdout:o,stderr:s,async wait(){let t=await e.wait();for(;!i;)await new Promise(e=>setTimeout(e,0));if(a!==void 0)throw a;return{exitCode:t.exitCode}},async kill(){await e.kill()}}}async function justBashSetNetworkPolicyUnsupported(){throw Error(`setNetworkPolicy() is not supported on the just-bash sandbox backend. just-bash applies its network policy only at sandbox creation (no run-time update) and does not run git or other binaries. Use dockerBackend() for coarse egress control or vercelSandboxBackend() / microsandboxBackend() for credential brokering.`)}function createJustBashHandle(e,t){let n=buildSandboxSession(createFileBackedInternalSandboxSession({id:e.sessionKey,sandbox:e}),justBashSetNetworkPolicyUnsupported);return{session:n,useSessionFn:async()=>n,async captureState(){return{backendName:t,metadata:await e.captureState()??{},sessionKey:e.sessionKey}},async dispose(){await e.dispose()}}}function resolveLocalSandboxFilesystemRootPath(e){return`${e}/fs`}function resolveLocalSandboxMetadataPath(e){return`${e}/metadata.json`}async function ensureLocalSandboxDirectories(e){await e.mkdir(WORKSPACE_ROOT,{recursive:!0})}async function readLocalMetadata(e){if(!await pathExists(e))return null;let t=JSON.parse(await readFile(e,`utf8`));return t.version!==1||!isStringRecord(t.env)?null:{env:t.env,version:1}}async function writeLocalMetadata(n,i){await mkdir(dirname(n),{recursive:!0}),await writeFile(n,`${JSON.stringify(i,null,2)}\n`)}function isStringRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.values(e).every(e=>typeof e==`string`)}export{createBashSandbox,createJustBashHandle,justBashSetNetworkPolicyUnsupported};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SandboxBackend } from "#public/definitions/sandbox-backend.js";
|
|
2
|
+
import type { JustBashSandboxCreateOptions } from "#public/sandbox/just-bash-sandbox.js";
|
|
3
|
+
/**
|
|
4
|
+
* Stable backend name. Participates in template/session key derivation
|
|
5
|
+
* and persisted reconnect state.
|
|
6
|
+
*/
|
|
7
|
+
export declare const JUST_BASH_BACKEND_NAME = "just-bash";
|
|
8
|
+
/**
|
|
9
|
+
* Construction input for {@link createJustBashSandboxBackend}. Internal —
|
|
10
|
+
* the public surface is the `justBashBackend()` factory under
|
|
11
|
+
* `eve/sandbox`.
|
|
12
|
+
*/
|
|
13
|
+
export interface CreateJustBashSandboxBackendInput {
|
|
14
|
+
readonly createOptions?: JustBashSandboxCreateOptions;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Creates the just-bash sandbox backend.
|
|
18
|
+
*
|
|
19
|
+
* The cache directory is derived from the runtime context's `appRoot`
|
|
20
|
+
* on every `create` call so the backend stays stateless and matches
|
|
21
|
+
* the framework's per-call dispatch contract.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createJustBashSandboxBackend(input?: CreateJustBashSandboxBackendInput): SandboxBackend;
|
|
24
|
+
/**
|
|
25
|
+
* Removes stale just-bash sandbox template directories for one
|
|
26
|
+
* application's cache.
|
|
27
|
+
*/
|
|
28
|
+
export declare function pruneJustBashSandboxTemplates(input: {
|
|
29
|
+
readonly appRoot: string;
|
|
30
|
+
readonly now?: number;
|
|
31
|
+
readonly recentWindowMs?: number;
|
|
32
|
+
readonly retainCount?: number;
|
|
33
|
+
}): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{dirname,join}from"node:path";import"node:fs";import{mkdir,readdir,rename,rm,stat}from"node:fs/promises";import{resolveSandboxCacheDirectory}from"#internal/application/paths.js";import{randomUUID}from"node:crypto";import{copyDirectoryAtomically,createFileBackedInternalSandboxSession,pathExists,resolveLocalBackendSessionRootPath,resolveLocalBackendTemplateRootPath,resolveLocalBackendTemplatesDirectory,touchDirectory,writeSandboxSeedFiles}from"#execution/sandbox/bindings/local-backend-utils.js";import{LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS,LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT,selectStaleTemplateEntries}from"#execution/sandbox/bindings/local-template-prune.js";import{createLoggingSandboxSession}from"#execution/sandbox/logging-session.js";import{buildSandboxSession}from"#execution/sandbox/session.js";import{SandboxTemplateNotProvisionedError}from"#public/definitions/sandbox-backend.js";import{createBashSandbox,createJustBashHandle,justBashSetNetworkPolicyUnsupported}from"#execution/sandbox/bindings/just-bash-runtime.js";const JUST_BASH_CACHE_DIRECTORY_NAME=`just-bash`,JUST_BASH_BACKEND_NAME=`just-bash`;function createJustBashSandboxBackend(t={}){let r=t.createOptions?.autoInstall??!0;return{name:JUST_BASH_BACKEND_NAME,async prewarm(t){let a=resolveTemplateRootPath(resolveSandboxCacheDirectory(t.runtimeContext.appRoot),t.templateKey);if(await pathExists(a))return await touchDirectory(a),{reused:!0};let s=`${a}.${randomUUID()}.tmp`,u=!1,d=await createBashSandbox({appRoot:t.runtimeContext.appRoot,autoInstall:r,rootPath:s,sessionKey:t.templateKey}),f=buildSandboxSession(createFileBackedInternalSandboxSession({id:d.sessionKey,sandbox:d}),justBashSetNetworkPolicyUnsupported);try{if(t.bootstrap!==void 0&&(t.log?.(`running sandbox bootstrap`),await t.bootstrap({use:async()=>createLoggingSandboxSession({log:t.log,session:f})})),await writeSandboxSeedFiles(f,t.seedFiles),await d.captureState()===null)throw Error(`Failed to capture local sandbox template state for "${t.templateKey}".`);await mkdir(dirname(a),{recursive:!0});try{await rename(s,a),u=!0}catch(e){if(await pathExists(a))return{reused:!0};throw e}}finally{await d.dispose(),u||await rm(s,{force:!0,recursive:!0}).catch(()=>{})}return{reused:!1}},async create(e){let t=resolveSandboxCacheDirectory(e.runtimeContext.appRoot),i=getLocalRootPath(e.existingMetadata)??resolveSessionRootPath(t,e.sessionKey);if(!await pathExists(i))if(e.templateKey===null)await mkdir(i,{recursive:!0});else{let n=resolveTemplateRootPath(t,e.templateKey);if(!await pathExists(n))throw new SandboxTemplateNotProvisionedError({backendName:JUST_BASH_BACKEND_NAME,templateKey:e.templateKey});await copyDirectoryAtomically(n,i)}return createJustBashHandle(await createBashSandbox({appRoot:e.runtimeContext.appRoot,autoInstall:r,rootPath:i,sessionKey:e.sessionKey}),JUST_BASH_BACKEND_NAME)}}}async function pruneJustBashSandboxTemplates(e){let n=resolveLocalBackendTemplatesDirectory(resolveSandboxCacheDirectory(e.appRoot),JUST_BASH_CACHE_DIRECTORY_NAME),i=e.now??Date.now(),o=e.recentWindowMs??LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS,s=e.retainCount??LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT,c;try{c=await readdir(n,{withFileTypes:!0})}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let l=await Promise.all(c.filter(e=>e.isDirectory()).map(async e=>{let r=join(n,e.name);return{isTemporary:e.name.endsWith(`.tmp`),mtimeMs:(await stat(r)).mtimeMs,path:r}})),u=selectStaleTemplateEntries(l.filter(e=>!e.isTemporary),{now:i,recentWindowMs:o,retainCount:s}),d=selectStaleTemplateEntries(l.filter(e=>e.isTemporary),{now:i,recentWindowMs:o,retainCount:0});await Promise.all([...u,...d].map(async e=>await rm(e.path,{force:!0,recursive:!0})))}function resolveTemplateRootPath(e,t){return resolveLocalBackendTemplateRootPath(e,JUST_BASH_CACHE_DIRECTORY_NAME,t)}function resolveSessionRootPath(e,t){return resolveLocalBackendSessionRootPath(e,JUST_BASH_CACHE_DIRECTORY_NAME,t)}function getLocalRootPath(e){let t=e?.rootPath;return typeof t==`string`?t:void 0}export{JUST_BASH_BACKEND_NAME,createJustBashSandboxBackend,pruneJustBashSandboxTemplates};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SandboxSeedFile } from "#shared/sandbox-backend.js";
|
|
2
|
+
import type { InternalSandboxSession, SandboxProcess, SandboxRemovePathOptions, SandboxSession, SandboxSpawnOptions } from "#shared/sandbox-session.js";
|
|
3
|
+
export interface FileBackedSandbox {
|
|
4
|
+
readFileBytes(path: string): Promise<Buffer | null>;
|
|
5
|
+
removePath(options: SandboxRemovePathOptions): Promise<void>;
|
|
6
|
+
spawn(options: SandboxSpawnOptions): Promise<SandboxProcess>;
|
|
7
|
+
writeFiles(files: ReadonlyArray<{
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly content: Uint8Array;
|
|
10
|
+
}>): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function createFileBackedInternalSandboxSession(input: {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly sandbox: FileBackedSandbox;
|
|
15
|
+
}): InternalSandboxSession;
|
|
16
|
+
export declare function resolveWorkspacePath(path: string): string;
|
|
17
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
18
|
+
export declare function copyDirectoryAtomically(sourcePath: string, targetPath: string): Promise<void>;
|
|
19
|
+
export declare function touchDirectory(path: string): Promise<void>;
|
|
20
|
+
export declare function resolveLocalBackendTemplateRootPath(cacheDirectory: string, backendCacheName: string, templateKey: string): string;
|
|
21
|
+
export declare function resolveLocalBackendTemplatesDirectory(cacheDirectory: string, backendCacheName: string): string;
|
|
22
|
+
export declare function resolveLocalBackendSessionRootPath(cacheDirectory: string, backendCacheName: string, sessionKey: string): string;
|
|
23
|
+
export declare function writeSandboxSeedFiles(session: Pick<SandboxSession, "writeBinaryFile" | "writeTextFile">, seedFiles: ReadonlyArray<SandboxSeedFile>): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{dirname,join}from"node:path";import{access,cp,mkdir,rename,rm,utimes}from"node:fs/promises";import{randomUUID}from"node:crypto";import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{bufferToStream,streamToBuffer}from"#execution/sandbox/stream-utils.js";function createFileBackedInternalSandboxSession(e){return{id:e.id,resolvePath:resolveWorkspacePath,async spawn(t){return await e.sandbox.spawn(t)},async readFile(t){let n=await e.sandbox.readFileBytes(t.path);return n===null?null:bufferToStream(n)},async removePath(t){await e.sandbox.removePath(t)},async writeFile(t){let n=await streamToBuffer(t.content);await e.sandbox.writeFiles([{content:n,path:t.path}])}}}function resolveWorkspacePath(e){return e.startsWith(`/`)?e:`${WORKSPACE_ROOT}/${e}`}async function pathExists(e){try{return await access(e),!0}catch{return!1}}async function copyDirectoryAtomically(t,n){let i=`${n}.${randomUUID()}.tmp`;await rm(i,{force:!0,recursive:!0}),await mkdir(dirname(n),{recursive:!0});try{await cp(t,i,{recursive:!0}),await rename(i,n)}catch(e){if(await rm(i,{force:!0,recursive:!0}).catch(()=>{}),await pathExists(n))return;throw e}}async function touchDirectory(e){let t=new Date;await utimes(e,t,t)}function resolveLocalBackendTemplateRootPath(e,n,r){return join(resolveLocalBackendTemplatesDirectory(e,n),r)}function resolveLocalBackendTemplatesDirectory(e,n){return join(e,n,`templates`)}function resolveLocalBackendSessionRootPath(e,n,r){return join(e,n,`sessions`,r)}async function writeSandboxSeedFiles(e,t){for(let n of t)typeof n.content==`string`?await e.writeTextFile({content:n.content,path:n.path}):await e.writeBinaryFile({content:n.content,path:n.path})}export{copyDirectoryAtomically,createFileBackedInternalSandboxSession,pathExists,resolveLocalBackendSessionRootPath,resolveLocalBackendTemplateRootPath,resolveLocalBackendTemplatesDirectory,resolveWorkspacePath,touchDirectory,writeSandboxSeedFiles};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared staleness selection for local sandbox template stores (the
|
|
3
|
+
* just-bash directory cache and the Docker template-image markers).
|
|
4
|
+
*
|
|
5
|
+
* An entry is stale when it is neither among the `retainCount` most
|
|
6
|
+
* recently used entries nor used within the trailing `recentWindowMs`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function selectStaleTemplateEntries<T extends {
|
|
9
|
+
readonly mtimeMs: number;
|
|
10
|
+
}>(entries: readonly T[], input: {
|
|
11
|
+
readonly now: number;
|
|
12
|
+
readonly recentWindowMs: number;
|
|
13
|
+
readonly retainCount: number;
|
|
14
|
+
}): T[];
|
|
15
|
+
export declare const LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS: number;
|
|
16
|
+
export declare const LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT = 5;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function selectStaleTemplateEntries(e,t){return[...e].sort((e,t)=>t.mtimeMs-e.mtimeMs).filter((e,n)=>n>=t.retainCount&&t.now-e.mtimeMs>t.recentWindowMs)}const LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS=900*1e3,LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT=5;export{LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS,LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT,selectStaleTemplateEntries};
|
|
@@ -1,33 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export { createDockerSandboxBackend, DOCKER_BACKEND_NAME, pruneDockerSandboxTemplates, } from "#execution/sandbox/bindings/docker.js";
|
|
2
|
+
export { isDockerDaemonAvailableSync } from "#execution/sandbox/bindings/docker-cli.js";
|
|
3
|
+
export { createJustBashSandboxBackend, JUST_BASH_BACKEND_NAME, pruneJustBashSandboxTemplates, } from "#execution/sandbox/bindings/just-bash.js";
|
|
4
|
+
export { createMicrosandboxSandboxBackend, MICROSANDBOX_BACKEND_NAME, pruneMicrosandboxTemplates, } from "#execution/sandbox/bindings/microsandbox.js";
|
|
5
|
+
export { isMicrosandboxPlatformSupported } from "#execution/sandbox/bindings/microsandbox-platform.js";
|
|
6
|
+
export { stopDevelopmentSandboxResources } from "#execution/sandbox/development-cleanup.js";
|
|
3
7
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
8
|
+
* Removes stale local sandbox template state for one application
|
|
9
|
+
* across every local engine: just-bash template directories, Docker
|
|
10
|
+
* template images (tracked through per-app marker files), and
|
|
11
|
+
* microsandbox template snapshots. Docker pruning silently skips when
|
|
12
|
+
* no Docker runtime is reachable so docker-less setups stay quiet.
|
|
7
13
|
*/
|
|
8
|
-
export interface CreateLocalSandboxBackendInput {
|
|
9
|
-
readonly createOptions?: LocalSandboxCreateOptions;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Creates the local just-bash-backed sandbox backend.
|
|
13
|
-
*
|
|
14
|
-
* The cache directory is derived from the runtime context's `appRoot`
|
|
15
|
-
* on every `create` call so the backend stays stateless and matches
|
|
16
|
-
* the framework's per-call dispatch contract.
|
|
17
|
-
*
|
|
18
|
-
* Accepts `createOptions` for parity with other backends; the local
|
|
19
|
-
* backend currently has no consumer-controllable create options so the
|
|
20
|
-
* value is reserved for future widening of {@link LocalSandboxCreateOptions}.
|
|
21
|
-
*/
|
|
22
|
-
export declare function createLocalSandboxBackend(_input?: CreateLocalSandboxBackendInput): SandboxBackend;
|
|
23
|
-
/**
|
|
24
|
-
* Starts best-effort cleanup for stale local just-bash templates without
|
|
25
|
-
* delaying `eve dev` startup or rebuild handling.
|
|
26
|
-
*/
|
|
27
|
-
export declare function pruneLocalSandboxTemplatesInBackground(appRoot: string): void;
|
|
28
14
|
export declare function pruneLocalSandboxTemplates(input: {
|
|
29
15
|
readonly appRoot: string;
|
|
30
16
|
readonly now?: number;
|
|
31
17
|
readonly recentWindowMs?: number;
|
|
32
18
|
readonly retainCount?: number;
|
|
33
19
|
}): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Starts best-effort cleanup for stale local sandbox templates without
|
|
22
|
+
* delaying `eve dev` startup or rebuild handling.
|
|
23
|
+
*/
|
|
24
|
+
export declare function pruneLocalSandboxTemplatesInBackground(appRoot: string): void;
|