@amodalai/runtime 0.1.26 → 0.2.1
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 +88 -0
- package/dist/src/__fixtures__/e2e.test.js +211 -0
- package/dist/src/__fixtures__/e2e.test.js.map +1 -0
- package/dist/src/__fixtures__/smoke-agent/amodal.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/automations/delivery-callback-test.json +9 -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 +1404 -0
- package/dist/src/__fixtures__/smoke.test.js.map +1 -0
- package/dist/src/__fixtures__/test-env.d.ts +27 -0
- package/dist/src/__fixtures__/test-env.js +64 -0
- package/dist/src/__fixtures__/test-env.js.map +1 -0
- package/dist/src/__fixtures__/test-helpers.d.ts +30 -0
- package/dist/src/__fixtures__/test-helpers.js +120 -0
- package/dist/src/__fixtures__/test-helpers.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/agent-types.d.ts +22 -0
- package/dist/src/agent/agent-types.js.map +1 -1
- package/dist/src/agent/automation-bridge.d.ts +9 -0
- package/dist/src/agent/automation-bridge.js +26 -0
- package/dist/src/agent/automation-bridge.js.map +1 -1
- package/dist/src/agent/automation-bridge.test.js +63 -0
- package/dist/src/agent/automation-bridge.test.js.map +1 -1
- package/dist/src/agent/local-server.d.ts +1 -8
- package/dist/src/agent/local-server.js +398 -163
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/local-server.test.js +14 -8
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/loop-types.d.ts +254 -0
- package/dist/src/agent/loop-types.js +24 -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 +152 -0
- package/dist/src/agent/loop.js.map +1 -0
- package/dist/src/agent/loop.test.js +1594 -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/delivery-router.d.ts +68 -0
- package/dist/src/agent/proactive/delivery-router.js +337 -0
- package/dist/src/agent/proactive/delivery-router.js.map +1 -0
- package/dist/src/agent/{stores-e2e.test.d.ts → proactive/delivery-router.test.d.ts} +1 -1
- package/dist/src/agent/proactive/delivery-router.test.js +455 -0
- package/dist/src/agent/proactive/delivery-router.test.js.map +1 -0
- package/dist/src/agent/proactive/proactive-runner.d.ts +46 -8
- package/dist/src/agent/proactive/proactive-runner.js +67 -37
- 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 +73 -87
- package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
- package/dist/src/agent/routes/admin-chat-abort.test.d.ts +6 -0
- package/dist/src/agent/routes/admin-chat-abort.test.js +206 -0
- package/dist/src/agent/routes/admin-chat-abort.test.js.map +1 -0
- package/dist/src/agent/routes/admin-chat.d.ts +15 -3
- package/dist/src/agent/routes/admin-chat.js +61 -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 +68 -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/snapshot-server.d.ts +2 -22
- package/dist/src/agent/snapshot-server.js +48 -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 +260 -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 +79 -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 +285 -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 +452 -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 +169 -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 +450 -0
- package/dist/src/agent/states/thinking.js.map +1 -0
- package/dist/src/agent/token-estimate.d.ts +31 -0
- package/dist/src/agent/token-estimate.js +34 -0
- package/dist/src/agent/token-estimate.js.map +1 -0
- package/dist/src/agent/token-estimate.test.d.ts +6 -0
- package/dist/src/agent/token-estimate.test.js +44 -0
- package/dist/src/agent/token-estimate.test.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 +134 -0
- package/dist/src/api/create-agent.js.map +1 -0
- package/dist/src/api/types.d.ts +66 -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.d.ts +6 -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/env-ref.d.ts +13 -0
- package/dist/src/env-ref.js +31 -0
- package/dist/src/env-ref.js.map +1 -0
- package/dist/src/env-ref.test.d.ts +6 -0
- package/dist/src/env-ref.test.js +34 -0
- package/dist/src/env-ref.test.js.map +1 -0
- package/dist/src/errors.d.ts +15 -0
- package/dist/src/errors.js +22 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/errors.test.js +2 -2
- package/dist/src/errors.test.js.map +1 -1
- package/dist/src/events/event-bus.d.ts +54 -0
- package/dist/src/events/event-bus.js +84 -0
- package/dist/src/events/event-bus.js.map +1 -0
- package/dist/src/events/event-bus.test.d.ts +6 -0
- package/dist/src/events/event-bus.test.js +112 -0
- package/dist/src/events/event-bus.test.js.map +1 -0
- package/dist/src/events/events-route.d.ts +36 -0
- package/dist/src/events/events-route.js +80 -0
- package/dist/src/events/events-route.js.map +1 -0
- package/dist/src/events/events-route.test.d.ts +6 -0
- package/dist/src/events/events-route.test.js +134 -0
- package/dist/src/events/events-route.test.js.map +1 -0
- package/dist/src/events/store-event-wrapper.d.ts +19 -0
- package/dist/src/events/store-event-wrapper.js +57 -0
- package/dist/src/events/store-event-wrapper.js.map +1 -0
- package/dist/src/events/store-event-wrapper.test.d.ts +6 -0
- package/dist/src/events/store-event-wrapper.test.js +91 -0
- package/dist/src/events/store-event-wrapper.test.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/middleware/auth.d.ts +0 -2
- package/dist/src/middleware/auth.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/providers/create-provider.test.d.ts +6 -0
- 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/search-provider.d.ts +64 -0
- package/dist/src/providers/search-provider.js +174 -0
- package/dist/src/providers/search-provider.js.map +1 -0
- package/dist/src/providers/types.d.ts +118 -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 +28 -10
- package/dist/src/routes/ai-stream.js +85 -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 +20 -4
- package/dist/src/routes/chat-stream.js +49 -29
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/routes/chat.d.ts +19 -4
- package/dist/src/routes/chat.js +62 -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 +77 -0
- package/dist/src/routes/session-resolver.js +109 -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 +207 -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 +18 -11
- package/dist/src/server.js +46 -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/drizzle-session-store.d.ts +56 -0
- package/dist/src/session/drizzle-session-store.js +203 -0
- package/dist/src/session/drizzle-session-store.js.map +1 -0
- package/dist/src/session/manager.d.ts +101 -0
- package/dist/src/session/manager.js +394 -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 +309 -0
- package/dist/src/session/manager.test.js.map +1 -0
- package/dist/src/session/pglite-session-store.d.ts +23 -0
- package/dist/src/session/pglite-session-store.js +70 -0
- package/dist/src/session/pglite-session-store.js.map +1 -0
- package/dist/src/session/postgres-session-store.d.ts +44 -0
- package/dist/src/session/postgres-session-store.js +138 -0
- package/dist/src/session/postgres-session-store.js.map +1 -0
- package/dist/src/session/session-builder.d.ts +69 -0
- package/dist/src/session/session-builder.js +384 -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 +350 -0
- package/dist/src/session/session-builder.test.js.map +1 -0
- package/dist/src/session/session-store-selector.d.ts +49 -0
- package/dist/src/session/session-store-selector.js +60 -0
- package/dist/src/session/session-store-selector.js.map +1 -0
- package/dist/src/session/session-store-selector.test.d.ts +6 -0
- package/dist/src/session/session-store-selector.test.js +79 -0
- package/dist/src/session/session-store-selector.test.js.map +1 -0
- package/dist/src/session/store.d.ts +171 -0
- package/dist/src/session/store.js +155 -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 +423 -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 +61 -0
- package/dist/src/session/tool-context-factory.js +189 -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 +284 -0
- package/dist/src/session/tool-context-factory.test.js.map +1 -0
- package/dist/src/session/types.d.ts +195 -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 +457 -0
- package/dist/src/stores/schema.js +59 -0
- package/dist/src/stores/schema.js.map +1 -0
- package/dist/src/tools/admin-file-tools.d.ts +42 -0
- package/dist/src/tools/admin-file-tools.js +714 -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 +521 -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 +243 -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/fetch-url-tool.d.ts +23 -0
- package/dist/src/tools/fetch-url-tool.js +333 -0
- package/dist/src/tools/fetch-url-tool.js.map +1 -0
- package/dist/src/tools/fetch-url-tool.test.d.ts +6 -0
- package/dist/src/tools/fetch-url-tool.test.js +228 -0
- package/dist/src/tools/fetch-url-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 +226 -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 +120 -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 +253 -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 +215 -0
- package/dist/src/tools/store-tools.test.js.map +1 -0
- package/dist/src/tools/types.d.ts +129 -0
- package/dist/src/tools/types.js +7 -0
- package/dist/src/tools/types.js.map +1 -0
- package/dist/src/tools/web-search-tool.d.ts +31 -0
- package/dist/src/tools/web-search-tool.js +170 -0
- package/dist/src/tools/web-search-tool.js.map +1 -0
- package/dist/src/tools/web-search-tool.test.d.ts +6 -0
- package/dist/src/tools/web-search-tool.test.js +153 -0
- package/dist/src/tools/web-search-tool.test.js.map +1 -0
- package/dist/src/tools/web-tools-shared.d.ts +21 -0
- package/dist/src/tools/web-tools-shared.js +32 -0
- package/dist/src/tools/web-tools-shared.js.map +1 -0
- package/dist/src/types.d.ts +40 -12
- package/dist/src/types.js +16 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -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/session-store.d.ts +0 -62
- package/dist/src/agent/session-store.js +0 -151
- package/dist/src/agent/session-store.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/admin-file-tools.d.ts +0 -136
- package/dist/src/session/admin-file-tools.js +0 -240
- package/dist/src/session/admin-file-tools.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__/e2e.test.d.ts} +0 -0
- /package/dist/src/{__tests__/tools.test.d.ts → __fixtures__/smoke.test.d.ts} +0 -0
- /package/dist/src/agent/{write-repo-file.test.d.ts → loop.test.d.ts} +0 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* STREAMING state handler.
|
|
8
|
+
*
|
|
9
|
+
* Consumes the provider's fullStream, emits text deltas to the client,
|
|
10
|
+
* collects tool calls, and tracks token usage. Pre-executes read-only
|
|
11
|
+
* tools while the LLM might still be generating.
|
|
12
|
+
*
|
|
13
|
+
* Transitions:
|
|
14
|
+
* - No tool calls → DONE (model_stop)
|
|
15
|
+
* - Tool calls collected → EXECUTING
|
|
16
|
+
* - Stream error → DONE (error)
|
|
17
|
+
*/
|
|
18
|
+
import { SSEEventType } from '../../types.js';
|
|
19
|
+
import { executeTool } from './executing.js';
|
|
20
|
+
/**
|
|
21
|
+
* Handle the STREAMING state.
|
|
22
|
+
*/
|
|
23
|
+
export async function handleStreaming(state, ctx) {
|
|
24
|
+
const effects = [];
|
|
25
|
+
const toolCalls = [...state.pendingToolCalls];
|
|
26
|
+
// Attach passive error handlers to the derived promises BEFORE iterating
|
|
27
|
+
// fullStream. The AI SDK's StreamTextResult exposes fullStream + text +
|
|
28
|
+
// usage as separate promises that share an underlying provider fetch.
|
|
29
|
+
// When ctx.signal aborts, the fetch rejects, fullStream's .next() throws,
|
|
30
|
+
// and this for-await propagates that throw — which means we may exit
|
|
31
|
+
// before `await state.stream.text` (line ~137) ever runs. Without these
|
|
32
|
+
// handlers, the unawaited text/usage rejections escape as unhandled
|
|
33
|
+
// promise rejections and crash the process.
|
|
34
|
+
// These handlers are intentionally silent: the real error is surfaced
|
|
35
|
+
// either via a 'error' event on fullStream (caught below) or via the
|
|
36
|
+
// thrown stream error that propagates up the for-await to runAgent's
|
|
37
|
+
// caller's try/catch.
|
|
38
|
+
Promise.resolve(state.stream.text).catch(() => { });
|
|
39
|
+
Promise.resolve(state.stream.usage).catch(() => { });
|
|
40
|
+
// Consume the full stream
|
|
41
|
+
for await (const event of state.stream.fullStream) {
|
|
42
|
+
if (ctx.signal.aborted)
|
|
43
|
+
break;
|
|
44
|
+
switch (event.type) {
|
|
45
|
+
case 'text-delta': {
|
|
46
|
+
effects.push({
|
|
47
|
+
type: SSEEventType.TextDelta,
|
|
48
|
+
content: event.textDelta,
|
|
49
|
+
timestamp: new Date().toISOString(),
|
|
50
|
+
});
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case 'tool-call': {
|
|
54
|
+
const call = {
|
|
55
|
+
toolCallId: event.toolCallId,
|
|
56
|
+
toolName: event.toolName,
|
|
57
|
+
args: event.args,
|
|
58
|
+
};
|
|
59
|
+
toolCalls.push(call);
|
|
60
|
+
// Pre-execute read-only tools while the model might still be generating
|
|
61
|
+
const toolDef = ctx.toolRegistry.get(event.toolName);
|
|
62
|
+
if (toolDef?.readOnly) {
|
|
63
|
+
const promise = executeTool(call, toolDef, ctx);
|
|
64
|
+
// Log but suppress rejection — errors are re-surfaced when awaited in EXECUTING.
|
|
65
|
+
// Without this, abort before reaching EXECUTING causes unhandled rejection.
|
|
66
|
+
promise.catch((err) => {
|
|
67
|
+
ctx.logger.debug('preexec_suppressed', {
|
|
68
|
+
tool: event.toolName,
|
|
69
|
+
callId: event.toolCallId,
|
|
70
|
+
error: err instanceof Error ? err.message : String(err),
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
ctx.preExecutionCache.set(event.toolCallId, promise);
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
case 'finish': {
|
|
78
|
+
// Track token usage
|
|
79
|
+
const usage = event.usage;
|
|
80
|
+
ctx.usage.inputTokens += usage.inputTokens;
|
|
81
|
+
ctx.usage.outputTokens += usage.outputTokens;
|
|
82
|
+
ctx.usage.totalTokens += usage.inputTokens + usage.outputTokens;
|
|
83
|
+
if (usage.cachedInputTokens) {
|
|
84
|
+
ctx.usage.cachedInputTokens = (ctx.usage.cachedInputTokens ?? 0) + usage.cachedInputTokens;
|
|
85
|
+
}
|
|
86
|
+
if (usage.cacheCreationInputTokens) {
|
|
87
|
+
ctx.usage.cacheCreationInputTokens = (ctx.usage.cacheCreationInputTokens ?? 0) + usage.cacheCreationInputTokens;
|
|
88
|
+
}
|
|
89
|
+
// Fire onUsage hook (billing, metering)
|
|
90
|
+
if (ctx.onUsage) {
|
|
91
|
+
ctx.onUsage({
|
|
92
|
+
inputTokens: usage.inputTokens,
|
|
93
|
+
outputTokens: usage.outputTokens,
|
|
94
|
+
cachedInputTokens: usage.cachedInputTokens ?? 0,
|
|
95
|
+
cacheCreationInputTokens: usage.cacheCreationInputTokens ?? 0,
|
|
96
|
+
totalTokens: usage.inputTokens + usage.outputTokens,
|
|
97
|
+
turnNumber: ctx.turnCount,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case 'tool-result':
|
|
103
|
+
// We don't pass execute functions to the AI SDK, so tool-result events
|
|
104
|
+
// should not arrive. If they do (provider auto-execution), ignore them —
|
|
105
|
+
// we handle tool execution ourselves in EXECUTING state.
|
|
106
|
+
break;
|
|
107
|
+
case 'error': {
|
|
108
|
+
ctx.logger.error('provider_stream_error', {
|
|
109
|
+
session: ctx.sessionId,
|
|
110
|
+
error: event.error instanceof Error ? event.error.message : String(event.error),
|
|
111
|
+
turn: ctx.turnCount,
|
|
112
|
+
});
|
|
113
|
+
effects.push({
|
|
114
|
+
type: SSEEventType.Error,
|
|
115
|
+
message: event.error instanceof Error ? event.error.message : String(event.error),
|
|
116
|
+
timestamp: new Date().toISOString(),
|
|
117
|
+
});
|
|
118
|
+
return {
|
|
119
|
+
next: { type: 'done', usage: { ...ctx.usage }, reason: 'error' },
|
|
120
|
+
effects,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
default:
|
|
124
|
+
// Future stream event types — skip
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Append assistant message to conversation (text + tool calls)
|
|
129
|
+
const text = await state.stream.text;
|
|
130
|
+
const assistantMessage = buildAssistantMessage(text, toolCalls);
|
|
131
|
+
ctx.messages = [...ctx.messages, assistantMessage];
|
|
132
|
+
// No tool calls → model is done
|
|
133
|
+
if (toolCalls.length === 0) {
|
|
134
|
+
return {
|
|
135
|
+
next: { type: 'done', usage: { ...ctx.usage }, reason: 'model_stop' },
|
|
136
|
+
effects,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Tool calls → transition to EXECUTING
|
|
140
|
+
const [first, ...rest] = toolCalls;
|
|
141
|
+
return {
|
|
142
|
+
next: { type: 'executing', queue: rest, current: first, results: [] },
|
|
143
|
+
effects,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Build a ModelMessage for the assistant's response.
|
|
148
|
+
*/
|
|
149
|
+
function buildAssistantMessage(text, toolCalls) {
|
|
150
|
+
// If text only, use string content shorthand
|
|
151
|
+
if (toolCalls.length === 0) {
|
|
152
|
+
return { role: 'assistant', content: text };
|
|
153
|
+
}
|
|
154
|
+
// Mix of text + tool calls — use content array
|
|
155
|
+
const content = [];
|
|
156
|
+
if (text) {
|
|
157
|
+
content.push({ type: 'text', text });
|
|
158
|
+
}
|
|
159
|
+
for (const call of toolCalls) {
|
|
160
|
+
content.push({
|
|
161
|
+
type: 'tool-call',
|
|
162
|
+
toolCallId: call.toolCallId,
|
|
163
|
+
toolName: call.toolName,
|
|
164
|
+
input: call.args,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return { role: 'assistant', content };
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=streaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../../src/agent/states/streaming.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { ThinkingState, AgentContext, TransitionResult } from '../loop-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Handle the THINKING state.
|
|
9
|
+
*
|
|
10
|
+
* Increments turnCount, checks for loops, clears old results,
|
|
11
|
+
* then initiates a streaming LLM call.
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleThinking(state: ThinkingState, ctx: AgentContext): Promise<TransitionResult>;
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { SSEEventType } from '../../types.js';
|
|
7
|
+
/** Content markers for cleared tool results. Original toolCallId and
|
|
8
|
+
* toolName are preserved so assistant tool-calls still pair with their
|
|
9
|
+
* results (providers reject orphaned tool_use blocks). */
|
|
10
|
+
const CLEARED_TOOL_RESULT_TEXT = '[Tool result cleared to save context space]';
|
|
11
|
+
/** Prefix used on every cleared/summarized marker — lets us detect
|
|
12
|
+
* already-cleared messages idempotently. */
|
|
13
|
+
const CLEARED_TEXT_PREFIXES = ['[Tool result cleared', '[Summary of '];
|
|
14
|
+
/**
|
|
15
|
+
* Max length (chars) at which a summary-prefix match counts as
|
|
16
|
+
* "already cleared." A short marker is almost certainly one of ours;
|
|
17
|
+
* a long payload that happens to start with "[Summary of " is more
|
|
18
|
+
* likely legit tool output, so we re-summarize it rather than assume.
|
|
19
|
+
*/
|
|
20
|
+
const CLEARED_MARKER_MAX_LEN = 500;
|
|
21
|
+
/**
|
|
22
|
+
* Handle the THINKING state.
|
|
23
|
+
*
|
|
24
|
+
* Increments turnCount, checks for loops, clears old results,
|
|
25
|
+
* then initiates a streaming LLM call.
|
|
26
|
+
*/
|
|
27
|
+
export async function handleThinking(state, ctx) {
|
|
28
|
+
const effects = [];
|
|
29
|
+
// 1. Increment turn counter
|
|
30
|
+
ctx.turnCount++;
|
|
31
|
+
// 2. Loop detection — check before spending tokens on an LLM call
|
|
32
|
+
const loop = detectLoop(state.messages);
|
|
33
|
+
if (loop && loop.count >= ctx.config.maxLoopIterations) {
|
|
34
|
+
ctx.logger.warn('agent_loop_detected', {
|
|
35
|
+
session: ctx.sessionId,
|
|
36
|
+
tool: loop.toolName,
|
|
37
|
+
count: loop.count,
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
next: { type: 'done', usage: { ...ctx.usage }, reason: 'loop_detected' },
|
|
41
|
+
effects: [{
|
|
42
|
+
type: SSEEventType.Error,
|
|
43
|
+
message: `Agent stuck in a loop: ${loop.toolName} called ${loop.count} times with similar parameters`,
|
|
44
|
+
timestamp: new Date().toISOString(),
|
|
45
|
+
}],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Clear old tool result bodies and persist back to ctx. Without this
|
|
49
|
+
// writeback, every subsequent turn re-calls the summarizer hook for the
|
|
50
|
+
// same messages (expensive). Once a result is cleared, it stays cleared.
|
|
51
|
+
// Must happen before turn-specific warnings are appended, since warnings
|
|
52
|
+
// are local-to-this-turn and should not persist.
|
|
53
|
+
ctx.messages = await clearOldToolResults(state.messages, ctx);
|
|
54
|
+
let messages = ctx.messages;
|
|
55
|
+
// Purge any disabled-tool entries whose cooldown has expired, so a tool
|
|
56
|
+
// re-entering the tool set is available to the model again.
|
|
57
|
+
for (const [name, untilTurn] of ctx.disabledToolsUntilTurn) {
|
|
58
|
+
if (ctx.turnCount >= untilTurn)
|
|
59
|
+
ctx.disabledToolsUntilTurn.delete(name);
|
|
60
|
+
}
|
|
61
|
+
if (loop && loop.count >= ctx.config.loopEscalationThreshold) {
|
|
62
|
+
// Escalation tier: strongly nudge the model AND disable the looping
|
|
63
|
+
// tool for a cooldown window. Without the cooldown, the agent could
|
|
64
|
+
// immediately re-call the tool next turn, drop the loop count below
|
|
65
|
+
// threshold, and keep oscillating.
|
|
66
|
+
const cooldown = ctx.config.loopEscalationCooldownTurns;
|
|
67
|
+
const untilTurn = ctx.turnCount + cooldown;
|
|
68
|
+
ctx.disabledToolsUntilTurn.set(loop.toolName, untilTurn);
|
|
69
|
+
ctx.logger.warn('agent_loop_escalation', {
|
|
70
|
+
session: ctx.sessionId,
|
|
71
|
+
tool: loop.toolName,
|
|
72
|
+
count: loop.count,
|
|
73
|
+
cooldownTurns: cooldown,
|
|
74
|
+
disabledUntilTurn: untilTurn,
|
|
75
|
+
});
|
|
76
|
+
const escalationMessage = {
|
|
77
|
+
role: 'user',
|
|
78
|
+
content: `[System Notice — Escalation] You have called ${loop.toolName} ${loop.count} times with similar parameters and are not making progress. The ${loop.toolName} tool has been temporarily disabled for the next ${cooldown} turns — use a different tool or ask the user for help.`,
|
|
79
|
+
};
|
|
80
|
+
messages = [...messages, escalationMessage];
|
|
81
|
+
}
|
|
82
|
+
else if (loop && loop.count >= ctx.config.loopWarningThreshold) {
|
|
83
|
+
ctx.logger.info('agent_loop_warning', {
|
|
84
|
+
session: ctx.sessionId,
|
|
85
|
+
tool: loop.toolName,
|
|
86
|
+
count: loop.count,
|
|
87
|
+
});
|
|
88
|
+
const warningMessage = {
|
|
89
|
+
role: 'user',
|
|
90
|
+
content: `[System Notice — Warning] You have called ${loop.toolName} ${loop.count} times with similar parameters. Try a different approach.`,
|
|
91
|
+
};
|
|
92
|
+
messages = [...messages, warningMessage];
|
|
93
|
+
}
|
|
94
|
+
// 4. Build tool schemas for the AI SDK (strip execute functions — we handle
|
|
95
|
+
// execution ourselves in EXECUTING state with permission checks, SSE events, etc.)
|
|
96
|
+
// AI SDK v6 uses `inputSchema`, not `parameters`.
|
|
97
|
+
const allTools = ctx.toolRegistry.getTools();
|
|
98
|
+
const tools = {};
|
|
99
|
+
for (const [name, def] of Object.entries(allTools)) {
|
|
100
|
+
// Skip tools that escalation has disabled for a cooldown window.
|
|
101
|
+
const disabledUntil = ctx.disabledToolsUntilTurn.get(name);
|
|
102
|
+
if (disabledUntil !== undefined && ctx.turnCount < disabledUntil)
|
|
103
|
+
continue;
|
|
104
|
+
// ToolDefinition.parameters is either a Zod schema or FlexibleSchema —
|
|
105
|
+
// both are accepted by AI SDK as inputSchema.
|
|
106
|
+
tools[name] = {
|
|
107
|
+
description: def.description,
|
|
108
|
+
inputSchema: def.parameters,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
ctx.logger.debug('agent_thinking_start', {
|
|
112
|
+
session: ctx.sessionId,
|
|
113
|
+
turn: ctx.turnCount,
|
|
114
|
+
messageCount: messages.length,
|
|
115
|
+
toolCount: Object.keys(tools).length,
|
|
116
|
+
});
|
|
117
|
+
// 5. Start streaming LLM call
|
|
118
|
+
const result = ctx.provider.streamText({
|
|
119
|
+
messages,
|
|
120
|
+
system: ctx.systemPrompt,
|
|
121
|
+
tools,
|
|
122
|
+
maxOutputTokens: ctx.config.maxOutputTokens,
|
|
123
|
+
abortSignal: ctx.signal,
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
next: { type: 'streaming', stream: result, pendingToolCalls: [] },
|
|
127
|
+
effects,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Detect repeated tool calls in recent message history.
|
|
132
|
+
*
|
|
133
|
+
* Scans the last 16 messages for assistant tool-call content parts.
|
|
134
|
+
* Groups calls by tool name and checks for parameter similarity.
|
|
135
|
+
* A tool is considered looping when it has 3+ calls with similar
|
|
136
|
+
* parameters (same keys, same or similar values).
|
|
137
|
+
*/
|
|
138
|
+
function detectLoop(messages) {
|
|
139
|
+
const recentMessages = messages.slice(-16);
|
|
140
|
+
// Collect tool calls with their serialized args for similarity checking
|
|
141
|
+
const callsByTool = new Map();
|
|
142
|
+
for (const msg of recentMessages) {
|
|
143
|
+
if (msg.role !== 'assistant' || typeof msg.content === 'string')
|
|
144
|
+
continue;
|
|
145
|
+
if (!Array.isArray(msg.content))
|
|
146
|
+
continue;
|
|
147
|
+
for (const part of msg.content) {
|
|
148
|
+
if ('type' in part && part.type === 'tool-call' && 'toolName' in part) {
|
|
149
|
+
const name = part.toolName;
|
|
150
|
+
const args = 'input' in part ? JSON.stringify(part.input) : '{}';
|
|
151
|
+
const existing = callsByTool.get(name) ?? [];
|
|
152
|
+
existing.push(args);
|
|
153
|
+
callsByTool.set(name, existing);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Find the most repeated tool with similar parameters
|
|
158
|
+
let maxTool = null;
|
|
159
|
+
let maxCount = 0;
|
|
160
|
+
for (const [name, argsList] of callsByTool) {
|
|
161
|
+
// Count how many calls share similar parameters.
|
|
162
|
+
// Group by serialized args — exact duplicates are obvious loops.
|
|
163
|
+
// Also count near-duplicates where only values differ slightly.
|
|
164
|
+
const similarCount = countSimilarCalls(argsList);
|
|
165
|
+
if (similarCount > maxCount) {
|
|
166
|
+
maxTool = name;
|
|
167
|
+
maxCount = similarCount;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (maxTool && maxCount >= 3) {
|
|
171
|
+
return { toolName: maxTool, count: maxCount };
|
|
172
|
+
}
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Known pagination / iteration parameter names. Calls that differ ONLY
|
|
177
|
+
* in these keys are legitimate iteration (walking a file in chunks,
|
|
178
|
+
* paging through a result set) and must NOT count toward loop detection.
|
|
179
|
+
*/
|
|
180
|
+
const PAGINATION_KEYS = new Set([
|
|
181
|
+
'offset',
|
|
182
|
+
'limit',
|
|
183
|
+
'page',
|
|
184
|
+
'start_line',
|
|
185
|
+
'end_line',
|
|
186
|
+
'cursor',
|
|
187
|
+
'after',
|
|
188
|
+
'before',
|
|
189
|
+
'next_page_token',
|
|
190
|
+
'page_token',
|
|
191
|
+
'skip',
|
|
192
|
+
]);
|
|
193
|
+
/**
|
|
194
|
+
* Count the size of the largest group of similar argument sets.
|
|
195
|
+
*
|
|
196
|
+
* Two arg sets are "similar" if they share the same keys and at least
|
|
197
|
+
* half their values are identical. This catches loops where the agent
|
|
198
|
+
* retries with slightly different parameters (e.g., changing a page number
|
|
199
|
+
* but keeping everything else the same).
|
|
200
|
+
*
|
|
201
|
+
* Exception: if two calls differ ONLY in pagination-ish keys (offset,
|
|
202
|
+
* limit, cursor, page, etc.), they represent legitimate iteration and
|
|
203
|
+
* are not counted as similar — otherwise read_repo_file pagination trips
|
|
204
|
+
* the detector after 3 offsets.
|
|
205
|
+
*/
|
|
206
|
+
function countSimilarCalls(argsList) {
|
|
207
|
+
if (argsList.length <= 2)
|
|
208
|
+
return argsList.length;
|
|
209
|
+
// Fast path: if most are exact duplicates, just count those
|
|
210
|
+
const counts = new Map();
|
|
211
|
+
for (const args of argsList) {
|
|
212
|
+
counts.set(args, (counts.get(args) ?? 0) + 1);
|
|
213
|
+
}
|
|
214
|
+
const maxExact = Math.max(...counts.values());
|
|
215
|
+
if (maxExact >= 3)
|
|
216
|
+
return maxExact;
|
|
217
|
+
// Slow path: parse and compare keys/values for similarity
|
|
218
|
+
const parsed = [];
|
|
219
|
+
for (const args of argsList) {
|
|
220
|
+
try {
|
|
221
|
+
const obj = JSON.parse(args);
|
|
222
|
+
if (typeof obj === 'object' && obj !== null && !Array.isArray(obj)) {
|
|
223
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- JSON.parse returns unknown; narrowed to non-null non-array object above
|
|
224
|
+
parsed.push(obj);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Unparseable — treat each as unique
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (parsed.length <= 2)
|
|
232
|
+
return argsList.length;
|
|
233
|
+
// Group by key set, then check value similarity within groups
|
|
234
|
+
const byKeys = new Map();
|
|
235
|
+
for (const obj of parsed) {
|
|
236
|
+
const keyStr = Object.keys(obj).sort().join(',');
|
|
237
|
+
const group = byKeys.get(keyStr) ?? [];
|
|
238
|
+
group.push(obj);
|
|
239
|
+
byKeys.set(keyStr, group);
|
|
240
|
+
}
|
|
241
|
+
let largestSimilarGroup = 0;
|
|
242
|
+
for (const group of byKeys.values()) {
|
|
243
|
+
if (group.length < 3)
|
|
244
|
+
continue;
|
|
245
|
+
// Within a key group, count pairs with >50% identical values
|
|
246
|
+
// Use first element as reference and count how many are similar to it.
|
|
247
|
+
// Pagination variants (differ only in offset/limit/cursor/etc.) don't
|
|
248
|
+
// count — they represent legitimate iteration.
|
|
249
|
+
const ref = group[0];
|
|
250
|
+
const keys = Object.keys(ref);
|
|
251
|
+
let similarToRef = 1;
|
|
252
|
+
for (let i = 1; i < group.length; i++) {
|
|
253
|
+
const differingKeys = keys.filter((k) => JSON.stringify(ref[k]) !== JSON.stringify(group[i][k]));
|
|
254
|
+
const onlyPaginationDiffers = differingKeys.length > 0 && differingKeys.every((k) => PAGINATION_KEYS.has(k));
|
|
255
|
+
if (onlyPaginationDiffers)
|
|
256
|
+
continue;
|
|
257
|
+
const matchingCount = keys.length - differingKeys.length;
|
|
258
|
+
if (matchingCount >= keys.length / 2) {
|
|
259
|
+
similarToRef++;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
largestSimilarGroup = Math.max(largestSimilarGroup, similarToRef);
|
|
263
|
+
}
|
|
264
|
+
return Math.max(maxExact, largestSimilarGroup);
|
|
265
|
+
}
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
// Tool result clearing
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
/**
|
|
270
|
+
* Replace old tool result bodies with one-line summaries.
|
|
271
|
+
*
|
|
272
|
+
* If there are more than `ctx.config.clearThreshold` tool result messages,
|
|
273
|
+
* keep the last `ctx.config.keepRecentResults` full and replace older ones
|
|
274
|
+
* with a cleared marker.
|
|
275
|
+
*
|
|
276
|
+
* When `ctx.summarizeToolResult` is provided, each newly-cleared message
|
|
277
|
+
* gets an LLM-generated 1-2 sentence summary of its body (in parallel).
|
|
278
|
+
* Already-cleared messages are skipped (idempotent). Summarization
|
|
279
|
+
* failures degrade to the static marker so context clearing never
|
|
280
|
+
* blocks the main loop.
|
|
281
|
+
*/
|
|
282
|
+
async function clearOldToolResults(messages, ctx) {
|
|
283
|
+
const threshold = ctx.config.clearThreshold;
|
|
284
|
+
const keepRecent = ctx.config.keepRecentResults;
|
|
285
|
+
// Count tool result messages
|
|
286
|
+
const toolResultIndices = [];
|
|
287
|
+
for (let i = 0; i < messages.length; i++) {
|
|
288
|
+
const msg = messages[i];
|
|
289
|
+
if (msg.role === 'tool') {
|
|
290
|
+
toolResultIndices.push(i);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (toolResultIndices.length <= threshold) {
|
|
294
|
+
return messages;
|
|
295
|
+
}
|
|
296
|
+
// Keep the last `keepRecent` tool results full, clear the rest
|
|
297
|
+
const indicesToClear = toolResultIndices.slice(0, -keepRecent);
|
|
298
|
+
// Build one task per index — skip already-cleared (idempotent), summarize
|
|
299
|
+
// the rest. Tasks run through a bounded worker pool so we don't fan out
|
|
300
|
+
// 10+ concurrent summarizer calls into provider rate limits.
|
|
301
|
+
const clearOne = async (idx) => {
|
|
302
|
+
const existing = messages[idx];
|
|
303
|
+
// Already-cleared messages: keep the existing marker unchanged
|
|
304
|
+
if (isAlreadyCleared(existing))
|
|
305
|
+
return { idx, cleared: existing };
|
|
306
|
+
const toolCallId = extractToolCallId(existing);
|
|
307
|
+
const toolName = extractToolName(existing);
|
|
308
|
+
const body = extractToolResultText(existing);
|
|
309
|
+
const markerText = await summarizeOrFallback(toolName, body, ctx.summarizeToolResult, ctx.signal, ctx.config.summarizerTimeoutMs, ctx.logger, ctx.sessionId);
|
|
310
|
+
// CRITICAL: preserve the original toolCallId and toolName. Providers
|
|
311
|
+
// (Anthropic especially) require every assistant tool-call to have
|
|
312
|
+
// a matching tool-result with the same toolCallId; rewriting it
|
|
313
|
+
// breaks the conversation with "tool results are missing" errors.
|
|
314
|
+
return {
|
|
315
|
+
idx,
|
|
316
|
+
cleared: {
|
|
317
|
+
role: 'tool',
|
|
318
|
+
content: [{
|
|
319
|
+
type: 'tool-result',
|
|
320
|
+
toolCallId,
|
|
321
|
+
toolName,
|
|
322
|
+
output: { type: 'text', value: markerText },
|
|
323
|
+
}],
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
};
|
|
327
|
+
const resolved = await runWithConcurrency(indicesToClear, clearOne, ctx.config.summarizerConcurrency);
|
|
328
|
+
const result = [...messages];
|
|
329
|
+
for (const { idx, cleared } of resolved) {
|
|
330
|
+
result[idx] = cleared;
|
|
331
|
+
}
|
|
332
|
+
return result;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Execute `task(item)` for each item with a concurrency cap. Preserves
|
|
336
|
+
* input order in the returned results. Functionally equivalent to
|
|
337
|
+
* `Promise.all(items.map(task))` but bounded so we don't fan out into
|
|
338
|
+
* provider rate limits.
|
|
339
|
+
*
|
|
340
|
+
* `task` MUST NOT throw — a throwing task rejects Promise.all and leaves
|
|
341
|
+
* `undefined` holes in `results` for items after the failure point.
|
|
342
|
+
* Wrap fallible work in try/catch inside the task itself (as
|
|
343
|
+
* `summarizeOrFallback` does).
|
|
344
|
+
*/
|
|
345
|
+
async function runWithConcurrency(items, task, concurrency) {
|
|
346
|
+
const max = Math.max(1, concurrency);
|
|
347
|
+
const results = new Array(items.length);
|
|
348
|
+
let nextIndex = 0;
|
|
349
|
+
const worker = async () => {
|
|
350
|
+
while (true) {
|
|
351
|
+
const i = nextIndex++;
|
|
352
|
+
if (i >= items.length)
|
|
353
|
+
return;
|
|
354
|
+
results[i] = await task(items[i]);
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
const workers = [];
|
|
358
|
+
for (let w = 0; w < Math.min(max, items.length); w++) {
|
|
359
|
+
workers.push(worker());
|
|
360
|
+
}
|
|
361
|
+
await Promise.all(workers);
|
|
362
|
+
return results;
|
|
363
|
+
}
|
|
364
|
+
/** Extract the assistant-visible text from a tool-result message. */
|
|
365
|
+
function extractToolResultText(msg) {
|
|
366
|
+
if (msg.role !== 'tool')
|
|
367
|
+
return '';
|
|
368
|
+
if (typeof msg.content === 'string')
|
|
369
|
+
return msg.content;
|
|
370
|
+
if (!Array.isArray(msg.content))
|
|
371
|
+
return '';
|
|
372
|
+
const parts = [];
|
|
373
|
+
for (const part of msg.content) {
|
|
374
|
+
if ('output' in part && part.output && typeof part.output === 'object' && 'value' in part.output) {
|
|
375
|
+
const value = part.output.value;
|
|
376
|
+
if (typeof value === 'string')
|
|
377
|
+
parts.push(value);
|
|
378
|
+
else
|
|
379
|
+
parts.push(JSON.stringify(value));
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return parts.join('\n');
|
|
383
|
+
}
|
|
384
|
+
/** Extract the original tool name from a tool-result message, if available. */
|
|
385
|
+
function extractToolName(msg) {
|
|
386
|
+
if (msg.role !== 'tool' || !Array.isArray(msg.content))
|
|
387
|
+
return 'unknown';
|
|
388
|
+
for (const part of msg.content) {
|
|
389
|
+
if ('toolName' in part && typeof part.toolName === 'string')
|
|
390
|
+
return part.toolName;
|
|
391
|
+
}
|
|
392
|
+
return 'unknown';
|
|
393
|
+
}
|
|
394
|
+
/** Extract the original toolCallId from a tool-result message. */
|
|
395
|
+
function extractToolCallId(msg) {
|
|
396
|
+
if (msg.role !== 'tool' || !Array.isArray(msg.content))
|
|
397
|
+
return 'unknown';
|
|
398
|
+
for (const part of msg.content) {
|
|
399
|
+
if ('toolCallId' in part && typeof part.toolCallId === 'string')
|
|
400
|
+
return part.toolCallId;
|
|
401
|
+
}
|
|
402
|
+
return 'unknown';
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* True if this message has already been replaced with a cleared marker.
|
|
406
|
+
* Detected by content prefix (we no longer overwrite toolCallId) with a
|
|
407
|
+
* length cap so a legit tool result that happens to start with "[Summary
|
|
408
|
+
* of " doesn't get silently skipped from summarization.
|
|
409
|
+
*/
|
|
410
|
+
function isAlreadyCleared(msg) {
|
|
411
|
+
if (msg.role !== 'tool' || !Array.isArray(msg.content))
|
|
412
|
+
return false;
|
|
413
|
+
for (const part of msg.content) {
|
|
414
|
+
if ('output' in part && part.output && typeof part.output === 'object' && 'value' in part.output) {
|
|
415
|
+
const value = part.output.value;
|
|
416
|
+
if (typeof value === 'string' && value.length <= CLEARED_MARKER_MAX_LEN) {
|
|
417
|
+
if (CLEARED_TEXT_PREFIXES.some((p) => value.startsWith(p)))
|
|
418
|
+
return true;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Produce replacement text for a cleared tool result. Uses the summarizer
|
|
426
|
+
* hook if provided; falls back to the static marker on any failure.
|
|
427
|
+
*/
|
|
428
|
+
async function summarizeOrFallback(toolName, content, summarize, signal, timeoutMs, logger, sessionId) {
|
|
429
|
+
if (!summarize || content.length === 0)
|
|
430
|
+
return CLEARED_TOOL_RESULT_TEXT;
|
|
431
|
+
// Bound the callback so a hung summarizer can never block the main loop.
|
|
432
|
+
// The session signal is ANDed in so a parent abort still tears this down.
|
|
433
|
+
const timeoutSignal = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
|
|
434
|
+
try {
|
|
435
|
+
const summary = await summarize({ toolName, content, signal: timeoutSignal });
|
|
436
|
+
const trimmed = summary.trim();
|
|
437
|
+
if (trimmed.length === 0)
|
|
438
|
+
return CLEARED_TOOL_RESULT_TEXT;
|
|
439
|
+
return `[Summary of ${toolName}: ${trimmed}]`;
|
|
440
|
+
}
|
|
441
|
+
catch (err) {
|
|
442
|
+
logger.warn('tool_result_summarization_failed', {
|
|
443
|
+
session: sessionId,
|
|
444
|
+
tool: toolName,
|
|
445
|
+
error: err instanceof Error ? err.message : String(err),
|
|
446
|
+
});
|
|
447
|
+
return CLEARED_TOOL_RESULT_TEXT;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=thinking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../../../src/agent/states/thinking.ts"],"names":[],"mappings":"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"}
|