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,42 @@
|
|
|
1
|
+
import type { Agent, AgentConfig, AgentFactory } from "../../agent/types.js";
|
|
2
|
+
import type { Command } from "../../commands/types.js";
|
|
3
|
+
import type { BundleConfig } from "../../schema/bundle.js";
|
|
4
|
+
import type { Sandbox, SandboxIO } from "../../sandbox/types.js";
|
|
5
|
+
import { resolveServeInputs, type KeyValueArgInput, type SkillInfo } from "./runtime.js";
|
|
6
|
+
import type { StartedHttpServer, StartHttpServerInput } from "./http.js";
|
|
7
|
+
export declare const DEFAULT_SERVE_PORT = 3000;
|
|
8
|
+
export type DefineAgentForServe = (config: AgentConfig<string>) => AgentFactory<string>;
|
|
9
|
+
export type ServeDependencies = {
|
|
10
|
+
defineAgentImpl?: DefineAgentForServe;
|
|
11
|
+
startHttpServerImpl?: (input: StartHttpServerInput) => Promise<StartedHttpServer>;
|
|
12
|
+
signalProcess?: Pick<NodeJS.Process, "on" | "off">;
|
|
13
|
+
env?: NodeJS.ProcessEnv;
|
|
14
|
+
exit?: (code: number) => void;
|
|
15
|
+
loadConfig?: Parameters<typeof resolveServeInputs>[1];
|
|
16
|
+
loadSkills?: Parameters<typeof resolveServeInputs>[2];
|
|
17
|
+
generateSystemPrompt?: Parameters<typeof resolveServeInputs>[3];
|
|
18
|
+
};
|
|
19
|
+
export type InitializedServeContext = {
|
|
20
|
+
configPath: string;
|
|
21
|
+
config: BundleConfig;
|
|
22
|
+
agent: Agent;
|
|
23
|
+
webUISandbox: Sandbox;
|
|
24
|
+
commands: Command[];
|
|
25
|
+
skills: SkillInfo[];
|
|
26
|
+
};
|
|
27
|
+
export type RunServeOptions = {
|
|
28
|
+
configPath: string;
|
|
29
|
+
port?: number;
|
|
30
|
+
variableEntries?: KeyValueArgInput;
|
|
31
|
+
mcpTokenEntries?: KeyValueArgInput;
|
|
32
|
+
stdin?: NodeJS.ReadableStream;
|
|
33
|
+
stdout?: NodeJS.WritableStream;
|
|
34
|
+
stderr?: NodeJS.WritableStream;
|
|
35
|
+
};
|
|
36
|
+
export type RunServeResult = {
|
|
37
|
+
port: number;
|
|
38
|
+
};
|
|
39
|
+
export declare function validatePort(port: number): void;
|
|
40
|
+
export declare function toWebUISandboxAdapter(sandboxIO: SandboxIO): Sandbox;
|
|
41
|
+
export declare function initializeServeContext(options: RunServeOptions, dependencies: ServeDependencies): Promise<InitializedServeContext>;
|
|
42
|
+
export declare function wireSignalShutdown(signalProcess: Pick<NodeJS.Process, "on" | "off">, shutdown: () => Promise<void>, exit: (code: number) => void, stderr: NodeJS.WritableStream): Promise<void>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { defineAgent } from "../../agent/define-agent.js";
|
|
2
|
+
import { toErrorMessage } from "../error.js";
|
|
3
|
+
import { parseKeyValueEntries, resolveInitVariables, resolveMcpTokens, resolveServeInputs, resolveServeSandboxConfig, } from "./runtime.js";
|
|
4
|
+
export const DEFAULT_SERVE_PORT = 3000;
|
|
5
|
+
export function validatePort(port) {
|
|
6
|
+
if (!Number.isInteger(port) || port < 1 || port > 65_535) {
|
|
7
|
+
throw new Error("Serve port must be an integer between 1 and 65535.");
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function toWebUISandboxAdapter(sandboxIO) {
|
|
11
|
+
let status = "ready";
|
|
12
|
+
return {
|
|
13
|
+
id: "serve-sandbox",
|
|
14
|
+
get status() {
|
|
15
|
+
return status;
|
|
16
|
+
},
|
|
17
|
+
// Adapter does not own lifecycle; the real sandbox is managed by AgentImpl.
|
|
18
|
+
start: async () => {
|
|
19
|
+
status = "ready";
|
|
20
|
+
},
|
|
21
|
+
// Reflect shutdown state for any status-based observer in WebUI integrations.
|
|
22
|
+
shutdown: async () => {
|
|
23
|
+
status = "stopped";
|
|
24
|
+
},
|
|
25
|
+
exec: async (command, options) => {
|
|
26
|
+
return await sandboxIO.exec(command, options);
|
|
27
|
+
},
|
|
28
|
+
spawn: async (command, args, options) => {
|
|
29
|
+
return await sandboxIO.spawn(command, args, options);
|
|
30
|
+
},
|
|
31
|
+
file: sandboxIO.file,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export async function initializeServeContext(options, dependencies) {
|
|
35
|
+
const defineAgentImpl = dependencies.defineAgentImpl ?? defineAgent;
|
|
36
|
+
const env = dependencies.env ?? process.env;
|
|
37
|
+
const variableOverrides = parseKeyValueEntries(options.variableEntries, "--var");
|
|
38
|
+
const mcpTokenOverrides = parseKeyValueEntries(options.mcpTokenEntries, "--mcp-token");
|
|
39
|
+
const { configPath, config, systemPrompt, commands, skills } = await resolveServeInputs(options.configPath, dependencies.loadConfig, dependencies.loadSkills, dependencies.generateSystemPrompt);
|
|
40
|
+
const variables = resolveInitVariables(config.prompt.variables, variableOverrides, env);
|
|
41
|
+
const mcpServers = config.mcp?.servers ?? [];
|
|
42
|
+
const mcpTokens = resolveMcpTokens(mcpServers, mcpTokenOverrides, env);
|
|
43
|
+
const agentFactoryConfig = {
|
|
44
|
+
name: config.name,
|
|
45
|
+
sandbox: resolveServeSandboxConfig(config.sandbox),
|
|
46
|
+
model: config.model,
|
|
47
|
+
systemPrompt,
|
|
48
|
+
variables: config.prompt.variables,
|
|
49
|
+
...(mcpServers.length > 0 ? { mcp: mcpServers } : {}),
|
|
50
|
+
};
|
|
51
|
+
let capturedSandboxIO = null;
|
|
52
|
+
const initOptions = {
|
|
53
|
+
variables,
|
|
54
|
+
hooks: {
|
|
55
|
+
postMount: async (io) => {
|
|
56
|
+
capturedSandboxIO = io;
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
...(Object.keys(mcpTokens).length > 0 ? { mcpTokens } : {}),
|
|
60
|
+
};
|
|
61
|
+
const agent = await defineAgentImpl(agentFactoryConfig).init(initOptions);
|
|
62
|
+
if (!capturedSandboxIO) {
|
|
63
|
+
await agent.shutdown();
|
|
64
|
+
throw new Error("Agent initialized without exposing sandbox IO for WebUI.");
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
configPath,
|
|
68
|
+
config,
|
|
69
|
+
agent,
|
|
70
|
+
webUISandbox: toWebUISandboxAdapter(capturedSandboxIO),
|
|
71
|
+
commands,
|
|
72
|
+
skills,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export async function wireSignalShutdown(signalProcess, shutdown, exit, stderr) {
|
|
76
|
+
const onSignal = (signal) => {
|
|
77
|
+
void shutdown()
|
|
78
|
+
.then(() => exit(0))
|
|
79
|
+
.catch((error) => {
|
|
80
|
+
stderr.write(`[serve] failed to shutdown on ${signal}: ${toErrorMessage(error)}\n`);
|
|
81
|
+
exit(1);
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
let resolveShutdown = null;
|
|
85
|
+
const onShutdownSignal = () => {
|
|
86
|
+
resolveShutdown?.();
|
|
87
|
+
};
|
|
88
|
+
signalProcess.on("SIGINT", onSignal);
|
|
89
|
+
signalProcess.on("SIGTERM", onSignal);
|
|
90
|
+
signalProcess.on("SIGINT", onShutdownSignal);
|
|
91
|
+
signalProcess.on("SIGTERM", onShutdownSignal);
|
|
92
|
+
try {
|
|
93
|
+
await new Promise((resolve) => {
|
|
94
|
+
resolveShutdown = () => {
|
|
95
|
+
if (!resolveShutdown) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
resolveShutdown = null;
|
|
99
|
+
resolve();
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
signalProcess.off("SIGINT", onSignal);
|
|
105
|
+
signalProcess.off("SIGTERM", onSignal);
|
|
106
|
+
signalProcess.off("SIGINT", onShutdownSignal);
|
|
107
|
+
signalProcess.off("SIGTERM", onShutdownSignal);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/serve/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { generateSystemPromptTemplate } from "../../agent-loop/system-prompt/generate.js";
|
|
2
|
+
import type { McpServerConfig } from "../../agent/types.js";
|
|
3
|
+
import { loadAllCommands } from "../../commands/loader.js";
|
|
4
|
+
import type { Command } from "../../commands/types.js";
|
|
5
|
+
import { loadAllPlugins, type LoadPluginOptions } from "../../plugins/loader.js";
|
|
6
|
+
import type { BundleConfig } from "../../schema/bundle.js";
|
|
7
|
+
import { loadAllSkills } from "../../skills/loader.js";
|
|
8
|
+
import { loadBundleConfig } from "../config/load-bundle-config.js";
|
|
9
|
+
export type KeyValueArgInput = string | string[] | boolean | undefined;
|
|
10
|
+
export type SkillInfo = {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
};
|
|
14
|
+
export type ResolvedServeInputs = {
|
|
15
|
+
configPath: string;
|
|
16
|
+
config: BundleConfig;
|
|
17
|
+
systemPrompt: string;
|
|
18
|
+
commands: Command[];
|
|
19
|
+
skills: SkillInfo[];
|
|
20
|
+
};
|
|
21
|
+
export declare function parseKeyValueEntries(raw: KeyValueArgInput, optionName: string): Record<string, string>;
|
|
22
|
+
export declare function resolveInitVariables(variableNames: readonly string[], cliOverrides: Record<string, string>, env: NodeJS.ProcessEnv): Record<string, string>;
|
|
23
|
+
export declare function resolveMcpTokens(servers: readonly McpServerConfig[], cliOverrides: Record<string, string>, env: NodeJS.ProcessEnv): Record<string, string>;
|
|
24
|
+
export declare function resolveServeSandboxConfig(sandbox: BundleConfig["sandbox"]): BundleConfig["sandbox"];
|
|
25
|
+
export declare function resolveServeInputs(configPath: string, loadConfigImpl?: typeof loadBundleConfig, loadSkillsImpl?: typeof loadAllSkills, generateSystemPromptImpl?: typeof generateSystemPromptTemplate, loadPluginsImpl?: typeof loadAllPlugins, pluginOptions?: LoadPluginOptions, loadCommandsImpl?: typeof loadAllCommands): Promise<ResolvedServeInputs>;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { dirname, resolve } from "node:path";
|
|
2
|
+
import { generateSystemPromptTemplate } from "../../agent-loop/system-prompt/generate.js";
|
|
3
|
+
import { loadAllCommands } from "../../commands/loader.js";
|
|
4
|
+
import { loadAllPlugins } from "../../plugins/loader.js";
|
|
5
|
+
import { mergePluginComponents } from "../../plugins/merge.js";
|
|
6
|
+
import { loadAllSkills } from "../../skills/loader.js";
|
|
7
|
+
import { toSkillSummaries } from "../../skills/summaries.js";
|
|
8
|
+
import { loadBundleConfig } from "../config/load-bundle-config.js";
|
|
9
|
+
const VARIABLE_ENV_PREFIX = "AGENT_BUNDLE_VAR_";
|
|
10
|
+
const MCP_TOKEN_ENV_PREFIX = "AGENT_BUNDLE_MCP_TOKEN_";
|
|
11
|
+
const MCP_TOKEN_ENV_FALLBACK_PREFIX = "MCP_TOKEN_";
|
|
12
|
+
function toEnvSuffix(name) {
|
|
13
|
+
return name.replace(/[^a-zA-Z0-9]/g, "_").toUpperCase();
|
|
14
|
+
}
|
|
15
|
+
function normalizeArgEntries(raw, optionName) {
|
|
16
|
+
if (raw === undefined || raw === false) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
if (raw === true) {
|
|
20
|
+
throw new Error(`${optionName} requires a value in key=value format.`);
|
|
21
|
+
}
|
|
22
|
+
const values = Array.isArray(raw) ? raw : [raw];
|
|
23
|
+
return values
|
|
24
|
+
.flatMap((value) => value.split(","))
|
|
25
|
+
.map((value) => value.trim())
|
|
26
|
+
.filter((value) => value.length > 0);
|
|
27
|
+
}
|
|
28
|
+
export function parseKeyValueEntries(raw, optionName) {
|
|
29
|
+
const entries = normalizeArgEntries(raw, optionName);
|
|
30
|
+
return entries.reduce((acc, entry) => {
|
|
31
|
+
const separatorIndex = entry.indexOf("=");
|
|
32
|
+
const key = separatorIndex >= 0 ? entry.slice(0, separatorIndex).trim() : "";
|
|
33
|
+
const value = separatorIndex >= 0 ? entry.slice(separatorIndex + 1) : "";
|
|
34
|
+
if (separatorIndex <= 0 || key.length === 0) {
|
|
35
|
+
throw new Error(`Invalid ${optionName} entry "${entry}". Expected key=value with a non-empty key.`);
|
|
36
|
+
}
|
|
37
|
+
acc[key] = value;
|
|
38
|
+
return acc;
|
|
39
|
+
}, {});
|
|
40
|
+
}
|
|
41
|
+
function readRequiredVariable(name, cliOverrides, env) {
|
|
42
|
+
const override = cliOverrides[name];
|
|
43
|
+
if (override !== undefined) {
|
|
44
|
+
return override;
|
|
45
|
+
}
|
|
46
|
+
const direct = env[name];
|
|
47
|
+
if (typeof direct === "string") {
|
|
48
|
+
return direct;
|
|
49
|
+
}
|
|
50
|
+
const prefixed = env[`${VARIABLE_ENV_PREFIX}${toEnvSuffix(name)}`];
|
|
51
|
+
if (typeof prefixed === "string") {
|
|
52
|
+
return prefixed;
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
export function resolveInitVariables(variableNames, cliOverrides, env) {
|
|
57
|
+
const knownVariables = new Set(variableNames);
|
|
58
|
+
const unknownCliVariables = Object.keys(cliOverrides).filter((name) => !knownVariables.has(name));
|
|
59
|
+
if (unknownCliVariables.length > 0) {
|
|
60
|
+
const expected = variableNames.length > 0 ? variableNames.join(", ") : "<none>";
|
|
61
|
+
throw new Error(`Unknown --var entries: ${unknownCliVariables.join(", ")}. Expected variables: ${expected}.`);
|
|
62
|
+
}
|
|
63
|
+
const missing = [];
|
|
64
|
+
const variables = variableNames.reduce((acc, name) => {
|
|
65
|
+
const value = readRequiredVariable(name, cliOverrides, env);
|
|
66
|
+
if (value === undefined) {
|
|
67
|
+
missing.push(name);
|
|
68
|
+
return acc;
|
|
69
|
+
}
|
|
70
|
+
acc[name] = value;
|
|
71
|
+
return acc;
|
|
72
|
+
}, {});
|
|
73
|
+
if (missing.length > 0) {
|
|
74
|
+
throw new Error(`Missing required init variables: ${missing.join(", ")}. ` +
|
|
75
|
+
"Provide them with --var <name>=<value> or env vars <name> / AGENT_BUNDLE_VAR_<NAME>.");
|
|
76
|
+
}
|
|
77
|
+
return variables;
|
|
78
|
+
}
|
|
79
|
+
export function resolveMcpTokens(servers, cliOverrides, env) {
|
|
80
|
+
const knownServers = new Set(servers.map((server) => server.name));
|
|
81
|
+
const unknownServers = Object.keys(cliOverrides).filter((name) => !knownServers.has(name));
|
|
82
|
+
if (unknownServers.length > 0) {
|
|
83
|
+
const expected = servers.length > 0 ? servers.map((server) => server.name).join(", ") : "<none>";
|
|
84
|
+
throw new Error(`Unknown --mcp-token entries: ${unknownServers.join(", ")}. Expected MCP servers: ${expected}.`);
|
|
85
|
+
}
|
|
86
|
+
return servers.reduce((tokens, server) => {
|
|
87
|
+
if (cliOverrides[server.name] !== undefined) {
|
|
88
|
+
tokens[server.name] = cliOverrides[server.name];
|
|
89
|
+
return tokens;
|
|
90
|
+
}
|
|
91
|
+
const suffix = toEnvSuffix(server.name);
|
|
92
|
+
const prefixed = env[`${MCP_TOKEN_ENV_PREFIX}${suffix}`];
|
|
93
|
+
const fallback = env[`${MCP_TOKEN_ENV_FALLBACK_PREFIX}${suffix}`];
|
|
94
|
+
const value = prefixed ?? fallback;
|
|
95
|
+
if (typeof value === "string") {
|
|
96
|
+
tokens[server.name] = value;
|
|
97
|
+
}
|
|
98
|
+
return tokens;
|
|
99
|
+
}, {});
|
|
100
|
+
}
|
|
101
|
+
export function resolveServeSandboxConfig(sandbox) {
|
|
102
|
+
if (!sandbox.serve?.provider) {
|
|
103
|
+
return sandbox;
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
...sandbox,
|
|
107
|
+
provider: sandbox.serve.provider,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export async function resolveServeInputs(configPath, loadConfigImpl = loadBundleConfig, loadSkillsImpl = loadAllSkills, generateSystemPromptImpl = generateSystemPromptTemplate, loadPluginsImpl = loadAllPlugins, pluginOptions, loadCommandsImpl = loadAllCommands) {
|
|
111
|
+
const absoluteConfigPath = resolve(configPath);
|
|
112
|
+
const config = await loadConfigImpl(absoluteConfigPath);
|
|
113
|
+
const bundleDir = dirname(absoluteConfigPath);
|
|
114
|
+
const baseSkills = await loadSkillsImpl(config.skills, bundleDir);
|
|
115
|
+
const baseCommands = config.commands
|
|
116
|
+
? await loadCommandsImpl(config.commands, bundleDir)
|
|
117
|
+
: [];
|
|
118
|
+
const pluginResults = config.plugins
|
|
119
|
+
? await loadPluginsImpl(config.plugins, pluginOptions)
|
|
120
|
+
: [];
|
|
121
|
+
const existingMcpServers = config.mcp?.servers ?? [];
|
|
122
|
+
const merged = mergePluginComponents(baseSkills, baseCommands, existingMcpServers, pluginResults);
|
|
123
|
+
const systemPrompt = generateSystemPromptImpl({
|
|
124
|
+
basePrompt: config.prompt.system,
|
|
125
|
+
skills: toSkillSummaries(merged.skills),
|
|
126
|
+
});
|
|
127
|
+
const mergedConfig = merged.mcpServers.length > 0
|
|
128
|
+
? { ...config, mcp: { servers: merged.mcpServers } }
|
|
129
|
+
: config;
|
|
130
|
+
const skills = merged.skills.map((s) => ({
|
|
131
|
+
name: s.name,
|
|
132
|
+
description: s.description,
|
|
133
|
+
}));
|
|
134
|
+
return {
|
|
135
|
+
configPath: absoluteConfigPath,
|
|
136
|
+
config: mergedConfig,
|
|
137
|
+
systemPrompt,
|
|
138
|
+
commands: merged.commands,
|
|
139
|
+
skills,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/cli/serve/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,4CAA4C,CAAC;AAE1F,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAA0B,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAChD,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AACvD,MAAM,6BAA6B,GAAG,YAAY,CAAC;AAiBnD,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAqB,EAAE,UAAkB;IACpE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,wCAAwC,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,MAAM;SACV,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAqB,EAAE,UAAkB;IAC5E,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,MAAM,CAAyB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC3D,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,KAAK,GAAG,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzE,IAAI,cAAc,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,WAAW,UAAU,WAAW,KAAK,6CAA6C,CACnF,CAAC;QACJ,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAAY,EACZ,YAAoC,EACpC,GAAsB;IAEtB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,mBAAmB,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,aAAgC,EAChC,YAAoC,EACpC,GAAsB;IAEtB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAClG,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAChF,MAAM,IAAI,KAAK,CACb,0BAA0B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,QAAQ,GAAG,CAC7F,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3E,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,oCAAoC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC1D,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAmC,EACnC,YAAoC,EACpC,GAAsB;IAEtB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjG,MAAM,IAAI,KAAK,CACb,gCAAgC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,QAAQ,GAAG,CAChG,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QAC/D,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,oBAAoB,GAAG,MAAM,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,6BAA6B,GAAG,MAAM,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,QAAQ,IAAI,QAAQ,CAAC;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC9B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAgC;IACxE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO;QACL,GAAG,OAAO;QACV,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,iBAA0C,gBAAgB,EAC1D,iBAAuC,aAAa,EACpD,2BAAgE,4BAA4B,EAC5F,kBAAyC,cAAc,EACvD,aAAiC,EACjC,mBAA2C,eAAe;IAE1D,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ;QAClC,CAAC,CAAC,MAAM,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC;QACpD,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO;QAClC,CAAC,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;QACtD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;IAElG,MAAM,YAAY,GAAG,wBAAwB,CAAC;QAC5C,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QAChC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;KACxC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAC/C,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE;QACpD,CAAC,CAAC,MAAM,CAAC;IAEX,MAAM,MAAM,GAAgB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;KAC3B,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,UAAU,EAAE,kBAAkB;QAC9B,MAAM,EAAE,YAAY;QACpB,YAAY;QACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createServer } from "../../service/create-server.js";
|
|
2
|
+
import { type RunServeOptions, type RunServeResult, type ServeDependencies as SharedServeDependencies } from "./init.js";
|
|
3
|
+
export { DEFAULT_SERVE_PORT } from "./init.js";
|
|
4
|
+
export type ServeDependencies = SharedServeDependencies & {
|
|
5
|
+
createServerImpl?: typeof createServer;
|
|
6
|
+
};
|
|
7
|
+
export declare function runServeCommand(options: RunServeOptions, dependencies?: ServeDependencies): Promise<RunServeResult>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createServer } from "../../service/create-server.js";
|
|
2
|
+
import { startHttpServer } from "./http.js";
|
|
3
|
+
import { initializeServeContext, validatePort, wireSignalShutdown, } from "./init.js";
|
|
4
|
+
import { resolveServicePort } from "./worktree-port.js";
|
|
5
|
+
export { DEFAULT_SERVE_PORT } from "./init.js";
|
|
6
|
+
async function shutdownServeResources(resources) {
|
|
7
|
+
const errors = [];
|
|
8
|
+
try {
|
|
9
|
+
await resources.httpServer?.close();
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
errors.push(error);
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
await resources.agent.shutdown();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
errors.push(error);
|
|
19
|
+
}
|
|
20
|
+
if (errors.length > 0) {
|
|
21
|
+
throw errors[0];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function runServeCommand(options, dependencies = {}) {
|
|
25
|
+
const createServerImpl = dependencies.createServerImpl ?? createServer;
|
|
26
|
+
const startHttpServerImpl = dependencies.startHttpServerImpl ?? startHttpServer;
|
|
27
|
+
const signalProcess = dependencies.signalProcess ?? process;
|
|
28
|
+
const exit = dependencies.exit ?? ((code) => process.exit(code));
|
|
29
|
+
const stdout = options.stdout ?? process.stdout;
|
|
30
|
+
const stderr = options.stderr ?? process.stderr;
|
|
31
|
+
const port = options.port ?? await resolveServicePort(0);
|
|
32
|
+
validatePort(port);
|
|
33
|
+
const context = await initializeServeContext(options, dependencies);
|
|
34
|
+
stdout.write(`Starting bundle "${context.config.name}" from ${context.configPath}\n`);
|
|
35
|
+
let httpServer = null;
|
|
36
|
+
let shutdownPromise = null;
|
|
37
|
+
const shutdown = async () => {
|
|
38
|
+
if (!shutdownPromise) {
|
|
39
|
+
shutdownPromise = shutdownServeResources({ agent: context.agent, httpServer });
|
|
40
|
+
}
|
|
41
|
+
return await shutdownPromise;
|
|
42
|
+
};
|
|
43
|
+
try {
|
|
44
|
+
const app = createServerImpl(context.agent, {
|
|
45
|
+
commands: context.commands,
|
|
46
|
+
});
|
|
47
|
+
httpServer = await startHttpServerImpl({
|
|
48
|
+
appFetch: app.fetch.bind(app),
|
|
49
|
+
port,
|
|
50
|
+
stderr,
|
|
51
|
+
});
|
|
52
|
+
stdout.write(`Serve ready at http://localhost:${httpServer.port}\n`);
|
|
53
|
+
await wireSignalShutdown(signalProcess, shutdown, exit, stderr);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
await shutdown();
|
|
57
|
+
}
|
|
58
|
+
if (!httpServer) {
|
|
59
|
+
throw new Error("Serve HTTP server did not start.");
|
|
60
|
+
}
|
|
61
|
+
return { port: httpServer.port };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/serve/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Agent, AgentConfig, InitOptions } from "../../agent/types.js";
|
|
2
|
+
import type { BundleConfig } from "../../schema/bundle.js";
|
|
3
|
+
import { vi } from "vitest";
|
|
4
|
+
type ServeHarnessOptions = {
|
|
5
|
+
config?: BundleConfig;
|
|
6
|
+
env?: NodeJS.ProcessEnv;
|
|
7
|
+
callPostMountHook?: boolean;
|
|
8
|
+
};
|
|
9
|
+
type SignalListener = (...args: unknown[]) => void;
|
|
10
|
+
export type ServeHarness = {
|
|
11
|
+
agent: Agent;
|
|
12
|
+
env: NodeJS.ProcessEnv;
|
|
13
|
+
captured: {
|
|
14
|
+
agentConfig: AgentConfig<string> | null;
|
|
15
|
+
initOptions: InitOptions<string> | null;
|
|
16
|
+
};
|
|
17
|
+
loadConfigMock: ReturnType<typeof vi.fn>;
|
|
18
|
+
loadSkillsMock: ReturnType<typeof vi.fn>;
|
|
19
|
+
generateSystemPromptMock: ReturnType<typeof vi.fn>;
|
|
20
|
+
defineAgentMock: ReturnType<typeof vi.fn>;
|
|
21
|
+
createServerMock: ReturnType<typeof vi.fn>;
|
|
22
|
+
createWebUIServerMock: ReturnType<typeof vi.fn>;
|
|
23
|
+
startHttpServerMock: ReturnType<typeof vi.fn>;
|
|
24
|
+
closeServerMock: ReturnType<typeof vi.fn>;
|
|
25
|
+
webUIShutdownMock: ReturnType<typeof vi.fn>;
|
|
26
|
+
agentShutdownMock: ReturnType<typeof vi.fn>;
|
|
27
|
+
};
|
|
28
|
+
export declare const DEFAULT_CONFIG_PATH = "/tmp/agent-bundle-workspace/agent-bundle.yaml";
|
|
29
|
+
export declare function createSignalMock(): {
|
|
30
|
+
signalProcess: Pick<NodeJS.Process, "on" | "off">;
|
|
31
|
+
fire: (signal: string) => void;
|
|
32
|
+
listeners: Map<string, Set<SignalListener>>;
|
|
33
|
+
};
|
|
34
|
+
export declare function createBaseConfig(): BundleConfig;
|
|
35
|
+
export declare function createServeHarness(options?: ServeHarnessOptions): ServeHarness;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { vi } from "vitest";
|
|
2
|
+
export const DEFAULT_CONFIG_PATH = "/tmp/agent-bundle-workspace/agent-bundle.yaml";
|
|
3
|
+
export function createSignalMock() {
|
|
4
|
+
const listeners = new Map();
|
|
5
|
+
const signalProcess = {
|
|
6
|
+
on: (signal, listener) => {
|
|
7
|
+
if (!listeners.has(signal))
|
|
8
|
+
listeners.set(signal, new Set());
|
|
9
|
+
listeners.get(signal).add(listener);
|
|
10
|
+
return signalProcess;
|
|
11
|
+
},
|
|
12
|
+
off: (signal, listener) => {
|
|
13
|
+
const set = listeners.get(signal);
|
|
14
|
+
if (set) {
|
|
15
|
+
set.delete(listener);
|
|
16
|
+
if (set.size === 0)
|
|
17
|
+
listeners.delete(signal);
|
|
18
|
+
}
|
|
19
|
+
return signalProcess;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
const fire = (signal) => {
|
|
23
|
+
for (const listener of [...(listeners.get(signal) ?? [])]) {
|
|
24
|
+
listener(signal);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return { signalProcess, fire, listeners };
|
|
28
|
+
}
|
|
29
|
+
export function createBaseConfig() {
|
|
30
|
+
return {
|
|
31
|
+
name: "invoice-processor",
|
|
32
|
+
model: {
|
|
33
|
+
provider: "openai",
|
|
34
|
+
model: "gpt-5-mini",
|
|
35
|
+
},
|
|
36
|
+
prompt: {
|
|
37
|
+
system: "You are concise.",
|
|
38
|
+
variables: [],
|
|
39
|
+
},
|
|
40
|
+
sandbox: {
|
|
41
|
+
provider: "kubernetes",
|
|
42
|
+
timeout: 900,
|
|
43
|
+
resources: {
|
|
44
|
+
cpu: 2,
|
|
45
|
+
memory: "512MB",
|
|
46
|
+
},
|
|
47
|
+
kubernetes: {
|
|
48
|
+
image: "agent-bundle/execd:latest",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
skills: [
|
|
52
|
+
{
|
|
53
|
+
path: "./skills/format-code",
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function createSandboxIO() {
|
|
59
|
+
return {
|
|
60
|
+
exec: async () => ({
|
|
61
|
+
stdout: "",
|
|
62
|
+
stderr: "",
|
|
63
|
+
exitCode: 0,
|
|
64
|
+
}),
|
|
65
|
+
spawn: async () => ({
|
|
66
|
+
pid: 1,
|
|
67
|
+
stdin: new WritableStream({
|
|
68
|
+
write: async () => undefined,
|
|
69
|
+
}),
|
|
70
|
+
stdout: new ReadableStream({
|
|
71
|
+
start(controller) {
|
|
72
|
+
controller.close();
|
|
73
|
+
},
|
|
74
|
+
}),
|
|
75
|
+
stderr: new ReadableStream({
|
|
76
|
+
start(controller) {
|
|
77
|
+
controller.close();
|
|
78
|
+
},
|
|
79
|
+
}),
|
|
80
|
+
exited: Promise.resolve(0),
|
|
81
|
+
kill: async () => undefined,
|
|
82
|
+
}),
|
|
83
|
+
file: {
|
|
84
|
+
read: async () => "",
|
|
85
|
+
write: async () => undefined,
|
|
86
|
+
list: async () => [],
|
|
87
|
+
delete: async () => undefined,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function createSkills() {
|
|
92
|
+
return [
|
|
93
|
+
{
|
|
94
|
+
name: "FormatCode",
|
|
95
|
+
description: "Format source files inside sandbox",
|
|
96
|
+
content: "---\nname: FormatCode\ndescription: Format source files inside sandbox\n---\n",
|
|
97
|
+
sourcePath: "/tmp/agent-bundle-workspace/skills/format-code/SKILL.md",
|
|
98
|
+
},
|
|
99
|
+
];
|
|
100
|
+
}
|
|
101
|
+
function createApiServerMock() {
|
|
102
|
+
return vi.fn(() => {
|
|
103
|
+
return {
|
|
104
|
+
fetch: async (request) => {
|
|
105
|
+
void request;
|
|
106
|
+
return new Response("ok");
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function createWebUIServerMockFactory(webUIShutdownMock) {
|
|
112
|
+
return vi.fn((input) => {
|
|
113
|
+
void input;
|
|
114
|
+
return {
|
|
115
|
+
app: {
|
|
116
|
+
fetch: async (request) => {
|
|
117
|
+
void request;
|
|
118
|
+
return new Response("ok");
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
eventBus: {
|
|
122
|
+
subscribe: () => () => undefined,
|
|
123
|
+
emit: () => undefined,
|
|
124
|
+
listenerCount: () => 0,
|
|
125
|
+
dispose: () => undefined,
|
|
126
|
+
},
|
|
127
|
+
handleUpgrade: () => undefined,
|
|
128
|
+
shutdown: webUIShutdownMock,
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function createHttpServerStarterMock(closeServerMock) {
|
|
133
|
+
return vi.fn(async (input) => {
|
|
134
|
+
void input;
|
|
135
|
+
return {
|
|
136
|
+
port: 4310,
|
|
137
|
+
close: closeServerMock,
|
|
138
|
+
};
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
export function createServeHarness(options = {}) {
|
|
142
|
+
const config = options.config ?? createBaseConfig();
|
|
143
|
+
const env = options.env ?? {};
|
|
144
|
+
const callPostMountHook = options.callPostMountHook ?? true;
|
|
145
|
+
const sandboxIO = createSandboxIO();
|
|
146
|
+
const agentShutdownMock = vi.fn(async () => undefined);
|
|
147
|
+
const agent = {
|
|
148
|
+
name: config.name,
|
|
149
|
+
status: "ready",
|
|
150
|
+
respond: async () => ({
|
|
151
|
+
id: "resp-1",
|
|
152
|
+
output: "ok",
|
|
153
|
+
usage: {
|
|
154
|
+
inputTokens: 1,
|
|
155
|
+
outputTokens: 1,
|
|
156
|
+
totalTokens: 2,
|
|
157
|
+
},
|
|
158
|
+
}),
|
|
159
|
+
respondStream: async function* () {
|
|
160
|
+
return;
|
|
161
|
+
},
|
|
162
|
+
shutdown: agentShutdownMock,
|
|
163
|
+
};
|
|
164
|
+
const captured = {
|
|
165
|
+
agentConfig: null,
|
|
166
|
+
initOptions: null,
|
|
167
|
+
};
|
|
168
|
+
const loadConfigMock = vi.fn(async () => config);
|
|
169
|
+
const loadSkillsMock = vi.fn(async () => createSkills());
|
|
170
|
+
const generateSystemPromptMock = vi.fn(() => "generated-system-prompt");
|
|
171
|
+
const defineAgentMock = vi.fn((agentConfig) => {
|
|
172
|
+
captured.agentConfig = agentConfig;
|
|
173
|
+
return {
|
|
174
|
+
name: config.name,
|
|
175
|
+
init: async (initOptions) => {
|
|
176
|
+
captured.initOptions = initOptions;
|
|
177
|
+
if (callPostMountHook) {
|
|
178
|
+
await initOptions.hooks?.postMount?.(sandboxIO);
|
|
179
|
+
}
|
|
180
|
+
return agent;
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
});
|
|
184
|
+
const createServerMock = createApiServerMock();
|
|
185
|
+
const webUIShutdownMock = vi.fn();
|
|
186
|
+
const createWebUIServerMock = createWebUIServerMockFactory(webUIShutdownMock);
|
|
187
|
+
const closeServerMock = vi.fn(async () => undefined);
|
|
188
|
+
const startHttpServerMock = createHttpServerStarterMock(closeServerMock);
|
|
189
|
+
return {
|
|
190
|
+
agent,
|
|
191
|
+
env,
|
|
192
|
+
captured,
|
|
193
|
+
loadConfigMock,
|
|
194
|
+
loadSkillsMock,
|
|
195
|
+
generateSystemPromptMock,
|
|
196
|
+
defineAgentMock,
|
|
197
|
+
createServerMock,
|
|
198
|
+
createWebUIServerMock,
|
|
199
|
+
startHttpServerMock,
|
|
200
|
+
closeServerMock,
|
|
201
|
+
webUIShutdownMock,
|
|
202
|
+
agentShutdownMock,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=serve.test-helpers.js.map
|