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,598 @@
|
|
|
1
|
+
// Native AgentAdapter — agim's first in-process LLM agent (Stage 2 sub-PR #4).
|
|
2
|
+
//
|
|
3
|
+
// The native adapter is the **opt-in backup** path: the CLI agents
|
|
4
|
+
// (Claude Code / Codex / OpenCode) keep being the main route for IM
|
|
5
|
+
// users, but operators can now ALSO register a native agent that runs
|
|
6
|
+
// entirely inside agim — no subprocess spawn, no claude.json, just
|
|
7
|
+
// LLM API call + the agent loop from sub-PR #3.
|
|
8
|
+
//
|
|
9
|
+
// Concrete shape of one IM turn driven by this adapter:
|
|
10
|
+
//
|
|
11
|
+
// user message
|
|
12
|
+
// ↓
|
|
13
|
+
// AgentAdapter.sendPrompt(sessionId, prompt, history, opts)
|
|
14
|
+
// ↓
|
|
15
|
+
// 1. resolveProvider(role) ← pick the LLM (role-based)
|
|
16
|
+
// 2. build LlmMessage[] from history+prompt
|
|
17
|
+
// 3. assemble dispatcher
|
|
18
|
+
// = combineDispatchers(builtin, mcp)
|
|
19
|
+
// 4. assemble approval gate (from operator policy config)
|
|
20
|
+
// 5. runAgentLoop(...) — multi-iter tool loop
|
|
21
|
+
// 6. yield the final text as a SINGLE chunk (buffered) back to the
|
|
22
|
+
// adapter's AsyncGenerator contract
|
|
23
|
+
//
|
|
24
|
+
// Stage 2 sub-PR #4 deliberately ships:
|
|
25
|
+
// - one LLM call per IM turn (no streaming of incremental thinking
|
|
26
|
+
// to IM; that's a separate feature)
|
|
27
|
+
// - sequential tool execution within each iteration (matches
|
|
28
|
+
// agent-loop's current contract)
|
|
29
|
+
// - policy-based approval (mode=allow-list by default; operators
|
|
30
|
+
// opt into looser modes via env)
|
|
31
|
+
// - the existing tryIntrospect-style usage / cost audit accounting
|
|
32
|
+
//
|
|
33
|
+
// Out of scope here (covered later):
|
|
34
|
+
// - IM-interactive approval cards (button taps / y-n IM reply); the
|
|
35
|
+
// policy gate is sufficient for the initial release
|
|
36
|
+
// - Streaming partial responses to IM (we already accumulate the
|
|
37
|
+
// final text; partial streaming wants viewer-routing support too)
|
|
38
|
+
// - Session persistence specific to native (we reuse the caller-
|
|
39
|
+
// supplied history; agim's regular session manager handles
|
|
40
|
+
// persistence across turns)
|
|
41
|
+
import { logger as rootLogger } from '../../../core/logger.js';
|
|
42
|
+
import { logInvocation } from '../../../core/audit-log.js';
|
|
43
|
+
import { runAgentLoop, buildMcpDispatcher, combineDispatchers, getProvider, getAllMcpTools, } from '../../../core/llm/index.js';
|
|
44
|
+
import { buildBuiltinDispatcher, getBuiltinTools, } from '../../../core/llm/builtin-dispatcher.js';
|
|
45
|
+
import { buildPolicyApprovalGate, describePolicy, } from '../../../core/llm/policy-approval-gate.js';
|
|
46
|
+
import { buildImhubDispatcher, getImhubTools, } from '../../../core/llm/imhub-dispatcher.js';
|
|
47
|
+
import { listSkills } from '../../../core/skills/loader.js';
|
|
48
|
+
import { describeRegistry as describeMcpRegistry } from '../../../core/llm/mcp-registry.js';
|
|
49
|
+
import { resolveAgentCwd, defaultAgentCwd } from '../../../core/agent-cwd.js';
|
|
50
|
+
import { handlePushOp } from '../../../core/push-rpc.js';
|
|
51
|
+
import { maybeCompactHistory } from '../../../core/llm/auto-compact.js';
|
|
52
|
+
import { existsSync as fsExistsSync, statSync as fsStatSync, readFileSync as fsReadFileSync } from 'node:fs';
|
|
53
|
+
import { resolve as pathResolve, sep as pathSep, join as pathJoin } from 'node:path';
|
|
54
|
+
import { sanitizeForInjection, scanForInjectionAttempts } from '../../../core/prompt-injection-guard.js';
|
|
55
|
+
const log = rootLogger.child({ component: 'native-agent' });
|
|
56
|
+
/**
|
|
57
|
+
* v1.2.47 — system prompt is rebuilt per IM turn so the model sees:
|
|
58
|
+
* - which LLM backend + role it's actually running on
|
|
59
|
+
* - the agim process working directory (no per-thread cwd today)
|
|
60
|
+
* - the live skill roster (names + one-line descriptions), with the
|
|
61
|
+
* hint to call mcp__imhub__read_skill for full bodies
|
|
62
|
+
* - external MCP servers currently connected
|
|
63
|
+
*
|
|
64
|
+
* Before v1.2.47 the prompt was a 4-line generic string; users
|
|
65
|
+
* complained that asking "what model are you" / "what skills do you
|
|
66
|
+
* have" got non-answers ("I don't know; ask the operator"). The
|
|
67
|
+
* builder closes that information gap without leaking secrets — every
|
|
68
|
+
* field surfaced here is operator-configured and non-sensitive.
|
|
69
|
+
*/
|
|
70
|
+
function buildSystemPrompt(provider, role, cwd) {
|
|
71
|
+
const skills = listSkills();
|
|
72
|
+
const skillsBlock = skills.length
|
|
73
|
+
? skills.map((s) => ` - ${s.name}: ${s.description}`).join('\n')
|
|
74
|
+
: ' (no skill cards loaded; see docs/skills.md to add one)';
|
|
75
|
+
const mcpReg = describeMcpRegistry();
|
|
76
|
+
const externalMcp = mcpReg.servers.length
|
|
77
|
+
? mcpReg.servers
|
|
78
|
+
.map((s) => ` - ${s.name} (${s.connected ? `${s.toolCount} tools` : `disconnected${s.error ? ': ' + s.error : ''}`})`)
|
|
79
|
+
.join('\n')
|
|
80
|
+
: ' (none configured)';
|
|
81
|
+
const lines = [];
|
|
82
|
+
// Operator-supplied role definition. Reads <cwd>/AGENTS.md (seeded by
|
|
83
|
+
// bootstrapAgentWorkspaces) and prepends it as a role block. Lets
|
|
84
|
+
// operators customise the agent's identity, tone, and house rules
|
|
85
|
+
// without touching code. Sanitised + scanned for prompt-injection
|
|
86
|
+
// patterns (best-effort warn; never blocks turn).
|
|
87
|
+
const opRole = readOperatorRole(cwd);
|
|
88
|
+
if (opRole) {
|
|
89
|
+
lines.push('[operator role definition]');
|
|
90
|
+
lines.push(opRole);
|
|
91
|
+
lines.push('[/operator role definition]');
|
|
92
|
+
lines.push('');
|
|
93
|
+
}
|
|
94
|
+
lines.push(`You are agim native — agim's in-process LLM agent talking to a user over an IM platform.`, ``, `Runtime:`, ` Backend: ${provider.providerType}:${provider.name}`, ` Role: ${role}`, ` Working directory: ${cwd}`, ``, `Tools available beyond the four native built-ins (echo / now / sleep / random_uuid):`, ` - agim built-in MCP tools (mcp__imhub__*): read_skill, list_skills, save_memo, search_memos, update_memo, delete_memo, push_message, ask_user, call_agent`, ` - External MCP servers configured by the operator:`, externalMcp, ``, `Available skill cards (call mcp__imhub__read_skill('<name>') for the full body):`, skillsBlock, ``, `Guidance:`, ` - Be terse; avoid filler. Prefer tool use over guessing.`, ` - When uncertain, call mcp__imhub__ask_user(question, choices[]) instead of free-form back-and-forth.`, ` - When the user references something they told the bot before, search memos via mcp__imhub__search_memos.`, ` - When a heavy task fits another agent better (e.g. code editing → claude-code), use mcp__imhub__call_agent.`);
|
|
95
|
+
return lines.join('\n');
|
|
96
|
+
}
|
|
97
|
+
/** Read <cwd>/AGENTS.md (if present) and prepare it for injection into
|
|
98
|
+
* the system prompt. Returns '' on missing file / read failure / empty
|
|
99
|
+
* content. Sanitises text length (8000 char cap) and scans for the
|
|
100
|
+
* classic prompt-injection signals ("ignore previous instructions",
|
|
101
|
+
* "always allow", etc.); when matches are found we still inject (the
|
|
102
|
+
* operator likely wrote them deliberately) but log a warn + audit
|
|
103
|
+
* hit so post-incident forensics can correlate. Honours
|
|
104
|
+
* IMHUB_NATIVE_AGENT_ROLE_FILE for a non-default location. */
|
|
105
|
+
export function readOperatorRole(cwd) {
|
|
106
|
+
const override = process.env.IMHUB_NATIVE_AGENT_ROLE_FILE;
|
|
107
|
+
const path = override && override.length > 0 ? override : pathJoin(cwd, 'AGENTS.md');
|
|
108
|
+
if (!fsExistsSync(path))
|
|
109
|
+
return '';
|
|
110
|
+
let raw = '';
|
|
111
|
+
try {
|
|
112
|
+
raw = fsReadFileSync(path, 'utf-8');
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return '';
|
|
116
|
+
}
|
|
117
|
+
const trimmed = raw.trim();
|
|
118
|
+
if (!trimmed)
|
|
119
|
+
return '';
|
|
120
|
+
try {
|
|
121
|
+
const scan = scanForInjectionAttempts(trimmed);
|
|
122
|
+
if (scan.suspicious) {
|
|
123
|
+
log.warn({
|
|
124
|
+
event: 'native.role_file.injection_signals',
|
|
125
|
+
file: path,
|
|
126
|
+
matched: scan.matched,
|
|
127
|
+
}, `${path} contains prompt-injection-style language; injecting anyway — operator review recommended`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch { /* scan is best-effort */ }
|
|
131
|
+
return sanitizeForInjection(trimmed, 8000);
|
|
132
|
+
}
|
|
133
|
+
/** Role priority for picking which LLM backend powers the native chat
|
|
134
|
+
* turn. First found wins. Operators can override the role via
|
|
135
|
+
* `IMHUB_NATIVE_AGENT_ROLE`. */
|
|
136
|
+
const DEFAULT_ROLE_FALLBACK = ['native-chat', 'cheap'];
|
|
137
|
+
function resolveRole() {
|
|
138
|
+
const raw = process.env.IMHUB_NATIVE_AGENT_ROLE;
|
|
139
|
+
if (raw?.trim())
|
|
140
|
+
return [raw.trim(), ...DEFAULT_ROLE_FALLBACK];
|
|
141
|
+
return DEFAULT_ROLE_FALLBACK.slice();
|
|
142
|
+
}
|
|
143
|
+
function pickProvider() {
|
|
144
|
+
for (const role of resolveRole()) {
|
|
145
|
+
const p = getProvider(role);
|
|
146
|
+
if (p)
|
|
147
|
+
return { provider: p, role };
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Build the ordered fallback chain of (provider, role) pairs the agent
|
|
153
|
+
* loop will retry against. The chain begins with whatever pickProvider
|
|
154
|
+
* picks (operator's primary), then appends each remaining role that has
|
|
155
|
+
* a registered provider — de-duplicated by provider name so we never
|
|
156
|
+
* retry the exact same backend.
|
|
157
|
+
*
|
|
158
|
+
* The loop driver in sendPrompt walks this chain when an iteration ends
|
|
159
|
+
* with a TRANSIENT provider error (HTTP 5xx / network reset / 408).
|
|
160
|
+
* Non-transient errors (4xx misconfig, schema validation) end the turn
|
|
161
|
+
* immediately — retrying won't help and just multiplies cost.
|
|
162
|
+
*/
|
|
163
|
+
function pickProviderChain() {
|
|
164
|
+
const chain = [];
|
|
165
|
+
const seen = new Set();
|
|
166
|
+
for (const role of resolveRole()) {
|
|
167
|
+
const p = getProvider(role);
|
|
168
|
+
if (!p)
|
|
169
|
+
continue;
|
|
170
|
+
if (seen.has(p.name))
|
|
171
|
+
continue;
|
|
172
|
+
seen.add(p.name);
|
|
173
|
+
chain.push({ provider: p, role });
|
|
174
|
+
}
|
|
175
|
+
return chain;
|
|
176
|
+
}
|
|
177
|
+
/** Resolve the operator's approval policy from env. Defaults to
|
|
178
|
+
* `allow-list` mode with NO allow entries — equivalent to "no tool
|
|
179
|
+
* calls". Operators that want native to actually call tools must
|
|
180
|
+
* configure at least one of these env vars:
|
|
181
|
+
*
|
|
182
|
+
* IMHUB_NATIVE_AGENT_MODE=allow-all|read-only|allow-list|deny-all
|
|
183
|
+
* IMHUB_NATIVE_AGENT_AUTOALLOW=tool1,tool2,...
|
|
184
|
+
* IMHUB_NATIVE_AGENT_DENYLIST=tool1,...
|
|
185
|
+
*
|
|
186
|
+
* The `read-only` mode is the recommended starter — it accepts every
|
|
187
|
+
* tool whose name starts/ends with a read-only verb (`read_*` /
|
|
188
|
+
* `list_*` / `get_*` / etc.) and the four built-ins
|
|
189
|
+
* (`native_echo`/`now`/`random_uuid` — `sleep_ms` excluded).
|
|
190
|
+
*/
|
|
191
|
+
function resolvePolicy() {
|
|
192
|
+
const mode = (process.env.IMHUB_NATIVE_AGENT_MODE || 'allow-list').toLowerCase();
|
|
193
|
+
const autoAllow = splitEnvList(process.env.IMHUB_NATIVE_AGENT_AUTOALLOW);
|
|
194
|
+
const denyList = splitEnvList(process.env.IMHUB_NATIVE_AGENT_DENYLIST);
|
|
195
|
+
// Allow the 3 safe native builtins + all first-party imhub MCP tools by
|
|
196
|
+
// default. The imhub tools are in-process (no external API cost, no
|
|
197
|
+
// network side-effects beyond what the IM bridge would do anyway) and
|
|
198
|
+
// are part of agim's own surface — denying them by default is the same
|
|
199
|
+
// class of misconfiguration as denying agim itself. Operators can
|
|
200
|
+
// remove individual entries via IMHUB_NATIVE_AGENT_DENYLIST.
|
|
201
|
+
const defaultBuiltins = [
|
|
202
|
+
'native_echo', 'native_now', 'native_random_uuid',
|
|
203
|
+
'mcp__imhub__read_skill', 'mcp__imhub__list_skills',
|
|
204
|
+
'mcp__imhub__save_memo', 'mcp__imhub__search_memos',
|
|
205
|
+
'mcp__imhub__update_memo', 'mcp__imhub__delete_memo',
|
|
206
|
+
'mcp__imhub__push_message', 'mcp__imhub__ask_user',
|
|
207
|
+
'mcp__imhub__call_agent',
|
|
208
|
+
];
|
|
209
|
+
const effectiveAllow = mode === 'allow-list'
|
|
210
|
+
? Array.from(new Set([...autoAllow, ...defaultBuiltins]))
|
|
211
|
+
: autoAllow;
|
|
212
|
+
return { mode, autoAllow: effectiveAllow, denyList };
|
|
213
|
+
}
|
|
214
|
+
function splitEnvList(raw) {
|
|
215
|
+
if (!raw)
|
|
216
|
+
return [];
|
|
217
|
+
return raw.split(',').map((s) => s.trim()).filter(Boolean);
|
|
218
|
+
}
|
|
219
|
+
/** Are we configured AT ALL to make tool calls? Reflected in startup
|
|
220
|
+
* log + onboarding hints so the operator notices when they ship
|
|
221
|
+
* `agents:['native']` without configuring a backend. */
|
|
222
|
+
function isConfigured() {
|
|
223
|
+
return pickProvider() !== null;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Extract media attachments from a prompt string. Messenger adapters
|
|
227
|
+
* (telegram / wechat / discord / feishu / dingtalk) inline a marker like
|
|
228
|
+
* `[图片附件:/abs/path/to/file.jpg]` or `[image attachment: ...]` when a
|
|
229
|
+
* user message carries a media payload. The path is already downloaded
|
|
230
|
+
* to `~/.agim/media/<platform>/...` by the adapter, so we only need to
|
|
231
|
+
* surface it to vision-capable providers; non-vision providers see the
|
|
232
|
+
* original text and can still acknowledge the attachment.
|
|
233
|
+
*
|
|
234
|
+
* Heuristic-safe: matches absolute paths under common image extensions
|
|
235
|
+
* + a path-safety check that the file exists. Anything ambiguous (no
|
|
236
|
+
* extension, file missing, points outside ~/.agim/media) is silently
|
|
237
|
+
* skipped so we never leak random filesystem paths into a vision call.
|
|
238
|
+
*/
|
|
239
|
+
export function parsePromptMedia(prompt) {
|
|
240
|
+
if (!prompt)
|
|
241
|
+
return [];
|
|
242
|
+
// Match both Chinese 图片附件 marker and English "image attachment".
|
|
243
|
+
// Capture group is the path between `:`/`: ` and `]`.
|
|
244
|
+
const re = /\[(?:图片附件|image attachment)[::]\s*([^\]]+)\]/g;
|
|
245
|
+
const out = [];
|
|
246
|
+
const home = process.env.HOME || '/root';
|
|
247
|
+
const mediaRootRaw = process.env.IMHUB_MEDIA_ROOT || `${home}/.agim/media`;
|
|
248
|
+
// Normalise media root once so the prefix check works regardless of
|
|
249
|
+
// trailing slashes / dotted segments in the env override.
|
|
250
|
+
const mediaRoot = pathResolve(mediaRootRaw);
|
|
251
|
+
const mediaPrefix = mediaRoot.endsWith(pathSep) ? mediaRoot : mediaRoot + pathSep;
|
|
252
|
+
let m;
|
|
253
|
+
while ((m = re.exec(prompt)) !== null) {
|
|
254
|
+
const rawPath = (m[1] || '').trim();
|
|
255
|
+
if (!rawPath)
|
|
256
|
+
continue;
|
|
257
|
+
// Path-safety: must be absolute AND resolve to a real file UNDER
|
|
258
|
+
// the media root. Use path.resolve + sep-aware prefix check so
|
|
259
|
+
// siblings like `/root/.agim/media-evil/x` and traversals like
|
|
260
|
+
// `/root/.agim/media/../etc/x` are rejected.
|
|
261
|
+
if (!rawPath.startsWith('/'))
|
|
262
|
+
continue;
|
|
263
|
+
const normalised = pathResolve(rawPath);
|
|
264
|
+
if (normalised !== mediaRoot && !normalised.startsWith(mediaPrefix))
|
|
265
|
+
continue;
|
|
266
|
+
try {
|
|
267
|
+
if (!fsExistsSync(normalised))
|
|
268
|
+
continue;
|
|
269
|
+
if (!fsStatSync(normalised).isFile())
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
// Image-only for v1; ignore other extensions to keep providers happy.
|
|
276
|
+
const lower = normalised.toLowerCase();
|
|
277
|
+
if (!/\.(jpg|jpeg|png|webp|gif)$/.test(lower))
|
|
278
|
+
continue;
|
|
279
|
+
out.push({ path: normalised });
|
|
280
|
+
}
|
|
281
|
+
return out;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Tool-call heartbeat helper. Solves the "agim 没反应" anxiety during
|
|
285
|
+
* long tool calls (research-shaped tools / call_agent A2A turns can
|
|
286
|
+
* run > 10s under the 30-minute hard timeout).
|
|
287
|
+
*
|
|
288
|
+
* Behaviour:
|
|
289
|
+
* - When a tool call's onToolStart fires, schedule a one-shot push
|
|
290
|
+
* to the IM thread after IMHUB_NATIVE_HEARTBEAT_MS (default 6000).
|
|
291
|
+
* - When the call's onToolEnd fires first, cancel the pending push.
|
|
292
|
+
* - shutdown() clears any still-pending timers (turn finished cleanly).
|
|
293
|
+
*
|
|
294
|
+
* Suppression: handlePushOp uses the standard notification-evaluator
|
|
295
|
+
* gate + the per-user rate limit (10/min default). The heartbeat is
|
|
296
|
+
* intentionally short ("🔧 调用工具 X 中…") so the gate's "low signal"
|
|
297
|
+
* rule rarely drops it; if operators want them muted entirely, set
|
|
298
|
+
* IMHUB_NATIVE_HEARTBEAT_MS=0.
|
|
299
|
+
*/
|
|
300
|
+
function buildHeartbeats(runCtx) {
|
|
301
|
+
// Tool-level pulse: tools that take longer than IMHUB_NATIVE_HEARTBEAT_MS
|
|
302
|
+
// (default 6000) push a one-shot "🔧 调用工具 X 中…" so the user knows
|
|
303
|
+
// why the bot has gone quiet. Cancelled on tool end. Set 0 to disable.
|
|
304
|
+
const rawDelay = parseInt(process.env.IMHUB_NATIVE_HEARTBEAT_MS || '6000', 10);
|
|
305
|
+
const toolDelayMs = Number.isFinite(rawDelay) && rawDelay > 0 ? rawDelay : 0;
|
|
306
|
+
// Turn-level pulse: every IMHUB_NATIVE_TURN_HEARTBEAT_MS (default 180_000
|
|
307
|
+
// = 3 min) since turn start, push a "⏳ 还在处理(已 Nm)..." so a multi-
|
|
308
|
+
// step research turn that runs many sub-agents reassures the user it's
|
|
309
|
+
// still alive even between tool calls. Set 0 to disable. The first
|
|
310
|
+
// pulse fires after delayMs, NOT immediately, so short turns stay silent.
|
|
311
|
+
const rawTurnMs = parseInt(process.env.IMHUB_NATIVE_TURN_HEARTBEAT_MS || '180000', 10);
|
|
312
|
+
const turnDelayMs = Number.isFinite(rawTurnMs) && rawTurnMs > 0 ? rawTurnMs : 0;
|
|
313
|
+
const pending = new Map();
|
|
314
|
+
const startedAt = Date.now();
|
|
315
|
+
let turnTimer = null;
|
|
316
|
+
if (turnDelayMs > 0) {
|
|
317
|
+
turnTimer = setInterval(() => {
|
|
318
|
+
const elapsedMin = Math.round((Date.now() - startedAt) / 60_000);
|
|
319
|
+
void handlePushOp({ text: `⏳ 还在处理(已 ${elapsedMin}m)…` }, runCtx).catch(() => { });
|
|
320
|
+
}, turnDelayMs);
|
|
321
|
+
}
|
|
322
|
+
const shutdown = () => {
|
|
323
|
+
for (const t of pending.values())
|
|
324
|
+
clearTimeout(t);
|
|
325
|
+
pending.clear();
|
|
326
|
+
if (turnTimer) {
|
|
327
|
+
clearInterval(turnTimer);
|
|
328
|
+
turnTimer = null;
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
const noop = () => { };
|
|
332
|
+
if (toolDelayMs === 0)
|
|
333
|
+
return { hooks: { onToolStart: noop, onToolEnd: noop }, shutdown };
|
|
334
|
+
return {
|
|
335
|
+
hooks: {
|
|
336
|
+
onToolStart(call) {
|
|
337
|
+
const timer = setTimeout(() => {
|
|
338
|
+
void handlePushOp({ text: `🔧 调用工具 \`${call.name}\` 中…(已 ${Math.round(toolDelayMs / 1000)}s)` }, runCtx).catch(() => { });
|
|
339
|
+
pending.delete(call.id);
|
|
340
|
+
}, toolDelayMs);
|
|
341
|
+
pending.set(call.id, timer);
|
|
342
|
+
},
|
|
343
|
+
onToolEnd(call) {
|
|
344
|
+
const t = pending.get(call.id);
|
|
345
|
+
if (t) {
|
|
346
|
+
clearTimeout(t);
|
|
347
|
+
pending.delete(call.id);
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
shutdown,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
// ─── AgentAdapter implementation ─────────────────────────────────────
|
|
355
|
+
class NativeAgentAdapter {
|
|
356
|
+
name = 'native';
|
|
357
|
+
aliases = ['llm', 'native-llm', 'na'];
|
|
358
|
+
kind = 'in-process';
|
|
359
|
+
/** One-line UI hint surfaced by `/agents`: which LLM role + backend
|
|
360
|
+
* currently powers this adapter. Returns undefined when not
|
|
361
|
+
* configured (caller renders 'NOT CONFIGURED' elsewhere). */
|
|
362
|
+
describe() {
|
|
363
|
+
const picked = pickProvider();
|
|
364
|
+
if (!picked)
|
|
365
|
+
return undefined;
|
|
366
|
+
// 'role -> vendor:backend' so a glance at /agents tells you which
|
|
367
|
+
// LLM is wired without opening config.json.
|
|
368
|
+
return `role=${picked.role} -> ${picked.provider.providerType}:${picked.provider.name}`;
|
|
369
|
+
}
|
|
370
|
+
async isAvailable() {
|
|
371
|
+
return isConfigured();
|
|
372
|
+
}
|
|
373
|
+
async *sendPrompt(sessionId, prompt, history = [], opts = {}) {
|
|
374
|
+
const picked = pickProvider();
|
|
375
|
+
if (!picked) {
|
|
376
|
+
const msg = '❌ native agent: no LLM backend configured for role `native-chat` or `cheap`. Add one in `~/.agim/config.json` `llmBackends`/`llmRoles` (see docs/llm-backends.md).';
|
|
377
|
+
yield msg;
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
const { provider, role } = picked;
|
|
381
|
+
// Build the message array. The native loop accepts a system message
|
|
382
|
+
// either as the first element OR via systemPrompt; we go with the
|
|
383
|
+
// dedicated field so user-supplied history doesn't get clipped by
|
|
384
|
+
// a synthetic system message.
|
|
385
|
+
const messages = [];
|
|
386
|
+
for (const m of history) {
|
|
387
|
+
// ChatMessage role is 'user' | 'assistant'; both map straight
|
|
388
|
+
// through. Skip empty content to keep prompts compact.
|
|
389
|
+
if (!m.content)
|
|
390
|
+
continue;
|
|
391
|
+
messages.push({ role: m.role, content: m.content });
|
|
392
|
+
}
|
|
393
|
+
// Parse `[图片附件:/path/to/file]` / `[image attachment: ...]` markers
|
|
394
|
+
// that messenger adapters inline into the prompt. Vision-capable
|
|
395
|
+
// providers will encode them as image_url blocks; others just see
|
|
396
|
+
// the original text and the model can acknowledge "an image was
|
|
397
|
+
// attached at <path>" without inspecting bytes.
|
|
398
|
+
const userMedia = parsePromptMedia(prompt);
|
|
399
|
+
messages.push({ role: 'user', content: prompt, ...(userMedia.length > 0 ? { media: userMedia } : {}) });
|
|
400
|
+
// Auto-compact long chats before the provider call. Op-out via
|
|
401
|
+
// IMHUB_NATIVE_COMPACT_TRIGGER_CHARS=0. Failure mode is no-op.
|
|
402
|
+
const compact = await maybeCompactHistory(messages);
|
|
403
|
+
const effectiveMessages = compact.messages;
|
|
404
|
+
if (compact.compacted) {
|
|
405
|
+
log.info({
|
|
406
|
+
event: 'native.compact.applied',
|
|
407
|
+
sessionId,
|
|
408
|
+
originalChars: compact.originalChars,
|
|
409
|
+
summaryChars: compact.summaryChars,
|
|
410
|
+
collapsedCount: compact.collapsedCount,
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
// Compose dispatcher: built-in first (so a stray MCP server with
|
|
414
|
+
// a colliding tool name doesn't shadow `native_now` etc.), then
|
|
415
|
+
// imhub built-ins (skills / memo / push / ask_user / call_agent),
|
|
416
|
+
// then external MCP. v1.2.47 added the imhub layer so native sees
|
|
417
|
+
// exactly the same mcp__imhub__* surface claude-code does via the
|
|
418
|
+
// MCP sidecar.
|
|
419
|
+
const imhubCtx = {
|
|
420
|
+
platform: opts.platform || 'native-agent',
|
|
421
|
+
channelId: opts.channelId || 'default',
|
|
422
|
+
threadId: opts.threadId || sessionId,
|
|
423
|
+
userId: opts.userId || 'unknown',
|
|
424
|
+
callerAgent: 'native',
|
|
425
|
+
callerDepth: opts.callDepth ?? 0,
|
|
426
|
+
};
|
|
427
|
+
const dispatch = combineDispatchers(buildBuiltinDispatcher(), buildImhubDispatcher(imhubCtx), buildMcpDispatcher());
|
|
428
|
+
// Compose tool list the same way (built-in → imhub → external MCP).
|
|
429
|
+
// Provider tool roster wins on duplicate names via "later
|
|
430
|
+
// definition wins" semantics inside the provider, but our naming
|
|
431
|
+
// is namespaced (`native_*`, `mcp__imhub__*`, `mcp_<server>_*`)
|
|
432
|
+
// so collisions are not expected in practice.
|
|
433
|
+
const tools = [
|
|
434
|
+
...getBuiltinTools(),
|
|
435
|
+
...getImhubTools(),
|
|
436
|
+
...getAllMcpTools(),
|
|
437
|
+
];
|
|
438
|
+
const policy = resolvePolicy();
|
|
439
|
+
const approve = buildPolicyApprovalGate(policy);
|
|
440
|
+
const startedAt = Date.now();
|
|
441
|
+
log.info({
|
|
442
|
+
event: 'native.turn.start',
|
|
443
|
+
sessionId,
|
|
444
|
+
role,
|
|
445
|
+
backend: provider.name,
|
|
446
|
+
policy: describePolicy(policy),
|
|
447
|
+
tools: tools.length,
|
|
448
|
+
platform: opts.platform,
|
|
449
|
+
threadId: opts.threadId,
|
|
450
|
+
});
|
|
451
|
+
// Resolve native's working directory the same way claude-code does:
|
|
452
|
+
// IM calls (threadId + platform set) pin to ~/.agim-workspaces/native/
|
|
453
|
+
// so the agent has a stable, isolated home for any future filesystem
|
|
454
|
+
// tools and AGENTS.md guidance. Out-of-IM calls (web, scheduler) fall
|
|
455
|
+
// back to defaultAgentCwd so the prompt always reports a real path
|
|
456
|
+
// rather than systemd's '/'.
|
|
457
|
+
const cwd = resolveAgentCwd('native', opts) || defaultAgentCwd('native');
|
|
458
|
+
const traceId = `native-${sessionId}-${Date.now()}`;
|
|
459
|
+
// Wall-clock cap for the agent loop. agim's IM-layer enforces a 30-
|
|
460
|
+
// minute hard ceiling per turn (DEFAULT_TIMEOUT_MS in agent-base.ts);
|
|
461
|
+
// we set the inner loop a hair below so the loop's own abort fires
|
|
462
|
+
// with a clean `finishReason='aborted'` BEFORE the outer SIGTERM. The
|
|
463
|
+
// agent-loop default is a conservative 5 minutes which is far too
|
|
464
|
+
// short for native turns that orchestrate sub-agents via call_agent
|
|
465
|
+
// (each hop can run 1-3 minutes); without this override a multi-step
|
|
466
|
+
// research turn would abort mid-flight even with sub-tasks healthy.
|
|
467
|
+
// Operator can override via IMHUB_NATIVE_AGENT_TIMEOUT_MS.
|
|
468
|
+
const nativeTimeoutMs = (() => {
|
|
469
|
+
const raw = parseInt(process.env.IMHUB_NATIVE_AGENT_TIMEOUT_MS || '', 10);
|
|
470
|
+
if (Number.isFinite(raw) && raw > 0)
|
|
471
|
+
return raw;
|
|
472
|
+
return 28 * 60 * 1000; // 28 min — leaves 2 min of IM-layer headroom
|
|
473
|
+
})();
|
|
474
|
+
const heartbeats = buildHeartbeats(imhubCtx);
|
|
475
|
+
const chain = pickProviderChain();
|
|
476
|
+
// chain always starts with `picked` from above — index 0 is the
|
|
477
|
+
// primary; rest are fallbacks. We walk the chain only when the
|
|
478
|
+
// PREVIOUS attempt ended with a transient provider error and the
|
|
479
|
+
// turn produced no assistant text yet (so retrying is safe — no
|
|
480
|
+
// duplicate replies).
|
|
481
|
+
let result = null;
|
|
482
|
+
let usedRole = role;
|
|
483
|
+
let usedProvider = provider;
|
|
484
|
+
for (let i = 0; i < chain.length; i++) {
|
|
485
|
+
const candidate = chain[i];
|
|
486
|
+
usedProvider = candidate.provider;
|
|
487
|
+
usedRole = candidate.role;
|
|
488
|
+
result = await runAgentLoop({
|
|
489
|
+
provider: candidate.provider,
|
|
490
|
+
systemPrompt: buildSystemPrompt(candidate.provider, candidate.role, cwd),
|
|
491
|
+
messages: effectiveMessages,
|
|
492
|
+
tools,
|
|
493
|
+
dispatch,
|
|
494
|
+
approve,
|
|
495
|
+
callOptions: { model: opts.model },
|
|
496
|
+
timeoutMs: nativeTimeoutMs,
|
|
497
|
+
signal: opts.signal,
|
|
498
|
+
audit: {
|
|
499
|
+
agent: `llm:${candidate.provider.name}`,
|
|
500
|
+
intent: 'native.agent.iter',
|
|
501
|
+
userId: opts.userId,
|
|
502
|
+
platform: opts.platform || 'native-agent',
|
|
503
|
+
traceId,
|
|
504
|
+
},
|
|
505
|
+
hooks: heartbeats.hooks,
|
|
506
|
+
});
|
|
507
|
+
if (result.finishReason !== 'error')
|
|
508
|
+
break;
|
|
509
|
+
const errStr = String(result.error || '');
|
|
510
|
+
const isTransient = /5\d\d|timeout|ECONN|ETIMEDOUT|fetch failed|socket hang up|408|network/i.test(errStr);
|
|
511
|
+
const hasText = result.text && result.text.length > 0;
|
|
512
|
+
if (!isTransient || hasText || i === chain.length - 1)
|
|
513
|
+
break;
|
|
514
|
+
log.warn({
|
|
515
|
+
event: 'native.fallback.next',
|
|
516
|
+
from: candidate.provider.name,
|
|
517
|
+
nextIdx: i + 1,
|
|
518
|
+
err: errStr,
|
|
519
|
+
}, `provider ${candidate.provider.name} transient-failed; trying next fallback`);
|
|
520
|
+
}
|
|
521
|
+
heartbeats.shutdown();
|
|
522
|
+
if (!result) {
|
|
523
|
+
// Shouldn't happen — pickProvider above already returned the primary
|
|
524
|
+
// so the chain has at least one entry. Defensive belt-and-suspenders.
|
|
525
|
+
yield '❌ native agent: provider chain ended without any attempt';
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
// Per-turn parent audit row that aggregates the iteration rows
|
|
529
|
+
// already written by runAgentLoop. Lets /tasks#cost sum cost per
|
|
530
|
+
// turn rather than per iteration.
|
|
531
|
+
try {
|
|
532
|
+
logInvocation({
|
|
533
|
+
traceId,
|
|
534
|
+
userId: opts.userId ?? '',
|
|
535
|
+
platform: opts.platform || 'native-agent',
|
|
536
|
+
agent: this.name,
|
|
537
|
+
intent: 'native.agent.turn',
|
|
538
|
+
promptLen: prompt.length,
|
|
539
|
+
responseLen: result.text.length,
|
|
540
|
+
durationMs: Date.now() - startedAt,
|
|
541
|
+
cost: typeof result.usage.costUsd === 'number' ? result.usage.costUsd : 0,
|
|
542
|
+
success: result.finishReason !== 'error' && result.finishReason !== 'aborted',
|
|
543
|
+
error: result.error,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
catch { /* audit best-effort */ }
|
|
547
|
+
// Surface usage to cli's per-session accumulator the same way CLI
|
|
548
|
+
// adapters do (via opts.onUsage). agim's cost dashboard reads from
|
|
549
|
+
// the audit table either way, but the in-memory session usage panel
|
|
550
|
+
// wants it pushed here too.
|
|
551
|
+
if (opts.onUsage && typeof result.usage.costUsd === 'number') {
|
|
552
|
+
try {
|
|
553
|
+
opts.onUsage({ costUsd: result.usage.costUsd });
|
|
554
|
+
}
|
|
555
|
+
catch { /* best-effort */ }
|
|
556
|
+
}
|
|
557
|
+
log.info({
|
|
558
|
+
event: 'native.turn.done',
|
|
559
|
+
sessionId,
|
|
560
|
+
backend: usedProvider.name,
|
|
561
|
+
role: usedRole,
|
|
562
|
+
fellBack: usedProvider.name !== provider.name,
|
|
563
|
+
finishReason: result.finishReason,
|
|
564
|
+
iterations: result.iterations,
|
|
565
|
+
toolCalls: result.toolCalls.length,
|
|
566
|
+
elapsedMs: Date.now() - startedAt,
|
|
567
|
+
});
|
|
568
|
+
// Compose the user-facing reply. Failure modes surface as ASCII
|
|
569
|
+
// banners so the IM user sees something concrete rather than
|
|
570
|
+
// silence (and so logs in /tasks#cost have a non-empty
|
|
571
|
+
// response_len to filter on).
|
|
572
|
+
let body = result.text;
|
|
573
|
+
if (result.finishReason === 'error') {
|
|
574
|
+
body = `❌ native agent error: ${result.error ?? '(no detail)'}`;
|
|
575
|
+
}
|
|
576
|
+
else if (result.finishReason === 'max_iterations') {
|
|
577
|
+
body = '⚠️ native agent hit max iterations without finishing. Try a more focused prompt or raise IMHUB_NATIVE_AGENT_MAX_ITER.';
|
|
578
|
+
}
|
|
579
|
+
else if (result.finishReason === 'aborted') {
|
|
580
|
+
body = '⏹ native agent aborted before completion.';
|
|
581
|
+
}
|
|
582
|
+
else if (!body) {
|
|
583
|
+
body = '(native agent returned an empty response)';
|
|
584
|
+
}
|
|
585
|
+
yield body;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
export const nativeAgentAdapter = new NativeAgentAdapter();
|
|
589
|
+
/** Lightweight banner for cli.ts boot log. Lets operators see at a
|
|
590
|
+
* glance whether `/cc native` will work before they try it in an IM
|
|
591
|
+
* thread. */
|
|
592
|
+
export function describeNativeAgent() {
|
|
593
|
+
const picked = pickProvider();
|
|
594
|
+
if (!picked)
|
|
595
|
+
return 'native agent: NOT CONFIGURED (no llmRoles.native-chat / .cheap)';
|
|
596
|
+
return `native agent: backend=${picked.provider.name} (role=${picked.role}); policy=${describePolicy(resolvePolicy())}`;
|
|
597
|
+
}
|
|
598
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/native/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import type { AgentSendOpts } from '../../../core/types.js';
|
|
|
3
3
|
export declare class OpenCodeAdapter extends AgentBase {
|
|
4
4
|
readonly name = "opencode";
|
|
5
5
|
readonly aliases: string[];
|
|
6
|
+
readonly kind: "cli";
|
|
6
7
|
protected buildArgs(prompt: string, opts: AgentSendOpts): string[];
|
|
7
8
|
/**
|
|
8
9
|
* opencode keys its per-project AGENTS.md and memory off the spawn cwd,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-stdio-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-stdio-adapter.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA2B3D,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,OAAO,WAAuB;
|
|
1
|
+
{"version":3,"file":"opencode-stdio-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-stdio-adapter.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA2B3D,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,OAAO,WAAuB;IACvC,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAS;IAE9B,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAelE;;;;;;;;;;;;;OAaG;cACa,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IAsCvF,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAO7C;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;CAiBlE"}
|
|
@@ -32,6 +32,7 @@ const log = rootLogger.child({ component: 'agent.opencode' });
|
|
|
32
32
|
export class OpenCodeAdapter extends AgentBase {
|
|
33
33
|
name = 'opencode';
|
|
34
34
|
aliases = ['oc', 'opencodeai'];
|
|
35
|
+
kind = 'cli';
|
|
35
36
|
buildArgs(prompt, opts) {
|
|
36
37
|
const args = ['run', '--format', 'json'];
|
|
37
38
|
if (opts.agentSessionId)
|