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,56 @@
|
|
|
1
|
+
import type { ResponseEvent, ResponseInput, ResponseOutput } from "../agent-loop/types.js";
|
|
2
|
+
import type { Agent, AgentStatus, RespondStreamOptions } from "../agent/types.js";
|
|
3
|
+
export type DemoScenarioStep = {
|
|
4
|
+
type: "text";
|
|
5
|
+
content: string;
|
|
6
|
+
delayMs?: number;
|
|
7
|
+
} | {
|
|
8
|
+
type: "tool_call";
|
|
9
|
+
name: string;
|
|
10
|
+
delayMs?: number;
|
|
11
|
+
} | {
|
|
12
|
+
type: "tool_result";
|
|
13
|
+
output: string;
|
|
14
|
+
isError?: boolean;
|
|
15
|
+
} | {
|
|
16
|
+
type: "tool_execution_update";
|
|
17
|
+
chunk: string;
|
|
18
|
+
delayMs?: number;
|
|
19
|
+
} | {
|
|
20
|
+
type: "file_write";
|
|
21
|
+
path: string;
|
|
22
|
+
content: string;
|
|
23
|
+
};
|
|
24
|
+
export type DemoScenario = {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
/** Keyword patterns to match user input against this scenario. */
|
|
28
|
+
triggers: string[];
|
|
29
|
+
steps: DemoScenarioStep[];
|
|
30
|
+
};
|
|
31
|
+
export type MockAgentOptions = {
|
|
32
|
+
name: string;
|
|
33
|
+
scenarios: DemoScenario[];
|
|
34
|
+
/** Fallback message when no scenario matches. */
|
|
35
|
+
fallbackMessage?: string;
|
|
36
|
+
/** Callback when agent "writes" a file (for sandbox sync). */
|
|
37
|
+
onFileWrite?: (path: string, content: string) => Promise<void>;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Mock agent for demo purposes. Does not call any LLM or sandbox.
|
|
41
|
+
* Instead, plays back scripted scenarios matching user input.
|
|
42
|
+
*/
|
|
43
|
+
export declare class MockAgent implements Agent {
|
|
44
|
+
readonly name: string;
|
|
45
|
+
private statusValue;
|
|
46
|
+
private readonly scenarios;
|
|
47
|
+
private readonly fallbackMessage;
|
|
48
|
+
private readonly onFileWrite?;
|
|
49
|
+
constructor(options: MockAgentOptions);
|
|
50
|
+
get status(): AgentStatus;
|
|
51
|
+
respond(input: ResponseInput): Promise<ResponseOutput>;
|
|
52
|
+
respondStream(input: ResponseInput, options?: RespondStreamOptions): AsyncIterable<ResponseEvent>;
|
|
53
|
+
shutdown(): Promise<void>;
|
|
54
|
+
private playScenario;
|
|
55
|
+
private streamText;
|
|
56
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
function sleep(ms) {
|
|
3
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
4
|
+
}
|
|
5
|
+
function matchScenario(input, scenarios) {
|
|
6
|
+
const lowered = input.toLowerCase();
|
|
7
|
+
for (const scenario of scenarios) {
|
|
8
|
+
for (const trigger of scenario.triggers) {
|
|
9
|
+
if (lowered.includes(trigger.toLowerCase())) {
|
|
10
|
+
return scenario;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function extractUserText(input) {
|
|
17
|
+
for (let i = input.length - 1; i >= 0; i--) {
|
|
18
|
+
const msg = input[i];
|
|
19
|
+
if (msg.role !== "user")
|
|
20
|
+
continue;
|
|
21
|
+
// Plain string content (matches the declared type)
|
|
22
|
+
if (typeof msg.content === "string") {
|
|
23
|
+
return msg.content;
|
|
24
|
+
}
|
|
25
|
+
// The WebSocket handler passes unvalidated JSON, so at runtime content may
|
|
26
|
+
// be an array of input parts (e.g. [{ type: "input_text", text: "..." }]).
|
|
27
|
+
// Cast through unknown to handle this gracefully.
|
|
28
|
+
const raw = msg.content;
|
|
29
|
+
if (Array.isArray(raw)) {
|
|
30
|
+
for (const part of raw) {
|
|
31
|
+
if (typeof part === "object" &&
|
|
32
|
+
part !== null &&
|
|
33
|
+
part.type === "input_text" &&
|
|
34
|
+
typeof part.text === "string") {
|
|
35
|
+
return part.text;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return "";
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Mock agent for demo purposes. Does not call any LLM or sandbox.
|
|
44
|
+
* Instead, plays back scripted scenarios matching user input.
|
|
45
|
+
*/
|
|
46
|
+
export class MockAgent {
|
|
47
|
+
name;
|
|
48
|
+
statusValue = "ready";
|
|
49
|
+
scenarios;
|
|
50
|
+
fallbackMessage;
|
|
51
|
+
onFileWrite;
|
|
52
|
+
constructor(options) {
|
|
53
|
+
this.name = options.name;
|
|
54
|
+
this.scenarios = options.scenarios;
|
|
55
|
+
this.fallbackMessage = options.fallbackMessage ??
|
|
56
|
+
"I'm a demo agent. Try asking me to analyze data, format code, or convert a document.";
|
|
57
|
+
this.onFileWrite = options.onFileWrite;
|
|
58
|
+
}
|
|
59
|
+
get status() {
|
|
60
|
+
return this.statusValue;
|
|
61
|
+
}
|
|
62
|
+
async respond(input) {
|
|
63
|
+
let output = null;
|
|
64
|
+
for await (const event of this.respondStream(input)) {
|
|
65
|
+
if (event.type === "response.completed") {
|
|
66
|
+
output = event.output;
|
|
67
|
+
}
|
|
68
|
+
if (event.type === "response.error") {
|
|
69
|
+
throw new Error(event.error);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!output) {
|
|
73
|
+
throw new Error("MockAgent did not produce a response.");
|
|
74
|
+
}
|
|
75
|
+
return output;
|
|
76
|
+
}
|
|
77
|
+
async *respondStream(input, options) {
|
|
78
|
+
const signal = options?.signal;
|
|
79
|
+
this.statusValue = "running";
|
|
80
|
+
const responseId = `mock-${randomUUID()}`;
|
|
81
|
+
try {
|
|
82
|
+
yield { type: "response.created", responseId };
|
|
83
|
+
const userText = extractUserText(input);
|
|
84
|
+
const scenario = matchScenario(userText, this.scenarios);
|
|
85
|
+
if (!scenario) {
|
|
86
|
+
yield* this.streamText(this.fallbackMessage, signal);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
yield* this.playScenario(scenario, signal);
|
|
90
|
+
}
|
|
91
|
+
const outputText = scenario
|
|
92
|
+
? scenario.steps
|
|
93
|
+
.filter((s) => s.type === "text")
|
|
94
|
+
.map((s) => s.content)
|
|
95
|
+
.join("")
|
|
96
|
+
: this.fallbackMessage;
|
|
97
|
+
const responseOutput = {
|
|
98
|
+
id: responseId,
|
|
99
|
+
output: outputText,
|
|
100
|
+
};
|
|
101
|
+
yield {
|
|
102
|
+
type: "response.completed",
|
|
103
|
+
output: responseOutput,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
const currentStatus = this.statusValue;
|
|
108
|
+
if (currentStatus !== "stopped") {
|
|
109
|
+
this.statusValue = "ready";
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async shutdown() {
|
|
114
|
+
this.statusValue = "stopped";
|
|
115
|
+
}
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Scenario playback
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
async *playScenario(scenario, signal) {
|
|
120
|
+
let toolCallCounter = 0;
|
|
121
|
+
for (const step of scenario.steps) {
|
|
122
|
+
if (signal?.aborted)
|
|
123
|
+
break;
|
|
124
|
+
switch (step.type) {
|
|
125
|
+
case "text":
|
|
126
|
+
yield* this.streamText(step.content, signal, step.delayMs);
|
|
127
|
+
break;
|
|
128
|
+
case "tool_call": {
|
|
129
|
+
const callId = `mock-call-${++toolCallCounter}`;
|
|
130
|
+
yield {
|
|
131
|
+
type: "response.tool_call.created",
|
|
132
|
+
toolCall: { id: callId, name: step.name, input: {} },
|
|
133
|
+
};
|
|
134
|
+
if (step.delayMs)
|
|
135
|
+
await sleep(step.delayMs);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
case "tool_result":
|
|
139
|
+
yield {
|
|
140
|
+
type: "response.tool_call.done",
|
|
141
|
+
result: { toolCallId: `mock-call-${toolCallCounter}`, output: step.output, isError: step.isError ?? false },
|
|
142
|
+
};
|
|
143
|
+
break;
|
|
144
|
+
case "tool_execution_update":
|
|
145
|
+
yield {
|
|
146
|
+
type: "tool_execution_update",
|
|
147
|
+
toolCallId: `mock-call-${toolCallCounter}`,
|
|
148
|
+
chunk: step.chunk,
|
|
149
|
+
};
|
|
150
|
+
if (step.delayMs)
|
|
151
|
+
await sleep(step.delayMs);
|
|
152
|
+
break;
|
|
153
|
+
case "file_write":
|
|
154
|
+
if (this.onFileWrite) {
|
|
155
|
+
await this.onFileWrite(step.path, step.content);
|
|
156
|
+
}
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async *streamText(text, signal, delayMs) {
|
|
162
|
+
// Stream character by character for realistic typing effect
|
|
163
|
+
const chunkSize = 3;
|
|
164
|
+
for (let i = 0; i < text.length; i += chunkSize) {
|
|
165
|
+
if (signal?.aborted)
|
|
166
|
+
break;
|
|
167
|
+
const chunk = text.slice(i, i + chunkSize);
|
|
168
|
+
yield {
|
|
169
|
+
type: "response.output_text.delta",
|
|
170
|
+
delta: chunk,
|
|
171
|
+
};
|
|
172
|
+
await sleep(delayMs ?? 15);
|
|
173
|
+
}
|
|
174
|
+
yield {
|
|
175
|
+
type: "response.output_text.done",
|
|
176
|
+
text,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=mock-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-agent.js","sourceRoot":"","sources":["../../src/test-helpers/mock-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ExecOptions, ExecResult, FileEntry, Sandbox, SandboxStatus } from "../sandbox/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* In-memory `Sandbox` implementation for testing and demo purposes.
|
|
4
|
+
*
|
|
5
|
+
* All file and directory operations run against internal `Map` / `Set`
|
|
6
|
+
* data structures -- no real filesystem or network access is involved.
|
|
7
|
+
*/
|
|
8
|
+
export declare class MockSandbox implements Sandbox {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
private currentStatus;
|
|
11
|
+
private readonly files;
|
|
12
|
+
private readonly directories;
|
|
13
|
+
constructor();
|
|
14
|
+
get status(): SandboxStatus;
|
|
15
|
+
start(): Promise<void>;
|
|
16
|
+
shutdown(): Promise<void>;
|
|
17
|
+
exec(command: string, opts?: ExecOptions): Promise<ExecResult>;
|
|
18
|
+
readonly file: {
|
|
19
|
+
read: (path: string) => Promise<string>;
|
|
20
|
+
write: (path: string, content: string | Buffer) => Promise<void>;
|
|
21
|
+
list: (path: string) => Promise<FileEntry[]>;
|
|
22
|
+
delete: (path: string) => Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Seeds the in-memory filesystem with additional files.
|
|
26
|
+
*
|
|
27
|
+
* Keys are absolute paths; values are file contents.
|
|
28
|
+
* Ancestor directories are created automatically.
|
|
29
|
+
*/
|
|
30
|
+
prePopulate(files: Record<string, string>): void;
|
|
31
|
+
private seedDefaults;
|
|
32
|
+
private assertReady;
|
|
33
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { posix } from "node:path";
|
|
3
|
+
const DEFAULT_FILES = {
|
|
4
|
+
"/workspace/README.md": [
|
|
5
|
+
"# Workspace",
|
|
6
|
+
"",
|
|
7
|
+
"This is the default sandbox workspace.",
|
|
8
|
+
"Place your project files here to get started.",
|
|
9
|
+
"",
|
|
10
|
+
].join("\n"),
|
|
11
|
+
};
|
|
12
|
+
const DEFAULT_DIRECTORIES = ["/workspace", "/workspace/data"];
|
|
13
|
+
/**
|
|
14
|
+
* Normalizes a filesystem path by resolving `.` and `..` segments
|
|
15
|
+
* and stripping any trailing slash (except for root `/`).
|
|
16
|
+
*/
|
|
17
|
+
function normalizePath(raw) {
|
|
18
|
+
const resolved = posix.normalize(raw);
|
|
19
|
+
return resolved.length > 1 && resolved.endsWith("/")
|
|
20
|
+
? resolved.slice(0, -1)
|
|
21
|
+
: resolved;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Collects every ancestor directory of `filePath` (excluding root `/`).
|
|
25
|
+
*
|
|
26
|
+
* Example: `/workspace/data/report.csv` yields
|
|
27
|
+
* `["/workspace", "/workspace/data"]`.
|
|
28
|
+
*/
|
|
29
|
+
function ancestorDirectories(filePath) {
|
|
30
|
+
const ancestors = [];
|
|
31
|
+
let current = posix.dirname(filePath);
|
|
32
|
+
while (current !== "/") {
|
|
33
|
+
ancestors.push(current);
|
|
34
|
+
current = posix.dirname(current);
|
|
35
|
+
}
|
|
36
|
+
return ancestors;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* In-memory `Sandbox` implementation for testing and demo purposes.
|
|
40
|
+
*
|
|
41
|
+
* All file and directory operations run against internal `Map` / `Set`
|
|
42
|
+
* data structures -- no real filesystem or network access is involved.
|
|
43
|
+
*/
|
|
44
|
+
export class MockSandbox {
|
|
45
|
+
id;
|
|
46
|
+
currentStatus = "idle";
|
|
47
|
+
files;
|
|
48
|
+
directories;
|
|
49
|
+
constructor() {
|
|
50
|
+
this.id = `mock-${randomUUID()}`;
|
|
51
|
+
this.files = new Map();
|
|
52
|
+
this.directories = new Set();
|
|
53
|
+
this.seedDefaults();
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Sandbox status
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
get status() {
|
|
59
|
+
return this.currentStatus;
|
|
60
|
+
}
|
|
61
|
+
async start() {
|
|
62
|
+
if (this.currentStatus === "ready") {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (this.currentStatus === "starting" || this.currentStatus === "stopping") {
|
|
66
|
+
throw new Error(`Cannot start mock sandbox while status is "${this.currentStatus}".`);
|
|
67
|
+
}
|
|
68
|
+
this.currentStatus = "starting";
|
|
69
|
+
this.currentStatus = "ready";
|
|
70
|
+
}
|
|
71
|
+
async shutdown() {
|
|
72
|
+
if (this.currentStatus === "stopped") {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.currentStatus = "stopping";
|
|
76
|
+
this.currentStatus = "stopped";
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// exec
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
async exec(command, opts) {
|
|
82
|
+
void opts;
|
|
83
|
+
this.assertReady();
|
|
84
|
+
return {
|
|
85
|
+
stdout: `[mock] ${command}\n`,
|
|
86
|
+
stderr: "",
|
|
87
|
+
exitCode: 0,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// file operations
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
file = {
|
|
94
|
+
read: async (path) => {
|
|
95
|
+
this.assertReady();
|
|
96
|
+
const normalized = normalizePath(path);
|
|
97
|
+
const content = this.files.get(normalized);
|
|
98
|
+
if (content === undefined) {
|
|
99
|
+
throw new Error(`ENOENT: no such file "${normalized}".`);
|
|
100
|
+
}
|
|
101
|
+
return content;
|
|
102
|
+
},
|
|
103
|
+
write: async (path, content) => {
|
|
104
|
+
this.assertReady();
|
|
105
|
+
const normalized = normalizePath(path);
|
|
106
|
+
const payload = typeof content === "string" ? content : content.toString("utf8");
|
|
107
|
+
// Ensure all ancestor directories exist.
|
|
108
|
+
for (const dir of ancestorDirectories(normalized)) {
|
|
109
|
+
this.directories.add(dir);
|
|
110
|
+
}
|
|
111
|
+
this.files.set(normalized, payload);
|
|
112
|
+
},
|
|
113
|
+
list: async (path) => {
|
|
114
|
+
this.assertReady();
|
|
115
|
+
const normalized = normalizePath(path);
|
|
116
|
+
if (!this.directories.has(normalized)) {
|
|
117
|
+
throw new Error(`ENOENT: no such directory "${normalized}".`);
|
|
118
|
+
}
|
|
119
|
+
const entries = [];
|
|
120
|
+
const seen = new Set();
|
|
121
|
+
// Collect direct child files.
|
|
122
|
+
for (const filePath of this.files.keys()) {
|
|
123
|
+
if (posix.dirname(filePath) === normalized) {
|
|
124
|
+
const name = posix.basename(filePath);
|
|
125
|
+
if (!seen.has(name)) {
|
|
126
|
+
seen.add(name);
|
|
127
|
+
entries.push({ name, path: filePath, type: "file" });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Collect direct child directories.
|
|
132
|
+
for (const dirPath of this.directories) {
|
|
133
|
+
if (posix.dirname(dirPath) === normalized) {
|
|
134
|
+
const name = posix.basename(dirPath);
|
|
135
|
+
if (!seen.has(name)) {
|
|
136
|
+
seen.add(name);
|
|
137
|
+
entries.push({ name, path: dirPath, type: "directory" });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
142
|
+
return entries;
|
|
143
|
+
},
|
|
144
|
+
delete: async (path) => {
|
|
145
|
+
this.assertReady();
|
|
146
|
+
const normalized = normalizePath(path);
|
|
147
|
+
// Delete exact file match.
|
|
148
|
+
this.files.delete(normalized);
|
|
149
|
+
// Recursively delete directory and everything beneath it.
|
|
150
|
+
if (this.directories.has(normalized)) {
|
|
151
|
+
const prefix = `${normalized}/`;
|
|
152
|
+
for (const filePath of [...this.files.keys()]) {
|
|
153
|
+
if (filePath.startsWith(prefix)) {
|
|
154
|
+
this.files.delete(filePath);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
for (const dirPath of [...this.directories]) {
|
|
158
|
+
if (dirPath === normalized || dirPath.startsWith(prefix)) {
|
|
159
|
+
this.directories.delete(dirPath);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Test-helper API
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
/**
|
|
169
|
+
* Seeds the in-memory filesystem with additional files.
|
|
170
|
+
*
|
|
171
|
+
* Keys are absolute paths; values are file contents.
|
|
172
|
+
* Ancestor directories are created automatically.
|
|
173
|
+
*/
|
|
174
|
+
prePopulate(files) {
|
|
175
|
+
for (const [rawPath, content] of Object.entries(files)) {
|
|
176
|
+
const normalized = normalizePath(rawPath);
|
|
177
|
+
for (const dir of ancestorDirectories(normalized)) {
|
|
178
|
+
this.directories.add(dir);
|
|
179
|
+
}
|
|
180
|
+
this.files.set(normalized, content);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
// Internals
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
seedDefaults() {
|
|
187
|
+
for (const dir of DEFAULT_DIRECTORIES) {
|
|
188
|
+
this.directories.add(dir);
|
|
189
|
+
}
|
|
190
|
+
for (const [path, content] of Object.entries(DEFAULT_FILES)) {
|
|
191
|
+
this.files.set(path, content);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
assertReady() {
|
|
195
|
+
if (this.currentStatus !== "ready") {
|
|
196
|
+
throw new Error(`Mock sandbox is not ready (current status: "${this.currentStatus}").`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=mock-sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-sandbox.js","sourceRoot":"","sources":["../../src/test-helpers/mock-sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResponseEvent } from "../agent-loop/types.js";
|
|
2
|
+
export declare function renderEvent(event: ResponseEvent): string;
|
|
3
|
+
export declare function renderReady(agentName: string): string;
|
|
4
|
+
export declare function renderInterrupted(): string;
|
|
5
|
+
export declare function renderShuttingDown(): string;
|
|
6
|
+
export declare function renderExitHint(): string;
|
|
7
|
+
export declare function renderError(message: string): string;
|
|
8
|
+
export declare function renderCommandNotFound(name: string): string;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export function renderEvent(event) {
|
|
3
|
+
switch (event.type) {
|
|
4
|
+
case "response.output_text.delta":
|
|
5
|
+
return event.delta;
|
|
6
|
+
case "response.tool_call.created":
|
|
7
|
+
return chalk.dim(`\n[tool: ${event.toolCall.name}] running...\n`);
|
|
8
|
+
case "response.tool_call.done":
|
|
9
|
+
return event.result.isError
|
|
10
|
+
? chalk.red(`[tool error] ${String(event.result.output)}\n`)
|
|
11
|
+
: chalk.dim("[tool: done]\n");
|
|
12
|
+
case "tool_execution_update":
|
|
13
|
+
return chalk.dim(event.chunk);
|
|
14
|
+
case "response.error":
|
|
15
|
+
return chalk.red(`\nError: ${event.error}\n`);
|
|
16
|
+
case "response.created":
|
|
17
|
+
case "response.output_text.done":
|
|
18
|
+
case "response.completed":
|
|
19
|
+
return "";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function renderReady(agentName) {
|
|
23
|
+
return chalk.green(`Agent "${agentName}" is ready.\n`);
|
|
24
|
+
}
|
|
25
|
+
export function renderInterrupted() {
|
|
26
|
+
return chalk.yellow("\n(Interrupted)\n");
|
|
27
|
+
}
|
|
28
|
+
export function renderShuttingDown() {
|
|
29
|
+
return chalk.yellow("\nShutting down...\n");
|
|
30
|
+
}
|
|
31
|
+
export function renderExitHint() {
|
|
32
|
+
return chalk.yellow("\n(Press Ctrl+C again to exit)\n");
|
|
33
|
+
}
|
|
34
|
+
export function renderError(message) {
|
|
35
|
+
return chalk.red(`\nError: ${message}\n`);
|
|
36
|
+
}
|
|
37
|
+
export function renderCommandNotFound(name) {
|
|
38
|
+
return chalk.red(`\nUnknown command: /${name}\n`);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/tui/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,UAAU,WAAW,CAAC,KAAoB;IAC9C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,4BAA4B;YAC/B,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,KAAK,4BAA4B;YAC/B,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC;QACpE,KAAK,yBAAyB;YAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO;gBACzB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC5D,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAClC,KAAK,uBAAuB;YAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,gBAAgB;YACnB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QAChD,KAAK,kBAAkB,CAAC;QACxB,KAAK,2BAA2B,CAAC;QACjC,KAAK,oBAAoB;YACvB,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,SAAS,eAAe,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,OAAO,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,KAAK,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ResponseEvent, ResponseInput } from "../agent-loop/types.js";
|
|
2
|
+
import type { Agent } from "../agent/types.js";
|
|
3
|
+
import type { Command } from "../commands/types.js";
|
|
4
|
+
export type TUIOptions = {
|
|
5
|
+
input?: NodeJS.ReadableStream;
|
|
6
|
+
output?: NodeJS.WritableStream;
|
|
7
|
+
commands?: readonly Command[];
|
|
8
|
+
};
|
|
9
|
+
type TUIState = "idle" | "streaming" | "shutting_down";
|
|
10
|
+
export type SigintAction = "ignore" | "abort" | "shutdown" | "exit_hint";
|
|
11
|
+
export declare function determineSigintAction(state: TUIState, hasAbort: boolean, msSinceLastCtrlC: number): SigintAction;
|
|
12
|
+
export type ParsedSlashCommand = {
|
|
13
|
+
commandName: string;
|
|
14
|
+
args: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function parseSlashCommand(input: string): ParsedSlashCommand | null;
|
|
17
|
+
export declare function resolveSlashInput(trimmed: string, commands: readonly Command[], write: (text: string) => void): string | null;
|
|
18
|
+
export declare function serveTUI(agent: Agent, options?: TUIOptions): Promise<void>;
|
|
19
|
+
export type { ResponseEvent, ResponseInput };
|