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 @@
|
|
|
1
|
+
{"version":3,"file":"serve.test-helpers.js","sourceRoot":"","sources":["../../../src/cli/serve/serve.test-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type WorktreePortResult = {
|
|
2
|
+
port: number;
|
|
3
|
+
worktreeName: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a deterministic port for the current worktree.
|
|
7
|
+
* Returns null when not running inside a worktree.
|
|
8
|
+
*
|
|
9
|
+
* Port formula: basePort + (fnv1a(worktreeName) % 99 + 1) * 10
|
|
10
|
+
* This yields offsets 10..990 in steps of 10, giving each worktree
|
|
11
|
+
* a block of 10 ports (e.g. 3010-3019, 3140-3149).
|
|
12
|
+
*
|
|
13
|
+
* @deprecated Use {@link resolveServicePort} for new code.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveWorktreePort(basePort: number, cwd?: string): WorktreePortResult | null;
|
|
16
|
+
/**
|
|
17
|
+
* Check whether a TCP port is available on localhost.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isPortAvailable(port: number): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Compute a service port: `prefix × 1000 + suffix`.
|
|
22
|
+
*
|
|
23
|
+
* - **suffix** (last three digits): stable service identity
|
|
24
|
+
* (0 = serve/dev, 1 = code-formatter/e2b, 2 = code-formatter/k8s, 3 = financial-plugin, 5 = personalized-recommend, 6 = observability-demo, …).
|
|
25
|
+
* - **prefix**: `defaultPrefix` (3) for the main repo,
|
|
26
|
+
* hash-based 10–63 for worktrees.
|
|
27
|
+
*
|
|
28
|
+
* Priority:
|
|
29
|
+
* 1. `PORT` env var → returned directly.
|
|
30
|
+
* 2. Auto-computed `prefix × 1000 + suffix`, with collision
|
|
31
|
+
* fallback that rotates the prefix (never the suffix).
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveServicePort(suffix: number, options?: {
|
|
34
|
+
defaultPrefix?: number;
|
|
35
|
+
cwd?: string;
|
|
36
|
+
}): Promise<number>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { createServer } from "node:net";
|
|
3
|
+
import { basename, resolve } from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* FNV-1a 32-bit hash for deterministic port offset computation.
|
|
6
|
+
*/
|
|
7
|
+
function fnv1a32(input) {
|
|
8
|
+
let hash = 0x811c9dc5;
|
|
9
|
+
for (let i = 0; i < input.length; i++) {
|
|
10
|
+
hash ^= input.charCodeAt(i);
|
|
11
|
+
hash = Math.imul(hash, 0x01000193);
|
|
12
|
+
}
|
|
13
|
+
return hash >>> 0;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect if cwd is inside a Git worktree (not the main repo).
|
|
17
|
+
* Walks up parent directories to find the nearest `.git` entry.
|
|
18
|
+
* In a worktree the `.git` path is a file containing `gitdir: <path>`,
|
|
19
|
+
* whereas in the main repo `.git` is a directory.
|
|
20
|
+
* Returns the worktree root directory basename, or null if not a worktree.
|
|
21
|
+
*/
|
|
22
|
+
function detectWorktreeName(cwd) {
|
|
23
|
+
let dir = resolve(cwd);
|
|
24
|
+
// eslint-disable-next-line no-constant-condition
|
|
25
|
+
while (true) {
|
|
26
|
+
const dotGitPath = resolve(dir, ".git");
|
|
27
|
+
try {
|
|
28
|
+
const stat = statSync(dotGitPath);
|
|
29
|
+
if (stat.isDirectory()) {
|
|
30
|
+
return null; // main repo root
|
|
31
|
+
}
|
|
32
|
+
// .git is a file — check if it's a worktree pointer
|
|
33
|
+
const content = readFileSync(dotGitPath, "utf-8").trim();
|
|
34
|
+
if (content.startsWith("gitdir:")) {
|
|
35
|
+
return basename(dir);
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// no .git here, try parent
|
|
41
|
+
}
|
|
42
|
+
const parent = resolve(dir, "..");
|
|
43
|
+
if (parent === dir) {
|
|
44
|
+
return null; // reached filesystem root
|
|
45
|
+
}
|
|
46
|
+
dir = parent;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve a deterministic port for the current worktree.
|
|
51
|
+
* Returns null when not running inside a worktree.
|
|
52
|
+
*
|
|
53
|
+
* Port formula: basePort + (fnv1a(worktreeName) % 99 + 1) * 10
|
|
54
|
+
* This yields offsets 10..990 in steps of 10, giving each worktree
|
|
55
|
+
* a block of 10 ports (e.g. 3010-3019, 3140-3149).
|
|
56
|
+
*
|
|
57
|
+
* @deprecated Use {@link resolveServicePort} for new code.
|
|
58
|
+
*/
|
|
59
|
+
export function resolveWorktreePort(basePort, cwd = process.cwd()) {
|
|
60
|
+
const name = detectWorktreeName(cwd);
|
|
61
|
+
if (!name) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const offset = (fnv1a32(name) % 99 + 1) * 10;
|
|
65
|
+
return { port: basePort + offset, worktreeName: name };
|
|
66
|
+
}
|
|
67
|
+
// ── Service port allocation (prefix × 1000 + suffix) ────────────
|
|
68
|
+
const MIN_WORKTREE_PREFIX = 10;
|
|
69
|
+
const PREFIX_COUNT = 54; // prefixes 10–63
|
|
70
|
+
/**
|
|
71
|
+
* Check whether a TCP port is available on localhost.
|
|
72
|
+
*/
|
|
73
|
+
export async function isPortAvailable(port) {
|
|
74
|
+
return new Promise((resolve) => {
|
|
75
|
+
const server = createServer();
|
|
76
|
+
server.once("error", () => resolve(false));
|
|
77
|
+
server.once("listening", () => {
|
|
78
|
+
server.close(() => resolve(true));
|
|
79
|
+
});
|
|
80
|
+
server.listen(port, "127.0.0.1");
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Compute a service port: `prefix × 1000 + suffix`.
|
|
85
|
+
*
|
|
86
|
+
* - **suffix** (last three digits): stable service identity
|
|
87
|
+
* (0 = serve/dev, 1 = code-formatter/e2b, 2 = code-formatter/k8s, 3 = financial-plugin, 5 = personalized-recommend, 6 = observability-demo, …).
|
|
88
|
+
* - **prefix**: `defaultPrefix` (3) for the main repo,
|
|
89
|
+
* hash-based 10–63 for worktrees.
|
|
90
|
+
*
|
|
91
|
+
* Priority:
|
|
92
|
+
* 1. `PORT` env var → returned directly.
|
|
93
|
+
* 2. Auto-computed `prefix × 1000 + suffix`, with collision
|
|
94
|
+
* fallback that rotates the prefix (never the suffix).
|
|
95
|
+
*/
|
|
96
|
+
export async function resolveServicePort(suffix, options) {
|
|
97
|
+
const envPort = process.env.PORT;
|
|
98
|
+
if (envPort !== undefined && envPort !== "") {
|
|
99
|
+
return Number(envPort);
|
|
100
|
+
}
|
|
101
|
+
const defaultPrefix = options?.defaultPrefix ?? 3;
|
|
102
|
+
const cwd = options?.cwd ?? process.cwd();
|
|
103
|
+
const worktreeName = detectWorktreeName(cwd);
|
|
104
|
+
if (!worktreeName) {
|
|
105
|
+
const preferred = defaultPrefix * 1000 + suffix;
|
|
106
|
+
if (await isPortAvailable(preferred))
|
|
107
|
+
return preferred;
|
|
108
|
+
for (let i = 0; i < PREFIX_COUNT; i++) {
|
|
109
|
+
const candidate = (MIN_WORKTREE_PREFIX + i) * 1000 + suffix;
|
|
110
|
+
if (await isPortAvailable(candidate))
|
|
111
|
+
return candidate;
|
|
112
|
+
}
|
|
113
|
+
throw new Error(`No available port found for suffix ${suffix}`);
|
|
114
|
+
}
|
|
115
|
+
const base = MIN_WORKTREE_PREFIX + (fnv1a32(worktreeName) % PREFIX_COUNT);
|
|
116
|
+
for (let i = 0; i < PREFIX_COUNT; i++) {
|
|
117
|
+
const p = MIN_WORKTREE_PREFIX + ((base - MIN_WORKTREE_PREFIX + i) % PREFIX_COUNT);
|
|
118
|
+
const candidate = p * 1000 + suffix;
|
|
119
|
+
if (await isPortAvailable(candidate))
|
|
120
|
+
return candidate;
|
|
121
|
+
}
|
|
122
|
+
throw new Error(`No available port found for suffix ${suffix}`);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=worktree-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-port.js","sourceRoot":"","sources":["../../../src/cli/serve/worktree-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type IncomingMessage } from "node:http";
|
|
2
|
+
export type StartHttpServerInput = {
|
|
3
|
+
appFetch: (request: Request) => Response | Promise<Response>;
|
|
4
|
+
handleUpgrade: (request: IncomingMessage, socket: unknown, head: Buffer) => void;
|
|
5
|
+
port: number;
|
|
6
|
+
stderr: NodeJS.WritableStream;
|
|
7
|
+
};
|
|
8
|
+
export type StartedHttpServer = {
|
|
9
|
+
port: number;
|
|
10
|
+
close: () => Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
export declare function startHttpServer(input: StartHttpServerInput): Promise<StartedHttpServer>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { createServer as createHttpServer, } from "node:http";
|
|
2
|
+
import { toErrorMessage } from "./error.js";
|
|
3
|
+
function hasRequestBody(method) {
|
|
4
|
+
return method !== undefined && method !== "GET" && method !== "HEAD";
|
|
5
|
+
}
|
|
6
|
+
function toFetchRequest(request) {
|
|
7
|
+
const origin = typeof request.headers.host === "string"
|
|
8
|
+
? `http://${request.headers.host}`
|
|
9
|
+
: "http://127.0.0.1";
|
|
10
|
+
const url = new URL(request.url ?? "/", origin);
|
|
11
|
+
const headers = new Headers();
|
|
12
|
+
Object.entries(request.headers).forEach(([name, value]) => {
|
|
13
|
+
if (typeof value === "string") {
|
|
14
|
+
headers.set(name, value);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(value)) {
|
|
18
|
+
value.forEach((entry) => {
|
|
19
|
+
headers.append(name, entry);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
const init = {
|
|
24
|
+
method: request.method,
|
|
25
|
+
headers,
|
|
26
|
+
};
|
|
27
|
+
if (hasRequestBody(request.method)) {
|
|
28
|
+
init.body = request;
|
|
29
|
+
init.duplex = "half";
|
|
30
|
+
}
|
|
31
|
+
return new Request(url, init);
|
|
32
|
+
}
|
|
33
|
+
async function writeFetchResponse(response, output) {
|
|
34
|
+
response.headers.forEach((value, key) => {
|
|
35
|
+
output.setHeader(key, value);
|
|
36
|
+
});
|
|
37
|
+
output.statusCode = response.status;
|
|
38
|
+
if (!response.body) {
|
|
39
|
+
output.end();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const reader = response.body.getReader();
|
|
43
|
+
while (true) {
|
|
44
|
+
const { done, value } = await reader.read();
|
|
45
|
+
if (done) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
if (value) {
|
|
49
|
+
output.write(Buffer.from(value));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
output.end();
|
|
53
|
+
}
|
|
54
|
+
async function closeNodeServer(server) {
|
|
55
|
+
await new Promise((resolveClose, rejectClose) => {
|
|
56
|
+
server.close((error) => {
|
|
57
|
+
if (!error) {
|
|
58
|
+
resolveClose();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const nodeError = error;
|
|
62
|
+
if (nodeError.code === "ERR_SERVER_NOT_RUNNING") {
|
|
63
|
+
resolveClose();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
rejectClose(error);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
export async function startHttpServer(input) {
|
|
71
|
+
const server = createHttpServer((request, response) => {
|
|
72
|
+
const fetchRequest = toFetchRequest(request);
|
|
73
|
+
void Promise.resolve(input.appFetch(fetchRequest))
|
|
74
|
+
.then(async (fetchResponse) => {
|
|
75
|
+
await writeFetchResponse(fetchResponse, response);
|
|
76
|
+
})
|
|
77
|
+
.catch((error) => {
|
|
78
|
+
input.stderr.write(`[serve] request handling failed: ${toErrorMessage(error)}\n`);
|
|
79
|
+
if (!response.headersSent) {
|
|
80
|
+
response.statusCode = 500;
|
|
81
|
+
response.setHeader("content-type", "text/plain; charset=utf-8");
|
|
82
|
+
}
|
|
83
|
+
response.end("Internal Server Error");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
server.on("upgrade", input.handleUpgrade);
|
|
87
|
+
await new Promise((resolveListen, rejectListen) => {
|
|
88
|
+
const onError = (error) => {
|
|
89
|
+
server.off("listening", onListening);
|
|
90
|
+
rejectListen(error);
|
|
91
|
+
};
|
|
92
|
+
const onListening = () => {
|
|
93
|
+
server.off("error", onError);
|
|
94
|
+
resolveListen();
|
|
95
|
+
};
|
|
96
|
+
server.once("error", onError);
|
|
97
|
+
server.once("listening", onListening);
|
|
98
|
+
server.listen(input.port);
|
|
99
|
+
});
|
|
100
|
+
const address = server.address();
|
|
101
|
+
if (!address || typeof address === "string") {
|
|
102
|
+
await closeNodeServer(server);
|
|
103
|
+
throw new Error("Failed to resolve serve port from HTTP server address.");
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
port: address.port,
|
|
107
|
+
close: async () => {
|
|
108
|
+
await closeNodeServer(server);
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=serve-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-http.js","sourceRoot":"","sources":["../../src/cli/serve-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { generateSystemPromptTemplate } from "../agent-loop/system-prompt/generate.js";
|
|
2
|
+
import type { McpServerConfig } from "../agent/types.js";
|
|
3
|
+
import type { BundleConfig } from "../schema/bundle.js";
|
|
4
|
+
import { loadAllSkills } from "../skills/loader.js";
|
|
5
|
+
import { loadBundleConfig } from "./load-bundle-config.js";
|
|
6
|
+
export type KeyValueArgInput = string | string[] | boolean | undefined;
|
|
7
|
+
export type ResolvedServeInputs = {
|
|
8
|
+
configPath: string;
|
|
9
|
+
config: BundleConfig;
|
|
10
|
+
systemPrompt: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function parseKeyValueEntries(raw: KeyValueArgInput, optionName: string): Record<string, string>;
|
|
13
|
+
export declare function resolveInitVariables(variableNames: readonly string[], cliOverrides: Record<string, string>, env: NodeJS.ProcessEnv): Record<string, string>;
|
|
14
|
+
export declare function resolveMcpTokens(servers: readonly McpServerConfig[], cliOverrides: Record<string, string>, env: NodeJS.ProcessEnv): Record<string, string>;
|
|
15
|
+
export declare function resolveServeSandboxConfig(sandbox: BundleConfig["sandbox"]): BundleConfig["sandbox"];
|
|
16
|
+
export declare function resolveServeInputs(configPath: string, loadConfigImpl?: typeof loadBundleConfig, loadSkillsImpl?: typeof loadAllSkills, generateSystemPromptImpl?: typeof generateSystemPromptTemplate): Promise<ResolvedServeInputs>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { dirname, resolve } from "node:path";
|
|
2
|
+
import { generateSystemPromptTemplate } from "../agent-loop/system-prompt/generate.js";
|
|
3
|
+
import { loadAllSkills } from "../skills/loader.js";
|
|
4
|
+
import { toSkillSummaries } from "../skills/summaries.js";
|
|
5
|
+
import { loadBundleConfig } from "./load-bundle-config.js";
|
|
6
|
+
const VARIABLE_ENV_PREFIX = "AGENT_BUNDLE_VAR_";
|
|
7
|
+
const MCP_TOKEN_ENV_PREFIX = "AGENT_BUNDLE_MCP_TOKEN_";
|
|
8
|
+
const MCP_TOKEN_ENV_FALLBACK_PREFIX = "MCP_TOKEN_";
|
|
9
|
+
function toEnvSuffix(name) {
|
|
10
|
+
return name.replace(/[^a-zA-Z0-9]/g, "_").toUpperCase();
|
|
11
|
+
}
|
|
12
|
+
function normalizeArgEntries(raw, optionName) {
|
|
13
|
+
if (raw === undefined || raw === false) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
if (raw === true) {
|
|
17
|
+
throw new Error(`${optionName} requires a value in key=value format.`);
|
|
18
|
+
}
|
|
19
|
+
const values = Array.isArray(raw) ? raw : [raw];
|
|
20
|
+
return values
|
|
21
|
+
.flatMap((value) => value.split(","))
|
|
22
|
+
.map((value) => value.trim())
|
|
23
|
+
.filter((value) => value.length > 0);
|
|
24
|
+
}
|
|
25
|
+
export function parseKeyValueEntries(raw, optionName) {
|
|
26
|
+
const entries = normalizeArgEntries(raw, optionName);
|
|
27
|
+
return entries.reduce((acc, entry) => {
|
|
28
|
+
const separatorIndex = entry.indexOf("=");
|
|
29
|
+
const key = separatorIndex >= 0 ? entry.slice(0, separatorIndex).trim() : "";
|
|
30
|
+
const value = separatorIndex >= 0 ? entry.slice(separatorIndex + 1) : "";
|
|
31
|
+
if (separatorIndex <= 0 || key.length === 0) {
|
|
32
|
+
throw new Error(`Invalid ${optionName} entry "${entry}". Expected key=value with a non-empty key.`);
|
|
33
|
+
}
|
|
34
|
+
acc[key] = value;
|
|
35
|
+
return acc;
|
|
36
|
+
}, {});
|
|
37
|
+
}
|
|
38
|
+
function readRequiredVariable(name, cliOverrides, env) {
|
|
39
|
+
const override = cliOverrides[name];
|
|
40
|
+
if (override !== undefined) {
|
|
41
|
+
return override;
|
|
42
|
+
}
|
|
43
|
+
const direct = env[name];
|
|
44
|
+
if (typeof direct === "string") {
|
|
45
|
+
return direct;
|
|
46
|
+
}
|
|
47
|
+
const prefixed = env[`${VARIABLE_ENV_PREFIX}${toEnvSuffix(name)}`];
|
|
48
|
+
if (typeof prefixed === "string") {
|
|
49
|
+
return prefixed;
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
export function resolveInitVariables(variableNames, cliOverrides, env) {
|
|
54
|
+
const knownVariables = new Set(variableNames);
|
|
55
|
+
const unknownCliVariables = Object.keys(cliOverrides).filter((name) => !knownVariables.has(name));
|
|
56
|
+
if (unknownCliVariables.length > 0) {
|
|
57
|
+
const expected = variableNames.length > 0 ? variableNames.join(", ") : "<none>";
|
|
58
|
+
throw new Error(`Unknown --var entries: ${unknownCliVariables.join(", ")}. Expected variables: ${expected}.`);
|
|
59
|
+
}
|
|
60
|
+
const missing = [];
|
|
61
|
+
const variables = variableNames.reduce((acc, name) => {
|
|
62
|
+
const value = readRequiredVariable(name, cliOverrides, env);
|
|
63
|
+
if (value === undefined) {
|
|
64
|
+
missing.push(name);
|
|
65
|
+
return acc;
|
|
66
|
+
}
|
|
67
|
+
acc[name] = value;
|
|
68
|
+
return acc;
|
|
69
|
+
}, {});
|
|
70
|
+
if (missing.length > 0) {
|
|
71
|
+
throw new Error(`Missing required init variables: ${missing.join(", ")}. ` +
|
|
72
|
+
"Provide them with --var <name>=<value> or env vars <name> / AGENT_BUNDLE_VAR_<NAME>.");
|
|
73
|
+
}
|
|
74
|
+
return variables;
|
|
75
|
+
}
|
|
76
|
+
export function resolveMcpTokens(servers, cliOverrides, env) {
|
|
77
|
+
const knownServers = new Set(servers.map((server) => server.name));
|
|
78
|
+
const unknownServers = Object.keys(cliOverrides).filter((name) => !knownServers.has(name));
|
|
79
|
+
if (unknownServers.length > 0) {
|
|
80
|
+
const expected = servers.length > 0 ? servers.map((server) => server.name).join(", ") : "<none>";
|
|
81
|
+
throw new Error(`Unknown --mcp-token entries: ${unknownServers.join(", ")}. Expected MCP servers: ${expected}.`);
|
|
82
|
+
}
|
|
83
|
+
return servers.reduce((tokens, server) => {
|
|
84
|
+
if (cliOverrides[server.name] !== undefined) {
|
|
85
|
+
tokens[server.name] = cliOverrides[server.name];
|
|
86
|
+
return tokens;
|
|
87
|
+
}
|
|
88
|
+
const suffix = toEnvSuffix(server.name);
|
|
89
|
+
const prefixed = env[`${MCP_TOKEN_ENV_PREFIX}${suffix}`];
|
|
90
|
+
const fallback = env[`${MCP_TOKEN_ENV_FALLBACK_PREFIX}${suffix}`];
|
|
91
|
+
const value = prefixed ?? fallback;
|
|
92
|
+
if (typeof value === "string") {
|
|
93
|
+
tokens[server.name] = value;
|
|
94
|
+
}
|
|
95
|
+
return tokens;
|
|
96
|
+
}, {});
|
|
97
|
+
}
|
|
98
|
+
export function resolveServeSandboxConfig(sandbox) {
|
|
99
|
+
if (!sandbox.serve?.provider) {
|
|
100
|
+
return sandbox;
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
...sandbox,
|
|
104
|
+
provider: sandbox.serve.provider,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export async function resolveServeInputs(configPath, loadConfigImpl = loadBundleConfig, loadSkillsImpl = loadAllSkills, generateSystemPromptImpl = generateSystemPromptTemplate) {
|
|
108
|
+
const absoluteConfigPath = resolve(configPath);
|
|
109
|
+
const config = await loadConfigImpl(absoluteConfigPath);
|
|
110
|
+
const bundleDir = dirname(absoluteConfigPath);
|
|
111
|
+
const skills = await loadSkillsImpl(config.skills, bundleDir);
|
|
112
|
+
const systemPrompt = generateSystemPromptImpl({
|
|
113
|
+
basePrompt: config.prompt.system,
|
|
114
|
+
skills: toSkillSummaries(skills),
|
|
115
|
+
});
|
|
116
|
+
return {
|
|
117
|
+
configPath: absoluteConfigPath,
|
|
118
|
+
config,
|
|
119
|
+
systemPrompt,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=serve-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-runtime.js","sourceRoot":"","sources":["../../src/cli/serve-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AgentConfig, AgentFactory } from "../agent/types.js";
|
|
2
|
+
import { serveTUI } from "../tui/tui.js";
|
|
3
|
+
import { createWebUIServer } from "../webui/create-webui-server.js";
|
|
4
|
+
import { resolveServeInputs, type KeyValueArgInput } from "./serve-runtime.js";
|
|
5
|
+
import { type StartedHttpServer, type StartHttpServerInput } from "./serve-http.js";
|
|
6
|
+
export declare const DEFAULT_SERVE_PORT = 3000;
|
|
7
|
+
type DefineAgentForServe = (config: AgentConfig<string>) => AgentFactory<string>;
|
|
8
|
+
type ServeDependencies = {
|
|
9
|
+
defineAgentImpl?: DefineAgentForServe;
|
|
10
|
+
createWebUIServerImpl?: typeof createWebUIServer;
|
|
11
|
+
startHttpServerImpl?: (input: StartHttpServerInput) => Promise<StartedHttpServer>;
|
|
12
|
+
serveTUIImpl?: typeof serveTUI;
|
|
13
|
+
signalProcess?: Pick<NodeJS.Process, "on" | "off">;
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
15
|
+
exit?: (code: number) => void;
|
|
16
|
+
loadConfig?: Parameters<typeof resolveServeInputs>[1];
|
|
17
|
+
loadSkills?: Parameters<typeof resolveServeInputs>[2];
|
|
18
|
+
generateSystemPrompt?: Parameters<typeof resolveServeInputs>[3];
|
|
19
|
+
};
|
|
20
|
+
export type RunServeOptions = {
|
|
21
|
+
configPath: string;
|
|
22
|
+
port?: number;
|
|
23
|
+
variableEntries?: KeyValueArgInput;
|
|
24
|
+
mcpTokenEntries?: KeyValueArgInput;
|
|
25
|
+
stdin?: NodeJS.ReadableStream;
|
|
26
|
+
stdout?: NodeJS.WritableStream;
|
|
27
|
+
stderr?: NodeJS.WritableStream;
|
|
28
|
+
};
|
|
29
|
+
export type RunServeResult = {
|
|
30
|
+
port: number;
|
|
31
|
+
};
|
|
32
|
+
export declare function runServeCommand(options: RunServeOptions, dependencies?: ServeDependencies): Promise<RunServeResult>;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { defineAgent } from "../agent/define-agent.js";
|
|
2
|
+
import { serveTUI } from "../tui/tui.js";
|
|
3
|
+
import { createWebUIServer } from "../webui/create-webui-server.js";
|
|
4
|
+
import { toErrorMessage } from "./error.js";
|
|
5
|
+
import { parseKeyValueEntries, resolveInitVariables, resolveMcpTokens, resolveServeInputs, resolveServeSandboxConfig, } from "./serve-runtime.js";
|
|
6
|
+
import { startHttpServer } from "./serve-http.js";
|
|
7
|
+
export const DEFAULT_SERVE_PORT = 3000;
|
|
8
|
+
function validatePort(port) {
|
|
9
|
+
if (!Number.isInteger(port) || port < 1 || port > 65_535) {
|
|
10
|
+
throw new Error("Serve port must be an integer between 1 and 65535.");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function toWebUISandboxAdapter(sandboxIO) {
|
|
14
|
+
let status = "ready";
|
|
15
|
+
return {
|
|
16
|
+
id: "serve-sandbox",
|
|
17
|
+
get status() {
|
|
18
|
+
return status;
|
|
19
|
+
},
|
|
20
|
+
// Adapter does not own lifecycle; the real sandbox is managed by AgentImpl.
|
|
21
|
+
start: async () => {
|
|
22
|
+
status = "ready";
|
|
23
|
+
},
|
|
24
|
+
// Reflect shutdown state for any status-based observer in WebUI integrations.
|
|
25
|
+
shutdown: async () => {
|
|
26
|
+
status = "stopped";
|
|
27
|
+
},
|
|
28
|
+
exec: async (command, options) => {
|
|
29
|
+
return await sandboxIO.exec(command, options);
|
|
30
|
+
},
|
|
31
|
+
file: sandboxIO.file,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async function shutdownServeResources(resources) {
|
|
35
|
+
const errors = [];
|
|
36
|
+
try {
|
|
37
|
+
await resources.httpServer?.close();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
errors.push(error);
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
resources.webUI?.shutdown();
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
errors.push(error);
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
await resources.agent.shutdown();
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
errors.push(error);
|
|
53
|
+
}
|
|
54
|
+
if (errors.length > 0) {
|
|
55
|
+
throw errors[0];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function initializeServeContext(options, dependencies) {
|
|
59
|
+
const defineAgentImpl = dependencies.defineAgentImpl ?? defineAgent;
|
|
60
|
+
const env = dependencies.env ?? process.env;
|
|
61
|
+
const variableOverrides = parseKeyValueEntries(options.variableEntries, "--var");
|
|
62
|
+
const mcpTokenOverrides = parseKeyValueEntries(options.mcpTokenEntries, "--mcp-token");
|
|
63
|
+
const { configPath, config, systemPrompt } = await resolveServeInputs(options.configPath, dependencies.loadConfig, dependencies.loadSkills, dependencies.generateSystemPrompt);
|
|
64
|
+
const variables = resolveInitVariables(config.prompt.variables, variableOverrides, env);
|
|
65
|
+
const mcpServers = config.mcp?.servers ?? [];
|
|
66
|
+
const mcpTokens = resolveMcpTokens(mcpServers, mcpTokenOverrides, env);
|
|
67
|
+
const agentFactoryConfig = {
|
|
68
|
+
name: config.name,
|
|
69
|
+
sandbox: resolveServeSandboxConfig(config.sandbox),
|
|
70
|
+
model: config.model,
|
|
71
|
+
systemPrompt,
|
|
72
|
+
variables: config.prompt.variables,
|
|
73
|
+
...(mcpServers.length > 0 ? { mcp: mcpServers } : {}),
|
|
74
|
+
};
|
|
75
|
+
let capturedSandboxIO = null;
|
|
76
|
+
const initOptions = {
|
|
77
|
+
variables,
|
|
78
|
+
hooks: {
|
|
79
|
+
postMount: async (io) => {
|
|
80
|
+
capturedSandboxIO = io;
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
...(Object.keys(mcpTokens).length > 0 ? { mcpTokens } : {}),
|
|
84
|
+
};
|
|
85
|
+
const agent = await defineAgentImpl(agentFactoryConfig).init(initOptions);
|
|
86
|
+
if (!capturedSandboxIO) {
|
|
87
|
+
await agent.shutdown();
|
|
88
|
+
throw new Error("Agent initialized without exposing sandbox IO for WebUI.");
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
configPath,
|
|
92
|
+
config,
|
|
93
|
+
agent,
|
|
94
|
+
webUISandbox: toWebUISandboxAdapter(capturedSandboxIO),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export async function runServeCommand(options, dependencies = {}) {
|
|
98
|
+
const createWebUIServerImpl = dependencies.createWebUIServerImpl ?? createWebUIServer;
|
|
99
|
+
const startHttpServerImpl = dependencies.startHttpServerImpl ?? startHttpServer;
|
|
100
|
+
const serveTUIImpl = dependencies.serveTUIImpl ?? serveTUI;
|
|
101
|
+
const signalProcess = dependencies.signalProcess ?? process;
|
|
102
|
+
const exit = dependencies.exit ?? ((code) => process.exit(code));
|
|
103
|
+
const stdout = options.stdout ?? process.stdout;
|
|
104
|
+
const stderr = options.stderr ?? process.stderr;
|
|
105
|
+
const stdin = options.stdin ?? process.stdin;
|
|
106
|
+
const port = options.port ?? DEFAULT_SERVE_PORT;
|
|
107
|
+
validatePort(port);
|
|
108
|
+
const context = await initializeServeContext(options, dependencies);
|
|
109
|
+
stdout.write(`Starting bundle "${context.config.name}" from ${context.configPath}\n`);
|
|
110
|
+
let webUI = null;
|
|
111
|
+
let httpServer = null;
|
|
112
|
+
let shutdownPromise = null;
|
|
113
|
+
const shutdown = async () => {
|
|
114
|
+
if (!shutdownPromise) {
|
|
115
|
+
shutdownPromise = shutdownServeResources({ agent: context.agent, webUI, httpServer });
|
|
116
|
+
}
|
|
117
|
+
return await shutdownPromise;
|
|
118
|
+
};
|
|
119
|
+
const onSignal = (signal) => {
|
|
120
|
+
void shutdown()
|
|
121
|
+
.then(() => exit(0))
|
|
122
|
+
.catch((error) => {
|
|
123
|
+
stderr.write(`[serve] failed to shutdown on ${signal}: ${toErrorMessage(error)}\n`);
|
|
124
|
+
exit(1);
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
signalProcess.on("SIGINT", onSignal);
|
|
128
|
+
signalProcess.on("SIGTERM", onSignal);
|
|
129
|
+
try {
|
|
130
|
+
webUI = createWebUIServerImpl({ agent: context.agent, sandbox: context.webUISandbox });
|
|
131
|
+
httpServer = await startHttpServerImpl({
|
|
132
|
+
appFetch: webUI.app.fetch.bind(webUI.app),
|
|
133
|
+
handleUpgrade: webUI.handleUpgrade,
|
|
134
|
+
port,
|
|
135
|
+
stderr,
|
|
136
|
+
});
|
|
137
|
+
stdout.write(`Serve ready at http://localhost:${httpServer.port}\n`);
|
|
138
|
+
await serveTUIImpl(context.agent, { input: stdin, output: stdout });
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
signalProcess.off("SIGINT", onSignal);
|
|
142
|
+
signalProcess.off("SIGTERM", onSignal);
|
|
143
|
+
await shutdown();
|
|
144
|
+
}
|
|
145
|
+
if (!httpServer) {
|
|
146
|
+
throw new Error("Serve HTTP server did not start.");
|
|
147
|
+
}
|
|
148
|
+
return { port: httpServer.port };
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=serve.js.map
|