@amodalai/runtime 0.1.26 → 0.2.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/dist/src/__fixtures__/README.md +84 -0
- package/dist/src/__fixtures__/smoke-agent/amodal.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/automations/test-auto.md +5 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/access.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/spec.json +4 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/surface.md +9 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/access.json +3 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +8 -0
- package/dist/src/__fixtures__/smoke-agent/evals/basic-eval.md +12 -0
- package/dist/src/__fixtures__/smoke-agent/knowledge/test-knowledge.md +3 -0
- package/dist/src/__fixtures__/smoke-agent/skills/test-skill/SKILL.md +11 -0
- package/dist/src/__fixtures__/smoke-agent/stores/test-items.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.d.ts +18 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js +22 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js.map +1 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/tool.json +17 -0
- package/dist/src/__fixtures__/smoke.test.js +718 -0
- package/dist/src/__fixtures__/smoke.test.js.map +1 -0
- package/dist/src/__tests__/test-providers.d.ts +40 -0
- package/dist/src/__tests__/test-providers.js +61 -0
- package/dist/src/__tests__/test-providers.js.map +1 -0
- package/dist/src/agent/local-server.d.ts +3 -3
- package/dist/src/agent/local-server.js +213 -122
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/loop-types.d.ts +175 -0
- package/dist/src/agent/loop-types.js +20 -0
- package/dist/src/agent/loop-types.js.map +1 -0
- package/dist/src/agent/loop.d.ts +31 -0
- package/dist/src/agent/loop.js +139 -0
- package/dist/src/agent/loop.js.map +1 -0
- package/dist/src/agent/loop.test.js +1030 -0
- package/dist/src/agent/loop.test.js.map +1 -0
- package/dist/src/agent/mcp-config.d.ts +28 -0
- package/dist/src/agent/mcp-config.js +57 -0
- package/dist/src/agent/mcp-config.js.map +1 -0
- package/dist/src/agent/page-builder.js +6 -1
- package/dist/src/agent/page-builder.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.d.ts +24 -8
- package/dist/src/agent/proactive/proactive-runner.js +30 -32
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.d.ts +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.js +75 -87
- package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
- package/dist/src/agent/routes/admin-chat.d.ts +15 -3
- package/dist/src/agent/routes/admin-chat.js +63 -18
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/automations.js +5 -6
- package/dist/src/agent/routes/automations.js.map +1 -1
- package/dist/src/agent/routes/evals.d.ts +3 -2
- package/dist/src/agent/routes/evals.js +25 -12
- package/dist/src/agent/routes/evals.js.map +1 -1
- package/dist/src/agent/routes/files.js +7 -9
- package/dist/src/agent/routes/files.js.map +1 -1
- package/dist/src/agent/routes/inspect.d.ts +6 -2
- package/dist/src/agent/routes/inspect.js +31 -17
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/inspect.test.js +18 -42
- package/dist/src/agent/routes/inspect.test.js.map +1 -1
- package/dist/src/agent/routes/stores.js +9 -12
- package/dist/src/agent/routes/stores.js.map +1 -1
- package/dist/src/agent/routes/task.d.ts +15 -3
- package/dist/src/agent/routes/task.js +16 -7
- package/dist/src/agent/routes/task.js.map +1 -1
- package/dist/src/agent/routes/task.test.d.ts +1 -1
- package/dist/src/agent/routes/task.test.js +70 -53
- package/dist/src/agent/routes/task.test.js.map +1 -1
- package/dist/src/agent/routes/webhooks.js +12 -3
- package/dist/src/agent/routes/webhooks.js.map +1 -1
- package/dist/src/agent/session-store.d.ts +11 -2
- package/dist/src/agent/session-store.js +1 -1
- package/dist/src/agent/session-store.js.map +1 -1
- package/dist/src/agent/snapshot-server.d.ts +2 -22
- package/dist/src/agent/snapshot-server.js +50 -27
- package/dist/src/agent/snapshot-server.js.map +1 -1
- package/dist/src/agent/states/compacting.d.ts +14 -0
- package/dist/src/agent/states/compacting.js +258 -0
- package/dist/src/agent/states/compacting.js.map +1 -0
- package/dist/src/agent/states/confirming.d.ts +10 -0
- package/dist/src/agent/states/confirming.js +76 -0
- package/dist/src/agent/states/confirming.js.map +1 -0
- package/dist/src/agent/states/dispatching.d.ts +18 -0
- package/dist/src/agent/states/dispatching.js +241 -0
- package/dist/src/agent/states/dispatching.js.map +1 -0
- package/dist/src/agent/states/executing.d.ts +21 -0
- package/dist/src/agent/states/executing.js +308 -0
- package/dist/src/agent/states/executing.js.map +1 -0
- package/dist/src/agent/states/streaming.d.ts +10 -0
- package/dist/src/agent/states/streaming.js +155 -0
- package/dist/src/agent/states/streaming.js.map +1 -0
- package/dist/src/agent/states/thinking.d.ts +13 -0
- package/dist/src/agent/states/thinking.js +233 -0
- package/dist/src/agent/states/thinking.js.map +1 -0
- package/dist/src/agent/token-estimate.d.ts +17 -0
- package/dist/src/agent/token-estimate.js +13 -0
- package/dist/src/agent/token-estimate.js.map +1 -0
- package/dist/src/agent/tool-executor-local.js +9 -18
- package/dist/src/agent/tool-executor-local.js.map +1 -1
- package/dist/src/agent/tool-executor-local.test.js +3 -5
- package/dist/src/agent/tool-executor-local.test.js.map +1 -1
- package/dist/src/api/create-agent.d.ts +15 -0
- package/dist/src/api/create-agent.js +137 -0
- package/dist/src/api/create-agent.js.map +1 -0
- package/dist/src/api/types.d.ts +68 -0
- package/dist/src/api/types.js +7 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/context/compiler.d.ts +13 -0
- package/dist/src/context/compiler.js +358 -0
- package/dist/src/context/compiler.js.map +1 -0
- package/dist/src/context/compiler.test.js +532 -0
- package/dist/src/context/compiler.test.js.map +1 -0
- package/dist/src/context/types.d.ts +110 -0
- package/dist/src/context/types.js +7 -0
- package/dist/src/context/types.js.map +1 -0
- package/dist/src/index.d.ts +33 -6
- package/dist/src/index.js +35 -21
- package/dist/src/index.js.map +1 -1
- package/dist/src/providers/create-provider.d.ts +23 -0
- package/dist/src/providers/create-provider.js +185 -0
- package/dist/src/providers/create-provider.js.map +1 -0
- package/dist/src/{agent/stores-e2e.test.d.ts → providers/create-provider.test.d.ts} +1 -1
- package/dist/src/providers/create-provider.test.js +95 -0
- package/dist/src/providers/create-provider.test.js.map +1 -0
- package/dist/src/providers/failover.d.ts +38 -0
- package/dist/src/providers/failover.js +147 -0
- package/dist/src/providers/failover.js.map +1 -0
- package/dist/src/providers/failover.test.d.ts +6 -0
- package/dist/src/providers/failover.test.js +169 -0
- package/dist/src/providers/failover.test.js.map +1 -0
- package/dist/src/providers/types.d.ts +110 -0
- package/dist/src/providers/types.js +7 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/routes/ai-stream.d.ts +13 -10
- package/dist/src/routes/ai-stream.js +76 -41
- package/dist/src/routes/ai-stream.js.map +1 -1
- package/dist/src/routes/chat-new.test.d.ts +6 -0
- package/dist/src/routes/chat-new.test.js +107 -0
- package/dist/src/routes/chat-new.test.js.map +1 -0
- package/dist/src/routes/chat-stream-new.test.d.ts +6 -0
- package/dist/src/routes/chat-stream-new.test.js +135 -0
- package/dist/src/routes/chat-stream-new.test.js.map +1 -0
- package/dist/src/routes/chat-stream.d.ts +14 -4
- package/dist/src/routes/chat-stream.js +47 -29
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/routes/chat.d.ts +13 -4
- package/dist/src/routes/chat.js +60 -23
- package/dist/src/routes/chat.js.map +1 -1
- package/dist/src/routes/health.d.ts +3 -2
- package/dist/src/routes/health.js.map +1 -1
- package/dist/src/routes/route-helpers.d.ts +50 -0
- package/dist/src/routes/route-helpers.js +80 -0
- package/dist/src/routes/route-helpers.js.map +1 -0
- package/dist/src/routes/session-resolver.d.ts +72 -0
- package/dist/src/routes/session-resolver.js +123 -0
- package/dist/src/routes/session-resolver.js.map +1 -0
- package/dist/src/routes/session-resolver.test.d.ts +6 -0
- package/dist/src/routes/session-resolver.test.js +206 -0
- package/dist/src/routes/session-resolver.test.js.map +1 -0
- package/dist/src/routes/webhooks.d.ts +3 -1
- package/dist/src/routes/webhooks.js +12 -4
- package/dist/src/routes/webhooks.js.map +1 -1
- package/dist/src/security/permission-checker.d.ts +80 -0
- package/dist/src/security/permission-checker.js +75 -0
- package/dist/src/security/permission-checker.js.map +1 -0
- package/dist/src/security/permission-checker.test.d.ts +6 -0
- package/dist/src/security/permission-checker.test.js +208 -0
- package/dist/src/security/permission-checker.test.js.map +1 -0
- package/dist/src/server.d.ts +12 -11
- package/dist/src/server.js +44 -46
- package/dist/src/server.js.map +1 -1
- package/dist/src/server.test.d.ts +1 -1
- package/dist/src/server.test.js +6 -144
- package/dist/src/server.test.js.map +1 -1
- package/dist/src/session/manager.d.ts +98 -0
- package/dist/src/session/manager.js +364 -0
- package/dist/src/session/manager.js.map +1 -0
- package/dist/src/session/manager.test.d.ts +6 -0
- package/dist/src/session/manager.test.js +315 -0
- package/dist/src/session/manager.test.js.map +1 -0
- package/dist/src/session/session-builder.d.ts +71 -0
- package/dist/src/session/session-builder.js +364 -0
- package/dist/src/session/session-builder.js.map +1 -0
- package/dist/src/session/session-builder.test.d.ts +6 -0
- package/dist/src/session/session-builder.test.js +352 -0
- package/dist/src/session/session-builder.test.js.map +1 -0
- package/dist/src/session/store.d.ts +57 -0
- package/dist/src/session/store.js +167 -0
- package/dist/src/session/store.js.map +1 -0
- package/dist/src/session/store.test.d.ts +6 -0
- package/dist/src/session/store.test.js +145 -0
- package/dist/src/session/store.test.js.map +1 -0
- package/dist/src/session/stream-hooks.d.ts +39 -0
- package/dist/src/session/stream-hooks.js +7 -0
- package/dist/src/session/stream-hooks.js.map +1 -0
- package/dist/src/session/tool-context-factory.d.ts +60 -0
- package/dist/src/session/tool-context-factory.js +190 -0
- package/dist/src/session/tool-context-factory.js.map +1 -0
- package/dist/src/session/tool-context-factory.test.d.ts +6 -0
- package/dist/src/session/tool-context-factory.test.js +287 -0
- package/dist/src/session/tool-context-factory.test.js.map +1 -0
- package/dist/src/session/types.d.ts +188 -0
- package/dist/src/session/types.js +7 -0
- package/dist/src/session/types.js.map +1 -0
- package/dist/src/stores/drizzle-store-backend.d.ts +49 -0
- package/dist/src/stores/drizzle-store-backend.js +306 -0
- package/dist/src/stores/drizzle-store-backend.js.map +1 -0
- package/dist/src/stores/drizzle-store-backend.test.d.ts +6 -0
- package/dist/src/stores/drizzle-store-backend.test.js +215 -0
- package/dist/src/stores/drizzle-store-backend.test.js.map +1 -0
- package/dist/src/stores/index.d.ts +4 -0
- package/dist/src/stores/index.js +2 -0
- package/dist/src/stores/index.js.map +1 -1
- package/dist/src/stores/pglite-store-backend.d.ts +16 -19
- package/dist/src/stores/pglite-store-backend.js +85 -239
- package/dist/src/stores/pglite-store-backend.js.map +1 -1
- package/dist/src/stores/postgres-store-backend.d.ts +30 -0
- package/dist/src/stores/postgres-store-backend.js +100 -0
- package/dist/src/stores/postgres-store-backend.js.map +1 -0
- package/dist/src/stores/schema.d.ts +491 -0
- package/dist/src/stores/schema.js +57 -0
- package/dist/src/stores/schema.js.map +1 -0
- package/dist/src/tools/admin-file-tools.d.ts +13 -0
- package/dist/src/tools/admin-file-tools.js +200 -0
- package/dist/src/tools/admin-file-tools.js.map +1 -0
- package/dist/src/tools/admin-file-tools.test.d.ts +6 -0
- package/dist/src/tools/admin-file-tools.test.js +152 -0
- package/dist/src/tools/admin-file-tools.test.js.map +1 -0
- package/dist/src/tools/custom-tool-adapter.d.ts +41 -0
- package/dist/src/tools/custom-tool-adapter.js +190 -0
- package/dist/src/tools/custom-tool-adapter.js.map +1 -0
- package/dist/src/tools/custom-tool-adapter.test.d.ts +6 -0
- package/dist/src/tools/custom-tool-adapter.test.js +244 -0
- package/dist/src/tools/custom-tool-adapter.test.js.map +1 -0
- package/dist/src/tools/dispatch-tool.d.ts +52 -0
- package/dist/src/tools/dispatch-tool.js +71 -0
- package/dist/src/tools/dispatch-tool.js.map +1 -0
- package/dist/src/tools/dispatch-tool.test.d.ts +6 -0
- package/dist/src/tools/dispatch-tool.test.js +75 -0
- package/dist/src/tools/dispatch-tool.test.js.map +1 -0
- package/dist/src/tools/mcp-tool-adapter.d.ts +18 -0
- package/dist/src/tools/mcp-tool-adapter.js +135 -0
- package/dist/src/tools/mcp-tool-adapter.js.map +1 -0
- package/dist/src/tools/mcp-tool-adapter.test.d.ts +6 -0
- package/dist/src/tools/mcp-tool-adapter.test.js +227 -0
- package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -0
- package/dist/src/tools/registry.d.ts +25 -0
- package/dist/src/tools/registry.js +72 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/registry.test.d.ts +6 -0
- package/dist/src/tools/registry.test.js +121 -0
- package/dist/src/tools/registry.test.js.map +1 -0
- package/dist/src/tools/request-tool.d.ts +42 -0
- package/dist/src/tools/request-tool.js +190 -0
- package/dist/src/tools/request-tool.js.map +1 -0
- package/dist/src/tools/request-tool.test.d.ts +6 -0
- package/dist/src/tools/request-tool.test.js +254 -0
- package/dist/src/tools/request-tool.test.js.map +1 -0
- package/dist/src/tools/store-tools.d.ts +29 -0
- package/dist/src/tools/store-tools.js +224 -0
- package/dist/src/tools/store-tools.js.map +1 -0
- package/dist/src/tools/store-tools.test.d.ts +6 -0
- package/dist/src/tools/store-tools.test.js +216 -0
- package/dist/src/tools/store-tools.test.js.map +1 -0
- package/dist/src/tools/types.d.ts +111 -0
- package/dist/src/tools/types.js +7 -0
- package/dist/src/tools/types.js.map +1 -0
- package/dist/src/types.d.ts +20 -12
- package/dist/src/types.js +3 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -4
- package/dist/src/__tests__/sse-contract.test.js +0 -464
- package/dist/src/__tests__/sse-contract.test.js.map +0 -1
- package/dist/src/__tests__/tools.test.js +0 -583
- package/dist/src/__tests__/tools.test.js.map +0 -1
- package/dist/src/agent/agent-runner.d.ts +0 -33
- package/dist/src/agent/agent-runner.js +0 -1040
- package/dist/src/agent/agent-runner.js.map +0 -1
- package/dist/src/agent/custom-tools-e2e.test.d.ts +0 -6
- package/dist/src/agent/custom-tools-e2e.test.js +0 -566
- package/dist/src/agent/custom-tools-e2e.test.js.map +0 -1
- package/dist/src/agent/request-helper.d.ts +0 -16
- package/dist/src/agent/request-helper.js +0 -96
- package/dist/src/agent/request-helper.js.map +0 -1
- package/dist/src/agent/stores-e2e.test.js +0 -433
- package/dist/src/agent/stores-e2e.test.js.map +0 -1
- package/dist/src/agent/tool-context-builder.d.ts +0 -11
- package/dist/src/agent/tool-context-builder.js +0 -102
- package/dist/src/agent/tool-context-builder.js.map +0 -1
- package/dist/src/agent/tool-context-builder.test.d.ts +0 -6
- package/dist/src/agent/tool-context-builder.test.js +0 -152
- package/dist/src/agent/tool-context-builder.test.js.map +0 -1
- package/dist/src/agent/write-repo-file.test.js +0 -270
- package/dist/src/agent/write-repo-file.test.js.map +0 -1
- package/dist/src/cron/heartbeat-runner.d.ts +0 -21
- package/dist/src/cron/heartbeat-runner.js +0 -79
- package/dist/src/cron/heartbeat-runner.js.map +0 -1
- package/dist/src/cron/heartbeat-runner.test.d.ts +0 -6
- package/dist/src/cron/heartbeat-runner.test.js +0 -120
- package/dist/src/cron/heartbeat-runner.test.js.map +0 -1
- package/dist/src/cron/heartbeat-scheduler.d.ts +0 -26
- package/dist/src/cron/heartbeat-scheduler.js +0 -55
- package/dist/src/cron/heartbeat-scheduler.js.map +0 -1
- package/dist/src/cron/heartbeat-scheduler.test.d.ts +0 -6
- package/dist/src/cron/heartbeat-scheduler.test.js +0 -61
- package/dist/src/cron/heartbeat-scheduler.test.js.map +0 -1
- package/dist/src/routes/ai-stream.test.d.ts +0 -6
- package/dist/src/routes/ai-stream.test.js +0 -586
- package/dist/src/routes/ai-stream.test.js.map +0 -1
- package/dist/src/routes/ask-user-response.d.ts +0 -30
- package/dist/src/routes/ask-user-response.js +0 -61
- package/dist/src/routes/ask-user-response.js.map +0 -1
- package/dist/src/routes/ask-user-response.test.d.ts +0 -6
- package/dist/src/routes/ask-user-response.test.js +0 -88
- package/dist/src/routes/ask-user-response.test.js.map +0 -1
- package/dist/src/routes/chat-stream.test.d.ts +0 -6
- package/dist/src/routes/chat-stream.test.js +0 -155
- package/dist/src/routes/chat-stream.test.js.map +0 -1
- package/dist/src/routes/chat.test.d.ts +0 -6
- package/dist/src/routes/chat.test.js +0 -99
- package/dist/src/routes/chat.test.js.map +0 -1
- package/dist/src/routes/widget-actions.d.ts +0 -49
- package/dist/src/routes/widget-actions.js +0 -78
- package/dist/src/routes/widget-actions.js.map +0 -1
- package/dist/src/session/custom-tool-adapter.d.ts +0 -74
- package/dist/src/session/custom-tool-adapter.js +0 -180
- package/dist/src/session/custom-tool-adapter.js.map +0 -1
- package/dist/src/session/history-converter.d.ts +0 -21
- package/dist/src/session/history-converter.js +0 -59
- package/dist/src/session/history-converter.js.map +0 -1
- package/dist/src/session/history-converter.test.d.ts +0 -6
- package/dist/src/session/history-converter.test.js +0 -130
- package/dist/src/session/history-converter.test.js.map +0 -1
- package/dist/src/session/session-manager.d.ts +0 -219
- package/dist/src/session/session-manager.js +0 -915
- package/dist/src/session/session-manager.js.map +0 -1
- package/dist/src/session/session-manager.test.d.ts +0 -6
- package/dist/src/session/session-manager.test.js +0 -455
- package/dist/src/session/session-manager.test.js.map +0 -1
- package/dist/src/session/session-runner.d.ts +0 -45
- package/dist/src/session/session-runner.js +0 -719
- package/dist/src/session/session-runner.js.map +0 -1
- package/dist/src/session/session-runner.test.d.ts +0 -6
- package/dist/src/session/session-runner.test.js +0 -834
- package/dist/src/session/session-runner.test.js.map +0 -1
- /package/dist/src/{__tests__/sse-contract.test.d.ts → __fixtures__/smoke.test.d.ts} +0 -0
- /package/dist/src/{__tests__/tools.test.d.ts → agent/loop.test.d.ts} +0 -0
- /package/dist/src/{agent/write-repo-file.test.d.ts → context/compiler.test.d.ts} +0 -0
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
+
/**
|
|
7
|
+
* Snapshot server.
|
|
8
|
+
*
|
|
9
|
+
* Creates an Express server from an immutable deploy snapshot. Used for
|
|
10
|
+
* local testing before deploying to the platform.
|
|
11
|
+
*/
|
|
6
12
|
import express from 'express';
|
|
7
13
|
import { loadSnapshotFromFile, snapshotToBundle } from '@amodalai/core';
|
|
8
|
-
import {
|
|
14
|
+
import { StandaloneSessionManager } from '../session/manager.js';
|
|
15
|
+
import { buildSessionComponents } from '../session/session-builder.js';
|
|
9
16
|
import { LocalToolExecutor } from './tool-executor-local.js';
|
|
10
17
|
import { createChatStreamRouter } from '../routes/chat-stream.js';
|
|
11
18
|
import { createTaskRouter } from './routes/task.js';
|
|
12
19
|
import { errorHandler } from '../middleware/error-handler.js';
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
* Creates an Express server that runs from an immutable deploy snapshot.
|
|
16
|
-
*
|
|
17
|
-
* This is the local testing path: the CLI builds a snapshot and tests it
|
|
18
|
-
* locally before deploying to the platform.
|
|
19
|
-
*/
|
|
20
|
+
import { ConfigError } from '../errors.js';
|
|
21
|
+
import { log, createLogger } from '../logger.js';
|
|
20
22
|
export async function createSnapshotServer(config) {
|
|
21
23
|
let bundle;
|
|
22
24
|
let deployId;
|
|
@@ -34,26 +36,44 @@ export async function createSnapshotServer(config) {
|
|
|
34
36
|
deployId = snapshot.deployId;
|
|
35
37
|
}
|
|
36
38
|
else {
|
|
37
|
-
throw new
|
|
39
|
+
throw new ConfigError('One of snapshotPath, snapshot, or bundle must be provided', { key: 'snapshotSource' });
|
|
38
40
|
}
|
|
39
|
-
// Set up tool executor — use injected executor if provided, otherwise local
|
|
40
41
|
let toolExecutor = config.toolExecutor;
|
|
41
42
|
if (!toolExecutor && bundle.tools.length > 0) {
|
|
42
43
|
toolExecutor = new LocalToolExecutor();
|
|
43
44
|
}
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
interactive: false,
|
|
48
|
-
noBrowser: true,
|
|
49
|
-
cwd: process.cwd(),
|
|
50
|
-
targetDir: process.cwd(),
|
|
51
|
-
},
|
|
45
|
+
const sessionLogger = createLogger({ component: 'snapshot-session' });
|
|
46
|
+
const sessionManager = new StandaloneSessionManager({
|
|
47
|
+
logger: sessionLogger,
|
|
52
48
|
ttlMs: config.sessionTtlMs,
|
|
53
|
-
bundle,
|
|
54
|
-
toolExecutor,
|
|
55
|
-
shellExecutor: config.shellExecutor,
|
|
56
49
|
});
|
|
50
|
+
sessionManager.start();
|
|
51
|
+
const shared = {
|
|
52
|
+
storeBackend: null,
|
|
53
|
+
mcpManager: null,
|
|
54
|
+
logger: log,
|
|
55
|
+
toolExecutor,
|
|
56
|
+
};
|
|
57
|
+
const createTaskSession = () => {
|
|
58
|
+
const components = buildSessionComponents({
|
|
59
|
+
bundle,
|
|
60
|
+
storeBackend: null,
|
|
61
|
+
mcpManager: null,
|
|
62
|
+
logger: log,
|
|
63
|
+
toolExecutor,
|
|
64
|
+
});
|
|
65
|
+
const session = sessionManager.create({
|
|
66
|
+
tenantId: 'snapshot',
|
|
67
|
+
userId: 'snapshot',
|
|
68
|
+
provider: components.provider,
|
|
69
|
+
toolRegistry: components.toolRegistry,
|
|
70
|
+
permissionChecker: components.permissionChecker,
|
|
71
|
+
systemPrompt: components.systemPrompt,
|
|
72
|
+
userRoles: components.userRoles,
|
|
73
|
+
toolContextFactory: components.toolContextFactory,
|
|
74
|
+
});
|
|
75
|
+
return { session, toolContextFactory: components.toolContextFactory };
|
|
76
|
+
};
|
|
57
77
|
const app = express();
|
|
58
78
|
// CORS
|
|
59
79
|
const corsOrigin = config.corsOrigin ?? '*';
|
|
@@ -83,8 +103,12 @@ export async function createSnapshotServer(config) {
|
|
|
83
103
|
});
|
|
84
104
|
});
|
|
85
105
|
// Routes
|
|
86
|
-
app.use(createChatStreamRouter({
|
|
87
|
-
|
|
106
|
+
app.use(createChatStreamRouter({
|
|
107
|
+
sessionManager,
|
|
108
|
+
bundleResolver: { staticBundle: bundle },
|
|
109
|
+
shared,
|
|
110
|
+
}));
|
|
111
|
+
app.use(createTaskRouter({ sessionManager, createTaskSession }));
|
|
88
112
|
// Error handler (must be last)
|
|
89
113
|
app.use(errorHandler);
|
|
90
114
|
let server = null;
|
|
@@ -95,8 +119,7 @@ export async function createSnapshotServer(config) {
|
|
|
95
119
|
async start() {
|
|
96
120
|
return new Promise((resolve) => {
|
|
97
121
|
const httpServer = app.listen(port, host, () => {
|
|
98
|
-
log.info(
|
|
99
|
-
log.info(`Deploy: ${deployId}, Agent: ${bundle.config.name}`);
|
|
122
|
+
log.info('snapshot_server_started', { host, port, deployId, agent: bundle.config.name });
|
|
100
123
|
resolve(httpServer);
|
|
101
124
|
});
|
|
102
125
|
server = httpServer;
|
|
@@ -116,7 +139,7 @@ export async function createSnapshotServer(config) {
|
|
|
116
139
|
server = null;
|
|
117
140
|
}
|
|
118
141
|
await sessionManager.shutdown();
|
|
119
|
-
log.info('
|
|
142
|
+
log.info('snapshot_server_stopped', {});
|
|
120
143
|
},
|
|
121
144
|
};
|
|
122
145
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-server.js","sourceRoot":"","sources":["../../../src/agent/snapshot-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAC,oBAAoB,EAAE,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"snapshot-server.js","sourceRoot":"","sources":["../../../src/agent/snapshot-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { CompactingState, AgentContext, TransitionResult } from '../loop-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Handle the COMPACTING state.
|
|
9
|
+
*
|
|
10
|
+
* Splits messages into "old" (to be summarized) and "recent" (kept verbatim).
|
|
11
|
+
* Calls generateText with a cheap model to produce a structured summary.
|
|
12
|
+
* Replaces old messages with a single summary message.
|
|
13
|
+
*/
|
|
14
|
+
export declare function handleCompacting(state: CompactingState, ctx: AgentContext): Promise<TransitionResult>;
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* COMPACTING state handler.
|
|
8
|
+
*
|
|
9
|
+
* Summarizes older conversation turns to free context space:
|
|
10
|
+
* 1. Keep the last N turns verbatim (active conversation)
|
|
11
|
+
* 2. Send older turns to a cheap model for structured summarization
|
|
12
|
+
* 3. Replace old turns with the summary
|
|
13
|
+
* 4. Circuit breaker: after N consecutive failures, give up and continue
|
|
14
|
+
*
|
|
15
|
+
* The summary is structured as a handoff document with sections for
|
|
16
|
+
* current state, original task, key data, actions taken, errors, and
|
|
17
|
+
* next steps. This preserves the information the agent needs to
|
|
18
|
+
* continue working without the full conversation history.
|
|
19
|
+
*/
|
|
20
|
+
import { SSEEventType } from '../../types.js';
|
|
21
|
+
import { CompactionError } from '../../errors.js';
|
|
22
|
+
import { estimateTokenCount } from '../token-estimate.js';
|
|
23
|
+
/** Prefix for the summary message injected after compaction. */
|
|
24
|
+
const COMPACTION_SUMMARY_PREFIX = '[Conversation Summary — older messages compacted]';
|
|
25
|
+
/** Timeout for the compaction generateText call (30 seconds). */
|
|
26
|
+
const COMPACTION_TIMEOUT_MS = 30_000;
|
|
27
|
+
const COMPACTION_PROMPT = `Summarize this conversation as a structured handoff into these sections:
|
|
28
|
+
|
|
29
|
+
1. **Current State** — what we're working on right now
|
|
30
|
+
2. **Original Task** — what the user originally asked for
|
|
31
|
+
3. **Key Data** — important values, IDs, file paths, or facts that must be preserved
|
|
32
|
+
4. **Actions Taken** — tools called and what they returned (summarized, not verbatim)
|
|
33
|
+
5. **Errors & Corrections** — what went wrong and what we tried instead
|
|
34
|
+
6. **Next Steps** — what should happen next
|
|
35
|
+
|
|
36
|
+
Keep each section under 500 tokens. Focus on information the agent needs to continue working. Omit sections that have no content.`;
|
|
37
|
+
/**
|
|
38
|
+
* Handle the COMPACTING state.
|
|
39
|
+
*
|
|
40
|
+
* Splits messages into "old" (to be summarized) and "recent" (kept verbatim).
|
|
41
|
+
* Calls generateText with a cheap model to produce a structured summary.
|
|
42
|
+
* Replaces old messages with a single summary message.
|
|
43
|
+
*/
|
|
44
|
+
export async function handleCompacting(state, ctx) {
|
|
45
|
+
const effects = [];
|
|
46
|
+
const { keepRecentTurns, maxSummaryTokens, compactionCircuitBreaker } = ctx.config;
|
|
47
|
+
// Circuit breaker — if we've failed too many times, skip compaction
|
|
48
|
+
if (ctx.compactionFailures >= compactionCircuitBreaker) {
|
|
49
|
+
ctx.logger.warn('compaction_circuit_breaker', {
|
|
50
|
+
session: ctx.sessionId,
|
|
51
|
+
failures: ctx.compactionFailures,
|
|
52
|
+
threshold: compactionCircuitBreaker,
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
next: { type: 'thinking', messages: state.messages },
|
|
56
|
+
effects,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Split messages: keep last N turns verbatim, summarize the rest.
|
|
60
|
+
// A "turn" is a user message + assistant response (+ any tool results).
|
|
61
|
+
// We count from the end by counting user messages.
|
|
62
|
+
const splitIndex = findSplitIndex(state.messages, keepRecentTurns);
|
|
63
|
+
if (splitIndex <= 0) {
|
|
64
|
+
// Not enough messages to compact — nothing older than the recent window
|
|
65
|
+
ctx.logger.debug('compaction_skipped_too_few', {
|
|
66
|
+
session: ctx.sessionId,
|
|
67
|
+
messageCount: state.messages.length,
|
|
68
|
+
keepRecentTurns,
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
next: { type: 'thinking', messages: state.messages },
|
|
72
|
+
effects,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const oldMessages = state.messages.slice(0, splitIndex);
|
|
76
|
+
const recentMessages = state.messages.slice(splitIndex);
|
|
77
|
+
const tokensBefore = state.estimatedTokens;
|
|
78
|
+
effects.push({
|
|
79
|
+
type: SSEEventType.CompactionStart,
|
|
80
|
+
estimated_tokens: tokensBefore,
|
|
81
|
+
threshold: ctx.config.compactThreshold,
|
|
82
|
+
timestamp: new Date().toISOString(),
|
|
83
|
+
});
|
|
84
|
+
ctx.logger.info('compaction_start', {
|
|
85
|
+
session: ctx.sessionId,
|
|
86
|
+
totalMessages: state.messages.length,
|
|
87
|
+
oldMessages: oldMessages.length,
|
|
88
|
+
recentMessages: recentMessages.length,
|
|
89
|
+
tokensBefore,
|
|
90
|
+
});
|
|
91
|
+
const summaryResult = await summarizeMessages(oldMessages, ctx, maxSummaryTokens);
|
|
92
|
+
if (!summaryResult.ok) {
|
|
93
|
+
ctx.compactionFailures++;
|
|
94
|
+
ctx.logger.error('compaction_failed', {
|
|
95
|
+
session: ctx.sessionId,
|
|
96
|
+
error: summaryResult.error.message,
|
|
97
|
+
failure: ctx.compactionFailures,
|
|
98
|
+
circuitBreakerAt: compactionCircuitBreaker,
|
|
99
|
+
});
|
|
100
|
+
// Continue without compaction — the agent can still work, just with
|
|
101
|
+
// a fuller context. Better than crashing the loop.
|
|
102
|
+
return {
|
|
103
|
+
next: { type: 'thinking', messages: state.messages },
|
|
104
|
+
effects,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Build the compacted message list: summary + recent turns.
|
|
108
|
+
// Uses 'system' role — this is context injected by the runtime, not user input.
|
|
109
|
+
const summaryMessage = {
|
|
110
|
+
role: 'system',
|
|
111
|
+
content: `${COMPACTION_SUMMARY_PREFIX}\n\n${summaryResult.value.text}`,
|
|
112
|
+
};
|
|
113
|
+
const compactedMessages = [summaryMessage, ...recentMessages];
|
|
114
|
+
// Update context
|
|
115
|
+
ctx.messages = compactedMessages;
|
|
116
|
+
ctx.compactionFailures = 0; // Reset circuit breaker on success
|
|
117
|
+
const tokensAfter = estimateTokenCount(compactedMessages);
|
|
118
|
+
const compactionTokens = summaryResult.value.usage.inputTokens + summaryResult.value.usage.outputTokens;
|
|
119
|
+
ctx.logger.info('compaction_end', {
|
|
120
|
+
session: ctx.sessionId,
|
|
121
|
+
tokensBefore,
|
|
122
|
+
tokensAfter,
|
|
123
|
+
messagesBefore: state.messages.length,
|
|
124
|
+
messagesAfter: compactedMessages.length,
|
|
125
|
+
});
|
|
126
|
+
effects.push({
|
|
127
|
+
type: SSEEventType.CompactionEnd,
|
|
128
|
+
tokens_before: tokensBefore,
|
|
129
|
+
tokens_after: tokensAfter,
|
|
130
|
+
compaction_tokens: compactionTokens,
|
|
131
|
+
timestamp: new Date().toISOString(),
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
next: { type: 'thinking', messages: compactedMessages },
|
|
135
|
+
effects,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Summarize old messages using generateText.
|
|
140
|
+
* Returns Result to avoid try/catch in the caller.
|
|
141
|
+
*/
|
|
142
|
+
async function summarizeMessages(messages, ctx, maxSummaryTokens) {
|
|
143
|
+
// Serialize old messages into a readable conversation format
|
|
144
|
+
const conversationText = messagesToText(messages);
|
|
145
|
+
// Per-call timeout composed with session abort signal — prevents a hung
|
|
146
|
+
// provider from blocking the loop until session-level abort.
|
|
147
|
+
const timeoutSignal = AbortSignal.timeout(COMPACTION_TIMEOUT_MS);
|
|
148
|
+
const combinedSignal = AbortSignal.any([ctx.signal, timeoutSignal]);
|
|
149
|
+
try {
|
|
150
|
+
const result = await ctx.provider.generateText({
|
|
151
|
+
messages: [
|
|
152
|
+
{ role: 'user', content: `Here is a conversation to summarize:\n\n${conversationText}` },
|
|
153
|
+
],
|
|
154
|
+
system: COMPACTION_PROMPT,
|
|
155
|
+
maxOutputTokens: maxSummaryTokens,
|
|
156
|
+
abortSignal: combinedSignal,
|
|
157
|
+
});
|
|
158
|
+
// Track compaction token usage
|
|
159
|
+
ctx.usage.inputTokens += result.usage.inputTokens;
|
|
160
|
+
ctx.usage.outputTokens += result.usage.outputTokens;
|
|
161
|
+
ctx.usage.totalTokens += result.usage.inputTokens + result.usage.outputTokens;
|
|
162
|
+
if (!result.text || result.text.trim().length === 0) {
|
|
163
|
+
return {
|
|
164
|
+
ok: false,
|
|
165
|
+
error: new CompactionError('Summarization returned empty text', {
|
|
166
|
+
stage: 'summarize',
|
|
167
|
+
context: { messageCount: messages.length },
|
|
168
|
+
}),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
ok: true,
|
|
173
|
+
value: {
|
|
174
|
+
text: result.text,
|
|
175
|
+
usage: { inputTokens: result.usage.inputTokens, outputTokens: result.usage.outputTokens },
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
// Specific expected failure with specific handling (reason #3):
|
|
181
|
+
// Provider errors during compaction are non-fatal — the caller degrades
|
|
182
|
+
// gracefully by continuing without compaction.
|
|
183
|
+
return {
|
|
184
|
+
ok: false,
|
|
185
|
+
error: new CompactionError(`Summarization failed: ${err instanceof Error ? err.message : String(err)}`, { stage: 'summarize', cause: err, context: { messageCount: messages.length } }),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Convert messages to a readable text format for the summarizer.
|
|
191
|
+
*/
|
|
192
|
+
function messagesToText(messages) {
|
|
193
|
+
const lines = [];
|
|
194
|
+
for (const msg of messages) {
|
|
195
|
+
const role = msg.role.toUpperCase();
|
|
196
|
+
if (typeof msg.content === 'string') {
|
|
197
|
+
lines.push(`${role}: ${msg.content}`);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (!Array.isArray(msg.content))
|
|
201
|
+
continue;
|
|
202
|
+
for (const part of msg.content) {
|
|
203
|
+
if (!('type' in part))
|
|
204
|
+
continue;
|
|
205
|
+
if (part.type === 'text' && 'text' in part) {
|
|
206
|
+
lines.push(`${role}: ${part.text}`);
|
|
207
|
+
}
|
|
208
|
+
else if (part.type === 'tool-call' && 'toolName' in part) {
|
|
209
|
+
const args = 'input' in part ? JSON.stringify(part.input) : '{}';
|
|
210
|
+
lines.push(`${role} [tool_call: ${part.toolName}(${args})]`);
|
|
211
|
+
}
|
|
212
|
+
else if (part.type === 'tool-result' && 'output' in part) {
|
|
213
|
+
const output = extractToolResultText(part.output);
|
|
214
|
+
// Truncate long tool results for the summarizer — it doesn't need 20K
|
|
215
|
+
const truncated = output.length > 2_000
|
|
216
|
+
? output.slice(0, 2_000) + '... [truncated for summarization]'
|
|
217
|
+
: output;
|
|
218
|
+
lines.push(`TOOL_RESULT: ${truncated}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return lines.join('\n');
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Extract text from a tool result output field.
|
|
226
|
+
*/
|
|
227
|
+
function extractToolResultText(output) {
|
|
228
|
+
if (typeof output === 'string')
|
|
229
|
+
return output;
|
|
230
|
+
if (typeof output === 'object' && output !== null && 'value' in output) {
|
|
231
|
+
// `in` narrows to `object & Record<'value', unknown>` — safe to access
|
|
232
|
+
return String(output.value);
|
|
233
|
+
}
|
|
234
|
+
return JSON.stringify(output);
|
|
235
|
+
}
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
// Helpers
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
/**
|
|
240
|
+
* Find the index to split messages: everything before this index gets
|
|
241
|
+
* summarized, everything at or after is kept verbatim.
|
|
242
|
+
*
|
|
243
|
+
* Counts user messages from the end to find `keepTurns` turn boundaries.
|
|
244
|
+
*/
|
|
245
|
+
function findSplitIndex(messages, keepTurns) {
|
|
246
|
+
let userMessagesSeen = 0;
|
|
247
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
248
|
+
if (messages[i].role === 'user') {
|
|
249
|
+
userMessagesSeen++;
|
|
250
|
+
if (userMessagesSeen >= keepTurns) {
|
|
251
|
+
return i;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Not enough turns to split — return 0 (don't compact)
|
|
256
|
+
return 0;
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=compacting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compacting.js","sourceRoot":"","sources":["../../../../src/agent/states/compacting.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAG5C,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAOhD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAExD,gEAAgE;AAChE,MAAM,yBAAyB,GAAG,mDAAmD,CAAC;AAEtF,iEAAiE;AACjE,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAErC,MAAM,iBAAiB,GAAG;;;;;;;;;kIASwG,CAAC;AAEnI;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAsB,EACtB,GAAiB;IAEjB,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,EAAC,eAAe,EAAE,gBAAgB,EAAE,wBAAwB,EAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAEjF,oEAAoE;IACpE,IAAI,GAAG,CAAC,kBAAkB,IAAI,wBAAwB,EAAE,CAAC;QACvD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;YAC5C,OAAO,EAAE,GAAG,CAAC,SAAS;YACtB,QAAQ,EAAE,GAAG,CAAC,kBAAkB;YAChC,SAAS,EAAE,wBAAwB;SACpC,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAC;YAClD,OAAO;SACR,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,wEAAwE;IACxE,mDAAmD;IACnD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAEnE,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACpB,wEAAwE;QACxE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;YAC7C,OAAO,EAAE,GAAG,CAAC,SAAS;YACtB,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;YACnC,eAAe;SAChB,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAC;YAClD,OAAO;SACR,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,CAAC;IAE3C,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,YAAY,CAAC,eAAe;QAClC,gBAAgB,EAAE,YAAY;QAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB;QACtC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAClC,OAAO,EAAE,GAAG,CAAC,SAAS;QACtB,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QACpC,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,cAAc,EAAE,cAAc,CAAC,MAAM;QACrC,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAElF,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;QACtB,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE;YACpC,OAAO,EAAE,GAAG,CAAC,SAAS;YACtB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO;YAClC,OAAO,EAAE,GAAG,CAAC,kBAAkB;YAC/B,gBAAgB,EAAE,wBAAwB;SAC3C,CAAC,CAAC;QACH,oEAAoE;QACpE,mDAAmD;QACnD,OAAO;YACL,IAAI,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAC;YAClD,OAAO;SACR,CAAC;IACJ,CAAC;IAED,4DAA4D;IAC5D,gFAAgF;IAChF,MAAM,cAAc,GAAiB;QACnC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG,yBAAyB,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE;KACvE,CAAC;IACF,MAAM,iBAAiB,GAAG,CAAC,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC;IAE9D,iBAAiB;IACjB,GAAG,CAAC,QAAQ,GAAG,iBAAiB,CAAC;IACjC,GAAG,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,mCAAmC;IAE/D,MAAM,WAAW,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;IAExG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;QAChC,OAAO,EAAE,GAAG,CAAC,SAAS;QACtB,YAAY;QACZ,WAAW;QACX,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QACrC,aAAa,EAAE,iBAAiB,CAAC,MAAM;KACxC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,YAAY,CAAC,aAAa;QAChC,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,WAAW;QACzB,iBAAiB,EAAE,gBAAgB;QACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAC;QACrD,OAAO;KACR,CAAC;AACJ,CAAC;AAWD;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAC9B,QAAwB,EACxB,GAAiB,EACjB,gBAAwB;IAExB,6DAA6D;IAC7D,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAElD,wEAAwE;IACxE,6DAA6D;IAC7D,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC7C,QAAQ,EAAE;gBACR,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,2CAA2C,gBAAgB,EAAE,EAAC;aACvF;YACD,MAAM,EAAE,iBAAiB;YACzB,eAAe,EAAE,gBAAgB;YACjC,WAAW,EAAE,cAAc;SAC5B,CAAC,CAAC;QAEH,+BAA+B;QAC/B,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;QACpD,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;QAE9E,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,eAAe,CAAC,mCAAmC,EAAE;oBAC9D,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,EAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAC;iBACzC,CAAC;aACH,CAAC;QACJ,CAAC;QAED,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,EAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAC;aACxF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gEAAgE;QAChE,wEAAwE;QACxE,+CAA+C;QAC/C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI,eAAe,CACxB,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC3E,EAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAC,EAAC,CAC3E;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAwB;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAEpC,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACtC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAE1C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;gBAAE,SAAS;YAEhC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;gBAC3D,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,gBAAgB,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,CAAC;YAC/D,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC3D,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClD,sEAAsE;gBACtE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;oBACrC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,mCAAmC;oBAC9D,CAAC,CAAC,MAAM,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAe;IAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACvE,uEAAuE;QACvE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,cAAc,CAAC,QAAwB,EAAE,SAAiB;IACjE,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,gBAAgB,EAAE,CAAC;YACnB,IAAI,gBAAgB,IAAI,SAAS,EAAE,CAAC;gBAClC,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { ConfirmingState, AgentContext, TransitionResult } from '../loop-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Handle the CONFIRMING state.
|
|
9
|
+
*/
|
|
10
|
+
export declare function handleConfirming(state: ConfirmingState, ctx: AgentContext): Promise<TransitionResult>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* CONFIRMING state handler.
|
|
8
|
+
*
|
|
9
|
+
* Waits for user confirmation on a tool call (via ctx.waitForConfirmation).
|
|
10
|
+
* - Approved → resume EXECUTING with the confirmed call
|
|
11
|
+
* - Denied → tell the model the tool call was denied, back to THINKING
|
|
12
|
+
*/
|
|
13
|
+
import { SSEEventType } from '../../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Handle the CONFIRMING state.
|
|
16
|
+
*/
|
|
17
|
+
export async function handleConfirming(state, ctx) {
|
|
18
|
+
const effects = [];
|
|
19
|
+
ctx.logger.info('tool_confirmation_waiting', {
|
|
20
|
+
tool: state.call.toolName,
|
|
21
|
+
callId: state.call.toolCallId,
|
|
22
|
+
session: ctx.sessionId,
|
|
23
|
+
});
|
|
24
|
+
// Race confirmation against a timeout — don't hang forever if user never responds
|
|
25
|
+
const timeoutMs = ctx.config.confirmationTimeoutMs;
|
|
26
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
27
|
+
setTimeout(() => resolve(false), timeoutMs);
|
|
28
|
+
});
|
|
29
|
+
const approved = await Promise.race([
|
|
30
|
+
ctx.waitForConfirmation(state.call.toolCallId),
|
|
31
|
+
timeoutPromise,
|
|
32
|
+
]);
|
|
33
|
+
if (approved) {
|
|
34
|
+
ctx.logger.info('tool_confirmation_approved', {
|
|
35
|
+
tool: state.call.toolName,
|
|
36
|
+
callId: state.call.toolCallId,
|
|
37
|
+
session: ctx.sessionId,
|
|
38
|
+
});
|
|
39
|
+
effects.push({
|
|
40
|
+
type: SSEEventType.Approved,
|
|
41
|
+
resource_type: 'tool_call',
|
|
42
|
+
preview_id: state.call.toolCallId,
|
|
43
|
+
timestamp: new Date().toISOString(),
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
next: {
|
|
47
|
+
type: 'executing',
|
|
48
|
+
queue: state.remainingQueue,
|
|
49
|
+
current: state.call,
|
|
50
|
+
results: [],
|
|
51
|
+
},
|
|
52
|
+
effects,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// Denied — inject a tool result message telling the model
|
|
56
|
+
ctx.logger.info('tool_confirmation_denied', {
|
|
57
|
+
tool: state.call.toolName,
|
|
58
|
+
callId: state.call.toolCallId,
|
|
59
|
+
session: ctx.sessionId,
|
|
60
|
+
});
|
|
61
|
+
const denialMessage = {
|
|
62
|
+
role: 'tool',
|
|
63
|
+
content: [{
|
|
64
|
+
type: 'tool-result',
|
|
65
|
+
toolCallId: state.call.toolCallId,
|
|
66
|
+
toolName: state.call.toolName,
|
|
67
|
+
output: { type: 'text', value: 'Tool call denied by user. Do not retry this action without asking the user first.' },
|
|
68
|
+
}],
|
|
69
|
+
};
|
|
70
|
+
ctx.messages = [...ctx.messages, denialMessage];
|
|
71
|
+
return {
|
|
72
|
+
next: { type: 'thinking', messages: ctx.messages },
|
|
73
|
+
effects,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=confirming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirming.js","sourceRoot":"","sources":["../../../../src/agent/states/confirming.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AAEH,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAQ5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAsB,EACtB,GAAiB;IAEjB,MAAM,OAAO,GAAe,EAAE,CAAC;IAE/B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;QAC3C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;QACzB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU;QAC7B,OAAO,EAAE,GAAG,CAAC,SAAS;KACvB,CAAC,CAAC;IAEH,kFAAkF;IAClF,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC;IACnD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,EAAE;QACpD,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;QAClC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;QAC9C,cAAc;KACf,CAAC,CAAC;IAEH,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;YAC5C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;YACzB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU;YAC7B,OAAO,EAAE,GAAG,CAAC,SAAS;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,YAAY,CAAC,QAAQ;YAC3B,aAAa,EAAE,WAAW;YAC1B,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU;YACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE;gBACJ,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,KAAK,CAAC,cAAc;gBAC3B,OAAO,EAAE,KAAK,CAAC,IAAI;gBACnB,OAAO,EAAE,EAAE;aACZ;YACD,OAAO;SACR,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;QAC1C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;QACzB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU;QAC7B,OAAO,EAAE,GAAG,CAAC,SAAS;KACvB,CAAC,CAAC;IAEH,MAAM,aAAa,GAA8B;QAC/C,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,aAAsB;gBAC5B,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU;gBACjC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;gBAC7B,MAAM,EAAE,EAAC,IAAI,EAAE,MAAe,EAAE,KAAK,EAAE,mFAAmF,EAAC;aAC5H,CAAC;KACH,CAAC;IAEF,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEhD,OAAO;QACL,IAAI,EAAE,EAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAC;QAChD,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { DispatchingState, AgentContext, TransitionResult } from '../loop-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Handle the DISPATCHING state — run a child agent loop.
|
|
9
|
+
*
|
|
10
|
+
* Creates a child AgentContext with:
|
|
11
|
+
* - Same provider, logger, signal, tenant, user, permission checker
|
|
12
|
+
* - Tool registry subset (only the requested tools, never dispatch_task)
|
|
13
|
+
* - Same buildToolContext factory (child shares parent's connections/stores)
|
|
14
|
+
* - Reduced maxTurns (default 10) and maxContextTokens
|
|
15
|
+
* - Fresh messages (dispatch prompt as user message)
|
|
16
|
+
* - Fresh usage counters (merged back to parent after completion)
|
|
17
|
+
*/
|
|
18
|
+
export declare function handleDispatching(state: DispatchingState, ctx: AgentContext): Promise<TransitionResult>;
|