agim-cli 1.4.9 → 1.5.1
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 +437 -402
- package/README.md +43 -7
- package/README.zh-CN.md +42 -7
- package/bin/agim_rpc.py +12 -12
- package/dist/cli-ui/cmd-handlers.d.ts +25 -4
- package/dist/cli-ui/cmd-handlers.d.ts.map +1 -1
- package/dist/cli-ui/cmd-handlers.js +315 -59
- package/dist/cli-ui/cmd-handlers.js.map +1 -1
- package/dist/cli-ui/config-wizard.d.ts +13 -1
- package/dist/cli-ui/config-wizard.d.ts.map +1 -1
- package/dist/cli-ui/config-wizard.js +120 -48
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/doctor.d.ts +15 -0
- package/dist/cli-ui/doctor.d.ts.map +1 -0
- package/dist/cli-ui/doctor.js +151 -0
- package/dist/cli-ui/doctor.js.map +1 -0
- package/dist/cli-ui/entry-menu.d.ts +6 -0
- package/dist/cli-ui/entry-menu.d.ts.map +1 -1
- package/dist/cli-ui/entry-menu.js +67 -30
- package/dist/cli-ui/entry-menu.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 +17 -8
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +39 -21
- 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/quickstart.d.ts +3 -0
- package/dist/cli-ui/quickstart.d.ts.map +1 -0
- package/dist/cli-ui/quickstart.js +108 -0
- package/dist/cli-ui/quickstart.js.map +1 -0
- package/dist/cli-ui/readiness.d.ts +10 -0
- package/dist/cli-ui/readiness.d.ts.map +1 -0
- package/dist/cli-ui/readiness.js +75 -0
- package/dist/cli-ui/readiness.js.map +1 -0
- package/dist/cli-ui/service.d.ts +30 -7
- package/dist/cli-ui/service.d.ts.map +1 -1
- package/dist/cli-ui/service.js +171 -77
- 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 +118 -436
- 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.d.ts.map +1 -1
- package/dist/core/acp-server.js +21 -7
- 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 +13 -6
- package/dist/core/agent-cwd.d.ts.map +1 -1
- package/dist/core/agent-cwd.js +72 -23
- 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/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +12 -2
- package/dist/core/commands/builtin.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.d.ts.map +1 -1
- package/dist/core/commands/model.js +32 -3
- 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/anthropic-provider.js +2 -1
- package/dist/core/llm/anthropic-provider.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 +5 -4
- package/dist/core/llm/openai-compat-provider.js.map +1 -1
- package/dist/core/llm/provider-base.d.ts +5 -5
- package/dist/core/llm/provider-base.d.ts.map +1 -1
- package/dist/core/llm/provider-base.js +1 -1
- package/dist/core/llm/provider-base.js.map +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.d.ts +1 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -1
- package/dist/plugins/agents/native/index.js +28 -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.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/factory.js +29 -13
- package/dist/plugins/agents/pi-native/factory.js.map +1 -1
- package/dist/plugins/agents/pi-native/index.d.ts +14 -3
- package/dist/plugins/agents/pi-native/index.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/index.js +58 -4
- package/dist/plugins/agents/pi-native/index.js.map +1 -1
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts +2 -0
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/provider-resolver.js +9 -1
- package/dist/plugins/agents/pi-native/provider-resolver.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-CTsDMefo.js +7 -0
- package/dist/web/public/assets/a2a-CTsDMefo.js.map +1 -0
- package/dist/web/public/assets/{activity-BnlFGipw.js → activity-ul8Os7Pz.js} +2 -2
- package/dist/web/public/assets/{activity-BnlFGipw.js.map → activity-ul8Os7Pz.js.map} +1 -1
- package/dist/web/public/assets/{admins-CH84Rw1d.js → admins-ByMAuquy.js} +3 -3
- package/dist/web/public/assets/{admins-CH84Rw1d.js.map → admins-ByMAuquy.js.map} +1 -1
- package/dist/web/public/assets/agents-Ds1zyxBj.js +2 -0
- package/dist/web/public/assets/agents-Ds1zyxBj.js.map +1 -0
- package/dist/web/public/assets/{approvals-DnzjbDR6.js → approvals-DOWlWI7Z.js} +3 -3
- package/dist/web/public/assets/{approvals-DnzjbDR6.js.map → approvals-DOWlWI7Z.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-DxlRHrs8.js → arrow-down-7i0xwCI2.js} +2 -2
- package/dist/web/public/assets/{arrow-down-DxlRHrs8.js.map → arrow-down-7i0xwCI2.js.map} +1 -1
- package/dist/web/public/assets/arrow-right-A889Wof8.js +7 -0
- package/dist/web/public/assets/arrow-right-A889Wof8.js.map +1 -0
- package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js → arrow-up-Dm0U4-6U.js} +2 -2
- package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js.map → arrow-up-Dm0U4-6U.js.map} +1 -1
- package/dist/web/public/assets/{asks-DyUQopay.js → asks-DGuBsrJ7.js} +3 -3
- package/dist/web/public/assets/{asks-DyUQopay.js.map → asks-DGuBsrJ7.js.map} +1 -1
- package/dist/web/public/assets/{audit-BVHTMS82.js → audit-BRXsplJ2.js} +2 -2
- package/dist/web/public/assets/{audit-BVHTMS82.js.map → audit-BRXsplJ2.js.map} +1 -1
- package/dist/web/public/assets/{bell-D7iS7ctN.js → bell-B-UdeJsp.js} +2 -2
- package/dist/web/public/assets/{bell-D7iS7ctN.js.map → bell-B-UdeJsp.js.map} +1 -1
- package/dist/web/public/assets/bgjobs-CcRiffyJ.js +2 -0
- package/dist/web/public/assets/bgjobs-CcRiffyJ.js.map +1 -0
- package/dist/web/public/assets/book-open-CSCq5cjL.js +7 -0
- package/dist/web/public/assets/book-open-CSCq5cjL.js.map +1 -0
- package/dist/web/public/assets/{brain-CCF25Egu.js → brain-Dl4DF5kX.js} +2 -2
- package/dist/web/public/assets/{brain-CCF25Egu.js.map → brain-Dl4DF5kX.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-BMLMD8nM.js → briefcase-CeKUkFSq.js} +2 -2
- package/dist/web/public/assets/{briefcase-BMLMD8nM.js.map → briefcase-CeKUkFSq.js.map} +1 -1
- package/dist/web/public/assets/chat-rLJMdJBk.js +12 -0
- package/dist/web/public/assets/chat-rLJMdJBk.js.map +1 -0
- package/dist/web/public/assets/{chevron-left-BDO3vw8G.js → chevron-left-01fAFVpo.js} +2 -2
- package/dist/web/public/assets/{chevron-left-BDO3vw8G.js.map → chevron-left-01fAFVpo.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-5ZUC2opg.js → chevron-right-CFRb-SM_.js} +3 -3
- package/dist/web/public/assets/{chevron-right-5ZUC2opg.js.map → chevron-right-CFRb-SM_.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js → circle-check-big-DBg2BD6o.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js.map → circle-check-big-DBg2BD6o.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-7VaoZ7dY.js → circle-x-CqFMzO-x.js} +2 -2
- package/dist/web/public/assets/{circle-x-7VaoZ7dY.js.map → circle-x-CqFMzO-x.js.map} +1 -1
- package/dist/web/public/assets/clipboard-list-lnqdk2_J.js +7 -0
- package/dist/web/public/assets/clipboard-list-lnqdk2_J.js.map +1 -0
- package/dist/web/public/assets/{clock-ZPVXnd6V.js → clock-4hd1joQe.js} +3 -3
- package/dist/web/public/assets/{clock-ZPVXnd6V.js.map → clock-4hd1joQe.js.map} +1 -1
- package/dist/web/public/assets/confirm-dialog-BDb0NLny.js +2 -0
- package/dist/web/public/assets/{confirm-dialog-CgpJL9oN.js.map → confirm-dialog-BDb0NLny.js.map} +1 -1
- package/dist/web/public/assets/{copy-BaZl52tH.js → copy-CD4A7VD8.js} +3 -3
- package/dist/web/public/assets/{copy-BaZl52tH.js.map → copy-CD4A7VD8.js.map} +1 -1
- package/dist/web/public/assets/dashboard-CG3WiG7h.js +2 -0
- package/dist/web/public/assets/dashboard-CG3WiG7h.js.map +1 -0
- package/dist/web/public/assets/{data-table-BLYG79TX.js → data-table-BkUshOZz.js} +2 -2
- package/dist/web/public/assets/{data-table-BLYG79TX.js.map → data-table-BkUshOZz.js.map} +1 -1
- package/dist/web/public/assets/database-lQzk64rV.js +7 -0
- package/dist/web/public/assets/database-lQzk64rV.js.map +1 -0
- package/dist/web/public/assets/distill-CPurVW3v.js +7 -0
- package/dist/web/public/assets/distill-CPurVW3v.js.map +1 -0
- package/dist/web/public/assets/{download-bzCepctg.js → download-CVZnHcwj.js} +2 -2
- package/dist/web/public/assets/{download-bzCepctg.js.map → download-CVZnHcwj.js.map} +1 -1
- package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js +7 -0
- package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js.map +1 -0
- package/dist/web/public/assets/email-YlI4MWLp.js +7 -0
- package/dist/web/public/assets/email-YlI4MWLp.js.map +1 -0
- package/dist/web/public/assets/{empty-state-96qpPTNg.js → empty-state-CuiqdZiB.js} +2 -2
- package/dist/web/public/assets/{empty-state-96qpPTNg.js.map → empty-state-CuiqdZiB.js.map} +1 -1
- package/dist/web/public/assets/{external-link-J4nIlCem.js → external-link-1WPpVvdu.js} +2 -2
- package/dist/web/public/assets/{external-link-J4nIlCem.js.map → external-link-1WPpVvdu.js.map} +1 -1
- package/dist/web/public/assets/{eye-BvsBLK42.js → eye-BfPyNFzk.js} +2 -2
- package/dist/web/public/assets/{eye-BvsBLK42.js.map → eye-BfPyNFzk.js.map} +1 -1
- package/dist/web/public/assets/{facts-DMucDXYd.js → facts-xT_24pH8.js} +2 -2
- package/dist/web/public/assets/{facts-DMucDXYd.js.map → facts-xT_24pH8.js.map} +1 -1
- package/dist/web/public/assets/file-text-BxfdLM0-.js +7 -0
- package/dist/web/public/assets/file-text-BxfdLM0-.js.map +1 -0
- package/dist/web/public/assets/{goals-B9ETHgL0.js → goals-C8ZQfbhj.js} +3 -3
- package/dist/web/public/assets/{goals-B9ETHgL0.js.map → goals-C8ZQfbhj.js.map} +1 -1
- package/dist/web/public/assets/health-A2StNEfn.js +2 -0
- package/dist/web/public/assets/{health-DLzZ7KHc.js.map → health-A2StNEfn.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js → heart-pulse-DXlE9oic.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js.map → heart-pulse-DXlE9oic.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-B1BEBHge.js → heartbeat-ClO5gJrj.js} +3 -3
- package/dist/web/public/assets/{heartbeat-B1BEBHge.js.map → heartbeat-ClO5gJrj.js.map} +1 -1
- package/dist/web/public/assets/hot-bfTA-V_z.js +7 -0
- package/dist/web/public/assets/{hot-Yc7iad0D.js.map → hot-bfTA-V_z.js.map} +1 -1
- package/dist/web/public/assets/index-Bi2qWb-u.css +1 -0
- package/dist/web/public/assets/index-DCfdN5R7.js +244 -0
- package/dist/web/public/assets/index-DCfdN5R7.js.map +1 -0
- package/dist/web/public/assets/{injection-Ca-9gbo0.js → injection-omvCR6-p.js} +2 -2
- package/dist/web/public/assets/{injection-Ca-9gbo0.js.map → injection-omvCR6-p.js.map} +1 -1
- package/dist/web/public/assets/{installed-Zz34apdi.js → installed-DL6r3ktm.js} +4 -9
- package/dist/web/public/assets/installed-DL6r3ktm.js.map +1 -0
- package/dist/web/public/assets/jobs-Biy5lYd4.js +2 -0
- package/dist/web/public/assets/jobs-Biy5lYd4.js.map +1 -0
- package/dist/web/public/assets/layout-BLm6NJ3V.js +2 -0
- package/dist/web/public/assets/layout-BLm6NJ3V.js.map +1 -0
- package/dist/web/public/assets/layout-BTKafRVZ.js +2 -0
- package/dist/web/public/assets/layout-BTKafRVZ.js.map +1 -0
- package/dist/web/public/assets/layout-Bm-2s2fp.js +2 -0
- package/dist/web/public/assets/layout-Bm-2s2fp.js.map +1 -0
- package/dist/web/public/assets/layout-DsZ8eR4i.js +2 -0
- package/dist/web/public/assets/layout-DsZ8eR4i.js.map +1 -0
- package/dist/web/public/assets/{layout-CtDc2i7w.js → layout-sxvovjEH.js} +2 -2
- package/dist/web/public/assets/{layout-CtDc2i7w.js.map → layout-sxvovjEH.js.map} +1 -1
- package/dist/web/public/assets/llm-JjZDbBvJ.js +37 -0
- package/dist/web/public/assets/llm-JjZDbBvJ.js.map +1 -0
- package/dist/web/public/assets/loader-circle-DDdmcH0k.js +7 -0
- package/dist/web/public/assets/{loader-circle-D8L1w9c1.js.map → loader-circle-DDdmcH0k.js.map} +1 -1
- package/dist/web/public/assets/{map-pin--GMunU9n.js → map-pin-C_jAxukI.js} +2 -2
- package/dist/web/public/assets/{map-pin--GMunU9n.js.map → map-pin-C_jAxukI.js.map} +1 -1
- package/dist/web/public/assets/{mcp-DhnXhO9B.js → mcp-vKajK1F8.js} +3 -3
- package/dist/web/public/assets/{mcp-DhnXhO9B.js.map → mcp-vKajK1F8.js.map} +1 -1
- package/dist/web/public/assets/memos-DAt4k3DO.js +7 -0
- package/dist/web/public/assets/memos-DAt4k3DO.js.map +1 -0
- package/dist/web/public/assets/messengers-GYVTFlAj.js +2 -0
- package/dist/web/public/assets/messengers-GYVTFlAj.js.map +1 -0
- package/dist/web/public/assets/{mobile-CUZ359rQ.js → mobile-VUyTo40E.js} +3 -3
- package/dist/web/public/assets/{mobile-CUZ359rQ.js.map → mobile-VUyTo40E.js.map} +1 -1
- package/dist/web/public/assets/{network-BBdRdrH_.js → network-BUeWK3bs.js} +2 -2
- package/dist/web/public/assets/{network-BBdRdrH_.js.map → network-BUeWK3bs.js.map} +1 -1
- package/dist/web/public/assets/outbox-CEE0rwN3.js +2 -0
- package/dist/web/public/assets/outbox-CEE0rwN3.js.map +1 -0
- package/dist/web/public/assets/overview-BSOZ5gTD.js +12 -0
- package/dist/web/public/assets/overview-BSOZ5gTD.js.map +1 -0
- package/dist/web/public/assets/overview-COop5K2Y.js +12 -0
- package/dist/web/public/assets/overview-COop5K2Y.js.map +1 -0
- package/dist/web/public/assets/overview-DeH5ud6d.js +2 -0
- package/dist/web/public/assets/overview-DeH5ud6d.js.map +1 -0
- package/dist/web/public/assets/{pagination-DcsgDXXM.js → pagination-BBicLzXP.js} +3 -3
- package/dist/web/public/assets/{pagination-DcsgDXXM.js.map → pagination-BBicLzXP.js.map} +1 -1
- package/dist/web/public/assets/persona-CElXQZ4p.js +2 -0
- package/dist/web/public/assets/{persona-ig2ac4mY.js.map → persona-CElXQZ4p.js.map} +1 -1
- package/dist/web/public/assets/{plans-Bzbk8eUr.js → plans-Bo5LlLeH.js} +3 -8
- package/dist/web/public/assets/plans-Bo5LlLeH.js.map +1 -0
- package/dist/web/public/assets/{play-Di1jqulh.js → play-DX5wp4WH.js} +2 -2
- package/dist/web/public/assets/{play-Di1jqulh.js.map → play-DX5wp4WH.js.map} +1 -1
- package/dist/web/public/assets/{plus-C2zyJ1mF.js → plus-DH4J_YhN.js} +2 -2
- package/dist/web/public/assets/{plus-C2zyJ1mF.js.map → plus-DH4J_YhN.js.map} +1 -1
- package/dist/web/public/assets/policy-BrgOuDt_.js +2 -0
- package/dist/web/public/assets/policy-BrgOuDt_.js.map +1 -0
- package/dist/web/public/assets/{qr-code-C-ACsKv_.js → qr-code-YrEuhMPC.js} +2 -2
- package/dist/web/public/assets/{qr-code-C-ACsKv_.js.map → qr-code-YrEuhMPC.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js → refresh-ccw-DlAd-eTQ.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js.map → refresh-ccw-DlAd-eTQ.js.map} +1 -1
- package/dist/web/public/assets/{reminders-BDeiVYTC.js → reminders-DBEE0zXG.js} +3 -3
- package/dist/web/public/assets/{reminders-BDeiVYTC.js.map → reminders-DBEE0zXG.js.map} +1 -1
- package/dist/web/public/assets/{save-BYFmz9gD.js → save-BDOtZrfp.js} +2 -2
- package/dist/web/public/assets/{save-BYFmz9gD.js.map → save-BDOtZrfp.js.map} +1 -1
- package/dist/web/public/assets/schedules-DAyhVI8-.js +2 -0
- package/dist/web/public/assets/schedules-DAyhVI8-.js.map +1 -0
- package/dist/web/public/assets/search-55mtgHrB.js +17 -0
- package/dist/web/public/assets/search-55mtgHrB.js.map +1 -0
- package/dist/web/public/assets/{search-DxkvV-8p.js → search-CAICU3aU.js} +2 -2
- package/dist/web/public/assets/{search-DxkvV-8p.js.map → search-CAICU3aU.js.map} +1 -1
- package/dist/web/public/assets/security-CbP4QgVp.js +2 -0
- package/dist/web/public/assets/security-CbP4QgVp.js.map +1 -0
- package/dist/web/public/assets/server-Dg4e8pvm.js +7 -0
- package/dist/web/public/assets/server-Dg4e8pvm.js.map +1 -0
- package/dist/web/public/assets/service-gWZa3sup.js +7 -0
- package/dist/web/public/assets/service-gWZa3sup.js.map +1 -0
- package/dist/web/public/assets/{shield-alert-DXGk9Rak.js → shield-alert-DOKK9EnJ.js} +2 -2
- package/dist/web/public/assets/{shield-alert-DXGk9Rak.js.map → shield-alert-DOKK9EnJ.js.map} +1 -1
- package/dist/web/public/assets/sparkles-G0QIs9nP.js +7 -0
- package/dist/web/public/assets/sparkles-G0QIs9nP.js.map +1 -0
- package/dist/web/public/assets/start-D-abhl3q.js +2 -0
- package/dist/web/public/assets/start-D-abhl3q.js.map +1 -0
- package/dist/web/public/assets/{status-badge-D0nbFSom.js → status-badge-CyLdpsXq.js} +2 -2
- package/dist/web/public/assets/{status-badge-D0nbFSom.js.map → status-badge-CyLdpsXq.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-DFiAXvDp.js → subtasks-BnEjSGUR.js} +3 -3
- package/dist/web/public/assets/{subtasks-DFiAXvDp.js.map → subtasks-BnEjSGUR.js.map} +1 -1
- package/dist/web/public/assets/{table-_WsrnZ_T.js → table-sCMZBe_Z.js} +2 -2
- package/dist/web/public/assets/{table-_WsrnZ_T.js.map → table-sCMZBe_Z.js.map} +1 -1
- package/dist/web/public/assets/terminal-_pXeEjXG.js +7 -0
- package/dist/web/public/assets/terminal-_pXeEjXG.js.map +1 -0
- package/dist/web/public/assets/{topn-C2PHE4tX.js → topn-D1B-gS1M.js} +3 -3
- package/dist/web/public/assets/{topn-C2PHE4tX.js.map → topn-D1B-gS1M.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-1Km439fW.js → trash-2-D2x2UPuZ.js} +2 -2
- package/dist/web/public/assets/{trash-2-1Km439fW.js.map → trash-2-D2x2UPuZ.js.map} +1 -1
- package/dist/web/public/assets/use-a2a-C98e2Via.js +2 -0
- package/dist/web/public/assets/use-a2a-C98e2Via.js.map +1 -0
- package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js → use-agim-skills-BbuJP3NT.js} +2 -2
- package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js.map → use-agim-skills-BbuJP3NT.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-CwFmOokw.js +2 -0
- package/dist/web/public/assets/{use-background-tasks-wCL7jn68.js.map → use-background-tasks-CwFmOokw.js.map} +1 -1
- package/dist/web/public/assets/use-jobs-BJjeJ5lh.js +2 -0
- package/dist/web/public/assets/use-jobs-BJjeJ5lh.js.map +1 -0
- package/dist/web/public/assets/use-memory-CXDwKCco.js +2 -0
- package/dist/web/public/assets/{use-memory-B9oRyQC8.js.map → use-memory-CXDwKCco.js.map} +1 -1
- package/dist/web/public/assets/use-observability-CY5ZUPrC.js +2 -0
- package/dist/web/public/assets/{use-observability-DGkN80qa.js.map → use-observability-CY5ZUPrC.js.map} +1 -1
- package/dist/web/public/assets/use-outbox-DT_XWB_7.js +7 -0
- package/dist/web/public/assets/use-outbox-DT_XWB_7.js.map +1 -0
- package/dist/web/public/assets/use-schedules-D4W8fMwo.js +7 -0
- package/dist/web/public/assets/use-schedules-D4W8fMwo.js.map +1 -0
- package/dist/web/public/assets/use-settings-DGIjmUX0.js +2 -0
- package/dist/web/public/assets/use-settings-DGIjmUX0.js.map +1 -0
- package/dist/web/public/assets/use-skills-D2bMM580.js +7 -0
- package/dist/web/public/assets/use-skills-D2bMM580.js.map +1 -0
- package/dist/web/public/assets/use-vector-BYOFwjU0.js +2 -0
- package/dist/web/public/assets/use-vector-BYOFwjU0.js.map +1 -0
- package/dist/web/public/assets/use-workspace-CuytyHwb.js +2 -0
- package/dist/web/public/assets/{use-workspace-BDXP5XO1.js.map → use-workspace-CuytyHwb.js.map} +1 -1
- package/dist/web/public/assets/vector-CL8ezpSR.js +2 -0
- package/dist/web/public/assets/vector-CL8ezpSR.js.map +1 -0
- package/dist/web/public/assets/viewer-CD0iEfPU.js +7 -0
- package/dist/web/public/assets/viewer-CD0iEfPU.js.map +1 -0
- package/dist/web/public/assets/workspace-BA1_hso3.js +17 -0
- package/dist/web/public/assets/workspace-BA1_hso3.js.map +1 -0
- package/dist/web/public/assets/workspaces-DyGLJUgB.js +7 -0
- package/dist/web/public/assets/workspaces-DyGLJUgB.js.map +1 -0
- package/dist/web/public/index.html +2 -2
- package/dist/web/public/loc.html +1 -1
- package/dist/web/public/login.html +2 -2
- package/dist/web/server.d.ts +2 -5
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +256 -122
- 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/a2a-CZxwvgvh.js +0 -7
- package/dist/web/public/assets/a2a-CZxwvgvh.js.map +0 -1
- package/dist/web/public/assets/agents-CFB4Uj6b.js +0 -7
- package/dist/web/public/assets/agents-CFB4Uj6b.js.map +0 -1
- package/dist/web/public/assets/bgjobs-BYCQhd_1.js +0 -7
- package/dist/web/public/assets/bgjobs-BYCQhd_1.js.map +0 -1
- package/dist/web/public/assets/chat-DPkKy5y_.js +0 -17
- package/dist/web/public/assets/chat-DPkKy5y_.js.map +0 -1
- package/dist/web/public/assets/circle-check-COhM5JsK.js +0 -7
- package/dist/web/public/assets/circle-check-COhM5JsK.js.map +0 -1
- package/dist/web/public/assets/confirm-dialog-CgpJL9oN.js +0 -2
- 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/health-DLzZ7KHc.js +0 -2
- package/dist/web/public/assets/hot-Yc7iad0D.js +0 -12
- package/dist/web/public/assets/index-DY2Zglku.js +0 -209
- package/dist/web/public/assets/index-DY2Zglku.js.map +0 -1
- package/dist/web/public/assets/index-DknVjPYB.css +0 -1
- package/dist/web/public/assets/installed-Zz34apdi.js.map +0 -1
- package/dist/web/public/assets/jobs-CtVRpl0r.js +0 -2
- package/dist/web/public/assets/jobs-CtVRpl0r.js.map +0 -1
- package/dist/web/public/assets/layout-BTCLgkgN.js +0 -2
- package/dist/web/public/assets/layout-BTCLgkgN.js.map +0 -1
- package/dist/web/public/assets/layout-Cxch59sI.js +0 -2
- package/dist/web/public/assets/layout-Cxch59sI.js.map +0 -1
- package/dist/web/public/assets/layout-DnANw2Q2.js +0 -2
- package/dist/web/public/assets/layout-DnANw2Q2.js.map +0 -1
- package/dist/web/public/assets/layout-yIZG87fq.js +0 -2
- package/dist/web/public/assets/layout-yIZG87fq.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/loader-circle-D8L1w9c1.js +0 -7
- package/dist/web/public/assets/memos-DQZc7llR.js +0 -12
- package/dist/web/public/assets/memos-DQZc7llR.js.map +0 -1
- package/dist/web/public/assets/messengers-DwSmauLs.js +0 -2
- package/dist/web/public/assets/messengers-DwSmauLs.js.map +0 -1
- package/dist/web/public/assets/outbox-CmN0U35l.js +0 -7
- package/dist/web/public/assets/outbox-CmN0U35l.js.map +0 -1
- package/dist/web/public/assets/persona-ig2ac4mY.js +0 -2
- package/dist/web/public/assets/plans-Bzbk8eUr.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/schedules-BddzBrxI.js +0 -7
- package/dist/web/public/assets/schedules-BddzBrxI.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/service-BsY8CaNG.js +0 -7
- package/dist/web/public/assets/service-BsY8CaNG.js.map +0 -1
- package/dist/web/public/assets/use-background-tasks-wCL7jn68.js +0 -2
- package/dist/web/public/assets/use-memory-B9oRyQC8.js +0 -2
- package/dist/web/public/assets/use-observability-DGkN80qa.js +0 -2
- package/dist/web/public/assets/use-settings-Co-iafXD.js +0 -2
- package/dist/web/public/assets/use-settings-Co-iafXD.js.map +0 -1
- package/dist/web/public/assets/use-workspace-BDXP5XO1.js +0 -2
- 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/dist/web/public/assets/workspace-BbCchiHE.js +0 -17
- package/dist/web/public/assets/workspace-BbCchiHE.js.map +0 -1
- package/dist/web/public/assets/workspaces-5HE7pjdA.js +0 -7
- package/dist/web/public/assets/workspaces-5HE7pjdA.js.map +0 -1
|
@@ -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,2 +0,0 @@
|
|
|
1
|
-
import{u as p,f,j as e,B as g,c as y}from"./index-DY2Zglku.js";import{r as N}from"./react-DlP5eolq.js";import{E as v}from"./empty-state-96qpPTNg.js";import{T as w,a as C,b as h,c as i,d as M,e as o}from"./table-_WsrnZ_T.js";import{u as L}from"./use-observability-DGkN80qa.js";import{L as T}from"./loader-circle-D8L1w9c1.js";import{R as k}from"./refresh-ccw-7HdadG5V.js";import{A as D}from"./activity-BnlFGipw.js";function K(){const{t:s}=p(["observability","common"]),[l]=f(),n=Math.max(1,Number(l.get("days"))||7),{data:c,isLoading:u,isFetching:m,refetch:j}=L(n),a=c?.totals,d=c?.byDay??[],b=N.useMemo(()=>d.reduce((t,x)=>x.calls>t?x.calls:t,0),[d]);return e.jsxs("div",{className:"mx-auto flex max-w-7xl 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("health.title")}),e.jsxs(g,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>j(),disabled:m,"aria-label":s("actions.refresh",{ns:"common"}),children:[m?e.jsx(T,{className:"h-4 w-4 animate-spin"}):e.jsx(k,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),c&&e.jsxs("p",{className:"text-xs text-text-dim tabular-nums",children:[c.since," → ",c.until]})]}),u?e.jsx("div",{className:"h-48 w-full rounded-md bg-surface-2 animate-pulse"}):!a||a.calls===0&&d.length===0?e.jsx(v,{icon:e.jsx(D,{}),title:s("health.empty.title"),description:s("health.empty.description")}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-6",children:[e.jsx(r,{label:s("health.kpi.calls"),value:String(a.calls),tone:"info"}),e.jsx(r,{label:s("health.kpi.cost"),value:`$${a.cost.toFixed(4)}`,tone:"info"}),e.jsx(r,{label:s("health.kpi.errors"),value:String(a.errors),tone:a.errors>0?"danger":"success"}),e.jsx(r,{label:s("health.kpi.errorRate"),value:`${(a.errorRate*100).toFixed(1)}%`,tone:a.errorRate>.05?"warning":"success"}),e.jsx(r,{label:s("health.kpi.avgLatencyMs"),value:`${Math.round(a.avgLatencyMs)}ms`,tone:"info"}),e.jsx(r,{label:s("health.kpi.p95LatencyMs"),value:`${Math.round(a.p95LatencyMs)}ms`,tone:"info"})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"mb-2 text-sm font-medium uppercase tracking-wide text-text-dim",children:s("health.byDay")}),e.jsxs(w,{children:[e.jsx(C,{children:e.jsxs(h,{children:[e.jsx(i,{className:"w-28",children:s("health.byDayCol.date")}),e.jsx(i,{children:s("health.byDayCol.calls")}),e.jsx(i,{className:"w-24",children:s("health.byDayCol.cost")}),e.jsx(i,{className:"w-24",children:s("health.byDayCol.errors")}),e.jsx(i,{className:"w-32",children:s("health.byDayCol.avgLatencyMs")})]})}),e.jsx(M,{children:d.map(t=>e.jsxs(h,{children:[e.jsx(o,{className:"font-mono text-xs",children:t.date}),e.jsx(o,{children:e.jsx(S,{value:t.calls,max:b})}),e.jsxs(o,{className:"tabular-nums",children:["$",t.cost.toFixed(4)]}),e.jsx(o,{className:"tabular-nums",children:e.jsx("span",{className:t.errors>0?"text-danger":"text-text-dim",children:t.errors})}),e.jsxs(o,{className:"tabular-nums",children:[Math.round(t.avgLatencyMs),"ms"]})]},t.date))})]})]})]})]})}const R={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 r({label:s,value:l,tone:n}){return e.jsxs("div",{className:y("rounded-md border bg-surface px-3 py-2",R[n]),children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:s}),e.jsx("div",{className:"text-xl font-semibold tabular-nums",children:l})]})}function S({value:s,max:l}){const n=l>0?s/l*100:0;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"relative h-3 w-full max-w-xs overflow-hidden rounded bg-surface-2",children:e.jsx("div",{className:"absolute inset-y-0 left-0 bg-accent/60",style:{width:`${n}%`}})}),e.jsx("span",{className:"tabular-nums text-sm text-text-dim",children:s})]})}export{K as default};
|
|
2
|
-
//# sourceMappingURL=health-DLzZ7KHc.js.map
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import{o as w,b as y,d as C,u as x,j as e,B as u,I as S,l as m,c as k,D as L,t as D,v as F,w as H,x as R,m as j}from"./index-DY2Zglku.js";import{r as o}from"./react-DlP5eolq.js";import{E as z}from"./empty-state-96qpPTNg.js";import{E}from"./external-link-J4nIlCem.js";import{L as M}from"./loader-circle-D8L1w9c1.js";import{R as T}from"./refresh-ccw-7HdadG5V.js";import{S as I}from"./search-DxkvV-8p.js";import{D as $}from"./download-bzCepctg.js";import{C as A}from"./copy-BaZl52tH.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 N=w("Flame",[["path",{d:"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z",key:"96xj49"}]]);/**
|
|
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 B=w("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]),q={remoteHot:["skills","remote","hot"]};function K(){return y({queryKey:q.remoteHot,queryFn:()=>C.getSkillsRemoteHot(),staleTime:6e4})}function ee(){const{t:s}=x(["skills","common"]),{data:n,isLoading:l,isFetching:r,refetch:i}=K(),a=n?.skills??[],[h,b]=o.useState(""),[p,g]=o.useState(null),f=o.useMemo(()=>{const t=h.trim().toLowerCase();return t?a.filter(d=>d.slug.toLowerCase().includes(t)||(d.name||"").toLowerCase().includes(t)||(d.description||"").toLowerCase().includes(t)||(d.category||"").toLowerCase().includes(t)):a},[a,h]),v=p?a.find(t=>t.slug===p)??null:null;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.jsxs("h1",{className:"text-xl font-semibold inline-flex items-center gap-2",children:[e.jsx(N,{className:"h-5 w-5 text-warning"}),s("hot.title")]}),e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[e.jsx(u,{asChild:!0,variant:"ghost",size:"sm",children:e.jsxs("a",{href:"https://skillhub.cn",target:"_blank",rel:"noopener noreferrer",children:[e.jsx(E,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("hot.openHub")})]})}),e.jsxs(u,{variant:"ghost",size:"sm",onClick:()=>i(),disabled:r,"aria-label":s("actions.refresh",{ns:"common"}),children:[r?e.jsx(M,{className:"h-4 w-4 animate-spin"}):e.jsx(T,{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("hot.subtitle")}),n&&e.jsx(O,{cached:!!n.cached,stale:!!n.stale,fetchedAt:n.fetchedAt})]}),a.length>0&&e.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[e.jsxs("div",{className:"relative flex-1 min-w-[180px] max-w-md",children:[e.jsx(I,{className:"pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-text-muted"}),e.jsx(S,{value:h,onChange:t=>b(t.target.value),placeholder:s("actions.search",{ns:"common"}),className:"pl-7"})]}),e.jsxs(m,{variant:"secondary",className:"ml-auto",children:[f.length," / ",a.length]})]}),l?e.jsx("div",{className:"h-48 w-full rounded-md bg-surface-2 animate-pulse"}):a.length===0?e.jsx(z,{icon:e.jsx(N,{}),title:s("hot.empty")}):e.jsx("ul",{className:"flex flex-col gap-2",children:f.map(t=>e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>g(t.slug),className:k("flex w-full flex-col gap-1 rounded-md border border-border bg-surface px-3 py-2 text-left","transition-colors hover:border-border-strong hover:bg-surface-hover"),children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:t.name||t.slug}),t.version&&e.jsxs("span",{className:"text-text-muted text-xs font-mono",children:["v",t.version]}),t.category&&e.jsx(m,{variant:"outline",children:t.category}),e.jsxs("div",{className:"ml-auto flex items-center gap-3 text-xs text-text-dim tabular-nums",children:[e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(B,{className:"h-3 w-3"}),c(t.stars)]}),e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx($,{className:"h-3 w-3"}),c(t.installs)]})]})]}),e.jsx("code",{className:"text-text-muted text-xs font-mono",children:t.slug}),t.description&&e.jsx("p",{className:"line-clamp-2 text-sm text-text-dim",children:t.description})]})},t.slug))}),e.jsx(Q,{skill:v,onOpenChange:t=>{t||g(null)}})]})}function O({cached:s,stale:n,fetchedAt:l}){const{t:r}=x("skills"),i=o.useMemo(()=>{try{const a=new Date(l);return Number.isNaN(a.getTime())?"":a.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return""}},[l]);return e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs text-text-muted",children:[e.jsx("span",{children:r("hot.updatedAt",{at:i})}),s&&e.jsx(m,{variant:"outline",children:r("hot.cached")}),n&&e.jsx(m,{variant:"warning",children:r("hot.stale")})]})}function Q({skill:s,onOpenChange:n}){const{t:l,i18n:r}=x("skills"),i=o.useMemo(()=>s?[{key:"cliInstall",cmd:`skillhub install ${s.slug}`},{key:"cliSearch",cmd:`skillhub search ${s.slug}`},{key:"imAsk",cmd:r.language.startsWith("zh")?`请用 skillhub 安装 ${s.slug} 技能`:`Please install ${s.slug} via skillhub`}]:[],[r.language,s]);return e.jsx(L,{open:s!=null,onOpenChange:n,children:e.jsxs(D,{className:"sm:max-w-2xl",children:[e.jsxs(F,{children:[e.jsx(H,{children:s?.name||s?.slug||""}),s?.description&&e.jsx(R,{children:s.description})]}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("dl",{className:"grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-xs",children:[e.jsx("dt",{className:"text-text-dim",children:l("hot.detail.slug")}),e.jsx("dd",{className:"font-mono",children:s.slug}),s.version&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:l("hot.detail.version")}),e.jsxs("dd",{className:"font-mono",children:["v",s.version]})]}),s.category&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:l("hot.detail.category")}),e.jsx("dd",{children:s.category})]}),e.jsx("dt",{className:"text-text-dim",children:l("hot.detail.stars")}),e.jsx("dd",{className:"tabular-nums",children:c(s.stars)}),e.jsx("dt",{className:"text-text-dim",children:l("hot.detail.installs")}),e.jsx("dd",{className:"tabular-nums",children:c(s.installs)}),s.downloads!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:l("hot.detail.downloads")}),e.jsx("dd",{className:"tabular-nums",children:c(s.downloads)})]})]}),e.jsxs("div",{className:"mt-4 border-t border-border pt-3",children:[e.jsx("h3",{className:"text-sm font-medium",children:l("hot.detail.howInstall")}),e.jsx("ul",{className:"mt-2 flex flex-col gap-2",children:i.map(a=>e.jsxs("li",{className:"flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-2",children:[e.jsx("span",{className:"text-xs text-text-dim sm:w-40 sm:shrink-0",children:l(`hot.detail.label.${a.key}`)}),e.jsx("code",{className:"flex-1 rounded bg-surface-2 px-2 py-1 font-mono text-xs break-all",children:a.cmd}),e.jsx(_,{text:a.cmd})]},a.key))}),e.jsx("p",{className:"mt-3 text-[11px] text-text-muted",children:l("hot.detail.hint")})]})]})]})})}function _({text:s}){const{t:n}=x("skills"),[l,r]=o.useState(!1);async function i(){try{await navigator.clipboard.writeText(s),r(!0),j.success(n("hot.detail.copied")),setTimeout(()=>r(!1),1500)}catch(a){j.error(String(a?.message??a))}}return e.jsxs(u,{type:"button",variant:"secondary",size:"sm",onClick:()=>void i(),className:"shrink-0",children:[e.jsx(A,{className:"h-3 w-3"}),n(l?"hot.detail.copied":"hot.detail.copy")]})}function c(s){return s==null||!Number.isFinite(s)?"—":s.toLocaleString()}export{ee as default};
|
|
12
|
-
//# sourceMappingURL=hot-Yc7iad0D.js.map
|