agim-cli 1.2.44 → 1.2.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +295 -0
- package/README.md +39 -5
- package/README.zh-CN.md +40 -6
- package/dist/cli-ui/config-wizard.js +15 -2
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/diag.d.ts +29 -0
- package/dist/cli-ui/diag.d.ts.map +1 -0
- package/dist/cli-ui/diag.js +135 -0
- package/dist/cli-ui/diag.js.map +1 -0
- package/dist/cli-ui/i18n.d.ts +36 -0
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +97 -0
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/setup-llm.d.ts +30 -0
- package/dist/cli-ui/setup-llm.d.ts.map +1 -0
- package/dist/cli-ui/setup-llm.js +460 -0
- package/dist/cli-ui/setup-llm.js.map +1 -0
- package/dist/cli-ui/setup-mcp.d.ts +19 -0
- package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
- package/dist/cli-ui/setup-mcp.js +308 -0
- package/dist/cli-ui/setup-mcp.js.map +1 -0
- package/dist/cli-ui/token-menu.js +2 -2
- package/dist/cli-ui/token-menu.js.map +1 -1
- package/dist/cli.js +100 -22
- package/dist/cli.js.map +1 -1
- package/dist/core/access-token.d.ts +16 -5
- package/dist/core/access-token.d.ts.map +1 -1
- package/dist/core/access-token.js +82 -13
- package/dist/core/access-token.js.map +1 -1
- package/dist/core/agent-cwd.d.ts.map +1 -1
- package/dist/core/agent-cwd.js +46 -0
- package/dist/core/agent-cwd.js.map +1 -1
- package/dist/core/approval-bus.d.ts +22 -0
- package/dist/core/approval-bus.d.ts.map +1 -1
- package/dist/core/approval-bus.js +93 -0
- package/dist/core/approval-bus.js.map +1 -1
- package/dist/core/ask-user-router.d.ts +24 -0
- package/dist/core/ask-user-router.d.ts.map +1 -0
- package/dist/core/ask-user-router.js +84 -0
- package/dist/core/ask-user-router.js.map +1 -0
- package/dist/core/ask-user-rpc.d.ts +80 -0
- package/dist/core/ask-user-rpc.d.ts.map +1 -0
- package/dist/core/ask-user-rpc.js +388 -0
- package/dist/core/ask-user-rpc.js.map +1 -0
- package/dist/core/audit-log.d.ts +1 -1
- package/dist/core/audit-log.d.ts.map +1 -1
- package/dist/core/audit-log.js.map +1 -1
- package/dist/core/commands/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +21 -5
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/commands/goal.d.ts +3 -0
- package/dist/core/commands/goal.d.ts.map +1 -0
- package/dist/core/commands/goal.js +240 -0
- package/dist/core/commands/goal.js.map +1 -0
- package/dist/core/commands/heartbeat.d.ts +3 -0
- package/dist/core/commands/heartbeat.d.ts.map +1 -0
- package/dist/core/commands/heartbeat.js +219 -0
- package/dist/core/commands/heartbeat.js.map +1 -0
- package/dist/core/commands/router-compare.d.ts +3 -0
- package/dist/core/commands/router-compare.d.ts.map +1 -0
- package/dist/core/commands/router-compare.js +81 -0
- package/dist/core/commands/router-compare.js.map +1 -0
- package/dist/core/commands/router.d.ts.map +1 -1
- package/dist/core/commands/router.js +9 -1
- package/dist/core/commands/router.js.map +1 -1
- package/dist/core/commands/skill.d.ts +3 -0
- package/dist/core/commands/skill.d.ts.map +1 -0
- package/dist/core/commands/skill.js +91 -0
- package/dist/core/commands/skill.js.map +1 -0
- package/dist/core/config-schema.d.ts +28 -0
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +124 -0
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/goals.d.ts +81 -0
- package/dist/core/goals.d.ts.map +1 -0
- package/dist/core/goals.js +361 -0
- package/dist/core/goals.js.map +1 -0
- package/dist/core/heartbeat-store.d.ts +90 -0
- package/dist/core/heartbeat-store.d.ts.map +1 -0
- package/dist/core/heartbeat-store.js +302 -0
- package/dist/core/heartbeat-store.js.map +1 -0
- package/dist/core/heartbeat.d.ts +35 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +332 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/intent-llm.d.ts +9 -0
- package/dist/core/intent-llm.d.ts.map +1 -1
- package/dist/core/intent-llm.js +77 -32
- package/dist/core/intent-llm.js.map +1 -1
- package/dist/core/llm/agent-loop.d.ts +112 -0
- package/dist/core/llm/agent-loop.d.ts.map +1 -0
- package/dist/core/llm/agent-loop.js +313 -0
- package/dist/core/llm/agent-loop.js.map +1 -0
- package/dist/core/llm/anthropic-provider.d.ts +53 -0
- package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/core/llm/anthropic-provider.js +339 -0
- package/dist/core/llm/anthropic-provider.js.map +1 -0
- package/dist/core/llm/auto-compact.d.ts +35 -0
- package/dist/core/llm/auto-compact.d.ts.map +1 -0
- package/dist/core/llm/auto-compact.js +149 -0
- package/dist/core/llm/auto-compact.js.map +1 -0
- package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
- package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/builtin-dispatcher.js +196 -0
- package/dist/core/llm/builtin-dispatcher.js.map +1 -0
- package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
- package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/imhub-dispatcher.js +308 -0
- package/dist/core/llm/imhub-dispatcher.js.map +1 -0
- package/dist/core/llm/index.d.ts +11 -0
- package/dist/core/llm/index.d.ts.map +1 -0
- package/dist/core/llm/index.js +16 -0
- package/dist/core/llm/index.js.map +1 -0
- package/dist/core/llm/introspection.d.ts +73 -0
- package/dist/core/llm/introspection.d.ts.map +1 -0
- package/dist/core/llm/introspection.js +90 -0
- package/dist/core/llm/introspection.js.map +1 -0
- package/dist/core/llm/mcp-client.d.ts +80 -0
- package/dist/core/llm/mcp-client.d.ts.map +1 -0
- package/dist/core/llm/mcp-client.js +270 -0
- package/dist/core/llm/mcp-client.js.map +1 -0
- package/dist/core/llm/mcp-registry.d.ts +57 -0
- package/dist/core/llm/mcp-registry.d.ts.map +1 -0
- package/dist/core/llm/mcp-registry.js +155 -0
- package/dist/core/llm/mcp-registry.js.map +1 -0
- package/dist/core/llm/openai-compat-provider.d.ts +65 -0
- package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
- package/dist/core/llm/openai-compat-provider.js +451 -0
- package/dist/core/llm/openai-compat-provider.js.map +1 -0
- package/dist/core/llm/policy-approval-gate.d.ts +30 -0
- package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
- package/dist/core/llm/policy-approval-gate.js +86 -0
- package/dist/core/llm/policy-approval-gate.js.map +1 -0
- package/dist/core/llm/provider-base.d.ts +302 -0
- package/dist/core/llm/provider-base.d.ts.map +1 -0
- package/dist/core/llm/provider-base.js +222 -0
- package/dist/core/llm/provider-base.js.map +1 -0
- package/dist/core/llm/registry.d.ts +44 -0
- package/dist/core/llm/registry.d.ts.map +1 -0
- package/dist/core/llm/registry.js +160 -0
- package/dist/core/llm/registry.js.map +1 -0
- package/dist/core/llm/secrets.d.ts +46 -0
- package/dist/core/llm/secrets.d.ts.map +1 -0
- package/dist/core/llm/secrets.js +157 -0
- package/dist/core/llm/secrets.js.map +1 -0
- package/dist/core/llm/tool-dispatcher.d.ts +37 -0
- package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/tool-dispatcher.js +85 -0
- package/dist/core/llm/tool-dispatcher.js.map +1 -0
- package/dist/core/memory-consolidate.d.ts.map +1 -1
- package/dist/core/memory-consolidate.js +38 -23
- package/dist/core/memory-consolidate.js.map +1 -1
- package/dist/core/memory-distill.d.ts.map +1 -1
- package/dist/core/memory-distill.js +51 -25
- package/dist/core/memory-distill.js.map +1 -1
- package/dist/core/memory-rpc.d.ts.map +1 -1
- package/dist/core/memory-rpc.js +6 -0
- package/dist/core/memory-rpc.js.map +1 -1
- package/dist/core/message-sink.d.ts.map +1 -1
- package/dist/core/message-sink.js +76 -0
- package/dist/core/message-sink.js.map +1 -1
- package/dist/core/notification-evaluator.d.ts +49 -0
- package/dist/core/notification-evaluator.d.ts.map +1 -0
- package/dist/core/notification-evaluator.js +232 -0
- package/dist/core/notification-evaluator.js.map +1 -0
- package/dist/core/onboarding.d.ts.map +1 -1
- package/dist/core/onboarding.js +10 -0
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/persona.d.ts +10 -0
- package/dist/core/persona.d.ts.map +1 -1
- package/dist/core/persona.js +28 -14
- package/dist/core/persona.js.map +1 -1
- package/dist/core/push-rpc.d.ts +8 -0
- package/dist/core/push-rpc.d.ts.map +1 -1
- package/dist/core/push-rpc.js +41 -1
- package/dist/core/push-rpc.js.map +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +6 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/render-router.d.ts.map +1 -1
- package/dist/core/render-router.js +23 -6
- package/dist/core/render-router.js.map +1 -1
- package/dist/core/router-compare.d.ts +76 -0
- package/dist/core/router-compare.d.ts.map +1 -0
- package/dist/core/router-compare.js +253 -0
- package/dist/core/router-compare.js.map +1 -0
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +25 -1
- package/dist/core/router.js.map +1 -1
- package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
- package/dist/core/skills/loader.d.ts +120 -0
- package/dist/core/skills/loader.d.ts.map +1 -0
- package/dist/core/skills/loader.js +577 -0
- package/dist/core/skills/loader.js.map +1 -0
- package/dist/core/skills-rpc.d.ts +44 -0
- package/dist/core/skills-rpc.d.ts.map +1 -0
- package/dist/core/skills-rpc.js +71 -0
- package/dist/core/skills-rpc.js.map +1 -0
- package/dist/core/types.d.ts +35 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/util/format-age.d.ts +20 -0
- package/dist/core/util/format-age.d.ts.map +1 -0
- package/dist/core/util/format-age.js +86 -0
- package/dist/core/util/format-age.js.map +1 -0
- package/dist/core/viewer-config.d.ts +15 -7
- package/dist/core/viewer-config.d.ts.map +1 -1
- package/dist/core/viewer-config.js +18 -12
- package/dist/core/viewer-config.js.map +1 -1
- package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
- package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/acp/acp-adapter.js +12 -0
- package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
- package/dist/plugins/agents/antigravity/index.d.ts +1 -0
- package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
- package/dist/plugins/agents/antigravity/index.js +1 -0
- package/dist/plugins/agents/antigravity/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/index.d.ts +1 -0
- package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/index.js +1 -0
- package/dist/plugins/agents/claude-code/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
- package/dist/plugins/agents/codex/index.d.ts +1 -0
- package/dist/plugins/agents/codex/index.d.ts.map +1 -1
- package/dist/plugins/agents/codex/index.js +1 -0
- package/dist/plugins/agents/codex/index.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts +34 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -0
- package/dist/plugins/agents/native/index.js +598 -0
- package/dist/plugins/agents/native/index.js.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
- package/dist/web/agim-skills-api.d.ts +4 -0
- package/dist/web/agim-skills-api.d.ts.map +1 -0
- package/dist/web/agim-skills-api.js +150 -0
- package/dist/web/agim-skills-api.js.map +1 -0
- package/dist/web/background-tasks-api.d.ts +7 -0
- package/dist/web/background-tasks-api.d.ts.map +1 -0
- package/dist/web/background-tasks-api.js +225 -0
- package/dist/web/background-tasks-api.js.map +1 -0
- package/dist/web/llm-api.d.ts +8 -0
- package/dist/web/llm-api.d.ts.map +1 -0
- package/dist/web/llm-api.js +300 -0
- package/dist/web/llm-api.js.map +1 -0
- package/dist/web/mcp-api.d.ts +8 -0
- package/dist/web/mcp-api.d.ts.map +1 -0
- package/dist/web/mcp-api.js +205 -0
- package/dist/web/mcp-api.js.map +1 -0
- package/dist/web/public/assets/{a2a-Bg_mT0z1.js → a2a-Mke0F7ZM.js} +3 -3
- package/dist/web/public/assets/{a2a-Bg_mT0z1.js.map → a2a-Mke0F7ZM.js.map} +1 -1
- package/dist/web/public/assets/{activity-U9AaNlDt.js → activity-0zGnf1_m.js} +2 -2
- package/dist/web/public/assets/{activity-U9AaNlDt.js.map → activity-0zGnf1_m.js.map} +1 -1
- package/dist/web/public/assets/{admins-BTC_YEK9.js → admins-DSi3KRky.js} +3 -3
- package/dist/web/public/assets/{admins-BTC_YEK9.js.map → admins-DSi3KRky.js.map} +1 -1
- package/dist/web/public/assets/agents-BLWe20EJ.js +7 -0
- package/dist/web/public/assets/agents-BLWe20EJ.js.map +1 -0
- package/dist/web/public/assets/{approvals-Boj7iXz4.js → approvals-Cu_JdM-8.js} +3 -3
- package/dist/web/public/assets/{approvals-Boj7iXz4.js.map → approvals-Cu_JdM-8.js.map} +1 -1
- package/dist/web/public/assets/asks-DfV8vxey.js +7 -0
- package/dist/web/public/assets/asks-DfV8vxey.js.map +1 -0
- package/dist/web/public/assets/{audit-MprCFoy_.js → audit-2EVhhvGV.js} +2 -2
- package/dist/web/public/assets/{audit-MprCFoy_.js.map → audit-2EVhhvGV.js.map} +1 -1
- package/dist/web/public/assets/bell-Wz_wuOa_.js +7 -0
- package/dist/web/public/assets/bell-Wz_wuOa_.js.map +1 -0
- package/dist/web/public/assets/{bgjobs-B6XvxURz.js → bgjobs-DXROZFAW.js} +2 -2
- package/dist/web/public/assets/{bgjobs-B6XvxURz.js.map → bgjobs-DXROZFAW.js.map} +1 -1
- package/dist/web/public/assets/{brain-C5HejASN.js → brain-Dh5VOzRL.js} +2 -2
- package/dist/web/public/assets/{brain-C5HejASN.js.map → brain-Dh5VOzRL.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-DkCTxO1A.js → briefcase-DfxbvM9i.js} +2 -2
- package/dist/web/public/assets/{briefcase-DkCTxO1A.js.map → briefcase-DfxbvM9i.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-DEyrYFz4.js → chevron-right-DU8Xla1M.js} +2 -2
- package/dist/web/public/assets/{chevron-right-DEyrYFz4.js.map → chevron-right-DU8Xla1M.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-bADFEXGw.js → circle-check-Be_S993G.js} +2 -2
- package/dist/web/public/assets/{circle-check-bADFEXGw.js.map → circle-check-Be_S993G.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-U4xrkHiS.js → circle-check-big-CsQkLR1u.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-U4xrkHiS.js.map → circle-check-big-CsQkLR1u.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-C6qY5UUl.js → circle-x-qkQu1Swu.js} +2 -2
- package/dist/web/public/assets/{circle-x-C6qY5UUl.js.map → circle-x-qkQu1Swu.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-B53cbWzX.js → confirm-dialog-Bm6MsLXZ.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-B53cbWzX.js.map → confirm-dialog-Bm6MsLXZ.js.map} +1 -1
- package/dist/web/public/assets/{data-table-BKTemkw9.js → data-table-Dw4Df09-.js} +5 -5
- package/dist/web/public/assets/{data-table-BKTemkw9.js.map → data-table-Dw4Df09-.js.map} +1 -1
- package/dist/web/public/assets/{dialog-Cevi7KvQ.js → dialog-CNsc4COh.js} +3 -3
- package/dist/web/public/assets/{dialog-Cevi7KvQ.js.map → dialog-CNsc4COh.js.map} +1 -1
- package/dist/web/public/assets/{download-DwJNwdwV.js → download-Bnhk_vDY.js} +2 -2
- package/dist/web/public/assets/{download-DwJNwdwV.js.map → download-Bnhk_vDY.js.map} +1 -1
- package/dist/web/public/assets/{email-CZVaRhG_.js → email-jgAX8liM.js} +3 -3
- package/dist/web/public/assets/{email-CZVaRhG_.js.map → email-jgAX8liM.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-C87S9Wor.js → empty-state-D8QXQ5y9.js} +2 -2
- package/dist/web/public/assets/{empty-state-C87S9Wor.js.map → empty-state-D8QXQ5y9.js.map} +1 -1
- package/dist/web/public/assets/{external-link-CIM1wjHP.js → external-link-C8AYvhBb.js} +2 -2
- package/dist/web/public/assets/{external-link-CIM1wjHP.js.map → external-link-C8AYvhBb.js.map} +1 -1
- package/dist/web/public/assets/{eye-TUAOhz72.js → eye-pmI_4E8x.js} +4 -4
- package/dist/web/public/assets/{eye-TUAOhz72.js.map → eye-pmI_4E8x.js.map} +1 -1
- package/dist/web/public/assets/{facts-ByM1VHCp.js → facts-BRHLLX2u.js} +2 -2
- package/dist/web/public/assets/{facts-ByM1VHCp.js.map → facts-BRHLLX2u.js.map} +1 -1
- package/dist/web/public/assets/goals-p7cNp01l.js +17 -0
- package/dist/web/public/assets/goals-p7cNp01l.js.map +1 -0
- package/dist/web/public/assets/{health-B4GF06J-.js → health-CuGIXg8C.js} +2 -2
- package/dist/web/public/assets/{health-B4GF06J-.js.map → health-CuGIXg8C.js.map} +1 -1
- package/dist/web/public/assets/heart-pulse-D0AHQl1d.js +7 -0
- package/dist/web/public/assets/heart-pulse-D0AHQl1d.js.map +1 -0
- package/dist/web/public/assets/heartbeat-DJRDS2GQ.js +7 -0
- package/dist/web/public/assets/heartbeat-DJRDS2GQ.js.map +1 -0
- package/dist/web/public/assets/hot-B1qKTiGD.js +17 -0
- package/dist/web/public/assets/hot-B1qKTiGD.js.map +1 -0
- package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
- package/dist/web/public/assets/index-XJngV1gH.js +166 -0
- package/dist/web/public/assets/index-XJngV1gH.js.map +1 -0
- package/dist/web/public/assets/installed-Dz4-KevJ.js +31 -0
- package/dist/web/public/assets/installed-Dz4-KevJ.js.map +1 -0
- package/dist/web/public/assets/{jobs-DwA9Ip87.js → jobs-kwOypiWd.js} +2 -2
- package/dist/web/public/assets/{jobs-DwA9Ip87.js.map → jobs-kwOypiWd.js.map} +1 -1
- package/dist/web/public/assets/layout-01n3Aibo.js +2 -0
- package/dist/web/public/assets/layout-01n3Aibo.js.map +1 -0
- package/dist/web/public/assets/layout-CVYe2vN8.js +2 -0
- package/dist/web/public/assets/layout-CVYe2vN8.js.map +1 -0
- package/dist/web/public/assets/{layout-CR5gLapT.js → layout-CbHxH58i.js} +2 -2
- package/dist/web/public/assets/{layout-CR5gLapT.js.map → layout-CbHxH58i.js.map} +1 -1
- package/dist/web/public/assets/layout-DD1Dei48.js +2 -0
- package/dist/web/public/assets/layout-DD1Dei48.js.map +1 -0
- package/dist/web/public/assets/{layout-zotlJ5fW.js → layout-s11iwkL-.js} +2 -2
- package/dist/web/public/assets/{layout-zotlJ5fW.js.map → layout-s11iwkL-.js.map} +1 -1
- package/dist/web/public/assets/llm-DPlK10Lg.js +7 -0
- package/dist/web/public/assets/llm-DPlK10Lg.js.map +1 -0
- package/dist/web/public/assets/{loader-circle-BFp6Oc8_.js → loader-circle-DymEG5Cl.js} +2 -2
- package/dist/web/public/assets/{loader-circle-BFp6Oc8_.js.map → loader-circle-DymEG5Cl.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-DPqnsBIG.js → map-pin-CyZg1-Jk.js} +2 -2
- package/dist/web/public/assets/{map-pin-DPqnsBIG.js.map → map-pin-CyZg1-Jk.js.map} +1 -1
- package/dist/web/public/assets/mcp-CiifW_qp.js +7 -0
- package/dist/web/public/assets/mcp-CiifW_qp.js.map +1 -0
- package/dist/web/public/assets/{memos-DCACQN26.js → memos-Bsiq64qW.js} +2 -2
- package/dist/web/public/assets/{memos-DCACQN26.js.map → memos-Bsiq64qW.js.map} +1 -1
- package/dist/web/public/assets/{messengers-CwWP1qI4.js → messengers-alGJK9dO.js} +3 -3
- package/dist/web/public/assets/{messengers-CwWP1qI4.js.map → messengers-alGJK9dO.js.map} +1 -1
- package/dist/web/public/assets/native-agent-CgzcqRsU.js +7 -0
- package/dist/web/public/assets/native-agent-CgzcqRsU.js.map +1 -0
- package/dist/web/public/assets/{network-CrMEVz4-.js → network-BSRJfeGk.js} +2 -2
- package/dist/web/public/assets/{network-CrMEVz4-.js.map → network-BSRJfeGk.js.map} +1 -1
- package/dist/web/public/assets/{outbox-C7FpZzwS.js → outbox-DSDls9xU.js} +3 -3
- package/dist/web/public/assets/{outbox-C7FpZzwS.js.map → outbox-DSDls9xU.js.map} +1 -1
- package/dist/web/public/assets/{pagination-Cgt8W6EX.js → pagination-DVXNZ2ti.js} +3 -3
- package/dist/web/public/assets/{pagination-Cgt8W6EX.js.map → pagination-DVXNZ2ti.js.map} +1 -1
- package/dist/web/public/assets/{persona-Bjty6uqM.js → persona-BB1gIwTX.js} +2 -2
- package/dist/web/public/assets/{persona-Bjty6uqM.js.map → persona-BB1gIwTX.js.map} +1 -1
- package/dist/web/public/assets/{play-CEoS1N8t.js → play-CcECAHfL.js} +2 -2
- package/dist/web/public/assets/{play-CEoS1N8t.js.map → play-CcECAHfL.js.map} +1 -1
- package/dist/web/public/assets/plus-DrStBHss.js +7 -0
- package/dist/web/public/assets/plus-DrStBHss.js.map +1 -0
- package/dist/web/public/assets/policy-BgDYTxy7.js +2 -0
- package/dist/web/public/assets/{policy-DwI-ov9J.js.map → policy-BgDYTxy7.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-CPSYEbgh.js → refresh-ccw-BBRPVLH8.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-CPSYEbgh.js.map → refresh-ccw-BBRPVLH8.js.map} +1 -1
- package/dist/web/public/assets/{reminders-X-QFSWvZ.js → reminders-jwy196Xw.js} +4 -9
- package/dist/web/public/assets/reminders-jwy196Xw.js.map +1 -0
- package/dist/web/public/assets/{save-tS3IBPf3.js → save-iBtyruco.js} +2 -2
- package/dist/web/public/assets/{save-tS3IBPf3.js.map → save-iBtyruco.js.map} +1 -1
- package/dist/web/public/assets/{schedules-CfCNvhCV.js → schedules-DDl_Sr5r.js} +3 -3
- package/dist/web/public/assets/{schedules-CfCNvhCV.js.map → schedules-DDl_Sr5r.js.map} +1 -1
- package/dist/web/public/assets/{search-BPvPCccn.js → search-Yb1S22sv.js} +2 -2
- package/dist/web/public/assets/{search-BPvPCccn.js.map → search-Yb1S22sv.js.map} +1 -1
- package/dist/web/public/assets/{service-DSitDFzD.js → service-jrg0kMtK.js} +3 -3
- package/dist/web/public/assets/{service-DSitDFzD.js.map → service-jrg0kMtK.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-HSHkhdur.js → status-badge-Arxyw3TL.js} +2 -2
- package/dist/web/public/assets/{status-badge-HSHkhdur.js.map → status-badge-Arxyw3TL.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-eKq_P0v6.js → subtasks-CkyuMv_X.js} +3 -3
- package/dist/web/public/assets/{subtasks-eKq_P0v6.js.map → subtasks-CkyuMv_X.js.map} +1 -1
- package/dist/web/public/assets/{table-BBISYTH-.js → table-BKdG9tsY.js} +2 -2
- package/dist/web/public/assets/{table-BBISYTH-.js.map → table-BKdG9tsY.js.map} +1 -1
- package/dist/web/public/assets/{topn-JA8llaUI.js → topn-BpX8BKWS.js} +3 -3
- package/dist/web/public/assets/{topn-JA8llaUI.js.map → topn-BpX8BKWS.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-D8F96aYm.js → trash-2-DxKJo_-6.js} +3 -3
- package/dist/web/public/assets/{trash-2-D8F96aYm.js.map → trash-2-DxKJo_-6.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js +2 -0
- package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js.map +1 -0
- package/dist/web/public/assets/use-llm-admin-D4snixaM.js +2 -0
- package/dist/web/public/assets/use-llm-admin-D4snixaM.js.map +1 -0
- package/dist/web/public/assets/{use-memory-BDa1R8Tf.js → use-memory-Cqf3xywK.js} +2 -2
- package/dist/web/public/assets/{use-memory-BDa1R8Tf.js.map → use-memory-Cqf3xywK.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-XgxLMQsY.js → use-observability-Thh7LWoE.js} +2 -2
- package/dist/web/public/assets/{use-observability-XgxLMQsY.js.map → use-observability-Thh7LWoE.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-Bc4s-JUD.js → use-settings-DRhH8owt.js} +2 -2
- package/dist/web/public/assets/{use-settings-Bc4s-JUD.js.map → use-settings-DRhH8owt.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-JalfqH6H.js → use-workspace-iLKz-h_7.js} +2 -2
- package/dist/web/public/assets/{use-workspace-JalfqH6H.js.map → use-workspace-iLKz-h_7.js.map} +1 -1
- package/dist/web/public/assets/useQuery-gnz30xMJ.js +2 -0
- package/dist/web/public/assets/{useQuery-DFryK9Pn.js.map → useQuery-gnz30xMJ.js.map} +1 -1
- package/dist/web/public/assets/{vector-G2dN_aut.js → vector-COjljy_4.js} +2 -2
- package/dist/web/public/assets/{vector-G2dN_aut.js.map → vector-COjljy_4.js.map} +1 -1
- package/dist/web/public/assets/viewer-AQHSc8hZ.js +12 -0
- package/dist/web/public/assets/viewer-AQHSc8hZ.js.map +1 -0
- package/dist/web/public/assets/{workspace-BaLZIgGn.js → workspace-DRtSCbx5.js} +4 -4
- package/dist/web/public/assets/{workspace-BaLZIgGn.js.map → workspace-DRtSCbx5.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-cX_rV523.js → workspaces-BLR5ZBu6.js} +3 -3
- package/dist/web/public/assets/{workspaces-cX_rV523.js.map → workspaces-BLR5ZBu6.js.map} +1 -1
- package/dist/web/public/assets/{x-D5196-9X.js → x-DGQ0qjhc.js} +2 -2
- package/dist/web/public/assets/{x-D5196-9X.js.map → x-DGQ0qjhc.js.map} +1 -1
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +45 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +2 -2
- package/dist/web/public/assets/agents-o9odac79.js +0 -12
- package/dist/web/public/assets/agents-o9odac79.js.map +0 -1
- package/dist/web/public/assets/hot-O9Z19xXa.js +0 -17
- package/dist/web/public/assets/hot-O9Z19xXa.js.map +0 -1
- package/dist/web/public/assets/index-CITyis5g.js +0 -166
- package/dist/web/public/assets/index-CITyis5g.js.map +0 -1
- package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
- package/dist/web/public/assets/installed-CM34mlDU.js +0 -7
- package/dist/web/public/assets/installed-CM34mlDU.js.map +0 -1
- package/dist/web/public/assets/layout-BxrFilDN.js +0 -2
- package/dist/web/public/assets/layout-BxrFilDN.js.map +0 -1
- package/dist/web/public/assets/layout-CcJQxFci.js +0 -2
- package/dist/web/public/assets/layout-CcJQxFci.js.map +0 -1
- package/dist/web/public/assets/layout-DRRveTaR.js +0 -2
- package/dist/web/public/assets/layout-DRRveTaR.js.map +0 -1
- package/dist/web/public/assets/policy-DwI-ov9J.js +0 -2
- package/dist/web/public/assets/reminders-X-QFSWvZ.js.map +0 -1
- package/dist/web/public/assets/use-skills-DCOYAQ8s.js +0 -2
- package/dist/web/public/assets/use-skills-DCOYAQ8s.js.map +0 -1
- package/dist/web/public/assets/useQuery-DFryK9Pn.js +0 -2
- package/dist/web/public/assets/viewer-DliYQkQQ.js +0 -12
- package/dist/web/public/assets/viewer-DliYQkQQ.js.map +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
/**
|
|
3
|
+
* Match-and-handle dispatcher. Returns `true` when the request was
|
|
4
|
+
* served (caller should stop walking its own route table); `false`
|
|
5
|
+
* when the URL/method didn't match anything in this module.
|
|
6
|
+
*/
|
|
7
|
+
export declare function handleLlmApi(req: IncomingMessage, res: ServerResponse, url: URL): Promise<boolean>;
|
|
8
|
+
//# sourceMappingURL=llm-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-api.d.ts","sourceRoot":"","sources":["../../src/web/llm-api.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAiDhE;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAClD,OAAO,CAAC,OAAO,CAAC,CA6BlB"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
// llm-api — web REST surface for the Stage 4 LLM-backend configuration
|
|
2
|
+
// UX. Mirrors what `agim setup llm` does on the CLI side, but lives
|
|
3
|
+
// behind the existing web auth model (operators only — gated by
|
|
4
|
+
// requireAdmin in the caller).
|
|
5
|
+
//
|
|
6
|
+
// Endpoints exposed:
|
|
7
|
+
//
|
|
8
|
+
// GET /api/llm → { backends, roles, status }
|
|
9
|
+
// POST /api/llm/backends body { name, provider, baseUrl, model, apiKey? }
|
|
10
|
+
// → 201 Created or 409 Conflict / 400 Validation
|
|
11
|
+
// DELETE /api/llm/backends/:name → 200 OK { removedRoles }
|
|
12
|
+
// PUT /api/llm/roles body { cheap?, evaluator?, "native-chat"?, … }
|
|
13
|
+
// → 200 OK; empty string / null deletes the binding
|
|
14
|
+
// POST /api/llm/secrets/:name body { apiKey } → 200 OK
|
|
15
|
+
// DELETE /api/llm/secrets/:name → 200 OK
|
|
16
|
+
//
|
|
17
|
+
// All write paths run the merged config through configSchema BEFORE
|
|
18
|
+
// touching disk so a typo can't poison ~/.agim/config.json — same
|
|
19
|
+
// safety net as the CLI wizard.
|
|
20
|
+
import { readFile, writeFile, mkdir, chmod } from 'node:fs/promises';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { AGIM_HOME } from '../core/agim-paths.js';
|
|
23
|
+
import { configSchema } from '../core/config-schema.js';
|
|
24
|
+
import { saveSecret, removeSecret, describeSecretSource, } from '../core/llm/secrets.js';
|
|
25
|
+
import { getProviderByName, loadFromConfig as loadLlmFromConfig } from '../core/llm/registry.js';
|
|
26
|
+
const CONFIG_FILE = join(AGIM_HOME, 'config.json');
|
|
27
|
+
// ─── HTTP helpers (deliberately tiny — server.ts has its own JSON
|
|
28
|
+
// helpers; we copy the shape here to keep this module standalone) ─
|
|
29
|
+
function send(res, code, body) {
|
|
30
|
+
res.statusCode = code;
|
|
31
|
+
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
32
|
+
res.end(JSON.stringify(body));
|
|
33
|
+
}
|
|
34
|
+
async function readJsonBody(req) {
|
|
35
|
+
const chunks = [];
|
|
36
|
+
for await (const c of req)
|
|
37
|
+
chunks.push(Buffer.isBuffer(c) ? c : Buffer.from(c));
|
|
38
|
+
const raw = Buffer.concat(chunks).toString('utf-8');
|
|
39
|
+
if (!raw.trim())
|
|
40
|
+
return null;
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(raw);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ─── routing ────────────────────────────────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* Match-and-handle dispatcher. Returns `true` when the request was
|
|
51
|
+
* served (caller should stop walking its own route table); `false`
|
|
52
|
+
* when the URL/method didn't match anything in this module.
|
|
53
|
+
*/
|
|
54
|
+
export async function handleLlmApi(req, res, url) {
|
|
55
|
+
const p = url.pathname;
|
|
56
|
+
const m = req.method ?? 'GET';
|
|
57
|
+
if (p === '/api/llm' && m === 'GET') {
|
|
58
|
+
await handleList(res);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
if (p === '/api/llm/backends' && m === 'POST') {
|
|
62
|
+
await handleAddBackend(req, res);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
if (p === '/api/llm/roles' && m === 'PUT') {
|
|
66
|
+
await handlePutRoles(req, res);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const rmBackend = p.match(/^\/api\/llm\/backends\/([A-Za-z0-9-]+)$/);
|
|
70
|
+
if (rmBackend && m === 'DELETE') {
|
|
71
|
+
await handleRemoveBackend(res, rmBackend[1]);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
const setSecret = p.match(/^\/api\/llm\/secrets\/([A-Za-z0-9-]+)$/);
|
|
75
|
+
if (setSecret && m === 'POST') {
|
|
76
|
+
await handleSetSecret(req, res, setSecret[1]);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
if (setSecret && m === 'DELETE') {
|
|
80
|
+
await handleRemoveSecret(res, setSecret[1]);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
const pingBackend = p.match(/^\/api\/llm\/backends\/([A-Za-z0-9-]+)\/ping$/);
|
|
84
|
+
if (pingBackend && m === 'POST') {
|
|
85
|
+
await handlePing(res, pingBackend[1]);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
// ─── handlers ───────────────────────────────────────────────────────
|
|
91
|
+
async function handleList(res) {
|
|
92
|
+
const cfg = await readConfig();
|
|
93
|
+
const backends = (cfg.llmBackends ?? []).map((b) => {
|
|
94
|
+
const src = describeSecretSource(b.name);
|
|
95
|
+
return {
|
|
96
|
+
name: b.name,
|
|
97
|
+
provider: b.provider,
|
|
98
|
+
baseUrl: b.baseUrl,
|
|
99
|
+
model: b.model,
|
|
100
|
+
secret: { source: src.source, envKey: src.envKey },
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
send(res, 200, {
|
|
104
|
+
backends,
|
|
105
|
+
roles: cfg.llmRoles ?? {},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async function handleAddBackend(req, res) {
|
|
109
|
+
const body = await readJsonBody(req);
|
|
110
|
+
if (!body || typeof body !== 'object') {
|
|
111
|
+
send(res, 400, { error: 'request body must be a JSON object' });
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const name = typeof body.name === 'string' ? body.name.trim() : '';
|
|
115
|
+
const provider = body.provider;
|
|
116
|
+
const baseUrl = typeof body.baseUrl === 'string' ? body.baseUrl.trim() : '';
|
|
117
|
+
const model = typeof body.model === 'string' ? body.model.trim() : '';
|
|
118
|
+
const apiKey = typeof body.apiKey === 'string' ? body.apiKey.trim() : '';
|
|
119
|
+
if (!name || !/^[A-Za-z0-9][A-Za-z0-9-]*$/.test(name)) {
|
|
120
|
+
send(res, 400, { error: 'name is required and must match [A-Za-z0-9][A-Za-z0-9-]*' });
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (provider !== 'openai-compat' && provider !== 'anthropic') {
|
|
124
|
+
send(res, 400, { error: 'provider must be "openai-compat" or "anthropic"' });
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (!baseUrl || !/^https?:\/\//i.test(baseUrl)) {
|
|
128
|
+
send(res, 400, { error: 'baseUrl must be an http(s) URL' });
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (!model) {
|
|
132
|
+
send(res, 400, { error: 'model is required' });
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const cfg = await readConfig();
|
|
136
|
+
const existing = cfg.llmBackends ?? [];
|
|
137
|
+
if (existing.some((b) => b.name === name)) {
|
|
138
|
+
send(res, 409, { error: `backend "${name}" already exists` });
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const next = { name, provider, baseUrl, model };
|
|
142
|
+
cfg.llmBackends = [...existing, next];
|
|
143
|
+
const parsed = configSchema.safeParse(cfg);
|
|
144
|
+
if (!parsed.success) {
|
|
145
|
+
send(res, 400, {
|
|
146
|
+
error: 'config validation failed',
|
|
147
|
+
issues: parsed.error.issues.map((i) => i.message),
|
|
148
|
+
});
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
await writeConfig(cfg);
|
|
152
|
+
if (apiKey)
|
|
153
|
+
saveSecret(name, apiKey);
|
|
154
|
+
send(res, 201, { name, secretStored: !!apiKey });
|
|
155
|
+
}
|
|
156
|
+
async function handleRemoveBackend(res, name) {
|
|
157
|
+
const cfg = await readConfig();
|
|
158
|
+
const backends = cfg.llmBackends ?? [];
|
|
159
|
+
const next = backends.filter((b) => b.name !== name);
|
|
160
|
+
if (next.length === backends.length) {
|
|
161
|
+
send(res, 404, { error: `no backend named "${name}"` });
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
cfg.llmBackends = next;
|
|
165
|
+
const roles = cfg.llmRoles ?? {};
|
|
166
|
+
const cleaned = {};
|
|
167
|
+
let removedRoles = 0;
|
|
168
|
+
for (const [r, b] of Object.entries(roles)) {
|
|
169
|
+
if (b === name) {
|
|
170
|
+
removedRoles++;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
cleaned[r] = b;
|
|
174
|
+
}
|
|
175
|
+
cfg.llmRoles = cleaned;
|
|
176
|
+
await writeConfig(cfg);
|
|
177
|
+
removeSecret(name);
|
|
178
|
+
send(res, 200, { removedRoles });
|
|
179
|
+
}
|
|
180
|
+
async function handlePutRoles(req, res) {
|
|
181
|
+
const body = await readJsonBody(req);
|
|
182
|
+
if (!body || typeof body !== 'object') {
|
|
183
|
+
send(res, 400, { error: 'request body must be a JSON object' });
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const cfg = await readConfig();
|
|
187
|
+
const backendNames = new Set((cfg.llmBackends ?? []).map((b) => b.name));
|
|
188
|
+
const current = cfg.llmRoles ?? {};
|
|
189
|
+
const next = { ...current };
|
|
190
|
+
for (const [rawRole, rawValue] of Object.entries(body)) {
|
|
191
|
+
const role = rawRole.trim();
|
|
192
|
+
if (!role)
|
|
193
|
+
continue;
|
|
194
|
+
if (rawValue === null || rawValue === '' || rawValue === undefined) {
|
|
195
|
+
delete next[role];
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (typeof rawValue !== 'string') {
|
|
199
|
+
send(res, 400, { error: `role "${role}" must be a string (backend name) or null/empty to unbind` });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const target = rawValue.trim();
|
|
203
|
+
if (!backendNames.has(target)) {
|
|
204
|
+
send(res, 400, { error: `role "${role}" references unknown backend "${target}"` });
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
next[role] = target;
|
|
208
|
+
}
|
|
209
|
+
cfg.llmRoles = next;
|
|
210
|
+
const parsed = configSchema.safeParse(cfg);
|
|
211
|
+
if (!parsed.success) {
|
|
212
|
+
send(res, 400, {
|
|
213
|
+
error: 'config validation failed',
|
|
214
|
+
issues: parsed.error.issues.map((i) => i.message),
|
|
215
|
+
});
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
await writeConfig(cfg);
|
|
219
|
+
send(res, 200, { roles: next });
|
|
220
|
+
}
|
|
221
|
+
async function handleSetSecret(req, res, name) {
|
|
222
|
+
const cfg = await readConfig();
|
|
223
|
+
if (!(cfg.llmBackends ?? []).some((b) => b.name === name)) {
|
|
224
|
+
send(res, 404, { error: `no backend named "${name}"` });
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const body = await readJsonBody(req);
|
|
228
|
+
if (!body || typeof body.apiKey !== 'string' || !body.apiKey.trim()) {
|
|
229
|
+
send(res, 400, { error: 'apiKey is required (non-empty string)' });
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
saveSecret(name, body.apiKey.trim());
|
|
233
|
+
const src = describeSecretSource(name);
|
|
234
|
+
send(res, 200, { name, source: src.source });
|
|
235
|
+
}
|
|
236
|
+
async function handleRemoveSecret(res, name) {
|
|
237
|
+
removeSecret(name);
|
|
238
|
+
send(res, 200, { name });
|
|
239
|
+
}
|
|
240
|
+
async function handlePing(res, name) {
|
|
241
|
+
// Stage 6 — backend ping. Loads the config (so a newly-added backend
|
|
242
|
+
// is reachable even before agim restarts), looks up the provider,
|
|
243
|
+
// and issues a tiny chat probe ('ping') with a tight timeout. The
|
|
244
|
+
// response shape is operator-debug-flavored: ok / errorClass / ms /
|
|
245
|
+
// sampleText / tokens. Failures DO NOT throw — they land as ok:false
|
|
246
|
+
// with a readable error string the UI can show.
|
|
247
|
+
const cfg = await readConfig();
|
|
248
|
+
if (!(cfg.llmBackends ?? []).some((b) => b.name === name)) {
|
|
249
|
+
send(res, 404, { error: `no backend named "${name}"` });
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
loadLlmFromConfig(cfg);
|
|
253
|
+
const provider = getProviderByName(name);
|
|
254
|
+
if (!provider) {
|
|
255
|
+
send(res, 200, {
|
|
256
|
+
name, ok: false,
|
|
257
|
+
error: 'backend not in registry (likely missing API key)',
|
|
258
|
+
});
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const startedAt = Date.now();
|
|
262
|
+
try {
|
|
263
|
+
const r = await provider.chat([{ role: 'user', content: 'ping' }], { timeoutMs: 10_000, maxTokens: 16 });
|
|
264
|
+
send(res, 200, {
|
|
265
|
+
name, ok: true,
|
|
266
|
+
durationMs: Date.now() - startedAt,
|
|
267
|
+
tokensIn: r.usage.promptTokens,
|
|
268
|
+
tokensOut: r.usage.completionTokens,
|
|
269
|
+
sampleText: r.text.slice(0, 200),
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
send(res, 200, {
|
|
274
|
+
name, ok: false,
|
|
275
|
+
durationMs: Date.now() - startedAt,
|
|
276
|
+
error: err instanceof Error ? err.message : String(err),
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// ─── disk helpers ───────────────────────────────────────────────────
|
|
281
|
+
async function readConfig() {
|
|
282
|
+
try {
|
|
283
|
+
const raw = await readFile(CONFIG_FILE, 'utf-8');
|
|
284
|
+
return JSON.parse(raw);
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
if (err.code === 'ENOENT')
|
|
288
|
+
return {};
|
|
289
|
+
throw err;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
async function writeConfig(cfg) {
|
|
293
|
+
await mkdir(AGIM_HOME, { recursive: true, mode: 0o700 });
|
|
294
|
+
await writeFile(CONFIG_FILE, JSON.stringify(cfg, null, 2), { mode: 0o600 });
|
|
295
|
+
try {
|
|
296
|
+
await chmod(CONFIG_FILE, 0o600);
|
|
297
|
+
}
|
|
298
|
+
catch { /* ignore on Windows */ }
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=llm-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-api.js","sourceRoot":"","sources":["../../src/web/llm-api.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;AACpE,gEAAgE;AAChE,+BAA+B;AAC/B,EAAE;AACF,qBAAqB;AACrB,EAAE;AACF,uEAAuE;AACvE,0FAA0F;AAC1F,wFAAwF;AACxF,mEAAmE;AACnE,wFAAwF;AACxF,2FAA2F;AAC3F,oEAAoE;AACpE,kDAAkD;AAClD,EAAE;AACF,oEAAoE;AACpE,kEAAkE;AAClE,gCAAgC;AAGhC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EACL,UAAU,EAAE,YAAY,EAAE,oBAAoB,GAC/C,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,iBAAiB,EAAE,cAAc,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAEhG,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;AAoBlD,mEAAmE;AACnE,yEAAyE;AAEzE,SAAS,IAAI,CAAC,GAAmB,EAAE,IAAY,EAAE,IAAa;IAC5D,GAAG,CAAC,UAAU,GAAG,IAAI,CAAA;IACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAA;IAChE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AAC/B,CAAC;AAED,KAAK,UAAU,YAAY,CAAc,GAAoB;IAC3D,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG;QAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAA;IAC5B,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;AAC3D,CAAC;AAED,uEAAuE;AAEvE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAoB,EAAE,GAAmB,EAAE,GAAQ;IAEnD,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAA;IACtB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAA;IAE7B,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;QACpC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IACpC,CAAC;IACD,IAAI,CAAC,KAAK,mBAAmB,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QAC9C,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAC/C,CAAC;IACD,IAAI,CAAC,KAAK,gBAAgB,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;QAC1C,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAC7C,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAA;IACpE,IAAI,SAAS,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAC3D,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAA;IACnE,IAAI,SAAS,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAC5D,CAAC;IACD,IAAI,SAAS,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAC1D,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAC5E,IAAI,WAAW,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QAChC,MAAM,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IACpD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,uEAAuE;AAEvE,KAAK,UAAU,UAAU,CAAC,GAAmB;IAC3C,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjD,MAAM,GAAG,GAAG,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACxC,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;SACnD,CAAA;IACH,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;QACb,QAAQ;QACR,KAAK,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;KAC1B,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAoB,EAAE,GAAmB;IACvE,MAAM,IAAI,GAAG,MAAM,YAAY,CAM5B,GAAG,CAAC,CAAA;IACP,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAA;QAC/D,OAAM;IACR,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAC9B,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3E,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACrE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACxE,IAAI,CAAC,IAAI,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,0DAA0D,EAAE,CAAC,CAAA;QACrF,OAAM;IACR,CAAC;IACD,IAAI,QAAQ,KAAK,eAAe,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,iDAAiD,EAAE,CAAC,CAAA;QAC5E,OAAM;IACR,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC,CAAA;QAC3D,OAAM;IACR,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAA;QAC9C,OAAM;IACR,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAA;IACtC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,IAAI,kBAAkB,EAAE,CAAC,CAAA;QAC7D,OAAM;IACR,CAAC;IACD,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC3D,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YACb,KAAK,EAAE,0BAA0B;YACjC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;SAClD,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IACD,MAAM,WAAW,CAAC,GAAG,CAAC,CAAA;IACtB,IAAI,MAAM;QAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACpC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;AAClD,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,GAAmB,EAAE,IAAY;IAClE,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAA;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACpD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,IAAI,GAAG,EAAE,CAAC,CAAA;QACvD,OAAM;IACR,CAAC;IACD,GAAG,CAAC,WAAW,GAAG,IAAI,CAAA;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAA;IAChC,MAAM,OAAO,GAA2B,EAAE,CAAA;IAC1C,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAAC,YAAY,EAAE,CAAC;YAAC,SAAQ;QAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAChB,CAAC;IACD,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAA;IACtB,MAAM,WAAW,CAAC,GAAG,CAAC,CAAA;IACtB,YAAY,CAAC,IAAI,CAAC,CAAA;IAClB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,CAAC,CAAA;AAClC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAoB,EAAE,GAAmB;IACrE,MAAM,IAAI,GAAG,MAAM,YAAY,CAA0B,GAAG,CAAC,CAAA;IAC7D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAA;QAC/D,OAAM;IACR,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAA;IAC9B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACxE,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAA;IAClC,MAAM,IAAI,GAA2B,EAAE,GAAG,OAAO,EAAE,CAAA;IACnD,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAA;YACjB,SAAQ;QACV,CAAC;QACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,IAAI,2DAA2D,EAAE,CAAC,CAAA;YACnG,OAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,IAAI,iCAAiC,MAAM,GAAG,EAAE,CAAC,CAAA;YAClF,OAAM;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;IACrB,CAAC;IACD,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAA;IACnB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YACb,KAAK,EAAE,0BAA0B;YACjC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;SAClD,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IACD,MAAM,WAAW,CAAC,GAAG,CAAC,CAAA;IACtB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAoB,EAAE,GAAmB,EAAE,IAAY;IACpF,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAA;IAC9B,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,IAAI,GAAG,EAAE,CAAC,CAAA;QACvD,OAAM;IACR,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAuB,GAAG,CAAC,CAAA;IAC1D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACpE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC,CAAA;QAClE,OAAM;IACR,CAAC;IACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;IACtC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,GAAmB,EAAE,IAAY;IACjE,YAAY,CAAC,IAAI,CAAC,CAAA;IAClB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;AAC1B,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAmB,EAAE,IAAY;IACzD,qEAAqE;IACrE,kEAAkE;IAClE,kEAAkE;IAClE,oEAAoE;IACpE,qEAAqE;IACrE,gDAAgD;IAChD,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAA;IAC9B,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,IAAI,GAAG,EAAE,CAAC,CAAA;QACvD,OAAM;IACR,CAAC;IACD,iBAAiB,CAAC,GAAG,CAAC,CAAA;IACtB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YACb,IAAI,EAAE,EAAE,EAAE,KAAK;YACf,KAAK,EAAE,kDAAkD;SAC1D,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,IAAI,CAC3B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EACnC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CACrC,CAAA;QACD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YACb,IAAI,EAAE,EAAE,EAAE,IAAI;YACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY;YAC9B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB;YACnC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACjC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YACb,IAAI,EAAE,EAAE,EAAE,KAAK;YACf,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED,uEAAuE;AAEvE,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAA;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAA;QAC/D,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAc;IACvC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACxD,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC3E,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
/**
|
|
3
|
+
* Match-and-handle dispatcher. Returns `true` when the request was
|
|
4
|
+
* served (caller should stop walking its own route table); `false`
|
|
5
|
+
* when the URL/method didn't match.
|
|
6
|
+
*/
|
|
7
|
+
export declare function handleMcpApi(req: IncomingMessage, res: ServerResponse, url: URL): Promise<boolean>;
|
|
8
|
+
//# sourceMappingURL=mcp-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-api.d.ts","sourceRoot":"","sources":["../../src/web/mcp-api.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAiDhE;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAClD,OAAO,CAAC,OAAO,CAAC,CAsBlB"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// mcp-api — web REST surface for the Stage 6 MCP-servers configuration
|
|
2
|
+
// UX. Mirrors `/api/llm/*` shape; the operator can list, add, remove
|
|
3
|
+
// external MCP servers and probe their health from the web console
|
|
4
|
+
// without hand-editing `~/.agim/config.json`.
|
|
5
|
+
//
|
|
6
|
+
// Endpoints exposed:
|
|
7
|
+
//
|
|
8
|
+
// GET /api/mcp → { servers, connected }
|
|
9
|
+
// POST /api/mcp/servers body { name, command|url, args?, headers?, ... }
|
|
10
|
+
// → 201 / 400 validation / 409 conflict
|
|
11
|
+
// DELETE /api/mcp/servers/:name → 200 OK
|
|
12
|
+
// POST /api/mcp/servers/:name/health → 200 { connected, toolCount, lastError? }
|
|
13
|
+
// (re-probes by calling listAvailableTools)
|
|
14
|
+
// POST /api/mcp/reload → 200 { connected: number } — reload from config.json
|
|
15
|
+
// and reconnect all (used after manual JSON edits)
|
|
16
|
+
//
|
|
17
|
+
// All write paths run the merged config through configSchema BEFORE
|
|
18
|
+
// touching disk — same safety net as `/api/llm/*`.
|
|
19
|
+
import { readFile, writeFile, mkdir, chmod } from 'node:fs/promises';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { AGIM_HOME } from '../core/agim-paths.js';
|
|
22
|
+
import { configSchema } from '../core/config-schema.js';
|
|
23
|
+
import { loadFromConfig as loadMcpFromConfig, connectAll as connectAllMcp, describeRegistry as describeMcpRegistry, } from '../core/llm/mcp-registry.js';
|
|
24
|
+
const CONFIG_FILE = join(AGIM_HOME, 'config.json');
|
|
25
|
+
// ─── HTTP helpers (tiny, no shared mock-friendly base needed) ────────
|
|
26
|
+
function send(res, code, body) {
|
|
27
|
+
res.statusCode = code;
|
|
28
|
+
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
29
|
+
res.end(JSON.stringify(body));
|
|
30
|
+
}
|
|
31
|
+
async function readJsonBody(req) {
|
|
32
|
+
const chunks = [];
|
|
33
|
+
for await (const c of req)
|
|
34
|
+
chunks.push(Buffer.isBuffer(c) ? c : Buffer.from(c));
|
|
35
|
+
const raw = Buffer.concat(chunks).toString('utf-8');
|
|
36
|
+
if (!raw.trim())
|
|
37
|
+
return null;
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(raw);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// ─── routing ────────────────────────────────────────────────────────
|
|
46
|
+
/**
|
|
47
|
+
* Match-and-handle dispatcher. Returns `true` when the request was
|
|
48
|
+
* served (caller should stop walking its own route table); `false`
|
|
49
|
+
* when the URL/method didn't match.
|
|
50
|
+
*/
|
|
51
|
+
export async function handleMcpApi(req, res, url) {
|
|
52
|
+
const p = url.pathname;
|
|
53
|
+
const m = req.method ?? 'GET';
|
|
54
|
+
if (p === '/api/mcp' && m === 'GET') {
|
|
55
|
+
await handleList(res);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
if (p === '/api/mcp/servers' && m === 'POST') {
|
|
59
|
+
await handleAddServer(req, res);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (p === '/api/mcp/reload' && m === 'POST') {
|
|
63
|
+
await handleReload(res);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
const removeMatch = p.match(/^\/api\/mcp\/servers\/([A-Za-z0-9._-]+)$/);
|
|
67
|
+
if (removeMatch && m === 'DELETE') {
|
|
68
|
+
await handleRemoveServer(res, removeMatch[1]);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
const healthMatch = p.match(/^\/api\/mcp\/servers\/([A-Za-z0-9._-]+)\/health$/);
|
|
72
|
+
if (healthMatch && m === 'POST') {
|
|
73
|
+
await handleHealth(res, healthMatch[1]);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
// ─── handlers ───────────────────────────────────────────────────────
|
|
79
|
+
async function handleList(res) {
|
|
80
|
+
const cfg = await readConfig();
|
|
81
|
+
const servers = (cfg.mcpServers ?? []).map((s) => sanitizeServer(s));
|
|
82
|
+
// Best-effort runtime status — empty when the registry hasn't been
|
|
83
|
+
// loaded (agim daemon may not have called loadMcpFromConfig yet).
|
|
84
|
+
let snap = { servers: [], totalTools: 0 };
|
|
85
|
+
try {
|
|
86
|
+
snap = describeMcpRegistry();
|
|
87
|
+
}
|
|
88
|
+
catch { /* registry not initialized */ }
|
|
89
|
+
send(res, 200, { servers, runtime: snap });
|
|
90
|
+
}
|
|
91
|
+
async function handleAddServer(req, res) {
|
|
92
|
+
const body = await readJsonBody(req);
|
|
93
|
+
if (!body || typeof body !== 'object') {
|
|
94
|
+
send(res, 400, { error: 'request body must be a JSON object' });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const cfg = await readConfig();
|
|
98
|
+
const existing = cfg.mcpServers ?? [];
|
|
99
|
+
if (existing.some((s) => s.name === body.name)) {
|
|
100
|
+
send(res, 409, { error: `mcp server "${body.name}" already exists` });
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
cfg.mcpServers = [...existing, body];
|
|
104
|
+
// Validate via configSchema before writing — same gate the CLI uses.
|
|
105
|
+
// mcpServerSchema's superRefine catches the "neither command nor url"
|
|
106
|
+
// and "both set" cases with a readable issue string.
|
|
107
|
+
const parsed = configSchema.safeParse(cfg);
|
|
108
|
+
if (!parsed.success) {
|
|
109
|
+
send(res, 400, {
|
|
110
|
+
error: 'config validation failed',
|
|
111
|
+
issues: parsed.error.issues.map((i) => i.message),
|
|
112
|
+
});
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
await writeConfig(cfg);
|
|
116
|
+
send(res, 201, { name: body.name });
|
|
117
|
+
}
|
|
118
|
+
async function handleRemoveServer(res, name) {
|
|
119
|
+
const cfg = await readConfig();
|
|
120
|
+
const servers = cfg.mcpServers ?? [];
|
|
121
|
+
const next = servers.filter((s) => s.name !== name);
|
|
122
|
+
if (next.length === servers.length) {
|
|
123
|
+
send(res, 404, { error: `no mcp server named "${name}"` });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
cfg.mcpServers = next;
|
|
127
|
+
await writeConfig(cfg);
|
|
128
|
+
send(res, 200, { name });
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Re-probe an existing server: reload registry from on-disk config,
|
|
132
|
+
* connect, return the per-server status. Cheap enough to do
|
|
133
|
+
* synchronously per UI button-press; the actual reconnect can take a
|
|
134
|
+
* second or two for stdio servers spawning subprocesses.
|
|
135
|
+
*/
|
|
136
|
+
async function handleHealth(res, name) {
|
|
137
|
+
const cfg = await readConfig();
|
|
138
|
+
if (!(cfg.mcpServers ?? []).some((s) => s.name === name)) {
|
|
139
|
+
send(res, 404, { error: `no mcp server named "${name}"` });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
loadMcpFromConfig(cfg);
|
|
144
|
+
await connectAllMcp();
|
|
145
|
+
const snap = describeMcpRegistry();
|
|
146
|
+
const row = snap.servers.find((r) => r.name === name);
|
|
147
|
+
if (!row) {
|
|
148
|
+
send(res, 200, { name, connected: false, toolCount: 0, lastError: 'server not registered after reload' });
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
send(res, 200, {
|
|
152
|
+
name,
|
|
153
|
+
connected: row.connected,
|
|
154
|
+
toolCount: row.toolCount,
|
|
155
|
+
...(row.error ? { lastError: row.error } : {}),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
send(res, 200, {
|
|
160
|
+
name, connected: false, toolCount: 0,
|
|
161
|
+
lastError: err instanceof Error ? err.message : String(err),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function handleReload(res) {
|
|
166
|
+
const cfg = await readConfig();
|
|
167
|
+
loadMcpFromConfig(cfg);
|
|
168
|
+
const r = await connectAllMcp();
|
|
169
|
+
send(res, 200, {
|
|
170
|
+
requested: r.ok.length + Object.keys(r.failed).length,
|
|
171
|
+
connected: r.ok.length,
|
|
172
|
+
failed: r.failed,
|
|
173
|
+
toolCount: r.toolCount,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
// ─── helpers ────────────────────────────────────────────────────────
|
|
177
|
+
/** Strip nothing — mcp configs don't contain secrets the way LLM ones
|
|
178
|
+
* do. Operator-supplied headers MAY contain bearer tokens; for now
|
|
179
|
+
* we surface them as-is in the API response. SECURITY: the /api/mcp
|
|
180
|
+
* GET is gated by requireAdmin upstream (see server.ts), so this is
|
|
181
|
+
* admin-only data. If we later add operator-scoped read-only views,
|
|
182
|
+
* this is where we'd mask `headers.Authorization`. */
|
|
183
|
+
function sanitizeServer(s) {
|
|
184
|
+
return s;
|
|
185
|
+
}
|
|
186
|
+
async function readConfig() {
|
|
187
|
+
try {
|
|
188
|
+
const raw = await readFile(CONFIG_FILE, 'utf-8');
|
|
189
|
+
return JSON.parse(raw);
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
if (err.code === 'ENOENT')
|
|
193
|
+
return {};
|
|
194
|
+
throw err;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function writeConfig(cfg) {
|
|
198
|
+
await mkdir(AGIM_HOME, { recursive: true, mode: 0o700 });
|
|
199
|
+
await writeFile(CONFIG_FILE, JSON.stringify(cfg, null, 2), { mode: 0o600 });
|
|
200
|
+
try {
|
|
201
|
+
await chmod(CONFIG_FILE, 0o600);
|
|
202
|
+
}
|
|
203
|
+
catch { /* ignore on Windows */ }
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=mcp-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-api.js","sourceRoot":"","sources":["../../src/web/mcp-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{y as p,ab as f,q as o,ad as g,U as t,s as m,c as j}from"./index-XJngV1gH.js";import{e as N}from"./react-C9F3QeMB.js";import{D as y}from"./data-table-Dw4Df09-.js";import{E as b}from"./empty-state-D8QXQ5y9.js";import{S as w}from"./status-badge-Arxyw3TL.js";import{u as x}from"./useQuery-gnz30xMJ.js";import{u as v}from"./use-event-stream-BGeFcayX.js";import{L as A}from"./loader-circle-DymEG5Cl.js";import{R as S}from"./refresh-ccw-BBRPVLH8.js";import"./table-BKdG9tsY.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const C=p("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]),l={all:["a2a"],stats:["a2a","stats"],recent:e=>["a2a","recent",e]};function q(){return x({queryKey:l.stats,queryFn:()=>o.getA2AStats()})}function T(e){return x({queryKey:l.recent(e),queryFn:()=>o.getA2ARecent(e)})}function E(){const e=f();return()=>e.invalidateQueries({queryKey:l.all})}const L={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function
|
|
7
|
-
//# sourceMappingURL=a2a-
|
|
6
|
+
*/const C=p("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]),l={all:["a2a"],stats:["a2a","stats"],recent:e=>["a2a","recent",e]};function q(){return x({queryKey:l.stats,queryFn:()=>o.getA2AStats()})}function T(e){return x({queryKey:l.recent(e),queryFn:()=>o.getA2ARecent(e)})}function E(){const e=f();return()=>e.invalidateQueries({queryKey:l.all})}const L={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function U(){const{t:e}=g(["tasks","common"]),s=E(),n=q(),r=T({limit:50}),u=r.data?.rows??[],i=n.data,d=v({job:()=>s()}),h=N.useMemo(()=>[{id:"id",header:e("a2a.col.id"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.id]}),headClassName:"w-16"},{id:"agent",header:e("a2a.col.agent"),cell:a=>t.jsx("span",{className:"font-medium",children:a.agent}),headClassName:"w-32"},{id:"parent",header:e("a2a.col.parent"),cell:a=>a.parent_id!=null?t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.parent_id]}):t.jsx("span",{className:"text-text-muted",children:"—"}),headClassName:"w-20"},{id:"depth",header:e("a2a.col.depth"),cell:a=>t.jsx("span",{className:"tabular-nums text-text-dim",children:a.call_depth}),headClassName:"w-16",hideOnMobile:!0},{id:"status",header:e("a2a.col.status"),cell:a=>t.jsx(w,{status:a.status,children:a.status}),headClassName:"w-28"},{id:"prompt",header:e("a2a.col.prompt"),cell:a=>t.jsx("span",{className:"line-clamp-2 text-text-dim",children:a.prompt??"—"}),asCardTitle:!0},{id:"createdAt",header:e("a2a.col.createdAt"),cell:a=>t.jsx("span",{className:"text-text-dim",children:R(a.created_at)}),headClassName:"w-40",hideOnMobile:!0}],[e]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("a2a.title")}),t.jsx("span",{className:m("text-xs font-medium tabular-nums",L[d]),children:e(`jobs.live.${d}`)}),t.jsxs(j,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{r.refetch(),n.refetch()},disabled:r.isFetching||n.isFetching,"aria-label":e("actions.refresh",{ns:"common"}),children:[r.isFetching?t.jsx(A,{className:"h-4 w-4 animate-spin"}):t.jsx(S,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:e("a2a.subtitle")})]}),i&&t.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[t.jsx(c,{label:e("a2a.stats.total"),value:i.total,tone:"info"}),t.jsx(c,{label:e("a2a.stats.recent24h"),value:i.recent24h,tone:"success"}),t.jsx(c,{label:e("a2a.stats.maxDepth"),value:i.maxDepth,tone:"warning"})]}),t.jsx(y,{columns:h,rows:u,getRowId:a=>String(a.id),loading:r.isLoading,emptyState:t.jsx(b,{icon:t.jsx(C,{}),title:e("a2a.empty.title"),description:e("a2a.empty.description")})})]})}const k={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function c({label:e,value:s,tone:n}){return t.jsxs("div",{className:m("rounded-md border bg-surface px-3 py-2",k[n]),children:[t.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:e}),t.jsx("div",{className:"text-2xl font-semibold tabular-nums",children:s})]})}function R(e){try{const s=new Date(e);return Number.isNaN(s.getTime())?e:s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{U as default};
|
|
7
|
+
//# sourceMappingURL=a2a-Mke0F7ZM.js.map
|