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,577 @@
|
|
|
1
|
+
// skills/loader — agim-owned SKILL.md loader (Stage 3 / P0 #3).
|
|
2
|
+
//
|
|
3
|
+
// What a "skill" is, in agim:
|
|
4
|
+
// - A directory containing exactly one `SKILL.md` file
|
|
5
|
+
// - YAML-ish frontmatter with `name`, `description`, optional `always`
|
|
6
|
+
// and `metadata.agim.requires.{bins,env}`
|
|
7
|
+
// - A markdown body the agent reads on-demand (tier 2)
|
|
8
|
+
// - Optional `scripts/` / `references/` / `assets/` subdirs the body
|
|
9
|
+
// can refer to (tier 3)
|
|
10
|
+
//
|
|
11
|
+
// Three-tier progressive disclosure (modelled on nanobot):
|
|
12
|
+
//
|
|
13
|
+
// tier 1: name + description, injected into every system prompt as a
|
|
14
|
+
// "skills available" block. Cheap (~30-50 tokens per skill).
|
|
15
|
+
// tier 2: full SKILL.md body, fetched on-demand via the
|
|
16
|
+
// mcp__imhub__read_skill MCP tool when the agent decides the
|
|
17
|
+
// description matches the user's intent.
|
|
18
|
+
// tier 3: any file inside scripts/ / references/ / assets/ — read
|
|
19
|
+
// via the model's existing file-read tool when the body
|
|
20
|
+
// references the path.
|
|
21
|
+
//
|
|
22
|
+
// Discovery scope (Stage 3 cut):
|
|
23
|
+
//
|
|
24
|
+
// * `~/.agim/skills/<name>/SKILL.md` — operator-owned (highest priority)
|
|
25
|
+
// * `<agim-dist>/skills/builtin/<name>/SKILL.md` — packaged with agim
|
|
26
|
+
//
|
|
27
|
+
// Name shadowing: workspace skills replace built-ins with the same name.
|
|
28
|
+
// This matches nanobot's behaviour and gives operators a clean override
|
|
29
|
+
// path without touching the install tree.
|
|
30
|
+
//
|
|
31
|
+
// Stage-3 limits:
|
|
32
|
+
// - YAML parsing is intentionally minimal (regex-only). Skills using
|
|
33
|
+
// fancy YAML features (nested objects beyond `metadata`, multi-line
|
|
34
|
+
// strings without quotes) will fall back to a graceful "ignore that
|
|
35
|
+
// field" instead of crashing. Real YAML lands when we hit a skill
|
|
36
|
+
// that needs it.
|
|
37
|
+
// - We do NOT discover skills inside the user's per-agent workspace
|
|
38
|
+
// (`~/.agim-workspaces/<agent>/skills/`); those are managed by the
|
|
39
|
+
// CLI agent itself (Claude Code et al). This loader is exclusively
|
|
40
|
+
// for the agim-injected skills that ALL agents see.
|
|
41
|
+
import { existsSync, readdirSync, readFileSync, statSync, writeFileSync, mkdirSync, rmSync } from 'node:fs';
|
|
42
|
+
import { join, resolve, dirname } from 'node:path';
|
|
43
|
+
import { fileURLToPath } from 'node:url';
|
|
44
|
+
import { logger as rootLogger } from '../logger.js';
|
|
45
|
+
import { AGIM_HOME } from '../agim-paths.js';
|
|
46
|
+
const log = rootLogger.child({ component: 'skills-loader' });
|
|
47
|
+
/** Hard cap on the SKILL.md size we'll read. Skills longer than this
|
|
48
|
+
* almost always indicate a misconfigured doc dropped into the skills
|
|
49
|
+
* dir; we ignore the body to keep injection cheap and audit-able. */
|
|
50
|
+
export const MAX_SKILL_BODY_CHARS = 32_000;
|
|
51
|
+
/** Tier-1 description hard cap. Long descriptions inflate the system
|
|
52
|
+
* prompt budget for every turn; truncate with "…" so the operator
|
|
53
|
+
* immediately notices when the cap was hit. */
|
|
54
|
+
export const MAX_DESCRIPTION_CHARS = 400;
|
|
55
|
+
/** Maximum skills we'll inject into a single system prompt block.
|
|
56
|
+
* Above this, the agent is better served by a `/skill list` overview
|
|
57
|
+
* + on-demand `read_skill` than a wall of text. */
|
|
58
|
+
export const MAX_INJECTED_SKILLS = 32;
|
|
59
|
+
let cache = null;
|
|
60
|
+
/** Default cache TTL — skills don't change often, but we re-scan
|
|
61
|
+
* every 5 minutes so operators don't have to `/skill refresh` after
|
|
62
|
+
* dropping a new SKILL.md on disk. */
|
|
63
|
+
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
64
|
+
/** Resolve the agim-owned workspace skills directory. This is the
|
|
65
|
+
* WRITE target: writeSkillFile / deleteSkill / the web editor all
|
|
66
|
+
* land files here regardless of what extra read-only roots are
|
|
67
|
+
* configured. Override via env for tests / custom deployments. */
|
|
68
|
+
function workspaceSkillsDir() {
|
|
69
|
+
const override = process.env.IMHUB_SKILLS_WORKSPACE_DIR;
|
|
70
|
+
if (override)
|
|
71
|
+
return override;
|
|
72
|
+
return join(AGIM_HOME, 'skills');
|
|
73
|
+
}
|
|
74
|
+
/** Resolve operator's skill discovery mode. See loadSkillsRoots(). */
|
|
75
|
+
function currentSkillsMode() {
|
|
76
|
+
const raw = (process.env.IMHUB_SKILLS_MODE || 'auto').trim().toLowerCase();
|
|
77
|
+
if (raw === 'agim-only' || raw === 'agim_only')
|
|
78
|
+
return 'agim-only';
|
|
79
|
+
if (raw === 'custom')
|
|
80
|
+
return 'custom';
|
|
81
|
+
return 'auto';
|
|
82
|
+
}
|
|
83
|
+
/** Helper: convert ~ to $HOME and resolve to absolute. */
|
|
84
|
+
function expandHome(p) {
|
|
85
|
+
if (!p)
|
|
86
|
+
return p;
|
|
87
|
+
if (p === '~')
|
|
88
|
+
return process.env.HOME || p;
|
|
89
|
+
if (p.startsWith('~/'))
|
|
90
|
+
return join(process.env.HOME || '~', p.slice(2));
|
|
91
|
+
return p;
|
|
92
|
+
}
|
|
93
|
+
/** Parse a `:` or `,` separated list of paths from env, expanding ~. */
|
|
94
|
+
function parseRootsList(raw) {
|
|
95
|
+
if (!raw)
|
|
96
|
+
return [];
|
|
97
|
+
return raw
|
|
98
|
+
.split(/[:,]/)
|
|
99
|
+
.map((s) => s.trim())
|
|
100
|
+
.filter(Boolean)
|
|
101
|
+
.map(expandHome);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Resolve the ordered list of skill discovery roots (highest priority
|
|
105
|
+
* first). The agim-owned `workspaceSkillsDir()` is ALWAYS at index 0
|
|
106
|
+
* — it's the write target and must shadow same-named entries in
|
|
107
|
+
* inherited roots so operator-installed skills can override defaults.
|
|
108
|
+
*
|
|
109
|
+
* Modes:
|
|
110
|
+
* - `auto` (default): workspace + ~/.claude/skills + ~/.config/opencode/skills
|
|
111
|
+
* + ~/.codex/skills. Reflects the typical "I installed all three
|
|
112
|
+
* CLI agents and they share via symlink" layout — agim sees
|
|
113
|
+
* 100+ shared skills out of the box without extra config.
|
|
114
|
+
* Honors IMHUB_SKILLS_EXTRA_ROOTS for adding more.
|
|
115
|
+
* - `agim-only`: only the workspace dir. For deployments that want
|
|
116
|
+
* isolation from per-user CLI agent directories.
|
|
117
|
+
* - `custom`: workspace + IMHUB_SKILLS_ROOTS (explicit operator list).
|
|
118
|
+
*
|
|
119
|
+
* The builtin dir is NOT included here — it's tier-0 (bundled with agim)
|
|
120
|
+
* and scanned separately as a last resort in doScan().
|
|
121
|
+
*/
|
|
122
|
+
export function resolveSkillsRoots() {
|
|
123
|
+
const ws = workspaceSkillsDir();
|
|
124
|
+
const mode = currentSkillsMode();
|
|
125
|
+
const extra = parseRootsList(process.env.IMHUB_SKILLS_EXTRA_ROOTS);
|
|
126
|
+
if (mode === 'agim-only')
|
|
127
|
+
return [ws];
|
|
128
|
+
if (mode === 'custom') {
|
|
129
|
+
const explicit = parseRootsList(process.env.IMHUB_SKILLS_ROOTS);
|
|
130
|
+
return Array.from(new Set([ws, ...explicit, ...extra]));
|
|
131
|
+
}
|
|
132
|
+
// auto: workspace + common CLI agent skill dirs (read-only inherit).
|
|
133
|
+
const home = process.env.HOME || '/root';
|
|
134
|
+
const autoExtras = [
|
|
135
|
+
join(home, '.claude', 'skills'),
|
|
136
|
+
join(home, '.config', 'opencode', 'skills'),
|
|
137
|
+
join(home, '.codex', 'skills'),
|
|
138
|
+
];
|
|
139
|
+
return Array.from(new Set([ws, ...autoExtras, ...extra]));
|
|
140
|
+
}
|
|
141
|
+
/** Public describe-only API for the web admin / diagnostics. Returns
|
|
142
|
+
* a snapshot of the active mode + the roots that will be scanned. */
|
|
143
|
+
export function describeSkillsConfig() {
|
|
144
|
+
return {
|
|
145
|
+
mode: currentSkillsMode(),
|
|
146
|
+
writeRoot: workspaceSkillsDir(),
|
|
147
|
+
readRoots: resolveSkillsRoots(),
|
|
148
|
+
builtinRoot: builtinSkillsDir(),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/** Resolve the bundled-builtin skills directory. We look next to the
|
|
152
|
+
* current module file (after build → dist/core/skills/) then walk up
|
|
153
|
+
* to find `skills/builtin`. Falls back to the src tree during dev. */
|
|
154
|
+
function builtinSkillsDir() {
|
|
155
|
+
const override = process.env.IMHUB_SKILLS_BUILTIN_DIR;
|
|
156
|
+
if (override)
|
|
157
|
+
return override;
|
|
158
|
+
// import.meta.url works in both dev (tsx / bun) and built dist (esm).
|
|
159
|
+
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
160
|
+
// Most likely locations relative to this module:
|
|
161
|
+
// dev: /workspace/src/core/skills/loader.ts → /workspace/src/core/skills/builtin
|
|
162
|
+
// built: /workspace/dist/core/skills/loader.js → /workspace/dist/core/skills/builtin
|
|
163
|
+
const localCandidate = resolve(thisDir, 'builtin');
|
|
164
|
+
if (existsSync(localCandidate))
|
|
165
|
+
return localCandidate;
|
|
166
|
+
// Fall back to repo root (rare; happens when tests resolve from /tmp).
|
|
167
|
+
const repoCandidate = resolve(thisDir, '..', '..', '..', 'src', 'core', 'skills', 'builtin');
|
|
168
|
+
if (existsSync(repoCandidate))
|
|
169
|
+
return repoCandidate;
|
|
170
|
+
return localCandidate; // path may not exist; that's fine — scan handles it
|
|
171
|
+
}
|
|
172
|
+
// ─── Public API ──────────────────────────────────────────────────────
|
|
173
|
+
/** Force a fresh disk scan on next call. Returned by /skill refresh. */
|
|
174
|
+
export function invalidateSkillsCache() {
|
|
175
|
+
cache = null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Write (create-or-overwrite) a workspace SKILL.md (P1 web editor).
|
|
179
|
+
*
|
|
180
|
+
* - Lands at <workspaceSkillsDir>/<name>/SKILL.md (operator path,
|
|
181
|
+
* not builtin) so subsequent scans pick it up and it shadows any
|
|
182
|
+
* same-named builtin.
|
|
183
|
+
* - name is sanitized to safe filesystem chars (no '..', no
|
|
184
|
+
* leading dots, no slashes). Returns null on invalid name.
|
|
185
|
+
* - Body MUST already include the YAML frontmatter; we validate
|
|
186
|
+
* it parses + has a description before writing so the editor
|
|
187
|
+
* can't ship a broken SKILL.md. Returns the parsed SkillMeta
|
|
188
|
+
* on success.
|
|
189
|
+
* - Invalidates the cache so listSkills() picks up the new file
|
|
190
|
+
* on next call.
|
|
191
|
+
*/
|
|
192
|
+
export function writeSkillFile(name, body) {
|
|
193
|
+
const safe = sanitizeSkillName(name);
|
|
194
|
+
if (!safe)
|
|
195
|
+
return null;
|
|
196
|
+
const probe = parseSkill({ name: safe, dir: '<probe>', source: 'workspace', body });
|
|
197
|
+
if (!probe)
|
|
198
|
+
return null;
|
|
199
|
+
if (body.length > MAX_SKILL_BODY_CHARS) {
|
|
200
|
+
log.warn({ event: 'skills.write.too_long', name: safe, len: body.length });
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
const dir = join(workspaceSkillsDir(), safe);
|
|
204
|
+
try {
|
|
205
|
+
mkdirSync(dir, { recursive: true });
|
|
206
|
+
writeFileSync(join(dir, 'SKILL.md'), body, 'utf-8');
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
log.warn({ event: 'skills.write.failed', name: safe, err: String(err) });
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
invalidateSkillsCache();
|
|
213
|
+
return getSkillByName(safe);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Delete a workspace skill. Builtin (bundled) skills can't be
|
|
217
|
+
* deleted — operators have to shadow them with a workspace entry
|
|
218
|
+
* (which writeSkillFile does for them). Returns true iff a file
|
|
219
|
+
* was actually unlinked.
|
|
220
|
+
*/
|
|
221
|
+
export function deleteSkill(name) {
|
|
222
|
+
const safe = sanitizeSkillName(name);
|
|
223
|
+
if (!safe)
|
|
224
|
+
return false;
|
|
225
|
+
const path = join(workspaceSkillsDir(), safe, 'SKILL.md');
|
|
226
|
+
if (!existsSync(path))
|
|
227
|
+
return false;
|
|
228
|
+
try {
|
|
229
|
+
rmSync(join(workspaceSkillsDir(), safe), { recursive: true, force: true });
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
log.warn({ event: 'skills.delete.failed', name: safe, err: String(err) });
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
invalidateSkillsCache();
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
/** Sanitize a skill name for filesystem use. */
|
|
239
|
+
function sanitizeSkillName(raw) {
|
|
240
|
+
const trimmed = raw.trim();
|
|
241
|
+
if (!trimmed || trimmed.length > 64)
|
|
242
|
+
return '';
|
|
243
|
+
if (trimmed === '.' || trimmed === '..')
|
|
244
|
+
return '';
|
|
245
|
+
if (trimmed.startsWith('.'))
|
|
246
|
+
return '';
|
|
247
|
+
if (!/^[A-Za-z0-9._-]+$/.test(trimmed))
|
|
248
|
+
return '';
|
|
249
|
+
return trimmed;
|
|
250
|
+
}
|
|
251
|
+
/** Read-only access to the loaded skill list. Triggers a scan on first
|
|
252
|
+
* call or when the cache has expired. Never throws — disk errors yield
|
|
253
|
+
* the partial list discovered up to that point. */
|
|
254
|
+
export function listSkills() {
|
|
255
|
+
return ensureCache().skills;
|
|
256
|
+
}
|
|
257
|
+
/** Look up one skill by name (case-insensitive). Returns null when
|
|
258
|
+
* unknown; caller decides whether to surface "no such skill" to the
|
|
259
|
+
* agent or the operator. */
|
|
260
|
+
export function getSkillByName(name) {
|
|
261
|
+
return ensureCache().byName.get(name.toLowerCase()) ?? null;
|
|
262
|
+
}
|
|
263
|
+
/** Read the full SKILL.md body for a known skill. Returns null on
|
|
264
|
+
* unknown name OR read failure. Honors the MAX_SKILL_BODY_CHARS cap;
|
|
265
|
+
* oversize files come back truncated with a `[truncated …]` footer. */
|
|
266
|
+
export function readSkillBody(name) {
|
|
267
|
+
const skill = getSkillByName(name);
|
|
268
|
+
if (!skill)
|
|
269
|
+
return null;
|
|
270
|
+
const path = join(skill.dir, 'SKILL.md');
|
|
271
|
+
try {
|
|
272
|
+
const raw = readFileSync(path, 'utf-8');
|
|
273
|
+
if (raw.length <= MAX_SKILL_BODY_CHARS)
|
|
274
|
+
return raw;
|
|
275
|
+
return `${raw.slice(0, MAX_SKILL_BODY_CHARS)}\n\n[truncated to ${MAX_SKILL_BODY_CHARS} chars by agim skills loader]`;
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
log.warn({ event: 'skills.body_read_failed', name, err: String(err) });
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Build the tier-1 system-prompt block. Injected once per turn by the
|
|
284
|
+
* router. Returns '' when no skills are configured (router drops empty
|
|
285
|
+
* blocks). Bounded to MAX_INJECTED_SKILLS rows; above the cap we keep
|
|
286
|
+
* the first N alphabetically and append a one-line "+ N more (call
|
|
287
|
+
* /skill list to see)" note.
|
|
288
|
+
*
|
|
289
|
+
* Format (kept close to nanobot's so models trained on its docs feel
|
|
290
|
+
* at home):
|
|
291
|
+
*
|
|
292
|
+
* [agim skills available — read full body with mcp__imhub__read_skill(name)]
|
|
293
|
+
* - skill-a: one-line description
|
|
294
|
+
* - skill-b: one-line description (unavailable: missing bin `foo`)
|
|
295
|
+
* - skill-c: one-line description
|
|
296
|
+
* …
|
|
297
|
+
*/
|
|
298
|
+
export function buildSkillsSummary() {
|
|
299
|
+
const all = listSkills();
|
|
300
|
+
if (all.length === 0)
|
|
301
|
+
return '';
|
|
302
|
+
const sorted = all.slice().sort((a, b) => a.name.localeCompare(b.name));
|
|
303
|
+
const lines = ['[agim skills available — read full body with mcp__imhub__read_skill(name)]'];
|
|
304
|
+
const visible = sorted.slice(0, MAX_INJECTED_SKILLS);
|
|
305
|
+
for (const s of visible) {
|
|
306
|
+
const reason = s.available ? '' : ` (unavailable: ${s.unavailableReason ?? 'requires not met'})`;
|
|
307
|
+
const flag = s.always ? ' [always]' : '';
|
|
308
|
+
lines.push(`- ${s.name}: ${s.description}${reason}${flag}`);
|
|
309
|
+
}
|
|
310
|
+
if (sorted.length > visible.length) {
|
|
311
|
+
lines.push(`… and ${sorted.length - visible.length} more (use /skill list to see them all)`);
|
|
312
|
+
}
|
|
313
|
+
// Inline `always: true` skills' full bodies. Cheap when few; we bound
|
|
314
|
+
// by injected count above so the agent's prompt budget can't explode.
|
|
315
|
+
const alwaysOn = visible.filter((s) => s.always && s.available);
|
|
316
|
+
for (const s of alwaysOn) {
|
|
317
|
+
const body = readSkillBody(s.name);
|
|
318
|
+
if (!body)
|
|
319
|
+
continue;
|
|
320
|
+
lines.push('');
|
|
321
|
+
lines.push(`### Always-on skill: ${s.name}`);
|
|
322
|
+
lines.push(body);
|
|
323
|
+
}
|
|
324
|
+
return `${lines.join('\n')}\n`;
|
|
325
|
+
}
|
|
326
|
+
// ─── Scanning ────────────────────────────────────────────────────────
|
|
327
|
+
function ensureCache() {
|
|
328
|
+
if (cache && Date.now() - cache.scannedAt < CACHE_TTL_MS)
|
|
329
|
+
return cache;
|
|
330
|
+
cache = doScan();
|
|
331
|
+
return cache;
|
|
332
|
+
}
|
|
333
|
+
function doScan() {
|
|
334
|
+
const discovered = [];
|
|
335
|
+
// 1. Walk the configured roots in priority order. The first root is
|
|
336
|
+
// always the agim-owned workspace dir, so any operator-installed
|
|
337
|
+
// skill shadows same-named entries from inherited CLI agent dirs.
|
|
338
|
+
const roots = resolveSkillsRoots();
|
|
339
|
+
const seen = new Set();
|
|
340
|
+
for (const root of roots) {
|
|
341
|
+
const found = [];
|
|
342
|
+
scanDir(root, 'workspace', found);
|
|
343
|
+
for (const f of found) {
|
|
344
|
+
if (seen.has(f.name))
|
|
345
|
+
continue;
|
|
346
|
+
seen.add(f.name);
|
|
347
|
+
discovered.push(f);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// 2. built-in tier 0; skip names already taken by any root above.
|
|
351
|
+
const builtinDir = builtinSkillsDir();
|
|
352
|
+
const builtinFound = [];
|
|
353
|
+
scanDir(builtinDir, 'builtin', builtinFound);
|
|
354
|
+
for (const b of builtinFound) {
|
|
355
|
+
if (seen.has(b.name))
|
|
356
|
+
continue;
|
|
357
|
+
seen.add(b.name);
|
|
358
|
+
discovered.push(b);
|
|
359
|
+
}
|
|
360
|
+
const skills = [];
|
|
361
|
+
for (const d of discovered) {
|
|
362
|
+
const meta = parseSkill(d);
|
|
363
|
+
if (meta)
|
|
364
|
+
skills.push(meta);
|
|
365
|
+
}
|
|
366
|
+
const byName = new Map();
|
|
367
|
+
for (const s of skills)
|
|
368
|
+
byName.set(s.name.toLowerCase(), s);
|
|
369
|
+
log.info({
|
|
370
|
+
event: 'skills.scanned',
|
|
371
|
+
mode: currentSkillsMode(),
|
|
372
|
+
roots,
|
|
373
|
+
builtinDir,
|
|
374
|
+
total: skills.length,
|
|
375
|
+
available: skills.filter((s) => s.available).length,
|
|
376
|
+
});
|
|
377
|
+
return { scannedAt: Date.now(), skills, byName };
|
|
378
|
+
}
|
|
379
|
+
function scanDir(dir, source, out) {
|
|
380
|
+
if (!dir || !existsSync(dir))
|
|
381
|
+
return;
|
|
382
|
+
let entries = [];
|
|
383
|
+
try {
|
|
384
|
+
entries = readdirSync(dir);
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
log.debug({ event: 'skills.scan.readdir_failed', dir, err: String(err) });
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
for (const name of entries) {
|
|
391
|
+
if (name.startsWith('.'))
|
|
392
|
+
continue;
|
|
393
|
+
const skillDir = join(dir, name);
|
|
394
|
+
let st;
|
|
395
|
+
try {
|
|
396
|
+
st = statSync(skillDir);
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
if (!st.isDirectory())
|
|
402
|
+
continue;
|
|
403
|
+
const md = join(skillDir, 'SKILL.md');
|
|
404
|
+
if (!existsSync(md))
|
|
405
|
+
continue;
|
|
406
|
+
let body = '';
|
|
407
|
+
try {
|
|
408
|
+
const raw = readFileSync(md, 'utf-8');
|
|
409
|
+
body = raw.length > MAX_SKILL_BODY_CHARS
|
|
410
|
+
? raw.slice(0, MAX_SKILL_BODY_CHARS)
|
|
411
|
+
: raw;
|
|
412
|
+
}
|
|
413
|
+
catch (err) {
|
|
414
|
+
log.warn({ event: 'skills.scan.read_failed', dir: skillDir, err: String(err) });
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
out.push({ name, dir: skillDir, source, body });
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Parse a discovered SKILL.md into a SkillMeta. Returns null when the
|
|
422
|
+
* frontmatter is missing required fields — we don't load corrupt
|
|
423
|
+
* skills, but we DO log a warning so the operator notices.
|
|
424
|
+
*/
|
|
425
|
+
function parseSkill(d) {
|
|
426
|
+
const front = extractFrontmatter(d.body);
|
|
427
|
+
if (!front) {
|
|
428
|
+
log.warn({ event: 'skills.parse.no_frontmatter', name: d.name, dir: d.dir });
|
|
429
|
+
return null;
|
|
430
|
+
}
|
|
431
|
+
const name = (front.name || d.name).trim();
|
|
432
|
+
if (!name)
|
|
433
|
+
return null;
|
|
434
|
+
const description = (front.description || '').trim().slice(0, MAX_DESCRIPTION_CHARS);
|
|
435
|
+
if (!description) {
|
|
436
|
+
log.warn({ event: 'skills.parse.no_description', name, dir: d.dir });
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
const always = parseBool(front.always);
|
|
440
|
+
const requiresBins = parseRequiresList(front, 'bins');
|
|
441
|
+
const requiresEnv = parseRequiresList(front, 'env');
|
|
442
|
+
let available = true;
|
|
443
|
+
let unavailableReason;
|
|
444
|
+
const missingBins = requiresBins.filter((b) => !isBinOnPath(b));
|
|
445
|
+
if (missingBins.length > 0) {
|
|
446
|
+
available = false;
|
|
447
|
+
unavailableReason = `missing bin${missingBins.length === 1 ? '' : 's'} ${missingBins.map((b) => `\`${b}\``).join(', ')}`;
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
const missingEnv = requiresEnv.filter((e) => !process.env[e]);
|
|
451
|
+
if (missingEnv.length > 0) {
|
|
452
|
+
available = false;
|
|
453
|
+
unavailableReason = `missing env ${missingEnv.map((e) => `\`${e}\``).join(', ')}`;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return {
|
|
457
|
+
name,
|
|
458
|
+
description,
|
|
459
|
+
source: d.source,
|
|
460
|
+
dir: d.dir,
|
|
461
|
+
always,
|
|
462
|
+
requiresBins,
|
|
463
|
+
requiresEnv,
|
|
464
|
+
available,
|
|
465
|
+
unavailableReason,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Extract the YAML-ish frontmatter (between `---` delimiters at the
|
|
470
|
+
* top of the file). Returns null when missing.
|
|
471
|
+
*
|
|
472
|
+
* Limited parser — handles:
|
|
473
|
+
* key: value
|
|
474
|
+
* key: "quoted value"
|
|
475
|
+
* metadata: '{"agim":{"requires":{"bins":["x"],"env":["Y"]}}}'
|
|
476
|
+
*
|
|
477
|
+
* Doesn't handle multi-line strings, nested block mappings (other than
|
|
478
|
+
* the metadata JSON shortcut), or list literals beyond simple
|
|
479
|
+
* comma-separated `[a, b, c]` inside the metadata JSON. Skills that
|
|
480
|
+
* need richer YAML can wait for a real parser.
|
|
481
|
+
*/
|
|
482
|
+
function extractFrontmatter(body) {
|
|
483
|
+
if (!body.startsWith('---'))
|
|
484
|
+
return null;
|
|
485
|
+
// Find the closing delimiter; tolerate \r\n.
|
|
486
|
+
const closeIdx = body.indexOf('\n---', 3);
|
|
487
|
+
if (closeIdx === -1)
|
|
488
|
+
return null;
|
|
489
|
+
const raw = body.slice(3, closeIdx).trim();
|
|
490
|
+
const front = {};
|
|
491
|
+
for (const line of raw.split('\n')) {
|
|
492
|
+
const m = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*(.*)$/);
|
|
493
|
+
if (!m)
|
|
494
|
+
continue;
|
|
495
|
+
const key = m[1];
|
|
496
|
+
const value = stripQuotes(m[2].trim());
|
|
497
|
+
if (key === 'name')
|
|
498
|
+
front.name = value;
|
|
499
|
+
else if (key === 'description')
|
|
500
|
+
front.description = value;
|
|
501
|
+
else if (key === 'always')
|
|
502
|
+
front.always = value;
|
|
503
|
+
else if (key === 'metadata')
|
|
504
|
+
front.metadataJson = value;
|
|
505
|
+
}
|
|
506
|
+
return front;
|
|
507
|
+
}
|
|
508
|
+
function stripQuotes(s) {
|
|
509
|
+
if (s.length >= 2 && ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'")))) {
|
|
510
|
+
return s.slice(1, -1);
|
|
511
|
+
}
|
|
512
|
+
return s;
|
|
513
|
+
}
|
|
514
|
+
function parseBool(raw) {
|
|
515
|
+
if (!raw)
|
|
516
|
+
return false;
|
|
517
|
+
const v = raw.toLowerCase();
|
|
518
|
+
return v === 'true' || v === 'yes' || v === '1';
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Pull `bins` or `env` out of the metadata JSON shortcut. Format:
|
|
522
|
+
*
|
|
523
|
+
* metadata: '{"agim":{"requires":{"bins":["x"],"env":["Y"]}}}'
|
|
524
|
+
*
|
|
525
|
+
* Also accepts the legacy `openclaw` key (nanobot's name) for
|
|
526
|
+
* compatibility with skills written for nanobot.
|
|
527
|
+
*/
|
|
528
|
+
function parseRequiresList(front, which) {
|
|
529
|
+
if (!front.metadataJson)
|
|
530
|
+
return [];
|
|
531
|
+
let obj;
|
|
532
|
+
try {
|
|
533
|
+
obj = JSON.parse(front.metadataJson);
|
|
534
|
+
}
|
|
535
|
+
catch {
|
|
536
|
+
return [];
|
|
537
|
+
}
|
|
538
|
+
const nestedAgim = (obj.agim && typeof obj.agim === 'object') ? obj.agim : null;
|
|
539
|
+
const nestedOpenclaw = (obj.openclaw && typeof obj.openclaw === 'object') ? obj.openclaw : null;
|
|
540
|
+
const nested = nestedAgim ?? nestedOpenclaw;
|
|
541
|
+
if (!nested)
|
|
542
|
+
return [];
|
|
543
|
+
const requires = (nested.requires && typeof nested.requires === 'object') ? nested.requires : null;
|
|
544
|
+
if (!requires)
|
|
545
|
+
return [];
|
|
546
|
+
const arr = requires[which];
|
|
547
|
+
if (!Array.isArray(arr))
|
|
548
|
+
return [];
|
|
549
|
+
return arr.filter((v) => typeof v === 'string' && v.length > 0);
|
|
550
|
+
}
|
|
551
|
+
function isBinOnPath(bin) {
|
|
552
|
+
// Cheap synchronous PATH probe. Doesn't follow symlinks; that's fine
|
|
553
|
+
// for a "is this binary likely to work?" hint.
|
|
554
|
+
if (!bin || bin.includes('/')) {
|
|
555
|
+
// If the skill declared an absolute path, just check existence.
|
|
556
|
+
return existsSync(bin);
|
|
557
|
+
}
|
|
558
|
+
const pathEnv = process.env.PATH || '';
|
|
559
|
+
const sep = process.platform === 'win32' ? ';' : ':';
|
|
560
|
+
const exts = process.platform === 'win32'
|
|
561
|
+
? (process.env.PATHEXT || '.COM;.EXE;.BAT;.CMD').split(';').map((e) => e.toLowerCase())
|
|
562
|
+
: [''];
|
|
563
|
+
for (const dir of pathEnv.split(sep)) {
|
|
564
|
+
if (!dir)
|
|
565
|
+
continue;
|
|
566
|
+
for (const ext of exts) {
|
|
567
|
+
const candidate = join(dir, ext ? `${bin}${ext}` : bin);
|
|
568
|
+
try {
|
|
569
|
+
if (existsSync(candidate))
|
|
570
|
+
return true;
|
|
571
|
+
}
|
|
572
|
+
catch { /* ignore */ }
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
return false;
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/skills/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface SkillsPayload {
|
|
2
|
+
op?: unknown;
|
|
3
|
+
name?: unknown;
|
|
4
|
+
}
|
|
5
|
+
export type SkillsResult = {
|
|
6
|
+
ok: true;
|
|
7
|
+
result: {
|
|
8
|
+
op: 'read';
|
|
9
|
+
name: string;
|
|
10
|
+
body: string;
|
|
11
|
+
available: boolean;
|
|
12
|
+
unavailableReason?: string;
|
|
13
|
+
} | {
|
|
14
|
+
op: 'list';
|
|
15
|
+
skills: Array<{
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
source: string;
|
|
19
|
+
available: boolean;
|
|
20
|
+
always: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
} | {
|
|
23
|
+
op: 'refresh';
|
|
24
|
+
total: number;
|
|
25
|
+
};
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
error: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Single entry point — the bus picks `op` and we dispatch. Three ops
|
|
32
|
+
* supported in this initial cut:
|
|
33
|
+
*
|
|
34
|
+
* - 'read' (default): return one skill's full body. Agent uses this
|
|
35
|
+
* when its tier-1 summary description matches user intent.
|
|
36
|
+
* - 'list': return the full skill roster. Useful when the
|
|
37
|
+
* agent wants to introspect what's available without scrolling the
|
|
38
|
+
* entire system prompt.
|
|
39
|
+
* - 'refresh': force a disk re-scan. Operator-only in spirit;
|
|
40
|
+
* we don't enforce, but the operation is cheap enough that abuse
|
|
41
|
+
* just wastes the calling agent's iteration budget.
|
|
42
|
+
*/
|
|
43
|
+
export declare function handleSkillsOp(payload: SkillsPayload): Promise<SkillsResult>;
|
|
44
|
+
//# sourceMappingURL=skills-rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-rpc.d.ts","sourceRoot":"","sources":["../../src/core/skills-rpc.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,MAAM,YAAY,GACpB;IACE,EAAE,EAAE,IAAI,CAAA;IACR,MAAM,EACF;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1F;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,OAAO,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,GACzH;QAAE,EAAE,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CACrC,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhC;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA2ClF"}
|