agim-cli 1.2.45 → 1.2.49
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 +340 -0
- package/README.md +40 -6
- package/README.zh-CN.md +40 -6
- package/dist/cli-ui/config-wizard.js +16 -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 +38 -0
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +101 -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 +121 -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 +74 -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 +11 -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/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/cursor/ensure-mcp-config.d.ts +43 -0
- package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -0
- package/dist/plugins/agents/cursor/ensure-mcp-config.js +99 -0
- package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -0
- package/dist/plugins/agents/cursor/index.d.ts +28 -0
- package/dist/plugins/agents/cursor/index.d.ts.map +1 -0
- package/dist/plugins/agents/cursor/index.js +290 -0
- package/dist/plugins/agents/cursor/index.js.map +1 -0
- 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-Cdl8iY0e.js → a2a-06bnQicA.js} +3 -3
- package/dist/web/public/assets/{a2a-Cdl8iY0e.js.map → a2a-06bnQicA.js.map} +1 -1
- package/dist/web/public/assets/{activity-DXahuK1C.js → activity-Bhc6Esfy.js} +2 -2
- package/dist/web/public/assets/{activity-DXahuK1C.js.map → activity-Bhc6Esfy.js.map} +1 -1
- package/dist/web/public/assets/{admins-C8fJsuHC.js → admins-BVpnOw3o.js} +3 -3
- package/dist/web/public/assets/{admins-C8fJsuHC.js.map → admins-BVpnOw3o.js.map} +1 -1
- package/dist/web/public/assets/agents-Cn7D3UMz.js +7 -0
- package/dist/web/public/assets/agents-Cn7D3UMz.js.map +1 -0
- package/dist/web/public/assets/{approvals-CpyL90ef.js → approvals-BJiLyoLf.js} +3 -3
- package/dist/web/public/assets/{approvals-CpyL90ef.js.map → approvals-BJiLyoLf.js.map} +1 -1
- package/dist/web/public/assets/asks-C7gKbna1.js +7 -0
- package/dist/web/public/assets/asks-C7gKbna1.js.map +1 -0
- package/dist/web/public/assets/{audit-DDqpiC3z.js → audit-DgWZD8l5.js} +2 -2
- package/dist/web/public/assets/{audit-DDqpiC3z.js.map → audit-DgWZD8l5.js.map} +1 -1
- package/dist/web/public/assets/bell-pWZT2wlM.js +7 -0
- package/dist/web/public/assets/bell-pWZT2wlM.js.map +1 -0
- package/dist/web/public/assets/{bgjobs-CAFV-I4I.js → bgjobs-DkAJdzHf.js} +2 -2
- package/dist/web/public/assets/{bgjobs-CAFV-I4I.js.map → bgjobs-DkAJdzHf.js.map} +1 -1
- package/dist/web/public/assets/{brain-CJyZe3Oa.js → brain-B0mM-ro_.js} +2 -2
- package/dist/web/public/assets/{brain-CJyZe3Oa.js.map → brain-B0mM-ro_.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-DcLbQF2I.js → briefcase-CUQlj33_.js} +2 -2
- package/dist/web/public/assets/{briefcase-DcLbQF2I.js.map → briefcase-CUQlj33_.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-BhKELKvM.js → chevron-right-CJuDP_fx.js} +2 -2
- package/dist/web/public/assets/{chevron-right-BhKELKvM.js.map → chevron-right-CJuDP_fx.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-D1qST9RS.js → circle-check-CYse8LRx.js} +2 -2
- package/dist/web/public/assets/{circle-check-D1qST9RS.js.map → circle-check-CYse8LRx.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js → circle-check-big-9NpJLA1Z.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js.map → circle-check-big-9NpJLA1Z.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-DtePUX5x.js → circle-x-BxZ24SVG.js} +2 -2
- package/dist/web/public/assets/{circle-x-DtePUX5x.js.map → circle-x-BxZ24SVG.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js → confirm-dialog-CmHeZ7ei.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js.map → confirm-dialog-CmHeZ7ei.js.map} +1 -1
- package/dist/web/public/assets/{data-table-BRLUxacD.js → data-table-tu4BIahS.js} +5 -5
- package/dist/web/public/assets/{data-table-BRLUxacD.js.map → data-table-tu4BIahS.js.map} +1 -1
- package/dist/web/public/assets/{dialog-By4YA8bm.js → dialog-D8QAkLhI.js} +3 -3
- package/dist/web/public/assets/{dialog-By4YA8bm.js.map → dialog-D8QAkLhI.js.map} +1 -1
- package/dist/web/public/assets/{download-CiTB2sCh.js → download-DBS0ZPTh.js} +2 -2
- package/dist/web/public/assets/{download-CiTB2sCh.js.map → download-DBS0ZPTh.js.map} +1 -1
- package/dist/web/public/assets/{email-H-b2AExg.js → email-DgbAEEvZ.js} +3 -3
- package/dist/web/public/assets/{email-H-b2AExg.js.map → email-DgbAEEvZ.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-DZJTUlvz.js → empty-state-B1S_EYNJ.js} +2 -2
- package/dist/web/public/assets/{empty-state-DZJTUlvz.js.map → empty-state-B1S_EYNJ.js.map} +1 -1
- package/dist/web/public/assets/{external-link-CfU6Rttn.js → external-link-Dkmwlv6p.js} +2 -2
- package/dist/web/public/assets/{external-link-CfU6Rttn.js.map → external-link-Dkmwlv6p.js.map} +1 -1
- package/dist/web/public/assets/{eye-BvWcd0pJ.js → eye-Ch0DLviZ.js} +4 -4
- package/dist/web/public/assets/{eye-BvWcd0pJ.js.map → eye-Ch0DLviZ.js.map} +1 -1
- package/dist/web/public/assets/{facts-BRDbQLSI.js → facts-C3YV1Mkp.js} +2 -2
- package/dist/web/public/assets/{facts-BRDbQLSI.js.map → facts-C3YV1Mkp.js.map} +1 -1
- package/dist/web/public/assets/goals-DEt5gGry.js +17 -0
- package/dist/web/public/assets/goals-DEt5gGry.js.map +1 -0
- package/dist/web/public/assets/{health-DJPFOiKw.js → health-DuB9uNiZ.js} +2 -2
- package/dist/web/public/assets/{health-DJPFOiKw.js.map → health-DuB9uNiZ.js.map} +1 -1
- package/dist/web/public/assets/heart-pulse-CD8xNAGs.js +7 -0
- package/dist/web/public/assets/heart-pulse-CD8xNAGs.js.map +1 -0
- package/dist/web/public/assets/heartbeat-DbR8VwmG.js +7 -0
- package/dist/web/public/assets/heartbeat-DbR8VwmG.js.map +1 -0
- package/dist/web/public/assets/hot-izk3vGQB.js +17 -0
- package/dist/web/public/assets/hot-izk3vGQB.js.map +1 -0
- package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
- package/dist/web/public/assets/index-BY1vfCja.js +166 -0
- package/dist/web/public/assets/index-BY1vfCja.js.map +1 -0
- package/dist/web/public/assets/installed-BXB3-YIy.js +31 -0
- package/dist/web/public/assets/installed-BXB3-YIy.js.map +1 -0
- package/dist/web/public/assets/{jobs-DdWaBgOh.js → jobs-DkbM4mIQ.js} +2 -2
- package/dist/web/public/assets/{jobs-DdWaBgOh.js.map → jobs-DkbM4mIQ.js.map} +1 -1
- package/dist/web/public/assets/{layout-Dr12u0W_.js → layout-5ePj6Bek.js} +2 -2
- package/dist/web/public/assets/{layout-Dr12u0W_.js.map → layout-5ePj6Bek.js.map} +1 -1
- package/dist/web/public/assets/layout-B5Dzy_Zc.js +2 -0
- package/dist/web/public/assets/layout-B5Dzy_Zc.js.map +1 -0
- package/dist/web/public/assets/layout-BZpbNQFb.js +2 -0
- package/dist/web/public/assets/layout-BZpbNQFb.js.map +1 -0
- package/dist/web/public/assets/layout-DY9Xq34u.js +2 -0
- package/dist/web/public/assets/layout-DY9Xq34u.js.map +1 -0
- package/dist/web/public/assets/{layout-BybpkTy0.js → layout-DxzBaeTv.js} +2 -2
- package/dist/web/public/assets/{layout-BybpkTy0.js.map → layout-DxzBaeTv.js.map} +1 -1
- package/dist/web/public/assets/llm-Dg4W7eRM.js +7 -0
- package/dist/web/public/assets/llm-Dg4W7eRM.js.map +1 -0
- package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js → loader-circle-pGNYdPoE.js} +2 -2
- package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js.map → loader-circle-pGNYdPoE.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-B8hea8yW.js → map-pin-D1UX9mg7.js} +2 -2
- package/dist/web/public/assets/{map-pin-B8hea8yW.js.map → map-pin-D1UX9mg7.js.map} +1 -1
- package/dist/web/public/assets/mcp-uoOzu4_J.js +7 -0
- package/dist/web/public/assets/mcp-uoOzu4_J.js.map +1 -0
- package/dist/web/public/assets/{memos-C0_I1Uzt.js → memos-CAWASHg5.js} +2 -2
- package/dist/web/public/assets/{memos-C0_I1Uzt.js.map → memos-CAWASHg5.js.map} +1 -1
- package/dist/web/public/assets/{messengers-DuS5_JlE.js → messengers-B1-mZms8.js} +3 -3
- package/dist/web/public/assets/{messengers-DuS5_JlE.js.map → messengers-B1-mZms8.js.map} +1 -1
- package/dist/web/public/assets/native-agent-UuVvvzsW.js +7 -0
- package/dist/web/public/assets/native-agent-UuVvvzsW.js.map +1 -0
- package/dist/web/public/assets/{network-CpkocMHV.js → network-DpjSgAwW.js} +2 -2
- package/dist/web/public/assets/{network-CpkocMHV.js.map → network-DpjSgAwW.js.map} +1 -1
- package/dist/web/public/assets/{outbox-mGqTV2Ex.js → outbox-DeAgiXkY.js} +3 -3
- package/dist/web/public/assets/{outbox-mGqTV2Ex.js.map → outbox-DeAgiXkY.js.map} +1 -1
- package/dist/web/public/assets/{pagination-BAYvy11u.js → pagination-5GD_he3L.js} +3 -3
- package/dist/web/public/assets/{pagination-BAYvy11u.js.map → pagination-5GD_he3L.js.map} +1 -1
- package/dist/web/public/assets/{persona-CM0TLPJa.js → persona-BhkDCmeB.js} +2 -2
- package/dist/web/public/assets/{persona-CM0TLPJa.js.map → persona-BhkDCmeB.js.map} +1 -1
- package/dist/web/public/assets/{play-DMgMpe7N.js → play-B7o6cJ8W.js} +2 -2
- package/dist/web/public/assets/{play-DMgMpe7N.js.map → play-B7o6cJ8W.js.map} +1 -1
- package/dist/web/public/assets/plus-C5d4C6Zp.js +7 -0
- package/dist/web/public/assets/plus-C5d4C6Zp.js.map +1 -0
- package/dist/web/public/assets/policy-Ct_sKm3Y.js +2 -0
- package/dist/web/public/assets/{policy-Ch-xirrA.js.map → policy-Ct_sKm3Y.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js → refresh-ccw-BlXMN3UX.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js.map → refresh-ccw-BlXMN3UX.js.map} +1 -1
- package/dist/web/public/assets/{reminders-Dbe7Rc4h.js → reminders-gb1Y0S3t.js} +4 -9
- package/dist/web/public/assets/reminders-gb1Y0S3t.js.map +1 -0
- package/dist/web/public/assets/{save-1aALBaZc.js → save-DAFuApnY.js} +2 -2
- package/dist/web/public/assets/{save-1aALBaZc.js.map → save-DAFuApnY.js.map} +1 -1
- package/dist/web/public/assets/{schedules-BBQ2wcnS.js → schedules-CtFumT2B.js} +3 -3
- package/dist/web/public/assets/{schedules-BBQ2wcnS.js.map → schedules-CtFumT2B.js.map} +1 -1
- package/dist/web/public/assets/{search-DDYjsJ7-.js → search-BWuZE0YD.js} +2 -2
- package/dist/web/public/assets/{search-DDYjsJ7-.js.map → search-BWuZE0YD.js.map} +1 -1
- package/dist/web/public/assets/{service-DMp11TKF.js → service-lah7RWEc.js} +3 -3
- package/dist/web/public/assets/{service-DMp11TKF.js.map → service-lah7RWEc.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-Cvj81JKi.js → status-badge-BgmFa_8z.js} +2 -2
- package/dist/web/public/assets/{status-badge-Cvj81JKi.js.map → status-badge-BgmFa_8z.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js → subtasks-CgqrOGhl.js} +3 -3
- package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js.map → subtasks-CgqrOGhl.js.map} +1 -1
- package/dist/web/public/assets/{table-B6nK6k3L.js → table-BhDzIBvB.js} +2 -2
- package/dist/web/public/assets/{table-B6nK6k3L.js.map → table-BhDzIBvB.js.map} +1 -1
- package/dist/web/public/assets/{topn-BwFh2jKv.js → topn-DXgTCdM_.js} +3 -3
- package/dist/web/public/assets/{topn-BwFh2jKv.js.map → topn-DXgTCdM_.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-CqpMjbu5.js → trash-2-i4F_Rzh3.js} +3 -3
- package/dist/web/public/assets/{trash-2-CqpMjbu5.js.map → trash-2-i4F_Rzh3.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js +2 -0
- package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js.map +1 -0
- package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js +2 -0
- package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js.map +1 -0
- package/dist/web/public/assets/{use-memory-jxZdt-RL.js → use-memory-B_RQWQyG.js} +2 -2
- package/dist/web/public/assets/{use-memory-jxZdt-RL.js.map → use-memory-B_RQWQyG.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-9TDgLO9y.js → use-observability-CCTN-a71.js} +2 -2
- package/dist/web/public/assets/{use-observability-9TDgLO9y.js.map → use-observability-CCTN-a71.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-DFB_c2pr.js → use-settings-D4EdDLiK.js} +2 -2
- package/dist/web/public/assets/{use-settings-DFB_c2pr.js.map → use-settings-D4EdDLiK.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js → use-workspace-BhTEp_QH.js} +2 -2
- package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js.map → use-workspace-BhTEp_QH.js.map} +1 -1
- package/dist/web/public/assets/useQuery-DmoWKLw3.js +2 -0
- package/dist/web/public/assets/{useQuery-rLmHxFp4.js.map → useQuery-DmoWKLw3.js.map} +1 -1
- package/dist/web/public/assets/{vector-D9UqmLi6.js → vector-By-cheMu.js} +2 -2
- package/dist/web/public/assets/{vector-D9UqmLi6.js.map → vector-By-cheMu.js.map} +1 -1
- package/dist/web/public/assets/{viewer-_OpObeWr.js → viewer-CJNrz2iw.js} +3 -3
- package/dist/web/public/assets/{viewer-_OpObeWr.js.map → viewer-CJNrz2iw.js.map} +1 -1
- package/dist/web/public/assets/{workspace-DSHRdspq.js → workspace-DvYlIAhu.js} +4 -4
- package/dist/web/public/assets/{workspace-DSHRdspq.js.map → workspace-DvYlIAhu.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-CsBdhbXz.js → workspaces-2pn73O-K.js} +3 -3
- package/dist/web/public/assets/{workspaces-CsBdhbXz.js.map → workspaces-2pn73O-K.js.map} +1 -1
- package/dist/web/public/assets/{x-D1re-vBd.js → x-5Z_de5zo.js} +2 -2
- package/dist/web/public/assets/{x-D1re-vBd.js.map → x-5Z_de5zo.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-lrzFDGgX.js +0 -12
- package/dist/web/public/assets/agents-lrzFDGgX.js.map +0 -1
- package/dist/web/public/assets/hot-CFGHGkqL.js +0 -17
- package/dist/web/public/assets/hot-CFGHGkqL.js.map +0 -1
- package/dist/web/public/assets/index-C4hk1i67.js +0 -166
- package/dist/web/public/assets/index-C4hk1i67.js.map +0 -1
- package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
- package/dist/web/public/assets/installed-UONWfKHS.js +0 -7
- package/dist/web/public/assets/installed-UONWfKHS.js.map +0 -1
- package/dist/web/public/assets/layout-C8_IQRGM.js +0 -2
- package/dist/web/public/assets/layout-C8_IQRGM.js.map +0 -1
- package/dist/web/public/assets/layout-CxRHLqvi.js +0 -2
- package/dist/web/public/assets/layout-CxRHLqvi.js.map +0 -1
- package/dist/web/public/assets/layout-LC5zjw1h.js +0 -2
- package/dist/web/public/assets/layout-LC5zjw1h.js.map +0 -1
- package/dist/web/public/assets/policy-Ch-xirrA.js +0 -2
- package/dist/web/public/assets/reminders-Dbe7Rc4h.js.map +0 -1
- package/dist/web/public/assets/use-skills-OZKB5x-S.js +0 -2
- package/dist/web/public/assets/use-skills-OZKB5x-S.js.map +0 -1
- package/dist/web/public/assets/useQuery-rLmHxFp4.js +0 -2
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat message role. We intentionally support only the three canonical
|
|
3
|
+
* roles needed by introspection callers; tool / function roles arrive in
|
|
4
|
+
* Stage 2 when we add the real agent loop.
|
|
5
|
+
*/
|
|
6
|
+
export type LlmMessageRole = 'system' | 'user' | 'assistant' | 'tool';
|
|
7
|
+
/**
|
|
8
|
+
* Single chat message as sent to / received from the LLM provider.
|
|
9
|
+
*
|
|
10
|
+
* Roles + valid combinations of fields:
|
|
11
|
+
*
|
|
12
|
+
* { role: 'system' | 'user', content }
|
|
13
|
+
* plain text turn.
|
|
14
|
+
*
|
|
15
|
+
* { role: 'assistant', content, toolCalls? }
|
|
16
|
+
* model output. content may be the empty string when the model
|
|
17
|
+
* emitted only tool calls. toolCalls echoes ChatResult.toolCalls
|
|
18
|
+
* verbatim from a prior turn — required for history so the next
|
|
19
|
+
* tool-result message can reference call IDs.
|
|
20
|
+
*
|
|
21
|
+
* { role: 'tool', content, toolCallId }
|
|
22
|
+
* reply from agent code to a previous assistant tool call. content
|
|
23
|
+
* is the stringified tool result. toolCallId MUST match an id from
|
|
24
|
+
* the assistant turn's toolCalls (else providers reject the batch).
|
|
25
|
+
*/
|
|
26
|
+
export interface LlmMessage {
|
|
27
|
+
role: LlmMessageRole;
|
|
28
|
+
content: string;
|
|
29
|
+
/** Required when role='tool'; ignored otherwise. */
|
|
30
|
+
toolCallId?: string;
|
|
31
|
+
/** Required to round-trip assistant turns that contained tool calls;
|
|
32
|
+
* ignored on user/system/tool messages. Empty/undefined for plain
|
|
33
|
+
* assistant text turns. */
|
|
34
|
+
toolCalls?: ToolCallRequest[];
|
|
35
|
+
/** DeepSeek / thinking-mode providers echo `reasoning_content` on
|
|
36
|
+
* assistant turns; MUST round-trip on subsequent API calls. */
|
|
37
|
+
reasoningContent?: string;
|
|
38
|
+
/** Optional multimodal attachments (typically images). Providers with
|
|
39
|
+
* `supportsVision() === true` encode these as image_url / image
|
|
40
|
+
* content blocks; others ignore the field and only see `content`. The
|
|
41
|
+
* text path is preserved verbatim so non-vision providers still know
|
|
42
|
+
* an attachment was referenced. */
|
|
43
|
+
media?: Array<{
|
|
44
|
+
/** Absolute path to the file on disk. agim only attaches files
|
|
45
|
+
* inside the per-user media dir (`~/.agim/media/...`); providers
|
|
46
|
+
* read + inline-base64 the bytes. */
|
|
47
|
+
path: string;
|
|
48
|
+
/** Optional MIME hint (e.g. 'image/jpeg'). Provider may sniff from
|
|
49
|
+
* the extension if absent. */
|
|
50
|
+
mime?: string;
|
|
51
|
+
}>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Single tool exposed to the LLM. Equivalent to OpenAI's
|
|
55
|
+
* {type:'function', function:{...}} wrapper and Anthropic's {name,
|
|
56
|
+
* description, input_schema} entry; providers do the dialect adapt.
|
|
57
|
+
*
|
|
58
|
+
* `parameters` MUST be a JSON Schema object (typically
|
|
59
|
+
* `{type:'object', properties:{...}, required:[...]}`). We don't
|
|
60
|
+
* validate the schema here — providers usually pass it through verbatim
|
|
61
|
+
* and the LLM itself enforces the contract.
|
|
62
|
+
*/
|
|
63
|
+
export interface ToolDef {
|
|
64
|
+
name: string;
|
|
65
|
+
description: string;
|
|
66
|
+
parameters: Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* One tool call requested by the model. The Stage-2 agent loop iterates
|
|
70
|
+
* over `ChatResult.toolCalls`, executes each one, then appends matching
|
|
71
|
+
* `{role:'tool'}` messages and re-invokes the provider. The `id` is
|
|
72
|
+
* provider-assigned (OpenAI: 'call_...', Anthropic: 'toolu_...') and
|
|
73
|
+
* MUST round-trip on the tool-result message — providers reject batches
|
|
74
|
+
* where ids don't match.
|
|
75
|
+
*
|
|
76
|
+
* `arguments` is the already-JSON-parsed input. OpenAI returns a JSON
|
|
77
|
+
* string in `function.arguments`; we parse it client-side so every
|
|
78
|
+
* caller sees a normal object. When the LLM emits malformed JSON the
|
|
79
|
+
* provider sets `argumentsRaw` and leaves `arguments` as `{}`; tool
|
|
80
|
+
* implementations should validate the shape themselves.
|
|
81
|
+
*
|
|
82
|
+
* `raw` is reserved for provider-specific metadata that must round-trip
|
|
83
|
+
* across turns (e.g. Anthropic cache_control hints, future Gemini
|
|
84
|
+
* thought signatures). The agent loop preserves it verbatim.
|
|
85
|
+
*/
|
|
86
|
+
export interface ToolCallRequest {
|
|
87
|
+
id: string;
|
|
88
|
+
name: string;
|
|
89
|
+
arguments: Record<string, unknown>;
|
|
90
|
+
/** When present, JSON parsing of the arguments failed; tools should
|
|
91
|
+
* validate or refuse. Kept as a separate field so the common case
|
|
92
|
+
* (`arguments` is the parsed object) stays cheap. */
|
|
93
|
+
argumentsRaw?: string;
|
|
94
|
+
raw?: unknown;
|
|
95
|
+
}
|
|
96
|
+
/** Tool-choice hint forwarded to providers. Most providers default to
|
|
97
|
+
* 'auto'; a few callers want to force a specific tool ('required' +
|
|
98
|
+
* name) or block all tool use ('none') for one call. Provider support
|
|
99
|
+
* varies — unknown values fall back to 'auto'. */
|
|
100
|
+
export type ToolChoice = 'auto' | 'required' | 'none' | {
|
|
101
|
+
type: 'tool';
|
|
102
|
+
name: string;
|
|
103
|
+
};
|
|
104
|
+
/** Token + cost usage surfaced by the provider, when available. */
|
|
105
|
+
export interface LlmUsage {
|
|
106
|
+
promptTokens?: number;
|
|
107
|
+
completionTokens?: number;
|
|
108
|
+
totalTokens?: number;
|
|
109
|
+
/** Cost in USD if the provider reports it; otherwise undefined. We
|
|
110
|
+
* deliberately don't try to compute cost from a hardcoded price table
|
|
111
|
+
* — Stage 1 just passes through whatever the provider says. */
|
|
112
|
+
costUsd?: number;
|
|
113
|
+
}
|
|
114
|
+
/** Reason the model stopped generating. */
|
|
115
|
+
export type FinishReason = 'stop' | 'tool_use' | 'length' | 'content_filter' | 'error' | 'unknown';
|
|
116
|
+
/** Per-call options. All fields are optional with sensible defaults. */
|
|
117
|
+
export interface ChatOptions {
|
|
118
|
+
/** Override the provider's default model for this call. */
|
|
119
|
+
model?: string;
|
|
120
|
+
/** Sampling temperature. Default = provider default (usually 0.7). */
|
|
121
|
+
temperature?: number;
|
|
122
|
+
/** Max tokens in the completion. Default = provider default. */
|
|
123
|
+
maxTokens?: number;
|
|
124
|
+
/** Optional system prompt to prepend (a convenience over building a
|
|
125
|
+
* system message yourself; ignored if messages already starts with
|
|
126
|
+
* a system message). */
|
|
127
|
+
system?: string;
|
|
128
|
+
/** Abort the request when this signal fires. Required by callers that
|
|
129
|
+
* manage their own deadlines (memory-consolidate has a 60s cap). */
|
|
130
|
+
signal?: AbortSignal;
|
|
131
|
+
/** Internal hard deadline in ms. If both signal and timeoutMs are
|
|
132
|
+
* given, the earlier of the two wins. */
|
|
133
|
+
timeoutMs?: number;
|
|
134
|
+
/** Called once per provider response (or once per chunk for stream)
|
|
135
|
+
* with whatever usage info the provider returned. Best-effort —
|
|
136
|
+
* callers should not block on this. */
|
|
137
|
+
onUsage?: (usage: LlmUsage) => void;
|
|
138
|
+
/** Extra provider-specific knobs. Each provider documents what it
|
|
139
|
+
* reads from this bag; unknown keys are ignored. Keeps the public
|
|
140
|
+
* ChatOptions type stable while letting power users tune
|
|
141
|
+
* OpenRouter-style headers, DeepSeek-specific thinking mode, etc. */
|
|
142
|
+
providerOptions?: Record<string, unknown>;
|
|
143
|
+
/** Stage 2 — tool definitions advertised to the model. When unset
|
|
144
|
+
* (or empty) the model has no tool access for this call; this is
|
|
145
|
+
* the introspection-caller default and matches Stage-1 behaviour. */
|
|
146
|
+
tools?: ToolDef[];
|
|
147
|
+
/** Stage 2 — tool-use hint. 'auto' (default) lets the model decide;
|
|
148
|
+
* 'required' forces some tool call; 'none' suppresses tools even
|
|
149
|
+
* when `tools` is non-empty; `{type:'tool', name}` forces a
|
|
150
|
+
* specific tool. Provider support varies; unknown values fall
|
|
151
|
+
* back to 'auto'. */
|
|
152
|
+
toolChoice?: ToolChoice;
|
|
153
|
+
}
|
|
154
|
+
/** Result of a chat call. */
|
|
155
|
+
export interface ChatResult {
|
|
156
|
+
/** Plain text body. May be the empty string on `finishReason: 'error'`
|
|
157
|
+
* or when the model emitted only tool_calls. */
|
|
158
|
+
text: string;
|
|
159
|
+
/** Stage 2 — tool calls the model wants the agent loop to execute.
|
|
160
|
+
* When present, finishReason is typically 'tool_use'. Stage-1
|
|
161
|
+
* introspection callers can simply ignore this field — non-empty
|
|
162
|
+
* toolCalls in a chat() call (no agent loop) just means the model
|
|
163
|
+
* spent budget on a tool the caller never advertised, which is rare
|
|
164
|
+
* but harmless. */
|
|
165
|
+
toolCalls?: ToolCallRequest[];
|
|
166
|
+
/** Provider-specific thinking trace (e.g. DeepSeek reasoning_content). */
|
|
167
|
+
reasoningContent?: string;
|
|
168
|
+
/** Usage metrics, when the provider reports them. */
|
|
169
|
+
usage: LlmUsage;
|
|
170
|
+
/** Why the model stopped. */
|
|
171
|
+
finishReason: FinishReason;
|
|
172
|
+
/** Model id the provider actually used (handy for diagnostics when
|
|
173
|
+
* the caller relies on the provider's default rather than an explicit
|
|
174
|
+
* `opts.model`). */
|
|
175
|
+
modelUsed: string;
|
|
176
|
+
}
|
|
177
|
+
/** Lightweight stream chunk. Stage 1 streams only text deltas. */
|
|
178
|
+
export interface ChatStreamChunk {
|
|
179
|
+
textDelta: string;
|
|
180
|
+
/** Only populated on the final chunk. Earlier chunks have null. */
|
|
181
|
+
finishReason?: FinishReason | null;
|
|
182
|
+
/** Only populated on the final chunk, when the provider reports it. */
|
|
183
|
+
usage?: LlmUsage;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Common configuration every provider needs. Concrete providers may add
|
|
187
|
+
* their own fields (e.g. OpenAICompatProvider adds `baseUrl`).
|
|
188
|
+
*/
|
|
189
|
+
export interface ProviderConfigBase {
|
|
190
|
+
/** Unique identifier within an agim instance — e.g. "deepseek-cheap"
|
|
191
|
+
* or "gpt-4-1-judge". This is what `llmRoles` references. */
|
|
192
|
+
name: string;
|
|
193
|
+
/** Default model id the provider sends when ChatOptions.model is unset. */
|
|
194
|
+
model: string;
|
|
195
|
+
/** Provider type label, surfaced in logs and the web UI. */
|
|
196
|
+
providerType: string;
|
|
197
|
+
/** API key — provider implementations look this up via secrets.ts; the
|
|
198
|
+
* base class only uses it for logging length / fingerprinting. */
|
|
199
|
+
apiKey?: string;
|
|
200
|
+
/** Default temperature; falls back to 0.3 for cheap introspection
|
|
201
|
+
* callers (we want deterministic JSON, not creativity). */
|
|
202
|
+
defaultTemperature?: number;
|
|
203
|
+
/** Default max output tokens. Tight default so a misconfigured prompt
|
|
204
|
+
* can't burn 16k tokens worth of "Sure! Let me explain…". */
|
|
205
|
+
defaultMaxTokens?: number;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Base class for every LLM provider. The transport-specific work happens
|
|
209
|
+
* in `_callApi` / `_callApiStream` which subclasses implement. The base
|
|
210
|
+
* adds:
|
|
211
|
+
* - timeout / AbortSignal merging
|
|
212
|
+
* - default system prompt injection
|
|
213
|
+
* - onUsage plumbing (callers shouldn't have to defend against missing
|
|
214
|
+
* usage info)
|
|
215
|
+
* - finishReason normalization
|
|
216
|
+
*/
|
|
217
|
+
export declare abstract class LlmProvider {
|
|
218
|
+
readonly name: string;
|
|
219
|
+
readonly model: string;
|
|
220
|
+
readonly providerType: string;
|
|
221
|
+
protected readonly apiKey: string | undefined;
|
|
222
|
+
protected readonly defaultTemperature: number;
|
|
223
|
+
protected readonly defaultMaxTokens: number;
|
|
224
|
+
constructor(cfg: ProviderConfigBase);
|
|
225
|
+
/** True when the provider has the credentials it needs. False suggests
|
|
226
|
+
* the operator forgot to set the secret; the registry filters these
|
|
227
|
+
* out at load time so `getProvider()` callers don't have to check. */
|
|
228
|
+
isConfigured(): boolean;
|
|
229
|
+
/** True when this provider can interpret LlmMessage.media (typically
|
|
230
|
+
* image attachments). Default false — only the openai-compat
|
|
231
|
+
* provider currently overrides this (operators opt-in via the
|
|
232
|
+
* provider's `vision: true` config or a model-name heuristic).
|
|
233
|
+
* Anthropic / others fall back to text-only. */
|
|
234
|
+
supportsVision(): boolean;
|
|
235
|
+
/**
|
|
236
|
+
* Buffered chat call: send the full message list, await the entire
|
|
237
|
+
* response. Used by all Stage-1 introspection callers because the
|
|
238
|
+
* downstream parsers want a complete JSON string anyway.
|
|
239
|
+
*/
|
|
240
|
+
chat(messages: LlmMessage[], opts?: ChatOptions): Promise<ChatResult>;
|
|
241
|
+
/**
|
|
242
|
+
* Streaming chat call: async-iterable of text deltas. Stage-1 callers
|
|
243
|
+
* don't use this yet, but it's in the base API so Stage 2's agent loop
|
|
244
|
+
* (and the future "stream thinking to web UI" feature) can build on it
|
|
245
|
+
* without API churn.
|
|
246
|
+
*/
|
|
247
|
+
chatStream(messages: LlmMessage[], opts?: ChatOptions): AsyncIterable<ChatStreamChunk>;
|
|
248
|
+
/** Concrete providers implement this for buffered responses. */
|
|
249
|
+
protected abstract _callApi(messages: LlmMessage[], opts: NormalizedOptions, signal: AbortSignal): Promise<ChatResult>;
|
|
250
|
+
/** Concrete providers implement this for streamed responses. Default
|
|
251
|
+
* implementation falls back to buffered + single-chunk yield, so
|
|
252
|
+
* providers that don't support streaming still work (the caller sees
|
|
253
|
+
* one big chunk on completion). Override for real streaming. */
|
|
254
|
+
protected _callApiStream(messages: LlmMessage[], opts: NormalizedOptions, signal: AbortSignal): AsyncIterable<ChatStreamChunk>;
|
|
255
|
+
/**
|
|
256
|
+
* Prepend `opts.system` as a system message iff the caller didn't
|
|
257
|
+
* already supply one. Saves callers from threading the same conditional
|
|
258
|
+
* everywhere; documented in ChatOptions so behaviour is unsurprising.
|
|
259
|
+
*/
|
|
260
|
+
private _prepareMessages;
|
|
261
|
+
private _mergeOptions;
|
|
262
|
+
/**
|
|
263
|
+
* Merge the caller's AbortSignal with the optional timeout into a
|
|
264
|
+
* single composite signal. We deliberately don't use AbortSignal.any
|
|
265
|
+
* because Node 18 doesn't have it; the manual wiring is small enough
|
|
266
|
+
* to keep us portable. Returns a cleanup fn the caller must invoke to
|
|
267
|
+
* clear the timeout (prevents the test runner from keeping the event
|
|
268
|
+
* loop alive past test completion).
|
|
269
|
+
*/
|
|
270
|
+
private _buildSignal;
|
|
271
|
+
}
|
|
272
|
+
/** Internal normalized form of ChatOptions — concrete providers receive
|
|
273
|
+
* this rather than the raw ChatOptions so they don't have to repeat the
|
|
274
|
+
* defaulting logic. */
|
|
275
|
+
export interface NormalizedOptions {
|
|
276
|
+
model: string;
|
|
277
|
+
temperature: number;
|
|
278
|
+
maxTokens: number;
|
|
279
|
+
timeoutMs?: number;
|
|
280
|
+
providerOptions: Record<string, unknown>;
|
|
281
|
+
/** Stage 2 — tool definitions to advertise. Empty array → undefined
|
|
282
|
+
* so providers can rely on `opts.tools ? ... : ...` shorthand. */
|
|
283
|
+
tools?: ToolDef[];
|
|
284
|
+
toolChoice?: ToolChoice;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Helper for providers that want to format an error consistently. Wrapping
|
|
288
|
+
* the underlying fetch / SDK error in LlmProviderError makes it easy for
|
|
289
|
+
* callers (and the registry's "is the provider healthy?" probe) to tell
|
|
290
|
+
* a transport failure apart from a logic bug.
|
|
291
|
+
*/
|
|
292
|
+
export declare class LlmProviderError extends Error {
|
|
293
|
+
readonly providerName: string;
|
|
294
|
+
readonly httpStatus?: number;
|
|
295
|
+
readonly transient: boolean;
|
|
296
|
+
constructor(providerName: string, message: string, opts?: {
|
|
297
|
+
httpStatus?: number;
|
|
298
|
+
transient?: boolean;
|
|
299
|
+
cause?: unknown;
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=provider-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-base.d.ts","sourceRoot":"","sources":["../../../src/core/llm/provider-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
// LLM provider abstraction (Stage 1 — D+ plan, 2026-05-23).
|
|
2
|
+
//
|
|
3
|
+
// The goal here is intentionally small: give agim a way to do
|
|
4
|
+
// "single-shot LLM call → text" *without* spawning a CLI agent (Claude
|
|
5
|
+
// Code / Codex / OpenCode). agim stays a CLI bridge in spirit — these
|
|
6
|
+
// providers are only used by internal introspection callers
|
|
7
|
+
// (memory-distill, memory-consolidate, intent-llm, future heartbeat /
|
|
8
|
+
// notification evaluator).
|
|
9
|
+
//
|
|
10
|
+
// Stage 1 explicitly does NOT implement:
|
|
11
|
+
// - tool calling / agent loop (that's Stage 2)
|
|
12
|
+
// - MCP client (Stage 2)
|
|
13
|
+
// - file / shell tools (delegated to MCP in Stage 2)
|
|
14
|
+
// - Anthropic native messages API (Stage 2)
|
|
15
|
+
//
|
|
16
|
+
// What it DOES support:
|
|
17
|
+
// - `chat(messages, opts) → ChatResult` for buffered text responses
|
|
18
|
+
// - `chatStream(...)` async iterable for incremental delivery
|
|
19
|
+
// - timeouts via AbortSignal
|
|
20
|
+
// - usage / cost telemetry surfaced through onUsage callback
|
|
21
|
+
//
|
|
22
|
+
// Concrete providers (Stage 1: OpenAICompatProvider only) subclass and
|
|
23
|
+
// implement `_callApi` / `_callApiStream`. The base wraps with timeout +
|
|
24
|
+
// telemetry plumbing so providers stay focused on transport details.
|
|
25
|
+
/**
|
|
26
|
+
* Base class for every LLM provider. The transport-specific work happens
|
|
27
|
+
* in `_callApi` / `_callApiStream` which subclasses implement. The base
|
|
28
|
+
* adds:
|
|
29
|
+
* - timeout / AbortSignal merging
|
|
30
|
+
* - default system prompt injection
|
|
31
|
+
* - onUsage plumbing (callers shouldn't have to defend against missing
|
|
32
|
+
* usage info)
|
|
33
|
+
* - finishReason normalization
|
|
34
|
+
*/
|
|
35
|
+
export class LlmProvider {
|
|
36
|
+
name;
|
|
37
|
+
model;
|
|
38
|
+
providerType;
|
|
39
|
+
apiKey;
|
|
40
|
+
defaultTemperature;
|
|
41
|
+
defaultMaxTokens;
|
|
42
|
+
constructor(cfg) {
|
|
43
|
+
if (!cfg.name)
|
|
44
|
+
throw new Error('LlmProvider: name is required');
|
|
45
|
+
if (!cfg.model)
|
|
46
|
+
throw new Error('LlmProvider: model is required');
|
|
47
|
+
if (!cfg.providerType)
|
|
48
|
+
throw new Error('LlmProvider: providerType is required');
|
|
49
|
+
this.name = cfg.name;
|
|
50
|
+
this.model = cfg.model;
|
|
51
|
+
this.providerType = cfg.providerType;
|
|
52
|
+
this.apiKey = cfg.apiKey;
|
|
53
|
+
this.defaultTemperature = cfg.defaultTemperature ?? 0.3;
|
|
54
|
+
this.defaultMaxTokens = cfg.defaultMaxTokens ?? 1024;
|
|
55
|
+
}
|
|
56
|
+
/** True when the provider has the credentials it needs. False suggests
|
|
57
|
+
* the operator forgot to set the secret; the registry filters these
|
|
58
|
+
* out at load time so `getProvider()` callers don't have to check. */
|
|
59
|
+
isConfigured() {
|
|
60
|
+
return Boolean(this.apiKey);
|
|
61
|
+
}
|
|
62
|
+
/** True when this provider can interpret LlmMessage.media (typically
|
|
63
|
+
* image attachments). Default false — only the openai-compat
|
|
64
|
+
* provider currently overrides this (operators opt-in via the
|
|
65
|
+
* provider's `vision: true` config or a model-name heuristic).
|
|
66
|
+
* Anthropic / others fall back to text-only. */
|
|
67
|
+
supportsVision() {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Buffered chat call: send the full message list, await the entire
|
|
72
|
+
* response. Used by all Stage-1 introspection callers because the
|
|
73
|
+
* downstream parsers want a complete JSON string anyway.
|
|
74
|
+
*/
|
|
75
|
+
async chat(messages, opts = {}) {
|
|
76
|
+
const prepared = this._prepareMessages(messages, opts);
|
|
77
|
+
const merged = this._mergeOptions(opts);
|
|
78
|
+
const signal = this._buildSignal(opts.signal, merged.timeoutMs);
|
|
79
|
+
const result = await this._callApi(prepared, merged, signal.signal);
|
|
80
|
+
signal.cleanup();
|
|
81
|
+
if (opts.onUsage) {
|
|
82
|
+
try {
|
|
83
|
+
opts.onUsage(result.usage);
|
|
84
|
+
}
|
|
85
|
+
catch { /* swallow — telemetry is best-effort */ }
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Streaming chat call: async-iterable of text deltas. Stage-1 callers
|
|
91
|
+
* don't use this yet, but it's in the base API so Stage 2's agent loop
|
|
92
|
+
* (and the future "stream thinking to web UI" feature) can build on it
|
|
93
|
+
* without API churn.
|
|
94
|
+
*/
|
|
95
|
+
async *chatStream(messages, opts = {}) {
|
|
96
|
+
const prepared = this._prepareMessages(messages, opts);
|
|
97
|
+
const merged = this._mergeOptions(opts);
|
|
98
|
+
const signal = this._buildSignal(opts.signal, merged.timeoutMs);
|
|
99
|
+
try {
|
|
100
|
+
let lastUsage;
|
|
101
|
+
for await (const chunk of this._callApiStream(prepared, merged, signal.signal)) {
|
|
102
|
+
if (chunk.usage)
|
|
103
|
+
lastUsage = chunk.usage;
|
|
104
|
+
yield chunk;
|
|
105
|
+
}
|
|
106
|
+
if (lastUsage && opts.onUsage) {
|
|
107
|
+
try {
|
|
108
|
+
opts.onUsage(lastUsage);
|
|
109
|
+
}
|
|
110
|
+
catch { /* swallow */ }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
signal.cleanup();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Concrete providers implement this for streamed responses. Default
|
|
118
|
+
* implementation falls back to buffered + single-chunk yield, so
|
|
119
|
+
* providers that don't support streaming still work (the caller sees
|
|
120
|
+
* one big chunk on completion). Override for real streaming. */
|
|
121
|
+
async *_callApiStream(messages, opts, signal) {
|
|
122
|
+
const result = await this._callApi(messages, opts, signal);
|
|
123
|
+
yield {
|
|
124
|
+
textDelta: result.text,
|
|
125
|
+
finishReason: result.finishReason,
|
|
126
|
+
usage: result.usage,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Prepend `opts.system` as a system message iff the caller didn't
|
|
131
|
+
* already supply one. Saves callers from threading the same conditional
|
|
132
|
+
* everywhere; documented in ChatOptions so behaviour is unsurprising.
|
|
133
|
+
*/
|
|
134
|
+
_prepareMessages(messages, opts) {
|
|
135
|
+
if (!opts.system)
|
|
136
|
+
return messages;
|
|
137
|
+
if (messages.length > 0 && messages[0].role === 'system')
|
|
138
|
+
return messages;
|
|
139
|
+
return [{ role: 'system', content: opts.system }, ...messages];
|
|
140
|
+
}
|
|
141
|
+
_mergeOptions(opts) {
|
|
142
|
+
return {
|
|
143
|
+
model: opts.model || this.model,
|
|
144
|
+
temperature: opts.temperature ?? this.defaultTemperature,
|
|
145
|
+
maxTokens: opts.maxTokens ?? this.defaultMaxTokens,
|
|
146
|
+
timeoutMs: opts.timeoutMs,
|
|
147
|
+
providerOptions: opts.providerOptions ?? {},
|
|
148
|
+
tools: opts.tools && opts.tools.length > 0 ? opts.tools : undefined,
|
|
149
|
+
toolChoice: opts.toolChoice,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Merge the caller's AbortSignal with the optional timeout into a
|
|
154
|
+
* single composite signal. We deliberately don't use AbortSignal.any
|
|
155
|
+
* because Node 18 doesn't have it; the manual wiring is small enough
|
|
156
|
+
* to keep us portable. Returns a cleanup fn the caller must invoke to
|
|
157
|
+
* clear the timeout (prevents the test runner from keeping the event
|
|
158
|
+
* loop alive past test completion).
|
|
159
|
+
*/
|
|
160
|
+
_buildSignal(userSignal, timeoutMs) {
|
|
161
|
+
if (!userSignal && !timeoutMs) {
|
|
162
|
+
// Fast path: no constraints, return a never-aborted controller so
|
|
163
|
+
// _callApi has a single signal contract to work with.
|
|
164
|
+
const ctrl = new AbortController();
|
|
165
|
+
return { signal: ctrl.signal, cleanup: () => { } };
|
|
166
|
+
}
|
|
167
|
+
const ctrl = new AbortController();
|
|
168
|
+
let timer = null;
|
|
169
|
+
const onUserAbort = () => {
|
|
170
|
+
ctrl.abort(userSignal?.reason ?? new Error('aborted'));
|
|
171
|
+
};
|
|
172
|
+
if (userSignal) {
|
|
173
|
+
if (userSignal.aborted)
|
|
174
|
+
onUserAbort();
|
|
175
|
+
else
|
|
176
|
+
userSignal.addEventListener('abort', onUserAbort, { once: true });
|
|
177
|
+
}
|
|
178
|
+
if (timeoutMs && Number.isFinite(timeoutMs) && timeoutMs > 0) {
|
|
179
|
+
timer = setTimeout(() => ctrl.abort(new Error(`LLM call timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
180
|
+
if (typeof timer === 'object' && timer && 'unref' in timer) {
|
|
181
|
+
timer.unref();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
signal: ctrl.signal,
|
|
186
|
+
cleanup: () => {
|
|
187
|
+
if (timer)
|
|
188
|
+
clearTimeout(timer);
|
|
189
|
+
if (userSignal)
|
|
190
|
+
userSignal.removeEventListener('abort', onUserAbort);
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Helper for providers that want to format an error consistently. Wrapping
|
|
197
|
+
* the underlying fetch / SDK error in LlmProviderError makes it easy for
|
|
198
|
+
* callers (and the registry's "is the provider healthy?" probe) to tell
|
|
199
|
+
* a transport failure apart from a logic bug.
|
|
200
|
+
*/
|
|
201
|
+
export class LlmProviderError extends Error {
|
|
202
|
+
providerName;
|
|
203
|
+
httpStatus;
|
|
204
|
+
transient;
|
|
205
|
+
constructor(providerName, message, opts = {}) {
|
|
206
|
+
super(message);
|
|
207
|
+
this.name = 'LlmProviderError';
|
|
208
|
+
this.providerName = providerName;
|
|
209
|
+
this.httpStatus = opts.httpStatus;
|
|
210
|
+
// 429 / 408 / 503 / 504 are conventional "retry-me" codes. Callers
|
|
211
|
+
// can use this flag to decide whether to back off or fall back to a
|
|
212
|
+
// CLI agent right away.
|
|
213
|
+
this.transient = opts.transient ?? (opts.httpStatus === 408 ||
|
|
214
|
+
opts.httpStatus === 429 ||
|
|
215
|
+
opts.httpStatus === 503 ||
|
|
216
|
+
opts.httpStatus === 504);
|
|
217
|
+
if (opts.cause !== undefined) {
|
|
218
|
+
this.cause = opts.cause;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=provider-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-base.js","sourceRoot":"","sources":["../../../src/core/llm/provider-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ValidatedConfig } from '../config-schema.js';
|
|
2
|
+
import type { LlmProvider } from './provider-base.js';
|
|
3
|
+
/** Role names recognised by Stage 1 callers. Strings rather than enum so
|
|
4
|
+
* forward-compat roles (added in later stages) compile against an older
|
|
5
|
+
* agim without type errors. */
|
|
6
|
+
export type LlmRole = 'cheap' | 'evaluator' | 'native-chat' | string;
|
|
7
|
+
/**
|
|
8
|
+
* Build the registry from a validated config. Idempotent — repeated
|
|
9
|
+
* calls fully replace the previous state. Logs (info / warn) the load
|
|
10
|
+
* outcome so operators see what landed at startup.
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadFromConfig(cfg: ValidatedConfig | {
|
|
13
|
+
llmBackends?: unknown;
|
|
14
|
+
llmRoles?: unknown;
|
|
15
|
+
}): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get the provider configured for `role`, or null when no usable
|
|
18
|
+
* backend is wired. Callers should NEVER throw on null — that's how the
|
|
19
|
+
* registry tells them "fall back to your CLI path".
|
|
20
|
+
*/
|
|
21
|
+
export declare function getProvider(role: LlmRole): LlmProvider | null;
|
|
22
|
+
/** Look up a provider directly by backend name (mostly for the web
|
|
23
|
+
* "Test connection" button and unit tests). */
|
|
24
|
+
export declare function getProviderByName(name: string): LlmProvider | null;
|
|
25
|
+
/** List all configured backends — handy for the web UI roster. */
|
|
26
|
+
export declare function listProviders(): {
|
|
27
|
+
name: string;
|
|
28
|
+
providerType: string;
|
|
29
|
+
model: string;
|
|
30
|
+
}[];
|
|
31
|
+
/** Test/diagnostic: clear the registry. Used by bun tests so module
|
|
32
|
+
* state doesn't leak across cases. */
|
|
33
|
+
export declare function _resetRegistry(): void;
|
|
34
|
+
/** Diagnostic snapshot for the cost dashboard's "LLM backends" tile. */
|
|
35
|
+
export declare function describeRegistry(): {
|
|
36
|
+
backends: {
|
|
37
|
+
name: string;
|
|
38
|
+
providerType: string;
|
|
39
|
+
model: string;
|
|
40
|
+
}[];
|
|
41
|
+
roles: Record<string, string>;
|
|
42
|
+
unconfigured: string[];
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/llm/registry.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAKrD;;gCAEgC;AAChC,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,CAAA;AAoBpE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAqDzG;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAI7D;AAED;gDACgD;AAChD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAElE;AAED,kEAAkE;AAClE,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAMvF;AAED;uCACuC;AACvC,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,IAAI;IAClC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACjE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB,CAMA"}
|