agim-cli 1.2.44 → 1.2.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +295 -0
- package/README.md +39 -5
- package/README.zh-CN.md +40 -6
- package/dist/cli-ui/config-wizard.js +15 -2
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/diag.d.ts +29 -0
- package/dist/cli-ui/diag.d.ts.map +1 -0
- package/dist/cli-ui/diag.js +135 -0
- package/dist/cli-ui/diag.js.map +1 -0
- package/dist/cli-ui/i18n.d.ts +36 -0
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +97 -0
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/setup-llm.d.ts +30 -0
- package/dist/cli-ui/setup-llm.d.ts.map +1 -0
- package/dist/cli-ui/setup-llm.js +460 -0
- package/dist/cli-ui/setup-llm.js.map +1 -0
- package/dist/cli-ui/setup-mcp.d.ts +19 -0
- package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
- package/dist/cli-ui/setup-mcp.js +308 -0
- package/dist/cli-ui/setup-mcp.js.map +1 -0
- package/dist/cli-ui/token-menu.js +2 -2
- package/dist/cli-ui/token-menu.js.map +1 -1
- package/dist/cli.js +100 -22
- package/dist/cli.js.map +1 -1
- package/dist/core/access-token.d.ts +16 -5
- package/dist/core/access-token.d.ts.map +1 -1
- package/dist/core/access-token.js +82 -13
- package/dist/core/access-token.js.map +1 -1
- package/dist/core/agent-cwd.d.ts.map +1 -1
- package/dist/core/agent-cwd.js +46 -0
- package/dist/core/agent-cwd.js.map +1 -1
- package/dist/core/approval-bus.d.ts +22 -0
- package/dist/core/approval-bus.d.ts.map +1 -1
- package/dist/core/approval-bus.js +93 -0
- package/dist/core/approval-bus.js.map +1 -1
- package/dist/core/ask-user-router.d.ts +24 -0
- package/dist/core/ask-user-router.d.ts.map +1 -0
- package/dist/core/ask-user-router.js +84 -0
- package/dist/core/ask-user-router.js.map +1 -0
- package/dist/core/ask-user-rpc.d.ts +80 -0
- package/dist/core/ask-user-rpc.d.ts.map +1 -0
- package/dist/core/ask-user-rpc.js +388 -0
- package/dist/core/ask-user-rpc.js.map +1 -0
- package/dist/core/audit-log.d.ts +1 -1
- package/dist/core/audit-log.d.ts.map +1 -1
- package/dist/core/audit-log.js.map +1 -1
- package/dist/core/commands/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +21 -5
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/commands/goal.d.ts +3 -0
- package/dist/core/commands/goal.d.ts.map +1 -0
- package/dist/core/commands/goal.js +240 -0
- package/dist/core/commands/goal.js.map +1 -0
- package/dist/core/commands/heartbeat.d.ts +3 -0
- package/dist/core/commands/heartbeat.d.ts.map +1 -0
- package/dist/core/commands/heartbeat.js +219 -0
- package/dist/core/commands/heartbeat.js.map +1 -0
- package/dist/core/commands/router-compare.d.ts +3 -0
- package/dist/core/commands/router-compare.d.ts.map +1 -0
- package/dist/core/commands/router-compare.js +81 -0
- package/dist/core/commands/router-compare.js.map +1 -0
- package/dist/core/commands/router.d.ts.map +1 -1
- package/dist/core/commands/router.js +9 -1
- package/dist/core/commands/router.js.map +1 -1
- package/dist/core/commands/skill.d.ts +3 -0
- package/dist/core/commands/skill.d.ts.map +1 -0
- package/dist/core/commands/skill.js +91 -0
- package/dist/core/commands/skill.js.map +1 -0
- package/dist/core/config-schema.d.ts +28 -0
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +124 -0
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/goals.d.ts +81 -0
- package/dist/core/goals.d.ts.map +1 -0
- package/dist/core/goals.js +361 -0
- package/dist/core/goals.js.map +1 -0
- package/dist/core/heartbeat-store.d.ts +90 -0
- package/dist/core/heartbeat-store.d.ts.map +1 -0
- package/dist/core/heartbeat-store.js +302 -0
- package/dist/core/heartbeat-store.js.map +1 -0
- package/dist/core/heartbeat.d.ts +35 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +332 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/intent-llm.d.ts +9 -0
- package/dist/core/intent-llm.d.ts.map +1 -1
- package/dist/core/intent-llm.js +77 -32
- package/dist/core/intent-llm.js.map +1 -1
- package/dist/core/llm/agent-loop.d.ts +112 -0
- package/dist/core/llm/agent-loop.d.ts.map +1 -0
- package/dist/core/llm/agent-loop.js +313 -0
- package/dist/core/llm/agent-loop.js.map +1 -0
- package/dist/core/llm/anthropic-provider.d.ts +53 -0
- package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/core/llm/anthropic-provider.js +339 -0
- package/dist/core/llm/anthropic-provider.js.map +1 -0
- package/dist/core/llm/auto-compact.d.ts +35 -0
- package/dist/core/llm/auto-compact.d.ts.map +1 -0
- package/dist/core/llm/auto-compact.js +149 -0
- package/dist/core/llm/auto-compact.js.map +1 -0
- package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
- package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/builtin-dispatcher.js +196 -0
- package/dist/core/llm/builtin-dispatcher.js.map +1 -0
- package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
- package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/imhub-dispatcher.js +308 -0
- package/dist/core/llm/imhub-dispatcher.js.map +1 -0
- package/dist/core/llm/index.d.ts +11 -0
- package/dist/core/llm/index.d.ts.map +1 -0
- package/dist/core/llm/index.js +16 -0
- package/dist/core/llm/index.js.map +1 -0
- package/dist/core/llm/introspection.d.ts +73 -0
- package/dist/core/llm/introspection.d.ts.map +1 -0
- package/dist/core/llm/introspection.js +90 -0
- package/dist/core/llm/introspection.js.map +1 -0
- package/dist/core/llm/mcp-client.d.ts +80 -0
- package/dist/core/llm/mcp-client.d.ts.map +1 -0
- package/dist/core/llm/mcp-client.js +270 -0
- package/dist/core/llm/mcp-client.js.map +1 -0
- package/dist/core/llm/mcp-registry.d.ts +57 -0
- package/dist/core/llm/mcp-registry.d.ts.map +1 -0
- package/dist/core/llm/mcp-registry.js +155 -0
- package/dist/core/llm/mcp-registry.js.map +1 -0
- package/dist/core/llm/openai-compat-provider.d.ts +65 -0
- package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
- package/dist/core/llm/openai-compat-provider.js +451 -0
- package/dist/core/llm/openai-compat-provider.js.map +1 -0
- package/dist/core/llm/policy-approval-gate.d.ts +30 -0
- package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
- package/dist/core/llm/policy-approval-gate.js +86 -0
- package/dist/core/llm/policy-approval-gate.js.map +1 -0
- package/dist/core/llm/provider-base.d.ts +302 -0
- package/dist/core/llm/provider-base.d.ts.map +1 -0
- package/dist/core/llm/provider-base.js +222 -0
- package/dist/core/llm/provider-base.js.map +1 -0
- package/dist/core/llm/registry.d.ts +44 -0
- package/dist/core/llm/registry.d.ts.map +1 -0
- package/dist/core/llm/registry.js +160 -0
- package/dist/core/llm/registry.js.map +1 -0
- package/dist/core/llm/secrets.d.ts +46 -0
- package/dist/core/llm/secrets.d.ts.map +1 -0
- package/dist/core/llm/secrets.js +157 -0
- package/dist/core/llm/secrets.js.map +1 -0
- package/dist/core/llm/tool-dispatcher.d.ts +37 -0
- package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/tool-dispatcher.js +85 -0
- package/dist/core/llm/tool-dispatcher.js.map +1 -0
- package/dist/core/memory-consolidate.d.ts.map +1 -1
- package/dist/core/memory-consolidate.js +38 -23
- package/dist/core/memory-consolidate.js.map +1 -1
- package/dist/core/memory-distill.d.ts.map +1 -1
- package/dist/core/memory-distill.js +51 -25
- package/dist/core/memory-distill.js.map +1 -1
- package/dist/core/memory-rpc.d.ts.map +1 -1
- package/dist/core/memory-rpc.js +6 -0
- package/dist/core/memory-rpc.js.map +1 -1
- package/dist/core/message-sink.d.ts.map +1 -1
- package/dist/core/message-sink.js +76 -0
- package/dist/core/message-sink.js.map +1 -1
- package/dist/core/notification-evaluator.d.ts +49 -0
- package/dist/core/notification-evaluator.d.ts.map +1 -0
- package/dist/core/notification-evaluator.js +232 -0
- package/dist/core/notification-evaluator.js.map +1 -0
- package/dist/core/onboarding.d.ts.map +1 -1
- package/dist/core/onboarding.js +10 -0
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/persona.d.ts +10 -0
- package/dist/core/persona.d.ts.map +1 -1
- package/dist/core/persona.js +28 -14
- package/dist/core/persona.js.map +1 -1
- package/dist/core/push-rpc.d.ts +8 -0
- package/dist/core/push-rpc.d.ts.map +1 -1
- package/dist/core/push-rpc.js +41 -1
- package/dist/core/push-rpc.js.map +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +6 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/render-router.d.ts.map +1 -1
- package/dist/core/render-router.js +23 -6
- package/dist/core/render-router.js.map +1 -1
- package/dist/core/router-compare.d.ts +76 -0
- package/dist/core/router-compare.d.ts.map +1 -0
- package/dist/core/router-compare.js +253 -0
- package/dist/core/router-compare.js.map +1 -0
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +25 -1
- package/dist/core/router.js.map +1 -1
- package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
- package/dist/core/skills/loader.d.ts +120 -0
- package/dist/core/skills/loader.d.ts.map +1 -0
- package/dist/core/skills/loader.js +577 -0
- package/dist/core/skills/loader.js.map +1 -0
- package/dist/core/skills-rpc.d.ts +44 -0
- package/dist/core/skills-rpc.d.ts.map +1 -0
- package/dist/core/skills-rpc.js +71 -0
- package/dist/core/skills-rpc.js.map +1 -0
- package/dist/core/types.d.ts +35 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/util/format-age.d.ts +20 -0
- package/dist/core/util/format-age.d.ts.map +1 -0
- package/dist/core/util/format-age.js +86 -0
- package/dist/core/util/format-age.js.map +1 -0
- package/dist/core/viewer-config.d.ts +15 -7
- package/dist/core/viewer-config.d.ts.map +1 -1
- package/dist/core/viewer-config.js +18 -12
- package/dist/core/viewer-config.js.map +1 -1
- package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
- package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/acp/acp-adapter.js +12 -0
- package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
- package/dist/plugins/agents/antigravity/index.d.ts +1 -0
- package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
- package/dist/plugins/agents/antigravity/index.js +1 -0
- package/dist/plugins/agents/antigravity/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/index.d.ts +1 -0
- package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/index.js +1 -0
- package/dist/plugins/agents/claude-code/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
- package/dist/plugins/agents/codex/index.d.ts +1 -0
- package/dist/plugins/agents/codex/index.d.ts.map +1 -1
- package/dist/plugins/agents/codex/index.js +1 -0
- package/dist/plugins/agents/codex/index.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts +34 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -0
- package/dist/plugins/agents/native/index.js +598 -0
- package/dist/plugins/agents/native/index.js.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
- package/dist/web/agim-skills-api.d.ts +4 -0
- package/dist/web/agim-skills-api.d.ts.map +1 -0
- package/dist/web/agim-skills-api.js +150 -0
- package/dist/web/agim-skills-api.js.map +1 -0
- package/dist/web/background-tasks-api.d.ts +7 -0
- package/dist/web/background-tasks-api.d.ts.map +1 -0
- package/dist/web/background-tasks-api.js +225 -0
- package/dist/web/background-tasks-api.js.map +1 -0
- package/dist/web/llm-api.d.ts +8 -0
- package/dist/web/llm-api.d.ts.map +1 -0
- package/dist/web/llm-api.js +300 -0
- package/dist/web/llm-api.js.map +1 -0
- package/dist/web/mcp-api.d.ts +8 -0
- package/dist/web/mcp-api.d.ts.map +1 -0
- package/dist/web/mcp-api.js +205 -0
- package/dist/web/mcp-api.js.map +1 -0
- package/dist/web/public/assets/{a2a-Bg_mT0z1.js → a2a-Mke0F7ZM.js} +3 -3
- package/dist/web/public/assets/{a2a-Bg_mT0z1.js.map → a2a-Mke0F7ZM.js.map} +1 -1
- package/dist/web/public/assets/{activity-U9AaNlDt.js → activity-0zGnf1_m.js} +2 -2
- package/dist/web/public/assets/{activity-U9AaNlDt.js.map → activity-0zGnf1_m.js.map} +1 -1
- package/dist/web/public/assets/{admins-BTC_YEK9.js → admins-DSi3KRky.js} +3 -3
- package/dist/web/public/assets/{admins-BTC_YEK9.js.map → admins-DSi3KRky.js.map} +1 -1
- package/dist/web/public/assets/agents-BLWe20EJ.js +7 -0
- package/dist/web/public/assets/agents-BLWe20EJ.js.map +1 -0
- package/dist/web/public/assets/{approvals-Boj7iXz4.js → approvals-Cu_JdM-8.js} +3 -3
- package/dist/web/public/assets/{approvals-Boj7iXz4.js.map → approvals-Cu_JdM-8.js.map} +1 -1
- package/dist/web/public/assets/asks-DfV8vxey.js +7 -0
- package/dist/web/public/assets/asks-DfV8vxey.js.map +1 -0
- package/dist/web/public/assets/{audit-MprCFoy_.js → audit-2EVhhvGV.js} +2 -2
- package/dist/web/public/assets/{audit-MprCFoy_.js.map → audit-2EVhhvGV.js.map} +1 -1
- package/dist/web/public/assets/bell-Wz_wuOa_.js +7 -0
- package/dist/web/public/assets/bell-Wz_wuOa_.js.map +1 -0
- package/dist/web/public/assets/{bgjobs-B6XvxURz.js → bgjobs-DXROZFAW.js} +2 -2
- package/dist/web/public/assets/{bgjobs-B6XvxURz.js.map → bgjobs-DXROZFAW.js.map} +1 -1
- package/dist/web/public/assets/{brain-C5HejASN.js → brain-Dh5VOzRL.js} +2 -2
- package/dist/web/public/assets/{brain-C5HejASN.js.map → brain-Dh5VOzRL.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-DkCTxO1A.js → briefcase-DfxbvM9i.js} +2 -2
- package/dist/web/public/assets/{briefcase-DkCTxO1A.js.map → briefcase-DfxbvM9i.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-DEyrYFz4.js → chevron-right-DU8Xla1M.js} +2 -2
- package/dist/web/public/assets/{chevron-right-DEyrYFz4.js.map → chevron-right-DU8Xla1M.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-bADFEXGw.js → circle-check-Be_S993G.js} +2 -2
- package/dist/web/public/assets/{circle-check-bADFEXGw.js.map → circle-check-Be_S993G.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-U4xrkHiS.js → circle-check-big-CsQkLR1u.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-U4xrkHiS.js.map → circle-check-big-CsQkLR1u.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-C6qY5UUl.js → circle-x-qkQu1Swu.js} +2 -2
- package/dist/web/public/assets/{circle-x-C6qY5UUl.js.map → circle-x-qkQu1Swu.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-B53cbWzX.js → confirm-dialog-Bm6MsLXZ.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-B53cbWzX.js.map → confirm-dialog-Bm6MsLXZ.js.map} +1 -1
- package/dist/web/public/assets/{data-table-BKTemkw9.js → data-table-Dw4Df09-.js} +5 -5
- package/dist/web/public/assets/{data-table-BKTemkw9.js.map → data-table-Dw4Df09-.js.map} +1 -1
- package/dist/web/public/assets/{dialog-Cevi7KvQ.js → dialog-CNsc4COh.js} +3 -3
- package/dist/web/public/assets/{dialog-Cevi7KvQ.js.map → dialog-CNsc4COh.js.map} +1 -1
- package/dist/web/public/assets/{download-DwJNwdwV.js → download-Bnhk_vDY.js} +2 -2
- package/dist/web/public/assets/{download-DwJNwdwV.js.map → download-Bnhk_vDY.js.map} +1 -1
- package/dist/web/public/assets/{email-CZVaRhG_.js → email-jgAX8liM.js} +3 -3
- package/dist/web/public/assets/{email-CZVaRhG_.js.map → email-jgAX8liM.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-C87S9Wor.js → empty-state-D8QXQ5y9.js} +2 -2
- package/dist/web/public/assets/{empty-state-C87S9Wor.js.map → empty-state-D8QXQ5y9.js.map} +1 -1
- package/dist/web/public/assets/{external-link-CIM1wjHP.js → external-link-C8AYvhBb.js} +2 -2
- package/dist/web/public/assets/{external-link-CIM1wjHP.js.map → external-link-C8AYvhBb.js.map} +1 -1
- package/dist/web/public/assets/{eye-TUAOhz72.js → eye-pmI_4E8x.js} +4 -4
- package/dist/web/public/assets/{eye-TUAOhz72.js.map → eye-pmI_4E8x.js.map} +1 -1
- package/dist/web/public/assets/{facts-ByM1VHCp.js → facts-BRHLLX2u.js} +2 -2
- package/dist/web/public/assets/{facts-ByM1VHCp.js.map → facts-BRHLLX2u.js.map} +1 -1
- package/dist/web/public/assets/goals-p7cNp01l.js +17 -0
- package/dist/web/public/assets/goals-p7cNp01l.js.map +1 -0
- package/dist/web/public/assets/{health-B4GF06J-.js → health-CuGIXg8C.js} +2 -2
- package/dist/web/public/assets/{health-B4GF06J-.js.map → health-CuGIXg8C.js.map} +1 -1
- package/dist/web/public/assets/heart-pulse-D0AHQl1d.js +7 -0
- package/dist/web/public/assets/heart-pulse-D0AHQl1d.js.map +1 -0
- package/dist/web/public/assets/heartbeat-DJRDS2GQ.js +7 -0
- package/dist/web/public/assets/heartbeat-DJRDS2GQ.js.map +1 -0
- package/dist/web/public/assets/hot-B1qKTiGD.js +17 -0
- package/dist/web/public/assets/hot-B1qKTiGD.js.map +1 -0
- package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
- package/dist/web/public/assets/index-XJngV1gH.js +166 -0
- package/dist/web/public/assets/index-XJngV1gH.js.map +1 -0
- package/dist/web/public/assets/installed-Dz4-KevJ.js +31 -0
- package/dist/web/public/assets/installed-Dz4-KevJ.js.map +1 -0
- package/dist/web/public/assets/{jobs-DwA9Ip87.js → jobs-kwOypiWd.js} +2 -2
- package/dist/web/public/assets/{jobs-DwA9Ip87.js.map → jobs-kwOypiWd.js.map} +1 -1
- package/dist/web/public/assets/layout-01n3Aibo.js +2 -0
- package/dist/web/public/assets/layout-01n3Aibo.js.map +1 -0
- package/dist/web/public/assets/layout-CVYe2vN8.js +2 -0
- package/dist/web/public/assets/layout-CVYe2vN8.js.map +1 -0
- package/dist/web/public/assets/{layout-CR5gLapT.js → layout-CbHxH58i.js} +2 -2
- package/dist/web/public/assets/{layout-CR5gLapT.js.map → layout-CbHxH58i.js.map} +1 -1
- package/dist/web/public/assets/layout-DD1Dei48.js +2 -0
- package/dist/web/public/assets/layout-DD1Dei48.js.map +1 -0
- package/dist/web/public/assets/{layout-zotlJ5fW.js → layout-s11iwkL-.js} +2 -2
- package/dist/web/public/assets/{layout-zotlJ5fW.js.map → layout-s11iwkL-.js.map} +1 -1
- package/dist/web/public/assets/llm-DPlK10Lg.js +7 -0
- package/dist/web/public/assets/llm-DPlK10Lg.js.map +1 -0
- package/dist/web/public/assets/{loader-circle-BFp6Oc8_.js → loader-circle-DymEG5Cl.js} +2 -2
- package/dist/web/public/assets/{loader-circle-BFp6Oc8_.js.map → loader-circle-DymEG5Cl.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-DPqnsBIG.js → map-pin-CyZg1-Jk.js} +2 -2
- package/dist/web/public/assets/{map-pin-DPqnsBIG.js.map → map-pin-CyZg1-Jk.js.map} +1 -1
- package/dist/web/public/assets/mcp-CiifW_qp.js +7 -0
- package/dist/web/public/assets/mcp-CiifW_qp.js.map +1 -0
- package/dist/web/public/assets/{memos-DCACQN26.js → memos-Bsiq64qW.js} +2 -2
- package/dist/web/public/assets/{memos-DCACQN26.js.map → memos-Bsiq64qW.js.map} +1 -1
- package/dist/web/public/assets/{messengers-CwWP1qI4.js → messengers-alGJK9dO.js} +3 -3
- package/dist/web/public/assets/{messengers-CwWP1qI4.js.map → messengers-alGJK9dO.js.map} +1 -1
- package/dist/web/public/assets/native-agent-CgzcqRsU.js +7 -0
- package/dist/web/public/assets/native-agent-CgzcqRsU.js.map +1 -0
- package/dist/web/public/assets/{network-CrMEVz4-.js → network-BSRJfeGk.js} +2 -2
- package/dist/web/public/assets/{network-CrMEVz4-.js.map → network-BSRJfeGk.js.map} +1 -1
- package/dist/web/public/assets/{outbox-C7FpZzwS.js → outbox-DSDls9xU.js} +3 -3
- package/dist/web/public/assets/{outbox-C7FpZzwS.js.map → outbox-DSDls9xU.js.map} +1 -1
- package/dist/web/public/assets/{pagination-Cgt8W6EX.js → pagination-DVXNZ2ti.js} +3 -3
- package/dist/web/public/assets/{pagination-Cgt8W6EX.js.map → pagination-DVXNZ2ti.js.map} +1 -1
- package/dist/web/public/assets/{persona-Bjty6uqM.js → persona-BB1gIwTX.js} +2 -2
- package/dist/web/public/assets/{persona-Bjty6uqM.js.map → persona-BB1gIwTX.js.map} +1 -1
- package/dist/web/public/assets/{play-CEoS1N8t.js → play-CcECAHfL.js} +2 -2
- package/dist/web/public/assets/{play-CEoS1N8t.js.map → play-CcECAHfL.js.map} +1 -1
- package/dist/web/public/assets/plus-DrStBHss.js +7 -0
- package/dist/web/public/assets/plus-DrStBHss.js.map +1 -0
- package/dist/web/public/assets/policy-BgDYTxy7.js +2 -0
- package/dist/web/public/assets/{policy-DwI-ov9J.js.map → policy-BgDYTxy7.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-CPSYEbgh.js → refresh-ccw-BBRPVLH8.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-CPSYEbgh.js.map → refresh-ccw-BBRPVLH8.js.map} +1 -1
- package/dist/web/public/assets/{reminders-X-QFSWvZ.js → reminders-jwy196Xw.js} +4 -9
- package/dist/web/public/assets/reminders-jwy196Xw.js.map +1 -0
- package/dist/web/public/assets/{save-tS3IBPf3.js → save-iBtyruco.js} +2 -2
- package/dist/web/public/assets/{save-tS3IBPf3.js.map → save-iBtyruco.js.map} +1 -1
- package/dist/web/public/assets/{schedules-CfCNvhCV.js → schedules-DDl_Sr5r.js} +3 -3
- package/dist/web/public/assets/{schedules-CfCNvhCV.js.map → schedules-DDl_Sr5r.js.map} +1 -1
- package/dist/web/public/assets/{search-BPvPCccn.js → search-Yb1S22sv.js} +2 -2
- package/dist/web/public/assets/{search-BPvPCccn.js.map → search-Yb1S22sv.js.map} +1 -1
- package/dist/web/public/assets/{service-DSitDFzD.js → service-jrg0kMtK.js} +3 -3
- package/dist/web/public/assets/{service-DSitDFzD.js.map → service-jrg0kMtK.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-HSHkhdur.js → status-badge-Arxyw3TL.js} +2 -2
- package/dist/web/public/assets/{status-badge-HSHkhdur.js.map → status-badge-Arxyw3TL.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-eKq_P0v6.js → subtasks-CkyuMv_X.js} +3 -3
- package/dist/web/public/assets/{subtasks-eKq_P0v6.js.map → subtasks-CkyuMv_X.js.map} +1 -1
- package/dist/web/public/assets/{table-BBISYTH-.js → table-BKdG9tsY.js} +2 -2
- package/dist/web/public/assets/{table-BBISYTH-.js.map → table-BKdG9tsY.js.map} +1 -1
- package/dist/web/public/assets/{topn-JA8llaUI.js → topn-BpX8BKWS.js} +3 -3
- package/dist/web/public/assets/{topn-JA8llaUI.js.map → topn-BpX8BKWS.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-D8F96aYm.js → trash-2-DxKJo_-6.js} +3 -3
- package/dist/web/public/assets/{trash-2-D8F96aYm.js.map → trash-2-DxKJo_-6.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js +2 -0
- package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js.map +1 -0
- package/dist/web/public/assets/use-llm-admin-D4snixaM.js +2 -0
- package/dist/web/public/assets/use-llm-admin-D4snixaM.js.map +1 -0
- package/dist/web/public/assets/{use-memory-BDa1R8Tf.js → use-memory-Cqf3xywK.js} +2 -2
- package/dist/web/public/assets/{use-memory-BDa1R8Tf.js.map → use-memory-Cqf3xywK.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-XgxLMQsY.js → use-observability-Thh7LWoE.js} +2 -2
- package/dist/web/public/assets/{use-observability-XgxLMQsY.js.map → use-observability-Thh7LWoE.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-Bc4s-JUD.js → use-settings-DRhH8owt.js} +2 -2
- package/dist/web/public/assets/{use-settings-Bc4s-JUD.js.map → use-settings-DRhH8owt.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-JalfqH6H.js → use-workspace-iLKz-h_7.js} +2 -2
- package/dist/web/public/assets/{use-workspace-JalfqH6H.js.map → use-workspace-iLKz-h_7.js.map} +1 -1
- package/dist/web/public/assets/useQuery-gnz30xMJ.js +2 -0
- package/dist/web/public/assets/{useQuery-DFryK9Pn.js.map → useQuery-gnz30xMJ.js.map} +1 -1
- package/dist/web/public/assets/{vector-G2dN_aut.js → vector-COjljy_4.js} +2 -2
- package/dist/web/public/assets/{vector-G2dN_aut.js.map → vector-COjljy_4.js.map} +1 -1
- package/dist/web/public/assets/viewer-AQHSc8hZ.js +12 -0
- package/dist/web/public/assets/viewer-AQHSc8hZ.js.map +1 -0
- package/dist/web/public/assets/{workspace-BaLZIgGn.js → workspace-DRtSCbx5.js} +4 -4
- package/dist/web/public/assets/{workspace-BaLZIgGn.js.map → workspace-DRtSCbx5.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-cX_rV523.js → workspaces-BLR5ZBu6.js} +3 -3
- package/dist/web/public/assets/{workspaces-cX_rV523.js.map → workspaces-BLR5ZBu6.js.map} +1 -1
- package/dist/web/public/assets/{x-D5196-9X.js → x-DGQ0qjhc.js} +2 -2
- package/dist/web/public/assets/{x-D5196-9X.js.map → x-DGQ0qjhc.js.map} +1 -1
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +45 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +2 -2
- package/dist/web/public/assets/agents-o9odac79.js +0 -12
- package/dist/web/public/assets/agents-o9odac79.js.map +0 -1
- package/dist/web/public/assets/hot-O9Z19xXa.js +0 -17
- package/dist/web/public/assets/hot-O9Z19xXa.js.map +0 -1
- package/dist/web/public/assets/index-CITyis5g.js +0 -166
- package/dist/web/public/assets/index-CITyis5g.js.map +0 -1
- package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
- package/dist/web/public/assets/installed-CM34mlDU.js +0 -7
- package/dist/web/public/assets/installed-CM34mlDU.js.map +0 -1
- package/dist/web/public/assets/layout-BxrFilDN.js +0 -2
- package/dist/web/public/assets/layout-BxrFilDN.js.map +0 -1
- package/dist/web/public/assets/layout-CcJQxFci.js +0 -2
- package/dist/web/public/assets/layout-CcJQxFci.js.map +0 -1
- package/dist/web/public/assets/layout-DRRveTaR.js +0 -2
- package/dist/web/public/assets/layout-DRRveTaR.js.map +0 -1
- package/dist/web/public/assets/policy-DwI-ov9J.js +0 -2
- package/dist/web/public/assets/reminders-X-QFSWvZ.js.map +0 -1
- package/dist/web/public/assets/use-skills-DCOYAQ8s.js +0 -2
- package/dist/web/public/assets/use-skills-DCOYAQ8s.js.map +0 -1
- package/dist/web/public/assets/useQuery-DFryK9Pn.js +0 -2
- package/dist/web/public/assets/viewer-DliYQkQQ.js +0 -12
- package/dist/web/public/assets/viewer-DliYQkQQ.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,301 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.2.48] - 2026-05-24
|
|
8
|
+
|
|
9
|
+
### Theme: native+ — production-ready in-process LLM agent
|
|
10
|
+
|
|
11
|
+
Wraps up the post-v1.3.0 / v1.2.47 follow-ups into one drop. Native is
|
|
12
|
+
now the first-class peer of `claude-code` / `opencode` / `codex` for
|
|
13
|
+
end-to-end IM ↔ multi-agent work: it knows its identity, sees every
|
|
14
|
+
skill the box has, talks to vision models, recovers from provider
|
|
15
|
+
hiccups, summarises stale chat, and never silently dies on a long
|
|
16
|
+
multi-hop research turn.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- **Operator role definition** — `<native cwd>/AGENTS.md` is now read
|
|
21
|
+
on every turn and prepended to the system prompt as
|
|
22
|
+
`[operator role definition]`. Edit the seed at
|
|
23
|
+
`~/.agim-workspaces/native/AGENTS.md` to change persona / tone /
|
|
24
|
+
house rules; no restart required. Env override
|
|
25
|
+
`IMHUB_NATIVE_AGENT_ROLE_FILE=...` for non-default locations.
|
|
26
|
+
Prompt-injection guard runs over the content + audit-logs hits.
|
|
27
|
+
- **Skills multi-root scan** — `IMHUB_SKILLS_MODE=auto` (default)
|
|
28
|
+
merges `~/.agim/skills/` (write target) with `~/.claude/skills/`,
|
|
29
|
+
`~/.config/opencode/skills/`, and `~/.codex/skills/` so a fresh
|
|
30
|
+
install sees every skill the user already has from CLI agents.
|
|
31
|
+
Workspace skills shadow same-named entries from inherited roots.
|
|
32
|
+
Modes: `auto | agim-only | custom` + `IMHUB_SKILLS_ROOTS=...`
|
|
33
|
+
/ `IMHUB_SKILLS_EXTRA_ROOTS=...`.
|
|
34
|
+
- **Auto-compact long histories** — when a native turn's accumulated
|
|
35
|
+
history crosses `IMHUB_NATIVE_COMPACT_TRIGGER_CHARS` (default
|
|
36
|
+
60_000), a cheap LLM call summarises the older slice and the loop
|
|
37
|
+
keeps only the last `IMHUB_NATIVE_COMPACT_KEEP_TURNS` (default 6)
|
|
38
|
+
user/assistant pairs verbatim. Tool round-trips kept intact (the
|
|
39
|
+
fix that landed in CR — never start the tail on `role:'tool'`).
|
|
40
|
+
- **Provider fallback chain** — native walks the configured role
|
|
41
|
+
chain (e.g. `native-chat` → `cheap` → `evaluator`) on transient
|
|
42
|
+
provider errors (5xx / timeout / ECONNRESET) so a flaky OpenAI
|
|
43
|
+
endpoint doesn't kill the whole turn. Logged as
|
|
44
|
+
`native.fallback.next`.
|
|
45
|
+
- **Multimodal pass-through (OpenAI-compat)** — messenger image
|
|
46
|
+
attachments (`[图片附件:...]` markers) are encoded as `image_url`
|
|
47
|
+
content blocks when the provider's `vision: true` (or its model
|
|
48
|
+
name matches a known vision family). Anthropic provider remains
|
|
49
|
+
text-only for now. Hard cap 20MB per image. Path-safety:
|
|
50
|
+
attachments must resolve under `IMHUB_MEDIA_ROOT`.
|
|
51
|
+
- **Tool-call heartbeat** — tool dispatches that take longer than
|
|
52
|
+
`IMHUB_NATIVE_HEARTBEAT_MS` (default 6000) push a "🔧 调用工具 X
|
|
53
|
+
中…" so users know the bot is still working.
|
|
54
|
+
- **Turn-level heartbeat** — every
|
|
55
|
+
`IMHUB_NATIVE_TURN_HEARTBEAT_MS` (default 180_000 = 3 min) since
|
|
56
|
+
turn start, push "⏳ 还在处理(已 Nm)…". Survives long
|
|
57
|
+
multi-hop research turns where individual tool calls finish but the
|
|
58
|
+
outer LLM is reasoning.
|
|
59
|
+
- **Cross-channel operator alert** — when outbox delivery fails ≥3
|
|
60
|
+
times on any thread, push a "⚠️ outbox 告警" to
|
|
61
|
+
`IMHUB_OPERATOR_ALERT_PLATFORM` / `IMHUB_OPERATOR_ALERT_THREAD_ID`
|
|
62
|
+
(throttled per dead-thread, 10-min cooldown). Self-loop protection.
|
|
63
|
+
- **agim built-in MCP tools default-allowed** — the 9
|
|
64
|
+
`mcp__imhub__*` tools (read_skill / list_skills / save_memo /
|
|
65
|
+
search_memos / update_memo / delete_memo / push_message /
|
|
66
|
+
ask_user / call_agent) are now in native's default allow-list,
|
|
67
|
+
matching what claude-code already saw via the MCP sidecar. Override
|
|
68
|
+
via `IMHUB_NATIVE_AGENT_DENYLIST=...`.
|
|
69
|
+
- **Per-agent native workspace** — `resolveAgentCwd('native', opts)`
|
|
70
|
+
pins IM turns to `~/.agim-workspaces/native/` (was `/` under
|
|
71
|
+
systemd). AGENTS.md seeded with role-definition cues.
|
|
72
|
+
- **Web admin: skills merged into Settings → 技能** — top-level
|
|
73
|
+
`/skills` nav entry retired. New layout has 2 subtabs (Installed +
|
|
74
|
+
skillhub 热门). Old URLs redirect.
|
|
75
|
+
|
|
76
|
+
### Fixed
|
|
77
|
+
|
|
78
|
+
- **access-token paths now lazy** (v1.2.47 carry-over) — `tokensFile()`
|
|
79
|
+
/ `webBootstrapTokenFile()` re-read `process.env.AGIM_HOME` per
|
|
80
|
+
call so tests that swap home directories actually redirect writes.
|
|
81
|
+
Exports added: `getTokensFilePath()`, `getWebBootstrapTokenFile()`,
|
|
82
|
+
`__resetBootstrapHolderForTesting()`.
|
|
83
|
+
- **agent-loop default 5-min timeout no longer cuts native turns**
|
|
84
|
+
— native now passes `timeoutMs: 28 * 60 * 1000` to `runAgentLoop`,
|
|
85
|
+
matching the IM 30-min hard ceiling. Multi-hop `call_agent` chains
|
|
86
|
+
used to abort mid-flight on the 6th minute. Override via
|
|
87
|
+
`IMHUB_NATIVE_AGENT_TIMEOUT_MS`.
|
|
88
|
+
- **wechat-ilink dead-session auto-recovery** — `sendMessage` returning
|
|
89
|
+
`-2` (`INVALID_PARAMS`) now invalidates the cached + persisted
|
|
90
|
+
context-token for that user, so the next inbound message refreshes
|
|
91
|
+
it and the outbox retry succeeds. Was getting stuck in retry
|
|
92
|
+
forever previously.
|
|
93
|
+
- **render-router stray envelope tags** — captured `<im-summary>` /
|
|
94
|
+
`<full-md>` content no longer leaks closing tags into the IM
|
|
95
|
+
bubble (regression when LLM emitted multiple `<im-summary>`
|
|
96
|
+
blocks back-to-back).
|
|
97
|
+
- **Auto-compact tool-orphan bug** (caught by CR) — the slice index
|
|
98
|
+
picker now strictly aligns to `role:'user'` so the recent tail
|
|
99
|
+
never starts on a `role:'tool'` whose matching `assistant.toolCalls`
|
|
100
|
+
was just compacted away (would otherwise hit HTTP 400 on
|
|
101
|
+
OpenAI / DeepSeek).
|
|
102
|
+
- **parsePromptMedia path-safety hardened** — `path.resolve` +
|
|
103
|
+
separator-aware prefix check now rejects sibling-directory leaks
|
|
104
|
+
(e.g. `/root/.agim/media-evil/...`) and `..` traversal.
|
|
105
|
+
- **ESM `require` → static `import`** — `parsePromptMedia` and
|
|
106
|
+
`mediaToDataUrl` use top-of-file `import` (was crashing at
|
|
107
|
+
runtime with `require is not defined`).
|
|
108
|
+
|
|
109
|
+
### Migration
|
|
110
|
+
|
|
111
|
+
- Operators who customised `~/.agim-workspaces/native/AGENTS.md` keep
|
|
112
|
+
their file unchanged (`ensureAgentWorkspace` never overwrites).
|
|
113
|
+
- Default skill mode is `auto` — agim now reads `~/.claude/skills/`
|
|
114
|
+
etc. Set `IMHUB_SKILLS_MODE=agim-only` to opt out of inheritance.
|
|
115
|
+
- The 9 `mcp__imhub__*` tools are auto-allowed under native's
|
|
116
|
+
default policy. Set `IMHUB_NATIVE_AGENT_DENYLIST=mcp__imhub__call_agent,...`
|
|
117
|
+
to block individual ones.
|
|
118
|
+
- Auto-compact will make one cheap-role LLM call per compaction.
|
|
119
|
+
Disable with `IMHUB_NATIVE_COMPACT_TRIGGER_CHARS=0`.
|
|
120
|
+
|
|
121
|
+
## [1.3.0] - 2026-05-23
|
|
122
|
+
|
|
123
|
+
### Theme: nanobot-vs-agim comparison rollout — native LLM stack + P0–P3
|
|
124
|
+
|
|
125
|
+
Single-version landing for the multi-stage work that adopted the most
|
|
126
|
+
valuable structural features from `HKUDS/nanobot` **without changing
|
|
127
|
+
agim's product identity**. agim stays a messenger ↔ agent bridge; the
|
|
128
|
+
new `native` agent is a peer `AgentAdapter` alongside the CLI agents.
|
|
129
|
+
See [`docs/nanobot-comparison-rollout.md`](docs/nanobot-comparison-rollout.md)
|
|
130
|
+
for the PR-by-PR landing order and
|
|
131
|
+
[`docs/architecture-bridge-and-native.md`](docs/architecture-bridge-and-native.md)
|
|
132
|
+
for the architectural stance + anti-patterns.
|
|
133
|
+
|
|
134
|
+
### Added — native LLM stack (Stage 1 + 2)
|
|
135
|
+
|
|
136
|
+
- **`native` AgentAdapter** — in-process LLM agent loop, no subprocess.
|
|
137
|
+
Registered alongside `claude-code` / `codex` / `opencode` /
|
|
138
|
+
`antigravity` and reachable via `/cc native` / `/na` / `/llm`.
|
|
139
|
+
`kind='in-process'` UI tag only; router / approval / A2A / audit
|
|
140
|
+
code stays kind-agnostic. PR #65 + #73.
|
|
141
|
+
- **LLM provider stack** — `openai-compat-provider` (DeepSeek / Kimi /
|
|
142
|
+
Qwen / Ollama / vLLM / OpenAI), `anthropic-provider`, common
|
|
143
|
+
`provider-base` with retries + abort + token usage. PR #59 + #62.
|
|
144
|
+
- **Multi-iteration agent loop** — `agent-loop.ts` runs `chat → tool
|
|
145
|
+
calls → tool results → chat …` until done; max-turns guard; per-turn
|
|
146
|
+
approval gate; reasoning_content round-trip for DeepSeek tool-call
|
|
147
|
+
turns (`ed36b39`). PR #64.
|
|
148
|
+
- **External MCP server attach** — `mcp-client.ts` + `mcp-registry.ts`
|
|
149
|
+
+ `mcp-config.json` connect stdio / HTTP / SSE MCP servers and
|
|
150
|
+
surface their tools as `mcp_<server>_<tool>` to the native
|
|
151
|
+
dispatcher. PR #63.
|
|
152
|
+
- **Policy approval gate** — `policy-approval-gate.ts` with
|
|
153
|
+
`mode=allow-list | deny-list | always-allow | always-deny`,
|
|
154
|
+
per-tool `autoAllow` count, audit-logged decisions. PR #64.
|
|
155
|
+
- **`llmBackends` + `llmRoles` + `~/.agim/llm-secrets.json`** — config
|
|
156
|
+
schema for backend definitions, role bindings (`cheap` / `evaluator`
|
|
157
|
+
/ `native-chat`), and secret storage with 0o600 perms + redacted
|
|
158
|
+
list endpoints. PR #59 + #70.
|
|
159
|
+
- **`tryIntrospectChain` fallback helper** — internal callers
|
|
160
|
+
(`memory-distill`, `memory-consolidate`, `intent-llm`) try roles in
|
|
161
|
+
order and fall back gracefully when a backend is unavailable. PR #71.
|
|
162
|
+
- **`loadFromConfig` boot wiring** — `src/cli.ts` now calls
|
|
163
|
+
`loadLlmFromConfig` + `loadMcpFromConfig` + `connectAll` after
|
|
164
|
+
built-in plugin load so `native.isAvailable()` returns true on first
|
|
165
|
+
boot when a backend is configured. `11cc0f6`.
|
|
166
|
+
|
|
167
|
+
### Added — P0 items riding on the stack
|
|
168
|
+
|
|
169
|
+
- **`/heartbeat` per-thread bindings + 3-phase scheduler (P0 #1)** —
|
|
170
|
+
bind a thread to a tick interval; each tick runs DECIDE (cheap LLM)
|
|
171
|
+
→ EXECUTE (the agent does the work) → EVALUATE (notification gate
|
|
172
|
+
decides whether to ping the user). `/tasks/heartbeat` cross-thread
|
|
173
|
+
admin. PR #61.
|
|
174
|
+
- **`/goal` sustained-objective tracker (P0 #2)** — one active goal
|
|
175
|
+
per IM thread, auto-injected into every prompt for cross-turn
|
|
176
|
+
context. Lifecycle `set / body / progress / pause / resume /
|
|
177
|
+
complete / cancel / list`. `/tasks/goals` cross-thread admin. See
|
|
178
|
+
[`docs/goals.md`](docs/goals.md). PR #66.
|
|
179
|
+
- **agim Skills engine (Stage 3 + P0 #3)** — discover `SKILL.md`
|
|
180
|
+
files in `~/.agim/skills/` + bundled `<dist>/skills/builtin/`; 3-tier
|
|
181
|
+
progressive disclosure (name+desc auto-injected; body via
|
|
182
|
+
`mcp__imhub__read_skill`; scripts/refs via normal file read);
|
|
183
|
+
`/skill list|show|refresh` + `/settings/agim-skills` web editor. See
|
|
184
|
+
[`docs/skills.md`](docs/skills.md). PR #68 + #76.
|
|
185
|
+
- **Inline row-age annotations on memory facts (P0 #4)** — every fact
|
|
186
|
+
/ persona row gets a `(2d ago)` style annotation in the injected
|
|
187
|
+
context so the agent has temporal context for free. `format-age.ts`
|
|
188
|
+
utility + `persona-age.test.ts`. PR #69.
|
|
189
|
+
- **`mcp__imhub__ask_user` structured choice (P0 #5)** — agent presents
|
|
190
|
+
N choices (2-9) with optional timeout; user replies via button or
|
|
191
|
+
text; result returns deterministically as a typed choice index +
|
|
192
|
+
free-text. `/tasks/asks` pending-queue admin. See
|
|
193
|
+
[`docs/ask-user.md`](docs/ask-user.md). PR #67.
|
|
194
|
+
- **Notification evaluator for agent-initiated push (P0 #9)** —
|
|
195
|
+
`mcp__imhub__push_message` and `POST /api/notify` go through an
|
|
196
|
+
LLM-graded "should we deliver this?" filter before hitting the IM
|
|
197
|
+
thread. Per-thread rate limit; verdict logged to audit. PR #60.
|
|
198
|
+
|
|
199
|
+
### Added — config UX (Stage 4 + 6) and CLI symmetry (P2/P3)
|
|
200
|
+
|
|
201
|
+
- **Web settings pages** —
|
|
202
|
+
- `/settings/llm` — list / add / remove backends, role bindings,
|
|
203
|
+
secret slots, per-backend **Ping** via
|
|
204
|
+
`/api/llm/backends/:name/ping`.
|
|
205
|
+
- `/settings/mcp` — list / add / remove external MCP servers,
|
|
206
|
+
per-server **Health** via `/api/mcp/servers/:name/health`.
|
|
207
|
+
- `/settings/native-agent` — focused form for native-agent /
|
|
208
|
+
notification-evaluator / heartbeat env knobs.
|
|
209
|
+
- `/settings/agim-skills` — SKILL.md editor.
|
|
210
|
+
PR #74 + #76.
|
|
211
|
+
- **Web task views** — `/tasks/heartbeat`, `/tasks/goals`,
|
|
212
|
+
`/tasks/asks` cross-thread admin views with auto-refresh and
|
|
213
|
+
per-row actions. REST `/api/heartbeat/bindings`, `/api/goals`,
|
|
214
|
+
`/api/asks/pending`. PR #75.
|
|
215
|
+
- **CLI wizards**:
|
|
216
|
+
- `agim setup llm {add,list,remove,role,secret,native-enable}` —
|
|
217
|
+
full LLM backend + role + secret management; `native-enable`
|
|
218
|
+
one-shot enables the native agent if a backend exists. PR #70 + #77.
|
|
219
|
+
- `agim setup mcp {add,list,remove,health}` — MCP server CRUD +
|
|
220
|
+
probe. Restores CLI/Web symmetry. PR #78.
|
|
221
|
+
- `agim diag {llm,mcp}` — ping every backend / connect-and-list-tools
|
|
222
|
+
per MCP server with single-screen status output. PR #77.
|
|
223
|
+
- **Config wizard now offers `native`** — `agim` first-run wizard
|
|
224
|
+
detects `llmBackends` and offers `native` as a checkbox agent
|
|
225
|
+
alongside `claude-code` etc. `03a04f5`.
|
|
226
|
+
- **`gen-endpoints --check` drift guard** — `tools/gen-endpoints.mjs`
|
|
227
|
+
added a `--check` mode that fails CI when generated endpoint
|
|
228
|
+
constants drift from the SPA hand-written exports. PR #79.
|
|
229
|
+
|
|
230
|
+
### Added — Stage 5 router
|
|
231
|
+
|
|
232
|
+
- **`/router compare agent:<a> agent:<b> "<prompt>"`** — A/B evaluator
|
|
233
|
+
runs the same prompt against two backends side-by-side (any combo of
|
|
234
|
+
CLI and native), returns a single card with latency + tokens + raw
|
|
235
|
+
outputs so operators can pick a winner before changing
|
|
236
|
+
`defaultAgent`. PR #71.
|
|
237
|
+
|
|
238
|
+
### Added — i18n
|
|
239
|
+
|
|
240
|
+
- **Full bilingual (en / zh) coverage** for every new v1.3.0 surface:
|
|
241
|
+
- Web SPA — `/settings/{llm,mcp,native-agent,agim-skills}` +
|
|
242
|
+
`/tasks/{heartbeat,goals,asks}` use `useTranslation` with the new
|
|
243
|
+
`settings.json` / `tasks.json` locale namespaces.
|
|
244
|
+
- CLI — `src/cli-ui/i18n.ts` adds native/MCP startup logs, agent
|
|
245
|
+
install hints (`formatAgentInstallHint(lang, missing)`),
|
|
246
|
+
`agim token create/list/revoke/bootstrap` output, config wizard
|
|
247
|
+
`native` agent label, and `resolveCliLang()` for env-derived
|
|
248
|
+
lang. `0eef14e`.
|
|
249
|
+
- **`agim token bootstrap`** prints the one-shot
|
|
250
|
+
`~/.agim/admin-bootstrap-token` to the operator on the host. PR #76
|
|
251
|
+
follow-up + `6490ce5`.
|
|
252
|
+
|
|
253
|
+
### Architecture
|
|
254
|
+
|
|
255
|
+
- **`AgentAdapter.kind: 'cli' | 'in-process' | 'remote'`** — UI tag
|
|
256
|
+
only; router / approval bus / A2A / audit code does NOT branch on
|
|
257
|
+
it. New `describe?()` method renders the role/model line in
|
|
258
|
+
`/agents`. PR #73.
|
|
259
|
+
- **`acp-token` separated from `web-token`** — the ACP bearer now
|
|
260
|
+
lives in `~/.agim/acp-token` (legacy fallback `~/.agim/web-token`),
|
|
261
|
+
giving operators an independent rotation surface for remote-agent
|
|
262
|
+
inbound traffic.
|
|
263
|
+
|
|
264
|
+
### Docs
|
|
265
|
+
|
|
266
|
+
- `docs/architecture-bridge-and-native.md` (new) — peer
|
|
267
|
+
`AgentAdapter` design, the six things every backend gets for free
|
|
268
|
+
(routing / A2A / approval / audit / `/router compare` / fallback
|
|
269
|
+
chains), anti-patterns.
|
|
270
|
+
- `docs/nanobot-comparison-rollout.md` (new) — single-page reference
|
|
271
|
+
for the multi-stage rollout, recommended PR landing order, end-state
|
|
272
|
+
capability matrix, deferred items.
|
|
273
|
+
- `docs/llm-backends.md` (new) — native LLM backend configuration,
|
|
274
|
+
provider matrix, secret handling, role bindings, troubleshooting.
|
|
275
|
+
- `docs/goals.md`, `docs/ask-user.md`, `docs/skills.md` (new) — full
|
|
276
|
+
primitive references.
|
|
277
|
+
|
|
278
|
+
### Fixed
|
|
279
|
+
|
|
280
|
+
- **`native.isAvailable()` returns true on first boot** — `cli.ts`
|
|
281
|
+
was calling `loadBuiltInPlugins()` but never `loadLlmFromConfig`,
|
|
282
|
+
so the in-process LLM registry stayed empty and the native agent
|
|
283
|
+
reported unavailable until something else lazily loaded it.
|
|
284
|
+
`11cc0f6`.
|
|
285
|
+
- **DeepSeek tool-call turn `reasoning_content` round-trip** —
|
|
286
|
+
preserve the assistant `reasoning_content` field across tool-call
|
|
287
|
+
turns so multi-iteration loops don't drop chain-of-thought when the
|
|
288
|
+
model returns it alongside a tool call. `ed36b39`.
|
|
289
|
+
- **SPA registers v1.3.0 routes** — `/settings/{llm,mcp,native-agent,
|
|
290
|
+
agim-skills}` and `/tasks/{heartbeat,goals,asks}` registered in the
|
|
291
|
+
v2 SPA router. `c97b023` + `d29ee47`.
|
|
292
|
+
|
|
293
|
+
### Compatibility
|
|
294
|
+
|
|
295
|
+
- Native agent is **opt-in by default**; without `llmBackends` the
|
|
296
|
+
bridge behaviour is identical to v1.2.x.
|
|
297
|
+
- All v1.2.x configs continue to work without edit; the new
|
|
298
|
+
`llmBackends` / `llmRoles` keys are additive.
|
|
299
|
+
- `~/.agim/web-token` is still honored as a fallback for the ACP
|
|
300
|
+
bearer if `~/.agim/acp-token` does not exist.
|
|
301
|
+
|
|
7
302
|
## [1.2.32] - 2026-05-22
|
|
8
303
|
|
|
9
304
|
### R15 — final R14 follow-ups
|
package/README.md
CHANGED
|
@@ -18,6 +18,14 @@
|
|
|
18
18
|
## Highlights
|
|
19
19
|
|
|
20
20
|
- **3 messengers + email, 3+ agents** — WeChat (image / file / voice), Feishu, DingTalk (image / voice with server-side ASR), Email (SMTP); Claude Code, Codex, OpenCode, plus any ACP endpoint
|
|
21
|
+
- **Native LLM stack (v1.3.0+, hardened in v1.2.48)** — built-in in-process agent loop (`native` adapter) that talks directly to any OpenAI- / Anthropic-compatible API (DeepSeek, Kimi, GLM, Qwen, Ollama, vLLM, OpenAI, Anthropic). v1.2.48 makes native production-ready: **operator role definition** via `~/.agim-workspaces/native/AGENTS.md` (hot-reloaded, no restart), **multimodal vision** (image attachments → openai-compat `image_url` blocks), **auto-compact** long histories (>60k chars summarised by cheap role), **provider fallback chain** on transient 5xx/timeout, **turn-level heartbeat** every 3 min so multi-hop research turns never look dead, **28-min agent-loop timeout** (was 5-min default, killed long `call_agent` chains). Use it as a cheap router for `memory-distill` / `memory-consolidate` / `intent-llm`, as a local-first chat agent (`/na`), or as a peer in A2A. See [`docs/llm-backends.md`](docs/llm-backends.md) + [`docs/architecture-bridge-and-native.md`](docs/architecture-bridge-and-native.md).
|
|
22
|
+
- **Skills multi-root scan (v1.2.48+)** — `IMHUB_SKILLS_MODE=auto` (default) merges `~/.agim/skills/` (write target) with `~/.claude/skills/`, `~/.config/opencode/skills/`, `~/.codex/skills/` so a fresh install sees every skill you already have from CLI agents. Workspace skills shadow same-named inherited entries. Settings → 技能 has 2 subtabs (Installed editor + skillhub 热门); top-level `/skills` nav merged into Settings.
|
|
23
|
+
- **Cross-channel outbox alert (v1.2.48+)** — when a thread's outbox is dead (e.g. wechat session expired), agim auto-invalidates the stale context-token + pushes a "⚠️ outbox 告警" to your configured backup channel (`IMHUB_OPERATOR_ALERT_PLATFORM` / `IMHUB_OPERATOR_ALERT_THREAD_ID`) so you find out before the user does.
|
|
24
|
+
- **Per-thread sustained goals (v1.3.0+ · `/goal`)** — one active multi-turn objective per IM thread, auto-injected into every prompt so the agent stays on-mission across many user turns. Lifecycle: `set / body / progress / pause / resume / complete / cancel / list`. Cross-thread admin at `/tasks/goals`. See [`docs/goals.md`](docs/goals.md).
|
|
25
|
+
- **Heartbeat scheduler (v1.3.0+ · `/heartbeat`)** — bind a thread to a periodic "anything to do right now?" tick. Each tick runs DECIDE (cheap LLM) → EXECUTE (the agent does the work) → EVALUATE (notification gate decides whether to ping the user). Cross-thread admin at `/tasks/heartbeat`.
|
|
26
|
+
- **Structured agent → user choice (v1.3.0+ · `mcp__imhub__ask_user`)** — agents present an N-way multiple-choice question and reliably get a typed answer back (button + text reply, configurable timeout). Avoids the "free-form chat" ambiguity for disambiguation. Pending-queue admin at `/tasks/asks`. See [`docs/ask-user.md`](docs/ask-user.md).
|
|
27
|
+
- **agim Skills engine (v1.3.0+ · `/skill`)** — drop a `SKILL.md` into `~/.agim/skills/<name>/`, every CLI agent + native sees it. 3-tier progressive disclosure (name+desc always-on, body on-demand via `mcp__imhub__read_skill`, scripts/refs via normal file-read). Web editor at `/settings/agim-skills`. See [`docs/skills.md`](docs/skills.md).
|
|
28
|
+
- **`/router compare` A/B evaluator (v1.3.0+)** — run the same prompt against two backends side-by-side (any combo of CLI and native), get latency + tokens + outputs in one card so you can pick a winner before changing `defaultAgent`.
|
|
21
29
|
- **Compliance-first defaults (v1.2.23+)** — global IM adapters (Discord, Telegram) and the remote-ACP-agent surface are **hidden** by default; no installer prompt or web-admin card exposes them. Mainland-China deployments should leave them disabled. For cross-border setups, opt-in via `IMHUB_ENABLE_GLOBAL_IM=1` / `IMHUB_ENABLE_REMOTE_AGENT=1`. See [`docs/security-hardening.md`](docs/security-hardening.md) for the full security control catalogue (~30 env vars / sensitive-path denylist / outbound secret scrubber / audit-events table / admin role on tokens / R14 systemctl-aware lifecycle).
|
|
22
30
|
- **Agent-to-Agent (A2A)** — agents call other agents inline via `mcp__imhub__call_agent`. Just say *"用 codex 帮我跑 git status"* / *"ask opencode to run the tests"* — the active agent hands off, waits, integrates the reply. Guardrails: depth limit (default 3), self-call ban, workspace whitelist, per-user budget. Observability: `/a2a stats | recent | tree <id>`. Disable with `IMHUB_A2A_ENABLED=0`.
|
|
23
31
|
- **A2A shared artifacts (v1.1.3+)** — caller drops files into the callee's workspace via `inputs[]` (`fromAbsolutePath` / `fromCallerOutput` / inline `content`), and callee writes products to `~/.agim/artifacts/<jobId>/_agim-output/`. Returned `outputs[]` lets the caller read files on demand. Hard-link first, copy fallback. Size caps configurable.
|
|
@@ -90,15 +98,18 @@ units that call `agim` continue to work without any extra setup.
|
|
|
90
98
|
| Category | Details |
|
|
91
99
|
|----------|---------|
|
|
92
100
|
| **Messengers** | WeChat (iLink — image / file / voice / video), Feishu (WebSocket), DingTalk (Stream mode — image / voice with built-in ASR), Email (SMTP, push-only) |
|
|
93
|
-
| **Agents** | Claude Code, Codex, OpenCode
|
|
101
|
+
| **Agents** | Claude Code, Codex, OpenCode, Antigravity (all CLI via shared `AgentBase`); **`native`** in-process LLM loop; any HTTP agent via ACP — all share one `AgentAdapter` interface |
|
|
102
|
+
| **Native LLM** | OpenAI- + Anthropic-compatible providers, external MCP server attach, multi-iteration agent loop with policy approval gate, role bindings (`cheap` / `evaluator` / `native-chat`) |
|
|
94
103
|
| **Reminders** | `/remind` slash, LLM intent detection, LLM-polished delivery, MCP tools for agents (claude-code + opencode), web `/reminders` UI |
|
|
95
|
-
| **
|
|
96
|
-
| **
|
|
104
|
+
| **Goals + Heartbeat + Ask** | `/goal` per-thread objective, `/heartbeat` periodic DECIDE/EXECUTE/EVALUATE tick, `mcp__imhub__ask_user` structured multi-choice with `/tasks/{goals,heartbeat,asks}` cross-thread admin |
|
|
105
|
+
| **Skills** | `~/.agim/skills/<name>/SKILL.md` discovered by every agent (CLI + native); 3-tier progressive disclosure; web editor at `/settings/agim-skills` |
|
|
106
|
+
| **Web UI** | Chat with streaming, three-state theme (light / dark / system), bilingual (EN / 中文 — every new v1.3.0 page included), SSE dashboard, settings tabs for LLM / MCP / Native Agent / Skills |
|
|
107
|
+
| **Tool Approval** | Human-in-the-loop over IM + in-page cards; MCP sidecar for Claude; allow-list policy gate for native |
|
|
97
108
|
| **Jobs** | Persistent SQLite job board + cron scheduler; batch ops; background task reader |
|
|
98
|
-
| **Routing** | Intent classifier, circuit breaker, rate limiter, sticky sessions, LLM judge fallback |
|
|
109
|
+
| **Routing** | Intent classifier, circuit breaker, rate limiter, sticky sessions, LLM judge fallback; `/router compare` A/B evaluator |
|
|
99
110
|
| **Workspaces** | Multi-tenant; agent whitelist + rate limits; command-level ACL |
|
|
100
111
|
| **Observability** | pino structured logs, traceId, Prometheus `/api/metrics`, SQLite audit log |
|
|
101
|
-
| **ACP** | Client (connect to remote agents) + Server (Agim itself as an ACP agent) |
|
|
112
|
+
| **ACP** | Client (connect to remote agents) + Server (Agim itself as an ACP agent) with token-gated `~/.agim/acp-token` (legacy fallback `~/.agim/web-token`) |
|
|
102
113
|
|
|
103
114
|
## CLI Commands
|
|
104
115
|
|
|
@@ -117,6 +128,21 @@ agim config claude # Configure Claude Code
|
|
|
117
128
|
agim config agent # Connect a custom ACP agent
|
|
118
129
|
agim agents # List available agents
|
|
119
130
|
agim messengers # List available messengers
|
|
131
|
+
|
|
132
|
+
# v1.3.0+ — native LLM stack & diagnostics
|
|
133
|
+
agim setup llm # Wizard: add/list/remove LLM backends, bind roles, set secrets
|
|
134
|
+
agim setup llm native-enable # One-shot: enable `native` agent if a backend is configured
|
|
135
|
+
agim setup mcp # Wizard: add/list/remove external MCP servers (stdio / HTTP / SSE)
|
|
136
|
+
agim setup mcp health # Probe every configured MCP server
|
|
137
|
+
agim diag llm # Ping every backend + show which role binds to what
|
|
138
|
+
agim diag mcp # Connect-and-list-tools per MCP server
|
|
139
|
+
|
|
140
|
+
# v1.1.10+ — Web/ACP token management
|
|
141
|
+
agim token create [name] # Mint a new user/admin token for /api/* + /acp/*
|
|
142
|
+
agim token list # List tokens (last 4 chars only)
|
|
143
|
+
agim token revoke <id> # Revoke a token by id
|
|
144
|
+
agim token bootstrap # Print one-shot web-bootstrap token (`~/.agim/admin-bootstrap-token`)
|
|
145
|
+
|
|
120
146
|
# (`im-hub-pro …` continues to work as a deprecated alias)
|
|
121
147
|
```
|
|
122
148
|
|
|
@@ -135,6 +161,11 @@ agim messengers # List available messengers
|
|
|
135
161
|
| `/outbox status\|list\|failed\|retry <id>` | Inspect & operate the persistent IM delivery queue (v1.1.2+) |
|
|
136
162
|
| `/a2a stats\|recent\|tree <id>` | Agent-to-Agent observability — chain, latency, callee histogram (v1.1.2+) |
|
|
137
163
|
| `/router status\|explain` | Inspect routing decisions |
|
|
164
|
+
| `/router compare agent:<a> agent:<b> "<prompt>"` | A/B evaluator — run the same prompt against two backends, side-by-side card with latency / tokens / outputs (v1.3.0+) |
|
|
165
|
+
| `/goal …` | Sustained per-thread objective — `set / body / progress / pause / resume / complete / cancel / list / show` (v1.3.0+) |
|
|
166
|
+
| `/heartbeat …` | Periodic DECIDE→EXECUTE→EVALUATE tick — `bind / unbind / show / pause / resume / status` (v1.3.0+) |
|
|
167
|
+
| `/skill list\|show <name>\|refresh` | Inspect agim Skills loaded from `~/.agim/skills/` (v1.3.0+) |
|
|
168
|
+
| `/cc native …` / `/na …` / `/llm …` | Route to the in-process native LLM agent (v1.3.0+) |
|
|
138
169
|
| `y` / `n` / `批准` / `拒绝` | Approve / deny Claude tool call (or reminder confirmation card) |
|
|
139
170
|
| `1` / `2` | After a service restart, reply `1` to redo the interrupted message or `2` to cancel (10 min window) |
|
|
140
171
|
|
|
@@ -360,6 +391,7 @@ Environment="IMHUB_SMTP_PASS=xxxxxxxxxxxxxxxx"
|
|
|
360
391
|
Single process, zero external dependencies — SQLite + session files are the entire persistence layer.
|
|
361
392
|
|
|
362
393
|
For the full deep-dive see [`docs/architecture/current.md`](docs/architecture/current.md).
|
|
394
|
+
For the native LLM stack and the peer-`AgentAdapter` design that lets CLI agents and the in-process loop share one router / approval bus / A2A / skills pipeline, see [`docs/architecture-bridge-and-native.md`](docs/architecture-bridge-and-native.md) and the PR-by-PR landing order in [`docs/nanobot-comparison-rollout.md`](docs/nanobot-comparison-rollout.md).
|
|
363
395
|
|
|
364
396
|
## Requirements
|
|
365
397
|
|
|
@@ -417,6 +449,8 @@ See [`docs/deployment.md`](docs/deployment.md) for systemd, Docker, nginx, monit
|
|
|
417
449
|
| **v1.2.0** | **Long-term memory** (SQLite + FTS5 + persona + 4 MCP tools + auto-distillation + Web admin tab); **vector retrieval** (local BGE / OpenAI-compatible, RRF fusion); **Cost & Health dashboard**; **agent-initiated push** (`mcp__imhub__push_message`); recovery card with native inline buttons. |
|
|
418
450
|
| v1.2.1 | Vector backend auto-warm on restart; Memory + Cost tab i18n. |
|
|
419
451
|
| v1.2.2 | `agim admin invite` for onboarding additional admins via IM; vector eager-warm at boot; async consolidate (jobId + polling). |
|
|
452
|
+
| v1.2.27–v1.2.32 | R14/R15 lifecycle hardening — 25s graceful-shutdown hard cap, port-first teardown, reap stray agim processes, argv-strict /proc scan in `findAgimProcesses`, PID file on every successful start, CLI wizard "Web bind+port" section, ACP port gate (`IMHUB_ENABLE_REMOTE_AGENT`). |
|
|
453
|
+
| **v1.3.0** | **nanobot-vs-agim comparison rollout** — `native` in-process AgentAdapter (LLM client + agent loop + MCP attach + policy approval gate, OpenAI/Anthropic-compatible); `llmBackends` + `llmRoles` + `~/.agim/llm-secrets.json` config; `/goal` per-thread sustained objective (P0 #2); `/heartbeat` 3-phase scheduler (P0 #1); `mcp__imhub__ask_user` structured choice (P0 #5); agim Skills 3-tier engine (Stage 3 + P0 #3); inline row-age annotations on memory facts (P0 #4); notification evaluator for `mcp__imhub__push_message` (P0 #9); `/router compare` A/B evaluator (Stage 5); `tryIntrospectChain` fallback helper; Web admin pages `/settings/{llm,mcp,native-agent,agim-skills}` + `/tasks/{heartbeat,goals,asks}`; CLI wizards `agim setup {llm,mcp}` + diagnostics `agim diag {llm,mcp}` + `agim setup llm native-enable` quick path; CLI + Web full i18n (en/zh) for every new surface; `acp-token` separation from `web-token`; `agim token bootstrap` printer; `gen-endpoints --check` drift guard. See [`docs/nanobot-comparison-rollout.md`](docs/nanobot-comparison-rollout.md). |
|
|
420
454
|
|
|
421
455
|
### Next
|
|
422
456
|
|
package/README.zh-CN.md
CHANGED
|
@@ -13,7 +13,15 @@
|
|
|
13
13
|
|
|
14
14
|
## 亮点
|
|
15
15
|
|
|
16
|
-
- **3 种 IM + 邮件,3+ 种 Agent** — 微信(图片 / 文件 / 语音)、飞书、钉钉(图片 / 语音,自带服务端 ASR)、Email(SMTP);Claude Code、Codex、OpenCode,以及任意 ACP 端点
|
|
16
|
+
- **3 种 IM + 邮件,3+ 种 Agent** — 微信(图片 / 文件 / 语音)、飞书、钉钉(图片 / 语音,自带服务端 ASR)、Email(SMTP);Claude Code、Codex、OpenCode、Antigravity,以及任意 ACP 端点
|
|
17
|
+
- **原生 LLM 栈(v1.3.0+,v1.2.48 强化)** — 内置 in-process agent loop(`native` adapter),直连任何 OpenAI / Anthropic 兼容 API(DeepSeek / Kimi / GLM / Qwen / Ollama / vLLM / OpenAI / Anthropic)。v1.2.48 让 native 真正进入生产可用:**角色定义** 通过 `~/.agim-workspaces/native/AGENTS.md`(热加载,无需重启);**多模态**(图片附件 → openai-compat `image_url`);**自动压缩**长对话(>60k 字符 → 由 cheap role 摘要);**Provider 失败链路降级**(5xx/超时自动切下一个 role);**轮级心跳**每 3 分钟一次"⏳ 还在处理"避免多步研究看似卡死;**agent-loop 超时拉到 28 分钟**(旧 5 分钟会切断 multi-hop `call_agent`)。可用作 `memory-distill` / `memory-consolidate` / `intent-llm` 的便宜路由,可作为本地优先的聊天 agent(`/na`),也可作 A2A 的 peer。详见 [`docs/llm-backends.md`](docs/llm-backends.md) 与 [`docs/architecture-bridge-and-native.md`](docs/architecture-bridge-and-native.md)
|
|
18
|
+
- **Skills 多目录扫描(v1.2.48+)** — `IMHUB_SKILLS_MODE=auto`(默认)把 `~/.agim/skills/`(写入目标)与 `~/.claude/skills/`、`~/.config/opencode/skills/`、`~/.codex/skills/` 合并;新装即可看到所有已有 CLI agent 的技能。同名时 workspace 覆盖。Settings → 技能 改成两个子 tab(已安装编辑器 + skillhub 热门);顶部导航条的 `/skills` 已合并进 Settings
|
|
19
|
+
- **跨通道出口告警(v1.2.48+)** — 某条会话 outbox 失败 ≥3 次时(如 wechat session 过期),agim 自动失效 stale 的 context-token,并向你预设的备用通道(`IMHUB_OPERATOR_ALERT_PLATFORM` / `IMHUB_OPERATOR_ALERT_THREAD_ID`)推一条"⚠️ outbox 告警",让你比用户更早发现
|
|
20
|
+
- **会话级长目标(v1.3.0+ · `/goal`)** — 每个 IM 会话最多一个 active 目标,自动注入每条 prompt,确保 Agent 跨多轮不偏题。生命周期:`set / body / progress / pause / resume / complete / cancel / list`。跨会话管理在 `/tasks/goals`。详见 [`docs/goals.md`](docs/goals.md)
|
|
21
|
+
- **Heartbeat 主动节拍(v1.3.0+ · `/heartbeat`)** — 把一个会话绑到周期性「现在有事要做吗?」节拍。每次 tick 走 DECIDE(便宜 LLM)→ EXECUTE(Agent 实际办)→ EVALUATE(通知门评估是否打扰用户)。跨会话管理在 `/tasks/heartbeat`
|
|
22
|
+
- **结构化 Agent→User 选择题(v1.3.0+ · `mcp__imhub__ask_user`)** — Agent 给用户出 N 选 1 选择题,用户按键或文字回复都能可靠回到 Agent,避免「自由聊天里 yes/no 二义性」。等待队列在 `/tasks/asks`。详见 [`docs/ask-user.md`](docs/ask-user.md)
|
|
23
|
+
- **agim Skills 技能引擎(v1.3.0+ · `/skill`)** — 放一个 `SKILL.md` 到 `~/.agim/skills/<name>/`,所有 CLI agent + native 都看得到。3 层渐进披露(name+desc 每轮自动注入;body 按需 `mcp__imhub__read_skill`;scripts/refs 走普通 file-read)。Web 编辑器在 `/settings/agim-skills`。详见 [`docs/skills.md`](docs/skills.md)
|
|
24
|
+
- **`/router compare` A/B 评测(v1.3.0+)** — 同一条 prompt 同时打两个后端(CLI 与 native 可任意组合),一个卡片返回延迟 / token / 输出,方便在改 `defaultAgent` 之前先选个赢家
|
|
17
25
|
- **合规友好默认(v1.2.23+)** — 海外 IM 适配器(Discord、Telegram)以及远程 ACP Agent 入口默认**全部隐藏**(CLI 向导 / Web 后台 / 运行时加载三层都 gate 住),主页面、安装向导、Web 后台都不会暴露。国内部署保持关闭即可。需要跨境通道时再通过 `IMHUB_ENABLE_GLOBAL_IM=1` / `IMHUB_ENABLE_REMOTE_AGENT=1` 显式启用。完整安全控制清单见 [`docs/security-hardening.md`](docs/security-hardening.md)(~30 个 env、敏感路径黑名单、出站脱敏、审计事件表、token 角色、R14 systemctl-aware 生命周期)
|
|
18
26
|
- **Agent 之间互调(A2A)** — Agent 可以在自己的工具循环里直接调另一个 Agent,比如直接说「用 codex 帮我跑 git status」/「让 opencode 跑一下测试」。护栏在 agim 里强制:递归深度限制(默认 3)、禁止自调、工作区白名单、按人预算共享;可观测:`/a2a stats | recent | tree <id>`;`IMHUB_A2A_ENABLED=0` 关闭
|
|
19
27
|
- **A2A 共享文件传递(v1.1.3+)** — caller 可通过 `inputs[]`(`fromAbsolutePath` / `fromCallerOutput` / 内联 `content`)把文件放进 callee 工作区;callee 把产物写到 `~/.agim/artifacts/<jobId>/_agim-output/`,返回的 `outputs[]` 让 caller 按需读。同文件系统优先 hard-link,否则复制。大小上限 env 可调
|
|
@@ -82,15 +90,18 @@ npm 包名是 `agim-cli`(短名 `agim` 被 npm 反 typo-squat 保留了);
|
|
|
82
90
|
| 分类 | 内容 |
|
|
83
91
|
|------|------|
|
|
84
92
|
| **IM 通道** | 微信(iLink — 图片 / 文件 / 语音 / 视频)、飞书(WebSocket)、钉钉(Stream 模式 — 图片 / 语音,自带服务端 ASR)、Email(SMTP,仅推送) |
|
|
85
|
-
| **Agent** | Claude Code、Codex、OpenCode(统一 `AgentBase
|
|
93
|
+
| **Agent** | Claude Code、Codex、OpenCode、Antigravity(统一 `AgentBase`);**`native`** in-process LLM loop;任何 HTTP Agent 通过 ACP 接入——所有后端走同一份 `AgentAdapter` 接口 |
|
|
94
|
+
| **原生 LLM** | OpenAI / Anthropic 兼容 provider,外挂 MCP 服务器,多轮 agent loop + 策略式审批门,角色绑定(`cheap` / `evaluator` / `native-chat`) |
|
|
86
95
|
| **提醒** | `/remind` slash、LLM 意图识别、LLM 润色投递、Agent MCP 工具(claude-code + opencode)、Web `/reminders` 页面 |
|
|
87
|
-
|
|
|
88
|
-
|
|
|
96
|
+
| **长目标 + 心跳 + 提问** | `/goal` 会话级目标、`/heartbeat` 周期 DECIDE/EXECUTE/EVALUATE 节拍、`mcp__imhub__ask_user` 结构化选择题,跨会话视图在 `/tasks/{goals,heartbeat,asks}` |
|
|
97
|
+
| **技能(Skills)** | `~/.agim/skills/<name>/SKILL.md` 被所有 agent(CLI + native)发现;3 层渐进披露;Web 编辑器在 `/settings/agim-skills` |
|
|
98
|
+
| **Web 控制台** | 流式对话、三态主题(浅 / 深 / 跟随系统)、中英双语(v1.3.0 每个新页面都跟齐)、SSE 实时仪表盘、Settings 子页 LLM / MCP / Native Agent / Skills |
|
|
99
|
+
| **工具人审** | IM 端 + 页面内审批卡;Claude MCP sidecar;native 走 allow-list 策略门 |
|
|
89
100
|
| **任务** | SQLite 持久化 Job Board + cron 调度;批量操作;后台任务读取 |
|
|
90
|
-
| **路由** | 意图分类、断路器、限流、Sticky 会话、LLM
|
|
101
|
+
| **路由** | 意图分类、断路器、限流、Sticky 会话、LLM 兜底;`/router compare` A/B 评测 |
|
|
91
102
|
| **工作区** | 多租户;Agent 白名单 + 限流;命令级 ACL |
|
|
92
103
|
| **可观测** | pino 结构化日志、traceId、Prometheus `/api/metrics`、SQLite 审计 |
|
|
93
|
-
| **ACP** | 客户端(连接远端 Agent)+ 服务端(阿吉姆自身作为 ACP Agent
|
|
104
|
+
| **ACP** | 客户端(连接远端 Agent)+ 服务端(阿吉姆自身作为 ACP Agent),bearer 走 `~/.agim/acp-token`(兼容回退 `~/.agim/web-token`) |
|
|
94
105
|
|
|
95
106
|
## CLI 命令
|
|
96
107
|
|
|
@@ -109,6 +120,21 @@ agim config claude # 配置 Claude Code
|
|
|
109
120
|
agim config agent # 接入自定义 ACP Agent
|
|
110
121
|
agim agents # 列出可用 Agent
|
|
111
122
|
agim messengers # 列出可用 IM
|
|
123
|
+
|
|
124
|
+
# v1.3.0+ — 原生 LLM 栈 + 诊断
|
|
125
|
+
agim setup llm # 向导:增/查/删 LLM backend,绑定角色,写 secret
|
|
126
|
+
agim setup llm native-enable # 一键启用 `native` agent(前提是已配置 backend)
|
|
127
|
+
agim setup mcp # 向导:增/查/删 外挂 MCP 服务器(stdio / HTTP / SSE)
|
|
128
|
+
agim setup mcp health # 探活全部 MCP 服务器
|
|
129
|
+
agim diag llm # 各 backend ping + 角色绑定表
|
|
130
|
+
agim diag mcp # 连接并列工具
|
|
131
|
+
|
|
132
|
+
# v1.1.10+ — Web/ACP 令牌
|
|
133
|
+
agim token create [name] # 新发 user/admin token(接 /api/*、/acp/*)
|
|
134
|
+
agim token list # 列出 token(只回显末 4 位)
|
|
135
|
+
agim token revoke <id> # 按 id 撤销
|
|
136
|
+
agim token bootstrap # 输出一次性 web-bootstrap token(`~/.agim/admin-bootstrap-token`)
|
|
137
|
+
|
|
112
138
|
# (`agim …` 作为别名继续可用)
|
|
113
139
|
```
|
|
114
140
|
|
|
@@ -127,6 +153,11 @@ agim messengers # 列出可用 IM
|
|
|
127
153
|
| `/outbox status\|list\|failed\|retry <id>` | 查看与重发 IM 投递队列(v1.1.2+) |
|
|
128
154
|
| `/a2a stats\|recent\|tree <id>` | 查看 Agent 之间互调的统计 / 最近 N 次 / 调用链树(v1.1.2+) |
|
|
129
155
|
| `/router status\|explain` | 查看路由策略 |
|
|
156
|
+
| `/router compare agent:<a> agent:<b> "<内容>"` | A/B 评测——同一 prompt 同时打两个后端,并排展示延迟 / token / 输出(v1.3.0+) |
|
|
157
|
+
| `/goal …` | 会话级长目标——`set / body / progress / pause / resume / complete / cancel / list / show`(v1.3.0+) |
|
|
158
|
+
| `/heartbeat …` | 周期 DECIDE→EXECUTE→EVALUATE 节拍——`bind / unbind / show / pause / resume / status`(v1.3.0+) |
|
|
159
|
+
| `/skill list\|show <name>\|refresh` | 查看从 `~/.agim/skills/` 加载的 agim Skills(v1.3.0+) |
|
|
160
|
+
| `/cc native …` / `/na …` / `/llm …` | 切换到 in-process 原生 LLM agent(v1.3.0+) |
|
|
130
161
|
| `y` / `n` / `批准` / `拒绝` | 同意 / 拒绝(工具调用 或 提醒确认卡片) |
|
|
131
162
|
| `1` / `2` | 服务重启后看到「上次消息中断」提示时,回 `1` 重发 / `2` 取消(10 分钟内有效) |
|
|
132
163
|
|
|
@@ -352,6 +383,7 @@ Environment="IMHUB_SMTP_PASS=xxxxxxxxxxxxxxxx"
|
|
|
352
383
|
单进程,零外部依赖——SQLite + 会话文件就是全部持久化层。
|
|
353
384
|
|
|
354
385
|
深入架构详见 [`docs/architecture/current.md`](docs/architecture/current.md)。
|
|
386
|
+
原生 LLM 栈与「CLI agent / in-process loop 都是 `AgentAdapter` 的 peer」的设计立场,详见 [`docs/architecture-bridge-and-native.md`](docs/architecture-bridge-and-native.md);nanobot vs agim 比较计划的 PR 落地顺序见 [`docs/nanobot-comparison-rollout.md`](docs/nanobot-comparison-rollout.md)。
|
|
355
387
|
|
|
356
388
|
## 环境要求
|
|
357
389
|
|
|
@@ -409,6 +441,8 @@ systemd、Docker、nginx、监控、管理员管理、备份、升级详见 [`do
|
|
|
409
441
|
| **v1.2.0** | **长期记忆**(SQLite + FTS5 + 记忆画像 + 4 个 MCP 工具 + 自动蒸馏 + Web 管理 Tab);**向量召回**(本地 BGE / OpenAI 兼容、RRF 融合);**成本与健康仪表盘**;**Agent 主动推送**(`mcp__imhub__push_message`);带原生内联按钮的崩溃恢复卡片 |
|
|
410
442
|
| v1.2.1 | 向量后端重启后自动加载;Memory + Cost tab 中文 i18n |
|
|
411
443
|
| v1.2.2 | `agim admin invite` 通过 IM 邀请新管理员;向量后端 boot 时主动 warm;consolidate 改异步(jobId + 轮询) |
|
|
444
|
+
| v1.2.27–v1.2.32 | R14/R15 生命周期加固——25s 优雅退出硬截止、端口先释放、reap stray agim 进程、`findAgimProcesses` argv-strict /proc 扫描、每次成功 start 都写 PID 文件、CLI 向导新增 "Web bind+port" 段、ACP 端口 gate(`IMHUB_ENABLE_REMOTE_AGENT`) |
|
|
445
|
+
| **v1.3.0** | **nanobot vs agim 比较计划全量落地** —— `native` in-process AgentAdapter(LLM client + agent loop + 外挂 MCP + 策略式审批门,OpenAI/Anthropic 兼容);`llmBackends` + `llmRoles` + `~/.agim/llm-secrets.json` 配置;`/goal` 会话级长目标(P0 #2);`/heartbeat` 3 阶段调度(P0 #1);`mcp__imhub__ask_user` 结构化选择题(P0 #5);agim Skills 3 层引擎(Stage 3 + P0 #3);记忆事实行内年龄注释(P0 #4);`mcp__imhub__push_message` 的通知评估门(P0 #9);`/router compare` A/B 评测(Stage 5);`tryIntrospectChain` fallback 助手;Web 后台 `/settings/{llm,mcp,native-agent,agim-skills}` + `/tasks/{heartbeat,goals,asks}` 全新页面;CLI 向导 `agim setup {llm,mcp}` + 诊断 `agim diag {llm,mcp}` + `agim setup llm native-enable` 快捷通道;CLI + Web 所有新增面板的中英 i18n;`acp-token` 与 `web-token` 分离;`agim token bootstrap` 输出器;`gen-endpoints --check` drift guard。详见 [`docs/nanobot-comparison-rollout.md`](docs/nanobot-comparison-rollout.md) |
|
|
412
446
|
|
|
413
447
|
### 接下来
|
|
414
448
|
|
|
@@ -472,18 +472,31 @@ async function configureDiscord(lang, cfg) {
|
|
|
472
472
|
};
|
|
473
473
|
}
|
|
474
474
|
const AGENT_SPECS = [
|
|
475
|
+
{ id: 'native', cmd: '__native__' },
|
|
475
476
|
{ id: 'claude-code', cmd: 'claude' },
|
|
476
477
|
{ id: 'opencode', cmd: 'opencode', authHintKey: 'agents.auth_hint.opencode' },
|
|
477
478
|
{ id: 'codex', cmd: 'codex', authHintKey: 'agents.auth_hint.codex' },
|
|
478
479
|
];
|
|
480
|
+
async function nativeLlmConfigured() {
|
|
481
|
+
try {
|
|
482
|
+
const cfg = await loadConfig();
|
|
483
|
+
const raw = cfg;
|
|
484
|
+
return Array.isArray(raw.llmBackends) && raw.llmBackends.length > 0;
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
479
490
|
/** Detect install state once per sectionAgents() call, but always
|
|
480
491
|
* re-detect after the user picks "Re-check". */
|
|
481
492
|
async function detectAgentInstalls() {
|
|
482
493
|
const out = new Map();
|
|
483
494
|
await Promise.all(AGENT_SPECS.map(async (spec) => {
|
|
484
|
-
{
|
|
485
|
-
out.set(spec.id, await
|
|
495
|
+
if (spec.id === 'native') {
|
|
496
|
+
out.set(spec.id, await nativeLlmConfigured());
|
|
497
|
+
return;
|
|
486
498
|
}
|
|
499
|
+
out.set(spec.id, await cliAvailable(spec.cmd));
|
|
487
500
|
}));
|
|
488
501
|
return out;
|
|
489
502
|
}
|