agim-cli 1.2.44 → 1.2.48
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/CHANGELOG.md +295 -0
- package/README.md +39 -5
- package/README.zh-CN.md +40 -6
- package/dist/cli-ui/config-wizard.js +15 -2
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/diag.d.ts +29 -0
- package/dist/cli-ui/diag.d.ts.map +1 -0
- package/dist/cli-ui/diag.js +135 -0
- package/dist/cli-ui/diag.js.map +1 -0
- package/dist/cli-ui/i18n.d.ts +36 -0
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +97 -0
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/setup-llm.d.ts +30 -0
- package/dist/cli-ui/setup-llm.d.ts.map +1 -0
- package/dist/cli-ui/setup-llm.js +460 -0
- package/dist/cli-ui/setup-llm.js.map +1 -0
- package/dist/cli-ui/setup-mcp.d.ts +19 -0
- package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
- package/dist/cli-ui/setup-mcp.js +308 -0
- package/dist/cli-ui/setup-mcp.js.map +1 -0
- package/dist/cli-ui/token-menu.js +2 -2
- package/dist/cli-ui/token-menu.js.map +1 -1
- package/dist/cli.js +100 -22
- package/dist/cli.js.map +1 -1
- package/dist/core/access-token.d.ts +16 -5
- package/dist/core/access-token.d.ts.map +1 -1
- package/dist/core/access-token.js +82 -13
- package/dist/core/access-token.js.map +1 -1
- package/dist/core/agent-cwd.d.ts.map +1 -1
- package/dist/core/agent-cwd.js +46 -0
- package/dist/core/agent-cwd.js.map +1 -1
- package/dist/core/approval-bus.d.ts +22 -0
- package/dist/core/approval-bus.d.ts.map +1 -1
- package/dist/core/approval-bus.js +93 -0
- package/dist/core/approval-bus.js.map +1 -1
- package/dist/core/ask-user-router.d.ts +24 -0
- package/dist/core/ask-user-router.d.ts.map +1 -0
- package/dist/core/ask-user-router.js +84 -0
- package/dist/core/ask-user-router.js.map +1 -0
- package/dist/core/ask-user-rpc.d.ts +80 -0
- package/dist/core/ask-user-rpc.d.ts.map +1 -0
- package/dist/core/ask-user-rpc.js +388 -0
- package/dist/core/ask-user-rpc.js.map +1 -0
- package/dist/core/audit-log.d.ts +1 -1
- package/dist/core/audit-log.d.ts.map +1 -1
- package/dist/core/audit-log.js.map +1 -1
- package/dist/core/commands/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +21 -5
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/commands/goal.d.ts +3 -0
- package/dist/core/commands/goal.d.ts.map +1 -0
- package/dist/core/commands/goal.js +240 -0
- package/dist/core/commands/goal.js.map +1 -0
- package/dist/core/commands/heartbeat.d.ts +3 -0
- package/dist/core/commands/heartbeat.d.ts.map +1 -0
- package/dist/core/commands/heartbeat.js +219 -0
- package/dist/core/commands/heartbeat.js.map +1 -0
- package/dist/core/commands/router-compare.d.ts +3 -0
- package/dist/core/commands/router-compare.d.ts.map +1 -0
- package/dist/core/commands/router-compare.js +81 -0
- package/dist/core/commands/router-compare.js.map +1 -0
- package/dist/core/commands/router.d.ts.map +1 -1
- package/dist/core/commands/router.js +9 -1
- package/dist/core/commands/router.js.map +1 -1
- package/dist/core/commands/skill.d.ts +3 -0
- package/dist/core/commands/skill.d.ts.map +1 -0
- package/dist/core/commands/skill.js +91 -0
- package/dist/core/commands/skill.js.map +1 -0
- package/dist/core/config-schema.d.ts +28 -0
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +124 -0
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/goals.d.ts +81 -0
- package/dist/core/goals.d.ts.map +1 -0
- package/dist/core/goals.js +361 -0
- package/dist/core/goals.js.map +1 -0
- package/dist/core/heartbeat-store.d.ts +90 -0
- package/dist/core/heartbeat-store.d.ts.map +1 -0
- package/dist/core/heartbeat-store.js +302 -0
- package/dist/core/heartbeat-store.js.map +1 -0
- package/dist/core/heartbeat.d.ts +35 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +332 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/intent-llm.d.ts +9 -0
- package/dist/core/intent-llm.d.ts.map +1 -1
- package/dist/core/intent-llm.js +77 -32
- package/dist/core/intent-llm.js.map +1 -1
- package/dist/core/llm/agent-loop.d.ts +112 -0
- package/dist/core/llm/agent-loop.d.ts.map +1 -0
- package/dist/core/llm/agent-loop.js +313 -0
- package/dist/core/llm/agent-loop.js.map +1 -0
- package/dist/core/llm/anthropic-provider.d.ts +53 -0
- package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/core/llm/anthropic-provider.js +339 -0
- package/dist/core/llm/anthropic-provider.js.map +1 -0
- package/dist/core/llm/auto-compact.d.ts +35 -0
- package/dist/core/llm/auto-compact.d.ts.map +1 -0
- package/dist/core/llm/auto-compact.js +149 -0
- package/dist/core/llm/auto-compact.js.map +1 -0
- package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
- package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/builtin-dispatcher.js +196 -0
- package/dist/core/llm/builtin-dispatcher.js.map +1 -0
- package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
- package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/imhub-dispatcher.js +308 -0
- package/dist/core/llm/imhub-dispatcher.js.map +1 -0
- package/dist/core/llm/index.d.ts +11 -0
- package/dist/core/llm/index.d.ts.map +1 -0
- package/dist/core/llm/index.js +16 -0
- package/dist/core/llm/index.js.map +1 -0
- package/dist/core/llm/introspection.d.ts +73 -0
- package/dist/core/llm/introspection.d.ts.map +1 -0
- package/dist/core/llm/introspection.js +90 -0
- package/dist/core/llm/introspection.js.map +1 -0
- package/dist/core/llm/mcp-client.d.ts +80 -0
- package/dist/core/llm/mcp-client.d.ts.map +1 -0
- package/dist/core/llm/mcp-client.js +270 -0
- package/dist/core/llm/mcp-client.js.map +1 -0
- package/dist/core/llm/mcp-registry.d.ts +57 -0
- package/dist/core/llm/mcp-registry.d.ts.map +1 -0
- package/dist/core/llm/mcp-registry.js +155 -0
- package/dist/core/llm/mcp-registry.js.map +1 -0
- package/dist/core/llm/openai-compat-provider.d.ts +65 -0
- package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
- package/dist/core/llm/openai-compat-provider.js +451 -0
- package/dist/core/llm/openai-compat-provider.js.map +1 -0
- package/dist/core/llm/policy-approval-gate.d.ts +30 -0
- package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
- package/dist/core/llm/policy-approval-gate.js +86 -0
- package/dist/core/llm/policy-approval-gate.js.map +1 -0
- package/dist/core/llm/provider-base.d.ts +302 -0
- package/dist/core/llm/provider-base.d.ts.map +1 -0
- package/dist/core/llm/provider-base.js +222 -0
- package/dist/core/llm/provider-base.js.map +1 -0
- package/dist/core/llm/registry.d.ts +44 -0
- package/dist/core/llm/registry.d.ts.map +1 -0
- package/dist/core/llm/registry.js +160 -0
- package/dist/core/llm/registry.js.map +1 -0
- package/dist/core/llm/secrets.d.ts +46 -0
- package/dist/core/llm/secrets.d.ts.map +1 -0
- package/dist/core/llm/secrets.js +157 -0
- package/dist/core/llm/secrets.js.map +1 -0
- package/dist/core/llm/tool-dispatcher.d.ts +37 -0
- package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/tool-dispatcher.js +85 -0
- package/dist/core/llm/tool-dispatcher.js.map +1 -0
- package/dist/core/memory-consolidate.d.ts.map +1 -1
- package/dist/core/memory-consolidate.js +38 -23
- package/dist/core/memory-consolidate.js.map +1 -1
- package/dist/core/memory-distill.d.ts.map +1 -1
- package/dist/core/memory-distill.js +51 -25
- package/dist/core/memory-distill.js.map +1 -1
- package/dist/core/memory-rpc.d.ts.map +1 -1
- package/dist/core/memory-rpc.js +6 -0
- package/dist/core/memory-rpc.js.map +1 -1
- package/dist/core/message-sink.d.ts.map +1 -1
- package/dist/core/message-sink.js +76 -0
- package/dist/core/message-sink.js.map +1 -1
- package/dist/core/notification-evaluator.d.ts +49 -0
- package/dist/core/notification-evaluator.d.ts.map +1 -0
- package/dist/core/notification-evaluator.js +232 -0
- package/dist/core/notification-evaluator.js.map +1 -0
- package/dist/core/onboarding.d.ts.map +1 -1
- package/dist/core/onboarding.js +10 -0
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/persona.d.ts +10 -0
- package/dist/core/persona.d.ts.map +1 -1
- package/dist/core/persona.js +28 -14
- package/dist/core/persona.js.map +1 -1
- package/dist/core/push-rpc.d.ts +8 -0
- package/dist/core/push-rpc.d.ts.map +1 -1
- package/dist/core/push-rpc.js +41 -1
- package/dist/core/push-rpc.js.map +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +6 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/render-router.d.ts.map +1 -1
- package/dist/core/render-router.js +23 -6
- package/dist/core/render-router.js.map +1 -1
- package/dist/core/router-compare.d.ts +76 -0
- package/dist/core/router-compare.d.ts.map +1 -0
- package/dist/core/router-compare.js +253 -0
- package/dist/core/router-compare.js.map +1 -0
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +25 -1
- package/dist/core/router.js.map +1 -1
- package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
- package/dist/core/skills/loader.d.ts +120 -0
- package/dist/core/skills/loader.d.ts.map +1 -0
- package/dist/core/skills/loader.js +577 -0
- package/dist/core/skills/loader.js.map +1 -0
- package/dist/core/skills-rpc.d.ts +44 -0
- package/dist/core/skills-rpc.d.ts.map +1 -0
- package/dist/core/skills-rpc.js +71 -0
- package/dist/core/skills-rpc.js.map +1 -0
- package/dist/core/types.d.ts +35 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/util/format-age.d.ts +20 -0
- package/dist/core/util/format-age.d.ts.map +1 -0
- package/dist/core/util/format-age.js +86 -0
- package/dist/core/util/format-age.js.map +1 -0
- package/dist/core/viewer-config.d.ts +15 -7
- package/dist/core/viewer-config.d.ts.map +1 -1
- package/dist/core/viewer-config.js +18 -12
- package/dist/core/viewer-config.js.map +1 -1
- package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
- package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/acp/acp-adapter.js +12 -0
- package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
- package/dist/plugins/agents/antigravity/index.d.ts +1 -0
- package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
- package/dist/plugins/agents/antigravity/index.js +1 -0
- package/dist/plugins/agents/antigravity/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/index.d.ts +1 -0
- package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/index.js +1 -0
- package/dist/plugins/agents/claude-code/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
- package/dist/plugins/agents/codex/index.d.ts +1 -0
- package/dist/plugins/agents/codex/index.d.ts.map +1 -1
- package/dist/plugins/agents/codex/index.js +1 -0
- package/dist/plugins/agents/codex/index.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts +34 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -0
- package/dist/plugins/agents/native/index.js +598 -0
- package/dist/plugins/agents/native/index.js.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
- package/dist/web/agim-skills-api.d.ts +4 -0
- package/dist/web/agim-skills-api.d.ts.map +1 -0
- package/dist/web/agim-skills-api.js +150 -0
- package/dist/web/agim-skills-api.js.map +1 -0
- package/dist/web/background-tasks-api.d.ts +7 -0
- package/dist/web/background-tasks-api.d.ts.map +1 -0
- package/dist/web/background-tasks-api.js +225 -0
- package/dist/web/background-tasks-api.js.map +1 -0
- package/dist/web/llm-api.d.ts +8 -0
- package/dist/web/llm-api.d.ts.map +1 -0
- package/dist/web/llm-api.js +300 -0
- package/dist/web/llm-api.js.map +1 -0
- package/dist/web/mcp-api.d.ts +8 -0
- package/dist/web/mcp-api.d.ts.map +1 -0
- package/dist/web/mcp-api.js +205 -0
- package/dist/web/mcp-api.js.map +1 -0
- package/dist/web/public/assets/{a2a-Bg_mT0z1.js → a2a-Mke0F7ZM.js} +3 -3
- package/dist/web/public/assets/{a2a-Bg_mT0z1.js.map → a2a-Mke0F7ZM.js.map} +1 -1
- package/dist/web/public/assets/{activity-U9AaNlDt.js → activity-0zGnf1_m.js} +2 -2
- package/dist/web/public/assets/{activity-U9AaNlDt.js.map → activity-0zGnf1_m.js.map} +1 -1
- package/dist/web/public/assets/{admins-BTC_YEK9.js → admins-DSi3KRky.js} +3 -3
- package/dist/web/public/assets/{admins-BTC_YEK9.js.map → admins-DSi3KRky.js.map} +1 -1
- package/dist/web/public/assets/agents-BLWe20EJ.js +7 -0
- package/dist/web/public/assets/agents-BLWe20EJ.js.map +1 -0
- package/dist/web/public/assets/{approvals-Boj7iXz4.js → approvals-Cu_JdM-8.js} +3 -3
- package/dist/web/public/assets/{approvals-Boj7iXz4.js.map → approvals-Cu_JdM-8.js.map} +1 -1
- package/dist/web/public/assets/asks-DfV8vxey.js +7 -0
- package/dist/web/public/assets/asks-DfV8vxey.js.map +1 -0
- package/dist/web/public/assets/{audit-MprCFoy_.js → audit-2EVhhvGV.js} +2 -2
- package/dist/web/public/assets/{audit-MprCFoy_.js.map → audit-2EVhhvGV.js.map} +1 -1
- package/dist/web/public/assets/bell-Wz_wuOa_.js +7 -0
- package/dist/web/public/assets/bell-Wz_wuOa_.js.map +1 -0
- package/dist/web/public/assets/{bgjobs-B6XvxURz.js → bgjobs-DXROZFAW.js} +2 -2
- package/dist/web/public/assets/{bgjobs-B6XvxURz.js.map → bgjobs-DXROZFAW.js.map} +1 -1
- package/dist/web/public/assets/{brain-C5HejASN.js → brain-Dh5VOzRL.js} +2 -2
- package/dist/web/public/assets/{brain-C5HejASN.js.map → brain-Dh5VOzRL.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-DkCTxO1A.js → briefcase-DfxbvM9i.js} +2 -2
- package/dist/web/public/assets/{briefcase-DkCTxO1A.js.map → briefcase-DfxbvM9i.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-DEyrYFz4.js → chevron-right-DU8Xla1M.js} +2 -2
- package/dist/web/public/assets/{chevron-right-DEyrYFz4.js.map → chevron-right-DU8Xla1M.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-bADFEXGw.js → circle-check-Be_S993G.js} +2 -2
- package/dist/web/public/assets/{circle-check-bADFEXGw.js.map → circle-check-Be_S993G.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-U4xrkHiS.js → circle-check-big-CsQkLR1u.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-U4xrkHiS.js.map → circle-check-big-CsQkLR1u.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-C6qY5UUl.js → circle-x-qkQu1Swu.js} +2 -2
- package/dist/web/public/assets/{circle-x-C6qY5UUl.js.map → circle-x-qkQu1Swu.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-B53cbWzX.js → confirm-dialog-Bm6MsLXZ.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-B53cbWzX.js.map → confirm-dialog-Bm6MsLXZ.js.map} +1 -1
- package/dist/web/public/assets/{data-table-BKTemkw9.js → data-table-Dw4Df09-.js} +5 -5
- package/dist/web/public/assets/{data-table-BKTemkw9.js.map → data-table-Dw4Df09-.js.map} +1 -1
- package/dist/web/public/assets/{dialog-Cevi7KvQ.js → dialog-CNsc4COh.js} +3 -3
- package/dist/web/public/assets/{dialog-Cevi7KvQ.js.map → dialog-CNsc4COh.js.map} +1 -1
- package/dist/web/public/assets/{download-DwJNwdwV.js → download-Bnhk_vDY.js} +2 -2
- package/dist/web/public/assets/{download-DwJNwdwV.js.map → download-Bnhk_vDY.js.map} +1 -1
- package/dist/web/public/assets/{email-CZVaRhG_.js → email-jgAX8liM.js} +3 -3
- package/dist/web/public/assets/{email-CZVaRhG_.js.map → email-jgAX8liM.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-C87S9Wor.js → empty-state-D8QXQ5y9.js} +2 -2
- package/dist/web/public/assets/{empty-state-C87S9Wor.js.map → empty-state-D8QXQ5y9.js.map} +1 -1
- package/dist/web/public/assets/{external-link-CIM1wjHP.js → external-link-C8AYvhBb.js} +2 -2
- package/dist/web/public/assets/{external-link-CIM1wjHP.js.map → external-link-C8AYvhBb.js.map} +1 -1
- package/dist/web/public/assets/{eye-TUAOhz72.js → eye-pmI_4E8x.js} +4 -4
- package/dist/web/public/assets/{eye-TUAOhz72.js.map → eye-pmI_4E8x.js.map} +1 -1
- package/dist/web/public/assets/{facts-ByM1VHCp.js → facts-BRHLLX2u.js} +2 -2
- package/dist/web/public/assets/{facts-ByM1VHCp.js.map → facts-BRHLLX2u.js.map} +1 -1
- package/dist/web/public/assets/goals-p7cNp01l.js +17 -0
- package/dist/web/public/assets/goals-p7cNp01l.js.map +1 -0
- package/dist/web/public/assets/{health-B4GF06J-.js → health-CuGIXg8C.js} +2 -2
- package/dist/web/public/assets/{health-B4GF06J-.js.map → health-CuGIXg8C.js.map} +1 -1
- package/dist/web/public/assets/heart-pulse-D0AHQl1d.js +7 -0
- package/dist/web/public/assets/heart-pulse-D0AHQl1d.js.map +1 -0
- package/dist/web/public/assets/heartbeat-DJRDS2GQ.js +7 -0
- package/dist/web/public/assets/heartbeat-DJRDS2GQ.js.map +1 -0
- package/dist/web/public/assets/hot-B1qKTiGD.js +17 -0
- package/dist/web/public/assets/hot-B1qKTiGD.js.map +1 -0
- package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
- package/dist/web/public/assets/index-XJngV1gH.js +166 -0
- package/dist/web/public/assets/index-XJngV1gH.js.map +1 -0
- package/dist/web/public/assets/installed-Dz4-KevJ.js +31 -0
- package/dist/web/public/assets/installed-Dz4-KevJ.js.map +1 -0
- package/dist/web/public/assets/{jobs-DwA9Ip87.js → jobs-kwOypiWd.js} +2 -2
- package/dist/web/public/assets/{jobs-DwA9Ip87.js.map → jobs-kwOypiWd.js.map} +1 -1
- package/dist/web/public/assets/layout-01n3Aibo.js +2 -0
- package/dist/web/public/assets/layout-01n3Aibo.js.map +1 -0
- package/dist/web/public/assets/layout-CVYe2vN8.js +2 -0
- package/dist/web/public/assets/layout-CVYe2vN8.js.map +1 -0
- package/dist/web/public/assets/{layout-CR5gLapT.js → layout-CbHxH58i.js} +2 -2
- package/dist/web/public/assets/{layout-CR5gLapT.js.map → layout-CbHxH58i.js.map} +1 -1
- package/dist/web/public/assets/layout-DD1Dei48.js +2 -0
- package/dist/web/public/assets/layout-DD1Dei48.js.map +1 -0
- package/dist/web/public/assets/{layout-zotlJ5fW.js → layout-s11iwkL-.js} +2 -2
- package/dist/web/public/assets/{layout-zotlJ5fW.js.map → layout-s11iwkL-.js.map} +1 -1
- package/dist/web/public/assets/llm-DPlK10Lg.js +7 -0
- package/dist/web/public/assets/llm-DPlK10Lg.js.map +1 -0
- package/dist/web/public/assets/{loader-circle-BFp6Oc8_.js → loader-circle-DymEG5Cl.js} +2 -2
- package/dist/web/public/assets/{loader-circle-BFp6Oc8_.js.map → loader-circle-DymEG5Cl.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-DPqnsBIG.js → map-pin-CyZg1-Jk.js} +2 -2
- package/dist/web/public/assets/{map-pin-DPqnsBIG.js.map → map-pin-CyZg1-Jk.js.map} +1 -1
- package/dist/web/public/assets/mcp-CiifW_qp.js +7 -0
- package/dist/web/public/assets/mcp-CiifW_qp.js.map +1 -0
- package/dist/web/public/assets/{memos-DCACQN26.js → memos-Bsiq64qW.js} +2 -2
- package/dist/web/public/assets/{memos-DCACQN26.js.map → memos-Bsiq64qW.js.map} +1 -1
- package/dist/web/public/assets/{messengers-CwWP1qI4.js → messengers-alGJK9dO.js} +3 -3
- package/dist/web/public/assets/{messengers-CwWP1qI4.js.map → messengers-alGJK9dO.js.map} +1 -1
- package/dist/web/public/assets/native-agent-CgzcqRsU.js +7 -0
- package/dist/web/public/assets/native-agent-CgzcqRsU.js.map +1 -0
- package/dist/web/public/assets/{network-CrMEVz4-.js → network-BSRJfeGk.js} +2 -2
- package/dist/web/public/assets/{network-CrMEVz4-.js.map → network-BSRJfeGk.js.map} +1 -1
- package/dist/web/public/assets/{outbox-C7FpZzwS.js → outbox-DSDls9xU.js} +3 -3
- package/dist/web/public/assets/{outbox-C7FpZzwS.js.map → outbox-DSDls9xU.js.map} +1 -1
- package/dist/web/public/assets/{pagination-Cgt8W6EX.js → pagination-DVXNZ2ti.js} +3 -3
- package/dist/web/public/assets/{pagination-Cgt8W6EX.js.map → pagination-DVXNZ2ti.js.map} +1 -1
- package/dist/web/public/assets/{persona-Bjty6uqM.js → persona-BB1gIwTX.js} +2 -2
- package/dist/web/public/assets/{persona-Bjty6uqM.js.map → persona-BB1gIwTX.js.map} +1 -1
- package/dist/web/public/assets/{play-CEoS1N8t.js → play-CcECAHfL.js} +2 -2
- package/dist/web/public/assets/{play-CEoS1N8t.js.map → play-CcECAHfL.js.map} +1 -1
- package/dist/web/public/assets/plus-DrStBHss.js +7 -0
- package/dist/web/public/assets/plus-DrStBHss.js.map +1 -0
- package/dist/web/public/assets/policy-BgDYTxy7.js +2 -0
- package/dist/web/public/assets/{policy-DwI-ov9J.js.map → policy-BgDYTxy7.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-CPSYEbgh.js → refresh-ccw-BBRPVLH8.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-CPSYEbgh.js.map → refresh-ccw-BBRPVLH8.js.map} +1 -1
- package/dist/web/public/assets/{reminders-X-QFSWvZ.js → reminders-jwy196Xw.js} +4 -9
- package/dist/web/public/assets/reminders-jwy196Xw.js.map +1 -0
- package/dist/web/public/assets/{save-tS3IBPf3.js → save-iBtyruco.js} +2 -2
- package/dist/web/public/assets/{save-tS3IBPf3.js.map → save-iBtyruco.js.map} +1 -1
- package/dist/web/public/assets/{schedules-CfCNvhCV.js → schedules-DDl_Sr5r.js} +3 -3
- package/dist/web/public/assets/{schedules-CfCNvhCV.js.map → schedules-DDl_Sr5r.js.map} +1 -1
- package/dist/web/public/assets/{search-BPvPCccn.js → search-Yb1S22sv.js} +2 -2
- package/dist/web/public/assets/{search-BPvPCccn.js.map → search-Yb1S22sv.js.map} +1 -1
- package/dist/web/public/assets/{service-DSitDFzD.js → service-jrg0kMtK.js} +3 -3
- package/dist/web/public/assets/{service-DSitDFzD.js.map → service-jrg0kMtK.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-HSHkhdur.js → status-badge-Arxyw3TL.js} +2 -2
- package/dist/web/public/assets/{status-badge-HSHkhdur.js.map → status-badge-Arxyw3TL.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-eKq_P0v6.js → subtasks-CkyuMv_X.js} +3 -3
- package/dist/web/public/assets/{subtasks-eKq_P0v6.js.map → subtasks-CkyuMv_X.js.map} +1 -1
- package/dist/web/public/assets/{table-BBISYTH-.js → table-BKdG9tsY.js} +2 -2
- package/dist/web/public/assets/{table-BBISYTH-.js.map → table-BKdG9tsY.js.map} +1 -1
- package/dist/web/public/assets/{topn-JA8llaUI.js → topn-BpX8BKWS.js} +3 -3
- package/dist/web/public/assets/{topn-JA8llaUI.js.map → topn-BpX8BKWS.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-D8F96aYm.js → trash-2-DxKJo_-6.js} +3 -3
- package/dist/web/public/assets/{trash-2-D8F96aYm.js.map → trash-2-DxKJo_-6.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js +2 -0
- package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js.map +1 -0
- package/dist/web/public/assets/use-llm-admin-D4snixaM.js +2 -0
- package/dist/web/public/assets/use-llm-admin-D4snixaM.js.map +1 -0
- package/dist/web/public/assets/{use-memory-BDa1R8Tf.js → use-memory-Cqf3xywK.js} +2 -2
- package/dist/web/public/assets/{use-memory-BDa1R8Tf.js.map → use-memory-Cqf3xywK.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-XgxLMQsY.js → use-observability-Thh7LWoE.js} +2 -2
- package/dist/web/public/assets/{use-observability-XgxLMQsY.js.map → use-observability-Thh7LWoE.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-Bc4s-JUD.js → use-settings-DRhH8owt.js} +2 -2
- package/dist/web/public/assets/{use-settings-Bc4s-JUD.js.map → use-settings-DRhH8owt.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-JalfqH6H.js → use-workspace-iLKz-h_7.js} +2 -2
- package/dist/web/public/assets/{use-workspace-JalfqH6H.js.map → use-workspace-iLKz-h_7.js.map} +1 -1
- package/dist/web/public/assets/useQuery-gnz30xMJ.js +2 -0
- package/dist/web/public/assets/{useQuery-DFryK9Pn.js.map → useQuery-gnz30xMJ.js.map} +1 -1
- package/dist/web/public/assets/{vector-G2dN_aut.js → vector-COjljy_4.js} +2 -2
- package/dist/web/public/assets/{vector-G2dN_aut.js.map → vector-COjljy_4.js.map} +1 -1
- package/dist/web/public/assets/viewer-AQHSc8hZ.js +12 -0
- package/dist/web/public/assets/viewer-AQHSc8hZ.js.map +1 -0
- package/dist/web/public/assets/{workspace-BaLZIgGn.js → workspace-DRtSCbx5.js} +4 -4
- package/dist/web/public/assets/{workspace-BaLZIgGn.js.map → workspace-DRtSCbx5.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-cX_rV523.js → workspaces-BLR5ZBu6.js} +3 -3
- package/dist/web/public/assets/{workspaces-cX_rV523.js.map → workspaces-BLR5ZBu6.js.map} +1 -1
- package/dist/web/public/assets/{x-D5196-9X.js → x-DGQ0qjhc.js} +2 -2
- package/dist/web/public/assets/{x-D5196-9X.js.map → x-DGQ0qjhc.js.map} +1 -1
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +45 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +2 -2
- package/dist/web/public/assets/agents-o9odac79.js +0 -12
- package/dist/web/public/assets/agents-o9odac79.js.map +0 -1
- package/dist/web/public/assets/hot-O9Z19xXa.js +0 -17
- package/dist/web/public/assets/hot-O9Z19xXa.js.map +0 -1
- package/dist/web/public/assets/index-CITyis5g.js +0 -166
- package/dist/web/public/assets/index-CITyis5g.js.map +0 -1
- package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
- package/dist/web/public/assets/installed-CM34mlDU.js +0 -7
- package/dist/web/public/assets/installed-CM34mlDU.js.map +0 -1
- package/dist/web/public/assets/layout-BxrFilDN.js +0 -2
- package/dist/web/public/assets/layout-BxrFilDN.js.map +0 -1
- package/dist/web/public/assets/layout-CcJQxFci.js +0 -2
- package/dist/web/public/assets/layout-CcJQxFci.js.map +0 -1
- package/dist/web/public/assets/layout-DRRveTaR.js +0 -2
- package/dist/web/public/assets/layout-DRRveTaR.js.map +0 -1
- package/dist/web/public/assets/policy-DwI-ov9J.js +0 -2
- package/dist/web/public/assets/reminders-X-QFSWvZ.js.map +0 -1
- package/dist/web/public/assets/use-skills-DCOYAQ8s.js +0 -2
- package/dist/web/public/assets/use-skills-DCOYAQ8s.js.map +0 -1
- package/dist/web/public/assets/useQuery-DFryK9Pn.js +0 -2
- package/dist/web/public/assets/viewer-DliYQkQQ.js +0 -12
- package/dist/web/public/assets/viewer-DliYQkQQ.js.map +0 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { FinishReason, LlmMessage, LlmProvider, LlmUsage, ToolCallRequest, ToolChoice, ToolDef } from './provider-base.js';
|
|
2
|
+
import type { ToolDispatcher } from './tool-dispatcher.js';
|
|
3
|
+
/**
|
|
4
|
+
* Per-tool-call gate. Return 'allow' to dispatch, 'deny' to inject a
|
|
5
|
+
* "user denied" tool result (so the model can react) without running
|
|
6
|
+
* the tool. Sub-PR #4 ships an IM-integrated implementation; tests
|
|
7
|
+
* and intro use a no-op gate (alwaysAllowGate).
|
|
8
|
+
*
|
|
9
|
+
* `call` is the request the LLM produced; `attempt` is the 0-indexed
|
|
10
|
+
* iteration count, useful for "ask once per session" policies.
|
|
11
|
+
*/
|
|
12
|
+
export type ApprovalGate = (call: ToolCallRequest, attempt: number) => Promise<'allow' | 'deny'>;
|
|
13
|
+
/** Default: skip approval entirely. The agent loop is safe-by-default
|
|
14
|
+
* for tests and the introspection use case; production AgentAdapters
|
|
15
|
+
* should pass a real gate. */
|
|
16
|
+
export declare const alwaysAllowGate: ApprovalGate;
|
|
17
|
+
/** Auxiliary finish reasons the agent loop adds on top of the provider's
|
|
18
|
+
* finishReason vocabulary. */
|
|
19
|
+
export type LoopFinishReason = FinishReason | 'max_iterations' | 'aborted';
|
|
20
|
+
export interface AgentLoopInput {
|
|
21
|
+
provider: LlmProvider;
|
|
22
|
+
/** Optional system prompt prepended ONCE; never re-issued across
|
|
23
|
+
* iterations. If `messages[0]` is already a system message, this
|
|
24
|
+
* field is ignored (mirrors LlmProvider.chat semantics). */
|
|
25
|
+
systemPrompt?: string;
|
|
26
|
+
/** Conversation so far. The loop appends to a local copy; the caller's
|
|
27
|
+
* array is NOT mutated. */
|
|
28
|
+
messages: LlmMessage[];
|
|
29
|
+
/** Tools the LLM may call. Empty / undefined disables tool use even
|
|
30
|
+
* if the provider advertises it. */
|
|
31
|
+
tools?: ToolDef[];
|
|
32
|
+
/** Hint forwarded to provider.chat (see provider-base ToolChoice). */
|
|
33
|
+
toolChoice?: ToolChoice;
|
|
34
|
+
/** Hard cap on iterations. Default 20 — high enough for non-trivial
|
|
35
|
+
* research, low enough that a runaway loop is bounded. */
|
|
36
|
+
maxIterations?: number;
|
|
37
|
+
/** Hard wall-clock cap (ms). Default 5 min. */
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
/** Outer abort signal; merged with timeoutMs into the provider call. */
|
|
40
|
+
signal?: AbortSignal;
|
|
41
|
+
/** Per-call provider knobs (model override / temperature / etc.). */
|
|
42
|
+
callOptions?: {
|
|
43
|
+
model?: string;
|
|
44
|
+
temperature?: number;
|
|
45
|
+
maxTokens?: number;
|
|
46
|
+
};
|
|
47
|
+
/** Routes tool calls to executors. Required when `tools` is non-empty;
|
|
48
|
+
* the loop throws on missing dispatcher to surface misconfig early. */
|
|
49
|
+
dispatch?: ToolDispatcher;
|
|
50
|
+
/** Pre-tool gate. Defaults to alwaysAllowGate. */
|
|
51
|
+
approve?: ApprovalGate;
|
|
52
|
+
/** Audit context — written into per-iteration invocations rows. The
|
|
53
|
+
* agent name should distinguish native vs cli (e.g. 'llm:native-chat'). */
|
|
54
|
+
audit?: {
|
|
55
|
+
agent: string;
|
|
56
|
+
intent?: string;
|
|
57
|
+
userId?: string;
|
|
58
|
+
platform?: string;
|
|
59
|
+
traceId?: string;
|
|
60
|
+
};
|
|
61
|
+
/** Lifecycle hooks for caller-side observability (heartbeats, progress
|
|
62
|
+
* push, custom logging). All hooks are best-effort: thrown errors are
|
|
63
|
+
* swallowed so a faulty observer cannot break the loop. */
|
|
64
|
+
hooks?: {
|
|
65
|
+
/** Fires right before a tool's dispatcher is invoked (after the
|
|
66
|
+
* approval gate has allowed the call). */
|
|
67
|
+
onToolStart?: (call: ToolCallRequest) => void;
|
|
68
|
+
/** Fires right after the dispatcher returns or throws. */
|
|
69
|
+
onToolEnd?: (call: ToolCallRequest, summary: {
|
|
70
|
+
isError: boolean;
|
|
71
|
+
durationMs: number;
|
|
72
|
+
}) => void;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export interface ToolCallReport {
|
|
76
|
+
name: string;
|
|
77
|
+
/** `'allow' | 'deny'` from the approval gate before dispatch. */
|
|
78
|
+
decision: 'allow' | 'deny';
|
|
79
|
+
/** True iff the dispatcher reported an error (or denied). */
|
|
80
|
+
isError: boolean;
|
|
81
|
+
/** Tag from the dispatcher (e.g. 'mcp:filesystem' / 'unknown'). */
|
|
82
|
+
source: string;
|
|
83
|
+
durationMs: number;
|
|
84
|
+
/** First 200 chars of the tool result text. Useful for debug /
|
|
85
|
+
* `/heartbeat run-now` style introspection; longer payloads aren't
|
|
86
|
+
* retained to keep memory + log size bounded. */
|
|
87
|
+
preview: string;
|
|
88
|
+
}
|
|
89
|
+
export interface AgentLoopResult {
|
|
90
|
+
/** Final assistant text the caller should show the user. May be the
|
|
91
|
+
* empty string for finishReason='max_iterations' / 'aborted' if the
|
|
92
|
+
* model never emitted assistant text before being cut off. */
|
|
93
|
+
text: string;
|
|
94
|
+
/** Number of provider.chat() calls (0 only when input.messages is
|
|
95
|
+
* empty AND the loop never ran). */
|
|
96
|
+
iterations: number;
|
|
97
|
+
/** Reports for every tool call the loop dispatched (or denied). */
|
|
98
|
+
toolCalls: ToolCallReport[];
|
|
99
|
+
/** Aggregated usage across iterations. costUsd is summed when present. */
|
|
100
|
+
usage: LlmUsage;
|
|
101
|
+
/** Why the loop stopped. */
|
|
102
|
+
finishReason: LoopFinishReason;
|
|
103
|
+
/** Provider-side error message when finishReason='error'. */
|
|
104
|
+
error?: string;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Run the loop. ALL exceptions are caught and converted to a result
|
|
108
|
+
* with finishReason='error' — the caller (IM AgentAdapter) wants to
|
|
109
|
+
* surface failures to the user, not crash agim.
|
|
110
|
+
*/
|
|
111
|
+
export declare function runAgentLoop(input: AgentLoopInput): Promise<AgentLoopResult>;
|
|
112
|
+
//# sourceMappingURL=agent-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../../src/core/llm/agent-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// agent-loop — multi-iteration tool-using chat loop (Stage 2 sub-PR #3).
|
|
2
|
+
//
|
|
3
|
+
// One call to `runAgentLoop` is one *turn* from the IM user's perspective:
|
|
4
|
+
//
|
|
5
|
+
// ┌──────────────────────────────────────────────────────┐
|
|
6
|
+
// │ messages = [system?, user, ...history?] │
|
|
7
|
+
// │ tools = [] (or [ToolDef, ToolDef, ...]) │
|
|
8
|
+
// └────────────────────────┬─────────────────────────────┘
|
|
9
|
+
// ▼
|
|
10
|
+
// ┌───── iteration i = 0 .. maxIterations-1 ───────┐
|
|
11
|
+
// │ │
|
|
12
|
+
// │ provider.chat(messages, {tools}) │
|
|
13
|
+
// │ ↓ │
|
|
14
|
+
// │ finishReason ∈ {'stop','length','content_filter',│
|
|
15
|
+
// │ 'tool_use','error','unknown'} │
|
|
16
|
+
// │ │
|
|
17
|
+
// │ ├─ tool_use → for each toolCall in result: │
|
|
18
|
+
// │ │ 1. approvalGate(call) → allow|deny │
|
|
19
|
+
// │ │ 2. dispatch(call) → DispatcherResult │
|
|
20
|
+
// │ │ 3. append {role:'tool', toolCallId, │
|
|
21
|
+
// │ │ content:result.text} │
|
|
22
|
+
// │ │ then append the assistant turn (with │
|
|
23
|
+
// │ │ its toolCalls) BEFORE the tool messages │
|
|
24
|
+
// │ │ so the provider can re-feed the batch. │
|
|
25
|
+
// │ │ continue. │
|
|
26
|
+
// │ │ │
|
|
27
|
+
// │ └─ anything else → return final text. │
|
|
28
|
+
// │ │
|
|
29
|
+
// └──────────────────────────────────────────────────┘
|
|
30
|
+
//
|
|
31
|
+
// Out-of-iteration paths:
|
|
32
|
+
// - signal aborted → return finishReason='aborted'
|
|
33
|
+
// - max iterations → return finishReason='max_iterations'
|
|
34
|
+
// - provider throws → return finishReason='error', text=''. We do
|
|
35
|
+
// NOT re-throw because callers (the upcoming
|
|
36
|
+
// native AgentAdapter) want to surface the
|
|
37
|
+
// error to the IM thread, not crash agim.
|
|
38
|
+
//
|
|
39
|
+
// Audit accounting: each iteration writes one `invocations` row with
|
|
40
|
+
// intent='native.agent.iter' and the iteration's usage. The agent loop
|
|
41
|
+
// itself is intentionally agnostic about the bigger "turn" — the caller
|
|
42
|
+
// (sub-PR #4 AgentAdapter) will write a parent invocation row that
|
|
43
|
+
// aggregates these. Per-iteration rows make `/tasks#cost` pivots
|
|
44
|
+
// possible (you can see whether 90% of cost went into one runaway
|
|
45
|
+
// iteration vs spread evenly).
|
|
46
|
+
import { logger as rootLogger } from '../logger.js';
|
|
47
|
+
import { logInvocation } from '../audit-log.js';
|
|
48
|
+
const log = rootLogger.child({ component: 'agent-loop' });
|
|
49
|
+
const DEFAULT_MAX_ITERATIONS = 20;
|
|
50
|
+
const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 min — generous; signal usually fires first
|
|
51
|
+
/** Default: skip approval entirely. The agent loop is safe-by-default
|
|
52
|
+
* for tests and the introspection use case; production AgentAdapters
|
|
53
|
+
* should pass a real gate. */
|
|
54
|
+
export const alwaysAllowGate = async () => 'allow';
|
|
55
|
+
/**
|
|
56
|
+
* Run the loop. ALL exceptions are caught and converted to a result
|
|
57
|
+
* with finishReason='error' — the caller (IM AgentAdapter) wants to
|
|
58
|
+
* surface failures to the user, not crash agim.
|
|
59
|
+
*/
|
|
60
|
+
export async function runAgentLoop(input) {
|
|
61
|
+
const tools = input.tools && input.tools.length > 0 ? input.tools : undefined;
|
|
62
|
+
if (tools && !input.dispatch) {
|
|
63
|
+
throw new Error('agent-loop: dispatch is required when tools is non-empty');
|
|
64
|
+
}
|
|
65
|
+
const maxIter = clampInt(input.maxIterations ?? DEFAULT_MAX_ITERATIONS, 1, 100);
|
|
66
|
+
const timeoutMs = input.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
67
|
+
const approve = input.approve ?? alwaysAllowGate;
|
|
68
|
+
const dispatch = input.dispatch;
|
|
69
|
+
const signal = mergeSignal(input.signal, timeoutMs);
|
|
70
|
+
// Local copy so we don't mutate the caller's array.
|
|
71
|
+
const history = input.messages.slice();
|
|
72
|
+
const toolCalls = [];
|
|
73
|
+
const usageAcc = {};
|
|
74
|
+
let iter = 0;
|
|
75
|
+
for (; iter < maxIter; iter++) {
|
|
76
|
+
if (signal.signal.aborted) {
|
|
77
|
+
signal.cleanup();
|
|
78
|
+
return {
|
|
79
|
+
text: '',
|
|
80
|
+
iterations: iter,
|
|
81
|
+
toolCalls,
|
|
82
|
+
usage: usageAcc,
|
|
83
|
+
finishReason: 'aborted',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
let result;
|
|
87
|
+
const t0 = Date.now();
|
|
88
|
+
try {
|
|
89
|
+
result = await input.provider.chat(history, {
|
|
90
|
+
system: input.systemPrompt,
|
|
91
|
+
tools,
|
|
92
|
+
toolChoice: input.toolChoice,
|
|
93
|
+
signal: signal.signal,
|
|
94
|
+
timeoutMs,
|
|
95
|
+
model: input.callOptions?.model,
|
|
96
|
+
temperature: input.callOptions?.temperature,
|
|
97
|
+
maxTokens: input.callOptions?.maxTokens,
|
|
98
|
+
onUsage: (u) => mergeUsage(usageAcc, u),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
103
|
+
log.warn({
|
|
104
|
+
event: 'agent-loop.provider_failed',
|
|
105
|
+
backend: input.provider.name,
|
|
106
|
+
iter, err: msg,
|
|
107
|
+
});
|
|
108
|
+
signal.cleanup();
|
|
109
|
+
writeIterAudit(input.audit, t0, 0, 0, false, msg);
|
|
110
|
+
return {
|
|
111
|
+
text: '',
|
|
112
|
+
iterations: iter + 1,
|
|
113
|
+
toolCalls,
|
|
114
|
+
usage: usageAcc,
|
|
115
|
+
finishReason: 'error',
|
|
116
|
+
error: msg,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
writeIterAudit(input.audit, t0,
|
|
120
|
+
// prompt_len approx = sum of message lengths; cheap to compute.
|
|
121
|
+
history.reduce((n, m) => n + (m.content?.length ?? 0), 0), result.text.length, true, undefined, result.usage.costUsd);
|
|
122
|
+
// No tools, or model decided not to call any → terminate.
|
|
123
|
+
if (result.finishReason !== 'tool_use' || !result.toolCalls || result.toolCalls.length === 0) {
|
|
124
|
+
signal.cleanup();
|
|
125
|
+
return {
|
|
126
|
+
text: result.text,
|
|
127
|
+
iterations: iter + 1,
|
|
128
|
+
toolCalls,
|
|
129
|
+
usage: usageAcc,
|
|
130
|
+
finishReason: result.finishReason,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Persist the assistant turn with its toolCalls so the next
|
|
134
|
+
// provider call sees the same conversation shape.
|
|
135
|
+
history.push({
|
|
136
|
+
role: 'assistant',
|
|
137
|
+
content: result.text,
|
|
138
|
+
toolCalls: result.toolCalls,
|
|
139
|
+
reasoningContent: result.reasoningContent,
|
|
140
|
+
});
|
|
141
|
+
// Execute each tool call (sequentially — preserves order in the
|
|
142
|
+
// conversation log and dodges races against the dispatcher's
|
|
143
|
+
// internal state e.g. MCP session). Concurrent execution lands
|
|
144
|
+
// when we have a real-world workload that justifies it.
|
|
145
|
+
for (const call of result.toolCalls) {
|
|
146
|
+
if (signal.signal.aborted)
|
|
147
|
+
break;
|
|
148
|
+
const reportBase = {
|
|
149
|
+
name: call.name,
|
|
150
|
+
source: 'unknown',
|
|
151
|
+
preview: '',
|
|
152
|
+
};
|
|
153
|
+
const decision = await safeApprove(approve, call, iter);
|
|
154
|
+
if (decision === 'deny') {
|
|
155
|
+
const denyText = `tool call denied by user: ${call.name}`;
|
|
156
|
+
history.push({ role: 'tool', toolCallId: call.id, content: denyText });
|
|
157
|
+
toolCalls.push({
|
|
158
|
+
...reportBase,
|
|
159
|
+
decision: 'deny',
|
|
160
|
+
isError: true,
|
|
161
|
+
durationMs: 0,
|
|
162
|
+
preview: denyText,
|
|
163
|
+
});
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (!dispatch) {
|
|
167
|
+
// Defensive — schema enforces dispatch when tools is set, but
|
|
168
|
+
// theoretically a caller could pass tools+approve without a
|
|
169
|
+
// dispatcher. Don't crash; tell the model the tool failed.
|
|
170
|
+
const denyText = `tool call refused: no dispatcher registered`;
|
|
171
|
+
history.push({ role: 'tool', toolCallId: call.id, content: denyText });
|
|
172
|
+
toolCalls.push({
|
|
173
|
+
...reportBase,
|
|
174
|
+
decision: 'allow',
|
|
175
|
+
isError: true,
|
|
176
|
+
durationMs: 0,
|
|
177
|
+
preview: denyText,
|
|
178
|
+
});
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
input.hooks?.onToolStart?.(call);
|
|
183
|
+
}
|
|
184
|
+
catch { /* observer must not break loop */ }
|
|
185
|
+
const dt0 = Date.now();
|
|
186
|
+
let dispatched;
|
|
187
|
+
try {
|
|
188
|
+
dispatched = await dispatch(call, signal.signal);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
192
|
+
dispatched = { text: `tool threw: ${msg}`, isError: true, source: 'error' };
|
|
193
|
+
log.warn({
|
|
194
|
+
event: 'agent-loop.dispatch_threw',
|
|
195
|
+
tool: call.name, err: msg,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
const durationMs = Date.now() - dt0;
|
|
199
|
+
try {
|
|
200
|
+
input.hooks?.onToolEnd?.(call, { isError: !!dispatched.isError, durationMs });
|
|
201
|
+
}
|
|
202
|
+
catch { /* observer must not break loop */ }
|
|
203
|
+
history.push({
|
|
204
|
+
role: 'tool',
|
|
205
|
+
toolCallId: call.id,
|
|
206
|
+
content: dispatched.text,
|
|
207
|
+
});
|
|
208
|
+
toolCalls.push({
|
|
209
|
+
name: call.name,
|
|
210
|
+
decision: 'allow',
|
|
211
|
+
isError: dispatched.isError,
|
|
212
|
+
source: dispatched.source ?? 'unknown',
|
|
213
|
+
durationMs,
|
|
214
|
+
preview: dispatched.text.slice(0, 200),
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
// Loop tail → next iteration calls provider with appended history.
|
|
218
|
+
}
|
|
219
|
+
// Fell off the loop without a non-tool_use finish → max iterations.
|
|
220
|
+
signal.cleanup();
|
|
221
|
+
return {
|
|
222
|
+
text: '',
|
|
223
|
+
iterations: iter,
|
|
224
|
+
toolCalls,
|
|
225
|
+
usage: usageAcc,
|
|
226
|
+
finishReason: 'max_iterations',
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// ─── helpers ─────────────────────────────────────────────────────────
|
|
230
|
+
function mergeUsage(acc, add) {
|
|
231
|
+
if (typeof add.promptTokens === 'number') {
|
|
232
|
+
acc.promptTokens = (acc.promptTokens ?? 0) + add.promptTokens;
|
|
233
|
+
}
|
|
234
|
+
if (typeof add.completionTokens === 'number') {
|
|
235
|
+
acc.completionTokens = (acc.completionTokens ?? 0) + add.completionTokens;
|
|
236
|
+
}
|
|
237
|
+
if (typeof add.totalTokens === 'number') {
|
|
238
|
+
acc.totalTokens = (acc.totalTokens ?? 0) + add.totalTokens;
|
|
239
|
+
}
|
|
240
|
+
if (typeof add.costUsd === 'number') {
|
|
241
|
+
acc.costUsd = (acc.costUsd ?? 0) + add.costUsd;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function clampInt(n, lo, hi) {
|
|
245
|
+
if (!Number.isFinite(n))
|
|
246
|
+
return lo;
|
|
247
|
+
return Math.max(lo, Math.min(hi, Math.floor(n)));
|
|
248
|
+
}
|
|
249
|
+
function mergeSignal(userSignal, timeoutMs) {
|
|
250
|
+
if (!userSignal && !timeoutMs) {
|
|
251
|
+
const ctrl = new AbortController();
|
|
252
|
+
return { signal: ctrl.signal, cleanup: () => { } };
|
|
253
|
+
}
|
|
254
|
+
const ctrl = new AbortController();
|
|
255
|
+
let timer = null;
|
|
256
|
+
const onAbort = () => ctrl.abort(userSignal?.reason ?? new Error('aborted'));
|
|
257
|
+
if (userSignal) {
|
|
258
|
+
if (userSignal.aborted)
|
|
259
|
+
onAbort();
|
|
260
|
+
else
|
|
261
|
+
userSignal.addEventListener('abort', onAbort, { once: true });
|
|
262
|
+
}
|
|
263
|
+
if (timeoutMs && Number.isFinite(timeoutMs) && timeoutMs > 0) {
|
|
264
|
+
timer = setTimeout(() => ctrl.abort(new Error(`agent loop timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
265
|
+
if (typeof timer === 'object' && timer && 'unref' in timer) {
|
|
266
|
+
timer.unref();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
signal: ctrl.signal,
|
|
271
|
+
cleanup: () => {
|
|
272
|
+
if (timer)
|
|
273
|
+
clearTimeout(timer);
|
|
274
|
+
if (userSignal)
|
|
275
|
+
userSignal.removeEventListener('abort', onAbort);
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
async function safeApprove(gate, call, attempt) {
|
|
280
|
+
try {
|
|
281
|
+
return await gate(call, attempt);
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
log.warn({
|
|
285
|
+
event: 'agent-loop.approve_threw',
|
|
286
|
+
tool: call.name,
|
|
287
|
+
err: err instanceof Error ? err.message : String(err),
|
|
288
|
+
});
|
|
289
|
+
// Fail closed when the gate itself errors: better safe than sorry.
|
|
290
|
+
return 'deny';
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function writeIterAudit(audit, startedAt, promptLen, responseLen, success, error, cost) {
|
|
294
|
+
if (!audit)
|
|
295
|
+
return;
|
|
296
|
+
try {
|
|
297
|
+
logInvocation({
|
|
298
|
+
traceId: audit.traceId ?? `agent-loop-${Date.now()}`,
|
|
299
|
+
userId: audit.userId ?? '',
|
|
300
|
+
platform: audit.platform ?? 'native-agent',
|
|
301
|
+
agent: audit.agent,
|
|
302
|
+
intent: audit.intent ?? 'native.agent.iter',
|
|
303
|
+
promptLen,
|
|
304
|
+
responseLen,
|
|
305
|
+
durationMs: Date.now() - startedAt,
|
|
306
|
+
cost: typeof cost === 'number' ? cost : 0,
|
|
307
|
+
success,
|
|
308
|
+
error,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
catch { /* audit best-effort */ }
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=agent-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../../src/core/llm/agent-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { LlmProvider, type ChatResult, type ChatStreamChunk, type LlmMessage, type NormalizedOptions, type ProviderConfigBase } from './provider-base.js';
|
|
2
|
+
export interface AnthropicProviderConfig extends Omit<ProviderConfigBase, 'providerType'> {
|
|
3
|
+
/** Base URL up to (but not including) `/v1/messages`. Defaults to
|
|
4
|
+
* Anthropic's public endpoint. Override for Bedrock / Vertex / a
|
|
5
|
+
* corporate gateway. */
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
/** `anthropic-version` header value. Anthropic pins API behaviour to
|
|
8
|
+
* this date string; bumping it can change response shapes. We
|
|
9
|
+
* default to the latest stable as of 2026-05. */
|
|
10
|
+
apiVersion?: string;
|
|
11
|
+
/** Extra headers merged into every request. `x-api-key` /
|
|
12
|
+
* `anthropic-version` / `content-type` are set automatically and
|
|
13
|
+
* cannot be overridden here. */
|
|
14
|
+
extraHeaders?: Record<string, string>;
|
|
15
|
+
/** Retries on transient (429 / 5xx). Default 1, same as OpenAI compat. */
|
|
16
|
+
retryOnTransient?: number;
|
|
17
|
+
/** Display label for cost dashboard / logs. */
|
|
18
|
+
providerLabel?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Native Anthropic Messages API provider.
|
|
22
|
+
*
|
|
23
|
+
* The constructor takes the same shape as OpenAICompatProvider (caller
|
|
24
|
+
* code stays uniform); the differences live entirely in the wire-format
|
|
25
|
+
* helpers below.
|
|
26
|
+
*/
|
|
27
|
+
export declare class AnthropicProvider extends LlmProvider {
|
|
28
|
+
private readonly baseUrl;
|
|
29
|
+
private readonly apiVersion;
|
|
30
|
+
private readonly extraHeaders;
|
|
31
|
+
private readonly retryOnTransient;
|
|
32
|
+
constructor(cfg: AnthropicProviderConfig);
|
|
33
|
+
protected _callApi(messages: LlmMessage[], opts: NormalizedOptions, signal: AbortSignal): Promise<ChatResult>;
|
|
34
|
+
protected _callApiStream(messages: LlmMessage[], opts: NormalizedOptions, signal: AbortSignal): AsyncIterable<ChatStreamChunk>;
|
|
35
|
+
/**
|
|
36
|
+
* Compose the Anthropic Messages body. Differences vs OpenAI:
|
|
37
|
+
* - `system` is a top-level field, NOT a message
|
|
38
|
+
* - `messages[*].content` may be a string OR a content-block array
|
|
39
|
+
* - tool calls live inside assistant content as `{type:'tool_use',...}`
|
|
40
|
+
* - tool results live inside user content as `{type:'tool_result',...}`
|
|
41
|
+
* - `tools` use `input_schema` (we pass our ToolDef.parameters JSON
|
|
42
|
+
* Schema directly — Anthropic accepts the same dialect)
|
|
43
|
+
*/
|
|
44
|
+
private _buildBody;
|
|
45
|
+
private _postJson;
|
|
46
|
+
/**
|
|
47
|
+
* fetch + transient retry. Mirrors OpenAICompatProvider's logic on
|
|
48
|
+
* purpose so the two providers feel the same to operators reading
|
|
49
|
+
* logs.
|
|
50
|
+
*/
|
|
51
|
+
private _fetchWithRetry;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=anthropic-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../../src/core/llm/anthropic-provider.ts"],"names":[],"mappings":"AAgCA,OAAO,EACL,WAAW,EAEX,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EAEf,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAKxB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC;IACvF;;6BAEyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;sDAEkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;qCAEiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAMD;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAE7B,GAAG,EAAE,uBAAuB;cAWxB,QAAQ,CACtB,QAAQ,EAAE,UAAU,EAAE,EACtB,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,CAAC;cAmBI,cAAc,CACtC,QAAQ,EAAE,UAAU,EAAE,EACtB,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,WAAW,GAClB,aAAa,CAAC,eAAe,CAAC;IASjC;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;YAoBJ,SAAS;IAavB;;;;OAIG;YACW,eAAe;CA6C9B"}
|