agent-bundle 0.1.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/LICENSE +21 -0
- package/README.md +161 -0
- package/dist/agent/agent.d.ts +32 -0
- package/dist/agent/agent.js +241 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/agent.test-helpers.d.ts +63 -0
- package/dist/agent/agent.test-helpers.js +170 -0
- package/dist/agent/agent.test-helpers.js.map +1 -0
- package/dist/agent/define-agent.d.ts +2 -0
- package/dist/agent/define-agent.js +18 -0
- package/dist/agent/define-agent.js.map +1 -0
- package/dist/agent/dependencies.d.ts +15 -0
- package/dist/agent/dependencies.js +14 -0
- package/dist/agent/dependencies.js.map +1 -0
- package/dist/agent/index.d.ts +4 -0
- package/dist/agent/index.js +5 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/internals.d.ts +28 -0
- package/dist/agent/internals.js +160 -0
- package/dist/agent/internals.js.map +1 -0
- package/dist/agent/session.d.ts +4 -0
- package/dist/agent/session.js +2 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/agent/types.d.ts +52 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent-loop/agent-loop.d.ts +27 -0
- package/dist/agent-loop/agent-loop.js +2 -0
- package/dist/agent-loop/agent-loop.js.map +1 -0
- package/dist/agent-loop/index.d.ts +4 -0
- package/dist/agent-loop/index.js +5 -0
- package/dist/agent-loop/index.js.map +1 -0
- package/dist/agent-loop/pi-mono/events.d.ts +3 -0
- package/dist/agent-loop/pi-mono/events.js +73 -0
- package/dist/agent-loop/pi-mono/events.js.map +1 -0
- package/dist/agent-loop/pi-mono/index.d.ts +1 -0
- package/dist/agent-loop/pi-mono/index.js +2 -0
- package/dist/agent-loop/pi-mono/index.js.map +1 -0
- package/dist/agent-loop/pi-mono/input.d.ts +6 -0
- package/dist/agent-loop/pi-mono/input.js +120 -0
- package/dist/agent-loop/pi-mono/input.js.map +1 -0
- package/dist/agent-loop/pi-mono/model.d.ts +7 -0
- package/dist/agent-loop/pi-mono/model.js +72 -0
- package/dist/agent-loop/pi-mono/model.js.map +1 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.d.ts +11 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.js +167 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.js.map +1 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.test-helpers.d.ts +28 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.test-helpers.js +76 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.test-helpers.js.map +1 -0
- package/dist/agent-loop/pi-mono/queue.d.ts +9 -0
- package/dist/agent-loop/pi-mono/queue.js +37 -0
- package/dist/agent-loop/pi-mono/queue.js.map +1 -0
- package/dist/agent-loop/pi-mono/tools.d.ts +4 -0
- package/dist/agent-loop/pi-mono/tools.js +164 -0
- package/dist/agent-loop/pi-mono/tools.js.map +1 -0
- package/dist/agent-loop/pi-mono/utils.d.ts +14 -0
- package/dist/agent-loop/pi-mono/utils.js +83 -0
- package/dist/agent-loop/pi-mono/utils.js.map +1 -0
- package/dist/agent-loop/system-prompt/fill.d.ts +1 -0
- package/dist/agent-loop/system-prompt/fill.js +19 -0
- package/dist/agent-loop/system-prompt/fill.js.map +1 -0
- package/dist/agent-loop/system-prompt/generate.d.ts +11 -0
- package/dist/agent-loop/system-prompt/generate.js +21 -0
- package/dist/agent-loop/system-prompt/generate.js.map +1 -0
- package/dist/agent-loop/system-prompt/index.d.ts +2 -0
- package/dist/agent-loop/system-prompt/index.js +3 -0
- package/dist/agent-loop/system-prompt/index.js.map +1 -0
- package/dist/agent-loop/types.d.ts +77 -0
- package/dist/agent-loop/types.js +2 -0
- package/dist/agent-loop/types.js.map +1 -0
- package/dist/cli/build/build.d.ts +35 -0
- package/dist/cli/build/build.js +174 -0
- package/dist/cli/build/build.js.map +1 -0
- package/dist/cli/build/build.test-helpers.d.ts +9 -0
- package/dist/cli/build/build.test-helpers.js +50 -0
- package/dist/cli/build/build.test-helpers.js.map +1 -0
- package/dist/cli/build/codegen-commands.d.ts +16 -0
- package/dist/cli/build/codegen-commands.js +81 -0
- package/dist/cli/build/codegen-commands.js.map +1 -0
- package/dist/cli/build/codegen.d.ts +55 -0
- package/dist/cli/build/codegen.js +212 -0
- package/dist/cli/build/codegen.js.map +1 -0
- package/dist/cli/build/e2b-template.d.ts +38 -0
- package/dist/cli/build/e2b-template.js +210 -0
- package/dist/cli/build/e2b-template.js.map +1 -0
- package/dist/cli/build/e2b-template.test-helpers.d.ts +19 -0
- package/dist/cli/build/e2b-template.test-helpers.js +80 -0
- package/dist/cli/build/e2b-template.test-helpers.js.map +1 -0
- package/dist/cli/build/sandbox-image.d.ts +35 -0
- package/dist/cli/build/sandbox-image.js +57 -0
- package/dist/cli/build/sandbox-image.js.map +1 -0
- package/dist/cli/build-codegen.d.ts +41 -0
- package/dist/cli/build-codegen.js +168 -0
- package/dist/cli/build-codegen.js.map +1 -0
- package/dist/cli/build-e2b-template.d.ts +38 -0
- package/dist/cli/build-e2b-template.js +223 -0
- package/dist/cli/build-e2b-template.js.map +1 -0
- package/dist/cli/build-e2b-template.test-helpers.d.ts +19 -0
- package/dist/cli/build-e2b-template.test-helpers.js +80 -0
- package/dist/cli/build-e2b-template.test-helpers.js.map +1 -0
- package/dist/cli/build-sandbox-image.d.ts +35 -0
- package/dist/cli/build-sandbox-image.js +57 -0
- package/dist/cli/build-sandbox-image.js.map +1 -0
- package/dist/cli/build.d.ts +30 -0
- package/dist/cli/build.js +151 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/build.test-helpers.d.ts +9 -0
- package/dist/cli/build.test-helpers.js +50 -0
- package/dist/cli/build.test-helpers.js.map +1 -0
- package/dist/cli/config/load-bundle-config.d.ts +2 -0
- package/dist/cli/config/load-bundle-config.js +20 -0
- package/dist/cli/config/load-bundle-config.js.map +1 -0
- package/dist/cli/config/resolve-project-root.d.ts +1 -0
- package/dist/cli/config/resolve-project-root.js +19 -0
- package/dist/cli/config/resolve-project-root.js.map +1 -0
- package/dist/cli/deploy/aws-cli.d.ts +42 -0
- package/dist/cli/deploy/aws-cli.js +95 -0
- package/dist/cli/deploy/aws-cli.js.map +1 -0
- package/dist/cli/deploy/aws-ecr.d.ts +20 -0
- package/dist/cli/deploy/aws-ecr.js +97 -0
- package/dist/cli/deploy/aws-ecr.js.map +1 -0
- package/dist/cli/deploy/aws-ecs-infra.d.ts +39 -0
- package/dist/cli/deploy/aws-ecs-infra.js +169 -0
- package/dist/cli/deploy/aws-ecs-infra.js.map +1 -0
- package/dist/cli/deploy/aws-ecs-role.d.ts +9 -0
- package/dist/cli/deploy/aws-ecs-role.js +114 -0
- package/dist/cli/deploy/aws-ecs-role.js.map +1 -0
- package/dist/cli/deploy/aws-ecs-service.d.ts +37 -0
- package/dist/cli/deploy/aws-ecs-service.js +207 -0
- package/dist/cli/deploy/aws-ecs-service.js.map +1 -0
- package/dist/cli/deploy/aws-ecs-shared.d.ts +59 -0
- package/dist/cli/deploy/aws-ecs-shared.js +30 -0
- package/dist/cli/deploy/aws-ecs-shared.js.map +1 -0
- package/dist/cli/deploy/aws-ecs.d.ts +3 -0
- package/dist/cli/deploy/aws-ecs.js +141 -0
- package/dist/cli/deploy/aws-ecs.js.map +1 -0
- package/dist/cli/deploy/aws-prerequisites.d.ts +16 -0
- package/dist/cli/deploy/aws-prerequisites.js +28 -0
- package/dist/cli/deploy/aws-prerequisites.js.map +1 -0
- package/dist/cli/deploy/aws-teardown.d.ts +13 -0
- package/dist/cli/deploy/aws-teardown.js +204 -0
- package/dist/cli/deploy/aws-teardown.js.map +1 -0
- package/dist/cli/deploy/deploy.d.ts +36 -0
- package/dist/cli/deploy/deploy.js +209 -0
- package/dist/cli/deploy/deploy.js.map +1 -0
- package/dist/cli/error.d.ts +1 -0
- package/dist/cli/error.js +4 -0
- package/dist/cli/error.js.map +1 -0
- package/dist/cli/generate/generate.d.ts +37 -0
- package/dist/cli/generate/generate.js +121 -0
- package/dist/cli/generate/generate.js.map +1 -0
- package/dist/cli/generate.d.ts +32 -0
- package/dist/cli/generate.js +102 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +182 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/load-bundle-config.d.ts +2 -0
- package/dist/cli/load-bundle-config.js +20 -0
- package/dist/cli/load-bundle-config.js.map +1 -0
- package/dist/cli/resolve-project-root.d.ts +1 -0
- package/dist/cli/resolve-project-root.js +19 -0
- package/dist/cli/resolve-project-root.js.map +1 -0
- package/dist/cli/serve/dev.d.ts +6 -0
- package/dist/cli/serve/dev.js +73 -0
- package/dist/cli/serve/dev.js.map +1 -0
- package/dist/cli/serve/http.d.ts +12 -0
- package/dist/cli/serve/http.js +123 -0
- package/dist/cli/serve/http.js.map +1 -0
- package/dist/cli/serve/init.d.ts +42 -0
- package/dist/cli/serve/init.js +110 -0
- package/dist/cli/serve/init.js.map +1 -0
- package/dist/cli/serve/runtime.d.ts +25 -0
- package/dist/cli/serve/runtime.js +142 -0
- package/dist/cli/serve/runtime.js.map +1 -0
- package/dist/cli/serve/serve.d.ts +7 -0
- package/dist/cli/serve/serve.js +63 -0
- package/dist/cli/serve/serve.js.map +1 -0
- package/dist/cli/serve/serve.test-helpers.d.ts +36 -0
- package/dist/cli/serve/serve.test-helpers.js +205 -0
- package/dist/cli/serve/serve.test-helpers.js.map +1 -0
- package/dist/cli/serve/worktree-port.d.ts +36 -0
- package/dist/cli/serve/worktree-port.js +124 -0
- package/dist/cli/serve/worktree-port.js.map +1 -0
- package/dist/cli/serve-http.d.ts +12 -0
- package/dist/cli/serve-http.js +112 -0
- package/dist/cli/serve-http.js.map +1 -0
- package/dist/cli/serve-runtime.d.ts +16 -0
- package/dist/cli/serve-runtime.js +122 -0
- package/dist/cli/serve-runtime.js.map +1 -0
- package/dist/cli/serve.d.ts +33 -0
- package/dist/cli/serve.js +150 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/serve.test-helpers.d.ts +30 -0
- package/dist/cli/serve.test-helpers.js +145 -0
- package/dist/cli/serve.test-helpers.js.map +1 -0
- package/dist/code-formatter/bundle.json +41 -0
- package/dist/code-formatter/index.ts +26 -0
- package/dist/code-formatter/package.json +10 -0
- package/dist/code-formatter/types.ts +2 -0
- package/dist/code-formatter-e2b/bundle.json +40 -0
- package/dist/code-formatter-e2b/index.ts +25 -0
- package/dist/code-formatter-e2b/package.json +10 -0
- package/dist/code-formatter-e2b/types.ts +2 -0
- package/dist/coding-assistant-ollama/bundle.json +43 -0
- package/dist/coding-assistant-ollama/index.ts +28 -0
- package/dist/coding-assistant-ollama/package.json +10 -0
- package/dist/coding-assistant-ollama/types.ts +2 -0
- package/dist/commands/find.d.ts +8 -0
- package/dist/commands/find.js +11 -0
- package/dist/commands/find.js.map +1 -0
- package/dist/commands/loader.d.ts +13 -0
- package/dist/commands/loader.js +163 -0
- package/dist/commands/loader.js.map +1 -0
- package/dist/commands/types.d.ts +7 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/with-commands.d.ts +6 -0
- package/dist/commands/with-commands.js +19 -0
- package/dist/commands/with-commands.js.map +1 -0
- package/dist/data-analyst/bundle.json +40 -0
- package/dist/data-analyst/index.ts +25 -0
- package/dist/data-analyst/package.json +10 -0
- package/dist/data-analyst/types.ts +2 -0
- package/dist/financial-analyst/bundle.json +40 -0
- package/dist/financial-analyst/index.ts +25 -0
- package/dist/financial-analyst/package.json +10 -0
- package/dist/financial-analyst/types.ts +2 -0
- package/dist/mcp/client-manager.d.ts +26 -0
- package/dist/mcp/client-manager.js +101 -0
- package/dist/mcp/client-manager.js.map +1 -0
- package/dist/mcp/connect-server.d.ts +21 -0
- package/dist/mcp/connect-server.js +170 -0
- package/dist/mcp/connect-server.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/sandbox-stdio-transport.d.ts +32 -0
- package/dist/mcp/sandbox-stdio-transport.js +199 -0
- package/dist/mcp/sandbox-stdio-transport.js.map +1 -0
- package/dist/observability/hooks.d.ts +10 -0
- package/dist/observability/hooks.js +97 -0
- package/dist/observability/hooks.js.map +1 -0
- package/dist/observability/index.d.ts +6 -0
- package/dist/observability/index.js +7 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts +31 -0
- package/dist/observability/metrics.js +61 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/middleware.d.ts +12 -0
- package/dist/observability/middleware.js +45 -0
- package/dist/observability/middleware.js.map +1 -0
- package/dist/observability/otel-harness.test-util.d.ts +37 -0
- package/dist/observability/otel-harness.test-util.js +96 -0
- package/dist/observability/otel-harness.test-util.js.map +1 -0
- package/dist/observability/provider.d.ts +8 -0
- package/dist/observability/provider.js +19 -0
- package/dist/observability/provider.js.map +1 -0
- package/dist/observability/tracing.d.ts +14 -0
- package/dist/observability/tracing.js +40 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/observability/types.d.ts +39 -0
- package/dist/observability/types.js +31 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/personalized-recommend/bundle.json +64 -0
- package/dist/personalized-recommend/index.ts +41 -0
- package/dist/personalized-recommend/package.json +10 -0
- package/dist/personalized-recommend/types.ts +2 -0
- package/dist/plugins/loader.d.ts +11 -0
- package/dist/plugins/loader.js +100 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/merge.d.ts +10 -0
- package/dist/plugins/merge.js +22 -0
- package/dist/plugins/merge.js.map +1 -0
- package/dist/plugins/parse.d.ts +10 -0
- package/dist/plugins/parse.js +139 -0
- package/dist/plugins/parse.js.map +1 -0
- package/dist/plugins/types.d.ts +28 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/plugins/urls.d.ts +7 -0
- package/dist/plugins/urls.js +40 -0
- package/dist/plugins/urls.js.map +1 -0
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.js +3 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sandbox/factory.d.ts +2 -0
- package/dist/sandbox/factory.js +27 -0
- package/dist/sandbox/factory.js.map +1 -0
- package/dist/sandbox/index.d.ts +4 -0
- package/dist/sandbox/index.js +5 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/providers/e2b.d.ts +28 -0
- package/dist/sandbox/providers/e2b.js +294 -0
- package/dist/sandbox/providers/e2b.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-command-run.d.ts +8 -0
- package/dist/sandbox/providers/kubernetes-command-run.js +195 -0
- package/dist/sandbox/providers/kubernetes-command-run.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-helpers.d.ts +31 -0
- package/dist/sandbox/providers/kubernetes-helpers.js +152 -0
- package/dist/sandbox/providers/kubernetes-helpers.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-kubeconfig.d.ts +7 -0
- package/dist/sandbox/providers/kubernetes-kubeconfig.js +51 -0
- package/dist/sandbox/providers/kubernetes-kubeconfig.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-spawn.d.ts +2 -0
- package/dist/sandbox/providers/kubernetes-spawn.js +42 -0
- package/dist/sandbox/providers/kubernetes-spawn.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-spawn.utils.d.ts +32 -0
- package/dist/sandbox/providers/kubernetes-spawn.utils.js +249 -0
- package/dist/sandbox/providers/kubernetes-spawn.utils.js.map +1 -0
- package/dist/sandbox/providers/kubernetes.constants.d.ts +3 -0
- package/dist/sandbox/providers/kubernetes.constants.js +4 -0
- package/dist/sandbox/providers/kubernetes.constants.js.map +1 -0
- package/dist/sandbox/providers/kubernetes.d.ts +37 -0
- package/dist/sandbox/providers/kubernetes.js +258 -0
- package/dist/sandbox/providers/kubernetes.js.map +1 -0
- package/dist/sandbox/types.d.ts +57 -0
- package/dist/sandbox/types.js +2 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/sandbox/utils.d.ts +1 -0
- package/dist/sandbox/utils.js +4 -0
- package/dist/sandbox/utils.js.map +1 -0
- package/dist/schema/bundle.d.ts +143 -0
- package/dist/schema/bundle.js +203 -0
- package/dist/schema/bundle.js.map +1 -0
- package/dist/service/command-routes.d.ts +8 -0
- package/dist/service/command-routes.js +44 -0
- package/dist/service/command-routes.js.map +1 -0
- package/dist/service/create-server.d.ts +9 -0
- package/dist/service/create-server.js +113 -0
- package/dist/service/create-server.js.map +1 -0
- package/dist/service/index.d.ts +1 -0
- package/dist/service/index.js +2 -0
- package/dist/service/index.js.map +1 -0
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +18 -0
- package/dist/skills/loader.js +142 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/summaries.d.ts +8 -0
- package/dist/skills/summaries.js +9 -0
- package/dist/skills/summaries.js.map +1 -0
- package/dist/test-helpers/env.d.ts +2 -0
- package/dist/test-helpers/env.js +20 -0
- package/dist/test-helpers/env.js.map +1 -0
- package/dist/test-helpers/mock-agent.d.ts +56 -0
- package/dist/test-helpers/mock-agent.js +180 -0
- package/dist/test-helpers/mock-agent.js.map +1 -0
- package/dist/test-helpers/mock-sandbox.d.ts +33 -0
- package/dist/test-helpers/mock-sandbox.js +200 -0
- package/dist/test-helpers/mock-sandbox.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.js +3 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/render.d.ts +8 -0
- package/dist/tui/render.js +40 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/tui.d.ts +19 -0
- package/dist/tui/tui.js +133 -0
- package/dist/tui/tui.js.map +1 -0
- package/dist/webui/create-webui-server.d.ts +22 -0
- package/dist/webui/create-webui-server.js +293 -0
- package/dist/webui/create-webui-server.js.map +1 -0
- package/dist/webui/event-bus.d.ts +16 -0
- package/dist/webui/event-bus.js +24 -0
- package/dist/webui/event-bus.js.map +1 -0
- package/dist/webui/index.d.ts +2 -0
- package/dist/webui/index.js +3 -0
- package/dist/webui/index.js.map +1 -0
- package/dist/webui/public/app.js +847 -0
- package/dist/webui/public/file-transfer.js +114 -0
- package/dist/webui/public/index.html +166 -0
- package/dist/webui/public/styles.css +1678 -0
- package/package.json +99 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
import { type TemplateClass } from "e2b";
|
|
3
|
+
import type { Skill } from "../skills/loader.js";
|
|
4
|
+
type SpawnOptions = {
|
|
5
|
+
stdio: ["ignore", "pipe", "pipe"];
|
|
6
|
+
env?: NodeJS.ProcessEnv;
|
|
7
|
+
};
|
|
8
|
+
type SpawnedProcess = {
|
|
9
|
+
readonly stdout: Readable | null;
|
|
10
|
+
readonly stderr: Readable | null;
|
|
11
|
+
on(event: "close", listener: (code: number | null) => void): SpawnedProcess;
|
|
12
|
+
on(event: "error", listener: (error: Error) => void): SpawnedProcess;
|
|
13
|
+
};
|
|
14
|
+
type TemplateBuildLog = {
|
|
15
|
+
toString(): string;
|
|
16
|
+
};
|
|
17
|
+
type TemplateBuildImpl = (template: TemplateClass, name: string, options?: {
|
|
18
|
+
onBuildLogs?: (entry: TemplateBuildLog) => void;
|
|
19
|
+
}) => Promise<{
|
|
20
|
+
name: string;
|
|
21
|
+
}>;
|
|
22
|
+
export type SpawnLike = (command: string, args: string[], options: SpawnOptions) => SpawnedProcess;
|
|
23
|
+
export type BuildE2BTemplateOptions = {
|
|
24
|
+
bundleDir: string;
|
|
25
|
+
template: string;
|
|
26
|
+
skills: Skill[];
|
|
27
|
+
dockerfile?: string;
|
|
28
|
+
templateBuildImpl?: TemplateBuildImpl;
|
|
29
|
+
spawnImpl?: SpawnLike;
|
|
30
|
+
stdout?: Writable;
|
|
31
|
+
stderr?: Writable;
|
|
32
|
+
};
|
|
33
|
+
export type BuildE2BTemplateResult = {
|
|
34
|
+
templateRef: string;
|
|
35
|
+
exitCode: number;
|
|
36
|
+
};
|
|
37
|
+
export declare function buildE2BTemplate(options: BuildE2BTemplateOptions): Promise<BuildE2BTemplateResult>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { copyFile, mkdir, mkdtemp, readdir, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { Template } from "e2b";
|
|
6
|
+
const DEFAULT_STDIO = ["ignore", "pipe", "pipe"];
|
|
7
|
+
const E2B_DOCKERFILE_NAME = "e2b.Dockerfile";
|
|
8
|
+
const E2B_DOCKERFILE_CONTENT = [
|
|
9
|
+
"FROM e2bdev/base:latest",
|
|
10
|
+
"RUN mkdir -p /skills /tools /workspace",
|
|
11
|
+
"COPY ./skills/ /skills/",
|
|
12
|
+
"COPY ./tools/ /tools/",
|
|
13
|
+
"RUN if [ -f /tools/setup.sh ]; then chmod +x /tools/setup.sh && /tools/setup.sh; fi",
|
|
14
|
+
"",
|
|
15
|
+
].join("\n");
|
|
16
|
+
const defaultSpawn = (command, args, options) => {
|
|
17
|
+
return spawn(command, args, options);
|
|
18
|
+
};
|
|
19
|
+
const defaultTemplateBuild = async (template, name, options) => {
|
|
20
|
+
return await Template.build(template, name, options);
|
|
21
|
+
};
|
|
22
|
+
function isNodeError(error) {
|
|
23
|
+
return error instanceof Error && "code" in error;
|
|
24
|
+
}
|
|
25
|
+
function pipeIfPresent(stream, output, onData) {
|
|
26
|
+
if (!stream) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
stream.on("data", (chunk) => {
|
|
30
|
+
output.write(chunk);
|
|
31
|
+
onData?.(chunk);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function escapeRegExp(value) {
|
|
35
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
36
|
+
}
|
|
37
|
+
function detectTemplateRef(output, fallback) {
|
|
38
|
+
const [templateName] = fallback.split(":");
|
|
39
|
+
const pattern = new RegExp(`\\b(${escapeRegExp(templateName)}:[A-Za-z0-9][A-Za-z0-9._-]*)\\b`, "g");
|
|
40
|
+
const refs = Array.from(output.matchAll(pattern)).map((match) => match[1]);
|
|
41
|
+
const latestRef = refs.at(-1);
|
|
42
|
+
return latestRef ?? fallback;
|
|
43
|
+
}
|
|
44
|
+
function sanitizeSegment(value) {
|
|
45
|
+
const sanitized = value.toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
46
|
+
return sanitized.length > 0 ? sanitized : "skill";
|
|
47
|
+
}
|
|
48
|
+
function isRemoteSourcePath(path) {
|
|
49
|
+
return /^https?:\/\//.test(path);
|
|
50
|
+
}
|
|
51
|
+
function toCliSpawnEnv() {
|
|
52
|
+
if (process.env.E2B_ACCESS_TOKEN || !process.env.E2B_API_KEY) {
|
|
53
|
+
return process.env;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
...process.env,
|
|
57
|
+
E2B_ACCESS_TOKEN: process.env.E2B_API_KEY,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async function copyDirectoryRecursive(sourcePath, destinationPath) {
|
|
61
|
+
await mkdir(destinationPath, { recursive: true });
|
|
62
|
+
const entries = await readdir(sourcePath, { withFileTypes: true });
|
|
63
|
+
await Promise.all(entries.map(async (entry) => {
|
|
64
|
+
const sourceEntryPath = join(sourcePath, entry.name);
|
|
65
|
+
const destinationEntryPath = join(destinationPath, entry.name);
|
|
66
|
+
if (entry.isDirectory()) {
|
|
67
|
+
await copyDirectoryRecursive(sourceEntryPath, destinationEntryPath);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (entry.isFile()) {
|
|
71
|
+
await copyFile(sourceEntryPath, destinationEntryPath);
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
async function copyLocalSkillFiles(skill, destinationPath) {
|
|
76
|
+
if (isRemoteSourcePath(skill.sourcePath)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const sourceSkillDir = dirname(skill.sourcePath);
|
|
80
|
+
const sourceEntries = await readdir(sourceSkillDir, { withFileTypes: true });
|
|
81
|
+
await Promise.all(sourceEntries.map(async (entry) => {
|
|
82
|
+
if (entry.name === "SKILL.md") {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const sourceEntryPath = join(sourceSkillDir, entry.name);
|
|
86
|
+
const destinationEntryPath = join(destinationPath, entry.name);
|
|
87
|
+
if (entry.isDirectory()) {
|
|
88
|
+
await copyDirectoryRecursive(sourceEntryPath, destinationEntryPath);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (entry.isFile()) {
|
|
92
|
+
await copyFile(sourceEntryPath, destinationEntryPath);
|
|
93
|
+
}
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
async function writeSkillsBuildContext(contextDir, skills) {
|
|
97
|
+
const skillsDir = join(contextDir, "skills");
|
|
98
|
+
await mkdir(skillsDir, { recursive: true });
|
|
99
|
+
await Promise.all(skills.map(async (skill, index) => {
|
|
100
|
+
const skillDirName = `${String(index + 1).padStart(2, "0")}-${sanitizeSegment(skill.name)}`;
|
|
101
|
+
const skillDir = join(skillsDir, skillDirName);
|
|
102
|
+
await mkdir(skillDir, { recursive: true });
|
|
103
|
+
await writeFile(join(skillDir, "SKILL.md"), skill.content, "utf8");
|
|
104
|
+
await copyLocalSkillFiles(skill, skillDir);
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
async function pathExists(path) {
|
|
108
|
+
try {
|
|
109
|
+
await stat(path);
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function writeToolsBuildContext(contextDir, bundleDir) {
|
|
120
|
+
const destinationToolsPath = join(contextDir, "tools");
|
|
121
|
+
const sourceToolsPath = join(bundleDir, "tools");
|
|
122
|
+
if (await pathExists(sourceToolsPath)) {
|
|
123
|
+
await copyDirectoryRecursive(sourceToolsPath, destinationToolsPath);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
await mkdir(destinationToolsPath, { recursive: true });
|
|
127
|
+
}
|
|
128
|
+
async function createBuildContext(options) {
|
|
129
|
+
const contextDir = await mkdtemp(join(tmpdir(), "agent-bundle-e2b-"));
|
|
130
|
+
await writeSkillsBuildContext(contextDir, options.skills);
|
|
131
|
+
await writeToolsBuildContext(contextDir, options.bundleDir);
|
|
132
|
+
if (options.dockerfile) {
|
|
133
|
+
await copyFile(options.dockerfile, join(contextDir, E2B_DOCKERFILE_NAME));
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
await writeFile(join(contextDir, E2B_DOCKERFILE_NAME), E2B_DOCKERFILE_CONTENT, "utf8");
|
|
137
|
+
}
|
|
138
|
+
return contextDir;
|
|
139
|
+
}
|
|
140
|
+
async function runTemplateBuildSdk(input) {
|
|
141
|
+
const template = Template({ fileContextPath: input.contextDir }).fromDockerfile(join(input.contextDir, E2B_DOCKERFILE_NAME));
|
|
142
|
+
const buildInfo = await input.templateBuildImpl(template, input.template, {
|
|
143
|
+
onBuildLogs: (entry) => {
|
|
144
|
+
input.stdout.write(`${entry.toString()}\n`);
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
templateRef: buildInfo.name || input.template,
|
|
149
|
+
exitCode: 0,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async function runTemplateBuildCli(input) {
|
|
153
|
+
const args = ["template", "build", "--path", input.contextDir, input.template];
|
|
154
|
+
let stdoutOutput = "";
|
|
155
|
+
let commandOutput = "";
|
|
156
|
+
return await new Promise((resolvePromise, rejectPromise) => {
|
|
157
|
+
const child = input.spawnImpl("e2b", args, {
|
|
158
|
+
stdio: DEFAULT_STDIO,
|
|
159
|
+
env: toCliSpawnEnv(),
|
|
160
|
+
});
|
|
161
|
+
pipeIfPresent(child.stdout, input.stdout, (chunk) => {
|
|
162
|
+
const text = chunk.toString();
|
|
163
|
+
stdoutOutput += text;
|
|
164
|
+
commandOutput += text;
|
|
165
|
+
});
|
|
166
|
+
pipeIfPresent(child.stderr, input.stderr, (chunk) => {
|
|
167
|
+
commandOutput += chunk.toString();
|
|
168
|
+
});
|
|
169
|
+
child.on("error", (error) => {
|
|
170
|
+
rejectPromise(new Error(`Failed to start e2b template build: ${error.message}`));
|
|
171
|
+
});
|
|
172
|
+
child.on("close", (code) => {
|
|
173
|
+
const stdoutTemplateRef = detectTemplateRef(stdoutOutput, input.template);
|
|
174
|
+
resolvePromise({
|
|
175
|
+
templateRef: stdoutTemplateRef === input.template
|
|
176
|
+
? detectTemplateRef(commandOutput, input.template)
|
|
177
|
+
: stdoutTemplateRef,
|
|
178
|
+
exitCode: code ?? 1,
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
async function runTemplateBuildWithFallback(input) {
|
|
184
|
+
try {
|
|
185
|
+
return await runTemplateBuildSdk({
|
|
186
|
+
contextDir: input.contextDir,
|
|
187
|
+
template: input.template,
|
|
188
|
+
templateBuildImpl: input.templateBuildImpl,
|
|
189
|
+
stdout: input.stdout,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
input.stderr.write(`E2B SDK template build failed (${error instanceof Error ? error.message : String(error)}). Falling back to e2b CLI.\n`);
|
|
194
|
+
return await runTemplateBuildCli({
|
|
195
|
+
contextDir: input.contextDir,
|
|
196
|
+
template: input.template,
|
|
197
|
+
spawnImpl: input.spawnImpl,
|
|
198
|
+
stdout: input.stdout,
|
|
199
|
+
stderr: input.stderr,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export async function buildE2BTemplate(options) {
|
|
204
|
+
const spawnImpl = options.spawnImpl ?? defaultSpawn;
|
|
205
|
+
const templateBuildImpl = options.templateBuildImpl ?? defaultTemplateBuild;
|
|
206
|
+
const output = options.stdout ?? process.stdout;
|
|
207
|
+
const errorOutput = options.stderr ?? process.stderr;
|
|
208
|
+
const contextDir = await createBuildContext(options);
|
|
209
|
+
try {
|
|
210
|
+
return await runTemplateBuildWithFallback({
|
|
211
|
+
contextDir,
|
|
212
|
+
template: options.template,
|
|
213
|
+
templateBuildImpl,
|
|
214
|
+
spawnImpl,
|
|
215
|
+
stdout: output,
|
|
216
|
+
stderr: errorOutput,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
await rm(contextDir, { recursive: true, force: true });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=build-e2b-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-e2b-template.js","sourceRoot":"","sources":["../../src/cli/build-e2b-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PassThrough } from "node:stream";
|
|
2
|
+
import type { Skill } from "../skills/loader.js";
|
|
3
|
+
import { withTemporaryEnv, type EnvRestore } from "../test-helpers/env.js";
|
|
4
|
+
export declare class MockSpawnedProcess {
|
|
5
|
+
readonly stdout: PassThrough;
|
|
6
|
+
readonly stderr: PassThrough;
|
|
7
|
+
private closeListeners;
|
|
8
|
+
private errorListeners;
|
|
9
|
+
on(event: "close", listener: (code: number | null) => void): this;
|
|
10
|
+
on(event: "error", listener: (error: Error) => void): this;
|
|
11
|
+
emitClose(code: number | null): void;
|
|
12
|
+
emitError(error: Error): void;
|
|
13
|
+
}
|
|
14
|
+
export declare function createTempWorkspace(name: string): Promise<string>;
|
|
15
|
+
export declare function createLocalSkill(workspaceDir: string): Promise<Skill>;
|
|
16
|
+
export declare function createRemoteSkill(): Skill;
|
|
17
|
+
export declare function statPath(path: string): Promise<void>;
|
|
18
|
+
export declare function cleanupTempWorkspaces(): Promise<void>;
|
|
19
|
+
export { withTemporaryEnv, type EnvRestore };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, rm, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { PassThrough } from "node:stream";
|
|
5
|
+
import { withTemporaryEnv } from "../test-helpers/env.js";
|
|
6
|
+
const CREATED_DIRS = [];
|
|
7
|
+
export class MockSpawnedProcess {
|
|
8
|
+
stdout = new PassThrough();
|
|
9
|
+
stderr = new PassThrough();
|
|
10
|
+
closeListeners = [];
|
|
11
|
+
errorListeners = [];
|
|
12
|
+
on(event, listener) {
|
|
13
|
+
if (event === "close") {
|
|
14
|
+
this.closeListeners.push(listener);
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
this.errorListeners.push(listener);
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
emitClose(code) {
|
|
21
|
+
this.closeListeners.forEach((listener) => {
|
|
22
|
+
listener(code);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
emitError(error) {
|
|
26
|
+
this.errorListeners.forEach((listener) => {
|
|
27
|
+
listener(error);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function createTempWorkspace(name) {
|
|
32
|
+
const directory = await mkdtemp(join(tmpdir(), `agent-bundle-e2b-test-${name}-`));
|
|
33
|
+
CREATED_DIRS.push(directory);
|
|
34
|
+
return directory;
|
|
35
|
+
}
|
|
36
|
+
export async function createLocalSkill(workspaceDir) {
|
|
37
|
+
const skillDir = join(workspaceDir, "skills", "format-code");
|
|
38
|
+
await mkdir(skillDir, { recursive: true });
|
|
39
|
+
const skillMarkdown = [
|
|
40
|
+
"---",
|
|
41
|
+
"name: Format Code",
|
|
42
|
+
"description: Format source code in sandbox",
|
|
43
|
+
"---",
|
|
44
|
+
"Use the formatter.",
|
|
45
|
+
"",
|
|
46
|
+
].join("\n");
|
|
47
|
+
await writeFile(join(skillDir, "SKILL.md"), skillMarkdown, "utf8");
|
|
48
|
+
await writeFile(join(skillDir, "format.py"), "print('format')\n", "utf8");
|
|
49
|
+
return {
|
|
50
|
+
name: "Format Code",
|
|
51
|
+
description: "Format source code in sandbox",
|
|
52
|
+
content: skillMarkdown,
|
|
53
|
+
sourcePath: join(skillDir, "SKILL.md"),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function createRemoteSkill() {
|
|
57
|
+
return {
|
|
58
|
+
name: "Remote Skill",
|
|
59
|
+
description: "Loaded from remote registry",
|
|
60
|
+
content: [
|
|
61
|
+
"---",
|
|
62
|
+
"name: Remote Skill",
|
|
63
|
+
"description: Loaded from remote registry",
|
|
64
|
+
"---",
|
|
65
|
+
"Use remote logic.",
|
|
66
|
+
"",
|
|
67
|
+
].join("\n"),
|
|
68
|
+
sourcePath: "https://example.com/skills/remote/SKILL.md",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export async function statPath(path) {
|
|
72
|
+
await stat(path);
|
|
73
|
+
}
|
|
74
|
+
export async function cleanupTempWorkspaces() {
|
|
75
|
+
await Promise.all(CREATED_DIRS.splice(0).map(async (directory) => {
|
|
76
|
+
await rm(directory, { recursive: true, force: true });
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
export { withTemporaryEnv };
|
|
80
|
+
//# sourceMappingURL=build-e2b-template.test-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-e2b-template.test-helpers.js","sourceRoot":"","sources":["../../src/cli/build-e2b-template.test-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
type SpawnOptions = {
|
|
3
|
+
stdio: ["ignore", "pipe", "pipe"];
|
|
4
|
+
};
|
|
5
|
+
type SpawnedProcess = {
|
|
6
|
+
readonly stdout: Readable | null;
|
|
7
|
+
readonly stderr: Readable | null;
|
|
8
|
+
on(event: "close", listener: (code: number | null) => void): SpawnedProcess;
|
|
9
|
+
on(event: "error", listener: (error: Error) => void): SpawnedProcess;
|
|
10
|
+
};
|
|
11
|
+
export type SpawnLike = (command: string, args: string[], options: SpawnOptions) => SpawnedProcess;
|
|
12
|
+
export type BuildSandboxImageOptions = {
|
|
13
|
+
bundleDir: string;
|
|
14
|
+
dockerfile: string;
|
|
15
|
+
context?: string;
|
|
16
|
+
imageTag: string;
|
|
17
|
+
spawnImpl?: SpawnLike;
|
|
18
|
+
stdout?: Writable;
|
|
19
|
+
stderr?: Writable;
|
|
20
|
+
};
|
|
21
|
+
export type BuildSandboxImageResult = {
|
|
22
|
+
imageTag: string;
|
|
23
|
+
exitCode: number;
|
|
24
|
+
};
|
|
25
|
+
export type DockerBuildPaths = {
|
|
26
|
+
dockerfilePath: string;
|
|
27
|
+
contextPath: string;
|
|
28
|
+
};
|
|
29
|
+
export declare function resolveDockerBuildPaths(input: {
|
|
30
|
+
bundleDir: string;
|
|
31
|
+
dockerfile: string;
|
|
32
|
+
context?: string;
|
|
33
|
+
}): DockerBuildPaths;
|
|
34
|
+
export declare function buildSandboxImage(options: BuildSandboxImageOptions): Promise<BuildSandboxImageResult>;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
const DEFAULT_STDIO = ["ignore", "pipe", "pipe"];
|
|
4
|
+
const defaultSpawn = (command, args, options) => {
|
|
5
|
+
return spawn(command, args, options);
|
|
6
|
+
};
|
|
7
|
+
function pipeIfPresent(stream, output) {
|
|
8
|
+
if (!stream) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
stream.on("data", (chunk) => {
|
|
12
|
+
output.write(chunk);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export function resolveDockerBuildPaths(input) {
|
|
16
|
+
const dockerfilePath = resolve(input.bundleDir, input.dockerfile);
|
|
17
|
+
const contextPath = input.context
|
|
18
|
+
? resolve(input.bundleDir, input.context)
|
|
19
|
+
: dirname(dockerfilePath);
|
|
20
|
+
return {
|
|
21
|
+
dockerfilePath,
|
|
22
|
+
contextPath,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export async function buildSandboxImage(options) {
|
|
26
|
+
const spawnImpl = options.spawnImpl ?? defaultSpawn;
|
|
27
|
+
const output = options.stdout ?? process.stdout;
|
|
28
|
+
const errorOutput = options.stderr ?? process.stderr;
|
|
29
|
+
const paths = resolveDockerBuildPaths({
|
|
30
|
+
bundleDir: options.bundleDir,
|
|
31
|
+
dockerfile: options.dockerfile,
|
|
32
|
+
context: options.context,
|
|
33
|
+
});
|
|
34
|
+
const args = [
|
|
35
|
+
"build",
|
|
36
|
+
"-t",
|
|
37
|
+
options.imageTag,
|
|
38
|
+
"-f",
|
|
39
|
+
paths.dockerfilePath,
|
|
40
|
+
paths.contextPath,
|
|
41
|
+
];
|
|
42
|
+
return await new Promise((resolvePromise, rejectPromise) => {
|
|
43
|
+
const child = spawnImpl("docker", args, { stdio: DEFAULT_STDIO });
|
|
44
|
+
pipeIfPresent(child.stdout, output);
|
|
45
|
+
pipeIfPresent(child.stderr, errorOutput);
|
|
46
|
+
child.on("error", (error) => {
|
|
47
|
+
rejectPromise(new Error(`Failed to start docker build: ${error.message}`));
|
|
48
|
+
});
|
|
49
|
+
child.on("close", (code) => {
|
|
50
|
+
resolvePromise({
|
|
51
|
+
imageTag: options.imageTag,
|
|
52
|
+
exitCode: code ?? 1,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=build-sandbox-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-sandbox-image.js","sourceRoot":"","sources":["../../src/cli/build-sandbox-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwC7C,MAAM,aAAa,GAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAExE,MAAM,YAAY,GAAc,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IACzD,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,SAAS,aAAa,CAAC,MAAuB,EAAE,MAAgB;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAIvC;IACC,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO;QAC/B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;QACzC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5B,OAAO;QACL,cAAc;QACd,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC;IAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,YAAY,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,uBAAuB,CAAC;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG;QACX,OAAO;QACP,IAAI;QACJ,OAAO,CAAC,QAAQ;QAChB,IAAI;QACJ,KAAK,CAAC,cAAc;QACpB,KAAK,CAAC,WAAW;KAClB,CAAC;IAEF,OAAO,MAAM,IAAI,OAAO,CAA0B,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QAClF,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAElE,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAEzC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,aAAa,CAAC,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,cAAc,CAAC;gBACb,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,QAAQ,EAAE,IAAI,IAAI,CAAC;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import type { Writable } from "node:stream";
|
|
3
|
+
import { generateSystemPromptTemplate } from "../agent-loop/system-prompt/generate.js";
|
|
4
|
+
import { loadAllSkills } from "../skills/loader.js";
|
|
5
|
+
import { type ResolvedBundleConfig } from "./build-codegen.js";
|
|
6
|
+
import { buildE2BTemplate } from "./build-e2b-template.js";
|
|
7
|
+
import { buildSandboxImage } from "./build-sandbox-image.js";
|
|
8
|
+
import { loadBundleConfig } from "./load-bundle-config.js";
|
|
9
|
+
export declare const DEFAULT_OUTPUT_DIR = "dist";
|
|
10
|
+
export type RunBuildOptions = {
|
|
11
|
+
configPath: string;
|
|
12
|
+
outputDir?: string;
|
|
13
|
+
stdout?: Writable;
|
|
14
|
+
stderr?: Writable;
|
|
15
|
+
};
|
|
16
|
+
export type RunBuildResult = {
|
|
17
|
+
outputDir: string;
|
|
18
|
+
resolvedConfig: ResolvedBundleConfig;
|
|
19
|
+
};
|
|
20
|
+
type BuildDependencies = {
|
|
21
|
+
loadConfig?: typeof loadBundleConfig;
|
|
22
|
+
loadSkills?: typeof loadAllSkills;
|
|
23
|
+
generateSystemPrompt?: typeof generateSystemPromptTemplate;
|
|
24
|
+
buildSandbox?: typeof buildSandboxImage;
|
|
25
|
+
buildE2B?: typeof buildE2BTemplate;
|
|
26
|
+
writeFileImpl?: typeof writeFile;
|
|
27
|
+
mkdirImpl?: typeof mkdir;
|
|
28
|
+
};
|
|
29
|
+
export declare function runBuildCommand(options: RunBuildOptions, dependencies?: BuildDependencies): Promise<RunBuildResult>;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { generateSystemPromptTemplate } from "../agent-loop/system-prompt/generate.js";
|
|
4
|
+
import { loadAllSkills } from "../skills/loader.js";
|
|
5
|
+
import { toSkillSummaries } from "../skills/summaries.js";
|
|
6
|
+
import { createResolvedBundleConfig, generateSources, } from "./build-codegen.js";
|
|
7
|
+
import { buildE2BTemplate } from "./build-e2b-template.js";
|
|
8
|
+
import { buildSandboxImage } from "./build-sandbox-image.js";
|
|
9
|
+
import { writeGeneratedFiles } from "./generate.js";
|
|
10
|
+
import { loadBundleConfig } from "./load-bundle-config.js";
|
|
11
|
+
export const DEFAULT_OUTPUT_DIR = "dist";
|
|
12
|
+
function ensureKubernetesImage(config) {
|
|
13
|
+
const image = config.sandbox.kubernetes?.image;
|
|
14
|
+
if (!image) {
|
|
15
|
+
throw new Error("sandbox.kubernetes.image is required when sandbox provider is kubernetes.");
|
|
16
|
+
}
|
|
17
|
+
return image;
|
|
18
|
+
}
|
|
19
|
+
function ensureE2BTemplate(config) {
|
|
20
|
+
const template = config.sandbox.e2b?.template;
|
|
21
|
+
if (!template) {
|
|
22
|
+
throw new Error("sandbox.e2b.template is required when sandbox provider is e2b.");
|
|
23
|
+
}
|
|
24
|
+
return template;
|
|
25
|
+
}
|
|
26
|
+
async function buildKubernetesSandboxImage(input) {
|
|
27
|
+
const imageTag = ensureKubernetesImage(input.config);
|
|
28
|
+
const buildConfig = input.config.sandbox.kubernetes?.build;
|
|
29
|
+
if (!buildConfig) {
|
|
30
|
+
input.stdout.write(`Skipping docker build and using configured image: ${imageTag}\n`);
|
|
31
|
+
return {
|
|
32
|
+
provider: "kubernetes",
|
|
33
|
+
ref: imageTag,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
input.stdout.write(`Building sandbox image with Docker: ${imageTag}\n`);
|
|
37
|
+
const buildResult = await input.buildSandbox({
|
|
38
|
+
bundleDir: input.bundleDir,
|
|
39
|
+
dockerfile: buildConfig.dockerfile,
|
|
40
|
+
context: buildConfig.context,
|
|
41
|
+
imageTag,
|
|
42
|
+
stdout: input.stdout,
|
|
43
|
+
stderr: input.stderr,
|
|
44
|
+
});
|
|
45
|
+
return toKubernetesSandboxImageRef(buildResult);
|
|
46
|
+
}
|
|
47
|
+
async function buildE2BSandboxImage(input) {
|
|
48
|
+
const template = ensureE2BTemplate(input.config);
|
|
49
|
+
const buildConfig = input.config.sandbox.e2b?.build;
|
|
50
|
+
const dockerfile = buildConfig
|
|
51
|
+
? resolve(input.bundleDir, buildConfig.dockerfile)
|
|
52
|
+
: undefined;
|
|
53
|
+
input.stdout.write(`Building sandbox template with E2B: ${template}\n`);
|
|
54
|
+
const buildResult = await input.buildE2B({
|
|
55
|
+
bundleDir: input.bundleDir,
|
|
56
|
+
template,
|
|
57
|
+
skills: input.skills,
|
|
58
|
+
...(dockerfile ? { dockerfile } : {}),
|
|
59
|
+
stdout: input.stdout,
|
|
60
|
+
stderr: input.stderr,
|
|
61
|
+
});
|
|
62
|
+
return toE2BSandboxImageRef(buildResult);
|
|
63
|
+
}
|
|
64
|
+
function toKubernetesSandboxImageRef(result) {
|
|
65
|
+
if (result.exitCode !== 0) {
|
|
66
|
+
throw new Error(`docker build failed with exit code ${result.exitCode}.`);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
provider: "kubernetes",
|
|
70
|
+
ref: result.imageTag,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function toE2BSandboxImageRef(result) {
|
|
74
|
+
if (result.exitCode !== 0) {
|
|
75
|
+
throw new Error(`e2b template build failed with exit code ${result.exitCode}.`);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
provider: "e2b",
|
|
79
|
+
ref: result.templateRef,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function resolveSandboxImageRef(input) {
|
|
83
|
+
if (input.config.sandbox.provider === "kubernetes") {
|
|
84
|
+
return await buildKubernetesSandboxImage({
|
|
85
|
+
config: input.config,
|
|
86
|
+
bundleDir: input.bundleDir,
|
|
87
|
+
buildSandbox: input.buildSandbox,
|
|
88
|
+
stdout: input.stdout,
|
|
89
|
+
stderr: input.stderr,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return await buildE2BSandboxImage({
|
|
93
|
+
config: input.config,
|
|
94
|
+
bundleDir: input.bundleDir,
|
|
95
|
+
skills: input.skills,
|
|
96
|
+
buildE2B: input.buildE2B,
|
|
97
|
+
stdout: input.stdout,
|
|
98
|
+
stderr: input.stderr,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
export async function runBuildCommand(options, dependencies = {}) {
|
|
102
|
+
const loadConfigImpl = dependencies.loadConfig ?? loadBundleConfig;
|
|
103
|
+
const loadSkillsImpl = dependencies.loadSkills ?? loadAllSkills;
|
|
104
|
+
const promptGenerator = dependencies.generateSystemPrompt ?? generateSystemPromptTemplate;
|
|
105
|
+
const buildSandboxImpl = dependencies.buildSandbox ?? buildSandboxImage;
|
|
106
|
+
const buildE2BImpl = dependencies.buildE2B ?? buildE2BTemplate;
|
|
107
|
+
const writeFileImpl = dependencies.writeFileImpl ?? writeFile;
|
|
108
|
+
const mkdirImpl = dependencies.mkdirImpl ?? mkdir;
|
|
109
|
+
const stdout = options.stdout ?? process.stdout;
|
|
110
|
+
const stderr = options.stderr ?? process.stderr;
|
|
111
|
+
const configPath = resolve(options.configPath);
|
|
112
|
+
const bundleDir = dirname(configPath);
|
|
113
|
+
const config = await loadConfigImpl(configPath);
|
|
114
|
+
stdout.write(`Building bundle "${config.name}" from ${configPath}\n`);
|
|
115
|
+
const skills = await loadSkillsImpl(config.skills, bundleDir);
|
|
116
|
+
const skillSummaries = toSkillSummaries(skills);
|
|
117
|
+
const sandboxImage = await resolveSandboxImageRef({
|
|
118
|
+
config,
|
|
119
|
+
bundleDir,
|
|
120
|
+
skills,
|
|
121
|
+
buildSandbox: buildSandboxImpl,
|
|
122
|
+
buildE2B: buildE2BImpl,
|
|
123
|
+
stdout,
|
|
124
|
+
stderr,
|
|
125
|
+
});
|
|
126
|
+
const systemPrompt = promptGenerator({
|
|
127
|
+
basePrompt: config.prompt.system,
|
|
128
|
+
skills: skillSummaries,
|
|
129
|
+
});
|
|
130
|
+
const resolvedConfig = createResolvedBundleConfig({
|
|
131
|
+
config,
|
|
132
|
+
skills: skillSummaries,
|
|
133
|
+
systemPrompt,
|
|
134
|
+
sandboxImage,
|
|
135
|
+
});
|
|
136
|
+
const sources = generateSources(resolvedConfig);
|
|
137
|
+
const outputRoot = resolve(options.outputDir ?? DEFAULT_OUTPUT_DIR);
|
|
138
|
+
const outputDir = join(outputRoot, config.name);
|
|
139
|
+
await writeGeneratedFiles({
|
|
140
|
+
outputDir,
|
|
141
|
+
sources,
|
|
142
|
+
mkdirImpl,
|
|
143
|
+
writeFileImpl,
|
|
144
|
+
});
|
|
145
|
+
stdout.write(`Build completed: ${outputDir}\n`);
|
|
146
|
+
return {
|
|
147
|
+
outputDir,
|
|
148
|
+
resolvedConfig,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=build.js.map
|