agim-cli 1.4.9 → 1.5.0
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 +415 -402
- package/README.md +4 -4
- package/bin/agim_rpc.py +12 -12
- package/dist/cli-ui/cmd-handlers.d.ts +3 -3
- package/dist/cli-ui/cmd-handlers.d.ts.map +1 -1
- package/dist/cli-ui/cmd-handlers.js +11 -19
- package/dist/cli-ui/cmd-handlers.js.map +1 -1
- package/dist/cli-ui/config-wizard.js +27 -27
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/env-file.d.ts +4 -4
- package/dist/cli-ui/env-file.js +13 -13
- package/dist/cli-ui/env-file.js.map +1 -1
- package/dist/cli-ui/i18n.d.ts +2 -2
- package/dist/cli-ui/i18n.js +9 -9
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/lang-picker.js +1 -1
- package/dist/cli-ui/lang-picker.js.map +1 -1
- package/dist/cli-ui/paths.d.ts.map +1 -1
- package/dist/cli-ui/paths.js +2 -4
- package/dist/cli-ui/paths.js.map +1 -1
- package/dist/cli-ui/service.d.ts +7 -7
- package/dist/cli-ui/service.d.ts.map +1 -1
- package/dist/cli-ui/service.js +57 -72
- package/dist/cli-ui/service.js.map +1 -1
- package/dist/cli-ui/tui/app.js +2 -2
- package/dist/cli-ui/tui/app.js.map +1 -1
- package/dist/cli-ui/tui/index.js +6 -6
- package/dist/cli-ui/tui/index.js.map +1 -1
- package/dist/cli-ui/tui/mouse-stdin.js +1 -1
- package/dist/cli-ui/tui/mouse-stdin.js.map +1 -1
- package/dist/cli-ui/tui/stream-reveal.d.ts +2 -2
- package/dist/cli-ui/tui/stream-reveal.d.ts.map +1 -1
- package/dist/cli-ui/tui/stream-reveal.js +4 -4
- package/dist/cli-ui/tui/stream-reveal.js.map +1 -1
- package/dist/cli.js +24 -45
- package/dist/cli.js.map +1 -1
- package/dist/core/a2a-notify.js +5 -5
- package/dist/core/a2a-notify.js.map +1 -1
- package/dist/core/a2a.d.ts +2 -2
- package/dist/core/a2a.d.ts.map +1 -1
- package/dist/core/a2a.js +12 -12
- package/dist/core/a2a.js.map +1 -1
- package/dist/core/access-token.d.ts +1 -1
- package/dist/core/access-token.js +7 -7
- package/dist/core/access-token.js.map +1 -1
- package/dist/core/acp-server.js +5 -5
- package/dist/core/acp-server.js.map +1 -1
- package/dist/core/admin-allowlist.js +5 -5
- package/dist/core/admin-allowlist.js.map +1 -1
- package/dist/core/agent-base.d.ts +1 -1
- package/dist/core/agent-base.js +3 -3
- package/dist/core/agent-base.js.map +1 -1
- package/dist/core/agent-cwd.d.ts +5 -6
- package/dist/core/agent-cwd.d.ts.map +1 -1
- package/dist/core/agent-cwd.js +15 -16
- package/dist/core/agent-cwd.js.map +1 -1
- package/dist/core/agim-paths.d.ts +1 -4
- package/dist/core/agim-paths.d.ts.map +1 -1
- package/dist/core/agim-paths.js +18 -35
- package/dist/core/agim-paths.js.map +1 -1
- package/dist/core/approval-bus.d.ts +4 -4
- package/dist/core/approval-bus.d.ts.map +1 -1
- package/dist/core/approval-bus.js +14 -14
- package/dist/core/approval-bus.js.map +1 -1
- package/dist/core/approval-router.js +2 -2
- package/dist/core/artifacts.js +3 -3
- package/dist/core/artifacts.js.map +1 -1
- package/dist/core/ask-user-rpc.js +1 -1
- package/dist/core/ask-user-rpc.js.map +1 -1
- package/dist/core/audit-log.js +2 -2
- package/dist/core/audit-log.js.map +1 -1
- package/dist/core/bgjob-reader.d.ts +1 -1
- package/dist/core/bgjob-reader.js +4 -4
- package/dist/core/bgjob-reader.js.map +1 -1
- package/dist/core/commands/approval.js +2 -2
- package/dist/core/commands/approval.js.map +1 -1
- package/dist/core/commands/heartbeat.js +2 -2
- package/dist/core/commands/heartbeat.js.map +1 -1
- package/dist/core/commands/memo.js +1 -1
- package/dist/core/commands/memo.js.map +1 -1
- package/dist/core/commands/model.js +1 -1
- package/dist/core/commands/model.js.map +1 -1
- package/dist/core/commands/plan.js +3 -3
- package/dist/core/commands/plan.js.map +1 -1
- package/dist/core/commands/router-compare.js +3 -3
- package/dist/core/commands/router-compare.js.map +1 -1
- package/dist/core/commands/service.d.ts.map +1 -1
- package/dist/core/commands/service.js +1 -3
- package/dist/core/commands/service.js.map +1 -1
- package/dist/core/commands/sessions.js +4 -4
- package/dist/core/commands/sessions.js.map +1 -1
- package/dist/core/commands/skill.js +1 -1
- package/dist/core/commands/skill.js.map +1 -1
- package/dist/core/commands/stats.js +1 -1
- package/dist/core/commands/stats.js.map +1 -1
- package/dist/core/commands/web.js +5 -5
- package/dist/core/commands/web.js.map +1 -1
- package/dist/core/config-schema.js +1 -1
- package/dist/core/coord-systems.d.ts +1 -1
- package/dist/core/coord-systems.js +4 -4
- package/dist/core/coord-systems.js.map +1 -1
- package/dist/core/event-bus.d.ts +5 -5
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +3 -3
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/feature-flags.d.ts +2 -2
- package/dist/core/feature-flags.js +4 -4
- package/dist/core/feature-flags.js.map +1 -1
- package/dist/core/goal-rpc.js +2 -2
- package/dist/core/goal-rpc.js.map +1 -1
- package/dist/core/goals.d.ts +1 -1
- package/dist/core/goals.js +3 -3
- package/dist/core/goals.js.map +1 -1
- package/dist/core/heartbeat-store.d.ts +1 -1
- package/dist/core/heartbeat-store.d.ts.map +1 -1
- package/dist/core/heartbeat-store.js +3 -3
- package/dist/core/heartbeat-store.js.map +1 -1
- package/dist/core/heartbeat.js +4 -4
- package/dist/core/heartbeat.js.map +1 -1
- package/dist/core/intent-llm.d.ts +2 -2
- package/dist/core/intent-llm.js +5 -5
- package/dist/core/intent-llm.js.map +1 -1
- package/dist/core/job-board.d.ts +5 -5
- package/dist/core/job-board.d.ts.map +1 -1
- package/dist/core/job-board.js +17 -17
- package/dist/core/job-board.js.map +1 -1
- package/dist/core/llm/agent-loop.d.ts +3 -3
- package/dist/core/llm/agent-loop.js +14 -14
- package/dist/core/llm/agent-loop.js.map +1 -1
- package/dist/core/llm/{imhub-dispatcher.d.ts → agim-dispatcher.d.ts} +4 -4
- package/dist/core/llm/agim-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/{imhub-dispatcher.js → agim-dispatcher.js} +43 -43
- package/dist/core/llm/agim-dispatcher.js.map +1 -0
- package/dist/core/llm/agim-rpc-server.js +17 -17
- package/dist/core/llm/agim-rpc-server.js.map +1 -1
- package/dist/core/llm/auto-compact.d.ts +3 -3
- package/dist/core/llm/auto-compact.d.ts.map +1 -1
- package/dist/core/llm/auto-compact.js +5 -5
- package/dist/core/llm/auto-compact.js.map +1 -1
- package/dist/core/llm/builtin-dispatcher.js +3 -3
- package/dist/core/llm/builtin-dispatcher.js.map +1 -1
- package/dist/core/llm/exec-dispatcher.d.ts +2 -2
- package/dist/core/llm/exec-dispatcher.d.ts.map +1 -1
- package/dist/core/llm/exec-dispatcher.js +20 -22
- package/dist/core/llm/exec-dispatcher.js.map +1 -1
- package/dist/core/llm/fs-dispatcher.js +8 -8
- package/dist/core/llm/fs-dispatcher.js.map +1 -1
- package/dist/core/llm/goal-critic.js +4 -4
- package/dist/core/llm/goal-critic.js.map +1 -1
- package/dist/core/llm/hallucination-detector.js +2 -2
- package/dist/core/llm/hallucination-detector.js.map +1 -1
- package/dist/core/llm/mcp-client.d.ts +1 -1
- package/dist/core/llm/mcp-client.js +3 -3
- package/dist/core/llm/mcp-client.js.map +1 -1
- package/dist/core/llm/mcp-registry.js +3 -3
- package/dist/core/llm/mcp-registry.js.map +1 -1
- package/dist/core/llm/openai-compat-provider.d.ts +1 -1
- package/dist/core/llm/openai-compat-provider.js +2 -2
- package/dist/core/llm/openai-compat-provider.js.map +1 -1
- package/dist/core/llm/provider-base.d.ts +1 -1
- package/dist/core/llm/secrets.d.ts +2 -2
- package/dist/core/llm/secrets.d.ts.map +1 -1
- package/dist/core/llm/tool-dispatcher.d.ts +1 -1
- package/dist/core/llm/web-dispatcher.d.ts +1 -1
- package/dist/core/llm/web-dispatcher.js +15 -15
- package/dist/core/llm/web-dispatcher.js.map +1 -1
- package/dist/core/logger.d.ts +1 -1
- package/dist/core/logger.js +3 -3
- package/dist/core/logger.js.map +1 -1
- package/dist/core/memo-rpc.js +3 -3
- package/dist/core/memo-rpc.js.map +1 -1
- package/dist/core/memory-consolidate.js +4 -4
- package/dist/core/memory-consolidate.js.map +1 -1
- package/dist/core/memory-distill.js +4 -4
- package/dist/core/memory-distill.js.map +1 -1
- package/dist/core/memory-distiller.js +9 -9
- package/dist/core/memory-distiller.js.map +1 -1
- package/dist/core/memory-vector.js +9 -9
- package/dist/core/memory-vector.js.map +1 -1
- package/dist/core/memory.js +2 -2
- package/dist/core/memory.js.map +1 -1
- package/dist/core/memos.js +6 -6
- package/dist/core/memos.js.map +1 -1
- package/dist/core/message-sink.js +13 -13
- package/dist/core/message-sink.js.map +1 -1
- package/dist/core/notification-evaluator.d.ts +2 -2
- package/dist/core/notification-evaluator.js +4 -4
- package/dist/core/notification-evaluator.js.map +1 -1
- package/dist/core/onboarding.js +3 -3
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/outbox.js +2 -2
- package/dist/core/outbox.js.map +1 -1
- package/dist/core/persona.d.ts +1 -1
- package/dist/core/persona.d.ts.map +1 -1
- package/dist/core/persona.js +2 -2
- package/dist/core/persona.js.map +1 -1
- package/dist/core/plan-history.js +1 -1
- package/dist/core/plan-history.js.map +1 -1
- package/dist/core/plan-intent.js +5 -5
- package/dist/core/plan-intent.js.map +1 -1
- package/dist/core/plan-mode-state.d.ts +1 -1
- package/dist/core/plan-mode-state.js +4 -4
- package/dist/core/plan-mode-state.js.map +1 -1
- package/dist/core/push-rpc.d.ts +1 -1
- package/dist/core/push-rpc.js +6 -6
- package/dist/core/push-rpc.js.map +1 -1
- package/dist/core/registry.d.ts +4 -4
- package/dist/core/registry.js +10 -10
- package/dist/core/registry.js.map +1 -1
- package/dist/core/reminders.js +1 -1
- package/dist/core/reminders.js.map +1 -1
- package/dist/core/restart-flow.d.ts.map +1 -1
- package/dist/core/restart-flow.js +5 -7
- package/dist/core/restart-flow.js.map +1 -1
- package/dist/core/router.d.ts +1 -1
- package/dist/core/router.js +5 -5
- package/dist/core/router.js.map +1 -1
- package/dist/core/schedule.d.ts +2 -2
- package/dist/core/schedule.js +4 -4
- package/dist/core/schedule.js.map +1 -1
- package/dist/core/self-protect.js +3 -3
- package/dist/core/self-protect.js.map +1 -1
- package/dist/core/sender-allowlist.js +7 -7
- package/dist/core/sender-allowlist.js.map +1 -1
- package/dist/core/sensitive-paths.d.ts.map +1 -1
- package/dist/core/sensitive-paths.js +1 -2
- package/dist/core/sensitive-paths.js.map +1 -1
- package/dist/core/session.js +2 -2
- package/dist/core/session.js.map +1 -1
- package/dist/core/skills/builtin/ECC_NOTICE.md +1 -1
- package/dist/core/skills/builtin/agim-memory/SKILL.md +1 -1
- package/dist/core/skills/builtin/agim-reminders/SKILL.md +2 -2
- package/dist/core/skills/builtin/agim-self/SKILL.md +9 -9
- package/dist/core/skills/builtin/agim-skill-discovery/SKILL.md +5 -5
- package/dist/core/skills/builtin/image-generation/SKILL.md +2 -2
- package/dist/core/skills/builtin/long-goal/SKILL.md +7 -7
- package/dist/core/skills/builtin/my/SKILL.md +2 -2
- package/dist/core/skills/builtin/skill-creator/SKILL.md +2 -2
- package/dist/core/skills/loader.d.ts +4 -4
- package/dist/core/skills/loader.js +22 -22
- package/dist/core/skills/loader.js.map +1 -1
- package/dist/core/skills-rpc.js +1 -1
- package/dist/core/skills-rpc.js.map +1 -1
- package/dist/core/transcribe.js +13 -13
- package/dist/core/transcribe.js.map +1 -1
- package/dist/core/tunnel.js +1 -1
- package/dist/core/tunnel.js.map +1 -1
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/user-coord-prefs.js +1 -1
- package/dist/core/user-coord-prefs.js.map +1 -1
- package/dist/core/viewer-config.d.ts +8 -8
- package/dist/core/viewer-config.js +17 -17
- package/dist/core/viewer-config.js.map +1 -1
- package/dist/core/viewer-local.js +4 -4
- package/dist/core/viewer-local.js.map +1 -1
- package/dist/core/viewer-remote.js +1 -1
- package/dist/core/viewer-remote.js.map +1 -1
- package/dist/plugins/agents/acp/url-guard.d.ts +1 -1
- package/dist/plugins/agents/acp/url-guard.js +2 -2
- package/dist/plugins/agents/acp/url-guard.js.map +1 -1
- package/dist/plugins/agents/antigravity/ensure-mcp-config.d.ts +6 -6
- package/dist/plugins/agents/antigravity/ensure-mcp-config.d.ts.map +1 -1
- package/dist/plugins/agents/antigravity/ensure-mcp-config.js +12 -12
- package/dist/plugins/agents/antigravity/ensure-mcp-config.js.map +1 -1
- package/dist/plugins/agents/antigravity/index.js +10 -10
- package/dist/plugins/agents/antigravity/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/index.d.ts +2 -2
- package/dist/plugins/agents/claude-code/index.js +16 -16
- package/dist/plugins/agents/claude-code/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +13 -13
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
- package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts +4 -4
- package/dist/plugins/agents/codex/build-mcp-cli-args.js +14 -14
- package/dist/plugins/agents/codex/build-mcp-cli-args.js.map +1 -1
- package/dist/plugins/agents/codex/index.d.ts +3 -3
- package/dist/plugins/agents/codex/index.js +14 -14
- package/dist/plugins/agents/codex/index.js.map +1 -1
- package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +5 -5
- package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -1
- package/dist/plugins/agents/cursor/ensure-mcp-config.js +11 -11
- package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -1
- package/dist/plugins/agents/cursor/index.d.ts +1 -1
- package/dist/plugins/agents/cursor/index.js +12 -12
- package/dist/plugins/agents/cursor/index.js.map +1 -1
- package/dist/plugins/agents/native/index.js +14 -14
- package/dist/plugins/agents/native/index.js.map +1 -1
- package/dist/plugins/agents/native/tool-registry.d.ts +3 -3
- package/dist/plugins/agents/native/tool-registry.d.ts.map +1 -1
- package/dist/plugins/agents/native/tool-registry.js +5 -5
- package/dist/plugins/agents/native/tool-registry.js.map +1 -1
- package/dist/plugins/agents/opencode/ensure-mcp-config.d.ts +1 -1
- package/dist/plugins/agents/opencode/ensure-mcp-config.js +9 -9
- package/dist/plugins/agents/opencode/ensure-mcp-config.js.map +1 -1
- package/dist/plugins/agents/opencode/index.js +3 -3
- package/dist/plugins/agents/opencode/index.js.map +1 -1
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +4 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-http-adapter.js +16 -12
- package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +2 -2
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +7 -5
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
- package/dist/plugins/agents/opencode/serve-manager.d.ts +1 -1
- package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/serve-manager.js +10 -10
- package/dist/plugins/agents/opencode/serve-manager.js.map +1 -1
- package/dist/plugins/agents/pi-native/factory.js +10 -10
- package/dist/plugins/agents/pi-native/factory.js.map +1 -1
- package/dist/plugins/agents/pi-native/index.d.ts +3 -3
- package/dist/plugins/agents/pi-native/index.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/index.js +2 -2
- package/dist/plugins/agents/pi-native/index.js.map +1 -1
- package/dist/plugins/agents/pi-native/tool-bridge.js +1 -1
- package/dist/plugins/agents/pi-native/tool-bridge.js.map +1 -1
- package/dist/plugins/agents/pi-native/tools.js +4 -4
- package/dist/plugins/agents/pi-native/tools.js.map +1 -1
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts +1 -1
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js +2 -2
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js.map +1 -1
- package/dist/plugins/messengers/email/email-adapter.js +15 -15
- package/dist/plugins/messengers/email/email-adapter.js.map +1 -1
- package/dist/plugins/messengers/telegram/media-download.d.ts +1 -1
- package/dist/plugins/messengers/telegram/media-download.js +4 -4
- package/dist/plugins/messengers/telegram/media-download.js.map +1 -1
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +1 -1
- package/dist/plugins/messengers/telegram/telegram-adapter.js +3 -3
- package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/context-store.js +1 -1
- package/dist/plugins/messengers/wechat/context-store.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-client.js +1 -1
- package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -1
- package/dist/plugins/messengers/wechat/media-download.js +1 -1
- package/dist/plugins/messengers/wechat/media-download.js.map +1 -1
- package/dist/scripts/migrate-gcj02-to-wgs84.js +1 -1
- package/dist/scripts/migrate-gcj02-to-wgs84.js.map +1 -1
- package/dist/web/public/assets/{a2a-CZxwvgvh.js → a2a-D7MoJ1iT.js} +2 -2
- package/dist/web/public/assets/{a2a-CZxwvgvh.js.map → a2a-D7MoJ1iT.js.map} +1 -1
- package/dist/web/public/assets/{activity-BnlFGipw.js → activity-BAgb2WZC.js} +2 -2
- package/dist/web/public/assets/{activity-BnlFGipw.js.map → activity-BAgb2WZC.js.map} +1 -1
- package/dist/web/public/assets/{admins-CH84Rw1d.js → admins-CZYANmhn.js} +2 -2
- package/dist/web/public/assets/{admins-CH84Rw1d.js.map → admins-CZYANmhn.js.map} +1 -1
- package/dist/web/public/assets/{agents-CFB4Uj6b.js → agents-BXThDW6f.js} +2 -2
- package/dist/web/public/assets/agents-BXThDW6f.js.map +1 -0
- package/dist/web/public/assets/{approvals-DnzjbDR6.js → approvals-ByPXIYVl.js} +2 -2
- package/dist/web/public/assets/{approvals-DnzjbDR6.js.map → approvals-ByPXIYVl.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-DxlRHrs8.js → arrow-down-B8DkdbEY.js} +2 -2
- package/dist/web/public/assets/{arrow-down-DxlRHrs8.js.map → arrow-down-B8DkdbEY.js.map} +1 -1
- package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js → arrow-up-i_dEdXkz.js} +2 -2
- package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js.map → arrow-up-i_dEdXkz.js.map} +1 -1
- package/dist/web/public/assets/{asks-DyUQopay.js → asks-yD_inOnM.js} +2 -2
- package/dist/web/public/assets/{asks-DyUQopay.js.map → asks-yD_inOnM.js.map} +1 -1
- package/dist/web/public/assets/{audit-BVHTMS82.js → audit-teCIRtgN.js} +2 -2
- package/dist/web/public/assets/{audit-BVHTMS82.js.map → audit-teCIRtgN.js.map} +1 -1
- package/dist/web/public/assets/{bell-D7iS7ctN.js → bell-CeWDMs8_.js} +2 -2
- package/dist/web/public/assets/{bell-D7iS7ctN.js.map → bell-CeWDMs8_.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-BYCQhd_1.js → bgjobs-Rc05aEy9.js} +2 -2
- package/dist/web/public/assets/bgjobs-Rc05aEy9.js.map +1 -0
- package/dist/web/public/assets/{brain-CCF25Egu.js → brain-BQqv0Zhc.js} +2 -2
- package/dist/web/public/assets/{brain-CCF25Egu.js.map → brain-BQqv0Zhc.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-BMLMD8nM.js → briefcase-DUXbR4xs.js} +2 -2
- package/dist/web/public/assets/{briefcase-BMLMD8nM.js.map → briefcase-DUXbR4xs.js.map} +1 -1
- package/dist/web/public/assets/{chat-DPkKy5y_.js → chat-DQpQLW9j.js} +2 -2
- package/dist/web/public/assets/{chat-DPkKy5y_.js.map → chat-DQpQLW9j.js.map} +1 -1
- package/dist/web/public/assets/{chevron-left-BDO3vw8G.js → chevron-left-RC6mMSiX.js} +2 -2
- package/dist/web/public/assets/{chevron-left-BDO3vw8G.js.map → chevron-left-RC6mMSiX.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-5ZUC2opg.js → chevron-right-DrkYVi19.js} +2 -2
- package/dist/web/public/assets/{chevron-right-5ZUC2opg.js.map → chevron-right-DrkYVi19.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-COhM5JsK.js → circle-check-DZnkaUdk.js} +2 -2
- package/dist/web/public/assets/{circle-check-COhM5JsK.js.map → circle-check-DZnkaUdk.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js → circle-check-big-BC8ntMsz.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js.map → circle-check-big-BC8ntMsz.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-7VaoZ7dY.js → circle-x-DHK7ypFY.js} +2 -2
- package/dist/web/public/assets/{circle-x-7VaoZ7dY.js.map → circle-x-DHK7ypFY.js.map} +1 -1
- package/dist/web/public/assets/{clock-ZPVXnd6V.js → clock-DXHhWqJH.js} +2 -2
- package/dist/web/public/assets/{clock-ZPVXnd6V.js.map → clock-DXHhWqJH.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-CgpJL9oN.js → confirm-dialog-gPKJnvEW.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-CgpJL9oN.js.map → confirm-dialog-gPKJnvEW.js.map} +1 -1
- package/dist/web/public/assets/{copy-BaZl52tH.js → copy-DtQxgcR0.js} +2 -2
- package/dist/web/public/assets/{copy-BaZl52tH.js.map → copy-DtQxgcR0.js.map} +1 -1
- package/dist/web/public/assets/{data-table-BLYG79TX.js → data-table-DOKUic1J.js} +2 -2
- package/dist/web/public/assets/{data-table-BLYG79TX.js.map → data-table-DOKUic1J.js.map} +1 -1
- package/dist/web/public/assets/distill-p6P7-1UR.js +7 -0
- package/dist/web/public/assets/distill-p6P7-1UR.js.map +1 -0
- package/dist/web/public/assets/{download-bzCepctg.js → download-CqNiIHa8.js} +2 -2
- package/dist/web/public/assets/{download-bzCepctg.js.map → download-CqNiIHa8.js.map} +1 -1
- package/dist/web/public/assets/email-DwbfTUlV.js +7 -0
- package/dist/web/public/assets/email-DwbfTUlV.js.map +1 -0
- package/dist/web/public/assets/{empty-state-96qpPTNg.js → empty-state-CTwOQemt.js} +2 -2
- package/dist/web/public/assets/{empty-state-96qpPTNg.js.map → empty-state-CTwOQemt.js.map} +1 -1
- package/dist/web/public/assets/{external-link-J4nIlCem.js → external-link-BY7Ye8yi.js} +2 -2
- package/dist/web/public/assets/{external-link-J4nIlCem.js.map → external-link-BY7Ye8yi.js.map} +1 -1
- package/dist/web/public/assets/{eye-BvsBLK42.js → eye-6RUADoDS.js} +2 -2
- package/dist/web/public/assets/{eye-BvsBLK42.js.map → eye-6RUADoDS.js.map} +1 -1
- package/dist/web/public/assets/{facts-DMucDXYd.js → facts-DXE0aJmb.js} +2 -2
- package/dist/web/public/assets/{facts-DMucDXYd.js.map → facts-DXE0aJmb.js.map} +1 -1
- package/dist/web/public/assets/{goals-B9ETHgL0.js → goals-C1LCm3qL.js} +2 -2
- package/dist/web/public/assets/{goals-B9ETHgL0.js.map → goals-C1LCm3qL.js.map} +1 -1
- package/dist/web/public/assets/{health-DLzZ7KHc.js → health-wqCp-K_o.js} +2 -2
- package/dist/web/public/assets/{health-DLzZ7KHc.js.map → health-wqCp-K_o.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js → heart-pulse-DfqI4GF7.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js.map → heart-pulse-DfqI4GF7.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-B1BEBHge.js → heartbeat-Bumv4XtQ.js} +2 -2
- package/dist/web/public/assets/{heartbeat-B1BEBHge.js.map → heartbeat-Bumv4XtQ.js.map} +1 -1
- package/dist/web/public/assets/{hot-Yc7iad0D.js → hot-B-CMjQIr.js} +2 -2
- package/dist/web/public/assets/{hot-Yc7iad0D.js.map → hot-B-CMjQIr.js.map} +1 -1
- package/dist/web/public/assets/{index-DY2Zglku.js → index-DHh1LYlA.js} +29 -29
- package/dist/web/public/assets/{index-DY2Zglku.js.map → index-DHh1LYlA.js.map} +1 -1
- package/dist/web/public/assets/{injection-Ca-9gbo0.js → injection-Dn_XqgLG.js} +2 -2
- package/dist/web/public/assets/{injection-Ca-9gbo0.js.map → injection-Dn_XqgLG.js.map} +1 -1
- package/dist/web/public/assets/{installed-Zz34apdi.js → installed-Cet-1M2Q.js} +2 -2
- package/dist/web/public/assets/{installed-Zz34apdi.js.map → installed-Cet-1M2Q.js.map} +1 -1
- package/dist/web/public/assets/{jobs-CtVRpl0r.js → jobs-CfEzOOAC.js} +2 -2
- package/dist/web/public/assets/{jobs-CtVRpl0r.js.map → jobs-CfEzOOAC.js.map} +1 -1
- package/dist/web/public/assets/{layout-DnANw2Q2.js → layout-BX43KyXM.js} +2 -2
- package/dist/web/public/assets/{layout-DnANw2Q2.js.map → layout-BX43KyXM.js.map} +1 -1
- package/dist/web/public/assets/{layout-Cxch59sI.js → layout-BcYZlaqf.js} +2 -2
- package/dist/web/public/assets/{layout-Cxch59sI.js.map → layout-BcYZlaqf.js.map} +1 -1
- package/dist/web/public/assets/{layout-BTCLgkgN.js → layout-Cb7looUv.js} +2 -2
- package/dist/web/public/assets/{layout-BTCLgkgN.js.map → layout-Cb7looUv.js.map} +1 -1
- package/dist/web/public/assets/{layout-yIZG87fq.js → layout-D7xH78OU.js} +2 -2
- package/dist/web/public/assets/{layout-yIZG87fq.js.map → layout-D7xH78OU.js.map} +1 -1
- package/dist/web/public/assets/{layout-CtDc2i7w.js → layout-D_3ZcVG7.js} +2 -2
- package/dist/web/public/assets/{layout-CtDc2i7w.js.map → layout-D_3ZcVG7.js.map} +1 -1
- package/dist/web/public/assets/llm-BZ9qqp-D.js +27 -0
- package/dist/web/public/assets/llm-BZ9qqp-D.js.map +1 -0
- package/dist/web/public/assets/{loader-circle-D8L1w9c1.js → loader-circle-DgdBWYl0.js} +2 -2
- package/dist/web/public/assets/{loader-circle-D8L1w9c1.js.map → loader-circle-DgdBWYl0.js.map} +1 -1
- package/dist/web/public/assets/{map-pin--GMunU9n.js → map-pin-3QS1A0-I.js} +2 -2
- package/dist/web/public/assets/{map-pin--GMunU9n.js.map → map-pin-3QS1A0-I.js.map} +1 -1
- package/dist/web/public/assets/{mcp-DhnXhO9B.js → mcp-DwKZULET.js} +2 -2
- package/dist/web/public/assets/{mcp-DhnXhO9B.js.map → mcp-DwKZULET.js.map} +1 -1
- package/dist/web/public/assets/{memos-DQZc7llR.js → memos-BBtqFcoH.js} +2 -2
- package/dist/web/public/assets/{memos-DQZc7llR.js.map → memos-BBtqFcoH.js.map} +1 -1
- package/dist/web/public/assets/{messengers-DwSmauLs.js → messengers-i7WvNT3o.js} +2 -2
- package/dist/web/public/assets/messengers-i7WvNT3o.js.map +1 -0
- package/dist/web/public/assets/{mobile-CUZ359rQ.js → mobile-Bq0FH9JV.js} +2 -2
- package/dist/web/public/assets/{mobile-CUZ359rQ.js.map → mobile-Bq0FH9JV.js.map} +1 -1
- package/dist/web/public/assets/{network-BBdRdrH_.js → network--s113Jkm.js} +2 -2
- package/dist/web/public/assets/{network-BBdRdrH_.js.map → network--s113Jkm.js.map} +1 -1
- package/dist/web/public/assets/{outbox-CmN0U35l.js → outbox-BbfC5kuG.js} +2 -2
- package/dist/web/public/assets/{outbox-CmN0U35l.js.map → outbox-BbfC5kuG.js.map} +1 -1
- package/dist/web/public/assets/{pagination-DcsgDXXM.js → pagination-DkdCTctJ.js} +2 -2
- package/dist/web/public/assets/{pagination-DcsgDXXM.js.map → pagination-DkdCTctJ.js.map} +1 -1
- package/dist/web/public/assets/{persona-ig2ac4mY.js → persona-BvtcZh6G.js} +2 -2
- package/dist/web/public/assets/{persona-ig2ac4mY.js.map → persona-BvtcZh6G.js.map} +1 -1
- package/dist/web/public/assets/{plans-Bzbk8eUr.js → plans-i3a6lrqF.js} +2 -2
- package/dist/web/public/assets/{plans-Bzbk8eUr.js.map → plans-i3a6lrqF.js.map} +1 -1
- package/dist/web/public/assets/{play-Di1jqulh.js → play-CPoE_JnS.js} +2 -2
- package/dist/web/public/assets/{play-Di1jqulh.js.map → play-CPoE_JnS.js.map} +1 -1
- package/dist/web/public/assets/{plus-C2zyJ1mF.js → plus-CfzKV_0u.js} +2 -2
- package/dist/web/public/assets/{plus-C2zyJ1mF.js.map → plus-CfzKV_0u.js.map} +1 -1
- package/dist/web/public/assets/policy-Cm88P8LO.js +2 -0
- package/dist/web/public/assets/policy-Cm88P8LO.js.map +1 -0
- package/dist/web/public/assets/{qr-code-C-ACsKv_.js → qr-code-DMkV8nv2.js} +2 -2
- package/dist/web/public/assets/{qr-code-C-ACsKv_.js.map → qr-code-DMkV8nv2.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js → refresh-ccw-nBMm5Xal.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js.map → refresh-ccw-nBMm5Xal.js.map} +1 -1
- package/dist/web/public/assets/{reminders-BDeiVYTC.js → reminders-DjEujanC.js} +2 -2
- package/dist/web/public/assets/{reminders-BDeiVYTC.js.map → reminders-DjEujanC.js.map} +1 -1
- package/dist/web/public/assets/{save-BYFmz9gD.js → save-DbrrCFDM.js} +2 -2
- package/dist/web/public/assets/{save-BYFmz9gD.js.map → save-DbrrCFDM.js.map} +1 -1
- package/dist/web/public/assets/{schedules-BddzBrxI.js → schedules-DzwDWykc.js} +2 -2
- package/dist/web/public/assets/{schedules-BddzBrxI.js.map → schedules-DzwDWykc.js.map} +1 -1
- package/dist/web/public/assets/search-5q3dkINm.js +17 -0
- package/dist/web/public/assets/search-5q3dkINm.js.map +1 -0
- package/dist/web/public/assets/{search-DxkvV-8p.js → search-DbE4VEm9.js} +2 -2
- package/dist/web/public/assets/{search-DxkvV-8p.js.map → search-DbE4VEm9.js.map} +1 -1
- package/dist/web/public/assets/security-BIcnUrAs.js +2 -0
- package/dist/web/public/assets/security-BIcnUrAs.js.map +1 -0
- package/dist/web/public/assets/{service-BsY8CaNG.js → service-CnorFHzZ.js} +2 -2
- package/dist/web/public/assets/{service-BsY8CaNG.js.map → service-CnorFHzZ.js.map} +1 -1
- package/dist/web/public/assets/{shield-alert-DXGk9Rak.js → shield-alert-WOa69jy3.js} +2 -2
- package/dist/web/public/assets/{shield-alert-DXGk9Rak.js.map → shield-alert-WOa69jy3.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-D0nbFSom.js → status-badge-D5xhwquL.js} +2 -2
- package/dist/web/public/assets/{status-badge-D0nbFSom.js.map → status-badge-D5xhwquL.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-DFiAXvDp.js → subtasks-DMRyk6YS.js} +2 -2
- package/dist/web/public/assets/{subtasks-DFiAXvDp.js.map → subtasks-DMRyk6YS.js.map} +1 -1
- package/dist/web/public/assets/{table-_WsrnZ_T.js → table-Dx65w6V0.js} +2 -2
- package/dist/web/public/assets/{table-_WsrnZ_T.js.map → table-Dx65w6V0.js.map} +1 -1
- package/dist/web/public/assets/{topn-C2PHE4tX.js → topn-L7Juczp3.js} +2 -2
- package/dist/web/public/assets/{topn-C2PHE4tX.js.map → topn-L7Juczp3.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-1Km439fW.js → trash-2-7xrfqd-v.js} +2 -2
- package/dist/web/public/assets/{trash-2-1Km439fW.js.map → trash-2-7xrfqd-v.js.map} +1 -1
- package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js → use-agim-skills-pFjfgqMF.js} +2 -2
- package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js.map → use-agim-skills-pFjfgqMF.js.map} +1 -1
- package/dist/web/public/assets/{use-background-tasks-wCL7jn68.js → use-background-tasks-D1--hHjp.js} +2 -2
- package/dist/web/public/assets/{use-background-tasks-wCL7jn68.js.map → use-background-tasks-D1--hHjp.js.map} +1 -1
- package/dist/web/public/assets/{use-memory-B9oRyQC8.js → use-memory-Bz1Zao7g.js} +2 -2
- package/dist/web/public/assets/{use-memory-B9oRyQC8.js.map → use-memory-Bz1Zao7g.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-DGkN80qa.js → use-observability-DtqSWVjM.js} +2 -2
- package/dist/web/public/assets/{use-observability-DGkN80qa.js.map → use-observability-DtqSWVjM.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-Co-iafXD.js → use-settings-DKbDqCEJ.js} +2 -2
- package/dist/web/public/assets/{use-settings-Co-iafXD.js.map → use-settings-DKbDqCEJ.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-BDXP5XO1.js → use-workspace-CConjEx0.js} +2 -2
- package/dist/web/public/assets/{use-workspace-BDXP5XO1.js.map → use-workspace-CConjEx0.js.map} +1 -1
- package/dist/web/public/assets/vector-D8sEa2W-.js +2 -0
- package/dist/web/public/assets/vector-D8sEa2W-.js.map +1 -0
- package/dist/web/public/assets/viewer-aSIjAKVA.js +12 -0
- package/dist/web/public/assets/viewer-aSIjAKVA.js.map +1 -0
- package/dist/web/public/assets/{workspace-BbCchiHE.js → workspace-BqwWoinI.js} +2 -2
- package/dist/web/public/assets/{workspace-BbCchiHE.js.map → workspace-BqwWoinI.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-5HE7pjdA.js → workspaces-ChsJcrav.js} +2 -2
- package/dist/web/public/assets/{workspaces-5HE7pjdA.js.map → workspaces-ChsJcrav.js.map} +1 -1
- package/dist/web/public/index.html +1 -1
- package/dist/web/public/loc.html +1 -1
- package/dist/web/public/login.html +2 -2
- package/dist/web/server.d.ts +2 -2
- package/dist/web/server.js +118 -119
- package/dist/web/server.js.map +1 -1
- package/package.json +2 -3
- package/dist/core/llm/imhub-dispatcher.d.ts.map +0 -1
- package/dist/core/llm/imhub-dispatcher.js.map +0 -1
- package/dist/web/public/assets/agents-CFB4Uj6b.js.map +0 -1
- package/dist/web/public/assets/bgjobs-BYCQhd_1.js.map +0 -1
- package/dist/web/public/assets/distill-D9p8O8Jf.js +0 -7
- package/dist/web/public/assets/distill-D9p8O8Jf.js.map +0 -1
- package/dist/web/public/assets/email-Douv-rZ5.js +0 -7
- package/dist/web/public/assets/email-Douv-rZ5.js.map +0 -1
- package/dist/web/public/assets/llm-CMMa85Ig.js +0 -27
- package/dist/web/public/assets/llm-CMMa85Ig.js.map +0 -1
- package/dist/web/public/assets/messengers-DwSmauLs.js.map +0 -1
- package/dist/web/public/assets/policy-yD1c2Pcn.js +0 -2
- package/dist/web/public/assets/policy-yD1c2Pcn.js.map +0 -1
- package/dist/web/public/assets/search-B8PlbtLg.js +0 -17
- package/dist/web/public/assets/search-B8PlbtLg.js.map +0 -1
- package/dist/web/public/assets/security-DpOGp3nS.js +0 -2
- package/dist/web/public/assets/security-DpOGp3nS.js.map +0 -1
- package/dist/web/public/assets/vector-BfIEx8xX.js +0 -2
- package/dist/web/public/assets/vector-BfIEx8xX.js.map +0 -1
- package/dist/web/public/assets/viewer-BPMZkT05.js +0 -12
- package/dist/web/public/assets/viewer-BPMZkT05.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agim-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Agim (阿吉姆) — universal messenger-to-agent bridge. Connect WeChat / Feishu / DingTalk / Email to Claude Code / Codex / OpenCode, or any custom agent via ACP. Installs the `agim` command.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"agim": "
|
|
8
|
-
"im-hub-pro": "./dist/cli.js"
|
|
7
|
+
"agim": "dist/cli.js"
|
|
9
8
|
},
|
|
10
9
|
"main": "./dist/index.js",
|
|
11
10
|
"types": "./dist/index.d.ts",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"imhub-dispatcher.d.ts","sourceRoot":"","sources":["../../../src/core/llm/imhub-dispatcher.ts"],"names":[],"mappings":"AAoCA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,sBAAsB,CAAA;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AA8BjD;;iBAEiB;AACjB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAA;IACnB,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,UAAU,CAAA;IAC1B,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;6EAGyE;IACzE,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;gCAI4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;mDAKmD;AACnD,wBAAgB,wBAAwB,IAAI,MAAM,CAMjD;AAED;;;wDAGwD;AACxD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG7D;AASD;;;qCAGqC;AACrC,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,MAAM,CAmCR;AA4BD;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,OAAO,EAAE,CA2PzC;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,GAAG,cAAc,CA8X5E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"imhub-dispatcher.js","sourceRoot":"","sources":["../../../src/core/llm/imhub-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents-CFB4Uj6b.js","sources":["../../node_modules/lucide-react/dist/esm/icons/bot.js","../../src/routes/settings/agents.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Bot = createLucideIcon(\"Bot\", [\n [\"path\", { d: \"M12 8V4H8\", key: \"hb8ula\" }],\n [\"rect\", { width: \"16\", height: \"12\", x: \"4\", y: \"8\", rx: \"2\", key: \"enze0r\" }],\n [\"path\", { d: \"M2 14h2\", key: \"vft8re\" }],\n [\"path\", { d: \"M20 14h2\", key: \"4cs60a\" }],\n [\"path\", { d: \"M15 13v2\", key: \"1xurst\" }],\n [\"path\", { d: \"M9 13v2\", key: \"rq6x2g\" }]\n]);\n\nexport { Bot as default };\n//# sourceMappingURL=bot.js.map\n","/**\n * /settings/agents — built-in adapters + remote (ACP) agents.\n *\n * Two cards on one page:\n * 1. Built-in adapters (claude-code / codex / opencode):\n * enable/disable + default-agent picker. Mirrors v1's \"Agents\".\n * 2. Remote (ACP) agents: name/endpoint/auth-type table + manual\n * add form. Mirrors v1's \"Remote Agents (ACP)\" card. Discover\n * via `<baseUrl>/.well-known/acp` is available as a secondary\n * bulk-import form.\n *\n * Both cards share one save bar — PUT /api/config writes `agents[]`,\n * `defaultAgent`, and `acpAgents[]` atomically so the default never\n * goes out of sync with the enabled list, and partial ACP edits\n * don't ship without the user's intent.\n *\n * Masked tokens: GET returns `ab****yz` for ACP auth.token; PUT\n * detects this pattern and preserves the on-disk value so we never\n * overwrite a real token with its mask. New tokens (typed into the\n * add form or \"edit\" inline) flow through verbatim.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n Bot, Loader2, Network, Plus, RefreshCcw, Save, Search, Trash2, X,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { useAgentsStatus } from '@/hooks/use-workspace'\nimport {\n useConfig,\n useDiscoverAcp,\n useTestAcp,\n useUpdateConfig,\n} from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport { agentDisplayName } from '@/lib/agent-label'\nimport { cn } from '@/lib/utils'\nimport type { ACPAgentConfig, ACPAuthConfig, ACPAuthType } from '@/types/api'\n\n/** Mirror of v1 settings.html:BUILTIN_AGENTS. Hardcoded because\n * backend doesn't expose this metadata yet; the table changes\n * rarely enough that copying it here is fine.\n *\n * `kind` distinguishes spawn flavor:\n * - 'cli' → external CLI subprocess, needs `npm install -g <pkg>`\n * - 'in-process' → runs inside agim, no install needed; `pkg` carries\n * a one-liner hint instead of an install command. The\n * runtime always exposes it via `isAgentEnabled`\n * regardless of config.agents, so default-picker\n * eligibility ignores the enabled-list constraint. */\nconst BUILTIN_AGENTS: Record<string, {\n aliases: string[]\n pkg: string\n kind: 'cli' | 'in-process'\n scope: 'bridged' | 'agim'\n}> = {\n 'claude-code': { aliases: ['cc', 'claude'], pkg: '@anthropic-ai/claude-code', kind: 'cli', scope: 'bridged' },\n 'codex': { aliases: ['cx'], pkg: '@openai/codex', kind: 'cli', scope: 'bridged' },\n 'opencode': { aliases: ['oc'], pkg: 'opencode-ai', kind: 'cli', scope: 'bridged' },\n 'cursor': { aliases: ['cs', 'cur'], pkg: 'cursor-agent (curl https://cursor.com/install)', kind: 'cli', scope: 'bridged' },\n // v1.2.140 — surface the in-process `native` agent in the admin list.\n // Previously the agent was registered + always-enabled at runtime but\n // hidden from this page, so operators could only reach it via the CLI.\n 'native': { aliases: ['agim', 'na', 'llm', 'native-llm'], pkg: 'in-process', kind: 'in-process', scope: 'agim' },\n}\n\nconst AGENT_NAMES = Object.keys(BUILTIN_AGENTS)\nconst BRIDGED_AGENT_NAMES = AGENT_NAMES.filter((name) => BUILTIN_AGENTS[name]?.scope === 'bridged')\n\nexport default function SettingsAgentsRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const cfgQuery = useConfig()\n const statusQuery = useAgentsStatus()\n const updateCfg = useUpdateConfig()\n\n const cfg = cfgQuery.data\n const status = statusQuery.data ?? {}\n\n /** Local draft so toggles + default-picker + ACP edits can stage\n * changes before a single Save. `null` means \"sync from cfg on\n * next paint\". */\n const [draftEnabled, setDraftEnabled] = useState<string[] | null>(null)\n const [draftDefault, setDraftDefault] = useState<string | null>(null)\n const [draftAcp, setDraftAcp] = useState<ACPAgentConfig[] | null>(null)\n\n useEffect(() => {\n if (cfg && draftEnabled == null) setDraftEnabled(cfg.agents ?? [])\n if (cfg && draftDefault == null) setDraftDefault(cfg.defaultAgent ?? '')\n if (cfg && draftAcp == null) setDraftAcp(cfg.acpAgents ?? [])\n }, [cfg, draftEnabled, draftDefault, draftAcp])\n\n const enabled = draftEnabled ?? cfg?.agents ?? []\n const defaultAgent = draftDefault ?? cfg?.defaultAgent ?? ''\n const acpAgents = draftAcp ?? cfg?.acpAgents ?? []\n\n const isDirty = useMemo(() => {\n if (!cfg) return false\n const enabledSame =\n enabled.length === (cfg.agents?.length ?? 0)\n && enabled.every((a) => cfg.agents?.includes(a))\n const defaultSame = defaultAgent === (cfg.defaultAgent ?? '')\n const acpSame = acpEqual(acpAgents, cfg.acpAgents ?? [])\n return !enabledSame || !defaultSame || !acpSame\n }, [cfg, enabled, defaultAgent, acpAgents])\n\n /** Eligible defaults = installed + enabled. Picker disables when\n * empty (no agent is both).\n *\n * v1.2.140 — in-process agents (e.g. `native`) are exempt from the\n * enabled-list check. Runtime `isAgentEnabled('native')` always\n * returns true regardless of config.agents (see live-config.ts), so\n * the picker should mirror that and not require the user to flip the\n * toggle on first. */\n const eligibleDefaults = useMemo(\n () => AGENT_NAMES.filter((a) => {\n const info = BUILTIN_AGENTS[a]!\n const enabledOrInProcess = info.kind === 'in-process' ? true : enabled.includes(a)\n return enabledOrInProcess && status[a]\n }),\n [enabled, status],\n )\n\n function toggleAgent(name: string, on: boolean): void {\n const next = on\n ? Array.from(new Set([...enabled, name]))\n : enabled.filter((a) => a !== name)\n setDraftEnabled(next)\n // If the default just got disabled, clear it so save doesn't\n // ship an inconsistent pair.\n if (!on && name === defaultAgent) setDraftDefault('')\n }\n\n async function onSave(): Promise<void> {\n if (!cfg) return\n try {\n await updateCfg.mutateAsync({\n ...cfg,\n agents: enabled,\n defaultAgent: defaultAgent || cfg.defaultAgent,\n acpAgents,\n })\n toast.success(t('agents.toast.saved'))\n // Reset drafts so the next paint reads from refreshed cfg.\n setDraftEnabled(null)\n setDraftDefault(null)\n setDraftAcp(null)\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n function onDiscard(): void {\n setDraftEnabled(null)\n setDraftDefault(null)\n setDraftAcp(null)\n }\n\n function updateAcp(next: ACPAgentConfig[]): void {\n setDraftAcp(next)\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('agents.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => {\n void cfgQuery.refetch()\n void statusQuery.refetch()\n }}\n disabled={cfgQuery.isFetching || statusQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {(cfgQuery.isFetching || statusQuery.isFetching)\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('agents.subtitle')}</p>\n </header>\n\n {cfgQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n {/* Agent rows */}\n <div className=\"flex flex-col divide-y divide-border rounded-md border border-border bg-surface\">\n {BRIDGED_AGENT_NAMES.map((name) => {\n const info = BUILTIN_AGENTS[name]!\n const installed = !!status[name]\n const isEnabled = enabled.includes(name)\n return (\n <AgentRow\n key={name}\n displayName={agentDisplayName(name)}\n aliases={info.aliases}\n pkg={info.pkg}\n kind={info.kind}\n installed={installed}\n enabled={isEnabled}\n onToggle={(on) => toggleAgent(name, on)}\n />\n )\n })}\n </div>\n\n <section className=\"rounded-md border border-border bg-surface p-4\">\n <h3 className=\"text-sm font-semibold\">{t('agents.agimAgentCardTitle')}</h3>\n <p className=\"mt-1 text-xs text-text-dim\">{t('agents.agimAgentCardDesc')}</p>\n <Button\n className=\"mt-3\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { window.location.assign('/settings/llm') }}\n >\n {t('agents.agimAgentCardAction')}\n </Button>\n </section>\n\n {/* Default agent picker */}\n <section className=\"rounded-md border border-border bg-surface p-4\">\n <Label htmlFor=\"default-agent\" className=\"text-sm font-medium\">\n {t('agents.defaultAgent')}\n </Label>\n <p className=\"mt-1 text-xs text-text-dim\">{t('agents.defaultAgentHint')}</p>\n <Select\n value={defaultAgent || '__none__'}\n onValueChange={(v) => setDraftDefault(v === '__none__' ? '' : v)}\n disabled={eligibleDefaults.length === 0}\n >\n <SelectTrigger id=\"default-agent\" className=\"mt-2 w-64\">\n <SelectValue placeholder={t('agents.noEligible')} />\n </SelectTrigger>\n <SelectContent>\n {eligibleDefaults.length === 0 ? (\n <SelectItem value=\"__none__\" disabled>{t('agents.noEligible')}</SelectItem>\n ) : (\n eligibleDefaults.map((a) => (\n <SelectItem key={a} value={a}>{agentDisplayName(a)}</SelectItem>\n ))\n )}\n </SelectContent>\n </Select>\n </section>\n\n {/* Remote (ACP) agents — gated by features.remoteAgent\n (IMHUB_ENABLE_REMOTE_AGENT on server). Card is omitted\n entirely; no breadcrumb hint shown. */}\n {cfg?.features?.remoteAgent ? (\n <AcpCard\n agents={acpAgents}\n onChange={updateAcp}\n />\n ) : null}\n\n {/* Save bar */}\n {isDirty && (\n <div className=\"sticky bottom-0 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-2 shadow-md\">\n <Badge variant=\"info\">{t('agents.dirtyHint')}</Badge>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onDiscard}\n disabled={updateCfg.isPending}\n >\n <X className=\"h-4 w-4\" />\n {t('agents.discard')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateCfg.isPending}\n >\n {updateCfg.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {updateCfg.isPending ? t('agents.saving') : t('agents.saveBtn')}\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n\n/* ─────────────── Row ─────────────── */\n\ninterface AgentRowProps {\n displayName: string\n aliases: string[]\n pkg: string\n /** v1.2.140 — 'in-process' agents show a different \"not installed\"\n * hint (point at LLM-backend config rather than `npm install -g`)\n * and surface a small \"内置\" badge so operators understand they\n * don't need to install anything. */\n kind: 'cli' | 'in-process'\n installed: boolean\n enabled: boolean\n onToggle: (on: boolean) => void\n}\n\nfunction AgentRow({\n displayName, aliases, pkg, kind, installed, enabled, onToggle,\n}: AgentRowProps): JSX.Element {\n const { t } = useTranslation('settings')\n const inProcess = kind === 'in-process'\n return (\n <div className=\"flex items-start gap-3 px-3 py-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-surface-2 text-text-dim\">\n <Bot className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-text\">{displayName}</span>\n <Badge variant={installed ? 'success' : 'outline'} className=\"text-[10px]\">\n <span className={cn(\n 'inline-block h-1.5 w-1.5 rounded-full',\n installed ? 'bg-success' : 'bg-text-muted',\n )} />\n {installed ? t('agents.online') : t('agents.offline')}\n </Badge>\n {inProcess && (\n <Badge variant=\"outline\" className=\"text-[10px]\" title={t('agents.inProcessHint')}>\n {t('agents.inProcessBadge')}\n </Badge>\n )}\n </div>\n <p className=\"mt-0.5 text-xs text-text-dim\">\n <span className=\"text-text-muted\">{t('agents.aliasesLabel')}: </span>\n <span className=\"font-mono\">{aliases.map((a) => `/${a}`).join(', ')}</span>\n </p>\n {!installed && (\n <p className=\"mt-1 text-xs text-warning\">\n {inProcess\n ? t('agents.nativeInstallHint')\n : t('agents.installHint', { pkg })}\n </p>\n )}\n </div>\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => onToggle(e.target.checked)}\n className=\"h-4 w-4 mt-2 accent-accent cursor-pointer\"\n />\n </div>\n )\n}\n\n/* ─────────────── Remote (ACP) ─────────────── */\n\nconst AUTH_TYPES: ACPAuthType[] = ['none', 'apikey', 'bearer']\nconst NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/\n\n/** Compare two ACP lists by value. Order matters because the backend\n * preserves index identity (`existing.acpAgents[i]`) when merging\n * masked tokens — reordering = mask drift risk. */\nfunction acpEqual(a: ACPAgentConfig[], b: ACPAgentConfig[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n const x = a[i]!\n const y = b[i]!\n if (x.name !== y.name) return false\n if (x.endpoint !== y.endpoint) return false\n if ((x.enabled ?? true) !== (y.enabled ?? true)) return false\n const xa = (x.aliases ?? []).join(',')\n const ya = (y.aliases ?? []).join(',')\n if (xa !== ya) return false\n const xat = x.auth?.type ?? 'none'\n const yat = y.auth?.type ?? 'none'\n if (xat !== yat) return false\n if ((x.auth?.token ?? '') !== (y.auth?.token ?? '')) return false\n }\n return true\n}\n\ninterface AcpCardProps {\n agents: ACPAgentConfig[]\n onChange: (next: ACPAgentConfig[]) => void\n}\n\nfunction AcpCard({ agents, onChange }: AcpCardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const testMut = useTestAcp()\n const discoverMut = useDiscoverAcp()\n\n // Add-form state. We keep the typed token in plain state so the\n // user can paste before save; the masked round-trip from backend\n // only matters for existing rows.\n const [name, setName] = useState('')\n const [aliasesText, setAliasesText] = useState('')\n const [endpoint, setEndpoint] = useState('')\n const [authType, setAuthType] = useState<ACPAuthType>('none')\n const [token, setToken] = useState('')\n\n // Bulk-discover sub-form state. Hidden behind a toggle so the\n // primary path (manual add) stays uncluttered.\n const [showDiscover, setShowDiscover] = useState(false)\n const [baseUrl, setBaseUrl] = useState('')\n\n const trimmedName = name.trim()\n const nameValid = trimmedName.length > 0 && NAME_RE.test(trimmedName)\n const dup = agents.some((a) => a.name === trimmedName)\n const tokenRequired = authType !== 'none'\n const tokenOk = !tokenRequired || token.trim().length > 0\n const canAdd = nameValid && endpoint.trim().length > 0 && tokenOk && !dup\n const canTestNew = endpoint.trim().length > 0 && tokenOk\n\n function clearForm(): void {\n setName('')\n setAliasesText('')\n setEndpoint('')\n setAuthType('none')\n setToken('')\n }\n\n function parseAliases(text: string): string[] {\n return text.split(',').map((s) => s.trim()).filter(Boolean)\n }\n\n function buildAuth(type: ACPAuthType, tok: string): ACPAuthConfig | undefined {\n if (type === 'none') return { type: 'none' }\n const trimmed = tok.trim()\n if (!trimmed) return { type } // no token yet; save will reject\n return { type, token: trimmed }\n }\n\n async function onAdd(): Promise<void> {\n if (!canAdd) return\n const next: ACPAgentConfig = {\n name: trimmedName,\n endpoint: endpoint.trim(),\n aliases: parseAliases(aliasesText),\n auth: buildAuth(authType, token),\n enabled: true,\n }\n onChange([...agents, next])\n clearForm()\n toast.success(t('agents.acp.toast.staged'))\n }\n\n async function onTestNew(): Promise<void> {\n if (!canTestNew) return\n try {\n const res = await testMut.mutateAsync({\n endpoint: endpoint.trim(),\n auth: buildAuth(authType, token),\n })\n toast.success(t('agents.acp.toast.testOk', { name: res.name }))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n async function onTestRow(idx: number): Promise<void> {\n const a = agents[idx]\n if (!a) return\n // Masked tokens stay masked on the wire — backend's PUT mask-detect\n // is symmetric, but the test endpoint reads what we send. We can't\n // unmask client-side; warn the operator.\n if (a.auth?.type !== 'none' && a.auth?.token && isMaskedToken(a.auth.token)) {\n toast.error(t('agents.acp.toast.testMasked'))\n return\n }\n try {\n const res = await testMut.mutateAsync({\n endpoint: a.endpoint,\n auth: a.auth,\n })\n toast.success(t('agents.acp.toast.testOk', { name: res.name }))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n function onToggleRow(idx: number, on: boolean): void {\n const next = agents.map((a, i) => (i === idx ? { ...a, enabled: on } : a))\n onChange(next)\n }\n\n function onRemoveRow(idx: number): void {\n onChange(agents.filter((_, i) => i !== idx))\n }\n\n async function onDiscoverRun(): Promise<void> {\n const url = baseUrl.trim()\n if (!url) return\n try {\n const res = await discoverMut.mutateAsync({ baseUrl: url, register: false })\n // Stage new agents that aren't already in the list (by name).\n const existing = new Set(agents.map((a) => a.name))\n const incoming = res.agents.filter((a) => !existing.has(a.name))\n if (incoming.length === 0) {\n toast.info(t('agents.acp.toast.discoverEmpty'))\n return\n }\n onChange([...agents, ...incoming.map((a) => ({ ...a, enabled: true }))])\n toast.success(t('agents.acp.toast.discoverAdded', { count: incoming.length }))\n setBaseUrl('')\n setShowDiscover(false)\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <Network className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('agents.acp.title')}</h2>\n <Badge variant=\"outline\" className=\"text-[10px]\">{agents.length}</Badge>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => setShowDiscover((v) => !v)}\n >\n <Search className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{t('agents.acp.discoverBtn')}</span>\n </Button>\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('agents.acp.subtitle')}</p>\n\n {/* Discover form (collapsed by default) */}\n {showDiscover && (\n <div className=\"border-t border-border bg-surface-2 px-4 py-3\">\n <Label htmlFor=\"acp-baseurl\" className=\"text-xs font-medium\">\n {t('agents.acp.baseUrl')}\n </Label>\n <p className=\"mt-1 text-[11px] text-text-dim\">{t('agents.acp.baseUrlHint')}</p>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <Input\n id=\"acp-baseurl\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://agents.example.com\"\n className=\"flex-1 min-w-[200px] font-mono text-xs\"\n />\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onDiscoverRun()}\n disabled={!baseUrl.trim() || discoverMut.isPending}\n >\n {discoverMut.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Search className=\"h-4 w-4\" />}\n {t('agents.acp.runDiscover')}\n </Button>\n </div>\n </div>\n )}\n\n {/* Registered ACP agents */}\n {agents.length === 0 ? (\n <div className=\"px-4 py-6\">\n <EmptyState\n icon={<Network />}\n title={t('agents.acp.empty.title')}\n description={t('agents.acp.empty.description')}\n />\n </div>\n ) : (\n <ul className=\"divide-y divide-border\">\n {agents.map((a, i) => (\n <AcpRow\n key={a.name}\n agent={a}\n onToggle={(on) => onToggleRow(i, on)}\n onTest={() => void onTestRow(i)}\n onRemove={() => onRemoveRow(i)}\n testing={testMut.isPending}\n />\n ))}\n </ul>\n )}\n\n {/* Add-agent form */}\n <div className=\"border-t border-border px-4 py-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-text-dim\">\n {t('agents.acp.addTitle')}\n </h3>\n <div className=\"mt-2 grid grid-cols-1 gap-2 sm:grid-cols-2\">\n <Field label={t('agents.acp.name')} hint={t('agents.acp.nameHint')}>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"my-agent\"\n aria-invalid={name.length > 0 && !nameValid}\n />\n </Field>\n <Field label={t('agents.acp.aliases')} hint={t('agents.acp.aliasesHint')}>\n <Input\n value={aliasesText}\n onChange={(e) => setAliasesText(e.target.value)}\n placeholder=\"ma, agent1\"\n />\n </Field>\n <Field label={t('agents.acp.endpoint')} hint={t('agents.acp.endpointHint')}>\n <Input\n value={endpoint}\n onChange={(e) => setEndpoint(e.target.value)}\n placeholder=\"https://example.com/agents/weather\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field label={t('agents.acp.authType')}>\n <Select value={authType} onValueChange={(v) => setAuthType(v as ACPAuthType)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {AUTH_TYPES.map((a) => (\n <SelectItem key={a} value={a}>{t(`agents.acp.auth.${a}`)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n {authType !== 'none' && (\n <Field label={t('agents.acp.token')} className=\"sm:col-span-2\">\n <Input\n type=\"password\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n placeholder={t('agents.acp.tokenPlaceholder')}\n autoComplete=\"new-password\"\n />\n </Field>\n )}\n </div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onTestNew()}\n disabled={!canTestNew || testMut.isPending}\n >\n {testMut.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Search className=\"h-4 w-4\" />}\n {t('agents.acp.testBtn')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onAdd()}\n disabled={!canAdd}\n >\n <Plus className=\"h-4 w-4\" />\n {t('agents.acp.addBtn')}\n </Button>\n {dup && (\n <span className=\"self-center text-xs text-warning\">\n {t('agents.acp.dupName')}\n </span>\n )}\n </div>\n </div>\n </section>\n )\n}\n\ninterface AcpRowProps {\n agent: ACPAgentConfig\n onToggle: (on: boolean) => void\n onTest: () => void\n onRemove: () => void\n testing: boolean\n}\n\nfunction AcpRow({ agent, onToggle, onTest, onRemove, testing }: AcpRowProps): JSX.Element {\n const { t } = useTranslation('settings')\n const isOn = agent.enabled !== false\n const authType = agent.auth?.type ?? 'none'\n return (\n <li className=\"flex flex-wrap items-center gap-3 px-4 py-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-text\">{agent.name}</span>\n <Badge variant=\"outline\" className=\"text-[10px] uppercase\">\n {t(`agents.acp.auth.${authType}`)}\n </Badge>\n {agent.aliases && agent.aliases.length > 0 && (\n <span className=\"text-xs text-text-muted font-mono\">\n {agent.aliases.map((a) => `/${a}`).join(', ')}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 truncate font-mono text-xs text-text-dim\" title={agent.endpoint}>\n {agent.endpoint}\n </p>\n </div>\n <label className=\"flex items-center gap-1.5 text-xs text-text-dim\">\n <input\n type=\"checkbox\"\n checked={isOn}\n onChange={(e) => onToggle(e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n {isOn ? t('agents.acp.on') : t('agents.acp.off')}\n </label>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onTest}\n disabled={testing}\n aria-label={t('agents.acp.testBtn')}\n >\n {testing ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Search className=\"h-4 w-4\" />}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n aria-label={t('agents.acp.removeBtn')}\n className=\"text-danger hover:text-danger\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n )\n}\n\ninterface FieldProps {\n label: string\n hint?: string\n className?: string\n children: React.ReactNode\n}\n\nfunction Field({ label, hint, className, children }: FieldProps): JSX.Element {\n return (\n <div className={cn('flex flex-col gap-1', className)}>\n <Label className=\"text-xs font-medium\">{label}</Label>\n {children}\n {hint && <p className=\"text-[11px] text-text-dim\">{hint}</p>}\n </div>\n )\n}\n\n/** Tokens look like `ab****yz` from the masked GET response. We\n * shouldn't send them back unchanged for test (the backend would\n * fail auth), and we shouldn't include them in the test mutation\n * body either. Treat any string with 3+ consecutive `*` as masked. */\nfunction isMaskedToken(s: string): boolean {\n return /\\*{3,}/.test(s)\n}\n"],"names":["Bot","createLucideIcon","BUILTIN_AGENTS","AGENT_NAMES","BRIDGED_AGENT_NAMES","name","SettingsAgentsRoute","t","useTranslation","cfgQuery","useConfig","statusQuery","useAgentsStatus","updateCfg","useUpdateConfig","cfg","status","draftEnabled","setDraftEnabled","useState","draftDefault","setDraftDefault","draftAcp","setDraftAcp","useEffect","enabled","defaultAgent","acpAgents","isDirty","useMemo","enabledSame","a","defaultSame","acpSame","acpEqual","eligibleDefaults","toggleAgent","on","next","onSave","toast","err","describeError","onDiscard","updateAcp","jsxs","jsx","Button","Loader2","RefreshCcw","Fragment","info","installed","isEnabled","AgentRow","agentDisplayName","Label","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","AcpCard","Badge","X","Save","displayName","aliases","pkg","kind","onToggle","inProcess","cn","e","AUTH_TYPES","NAME_RE","b","i","x","y","xa","ya","xat","yat","agents","onChange","testMut","useTestAcp","discoverMut","useDiscoverAcp","setName","aliasesText","setAliasesText","endpoint","setEndpoint","authType","setAuthType","token","setToken","showDiscover","setShowDiscover","baseUrl","setBaseUrl","trimmedName","nameValid","dup","tokenOk","canAdd","canTestNew","clearForm","parseAliases","text","s","buildAuth","type","tok","trimmed","onAdd","onTestNew","res","onTestRow","idx","isMaskedToken","onToggleRow","onRemoveRow","_","onDiscoverRun","url","existing","incoming","Network","Search","Input","EmptyState","AcpRow","Field","Plus","agent","onTest","onRemove","testing","isOn","Trash2","label","hint","className","children"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bgjobs-BYCQhd_1.js","sources":["../../node_modules/lucide-react/dist/esm/icons/terminal.js","../../src/hooks/use-bgjobs.ts","../../src/routes/tasks/bgjobs.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Terminal = createLucideIcon(\"Terminal\", [\n [\"polyline\", { points: \"4 17 10 11 4 5\", key: \"akl6gq\" }],\n [\"line\", { x1: \"12\", x2: \"20\", y1: \"19\", y2: \"19\", key: \"q2wloq\" }]\n]);\n\nexport { Terminal as default };\n//# sourceMappingURL=terminal.js.map\n","/**\n * useBgjobs — react-query wrapper for /api/bgjobs.\n *\n * Bgjobs are a read-only window into the wrapper-managed bgjob\n * directories (Claude Code's ~/.claude/bgjobs/, opencode's\n * ~/.config/opencode/bgjobs/, codex's ~/.codex/bgjobs/, plus any\n * IMHUB_BGJOB_ROOTS custom paths). No SSE channel for bgjob events;\n * the page polls or refresh-on-demand.\n *\n * Response shape varies based on whether `root` is set — when no\n * root filter is applied the backend returns groups keyed by rootId.\n * The hook leaves that shape intact; flattening logic lives in the\n * route's `useMemo` so a future \"show per-root\" view can pivot\n * cheaply.\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { ListBgjobsQuery, ListBgjobsResponse } from '@/types/api'\n\nexport const bgjobsKeys = {\n all: ['bgjobs'] as const,\n list: (q: ListBgjobsQuery) => ['bgjobs', 'list', q] as const,\n}\n\nexport function useBgjobs(query: ListBgjobsQuery) {\n return useQuery<ListBgjobsResponse>({\n queryKey: bgjobsKeys.list(query),\n queryFn: () => api.listBgJobs(query),\n // Bgjobs file scans are cheap (FS reads) but we don't want to\n // hammer when the user idles on the tab. Auto-refetch every 5s\n // while the tab is focused matches the v1 admin's behavior.\n refetchInterval: 5000,\n refetchIntervalInBackground: false,\n })\n}\n\nexport function useInvalidateBgjobs() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: bgjobsKeys.all })\n}\n","/**\n * /tasks/bgjobs — long-running scripts launched by agent wrappers\n * via their bgjob facility. Read-only; the wrapper is the source of\n * truth for writes (kill / restart).\n *\n * Response shape: when no `?root=` filter, backend returns\n * `{ roots, groups: [{ rootId, jobs }] }`; with a root filter,\n * `{ roots: [oneRoot], jobs }`. We flatten via useMemo so the\n * DataTable consumes one flat list regardless of mode.\n *\n * No SSE: bgjob events aren't on the event-bus. We rely on the 5s\n * react-query poll set in use-bgjobs.ts.\n */\n\nimport { useMemo } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Loader2, RefreshCcw, Terminal } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { StatusBadge } from '@/components/common/status-badge'\nimport { Button } from '@/components/ui/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useBgjobs } from '@/hooks/use-bgjobs'\nimport type { BgjobSummary } from '@/types/api'\n\nexport default function BgjobsRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const [params, setParams] = useSearchParams()\n const rootFilter = params.get('root') ?? null\n\n const { data, isLoading, isFetching, refetch } = useBgjobs(\n rootFilter ? { root: rootFilter } : {},\n )\n\n const roots = data?.roots ?? []\n const rows: BgjobSummary[] = useMemo(() => {\n if (!data) return []\n if (data.jobs) return data.jobs\n if (data.groups) return data.groups.flatMap((g) => g.jobs)\n return []\n }, [data])\n\n function setRoot(next: string | null): void {\n const p = new URLSearchParams(params)\n if (!next) p.delete('root')\n else p.set('root', next)\n setParams(p, { replace: true })\n }\n\n const columns: DataTableColumn<BgjobSummary>[] = useMemo(\n () => [\n {\n id: 'name',\n header: t('bgjobs.col.name'),\n cell: (r) => <span className=\"font-medium\">{r.name}</span>,\n asCardTitle: true,\n },\n {\n id: 'status',\n header: t('bgjobs.col.status'),\n cell: (r) => <StatusBadge status={r.status}>{r.status}</StatusBadge>,\n headClassName: 'w-28',\n },\n {\n id: 'root',\n header: t('bgjobs.col.root'),\n cell: (r) => {\n const root = roots.find((rt) => rt.id === r.rootId)\n return (\n <span className=\"text-text-dim\" title={root?.path ?? r.rootId}>\n {root?.label ?? r.rootId}\n </span>\n )\n },\n headClassName: 'w-32',\n },\n {\n id: 'pid',\n header: t('bgjobs.col.pid'),\n cell: (r) => (\n <span className=\"tabular-nums text-text-dim\">{r.pid ?? '—'}</span>\n ),\n headClassName: 'w-20',\n hideOnMobile: true,\n },\n {\n id: 'startedAt',\n header: t('bgjobs.col.startedAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.started_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n {\n id: 'endedAt',\n header: t('bgjobs.col.endedAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.ended_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n {\n id: 'exit',\n header: t('bgjobs.col.exit'),\n cell: (r) => {\n if (r.ended_at == null) return <span className=\"text-text-muted\">{t('bgjobs.stillRunning')}</span>\n if (r.exit_code === 0) return <span className=\"text-success\">{t('bgjobs.exitOk')}</span>\n if (r.exit_code != null) return <span className=\"text-danger tabular-nums\">{r.exit_code}</span>\n return <span className=\"text-text-muted\">—</span>\n },\n headClassName: 'w-20',\n },\n ],\n [t, roots],\n )\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('bgjobs.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('bgjobs.subtitle')}</p>\n </header>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"text-sm text-text-dim\" htmlFor=\"root-filter\">\n {t('bgjobs.filter.root')}\n </label>\n <Select\n value={rootFilter ?? '__any__'}\n onValueChange={(v) => setRoot(v === '__any__' ? null : v)}\n >\n <SelectTrigger id=\"root-filter\" className=\"w-[180px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__any__\">{t('bgjobs.filter.rootAny')}</SelectItem>\n {roots.map((r) => (\n <SelectItem key={r.id} value={r.id}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => `${r.rootId}:${r.id}`}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<Terminal />}\n title={t('bgjobs.empty.title')}\n description={t('bgjobs.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\nfunction formatTime(iso: string | null): string {\n if (iso == null) return '—'\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n const now = new Date()\n const sameDay = d.toDateString() === now.toDateString()\n if (sameDay) {\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n }\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["Terminal","createLucideIcon","bgjobsKeys","q","useBgjobs","query","useQuery","api","BgjobsRoute","t","useTranslation","params","setParams","useSearchParams","rootFilter","data","isLoading","isFetching","refetch","roots","rows","useMemo","g","setRoot","next","p","columns","r","jsx","StatusBadge","root","rt","formatTime","jsxs","Button","Loader2","RefreshCcw","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","DataTable","EmptyState","iso","d","now"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{o as J,u as U,a6 as K,a7 as W,j as e,l as O,B as k,S as _,g as L,h as E,i as S,k as x,a8 as Z,m as p,n as Y,L as $,I as ee,c as se}from"./index-DY2Zglku.js";import{r as f}from"./react-DlP5eolq.js";import{u as te,a as le,b as ne}from"./use-settings-Co-iafXD.js";import{L as B}from"./loader-circle-D8L1w9c1.js";import{S as ae}from"./save-BYFmz9gD.js";import{i as ie,j as re}from"./use-memory-B9oRyQC8.js";import{R as oe}from"./refresh-ccw-7HdadG5V.js";import{P as de}from"./play-Di1jqulh.js";/**
|
|
2
|
-
* @license lucide-react v0.469.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const ce=J("AlarmClockCheck",[["circle",{cx:"12",cy:"13",r:"8",key:"3y4lt7"}],["path",{d:"M5 3 2 6",key:"18tl5t"}],["path",{d:"m22 6-3-3",key:"1opdir"}],["path",{d:"M6.38 18.7 4 21",key:"17xu3x"}],["path",{d:"M17.64 18.67 20 21",key:"kv2oe2"}],["path",{d:"m9 13 2 2 4-4",key:"6343dt"}]]),y={intervalMs:"300000",floorMin:"30",batchMax:"20",maxPending:"200"};function me(n){const s=(n??"1").trim().toLowerCase();return s!=="0"&&s!=="false"&&s!=="no"&&s!=="off"}function ue(n){const s=(n||"auto").toLowerCase();return s==="agent"||s==="llm"?s:"auto"}function xe({onSaved:n}){const{t:s}=U(["memory","common"]),a=te({reveal:!1}),r=f.useMemo(()=>a.data?.env??{},[a.data?.env]),j=le(),d=K(),c=j.data?.agents??[],h=d.data?.backends??[],v=d.data?.roles?.distill??"",T=f.useMemo(()=>()=>({source:ue(r.IMHUB_MEMORY_DISTILL_SOURCE),agent:r.IMHUB_MEMORY_DISTILL_AGENT||"",llmBackend:v,enabled:me(r.IMHUB_MEMORY_DISTILL_ENABLED),intervalMs:r.IMHUB_MEMORY_DISTILL_INTERVAL_MS||"",floorMin:r.IMHUB_MEMORY_DISTILL_FLOOR_MIN||"",batchMax:r.IMHUB_MEMORY_DISTILL_BATCH_MAX||"",maxPending:r.IMHUB_MEMORY_DISTILL_MAX_PENDING||""}),[r,v]),[l,N]=f.useState(T),g=f.useRef(l),A=f.useRef(!1);f.useEffect(()=>{if(A.current||!a.data||!d.data)return;const t=T();N(t),g.current=t,A.current=!0},[a.data,d.data,T]);const H=ne(),P=W(),w=f.useMemo(()=>{const t=g.current;return Object.keys(l).some(i=>l[i]!==t[i])},[l]);function m(t,i){N(o=>({...o,[t]:i}))}function I(t,i,o){if(!t.trim())return null;const u=Number(t);return!Number.isFinite(u)||u<i?s("distill.form.errors.numRange",{field:o,min:i}):null}function F(){return l.source==="agent"&&!l.agent.trim()?s("distill.form.errors.agentRequired"):l.source==="llm"&&!l.llmBackend.trim()?s("distill.form.errors.llmRequired"):I(l.intervalMs,1e4,s("distill.form.intervalMs"))??I(l.floorMin,0,s("distill.form.floorMin"))??I(l.batchMax,1,s("distill.form.batchMax"))??I(l.maxPending,1,s("distill.form.maxPending"))}function V(){const t=g.current,i={},o=(u,M,q)=>{M!==q&&(i[u]=M.trim()===""?null:M.trim())};return l.source!==t.source&&(i.IMHUB_MEMORY_DISTILL_SOURCE=l.source==="auto"?null:l.source),l.enabled!==t.enabled&&(i.IMHUB_MEMORY_DISTILL_ENABLED=l.enabled?"1":"0"),l.source==="agent"?o("IMHUB_MEMORY_DISTILL_AGENT",l.agent,t.agent):t.agent&&(i.IMHUB_MEMORY_DISTILL_AGENT=null),o("IMHUB_MEMORY_DISTILL_INTERVAL_MS",l.intervalMs,t.intervalMs),o("IMHUB_MEMORY_DISTILL_FLOOR_MIN",l.floorMin,t.floorMin),o("IMHUB_MEMORY_DISTILL_BATCH_MAX",l.batchMax,t.batchMax),o("IMHUB_MEMORY_DISTILL_MAX_PENDING",l.maxPending,t.maxPending),i}async function G(){const t=F();if(t){p.error(t);return}const i=V(),o=l.source==="llm"&&l.llmBackend.trim()!==""&&l.llmBackend!==g.current.llmBackend;if(Object.keys(i).length===0&&!o){p.info(s("distill.form.nothingChanged"));return}try{Object.keys(i).length>0&&await H.mutateAsync({updates:i}),o&&await P.mutateAsync({distill:l.llmBackend.trim()}),p.success(s("distill.form.savedToast")),g.current={...l},N(u=>({...u})),n?.()}catch(u){const{message:M}=Y(u,s);p.error(M)}}function z(){N(g.current)}const C=H.isPending||P.isPending,Q=h.length===0,X=c.length===0;return e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("h2",{className:"text-sm font-medium",children:s("distill.form.title")}),w&&e.jsx(O,{variant:"info",children:s("distill.form.dirty")}),e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[w&&e.jsx(k,{type:"button",variant:"secondary",size:"sm",onClick:z,disabled:C,children:s("distill.form.discard")}),e.jsxs(k,{type:"button",size:"sm",onClick:()=>void G(),disabled:!w||C,children:[C?e.jsx(B,{className:"h-4 w-4 animate-spin"}):e.jsx(ae,{className:"h-4 w-4"}),s("distill.form.save")]})]})]}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:s("distill.form.hint")}),a.isLoading?e.jsx("div",{className:"mt-3 h-32 w-full rounded-md bg-surface-2 animate-pulse"}):e.jsxs("div",{className:"mt-3 flex flex-col gap-4",children:[e.jsxs("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[e.jsx(b,{label:s("distill.form.source"),help:s("distill.form.sourceHelp"),children:e.jsxs(_,{value:l.source,onValueChange:t=>m("source",t),children:[e.jsx(L,{children:e.jsx(E,{})}),e.jsxs(S,{children:[e.jsx(x,{value:"auto",children:s("distill.form.sourceAuto")}),e.jsx(x,{value:"agent",children:s("distill.form.sourceAgent")}),e.jsx(x,{value:"llm",children:s("distill.form.sourceLlm")})]})]})}),l.source==="auto"&&e.jsx("div",{className:"flex items-end",children:e.jsx("p",{className:"text-[11px] text-text-muted",children:s("distill.form.autoNote")})}),l.source==="agent"&&e.jsx(b,{label:s("distill.form.agent"),help:s("distill.form.agentHelp"),children:X?e.jsx("p",{className:"text-[11px] text-warning",children:s("distill.form.noAgents")}):e.jsxs(_,{value:l.agent,onValueChange:t=>m("agent",t),children:[e.jsx(L,{children:e.jsx(E,{placeholder:s("distill.form.agentPlaceholder")})}),e.jsx(S,{children:c.map(t=>e.jsx(x,{value:t,children:Z(t)},t))})]})}),l.source==="llm"&&e.jsx(b,{label:s("distill.form.llmBackend"),help:s("distill.form.llmBackendHelp"),children:Q?e.jsx("p",{className:"text-[11px] text-warning",children:s("distill.form.noBackends")}):e.jsxs(_,{value:l.llmBackend,onValueChange:t=>m("llmBackend",t),children:[e.jsx(L,{children:e.jsx(E,{placeholder:s("distill.form.llmPlaceholder")})}),e.jsx(S,{children:h.map(t=>e.jsxs(x,{value:t.name,children:[t.name," ",e.jsxs("span",{className:"text-text-muted",children:["· ",t.model]})]},t.name))})]})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-text-dim",children:s("distill.form.scheduleTitle")}),e.jsxs("div",{className:"mt-2 grid grid-cols-1 gap-3 sm:grid-cols-2",children:[e.jsx(b,{label:s("distill.form.enabled"),help:s("distill.form.enabledHelp"),children:e.jsxs(_,{value:l.enabled?"on":"off",onValueChange:t=>m("enabled",t==="on"),children:[e.jsx(L,{children:e.jsx(E,{})}),e.jsxs(S,{children:[e.jsx(x,{value:"on",children:s("distill.form.enabledOn")}),e.jsx(x,{value:"off",children:s("distill.form.enabledOff")})]})]})}),e.jsx(R,{label:s("distill.form.intervalMs"),help:s("distill.form.intervalMsHelp"),value:l.intervalMs,placeholder:y.intervalMs,min:1e4,step:1e4,onChange:t=>m("intervalMs",t)}),e.jsx(R,{label:s("distill.form.floorMin"),help:s("distill.form.floorMinHelp"),value:l.floorMin,placeholder:y.floorMin,min:0,step:5,onChange:t=>m("floorMin",t)}),e.jsx(R,{label:s("distill.form.batchMax"),help:s("distill.form.batchMaxHelp"),value:l.batchMax,placeholder:y.batchMax,min:1,step:1,onChange:t=>m("batchMax",t)}),e.jsx(R,{label:s("distill.form.maxPending"),help:s("distill.form.maxPendingHelp"),value:l.maxPending,placeholder:y.maxPending,min:1,step:10,onChange:t=>m("maxPending",t)})]})]})]})]})}function b({label:n,help:s,children:a}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx($,{className:"text-xs text-text-dim",children:n}),a,s&&e.jsx("p",{className:"text-[11px] text-text-muted",children:s})]})}function R({label:n,help:s,value:a,placeholder:r,min:j,step:d,onChange:c}){return e.jsx(b,{label:n,help:s,children:e.jsx(ee,{type:"number",min:j,step:d,value:a,placeholder:r,onChange:h=>c(h.target.value),className:"font-mono text-xs"})})}function _e(){const{t:n}=U(["memory","common"]),s=ie(),a=s.data,r=re();async function j(){try{await r.mutateAsync(),p.success(n("distill.actions.runStarted"))}catch(h){const{message:v}=Y(h,n);p.error(v)}}const d=!!a?.running,c=a?.pendingTotal??0;return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:n("distill.title")}),e.jsxs(k,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>s.refetch(),disabled:s.isFetching,"aria-label":n("actions.refresh",{ns:"common"}),children:[s.isFetching?e.jsx(B,{className:"h-4 w-4 animate-spin"}):e.jsx(oe,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:n("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:n("distill.subtitle")})]}),e.jsx(xe,{onSaved:()=>void s.refetch()}),e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[e.jsx("span",{className:"font-medium",children:n("distill.status.title")}),e.jsx(O,{variant:a?.enabled?"success":"secondary",children:a?.enabled?n("distill.status.enabledTrue"):n("distill.status.enabledFalse")}),d&&e.jsxs(O,{variant:"info",children:[e.jsx(B,{className:"mr-1 inline h-3 w-3 animate-spin"}),n("distill.status.running")]}),e.jsx("div",{className:"ml-auto",children:e.jsxs(k,{variant:"default",size:"sm",onClick:()=>void j(),disabled:r.isPending||d||!a?.enabled,children:[r.isPending?e.jsx(B,{className:"h-4 w-4 animate-spin"}):e.jsx(de,{className:"h-4 w-4"}),n("distill.actions.runNow")]})})]}),s.isLoading?e.jsx("div",{className:"mt-3 h-20 w-full rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mt-3 grid grid-cols-2 gap-2 sm:grid-cols-3",children:[e.jsx(D,{label:n("distill.status.pending"),value:c,tone:c>0?"warning":"success"}),e.jsx(D,{label:n("distill.status.lastProcessed"),value:a?.lastProcessed??0,tone:"info"}),e.jsx(D,{label:n("distill.status.lastRun"),value:he(a?.lastRunAt),tone:"info"})]}),c===0&&e.jsxs("p",{className:"mt-2 flex items-center gap-1 text-xs text-text-muted",children:[e.jsx(ce,{className:"h-3 w-3"}),n("distill.status.bufferEmpty")]}),a?.lastError&&e.jsxs("p",{className:"mt-2 text-xs text-danger break-all",children:[n("distill.status.lastError"),": ",a.lastError]})]})]})]})}const fe={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 D({label:n,value:s,tone:a}){return e.jsxs("div",{className:se("rounded-md border bg-bg px-2 py-2",fe[a]),children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide text-text-dim",children:n}),e.jsx("div",{className:"text-xl font-semibold tabular-nums",children:s})]})}function he(n){if(!n)return"—";try{const s=new Date(n);return Number.isNaN(s.getTime())?String(n):s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return String(n)}}export{_e as default};
|
|
7
|
-
//# sourceMappingURL=distill-D9p8O8Jf.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"distill-D9p8O8Jf.js","sources":["../../node_modules/lucide-react/dist/esm/icons/alarm-clock-check.js","../../src/routes/memory/distill-config-form.tsx","../../src/routes/memory/distill.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst AlarmClockCheck = createLucideIcon(\"AlarmClockCheck\", [\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"8\", key: \"3y4lt7\" }],\n [\"path\", { d: \"M5 3 2 6\", key: \"18tl5t\" }],\n [\"path\", { d: \"m22 6-3-3\", key: \"1opdir\" }],\n [\"path\", { d: \"M6.38 18.7 4 21\", key: \"17xu3x\" }],\n [\"path\", { d: \"M17.64 18.67 20 21\", key: \"kv2oe2\" }],\n [\"path\", { d: \"m9 13 2 2 4-4\", key: \"6343dt\" }]\n]);\n\nexport { AlarmClockCheck as default };\n//# sourceMappingURL=alarm-clock-check.js.map\n","/**\n * DistillConfigForm — inline editor for the \"dream distillation\"\n * scheduler (memory-distiller.ts + memory-distill.ts).\n *\n * Two things the operator configures here:\n *\n * 1. SOURCE — which LLM extracts facts from buffered turns:\n * auto → the turn's own agent (zero-config default; nothing else\n * to set). Recommended for most installs.\n * agent → a specific, already-enabled agent CLI\n * (IMHUB_MEMORY_DISTILL_AGENT).\n * llm → a standalone LLM backend bound to the `distill` role,\n * configured exactly like the native agent's LLM\n * (PUT /api/llm/roles { distill }). No CLI spawn.\n *\n * 2. SCHEDULE — the cadence knobs (enabled / interval / staleness\n * floor / batch size / per-user buffer cap), all IMHUB_MEMORY_DISTILL_*\n * env keys behind the server allowlist.\n *\n * Save flow mirrors vector-backend-form: diff against the last-loaded\n * values, PUT /api/env for the env keys, and — only when source=llm and\n * the chosen backend changed — PUT /api/llm/roles to (re)bind the\n * distill role. Empty agent / backend selections are validated before\n * save so we never persist a half-configured source.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Loader2, Save } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useEnv, useUpdateEnv, useConfig } from '@/hooks/use-settings'\nimport { useLlmList, useLlmPutRoles } from '@/hooks/use-llm-admin'\nimport { describeError } from '@/lib/api/errors'\nimport { agentDisplayName } from '@/lib/agent-label'\n\ntype DistillSource = 'auto' | 'agent' | 'llm'\n\ninterface FormState {\n source: DistillSource\n agent: string // IMHUB_MEMORY_DISTILL_AGENT (source=agent)\n llmBackend: string // llmRoles.distill backend name (source=llm)\n enabled: boolean // IMHUB_MEMORY_DISTILL_ENABLED\n intervalMs: string // IMHUB_MEMORY_DISTILL_INTERVAL_MS\n floorMin: string // IMHUB_MEMORY_DISTILL_FLOOR_MIN\n batchMax: string // IMHUB_MEMORY_DISTILL_BATCH_MAX\n maxPending: string // IMHUB_MEMORY_DISTILL_MAX_PENDING\n}\n\n// Mirror of the memory-distiller.ts defaults so placeholders match the\n// runtime fallbacks when a key is unset.\nconst DEFAULTS = {\n intervalMs: '300000',\n floorMin: '30',\n batchMax: '20',\n maxPending: '200',\n} as const\n\nfunction readEnabled(raw: string | undefined): boolean {\n const v = (raw ?? '1').trim().toLowerCase()\n return v !== '0' && v !== 'false' && v !== 'no' && v !== 'off'\n}\n\nfunction readSource(raw: string | undefined): DistillSource {\n const v = (raw || 'auto').toLowerCase()\n return v === 'agent' || v === 'llm' ? v : 'auto'\n}\n\nexport interface DistillConfigFormProps {\n /** Called after a successful save so the parent can refresh status. */\n onSaved?: () => void\n}\n\nexport function DistillConfigForm({ onSaved }: DistillConfigFormProps): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n\n const envQuery = useEnv({ reveal: false })\n const env = useMemo(() => envQuery.data?.env ?? {}, [envQuery.data?.env])\n const cfgQuery = useConfig()\n const llmQuery = useLlmList()\n\n const enabledAgents = cfgQuery.data?.agents ?? []\n const llmBackends = llmQuery.data?.backends ?? []\n const currentDistillRole = llmQuery.data?.roles?.distill ?? ''\n\n const readForm = useMemo<() => FormState>(() => () => ({\n source: readSource(env.IMHUB_MEMORY_DISTILL_SOURCE),\n agent: env.IMHUB_MEMORY_DISTILL_AGENT || '',\n llmBackend: currentDistillRole,\n enabled: readEnabled(env.IMHUB_MEMORY_DISTILL_ENABLED),\n intervalMs: env.IMHUB_MEMORY_DISTILL_INTERVAL_MS || '',\n floorMin: env.IMHUB_MEMORY_DISTILL_FLOOR_MIN || '',\n batchMax: env.IMHUB_MEMORY_DISTILL_BATCH_MAX || '',\n maxPending: env.IMHUB_MEMORY_DISTILL_MAX_PENDING || '',\n }), [env, currentDistillRole])\n\n const [form, setForm] = useState<FormState>(readForm)\n const initialRef = useRef<FormState>(form)\n const seededRef = useRef(false)\n\n // Seed from the server exactly once, after BOTH env and the llm roles have\n // loaded (llmBackend is derived from llmQuery). Seeding once — rather than on\n // every refetch — is deliberate: readForm's identity changes whenever the\n // env object or currentDistillRole changes, so a re-seed-on-refetch effect\n // would stomp the operator's unsaved edits the moment an unrelated llmQuery\n // or env refetch fires (window focus, or role invalidation from a different\n // save). The post-save baseline is committed directly in onSave instead.\n useEffect(() => {\n if (seededRef.current) return\n if (!envQuery.data || !llmQuery.data) return\n const next = readForm()\n setForm(next)\n initialRef.current = next\n seededRef.current = true\n }, [envQuery.data, llmQuery.data, readForm])\n\n const updateEnv = useUpdateEnv()\n const putRoles = useLlmPutRoles()\n\n const dirty = useMemo(() => {\n const initial = initialRef.current\n return (Object.keys(form) as Array<keyof FormState>).some((k) => form[k] !== initial[k])\n }, [form])\n\n function set<K extends keyof FormState>(k: K, v: FormState[K]): void {\n setForm((prev) => ({ ...prev, [k]: v }))\n }\n\n function numField(value: string, min: number, label: string): string | null {\n if (!value.trim()) return null\n const n = Number(value)\n if (!Number.isFinite(n) || n < min) return t('distill.form.errors.numRange', { field: label, min })\n return null\n }\n\n function validate(): string | null {\n if (form.source === 'agent' && !form.agent.trim()) {\n return t('distill.form.errors.agentRequired')\n }\n if (form.source === 'llm' && !form.llmBackend.trim()) {\n return t('distill.form.errors.llmRequired')\n }\n return (\n numField(form.intervalMs, 10000, t('distill.form.intervalMs'))\n ?? numField(form.floorMin, 0, t('distill.form.floorMin'))\n ?? numField(form.batchMax, 1, t('distill.form.batchMax'))\n ?? numField(form.maxPending, 1, t('distill.form.maxPending'))\n )\n }\n\n function buildEnvUpdates(): Record<string, string | null> {\n const initial = initialRef.current\n const out: Record<string, string | null> = {}\n const diffStr = (key: string, cur: string, prev: string): void => {\n if (cur === prev) return\n out[key] = cur.trim() === '' ? null : cur.trim()\n }\n if (form.source !== initial.source) {\n // 'auto' is the runtime default → store null to keep env tidy.\n out.IMHUB_MEMORY_DISTILL_SOURCE = form.source === 'auto' ? null : form.source\n }\n if (form.enabled !== initial.enabled) {\n out.IMHUB_MEMORY_DISTILL_ENABLED = form.enabled ? '1' : '0'\n }\n // Only persist the agent name when the chosen source actually uses it,\n // so flipping away from 'agent' doesn't leave a stale key behind.\n if (form.source === 'agent') {\n diffStr('IMHUB_MEMORY_DISTILL_AGENT', form.agent, initial.agent)\n } else if (initial.agent) {\n out.IMHUB_MEMORY_DISTILL_AGENT = null\n }\n diffStr('IMHUB_MEMORY_DISTILL_INTERVAL_MS', form.intervalMs, initial.intervalMs)\n diffStr('IMHUB_MEMORY_DISTILL_FLOOR_MIN', form.floorMin, initial.floorMin)\n diffStr('IMHUB_MEMORY_DISTILL_BATCH_MAX', form.batchMax, initial.batchMax)\n diffStr('IMHUB_MEMORY_DISTILL_MAX_PENDING', form.maxPending, initial.maxPending)\n return out\n }\n\n async function onSave(): Promise<void> {\n const err = validate()\n if (err) { toast.error(err); return }\n\n const envUpdates = buildEnvUpdates()\n const roleChanged = form.source === 'llm'\n && form.llmBackend.trim() !== ''\n && form.llmBackend !== initialRef.current.llmBackend\n\n if (Object.keys(envUpdates).length === 0 && !roleChanged) {\n toast.info(t('distill.form.nothingChanged'))\n return\n }\n\n try {\n if (Object.keys(envUpdates).length > 0) {\n await updateEnv.mutateAsync({ updates: envUpdates })\n }\n if (roleChanged) {\n await putRoles.mutateAsync({ distill: form.llmBackend.trim() })\n }\n toast.success(t('distill.form.savedToast'))\n // Commit the saved values as the new baseline so the form settles to\n // non-dirty. We seed from the server only once (see the effect above),\n // so there's no refetch round-trip to reset it for us; the shallow copy\n // re-triggers the `dirty` memo against the updated baseline.\n initialRef.current = { ...form }\n setForm((f) => ({ ...f }))\n onSaved?.()\n } catch (serr) {\n const { message } = describeError(serr, t)\n toast.error(message)\n }\n }\n\n function onDiscard(): void {\n setForm(initialRef.current)\n }\n\n const busy = updateEnv.isPending || putRoles.isPending\n const noBackends = llmBackends.length === 0\n const noAgents = enabledAgents.length === 0\n\n return (\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-sm font-medium\">{t('distill.form.title')}</h2>\n {dirty && <Badge variant=\"info\">{t('distill.form.dirty')}</Badge>}\n <div className=\"ml-auto flex items-center gap-2\">\n {dirty && (\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={onDiscard} disabled={busy}>\n {t('distill.form.discard')}\n </Button>\n )}\n <Button type=\"button\" size=\"sm\" onClick={() => void onSave()} disabled={!dirty || busy}>\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {t('distill.form.save')}\n </Button>\n </div>\n </div>\n <p className=\"mt-1 text-xs text-text-dim\">{t('distill.form.hint')}</p>\n\n {envQuery.isLoading ? (\n <div className=\"mt-3 h-32 w-full rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <div className=\"mt-3 flex flex-col gap-4\">\n {/* ── Source ── */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <Field label={t('distill.form.source')} help={t('distill.form.sourceHelp')}>\n <Select value={form.source} onValueChange={(v) => set('source', v as DistillSource)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"auto\">{t('distill.form.sourceAuto')}</SelectItem>\n <SelectItem value=\"agent\">{t('distill.form.sourceAgent')}</SelectItem>\n <SelectItem value=\"llm\">{t('distill.form.sourceLlm')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n\n {form.source === 'auto' && (\n <div className=\"flex items-end\">\n <p className=\"text-[11px] text-text-muted\">{t('distill.form.autoNote')}</p>\n </div>\n )}\n\n {form.source === 'agent' && (\n <Field label={t('distill.form.agent')} help={t('distill.form.agentHelp')}>\n {noAgents ? (\n <p className=\"text-[11px] text-warning\">{t('distill.form.noAgents')}</p>\n ) : (\n <Select value={form.agent} onValueChange={(v) => set('agent', v)}>\n <SelectTrigger>\n <SelectValue placeholder={t('distill.form.agentPlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {enabledAgents.map((name) => (\n <SelectItem key={name} value={name}>{agentDisplayName(name)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </Field>\n )}\n\n {form.source === 'llm' && (\n <Field label={t('distill.form.llmBackend')} help={t('distill.form.llmBackendHelp')}>\n {noBackends ? (\n <p className=\"text-[11px] text-warning\">{t('distill.form.noBackends')}</p>\n ) : (\n <Select value={form.llmBackend} onValueChange={(v) => set('llmBackend', v)}>\n <SelectTrigger>\n <SelectValue placeholder={t('distill.form.llmPlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {llmBackends.map((b) => (\n <SelectItem key={b.name} value={b.name}>\n {b.name} <span className=\"text-text-muted\">· {b.model}</span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </Field>\n )}\n </div>\n\n {/* ── Schedule ── */}\n <div>\n <div className=\"text-xs font-medium text-text-dim\">{t('distill.form.scheduleTitle')}</div>\n <div className=\"mt-2 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <Field label={t('distill.form.enabled')} help={t('distill.form.enabledHelp')}>\n <Select\n value={form.enabled ? 'on' : 'off'}\n onValueChange={(v) => set('enabled', v === 'on')}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"on\">{t('distill.form.enabledOn')}</SelectItem>\n <SelectItem value=\"off\">{t('distill.form.enabledOff')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n <NumberField\n label={t('distill.form.intervalMs')}\n help={t('distill.form.intervalMsHelp')}\n value={form.intervalMs}\n placeholder={DEFAULTS.intervalMs}\n min={10000}\n step={10000}\n onChange={(v) => set('intervalMs', v)}\n />\n <NumberField\n label={t('distill.form.floorMin')}\n help={t('distill.form.floorMinHelp')}\n value={form.floorMin}\n placeholder={DEFAULTS.floorMin}\n min={0}\n step={5}\n onChange={(v) => set('floorMin', v)}\n />\n <NumberField\n label={t('distill.form.batchMax')}\n help={t('distill.form.batchMaxHelp')}\n value={form.batchMax}\n placeholder={DEFAULTS.batchMax}\n min={1}\n step={1}\n onChange={(v) => set('batchMax', v)}\n />\n <NumberField\n label={t('distill.form.maxPending')}\n help={t('distill.form.maxPendingHelp')}\n value={form.maxPending}\n placeholder={DEFAULTS.maxPending}\n min={1}\n step={10}\n onChange={(v) => set('maxPending', v)}\n />\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction Field({\n label,\n help,\n children,\n}: {\n label: string\n help?: string\n children: React.ReactNode\n}): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label className=\"text-xs text-text-dim\">{label}</Label>\n {children}\n {help && <p className=\"text-[11px] text-text-muted\">{help}</p>}\n </div>\n )\n}\n\nfunction NumberField({\n label,\n help,\n value,\n placeholder,\n min,\n step,\n onChange,\n}: {\n label: string\n help?: string\n value: string\n placeholder: string\n min: number\n step: number\n onChange: (v: string) => void\n}): JSX.Element {\n return (\n <Field label={label} help={help}>\n <Input\n type=\"number\"\n min={min}\n step={step}\n value={value}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n )\n}\n","/**\n * /memory/distill — \"dream distillation\" control surface.\n *\n * Dream distillation buffers every chat turn into pending_distill and\n * batch-extracts facts in the background when the system is idle (or\n * once a user's oldest buffered turn passes the staleness floor). This\n * tab lets the operator:\n *\n * - configure the extraction SOURCE + SCHEDULE (DistillConfigForm)\n * - watch the live buffer depth + last-run telemetry (status tiles)\n * - force a pass now (\"Run now\" → POST /api/memory/distill)\n *\n * Status polls every 3s (useDistillStatus) so a manual run visibly\n * drains `pendingTotal` to zero without a refresh. This view is global\n * (not per-user) — the buffer spans every user — so it ignores the\n * layout's ?user= filter.\n */\n\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { AlarmClockCheck, Loader2, Play, RefreshCcw } from 'lucide-react'\n\nimport { DistillConfigForm } from './distill-config-form'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { useDistillStatus, useTriggerDistill } from '@/hooks/use-memory'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\n\nexport default function MemoryDistillRoute(): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n const statusQuery = useDistillStatus()\n const status = statusQuery.data\n const trigger = useTriggerDistill()\n\n async function onRunNow(): Promise<void> {\n try {\n await trigger.mutateAsync()\n toast.success(t('distill.actions.runStarted'))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n }\n }\n\n const running = !!status?.running\n const pending = status?.pendingTotal ?? 0\n\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('distill.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => statusQuery.refetch()}\n disabled={statusQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {statusQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('distill.subtitle')}</p>\n </header>\n\n {/* Configuration */}\n <DistillConfigForm onSaved={() => void statusQuery.refetch()} />\n\n {/* Status + actions */}\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <span className=\"font-medium\">{t('distill.status.title')}</span>\n <Badge variant={status?.enabled ? 'success' : 'secondary'}>\n {status?.enabled ? t('distill.status.enabledTrue') : t('distill.status.enabledFalse')}\n </Badge>\n {running && (\n <Badge variant=\"info\">\n <Loader2 className=\"mr-1 inline h-3 w-3 animate-spin\" />\n {t('distill.status.running')}\n </Badge>\n )}\n <div className=\"ml-auto\">\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => void onRunNow()}\n disabled={trigger.isPending || running || !status?.enabled}\n >\n {trigger.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Play className=\"h-4 w-4\" />}\n {t('distill.actions.runNow')}\n </Button>\n </div>\n </div>\n\n {statusQuery.isLoading ? (\n <div className=\"mt-3 h-20 w-full rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n <div className=\"mt-3 grid grid-cols-2 gap-2 sm:grid-cols-3\">\n <StatTile label={t('distill.status.pending')} value={pending} tone={pending > 0 ? 'warning' : 'success'} />\n <StatTile label={t('distill.status.lastProcessed')} value={status?.lastProcessed ?? 0} tone=\"info\" />\n <StatTile label={t('distill.status.lastRun')} value={formatEpoch(status?.lastRunAt)} tone=\"info\" />\n </div>\n {pending === 0 && (\n <p className=\"mt-2 flex items-center gap-1 text-xs text-text-muted\">\n <AlarmClockCheck className=\"h-3 w-3\" />\n {t('distill.status.bufferEmpty')}\n </p>\n )}\n {status?.lastError && (\n <p className=\"mt-2 text-xs text-danger break-all\">\n {t('distill.status.lastError')}: {status.lastError}\n </p>\n )}\n </>\n )}\n </div>\n </div>\n )\n}\n\ninterface StatTileProps {\n label: string\n value: number | string\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<StatTileProps['tone'], string> = {\n info: 'border-info/30 text-info',\n success: 'border-success/30 text-success',\n warning: 'border-warning/30 text-warning',\n danger: 'border-danger/30 text-danger',\n}\n\nfunction StatTile({ label, value, tone }: StatTileProps): JSX.Element {\n return (\n <div className={cn('rounded-md border bg-bg px-2 py-2', TONE_STYLES[tone])}>\n <div className=\"text-[10px] uppercase tracking-wide text-text-dim\">{label}</div>\n <div className=\"text-xl font-semibold tabular-nums\">{value}</div>\n </div>\n )\n}\n\nfunction formatEpoch(ms: number | null | undefined): string {\n if (!ms) return '—'\n try {\n const d = new Date(ms)\n if (Number.isNaN(d.getTime())) return String(ms)\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return String(ms)\n }\n}\n"],"names":["AlarmClockCheck","createLucideIcon","DEFAULTS","readEnabled","raw","v","readSource","DistillConfigForm","onSaved","t","useTranslation","envQuery","useEnv","env","useMemo","cfgQuery","useConfig","llmQuery","useLlmList","enabledAgents","llmBackends","currentDistillRole","readForm","form","setForm","useState","initialRef","useRef","seededRef","useEffect","next","updateEnv","useUpdateEnv","putRoles","useLlmPutRoles","dirty","initial","k","set","prev","numField","value","min","label","n","validate","buildEnvUpdates","out","diffStr","key","cur","onSave","err","toast","envUpdates","roleChanged","f","serr","message","describeError","onDiscard","busy","noBackends","noAgents","jsxs","jsx","Badge","Button","Loader2","Save","Field","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","name","agentDisplayName","b","NumberField","help","children","Label","placeholder","step","onChange","Input","e","MemoryDistillRoute","statusQuery","useDistillStatus","status","trigger","useTriggerDistill","onRunNow","running","pending","RefreshCcw","Play","Fragment","StatTile","formatEpoch","TONE_STYLES","tone","cn","ms","d"],"mappings":"ifAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAkBC,EAAiB,kBAAmB,CAC1D,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,SAAU,EACxD,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,kBAAmB,IAAK,QAAQ,CAAE,EAChD,CAAC,OAAQ,CAAE,EAAG,qBAAsB,IAAK,QAAQ,CAAE,EACnD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC,EC8CKC,EAAW,CACf,WAAY,SACZ,SAAU,KACV,SAAU,KACV,WAAY,KACd,EAEA,SAASC,GAAYC,EAAkC,CACrD,MAAMC,GAAKD,GAAO,KAAK,KAAA,EAAO,YAAA,EAC9B,OAAOC,IAAM,KAAOA,IAAM,SAAWA,IAAM,MAAQA,IAAM,KAC3D,CAEA,SAASC,GAAWF,EAAwC,CAC1D,MAAMC,GAAKD,GAAO,QAAQ,YAAA,EAC1B,OAAOC,IAAM,SAAWA,IAAM,MAAQA,EAAI,MAC5C,CAOO,SAASE,GAAkB,CAAE,QAAAC,GAAgD,CAClF,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,CAAC,SAAU,QAAQ,CAAC,EAE3CC,EAAWC,GAAO,CAAE,OAAQ,GAAO,EACnCC,EAAMC,EAAAA,QAAQ,IAAMH,EAAS,MAAM,KAAO,CAAA,EAAI,CAACA,EAAS,MAAM,GAAG,CAAC,EAClEI,EAAWC,GAAA,EACXC,EAAWC,EAAA,EAEXC,EAAgBJ,EAAS,MAAM,QAAU,CAAA,EACzCK,EAAcH,EAAS,MAAM,UAAY,CAAA,EACzCI,EAAqBJ,EAAS,MAAM,OAAO,SAAW,GAEtDK,EAAWR,EAAAA,QAAyB,IAAM,KAAO,CACrD,OAAYR,GAAWO,EAAI,2BAA2B,EACtD,MAAYA,EAAI,4BAA8B,GAC9C,WAAYQ,EACZ,QAAYlB,GAAYU,EAAI,4BAA4B,EACxD,WAAYA,EAAI,kCAAoC,GACpD,SAAYA,EAAI,gCAAoC,GACpD,SAAYA,EAAI,gCAAoC,GACpD,WAAYA,EAAI,kCAAoC,EAAA,GAClD,CAACA,EAAKQ,CAAkB,CAAC,EAEvB,CAACE,EAAMC,CAAO,EAAIC,EAAAA,SAAoBH,CAAQ,EAC9CI,EAAaC,EAAAA,OAAkBJ,CAAI,EACnCK,EAAYD,EAAAA,OAAO,EAAK,EAS9BE,EAAAA,UAAU,IAAM,CAEd,GADID,EAAU,SACV,CAACjB,EAAS,MAAQ,CAACM,EAAS,KAAM,OACtC,MAAMa,EAAOR,EAAA,EACbE,EAAQM,CAAI,EACZJ,EAAW,QAAUI,EACrBF,EAAU,QAAU,EACtB,EAAG,CAACjB,EAAS,KAAMM,EAAS,KAAMK,CAAQ,CAAC,EAE3C,MAAMS,EAAYC,GAAA,EACZC,EAAWC,EAAA,EAEXC,EAAQrB,EAAAA,QAAQ,IAAM,CAC1B,MAAMsB,EAAUV,EAAW,QAC3B,OAAQ,OAAO,KAAKH,CAAI,EAA6B,KAAMc,GAAMd,EAAKc,CAAC,IAAMD,EAAQC,CAAC,CAAC,CACzF,EAAG,CAACd,CAAI,CAAC,EAET,SAASe,EAA+BD,EAAMhC,EAAuB,CACnEmB,EAASe,IAAU,CAAE,GAAGA,EAAM,CAACF,CAAC,EAAGhC,CAAA,EAAI,CACzC,CAEA,SAASmC,EAASC,EAAeC,EAAaC,EAA8B,CAC1E,GAAI,CAACF,EAAM,KAAA,EAAQ,OAAO,KAC1B,MAAMG,EAAI,OAAOH,CAAK,EACtB,MAAI,CAAC,OAAO,SAASG,CAAC,GAAKA,EAAIF,EAAYjC,EAAE,+BAAgC,CAAE,MAAOkC,EAAO,IAAAD,EAAK,EAC3F,IACT,CAEA,SAASG,GAA0B,CACjC,OAAItB,EAAK,SAAW,SAAW,CAACA,EAAK,MAAM,OAClCd,EAAE,mCAAmC,EAE1Cc,EAAK,SAAW,OAAS,CAACA,EAAK,WAAW,OACrCd,EAAE,iCAAiC,EAG1C+B,EAASjB,EAAK,WAAY,IAAOd,EAAE,yBAAyB,CAAC,GAC1D+B,EAASjB,EAAK,SAAU,EAAGd,EAAE,uBAAuB,CAAC,GACrD+B,EAASjB,EAAK,SAAU,EAAGd,EAAE,uBAAuB,CAAC,GACrD+B,EAASjB,EAAK,WAAY,EAAGd,EAAE,yBAAyB,CAAC,CAEhE,CAEA,SAASqC,GAAiD,CACxD,MAAMV,EAAUV,EAAW,QACrBqB,EAAqC,CAAA,EACrCC,EAAU,CAACC,EAAaC,EAAaX,IAAuB,CAC5DW,IAAQX,IACZQ,EAAIE,CAAG,EAAIC,EAAI,KAAA,IAAW,GAAK,KAAOA,EAAI,KAAA,EAC5C,EACA,OAAI3B,EAAK,SAAWa,EAAQ,SAE1BW,EAAI,4BAA8BxB,EAAK,SAAW,OAAS,KAAOA,EAAK,QAErEA,EAAK,UAAYa,EAAQ,UAC3BW,EAAI,6BAA+BxB,EAAK,QAAU,IAAM,KAItDA,EAAK,SAAW,QAClByB,EAAQ,6BAA8BzB,EAAK,MAAOa,EAAQ,KAAK,EACtDA,EAAQ,QACjBW,EAAI,2BAA6B,MAEnCC,EAAQ,mCAAoCzB,EAAK,WAAYa,EAAQ,UAAU,EAC/EY,EAAQ,iCAAoCzB,EAAK,SAAYa,EAAQ,QAAQ,EAC7EY,EAAQ,iCAAoCzB,EAAK,SAAYa,EAAQ,QAAQ,EAC7EY,EAAQ,mCAAoCzB,EAAK,WAAYa,EAAQ,UAAU,EACxEW,CACT,CAEA,eAAeI,GAAwB,CACrC,MAAMC,EAAMP,EAAA,EACZ,GAAIO,EAAK,CAAEC,EAAM,MAAMD,CAAG,EAAG,MAAO,CAEpC,MAAME,EAAaR,EAAA,EACbS,EAAchC,EAAK,SAAW,OAC/BA,EAAK,WAAW,KAAA,IAAW,IAC3BA,EAAK,aAAeG,EAAW,QAAQ,WAE5C,GAAI,OAAO,KAAK4B,CAAU,EAAE,SAAW,GAAK,CAACC,EAAa,CACxDF,EAAM,KAAK5C,EAAE,6BAA6B,CAAC,EAC3C,MACF,CAEA,GAAI,CACE,OAAO,KAAK6C,CAAU,EAAE,OAAS,GACnC,MAAMvB,EAAU,YAAY,CAAE,QAASuB,EAAY,EAEjDC,GACF,MAAMtB,EAAS,YAAY,CAAE,QAASV,EAAK,WAAW,KAAA,EAAQ,EAEhE8B,EAAM,QAAQ5C,EAAE,yBAAyB,CAAC,EAK1CiB,EAAW,QAAU,CAAE,GAAGH,CAAA,EAC1BC,EAASgC,IAAO,CAAE,GAAGA,GAAI,EACzBhD,IAAA,CACF,OAASiD,EAAM,CACb,KAAM,CAAE,QAAAC,CAAA,EAAYC,EAAcF,EAAMhD,CAAC,EACzC4C,EAAM,MAAMK,CAAO,CACrB,CACF,CAEA,SAASE,GAAkB,CACzBpC,EAAQE,EAAW,OAAO,CAC5B,CAEA,MAAMmC,EAAO9B,EAAU,WAAaE,EAAS,UACvC6B,EAAa1C,EAAY,SAAW,EACpC2C,EAAW5C,EAAc,SAAW,EAE1C,OACE6C,EAAAA,KAAC,MAAA,CAAI,UAAU,iDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,sBAAuB,SAAAxD,EAAE,oBAAoB,EAAE,EAC5D0B,GAAS8B,EAAAA,IAACC,EAAA,CAAM,QAAQ,OAAQ,SAAAzD,EAAE,oBAAoB,EAAE,EACzDuD,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACZ,SAAA,CAAA7B,GACC8B,EAAAA,IAACE,EAAA,CAAO,KAAK,SAAS,QAAQ,YAAY,KAAK,KAAK,QAASP,EAAW,SAAUC,EAC/E,SAAApD,EAAE,sBAAsB,EAC3B,EAEFuD,EAAAA,KAACG,EAAA,CAAO,KAAK,SAAS,KAAK,KAAK,QAAS,IAAM,KAAKhB,EAAA,EAAU,SAAU,CAAChB,GAAS0B,EAC/E,SAAA,CAAAA,EAAOI,EAAAA,IAACG,GAAQ,UAAU,sBAAA,CAAuB,EAAKH,EAAAA,IAACI,GAAA,CAAK,UAAU,SAAA,CAAU,EAChF5D,EAAE,mBAAmB,CAAA,CAAA,CACxB,CAAA,CAAA,CACF,CAAA,EACF,QACC,IAAA,CAAE,UAAU,6BAA8B,SAAAA,EAAE,mBAAmB,EAAE,EAEjEE,EAAS,UACRsD,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAAyD,EAExED,EAAAA,KAAC,MAAA,CAAI,UAAU,2BAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAC,EAAAA,IAACK,EAAA,CAAM,MAAO7D,EAAE,qBAAqB,EAAG,KAAMA,EAAE,yBAAyB,EACvE,SAAAuD,EAAAA,KAACO,GAAO,MAAOhD,EAAK,OAAQ,cAAgBlB,GAAMiC,EAAI,SAAUjC,CAAkB,EAChF,SAAA,CAAA4D,EAAAA,IAACO,EAAA,CACC,SAAAP,EAAAA,IAACQ,EAAA,CAAA,CAAY,EACf,SACCC,EAAA,CACC,SAAA,CAAAT,MAACU,EAAA,CAAW,MAAM,OAAQ,SAAAlE,EAAE,yBAAyB,EAAE,QACtDkE,EAAA,CAAW,MAAM,QAAS,SAAAlE,EAAE,0BAA0B,EAAE,QACxDkE,EAAA,CAAW,MAAM,MAAO,SAAAlE,EAAE,wBAAwB,CAAA,CAAE,CAAA,CAAA,CACvD,CAAA,CAAA,CACF,CAAA,CACF,EAECc,EAAK,SAAW,QACf0C,EAAAA,IAAC,OAAI,UAAU,iBACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAxD,EAAE,uBAAuB,EAAE,EACzE,EAGDc,EAAK,SAAW,SACf0C,EAAAA,IAACK,GAAM,MAAO7D,EAAE,oBAAoB,EAAG,KAAMA,EAAE,wBAAwB,EACpE,WACCwD,EAAAA,IAAC,IAAA,CAAE,UAAU,2BAA4B,SAAAxD,EAAE,uBAAuB,CAAA,CAAE,SAEnE8D,EAAA,CAAO,MAAOhD,EAAK,MAAO,cAAgBlB,GAAMiC,EAAI,QAASjC,CAAC,EAC7D,SAAA,CAAA4D,EAAAA,IAACO,GACC,SAAAP,MAACQ,EAAA,CAAY,YAAahE,EAAE,+BAA+B,EAAG,CAAA,CAChE,EACAwD,EAAAA,IAACS,EAAA,CACE,SAAAvD,EAAc,IAAKyD,GAClBX,MAACU,EAAA,CAAsB,MAAOC,EAAO,SAAAC,EAAiBD,CAAI,CAAA,EAAzCA,CAA2C,CAC7D,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAEJ,EAGDrD,EAAK,SAAW,OACf0C,EAAAA,IAACK,GAAM,MAAO7D,EAAE,yBAAyB,EAAG,KAAMA,EAAE,6BAA6B,EAC9E,WACCwD,EAAAA,IAAC,IAAA,CAAE,UAAU,2BAA4B,SAAAxD,EAAE,yBAAyB,CAAA,CAAE,SAErE8D,EAAA,CAAO,MAAOhD,EAAK,WAAY,cAAgBlB,GAAMiC,EAAI,aAAcjC,CAAC,EACvE,SAAA,CAAA4D,EAAAA,IAACO,GACC,SAAAP,MAACQ,EAAA,CAAY,YAAahE,EAAE,6BAA6B,EAAG,CAAA,CAC9D,EACAwD,EAAAA,IAACS,EAAA,CACE,SAAAtD,EAAY,IAAK0D,GAChBd,EAAAA,KAACW,EAAA,CAAwB,MAAOG,EAAE,KAC/B,SAAA,CAAAA,EAAE,KAAK,IAACd,EAAAA,KAAC,OAAA,CAAK,UAAU,kBAAkB,SAAA,CAAA,KAAGc,EAAE,KAAA,CAAA,CAAM,CAAA,GADvCA,EAAE,IAEnB,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,EAEJ,SAGC,MAAA,CACC,SAAA,CAAAb,MAAC,MAAA,CAAI,UAAU,oCAAqC,SAAAxD,EAAE,4BAA4B,EAAE,EACpFuD,EAAAA,KAAC,MAAA,CAAI,UAAU,6CACb,SAAA,CAAAC,EAAAA,IAACK,EAAA,CAAM,MAAO7D,EAAE,sBAAsB,EAAG,KAAMA,EAAE,0BAA0B,EACzE,SAAAuD,EAAAA,KAACO,EAAA,CACC,MAAOhD,EAAK,QAAU,KAAO,MAC7B,cAAgBlB,GAAMiC,EAAI,UAAWjC,IAAM,IAAI,EAE/C,SAAA,CAAA4D,EAAAA,IAACO,EAAA,CACC,SAAAP,EAAAA,IAACQ,EAAA,CAAA,CAAY,EACf,SACCC,EAAA,CACC,SAAA,CAAAT,MAACU,EAAA,CAAW,MAAM,KAAM,SAAAlE,EAAE,wBAAwB,EAAE,QACnDkE,EAAA,CAAW,MAAM,MAAO,SAAAlE,EAAE,yBAAyB,CAAA,CAAE,CAAA,CAAA,CACxD,CAAA,CAAA,CAAA,EAEJ,EACAwD,EAAAA,IAACc,EAAA,CACC,MAAOtE,EAAE,yBAAyB,EAClC,KAAMA,EAAE,6BAA6B,EACrC,MAAOc,EAAK,WACZ,YAAarB,EAAS,WACtB,IAAK,IACL,KAAM,IACN,SAAWG,GAAMiC,EAAI,aAAcjC,CAAC,CAAA,CAAA,EAEtC4D,EAAAA,IAACc,EAAA,CACC,MAAOtE,EAAE,uBAAuB,EAChC,KAAMA,EAAE,2BAA2B,EACnC,MAAOc,EAAK,SACZ,YAAarB,EAAS,SACtB,IAAK,EACL,KAAM,EACN,SAAWG,GAAMiC,EAAI,WAAYjC,CAAC,CAAA,CAAA,EAEpC4D,EAAAA,IAACc,EAAA,CACC,MAAOtE,EAAE,uBAAuB,EAChC,KAAMA,EAAE,2BAA2B,EACnC,MAAOc,EAAK,SACZ,YAAarB,EAAS,SACtB,IAAK,EACL,KAAM,EACN,SAAWG,GAAMiC,EAAI,WAAYjC,CAAC,CAAA,CAAA,EAEpC4D,EAAAA,IAACc,EAAA,CACC,MAAOtE,EAAE,yBAAyB,EAClC,KAAMA,EAAE,6BAA6B,EACrC,MAAOc,EAAK,WACZ,YAAarB,EAAS,WACtB,IAAK,EACL,KAAM,GACN,SAAWG,GAAMiC,EAAI,aAAcjC,CAAC,CAAA,CAAA,CACtC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,CAEA,SAASiE,EAAM,CACb,MAAA3B,EACA,KAAAqC,EACA,SAAAC,CACF,EAIgB,CACd,OACEjB,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAC,EAAAA,IAACiB,EAAA,CAAM,UAAU,wBAAyB,SAAAvC,EAAM,EAC/CsC,EACAD,GAAQf,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAe,CAAA,CAAK,CAAA,EAC5D,CAEJ,CAEA,SAASD,EAAY,CACnB,MAAApC,EACA,KAAAqC,EACA,MAAAvC,EACA,YAAA0C,EACA,IAAAzC,EACA,KAAA0C,EACA,SAAAC,CACF,EAQgB,CACd,OACEpB,EAAAA,IAACK,EAAA,CAAM,MAAA3B,EAAc,KAAAqC,EACnB,SAAAf,EAAAA,IAACqB,GAAA,CACC,KAAK,SACL,IAAA5C,EACA,KAAA0C,EACA,MAAA3C,EACA,YAAA0C,EACA,SAAWI,GAAMF,EAASE,EAAE,OAAO,KAAK,EACxC,UAAU,mBAAA,CAAA,EAEd,CAEJ,CC7YA,SAAwBC,IAAkC,CACxD,KAAM,CAAE,EAAA/E,CAAA,EAAMC,EAAe,CAAC,SAAU,QAAQ,CAAC,EAC3C+E,EAAcC,GAAA,EACdC,EAASF,EAAY,KACrBG,EAAUC,GAAA,EAEhB,eAAeC,GAA0B,CACvC,GAAI,CACF,MAAMF,EAAQ,YAAA,EACdvC,EAAM,QAAQ5C,EAAE,4BAA4B,CAAC,CAC/C,OAAS2C,EAAK,CACZ,KAAM,CAAE,QAAAM,CAAA,EAAYC,EAAcP,EAAK3C,CAAC,EACxC4C,EAAM,MAAMK,CAAO,CACrB,CACF,CAEA,MAAMqC,EAAU,CAAC,CAACJ,GAAQ,QACpBK,EAAUL,GAAQ,cAAgB,EAExC,OACE3B,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,sBAChB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAxD,EAAE,eAAe,EAAE,EAC1DuD,EAAAA,KAACG,EAAA,CACC,QAAQ,QACR,KAAK,KACL,UAAU,UACV,QAAS,IAAMsB,EAAY,QAAA,EAC3B,SAAUA,EAAY,WACtB,aAAYhF,EAAE,kBAAmB,CAAE,GAAI,SAAU,EAEhD,SAAA,CAAAgF,EAAY,iBAAcrB,EAAA,CAAQ,UAAU,uBAAuB,EAAKH,EAAAA,IAACgC,GAAA,CAAW,UAAU,SAAA,CAAU,EACzGhC,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAoB,SAAAxD,EAAE,kBAAmB,CAAE,GAAI,QAAA,CAAU,CAAA,CAAE,CAAA,CAAA,CAAA,CAC7E,EACF,QACC,IAAA,CAAE,UAAU,wBAAyB,SAAAA,EAAE,kBAAkB,CAAA,CAAE,CAAA,EAC9D,QAGCF,GAAA,CAAkB,QAAS,IAAM,KAAKkF,EAAY,UAAW,EAG9DzB,EAAAA,KAAC,MAAA,CAAI,UAAU,iDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAC,MAAC,OAAA,CAAK,UAAU,cAAe,SAAAxD,EAAE,sBAAsB,EAAE,EACzDwD,EAAAA,IAACC,EAAA,CAAM,QAASyB,GAAQ,QAAU,UAAY,YAC3C,SAAAA,GAAQ,QAAUlF,EAAE,4BAA4B,EAAIA,EAAE,6BAA6B,EACtF,EACCsF,GACC/B,EAAAA,KAACE,EAAA,CAAM,QAAQ,OACb,SAAA,CAAAD,EAAAA,IAACG,EAAA,CAAQ,UAAU,kCAAA,CAAmC,EACrD3D,EAAE,wBAAwB,CAAA,EAC7B,EAEFwD,EAAAA,IAAC,MAAA,CAAI,UAAU,UACb,SAAAD,EAAAA,KAACG,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAM,KAAK2B,EAAA,EACpB,SAAUF,EAAQ,WAAaG,GAAW,CAACJ,GAAQ,QAElD,SAAA,CAAAC,EAAQ,gBAAaxB,EAAA,CAAQ,UAAU,uBAAuB,EAAKH,EAAAA,IAACiC,GAAA,CAAK,UAAU,SAAA,CAAU,EAC7FzF,EAAE,wBAAwB,CAAA,CAAA,CAAA,CAC7B,CACF,CAAA,EACF,EAECgF,EAAY,UACXxB,MAAC,OAAI,UAAU,wDAAA,CAAyD,EAExED,EAAAA,KAAAmC,EAAAA,SAAA,CACE,SAAA,CAAAnC,EAAAA,KAAC,MAAA,CAAI,UAAU,6CACb,SAAA,CAAAC,EAAAA,IAACmC,EAAA,CAAS,MAAO3F,EAAE,wBAAwB,EAAS,MAAOuF,EAA+B,KAAMA,EAAU,EAAI,UAAY,SAAA,CAAW,EACrI/B,EAAAA,IAACmC,EAAA,CAAS,MAAO3F,EAAE,8BAA8B,EAAG,MAAOkF,GAAQ,eAAiB,EAAM,KAAK,MAAA,CAAO,EACtG1B,EAAAA,IAACmC,EAAA,CAAS,MAAO3F,EAAE,wBAAwB,EAAS,MAAO4F,GAAYV,GAAQ,SAAS,EAAG,KAAK,MAAA,CAAO,CAAA,EACzG,EACCK,IAAY,GACXhC,OAAC,IAAA,CAAE,UAAU,uDACX,SAAA,CAAAC,EAAAA,IAACjE,GAAA,CAAgB,UAAU,SAAA,CAAU,EACpCS,EAAE,4BAA4B,CAAA,EACjC,EAEDkF,GAAQ,WACP3B,OAAC,IAAA,CAAE,UAAU,qCACV,SAAA,CAAAvD,EAAE,0BAA0B,EAAE,KAAGkF,EAAO,SAAA,CAAA,CAC3C,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,CAQA,MAAMW,GAAqD,CACzD,KAAS,8BACT,QAAS,iCACT,QAAS,iCACT,OAAS,+BACX,EAEA,SAASF,EAAS,CAAE,MAAAzD,EAAO,MAAAF,EAAO,KAAA8D,GAAoC,CACpE,OACEvC,EAAAA,KAAC,OAAI,UAAWwC,GAAG,oCAAqCF,GAAYC,CAAI,CAAC,EACvE,SAAA,CAAAtC,EAAAA,IAAC,MAAA,CAAI,UAAU,oDAAqD,SAAAtB,EAAM,EAC1EsB,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAsC,SAAAxB,CAAA,CAAM,CAAA,EAC7D,CAEJ,CAEA,SAAS4D,GAAYI,EAAuC,CAC1D,GAAI,CAACA,EAAI,MAAO,IAChB,GAAI,CACF,MAAMC,EAAI,IAAI,KAAKD,CAAE,EACrB,OAAI,OAAO,MAAMC,EAAE,QAAA,CAAS,EAAU,OAAOD,CAAE,EACxCC,EAAE,eAAe,OAAW,CAAE,MAAO,QAAS,IAAK,UAAW,KAAM,UAAW,OAAQ,SAAA,CAAW,CAC3G,MAAQ,CACN,OAAO,OAAOD,CAAE,CAClB,CACF","x_google_ignoreList":[0]}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{o as A,u as F,j as e,ab as L,l as I,B as u,I as S,c as z,S as D,g as V,h as X,i as J,k as g,X as K,m,n as j,L as Q}from"./index-DY2Zglku.js";import{r as M}from"./react-DlP5eolq.js";import{u as Y,b as q,f as G}from"./use-settings-Co-iafXD.js";import{L as H}from"./loader-circle-D8L1w9c1.js";import{C as W}from"./circle-x-7VaoZ7dY.js";import{C as Z}from"./circle-check-COhM5JsK.js";import{R as $}from"./refresh-ccw-7HdadG5V.js";import{E as ee,a as se}from"./eye-BvsBLK42.js";import{S as ae}from"./save-BYFmz9gD.js";/**
|
|
2
|
-
* @license lucide-react v0.469.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const te=A("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]),U=["IMHUB_SMTP_HOST","IMHUB_SMTP_PORT","IMHUB_SMTP_USER","IMHUB_SMTP_PASS","IMHUB_SMTP_FROM","IMHUB_SMTP_SECURE"];function v(){return{IMHUB_SMTP_HOST:"",IMHUB_SMTP_PORT:"",IMHUB_SMTP_USER:"",IMHUB_SMTP_PASS:"",IMHUB_SMTP_FROM:"",IMHUB_SMTP_SECURE:"auto"}}function ie(s){const i=(s??"").trim().toLowerCase();return i==="1"||i==="true"||i==="yes"?"true":i==="0"||i==="false"||i==="no"?"false":"auto"}function P(s){return{IMHUB_SMTP_HOST:s.IMHUB_SMTP_HOST??"",IMHUB_SMTP_PORT:s.IMHUB_SMTP_PORT??"",IMHUB_SMTP_USER:s.IMHUB_SMTP_USER??"",IMHUB_SMTP_PASS:s.IMHUB_SMTP_PASS??"",IMHUB_SMTP_FROM:s.IMHUB_SMTP_FROM??"",IMHUB_SMTP_SECURE:ie(s.IMHUB_SMTP_SECURE)}}function B(s){return/\*{3,}/.test(s)}function he(){const{t:s}=F(["settings","common"]),[i,T]=M.useState(!1),n=Y({reveal:i}),o=q(),h=G(),l=n.data?.env??{},[r,f]=M.useState(v),[b,C]=M.useState("");M.useEffect(()=>{if(!n.data)return;const a=P(l),t=JSON.stringify(a);t!==b&&(f(a),C(t))},[n.dataUpdatedAt]);const _=!!(l.IMHUB_SMTP_HOST&&l.IMHUB_SMTP_USER&&l.IMHUB_SMTP_PASS),N=M.useMemo(()=>{if(!n.data)return!1;const a=P(l);for(const t of U)if(!(t==="IMHUB_SMTP_PASS"&&r[t]&&B(r[t])&&r[t]===a[t])&&r[t]!==a[t])return!0;return!1},[r,l,n.data]);function d(a,t){f(c=>({...c,[a]:t}))}function E(){n.data&&f(P(l))}async function R(){if(!n.data)return;const a=P(l),t={};for(const c of U){const p=r[c],k=a[c];p!==k&&(c==="IMHUB_SMTP_PASS"&&B(p)||(t[c]=p===""?null:p))}if(Object.keys(t).length===0){m.info(s("email.toast.noChanges"));return}try{await o.mutateAsync({updates:t}),m.success(s("email.toast.saved"))}catch(c){m.error(j(c,s).message)}}async function y(){if(!n.data)return;const a={};for(const t of U)a[t]=null;try{await o.mutateAsync({updates:a}),f(v()),m.success(s("email.toast.disabled"))}catch(t){m.error(j(t,s).message)}}async function w(){try{const a=await h.mutateAsync();m.success(a.message)}catch(a){m.error(j(a,s).message)}}const O=h.isPending?e.jsx(H,{className:"h-4 w-4 animate-spin"}):h.isError?e.jsx(W,{className:"h-4 w-4 text-danger"}):h.isSuccess?e.jsx(Z,{className:"h-4 w-4 text-success"}):e.jsx(L,{className:"h-4 w-4"});return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("email.title")}),_?e.jsx(I,{variant:"success",children:s("email.statusOn")}):e.jsx(I,{variant:"outline",children:s("email.statusOff")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void n.refetch(),disabled:n.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[n.isFetching?e.jsx(H,{className:"h-4 w-4 animate-spin"}):e.jsx($,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("email.subtitle")})]}),n.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(te,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:s("email.cardTitle")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>T(a=>!a),disabled:n.isFetching,"aria-label":s(i?"email.hide":"email.reveal"),children:[i?e.jsx(ee,{className:"h-4 w-4"}):e.jsx(se,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s(i?"email.hide":"email.reveal")})]})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 px-4 py-4 sm:grid-cols-2",children:[e.jsx(x,{label:s("email.host"),hint:s("email.hostHint"),children:e.jsx(S,{value:r.IMHUB_SMTP_HOST,onChange:a=>d("IMHUB_SMTP_HOST",a.target.value),placeholder:"smtp.gmail.com",autoComplete:"off"})}),e.jsx(x,{label:s("email.port"),hint:s("email.portHint"),children:e.jsx(S,{type:"number",inputMode:"numeric",min:1,max:65535,value:r.IMHUB_SMTP_PORT,onChange:a=>d("IMHUB_SMTP_PORT",a.target.value),placeholder:"465",autoComplete:"off"})}),e.jsx(x,{label:s("email.user"),hint:s("email.userHint"),children:e.jsx(S,{value:r.IMHUB_SMTP_USER,onChange:a=>d("IMHUB_SMTP_USER",a.target.value),placeholder:"you@example.com",autoComplete:"off"})}),e.jsx(x,{label:s("email.pass"),hint:s("email.passHint"),children:e.jsx(S,{type:i?"text":"password",value:r.IMHUB_SMTP_PASS,onChange:a=>d("IMHUB_SMTP_PASS",a.target.value),placeholder:"••••••••",autoComplete:"new-password",className:z(B(r.IMHUB_SMTP_PASS)&&"font-mono text-text-muted")})}),e.jsx(x,{label:s("email.from"),hint:s("email.fromHint"),children:e.jsx(S,{value:r.IMHUB_SMTP_FROM,onChange:a=>d("IMHUB_SMTP_FROM",a.target.value),placeholder:"",autoComplete:"off"})}),e.jsx(x,{label:s("email.secure"),hint:s("email.secureHint"),children:e.jsxs(D,{value:r.IMHUB_SMTP_SECURE,onValueChange:a=>d("IMHUB_SMTP_SECURE",a),children:[e.jsx(V,{children:e.jsx(X,{})}),e.jsxs(J,{children:[e.jsx(g,{value:"auto",children:s("email.secureAuto")}),e.jsx(g,{value:"true",children:s("email.secureTrue")}),e.jsx(g,{value:"false",children:s("email.secureFalse")})]})]})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 border-t border-border px-4 py-3",children:[e.jsxs(u,{variant:"secondary",size:"sm",onClick:()=>void w(),disabled:!_||h.isPending,title:_?void 0:s("email.testNeedsConfigured"),children:[O,s("email.testBtn")]}),e.jsxs(u,{variant:"ghost",size:"sm",onClick:()=>void y(),disabled:!_||o.isPending,className:"text-danger hover:text-danger",children:[e.jsx(K,{className:"h-4 w-4"}),s("email.disableBtn")]}),e.jsx("span",{className:"ml-auto"}),N&&e.jsxs(e.Fragment,{children:[e.jsx(u,{variant:"ghost",size:"sm",onClick:E,disabled:o.isPending,children:s("email.discard")}),e.jsxs(u,{size:"sm",onClick:()=>void R(),disabled:o.isPending,children:[o.isPending?e.jsx(H,{className:"h-4 w-4 animate-spin"}):e.jsx(ae,{className:"h-4 w-4"}),o.isPending?s("email.saving"):s("email.saveBtn")]})]})]})]})]})}function x({label:s,hint:i,children:T}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(Q,{className:"text-xs font-medium",children:s}),T,i&&e.jsx("p",{className:"text-[11px] text-text-dim",children:i})]})}export{he as default,ie as normalizeSecure};
|
|
7
|
-
//# sourceMappingURL=email-Douv-rZ5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email-Douv-rZ5.js","sources":["../../node_modules/lucide-react/dist/esm/icons/mail.js","../../src/routes/settings/email.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Mail = createLucideIcon(\"Mail\", [\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }],\n [\"path\", { d: \"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\", key: \"1ocrg3\" }]\n]);\n\nexport { Mail as default };\n//# sourceMappingURL=mail.js.map\n","/**\n * /settings/email — SMTP credentials editor (matches v1 settings.html's\n * \"📨 SMTP\" card). Drives email delivery for `/remind email me@x.com …`.\n *\n * Six env keys, persisted to `~/.agim/.env`:\n * * IMHUB_SMTP_HOST / PORT / USER / PASS / FROM / SECURE\n *\n * IMHUB_SMTP_PASS is in the backend's SECRET_KEYS set — masked unless\n * the Reveal toggle issues a `?reveal=1` fetch. Submitting a masked\n * string back is a no-op on the backend (it preserves the real value).\n *\n * Test button calls POST /api/messengers/email/test which runs\n * `nodemailer.verify()` against the live env (i.e. the operator must\n * Save first, then Test — same UX as v1).\n *\n * Disable button clears all six keys via a single PUT /api/env with\n * null values; the email adapter then logs `email.disabled` on the\n * next service restart.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n CheckCircle2, Eye, EyeOff, Loader2, Mail, RefreshCcw,\n Save, Send, X, XCircle,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useEnv, useUpdateEnv, useTestEmail } from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\n\nconst SMTP_KEYS = [\n 'IMHUB_SMTP_HOST',\n 'IMHUB_SMTP_PORT',\n 'IMHUB_SMTP_USER',\n 'IMHUB_SMTP_PASS',\n 'IMHUB_SMTP_FROM',\n 'IMHUB_SMTP_SECURE',\n] as const\n\ntype SmtpKey = typeof SMTP_KEYS[number]\ntype SecureMode = 'auto' | 'true' | 'false'\n\ninterface Draft {\n IMHUB_SMTP_HOST: string\n IMHUB_SMTP_PORT: string\n IMHUB_SMTP_USER: string\n IMHUB_SMTP_PASS: string\n IMHUB_SMTP_FROM: string\n IMHUB_SMTP_SECURE: SecureMode\n}\n\nfunction emptyDraft(): Draft {\n return {\n IMHUB_SMTP_HOST: '',\n IMHUB_SMTP_PORT: '',\n IMHUB_SMTP_USER: '',\n IMHUB_SMTP_PASS: '',\n IMHUB_SMTP_FROM: '',\n IMHUB_SMTP_SECURE: 'auto',\n }\n}\n\n// R13: exported so the unit suite can lock the env-string → SecureMode\n// mapping without spinning up Radix Select (whose trigger label isn't\n// readable in jsdom). Mirrors the operator's mental model: anything\n// that reads as \"yes/true/on\" maps to true; \"no/false/off\" to false;\n// blank / unknown to auto (defer to port-based heuristic at send time).\nexport function normalizeSecure(raw: string | undefined): SecureMode {\n const v = (raw ?? '').trim().toLowerCase()\n if (v === '1' || v === 'true' || v === 'yes') return 'true'\n if (v === '0' || v === 'false' || v === 'no') return 'false'\n return 'auto'\n}\n\nfunction draftFromEnv(env: Record<string, string>): Draft {\n return {\n IMHUB_SMTP_HOST: env.IMHUB_SMTP_HOST ?? '',\n IMHUB_SMTP_PORT: env.IMHUB_SMTP_PORT ?? '',\n IMHUB_SMTP_USER: env.IMHUB_SMTP_USER ?? '',\n IMHUB_SMTP_PASS: env.IMHUB_SMTP_PASS ?? '',\n IMHUB_SMTP_FROM: env.IMHUB_SMTP_FROM ?? '',\n IMHUB_SMTP_SECURE: normalizeSecure(env.IMHUB_SMTP_SECURE),\n }\n}\n\n/** Detect the backend's secret-mask format: `ab****yz` (3+ `*` between\n * surrounding chars). PUT /api/env preserves the real value when it\n * sees this pattern, so client edits that just echo the mask are a\n * no-op — we skip them in the dirty check + the submit body. */\nfunction isMasked(s: string): boolean {\n return /\\*{3,}/.test(s)\n}\n\nexport default function SettingsEmailRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n\n const [reveal, setReveal] = useState(false)\n const envQuery = useEnv({ reveal })\n const updateEnv = useUpdateEnv()\n const testMut = useTestEmail()\n\n const env = envQuery.data?.env ?? {}\n\n const [draft, setDraft] = useState<Draft>(emptyDraft)\n // Sync draft from server whenever a fresh env arrives (initial load\n // + reveal toggle + post-save refetch). Local edits that diverge stay\n // until the user Saves or Discards.\n const [syncedHash, setSyncedHash] = useState<string>('')\n useEffect(() => {\n if (!envQuery.data) return\n const next = draftFromEnv(env)\n const hash = JSON.stringify(next)\n if (hash !== syncedHash) {\n setDraft(next)\n setSyncedHash(hash)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [envQuery.dataUpdatedAt])\n\n const isConfigured = !!(env.IMHUB_SMTP_HOST && env.IMHUB_SMTP_USER && env.IMHUB_SMTP_PASS)\n\n const isDirty = useMemo(() => {\n if (!envQuery.data) return false\n const current = draftFromEnv(env)\n for (const k of SMTP_KEYS) {\n // PASS: ignore \"user just echoed the mask back\" as no-change.\n if (k === 'IMHUB_SMTP_PASS' && draft[k] && isMasked(draft[k]) && draft[k] === current[k]) continue\n if (draft[k] !== current[k]) return true\n }\n return false\n }, [draft, env, envQuery.data])\n\n function setField<K extends SmtpKey>(key: K, value: Draft[K]): void {\n setDraft((d) => ({ ...d, [key]: value }))\n }\n\n function onDiscard(): void {\n if (!envQuery.data) return\n setDraft(draftFromEnv(env))\n }\n\n async function onSave(): Promise<void> {\n if (!envQuery.data) return\n const current = draftFromEnv(env)\n const updates: Record<string, string | null> = {}\n for (const k of SMTP_KEYS) {\n const next = draft[k]\n const cur = current[k]\n if (next === cur) continue\n // Don't ship a masked PASS as the new value — backend's\n // isMasked-detect already skips it server-side, but keep the\n // wire honest.\n if (k === 'IMHUB_SMTP_PASS' && isMasked(next)) continue\n // Empty string → null (explicit unset) for non-PASS fields.\n // For PASS, an empty string also means \"clear\" (Disable button uses\n // the same path).\n updates[k] = next === '' ? null : next\n }\n if (Object.keys(updates).length === 0) {\n toast.info(t('email.toast.noChanges'))\n return\n }\n try {\n await updateEnv.mutateAsync({ updates })\n toast.success(t('email.toast.saved'))\n // refetch handled by hook's onSuccess; draft will re-sync via\n // the dataUpdatedAt effect on the next paint.\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n async function onDisable(): Promise<void> {\n if (!envQuery.data) return\n const updates: Record<string, string | null> = {}\n for (const k of SMTP_KEYS) updates[k] = null\n try {\n await updateEnv.mutateAsync({ updates })\n setDraft(emptyDraft())\n toast.success(t('email.toast.disabled'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n async function onTest(): Promise<void> {\n try {\n const res = await testMut.mutateAsync()\n toast.success(res.message)\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n const testIcon =\n testMut.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : testMut.isError ? <XCircle className=\"h-4 w-4 text-danger\" />\n : testMut.isSuccess ? <CheckCircle2 className=\"h-4 w-4 text-success\" />\n : <Send className=\"h-4 w-4\" />\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('email.title')}</h1>\n {isConfigured\n ? <Badge variant=\"success\">{t('email.statusOn')}</Badge>\n : <Badge variant=\"outline\">{t('email.statusOff')}</Badge>}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => void envQuery.refetch()}\n disabled={envQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {envQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('email.subtitle')}</p>\n </header>\n\n {envQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <Mail className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('email.cardTitle')}</h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => setReveal((v) => !v)}\n disabled={envQuery.isFetching}\n aria-label={reveal ? t('email.hide') : t('email.reveal')}\n >\n {reveal ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{reveal ? t('email.hide') : t('email.reveal')}</span>\n </Button>\n </header>\n\n <div className=\"grid grid-cols-1 gap-3 px-4 py-4 sm:grid-cols-2\">\n <Field label={t('email.host')} hint={t('email.hostHint')}>\n <Input\n value={draft.IMHUB_SMTP_HOST}\n onChange={(e) => setField('IMHUB_SMTP_HOST', e.target.value)}\n placeholder=\"smtp.gmail.com\"\n autoComplete=\"off\"\n />\n </Field>\n <Field label={t('email.port')} hint={t('email.portHint')}>\n <Input\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n max={65535}\n value={draft.IMHUB_SMTP_PORT}\n onChange={(e) => setField('IMHUB_SMTP_PORT', e.target.value)}\n placeholder=\"465\"\n autoComplete=\"off\"\n />\n </Field>\n <Field label={t('email.user')} hint={t('email.userHint')}>\n <Input\n value={draft.IMHUB_SMTP_USER}\n onChange={(e) => setField('IMHUB_SMTP_USER', e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"off\"\n />\n </Field>\n <Field label={t('email.pass')} hint={t('email.passHint')}>\n <Input\n type={reveal ? 'text' : 'password'}\n value={draft.IMHUB_SMTP_PASS}\n onChange={(e) => setField('IMHUB_SMTP_PASS', e.target.value)}\n placeholder=\"••••••••\"\n autoComplete=\"new-password\"\n className={cn(isMasked(draft.IMHUB_SMTP_PASS) && 'font-mono text-text-muted')}\n />\n </Field>\n <Field label={t('email.from')} hint={t('email.fromHint')}>\n <Input\n value={draft.IMHUB_SMTP_FROM}\n onChange={(e) => setField('IMHUB_SMTP_FROM', e.target.value)}\n placeholder=\"\"\n autoComplete=\"off\"\n />\n </Field>\n <Field label={t('email.secure')} hint={t('email.secureHint')}>\n <Select\n value={draft.IMHUB_SMTP_SECURE}\n onValueChange={(v) => setField('IMHUB_SMTP_SECURE', v as SecureMode)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"auto\">{t('email.secureAuto')}</SelectItem>\n <SelectItem value=\"true\">{t('email.secureTrue')}</SelectItem>\n <SelectItem value=\"false\">{t('email.secureFalse')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2 border-t border-border px-4 py-3\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onTest()}\n disabled={!isConfigured || testMut.isPending}\n title={!isConfigured ? t('email.testNeedsConfigured') : undefined}\n >\n {testIcon}\n {t('email.testBtn')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void onDisable()}\n disabled={!isConfigured || updateEnv.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <X className=\"h-4 w-4\" />\n {t('email.disableBtn')}\n </Button>\n <span className=\"ml-auto\" />\n {isDirty && (\n <>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onDiscard}\n disabled={updateEnv.isPending}\n >\n {t('email.discard')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateEnv.isPending}\n >\n {updateEnv.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Save className=\"h-4 w-4\" />}\n {updateEnv.isPending ? t('email.saving') : t('email.saveBtn')}\n </Button>\n </>\n )}\n </div>\n </section>\n )}\n </div>\n )\n}\n\ninterface FieldProps {\n label: string\n hint?: string\n children: React.ReactNode\n}\n\nfunction Field({ label, hint, children }: FieldProps): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label className=\"text-xs font-medium\">{label}</Label>\n {children}\n {hint && <p className=\"text-[11px] text-text-dim\">{hint}</p>}\n </div>\n )\n}\n"],"names":["Mail","createLucideIcon","SMTP_KEYS","emptyDraft","normalizeSecure","raw","v","draftFromEnv","env","isMasked","SettingsEmailRoute","t","useTranslation","reveal","setReveal","useState","envQuery","useEnv","updateEnv","useUpdateEnv","testMut","useTestEmail","draft","setDraft","syncedHash","setSyncedHash","useEffect","next","hash","isConfigured","isDirty","useMemo","current","k","setField","key","value","d","onDiscard","onSave","updates","cur","toast","err","describeError","onDisable","onTest","res","testIcon","jsx","Loader2","XCircle","CheckCircle2","Send","jsxs","Badge","Button","RefreshCcw","EyeOff","Eye","Field","Input","e","cn","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","X","Fragment","Save","label","hint","children","Label"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import{o as R,u as p,j as e,B as _,l as T,X as F,I as m,S as B,g as O,h as w,i as V,k as f,m as j,L as v,a6 as Y,ac as q,ad as W,ae as $,a7 as J}from"./index-DY2Zglku.js";import{r as b}from"./react-DlP5eolq.js";import{T as Z,a as Q,b as K,c as E,d as ee,e as C}from"./table-_WsrnZ_T.js";import{u as te,b as ae}from"./use-settings-Co-iafXD.js";import{L as S}from"./loader-circle-D8L1w9c1.js";import{R as X}from"./refresh-ccw-7HdadG5V.js";import{S as se}from"./save-BYFmz9gD.js";import{N as ne}from"./network-BBdRdrH_.js";import{S as le}from"./shield-alert-DXGk9Rak.js";import{B as re}from"./bell-D7iS7ctN.js";import{H as ce}from"./heart-pulse-CVEeD2sz.js";import{T as ie}from"./trash-2-1Km439fW.js";import{P as oe}from"./plus-C2zyJ1mF.js";/**
|
|
2
|
-
* @license lucide-react v0.469.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const me=R("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/**
|
|
7
|
-
* @license lucide-react v0.469.0 - ISC
|
|
8
|
-
*
|
|
9
|
-
* This source code is licensed under the ISC license.
|
|
10
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const de=R("FileStack",[["path",{d:"M21 7h-3a2 2 0 0 1-2-2V2",key:"9rb54x"}],["path",{d:"M21 6v6.5c0 .8-.7 1.5-1.5 1.5h-7c-.8 0-1.5-.7-1.5-1.5v-9c0-.8.7-1.5 1.5-1.5H17Z",key:"1059l0"}],["path",{d:"M7 8v8.8c0 .3.2.6.4.8.2.2.5.4.8.4H15",key:"16874u"}],["path",{d:"M3 12v8.8c0 .3.2.6.4.8.2.2.5.4.8.4H11",key:"k2ox98"}]]);/**
|
|
12
|
-
* @license lucide-react v0.469.0 - ISC
|
|
13
|
-
*
|
|
14
|
-
* This source code is licensed under the ISC license.
|
|
15
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
-
*/const xe=R("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/**
|
|
17
|
-
* @license lucide-react v0.469.0 - ISC
|
|
18
|
-
*
|
|
19
|
-
* This source code is licensed under the ISC license.
|
|
20
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
-
*/const he=R("Waves",[["path",{d:"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"knzxuh"}],["path",{d:"M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"2jd2cc"}],["path",{d:"M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"rd2r6e"}]]);/**
|
|
22
|
-
* @license lucide-react v0.469.0 - ISC
|
|
23
|
-
*
|
|
24
|
-
* This source code is licensed under the ISC license.
|
|
25
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
26
|
-
*/const ue=R("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]);function pe(t){return{role:t.IMHUB_NATIVE_AGENT_ROLE??"",mode:t.IMHUB_NATIVE_AGENT_MODE||"read-only",autoAllow:t.IMHUB_NATIVE_AGENT_AUTOALLOW??"",denyList:t.IMHUB_NATIVE_AGENT_DENYLIST??"",evalEnabled:y(t.IMHUB_NOTIFICATION_EVALUATOR),evalSources:t.IMHUB_NOTIFICATION_EVALUATOR_SOURCES??"",hbEnabled:y(t.IMHUB_HEARTBEAT_ENABLED),hbTickMs:t.IMHUB_HEARTBEAT_TICK_INTERVAL_MS??"",hbDefaultMin:t.IMHUB_HEARTBEAT_DEFAULT_INTERVAL_MIN??"",toolResultCap:t.IMHUB_NATIVE_TOOL_RESULT_MAX_CHARS??"",toolTimeoutMs:t.IMHUB_NATIVE_TOOL_TIMEOUT_MS??"",blankRetryMax:t.IMHUB_NATIVE_BLANK_RETRY_MAX??"",lengthRecoveryMax:t.IMHUB_NATIVE_LENGTH_RECOVERY_MAX??"",a2aMaxDepth:t.IMHUB_A2A_MAX_DEPTH??"",a2aTimeoutMs:t.IMHUB_A2A_TIMEOUT_DEFAULT_MS??"",callAgentInProcess:!L(t.IMHUB_NATIVE_CALL_AGENT_IN_PROCESS),callAgentMaxPerTurn:t.IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN??"",semanticStuckLoop:!L(t.IMHUB_NATIVE_SEMANTIC_STUCK_LOOP),criticEnabled:y(t.IMHUB_NATIVE_CRITIC),criticRole:t.IMHUB_NATIVE_CRITIC_ROLE??"",planModeDefault:y(t.IMHUB_NATIVE_PLAN_MODE),planIntentAuto:y(t.IMHUB_PLAN_INTENT_AUTO),planIntentPhrases:t.IMHUB_PLAN_INTENT_PHRASES??"",compactTriggerChars:t.IMHUB_NATIVE_COMPACT_TRIGGER_CHARS??"",compactKeepTurns:t.IMHUB_NATIVE_COMPACT_KEEP_TURNS??"",compactKeepFirst:t.IMHUB_NATIVE_COMPACT_KEEP_FIRST??"",compactSummaryChars:t.IMHUB_NATIVE_COMPACT_SUMMARY_CHARS??"",streamPartial:!L(t.IMHUB_NATIVE_STREAM_PARTIAL),maxIter:t.IMHUB_NATIVE_AGENT_MAX_ITER??""}}function L(t){if(!t)return!1;const s=t.toLowerCase().trim();return s==="off"||s==="false"||s==="0"||s==="no"}function y(t){if(!t)return!1;const s=t.toLowerCase();return s==="1"||s==="true"||s==="yes"||s==="on"}function ge(){const{t}=p(["settings","common"]),s=t("nativeAgent.subtitle"),a=t("nativeAgent.llmLink"),l=s.indexOf(a);return l===-1?e.jsx("p",{className:"text-sm text-text-dim",children:s}):e.jsxs("p",{className:"text-sm text-text-dim",children:[s.slice(0,l),e.jsx("a",{className:"underline",href:a,children:a}),s.slice(l+a.length)]})}function Ae({embedded:t=!1}){const{t:s}=p(["settings","common"]),a=te({reveal:!1}),l=ae(),g=a.data?.env??{},r=b.useMemo(()=>pe(g),[g]),[n,h]=b.useState(r),[A,i]=b.useState("");b.useEffect(()=>{const c=JSON.stringify(r);c!==A&&(h(r),i(c))},[r,A]);const d=JSON.stringify(n)!==JSON.stringify(r);function u(c,M){h(U=>({...U,[c]:M}))}async function I(){const c={};if(n.role!==r.role&&(c.IMHUB_NATIVE_AGENT_ROLE=n.role.trim()||null),n.mode!==r.mode&&(c.IMHUB_NATIVE_AGENT_MODE=n.mode),n.autoAllow!==r.autoAllow&&(c.IMHUB_NATIVE_AGENT_AUTOALLOW=n.autoAllow.trim()||null),n.denyList!==r.denyList&&(c.IMHUB_NATIVE_AGENT_DENYLIST=n.denyList.trim()||null),n.evalEnabled!==r.evalEnabled&&(c.IMHUB_NOTIFICATION_EVALUATOR=n.evalEnabled?"on":null),n.evalSources!==r.evalSources&&(c.IMHUB_NOTIFICATION_EVALUATOR_SOURCES=n.evalSources.trim()||null),n.hbEnabled!==r.hbEnabled&&(c.IMHUB_HEARTBEAT_ENABLED=n.hbEnabled?"on":null),n.hbTickMs!==r.hbTickMs&&(c.IMHUB_HEARTBEAT_TICK_INTERVAL_MS=n.hbTickMs.trim()||null),n.hbDefaultMin!==r.hbDefaultMin&&(c.IMHUB_HEARTBEAT_DEFAULT_INTERVAL_MIN=n.hbDefaultMin.trim()||null),n.toolResultCap!==r.toolResultCap&&(c.IMHUB_NATIVE_TOOL_RESULT_MAX_CHARS=n.toolResultCap.trim()||null),n.toolTimeoutMs!==r.toolTimeoutMs&&(c.IMHUB_NATIVE_TOOL_TIMEOUT_MS=n.toolTimeoutMs.trim()||null),n.blankRetryMax!==r.blankRetryMax&&(c.IMHUB_NATIVE_BLANK_RETRY_MAX=n.blankRetryMax.trim()||null),n.lengthRecoveryMax!==r.lengthRecoveryMax&&(c.IMHUB_NATIVE_LENGTH_RECOVERY_MAX=n.lengthRecoveryMax.trim()||null),n.a2aMaxDepth!==r.a2aMaxDepth&&(c.IMHUB_A2A_MAX_DEPTH=n.a2aMaxDepth.trim()||null),n.a2aTimeoutMs!==r.a2aTimeoutMs&&(c.IMHUB_A2A_TIMEOUT_DEFAULT_MS=n.a2aTimeoutMs.trim()||null),n.callAgentInProcess!==r.callAgentInProcess&&(c.IMHUB_NATIVE_CALL_AGENT_IN_PROCESS=n.callAgentInProcess?null:"off"),n.callAgentMaxPerTurn!==r.callAgentMaxPerTurn&&(c.IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN=n.callAgentMaxPerTurn.trim()||null),n.semanticStuckLoop!==r.semanticStuckLoop&&(c.IMHUB_NATIVE_SEMANTIC_STUCK_LOOP=n.semanticStuckLoop?null:"off"),n.criticEnabled!==r.criticEnabled&&(c.IMHUB_NATIVE_CRITIC=n.criticEnabled?"on":null),n.criticRole!==r.criticRole&&(c.IMHUB_NATIVE_CRITIC_ROLE=n.criticRole.trim()||null),n.planModeDefault!==r.planModeDefault&&(c.IMHUB_NATIVE_PLAN_MODE=n.planModeDefault?"1":null),n.planIntentAuto!==r.planIntentAuto&&(c.IMHUB_PLAN_INTENT_AUTO=n.planIntentAuto?"on":null),n.planIntentPhrases!==r.planIntentPhrases&&(c.IMHUB_PLAN_INTENT_PHRASES=n.planIntentPhrases.trim()||null),n.compactTriggerChars!==r.compactTriggerChars&&(c.IMHUB_NATIVE_COMPACT_TRIGGER_CHARS=n.compactTriggerChars.trim()||null),n.compactKeepTurns!==r.compactKeepTurns&&(c.IMHUB_NATIVE_COMPACT_KEEP_TURNS=n.compactKeepTurns.trim()||null),n.compactKeepFirst!==r.compactKeepFirst&&(c.IMHUB_NATIVE_COMPACT_KEEP_FIRST=n.compactKeepFirst.trim()||null),n.compactSummaryChars!==r.compactSummaryChars&&(c.IMHUB_NATIVE_COMPACT_SUMMARY_CHARS=n.compactSummaryChars.trim()||null),n.streamPartial!==r.streamPartial&&(c.IMHUB_NATIVE_STREAM_PARTIAL=n.streamPartial?null:"off"),n.maxIter!==r.maxIter&&(c.IMHUB_NATIVE_AGENT_MAX_ITER=n.maxIter.trim()||null),Object.keys(c).length!==0)try{await l.mutateAsync({updates:c}),j.success(s("nativeAgent.savedToast"))}catch(M){j.error(M?.message??String(M))}}function k(){h(r)}return e.jsxs("div",{className:t?"flex flex-col gap-6":"mx-auto flex max-w-4xl flex-col gap-6",children:[!t&&e.jsxs(e.Fragment,{children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("nativeAgent.title")}),e.jsxs(_,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void a.refetch(),disabled:a.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[a.isFetching?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(X,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("nativeAgent.refresh")})]})]}),e.jsx(ge,{})]}),a.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx(be,{draft:n,setField:u}),e.jsx(ve,{draft:n,setField:u}),e.jsx(fe,{draft:n,setField:u}),e.jsx(_e,{draft:n,setField:u}),e.jsx(Te,{draft:n,setField:u}),e.jsx(Ie,{draft:n,setField:u}),e.jsx(Ne,{draft:n,setField:u}),e.jsx(je,{draft:n,setField:u})]}),d&&e.jsxs("div",{className:t?"flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow":"sticky bottom-2 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow",children:[e.jsx(T,{variant:"info",children:s("nativeAgent.unsaved")}),e.jsxs(_,{variant:"ghost",size:"sm",className:"ml-auto",onClick:k,disabled:l.isPending,children:[e.jsx(F,{className:"h-4 w-4"})," ",s("nativeAgent.discard")]}),e.jsxs(_,{size:"sm",onClick:()=>void I(),disabled:l.isPending,children:[l.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(se,{className:"h-4 w-4"}),s("nativeAgent.save")]})]})]})}function be({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(me,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.agentCard")})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.roleOverride"),hint:a("nativeAgent.roleHint"),children:e.jsx(m,{value:t.role,onChange:l=>s("role",l.target.value),placeholder:"native-chat",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.approvalMode"),hint:a("nativeAgent.approvalHint"),children:e.jsxs(B,{value:t.mode,onValueChange:l=>s("mode",l),children:[e.jsx(O,{children:e.jsx(w,{})}),e.jsxs(V,{children:[e.jsx(f,{value:"read-only",children:a("nativeAgent.modeReadOnly")}),e.jsx(f,{value:"allow-list",children:a("nativeAgent.modeAllowList")}),e.jsx(f,{value:"allow-all",children:a("nativeAgent.modeAllowAll")}),e.jsx(f,{value:"deny-all",children:a("nativeAgent.modeDenyAll")})]})]})}),e.jsx(o,{label:a("nativeAgent.autoAllow"),hint:a("nativeAgent.autoAllowHint"),children:e.jsx(m,{value:t.autoAllow,onChange:l=>s("autoAllow",l.target.value),placeholder:"native_,mcp_filesystem_",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.denyList"),hint:a("nativeAgent.denyListHint"),children:e.jsx(m,{value:t.denyList,onChange:l=>s("denyList",l.target.value),placeholder:"mcp_shell_,mcp_dangerous_",className:"font-mono text-xs"})})]})]})}function Ne({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(re,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.evaluatorCard")}),t.evalEnabled?e.jsx(T,{variant:"success",children:a("nativeAgent.on")}):e.jsx(T,{variant:"outline",children:a("nativeAgent.off")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.evalDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.enableGate"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.evalEnabled,onChange:l=>s("evalEnabled",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a("nativeAgent.filterViaLlm")})]})}),e.jsx(o,{label:a("nativeAgent.evalSources"),hint:a("nativeAgent.evalSourcesHint"),children:e.jsx(m,{value:t.evalSources,onChange:l=>s("evalSources",l.target.value),placeholder:"push,heartbeat",className:"font-mono text-xs",disabled:!t.evalEnabled})})]})]})}function je({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(ce,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.heartbeatCard")}),t.hbEnabled?e.jsx(T,{variant:"success",children:a("nativeAgent.on")}):e.jsx(T,{variant:"outline",children:a("nativeAgent.off")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.hbDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3",children:[e.jsx(o,{label:a("nativeAgent.enableScheduler"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.hbEnabled,onChange:l=>s("hbEnabled",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a("nativeAgent.startScanLoop")})]})}),e.jsx(o,{label:a("nativeAgent.tickInterval"),hint:a("nativeAgent.tickHint"),children:e.jsx(m,{type:"number",value:t.hbTickMs,onChange:l=>s("hbTickMs",l.target.value),placeholder:"60000",className:"font-mono text-xs",disabled:!t.hbEnabled})}),e.jsx(o,{label:a("nativeAgent.defaultInterval"),hint:a("nativeAgent.defaultIntervalHint"),children:e.jsx(m,{type:"number",value:t.hbDefaultMin,onChange:l=>s("hbDefaultMin",l.target.value),placeholder:"15",className:"font-mono text-xs",disabled:!t.hbEnabled})})]})]})}function ve({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(xe,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.runtimeCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.runtimeDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.toolResultCap"),hint:a("nativeAgent.toolResultCapHint"),children:e.jsx(m,{type:"number",value:t.toolResultCap,onChange:l=>s("toolResultCap",l.target.value),placeholder:"64000",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.toolTimeoutMs"),hint:a("nativeAgent.toolTimeoutHint"),children:e.jsx(m,{type:"number",value:t.toolTimeoutMs,onChange:l=>s("toolTimeoutMs",l.target.value),placeholder:"60000",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.blankRetryMax"),hint:a("nativeAgent.blankRetryHint"),children:e.jsx(m,{type:"number",value:t.blankRetryMax,onChange:l=>s("blankRetryMax",l.target.value),placeholder:"1",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.lengthRecoveryMax"),hint:a("nativeAgent.lengthRecoveryHint"),children:e.jsx(m,{type:"number",value:t.lengthRecoveryMax,onChange:l=>s("lengthRecoveryMax",l.target.value),placeholder:"1",className:"font-mono text-xs"})})]})]})}function fe({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(ne,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.a2aCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.a2aDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.a2aMaxDepth"),hint:a("nativeAgent.a2aMaxDepthHint"),children:e.jsx(m,{type:"number",value:t.a2aMaxDepth,onChange:l=>s("a2aMaxDepth",l.target.value),placeholder:"1",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.a2aTimeoutMs"),hint:a("nativeAgent.a2aTimeoutMsHint"),children:e.jsx(m,{type:"number",value:t.a2aTimeoutMs,onChange:l=>s("a2aTimeoutMs",l.target.value),placeholder:"1800000",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.callAgentInProcess"),hint:a("nativeAgent.callAgentInProcessHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.callAgentInProcess,onChange:l=>s("callAgentInProcess",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.callAgentInProcess?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.callAgentMaxPerTurn"),hint:a("nativeAgent.callAgentMaxPerTurnHint"),children:e.jsx(m,{type:"number",value:t.callAgentMaxPerTurn,onChange:l=>s("callAgentMaxPerTurn",l.target.value),placeholder:"2",className:"font-mono text-xs"})})]})]})}function _e({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(le,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.criticCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.criticDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.semanticStuckLoop"),hint:a("nativeAgent.semanticStuckLoopHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.semanticStuckLoop,onChange:l=>s("semanticStuckLoop",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.semanticStuckLoop?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.criticEnabled"),hint:a("nativeAgent.criticEnabledHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.criticEnabled,onChange:l=>s("criticEnabled",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.criticEnabled?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.criticRole"),hint:a("nativeAgent.criticRoleHint"),children:e.jsx(m,{value:t.criticRole,onChange:l=>s("criticRole",l.target.value),placeholder:"(use main backend)",className:"font-mono text-xs",disabled:!t.criticEnabled})}),e.jsx(o,{label:a("nativeAgent.planModeDefault"),hint:a("nativeAgent.planModeDefaultHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.planModeDefault,onChange:l=>s("planModeDefault",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.planModeDefault?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.planIntentAuto"),hint:a("nativeAgent.planIntentAutoHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.planIntentAuto,onChange:l=>s("planIntentAuto",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.planIntentAuto?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.planIntentPhrases"),hint:a("nativeAgent.planIntentPhrasesHint"),children:e.jsx(m,{value:t.planIntentPhrases,onChange:l=>s("planIntentPhrases",l.target.value),placeholder:"先想想,plan only,don't act yet",className:"font-mono text-xs",disabled:!t.planIntentAuto})})]})]})}function Te({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(de,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.compactCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.compactDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.compactTriggerChars"),hint:a("nativeAgent.compactTriggerCharsHint"),children:e.jsx(m,{type:"number",value:t.compactTriggerChars,onChange:l=>s("compactTriggerChars",l.target.value),placeholder:"60000",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.compactKeepTurns"),hint:a("nativeAgent.compactKeepTurnsHint"),children:e.jsx(m,{type:"number",value:t.compactKeepTurns,onChange:l=>s("compactKeepTurns",l.target.value),placeholder:"6",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.compactKeepFirst"),hint:a("nativeAgent.compactKeepFirstHint"),children:e.jsx(m,{type:"number",value:t.compactKeepFirst,onChange:l=>s("compactKeepFirst",l.target.value),placeholder:"1",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.compactSummaryChars"),hint:a("nativeAgent.compactSummaryCharsHint"),children:e.jsx(m,{type:"number",value:t.compactSummaryChars,onChange:l=>s("compactSummaryChars",l.target.value),placeholder:"1500",className:"font-mono text-xs"})})]})]})}function Ie({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(he,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.streamCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.streamDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.streamPartial"),hint:a("nativeAgent.streamPartialHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.streamPartial,onChange:l=>s("streamPartial",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.streamPartial?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.maxIter"),hint:a("nativeAgent.maxIterHint"),children:e.jsx(m,{type:"number",value:t.maxIter,onChange:l=>s("maxIter",l.target.value),placeholder:"50",className:"font-mono text-xs"})})]})]})}function o({label:t,hint:s,children:a}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(v,{className:"text-xs font-medium",children:t}),a,s&&e.jsx("p",{className:"text-[11px] text-text-dim",children:s})]})}const Me=["cheap","evaluator","native-chat"],P="__unbind__",G=["deepseek","moonshot","zhipu","openai","anthropic","custom"],H=[{provider:"openai-compat",baseUrl:"https://api.deepseek.com/v1",modelHint:"deepseek-chat"},{provider:"openai-compat",baseUrl:"https://api.moonshot.cn/v1",modelHint:"moonshot-v1-8k"},{provider:"openai-compat",baseUrl:"https://open.bigmodel.cn/api/paas/v4",modelHint:"glm-4-air"},{provider:"openai-compat",baseUrl:"https://api.openai.com/v1",modelHint:"gpt-4o-mini"},{provider:"anthropic",baseUrl:"https://api.anthropic.com",modelHint:"claude-3-5-sonnet-20241022"},{provider:"openai-compat",baseUrl:"",modelHint:""}];function Ge(){const{t}=p(["settings","common"]),s=Y();return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-6",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:t("llm.title")}),e.jsxs(_,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void s.refetch(),disabled:s.isFetching,"aria-label":t("actions.refresh",{ns:"common"}),children:[s.isFetching?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(X,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:t("llm.refresh")})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:t("llm.subtitle")}),s.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx(Ee,{data:s.data}),e.jsx(ye,{}),e.jsx(Ce,{data:s.data}),e.jsxs("section",{id:"agim-agent",className:"rounded-md border border-border bg-surface px-4 py-3",children:[e.jsx("h2",{className:"text-sm font-semibold",children:t("llm.agimAgentRuntimeTitle")}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:t("llm.agimAgentRuntimeHint")})]}),e.jsx(Ae,{embedded:!0})]})]})}function Ee({data:t}){const{t:s}=p(["settings","common"]),a=q(),l=W(),[g,r]=b.useState({});async function n(i){if(confirm(s("llm.removeConfirm",{name:i})))try{const d=await a.mutateAsync(i);j.success(s("llm.removedToast",{count:d.removedRoles}))}catch(d){j.error(d?.message??String(d))}}async function h(i){r(d=>({...d,[i]:s("llm.pinging")}));try{const d=await l.mutateAsync(i),u=d.ok?`✓ ${d.durationMs}ms · tokens ${d.tokensIn}→${d.tokensOut}`:`✗ ${d.error}`;r(I=>({...I,[i]:u}))}catch(d){r(u=>({...u,[i]:`✗ ${d?.message??String(d)}`}))}}const A=t?.backends??[];return A.length===0?e.jsx("section",{className:"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim",children:s("llm.backendsEmpty")}):e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsx("header",{className:"border-b border-border px-4 py-3",children:e.jsx("h2",{className:"text-sm font-semibold",children:s("llm.backendsTitle",{count:A.length})})}),e.jsxs(Z,{children:[e.jsx(Q,{children:e.jsxs(K,{children:[e.jsx(E,{children:s("llm.col.name")}),e.jsx(E,{children:s("llm.col.provider")}),e.jsx(E,{children:s("llm.col.model")}),e.jsx(E,{children:s("llm.col.baseUrl")}),e.jsx(E,{children:s("llm.col.apiKey")}),e.jsx(E,{children:s("llm.col.actions")})]})}),e.jsx(ee,{children:A.map(i=>{const d=i.secret.source==="none"?e.jsx(T,{variant:"outline",children:s("llm.secretMissing")}):e.jsx(T,{variant:"success",children:i.secret.source});return e.jsxs(K,{children:[e.jsx(C,{className:"font-mono text-xs",children:i.name}),e.jsx(C,{children:i.provider}),e.jsx(C,{className:"font-mono text-xs",children:i.model}),e.jsx(C,{className:"break-all font-mono text-[11px] text-text-dim",children:i.baseUrl??"—"}),e.jsx(C,{children:d}),e.jsxs(C,{className:"flex flex-col gap-1 sm:flex-row sm:items-center",children:[e.jsxs(_,{variant:"ghost",size:"sm",onClick:()=>void h(i.name),disabled:l.isPending||i.secret.source==="none",title:i.secret.source==="none"?s("llm.setKeyFirst"):s("llm.pingHint"),children:[e.jsx(ue,{className:"h-4 w-4"}),e.jsx("span",{children:s("llm.ping")})]}),e.jsxs(_,{variant:"ghost",size:"sm",onClick:()=>void n(i.name),disabled:a.isPending,className:"text-danger hover:text-danger",children:[e.jsx(ie,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("llm.remove")})]}),g[i.name]&&e.jsx("span",{className:"ml-2 text-[11px] text-text-dim",children:g[i.name]})]})]},i.name)})})]})]})}function Ce({data:t}){const{t:s}=p(["settings","common"]),a=J(),l=(t?.backends??[]).map(n=>n.name),g=t?.roles??{};async function r(n,h){const A={[n]:h===P?null:h};try{await a.mutateAsync(A),j.success(s("llm.roleUpdated",{role:n}))}catch(i){j.error(i?.message??String(i))}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"border-b border-border px-4 py-3",children:[e.jsx("h2",{className:"text-sm font-semibold",children:s("llm.rolesTitle")}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:s("llm.rolesOptionalHint")})]}),e.jsx("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3",children:Me.map(n=>e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(v,{className:"text-xs font-medium",children:n}),e.jsxs(B,{value:g[n]??P,onValueChange:h=>void r(n,h),disabled:l.length===0||a.isPending,children:[e.jsx(O,{className:"font-mono text-xs",children:e.jsx(w,{placeholder:s("llm.unset")})}),e.jsxs(V,{children:[e.jsx(f,{value:P,children:s("llm.unbound")}),l.map(h=>e.jsx(f,{value:h,children:h},h))]})]}),e.jsx("p",{className:"text-[11px] text-text-dim",children:s(`llm.roleHint.${n}`)})]},n))})]})}function ye(){const{t}=p(["settings","common"]),s=$(),[a,l]=b.useState(0),[g,r]=b.useState(""),[n,h]=b.useState(H[0]?.baseUrl??""),[A,i]=b.useState(H[0]?.modelHint??""),[d,u]=b.useState(""),[I,k]=b.useState(null);function c(x){k(x),j.error(x)}function M(x){l(x);const N=H[x];N&&(h(N.baseUrl),i(N.modelHint))}async function U(x){x.preventDefault();const N=H[a];if(!N){c(t("llm.invalidPreset"));return}if(!g.trim()){c(t("llm.nameRequired"));return}if(!n.trim()){c(t("llm.baseUrlRequired"));return}if(!A.trim()){c(t("llm.modelRequired"));return}if(!d.trim()){c(t("llm.apiKeyRequired"));return}try{await s.mutateAsync({name:g.trim(),provider:N.provider,baseUrl:n.trim(),model:A.trim(),apiKey:d.trim()}),k(null),j.success(t("llm.addedWithKey",{name:g.trim()})),r(""),u("")}catch(D){const z=D?.message??String(D);c(z)}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsx("header",{className:"border-b border-border px-4 py-3",children:e.jsx("h2",{className:"text-sm font-semibold",children:t("llm.addTitle")})}),e.jsxs("form",{onSubmit:x=>void U(x),className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.preset")}),e.jsxs(B,{value:String(a),onValueChange:x=>M(Number(x)),children:[e.jsx(O,{children:e.jsx(w,{})}),e.jsx(V,{children:H.map((x,N)=>e.jsx(f,{value:String(N),children:t(`llm.presets.${G[N]}`)},G[N]))})]})]}),e.jsxs("div",{children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.name")}),e.jsx(m,{value:g,onChange:x=>r(x.target.value),placeholder:t("llm.namePlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.baseUrl")}),e.jsx(m,{value:n,onChange:x=>h(x.target.value),placeholder:t("llm.baseUrlPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.model")}),e.jsx(m,{value:A,onChange:x=>i(x.target.value),placeholder:t("llm.modelPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.apiKey")}),e.jsx(m,{type:"password",value:d,onChange:x=>u(x.target.value),placeholder:t("llm.apiKeyPlaceholder"),className:"font-mono text-xs",autoComplete:"off"})]}),e.jsx("div",{className:"sm:col-span-2 flex",children:e.jsxs("div",{className:"flex w-full flex-col gap-2 sm:items-end",children:[I&&e.jsx("p",{className:"text-xs text-danger",children:I}),e.jsxs(_,{type:"submit",disabled:s.isPending,className:"ml-auto",children:[s.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(oe,{className:"h-4 w-4"}),t("llm.addBackend")]})]})})]})]})}export{Ge as default};
|
|
27
|
-
//# sourceMappingURL=llm-CMMa85Ig.js.map
|