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
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as P,j as e,e as j,k as O,l as k,m as L,n as R,o as g,I as _,y as H,p as G,q as F,L as $,c as W,d as T,f as V,X as q,z as X,C as Q}from"./index-DCfdN5R7.js";import{r as f}from"./react-DlP5eolq.js";import{D as Y,a as J,b as Z,d as ee,e as se,f as te}from"./dropdown-menu-BNH5SrVb.js";import{b as ie,c as re,m as le}from"./use-settings-DGIjmUX0.js";import{L as D}from"./loader-circle-DDdmcH0k.js";import{R as ne}from"./refresh-ccw-DlAd-eTQ.js";import{S as z}from"./shield-alert-DOKK9EnJ.js";import{P as ae}from"./plus-DH4J_YhN.js";import"./chevron-right-CFRb-SM_.js";function B(s){if(s==null)return!1;const i=s.toLowerCase();return i==="1"||i==="true"||i==="yes"||i==="on"}function K(s){const i=(s??"").trim();return i==="*"?{mode:"open",members:[],explicitOpen:!0}:i?{mode:"restricted",members:M(i.split(",")),explicitOpen:!1}:{mode:"open",members:[],explicitOpen:!1}}function ce(s,i){if(s==="open")return"*";const r=M(i);return r.length>0?r.join(","):null}function U(s,i){return s==="open"?"*":M(i).join(",")}function Ne(){const{t:s}=P(["settings","common"]),i=ie(),r=re(),m=le(),[t,y]=f.useState(null),[p,b]=f.useState(!1),[x,o]=f.useState("open"),[d,w]=f.useState([]);async function E(){b(!0);try{const l=await H.get("/api/security/diagnostics");y(l.diagnostics)}catch(l){G.error(F(l,s).message)}finally{b(!1)}}f.useEffect(()=>{E()},[]);async function c(l,n){try{await r.mutateAsync({updates:{[l]:n}}),G.success(s("security.savingToast")),await E()}catch(A){G.error(F(A,s).message)}}const u=i.data?.env??{},h=f.useMemo(()=>K(u.AGIM_ALLOWED_USERS),[u.AGIM_ALLOWED_USERS]),C=f.useMemo(()=>{const l=new Map;for(const n of m.data?.knownUsers??[]){const A=me(n);l.set(A,{value:A,label:A,detail:s("security.sender.lastSeen",{time:xe(n.lastSeenAt)})})}for(const n of d)l.has(n)||l.set(n,{value:n,label:n,detail:s("security.sender.fromCurrentValue")});return[...l.values()].sort((n,A)=>n.label.localeCompare(A.label))},[m.data?.knownUsers,d,s]),a=x==="open"?h.mode!=="open"||!h.explicitOpen:U(x,d)!==U(h.mode,h.members);f.useEffect(()=>{o(h.mode),w(h.members)},[h.mode,h.members]);async function N(){const l=ce(x,d);if(x==="restricted"&&l===null){G.error(s("security.sender.emptyRestrictedToast"));return}await c("AGIM_ALLOWED_USERS",l)}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("security.title")}),e.jsx(j,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{i.refetch(),E()},disabled:i.isFetching||p,"aria-label":s("actions.refresh",{ns:"common"}),children:i.isFetching||p?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(ne,{className:"h-4 w-4"})})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("security.subtitle")})]}),e.jsx(oe,{diagnostics:t,env:u,loading:i.isLoading||p,onSetValue:(l,n)=>void c(l,n)}),e.jsx(S,{id:"sender-allowlist",title:s("security.sender.title"),description:s("security.sender.description"),children:e.jsx(ue,{mode:x,members:d,choices:C,loading:m.isLoading,explicitOpen:h.explicitOpen,dirty:a,saving:r.isPending,onModeChange:o,onMembersChange:w,onSave:()=>void N()})}),e.jsx(de,{diagnostics:t,loading:p}),e.jsx(S,{title:s("security.exec.title"),description:s("security.exec.description"),children:e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(v,{label:s("security.exec.sandbox"),children:e.jsxs(O,{value:(u.AGIM_EXEC_SANDBOX??"").toLowerCase()==="bwrap"?"bwrap":"__none__",onValueChange:l=>void c("AGIM_EXEC_SANDBOX",l==="__none__"?null:l),children:[e.jsx(k,{children:e.jsx(L,{})}),e.jsxs(R,{children:[e.jsx(g,{value:"__none__",children:s("security.exec.sandboxNone")}),e.jsxs(g,{value:"bwrap",disabled:!t?.bwrapAvailable,children:[s("security.exec.sandboxBwrap"),!t?.bwrapAvailable&&e.jsxs("span",{className:"ml-2 text-xs text-text-muted",children:["(",s("security.exec.sandboxBwrapMissing"),")"]})]})]})]})}),e.jsx(v,{label:s("security.exec.sandboxNet"),children:e.jsxs(O,{value:(u.AGIM_EXEC_SANDBOX_NET??"").toLowerCase()==="off"?"off":"on",onValueChange:l=>void c("AGIM_EXEC_SANDBOX_NET",l==="off"?"off":null),children:[e.jsx(k,{children:e.jsx(L,{})}),e.jsxs(R,{children:[e.jsx(g,{value:"on",children:s("security.exec.sandboxNetOn")}),e.jsx(g,{value:"off",children:s("security.exec.sandboxNetOff")})]})]})}),e.jsx(v,{label:s("security.exec.timeoutMs"),children:e.jsx(_,{type:"number",defaultValue:u.AGIM_EXEC_TIMEOUT_MS??"",placeholder:"60000",onBlur:l=>{const n=l.target.value.trim();c("AGIM_EXEC_TIMEOUT_MS",n===""?null:n)}})}),e.jsx(v,{label:s("security.exec.maxOutput"),children:e.jsx(_,{type:"number",defaultValue:u.AGIM_EXEC_MAX_OUTPUT??"",placeholder:"32768",onBlur:l=>{const n=l.target.value.trim();c("AGIM_EXEC_MAX_OUTPUT",n===""?null:n)}})})]})}),e.jsx(S,{title:s("security.web.title"),description:s("security.web.description"),children:e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(v,{label:s("security.web.allowPrivate"),hint:s("security.web.allowPrivateHelp"),children:e.jsxs(O,{value:B(u.AGIM_NATIVE_WEB_ALLOW_PRIVATE)?"1":"0",onValueChange:l=>void c("AGIM_NATIVE_WEB_ALLOW_PRIVATE",l==="1"?"1":null),children:[e.jsx(k,{children:e.jsx(L,{})}),e.jsxs(R,{children:[e.jsx(g,{value:"0",children:"OFF"}),e.jsx(g,{value:"1",children:"ON"})]})]})}),e.jsx(v,{label:s("security.web.timeoutMs"),children:e.jsx(_,{type:"number",defaultValue:u.AGIM_NATIVE_WEB_TIMEOUT_MS??"",placeholder:"30000",onBlur:l=>{const n=l.target.value.trim();c("AGIM_NATIVE_WEB_TIMEOUT_MS",n===""?null:n)}})}),e.jsx("div",{className:"sm:col-span-2",children:e.jsx(v,{label:s("security.web.ssrfWhitelist"),children:e.jsx(_,{defaultValue:u.AGIM_NATIVE_WEB_SSRF_WHITELIST??"",placeholder:s("security.web.ssrfWhitelistPlaceholder"),onBlur:l=>{const n=l.target.value.trim();c("AGIM_NATIVE_WEB_SSRF_WHITELIST",n===""?null:n)}})})})]})}),e.jsx(S,{title:s("security.fs.title"),description:s("security.fs.description"),children:e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(v,{label:s("security.fs.restrict"),children:e.jsxs(O,{value:(u.AGIM_NATIVE_FS_RESTRICT??"0")==="1"?"1":"0",onValueChange:l=>void c("AGIM_NATIVE_FS_RESTRICT",l==="1"?"1":null),children:[e.jsx(k,{children:e.jsx(L,{})}),e.jsxs(R,{children:[e.jsx(g,{value:"1",children:s("security.fs.restrictOn")}),e.jsx(g,{value:"0",children:s("security.fs.restrictOff")})]})]})}),e.jsx(v,{label:s("security.fs.timeoutMs"),children:e.jsx(_,{type:"number",defaultValue:u.AGIM_NATIVE_FS_TIMEOUT_MS??"",placeholder:"60000",onBlur:l=>{const n=l.target.value.trim();c("AGIM_NATIVE_FS_TIMEOUT_MS",n===""?null:n)}})})]})}),e.jsx(S,{title:s("security.delegation.title"),description:s("security.delegation.description"),envKey:"AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN",children:e.jsx(_,{type:"number",defaultValue:u.AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN??"",placeholder:"2",onBlur:l=>{const n=l.target.value.trim();c("AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN",n===""?null:n)}})}),e.jsxs(S,{title:s("security.platformBlacklist.title"),description:s("security.platformBlacklist.description"),envKey:"AGIM_PLATFORM_BLACKLIST",children:[e.jsx(_,{defaultValue:u.AGIM_PLATFORM_BLACKLIST??"",placeholder:s("security.platformBlacklist.placeholder"),onBlur:l=>{const n=l.target.value.trim();c("AGIM_PLATFORM_BLACKLIST",n===""?null:n)}}),t?.platformBlacklist&&t.platformBlacklist.length>0&&e.jsxs("p",{className:"mt-2 text-[10px] text-text-muted",children:[s("security.platformBlacklist.currentLabel"),": ",t.platformBlacklist.join(", ")]})]})]})}function oe({diagnostics:s,env:i,loading:r,onSetValue:m}){const{t}=P("settings"),y=K(i.AGIM_ALLOWED_USERS),p=f.useMemo(()=>{const o=[];return B(i.AGIM_DANGEROUSLY_SKIP_PERMISSIONS)&&o.push({id:"skip-permissions",level:"danger",title:t("security.posture.issue.skipPermissions.title"),detail:t("security.posture.issue.skipPermissions.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs text-danger",onClick:()=>m("AGIM_DANGEROUSLY_SKIP_PERMISSIONS","0"),children:t("security.posture.issue.skipPermissions.action")})}),y.mode==="open"&&o.push({id:"sender-open",level:"warn",title:y.explicitOpen?t("security.posture.issue.senderOpenExplicit.title"):t("security.posture.issue.senderOpenImplicit.title"),detail:y.explicitOpen?t("security.posture.issue.senderOpenExplicit.detail"):t("security.posture.issue.senderOpenImplicit.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs",asChild:!0,children:e.jsx("a",{href:"#sender-allowlist",children:t("security.posture.issue.senderOpenImplicit.action")})})}),s&&!s.adminAllowlistConfigured&&o.push({id:"admin-empty",level:"warn",title:t("security.posture.issue.adminEmpty.title"),detail:t("security.posture.issue.adminEmpty.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs",asChild:!0,children:e.jsx($,{to:"/settings/admins",children:t("security.posture.issue.adminEmpty.action")})})}),s?.envFile.exists&&s.envFile.tooPermissive&&o.push({id:"env-perms",level:"warn",title:t("security.posture.issue.envPerms.title"),detail:t("security.posture.issue.envPerms.detail",{mode:s.envFile.mode??"---"})}),s?.runningAsRoot===!0&&o.push({id:"root",level:"warn",title:t("security.posture.issue.root.title"),detail:t("security.posture.issue.root.detail")}),B(i.AGIM_NATIVE_WEB_ALLOW_PRIVATE)&&o.push({id:"private-web",level:"warn",title:t("security.posture.issue.privateWeb.title"),detail:t("security.posture.issue.privateWeb.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs",onClick:()=>m("AGIM_NATIVE_WEB_ALLOW_PRIVATE",null),children:t("security.posture.issue.privateWeb.action")})}),B(i.AGIM_NATIVE_FS_RESTRICT)||o.push({id:"fs-open",level:"warn",title:t("security.posture.issue.fsOpen.title"),detail:t("security.posture.issue.fsOpen.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs",onClick:()=>m("AGIM_NATIVE_FS_RESTRICT","1"),children:t("security.posture.issue.fsOpen.action")})}),o},[s,i,m,y.explicitOpen,y.mode,t]),b=p.filter(o=>o.level==="danger").length,x=!r&&p.length===0;return e.jsxs("section",{className:V("rounded-md border p-4 shadow-sm",b>0?"border-danger/60 bg-danger-bg/30":"border-border bg-surface"),children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[x?e.jsx(W,{className:"h-4 w-4 text-success"}):e.jsx(z,{className:"h-4 w-4 text-warning"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("security.posture.title")}),e.jsx(T,{variant:x?"success":b>0?"danger":"warning",children:r?t("security.posture.loading"):x?t("security.posture.ready"):t("security.posture.needsAction",{count:p.length})}),e.jsx("p",{className:"basis-full text-xs text-text-dim sm:basis-auto sm:ml-2",children:t(x?"security.posture.readyDetail":"security.posture.detail")})]}),r?e.jsx("div",{className:"mt-3 h-10 rounded-md bg-surface-2 animate-pulse"}):p.length>0?e.jsx("ul",{className:"mt-3 grid gap-3 md:grid-cols-3",children:p.slice(0,5).map(o=>e.jsxs("li",{className:V("min-w-0 rounded-md border border-l-2 p-3",o.level==="danger"?"border-danger/40 border-l-danger bg-danger-bg/45":"border-warning/40 border-l-warning bg-warning-bg/55"),children:[e.jsx("div",{className:"text-sm font-medium",children:o.title}),e.jsx("div",{className:"mt-0.5 text-xs text-text-dim",children:o.detail}),o.action&&e.jsx("div",{className:"mt-1",children:o.action})]},o.id))}):null]})}function de({diagnostics:s,loading:i}){const{t:r}=P("settings");return e.jsxs("details",{className:"rounded-md border border-border bg-surface shadow-sm",children:[e.jsxs("summary",{className:"flex cursor-pointer list-none flex-wrap items-center gap-2 px-3 py-2 text-sm font-medium",children:[e.jsx(z,{className:"h-4 w-4 text-text-dim"}),e.jsx("span",{children:r("security.diagnostics.title")}),e.jsx("span",{className:"text-xs font-normal text-text-muted",children:r("security.diagnostics.summary")}),e.jsx(T,{variant:"outline",className:"ml-auto",children:r("security.diagnostics.advanced")})]}),e.jsx("div",{className:"border-t border-border bg-surface-2/35 px-3 py-3",children:s?e.jsxs("ul",{className:"grid gap-2 text-sm sm:grid-cols-2",children:[e.jsx(I,{label:r("security.diagnostics.runningAsRoot"),ok:s.runningAsRoot===!1,text:s.runningAsRoot===!0?r("security.diagnostics.runningAsRootHelp"):"OK"}),e.jsx(I,{label:r("security.diagnostics.envFilePerms"),ok:s.envFile.exists&&!s.envFile.tooPermissive,text:s.envFile.exists?s.envFile.tooPermissive?`${s.envFile.mode} — ${r("security.diagnostics.envFilePermsLax")}`:r("security.diagnostics.envFilePermsOk"):"—"}),e.jsx(I,{label:r("security.diagnostics.bwrapAvailable"),ok:s.bwrapAvailable,text:s.bwrapAvailable?"/usr/bin/bwrap":r("security.diagnostics.bwrapMissing")}),e.jsx(I,{label:r("security.diagnostics.senderAllowlist"),ok:s.senderAllowlistConfigured,text:s.senderAllowlistConfigured?r("security.diagnostics.senderAllowlistOn"):r("security.diagnostics.senderAllowlistOff")}),e.jsx(I,{label:r("security.diagnostics.adminAllowlist"),ok:s.adminAllowlistConfigured,text:s.adminAllowlistConfigured?r("security.diagnostics.adminAllowlistOn"):r("security.diagnostics.adminAllowlistOff")}),e.jsx(I,{label:r("security.diagnosticsPlatformBlacklist"),ok:s.platformBlacklist.length===0,text:s.platformBlacklist.length===0?"—":s.platformBlacklist.join(", ")})]}):e.jsx("p",{className:"text-sm text-text-dim",children:i?r("security.posture.loading"):"…"})})]})}function ue({mode:s,members:i,choices:r,loading:m,explicitOpen:t,dirty:y,saving:p,onModeChange:b,onMembersChange:x,onSave:o}){const{t:d}=P("settings"),[w,E]=f.useState(""),c=M(i),u=f.useMemo(()=>new Set(c),[c]);function h(a){u.has(a)?x(c.filter(N=>N!==a)):x([...c,a])}function C(){const a=M(w.split(","));a.length!==0&&(x(M([...c,...a])),E(""),b("restricted"))}return e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(j,{type:"button",size:"sm",variant:s==="restricted"?"default":"secondary",onClick:()=>b("restricted"),"aria-pressed":s==="restricted",children:d("security.sender.modeRestricted")}),e.jsx(j,{type:"button",size:"sm",variant:s==="open"?"default":"secondary",onClick:()=>b("open"),"aria-pressed":s==="open",children:d("security.sender.modeOpen")}),s==="open"&&e.jsx(T,{variant:t?"outline":"warning",children:d(t?"security.sender.openExplicit":"security.sender.openImplicit")})]}),s==="restricted"?e.jsxs("div",{className:"rounded-md border border-border bg-surface-2 p-2",children:[e.jsx("div",{className:"flex min-h-8 flex-wrap items-center gap-1.5",children:c.length===0?e.jsx("span",{className:"px-1 text-xs text-text-muted",children:d("security.sender.emptyMembers")}):c.map(a=>e.jsxs(T,{variant:"secondary",className:"normal-case tracking-normal",children:[e.jsx("span",{className:"font-mono",children:a}),e.jsx("button",{type:"button",className:"ml-1 rounded-full text-text-dim hover:text-text",onClick:()=>x(c.filter(N=>N!==a)),"aria-label":d("security.sender.removeMember",{value:a}),children:e.jsx(q,{className:"h-3 w-3"})})]},a))}),e.jsxs("div",{className:"mt-2 flex flex-wrap gap-2",children:[e.jsxs(Y,{children:[e.jsx(J,{asChild:!0,children:e.jsxs(j,{type:"button",variant:"outline",size:"sm",disabled:m,children:[m?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(ae,{className:"h-4 w-4"}),d("security.sender.chooseMembers")]})}),e.jsxs(Z,{align:"start",className:"max-h-80 w-80 overflow-y-auto",children:[e.jsx(ee,{children:d("security.sender.chooseMembers")}),e.jsx(se,{}),r.length===0?e.jsx("div",{className:"px-2 py-2 text-sm text-text-muted",children:d("security.sender.noChoices")}):r.map(a=>e.jsx(te,{checked:u.has(a.value),onCheckedChange:()=>h(a.value),onSelect:N=>N.preventDefault(),className:"items-start gap-2",children:e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block truncate font-mono text-xs",children:a.label}),a.detail&&e.jsx("span",{className:"mt-0.5 block truncate text-xs text-text-muted",children:a.detail})]})},a.value))]})]}),e.jsxs("div",{className:"flex min-w-[220px] flex-1 gap-2",children:[e.jsx(_,{value:w,onChange:a=>E(a.target.value),onKeyDown:a=>{a.key==="Enter"&&(a.preventDefault(),C())},placeholder:d("security.sender.placeholder"),className:"h-7 font-mono text-xs"}),e.jsx(j,{type:"button",variant:"secondary",size:"sm",onClick:C,disabled:!w.trim(),children:d("security.sender.addCustom")})]})]})]}):e.jsxs("p",{className:"flex items-start gap-2 text-xs text-text-muted",children:[e.jsx(X,{className:"mt-0.5 h-3.5 w-3.5 shrink-0 text-warning"}),e.jsx("span",{children:d("security.sender.openHint")})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs(j,{type:"button",size:"sm",onClick:o,disabled:p||!y||s==="restricted"&&c.length===0,children:[p?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(W,{className:"h-4 w-4"}),d("security.sender.save")]}),e.jsx("span",{className:"text-[10px] text-text-muted",children:d(y?"security.sender.unsaved":"security.sender.saved")})]})]})}function I({label:s,ok:i,text:r}){return e.jsxs("li",{className:"flex items-start gap-2 rounded-md border border-border bg-surface p-3",children:[i?e.jsx(Q,{className:"mt-0.5 h-4 w-4 shrink-0 text-success"}):e.jsx(X,{className:"mt-0.5 h-4 w-4 shrink-0 text-warning"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"font-medium",children:s}),e.jsx("div",{className:V("text-xs",i?"text-text-muted":"text-warning"),children:r})]})]})}function S({id:s,title:i,description:r,envKey:m,children:t}){return e.jsxs("section",{id:s,className:"rounded-md border border-border bg-surface p-4 shadow-sm",children:[e.jsxs("div",{className:"mb-2 flex flex-wrap items-baseline gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold",children:i}),m&&e.jsx(T,{variant:"outline",className:"font-mono text-[10px]",children:m})]}),e.jsx("p",{className:"mb-3 text-xs text-text-dim",children:r}),t]})}function v({label:s,hint:i,children:r}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{className:"text-xs font-medium text-text-dim",children:s}),r,i&&e.jsx("p",{className:"text-[10px] text-text-muted",children:i})]})}function M(s){const i=[],r=new Set;for(const m of s){const t=m.trim();!t||r.has(t)||(r.add(t),i.push(t))}return i}function me(s){return`${s.platform}:${s.userId}`}function xe(s){const i=new Date(s);return Number.isNaN(i.getTime())?s:i.toLocaleString()}export{Ne as default};
|
|
2
|
+
//# sourceMappingURL=security-CbP4QgVp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-CbP4QgVp.js","sources":["../../src/routes/settings/security.tsx"],"sourcesContent":["/**\n * /settings/security — central console for v1.2.66 security controls.\n *\n * Lays out:\n * • Diagnostics card (read-only) — uid 0? env file perms? bwrap? allowlists configured?\n * • Sender allowlist (AGIM_ALLOWED_USERS)\n * • Native exec (AGIM_EXEC_SANDBOX, AGIM_EXEC_SANDBOX_NET, AGIM_EXEC_TIMEOUT_MS, AGIM_EXEC_MAX_OUTPUT)\n * • Native web (AGIM_NATIVE_WEB_ALLOW_PRIVATE, AGIM_NATIVE_WEB_SSRF_WHITELIST, AGIM_NATIVE_WEB_TIMEOUT_MS)\n * • Native fs (AGIM_NATIVE_FS_RESTRICT, AGIM_NATIVE_FS_TIMEOUT_MS)\n * • Delegation (AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN)\n *\n * All writes go through PUT /api/env (admin-gated). Most knobs are\n * hot-reloaded (read process.env per tool call); the exec sandbox +\n * sender allowlist apply at boot — service restart required.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Link } from 'react-router-dom'\nimport { toast } from 'sonner'\nimport {\n AlertTriangle,\n CheckCircle2,\n Loader2,\n Plus,\n RefreshCcw,\n ShieldAlert,\n ShieldCheck,\n X,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Input } from '@/components/ui/input'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useAdminAllowlist, useEnv, useUpdateEnv } from '@/hooks/use-settings'\nimport { client } from '@/lib/api/client'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\nimport type { KnownImUser } from '@/types/api'\n\ninterface Diagnostics {\n runningAsRoot: boolean | null\n envFile: { exists: boolean; mode: string | null; tooPermissive: boolean }\n bwrapAvailable: boolean\n senderAllowlistConfigured: boolean\n adminAllowlistConfigured: boolean\n platformBlacklist: string[]\n liveEnv: Record<string, string | null>\n}\n\ninterface SenderChoice {\n value: string\n label: string\n detail?: string\n}\n\ntype SenderMode = 'restricted' | 'open'\n\nfunction envBool(v: string | undefined): boolean {\n if (v == null) return false\n const t = v.toLowerCase()\n return t === '1' || t === 'true' || t === 'yes' || t === 'on'\n}\n\nfunction parseSenderAllowlist(raw: string | undefined): { mode: SenderMode; members: string[]; explicitOpen: boolean } {\n const value = (raw ?? '').trim()\n if (value === '*') return { mode: 'open', members: [], explicitOpen: true }\n if (!value) return { mode: 'open', members: [], explicitOpen: false }\n return {\n mode: 'restricted',\n members: uniqueStrings(value.split(',')),\n explicitOpen: false,\n }\n}\n\nfunction serializeSenderAllowlist(mode: SenderMode, members: string[]): string | null {\n if (mode === 'open') return '*'\n const values = uniqueStrings(members)\n return values.length > 0 ? values.join(',') : null\n}\n\nfunction senderValueFingerprint(mode: SenderMode, members: string[]): string {\n return mode === 'open' ? '*' : uniqueStrings(members).join(',')\n}\n\nexport default function SettingsSecurityRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const envQuery = useEnv()\n const updateEnv = useUpdateEnv()\n const adminsQuery = useAdminAllowlist()\n const [diagnostics, setDiagnostics] = useState<Diagnostics | null>(null)\n const [diagLoading, setDiagLoading] = useState(false)\n const [senderMode, setSenderMode] = useState<SenderMode>('open')\n const [senderMembers, setSenderMembers] = useState<string[]>([])\n\n async function loadDiagnostics(): Promise<void> {\n setDiagLoading(true)\n try {\n const res = await client.get<{ diagnostics: Diagnostics }>('/api/security/diagnostics')\n setDiagnostics(res.diagnostics)\n } catch (err) {\n toast.error(describeError(err, t).message)\n } finally {\n setDiagLoading(false)\n }\n }\n\n useEffect(() => { void loadDiagnostics() }, [])\n\n async function setValue(key: string, value: string | null): Promise<void> {\n try {\n await updateEnv.mutateAsync({ updates: { [key]: value } })\n toast.success(t('security.savingToast'))\n await loadDiagnostics()\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n const env = envQuery.data?.env ?? {}\n const senderParsed = useMemo(() => parseSenderAllowlist(env.AGIM_ALLOWED_USERS), [env.AGIM_ALLOWED_USERS])\n const senderChoices = useMemo<SenderChoice[]>(() => {\n const choices = new Map<string, SenderChoice>()\n for (const u of adminsQuery.data?.knownUsers ?? []) {\n const key = imUserKey(u)\n choices.set(key, {\n value: key,\n label: key,\n detail: t('security.sender.lastSeen', { time: formatSeenAt(u.lastSeenAt) }),\n })\n }\n for (const member of senderMembers) {\n if (!choices.has(member)) {\n choices.set(member, {\n value: member,\n label: member,\n detail: t('security.sender.fromCurrentValue'),\n })\n }\n }\n return [...choices.values()].sort((a, b) => a.label.localeCompare(b.label))\n }, [adminsQuery.data?.knownUsers, senderMembers, t])\n const senderDirty = senderMode === 'open'\n ? senderParsed.mode !== 'open' || !senderParsed.explicitOpen\n : senderValueFingerprint(senderMode, senderMembers)\n !== senderValueFingerprint(senderParsed.mode, senderParsed.members)\n\n useEffect(() => {\n setSenderMode(senderParsed.mode)\n setSenderMembers(senderParsed.members)\n }, [senderParsed.mode, senderParsed.members])\n\n async function saveSenderAllowlist(): Promise<void> {\n const next = serializeSenderAllowlist(senderMode, senderMembers)\n if (senderMode === 'restricted' && next === null) {\n toast.error(t('security.sender.emptyRestrictedToast'))\n return\n }\n await setValue('AGIM_ALLOWED_USERS', next)\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('security.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => { void envQuery.refetch(); void loadDiagnostics() }}\n disabled={envQuery.isFetching || diagLoading}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {envQuery.isFetching || diagLoading\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />\n }\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('security.subtitle')}</p>\n </header>\n\n <SecurityPosture\n diagnostics={diagnostics}\n env={env}\n loading={envQuery.isLoading || diagLoading}\n onSetValue={(key, value) => void setValue(key, value)}\n />\n\n {/* Sender allowlist */}\n <ControlCard\n id=\"sender-allowlist\"\n title={t('security.sender.title')}\n description={t('security.sender.description')}\n >\n <SenderAllowlistEditor\n mode={senderMode}\n members={senderMembers}\n choices={senderChoices}\n loading={adminsQuery.isLoading}\n explicitOpen={senderParsed.explicitOpen}\n dirty={senderDirty}\n saving={updateEnv.isPending}\n onModeChange={setSenderMode}\n onMembersChange={setSenderMembers}\n onSave={() => void saveSenderAllowlist()}\n />\n </ControlCard>\n\n <DiagnosticsPanel diagnostics={diagnostics} loading={diagLoading} />\n\n {/* Exec sandbox */}\n <ControlCard\n title={t('security.exec.title')}\n description={t('security.exec.description')}\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <LabeledField label={t('security.exec.sandbox')}>\n <Select\n value={(env.AGIM_EXEC_SANDBOX ?? '').toLowerCase() === 'bwrap' ? 'bwrap' : '__none__'}\n onValueChange={(v) => void setValue('AGIM_EXEC_SANDBOX', v === '__none__' ? null : v)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none__\">{t('security.exec.sandboxNone')}</SelectItem>\n <SelectItem\n value=\"bwrap\"\n disabled={!diagnostics?.bwrapAvailable}\n >\n {t('security.exec.sandboxBwrap')}\n {!diagnostics?.bwrapAvailable && (\n <span className=\"ml-2 text-xs text-text-muted\">\n ({t('security.exec.sandboxBwrapMissing')})\n </span>\n )}\n </SelectItem>\n </SelectContent>\n </Select>\n </LabeledField>\n\n <LabeledField label={t('security.exec.sandboxNet')}>\n <Select\n value={(env.AGIM_EXEC_SANDBOX_NET ?? '').toLowerCase() === 'off' ? 'off' : 'on'}\n onValueChange={(v) => void setValue('AGIM_EXEC_SANDBOX_NET', v === 'off' ? 'off' : null)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"on\">{t('security.exec.sandboxNetOn')}</SelectItem>\n <SelectItem value=\"off\">{t('security.exec.sandboxNetOff')}</SelectItem>\n </SelectContent>\n </Select>\n </LabeledField>\n\n <LabeledField label={t('security.exec.timeoutMs')}>\n <Input\n type=\"number\"\n defaultValue={env.AGIM_EXEC_TIMEOUT_MS ?? ''}\n placeholder=\"60000\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_EXEC_TIMEOUT_MS', v === '' ? null : v)\n }}\n />\n </LabeledField>\n\n <LabeledField label={t('security.exec.maxOutput')}>\n <Input\n type=\"number\"\n defaultValue={env.AGIM_EXEC_MAX_OUTPUT ?? ''}\n placeholder=\"32768\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_EXEC_MAX_OUTPUT', v === '' ? null : v)\n }}\n />\n </LabeledField>\n </div>\n </ControlCard>\n\n {/* Web SSRF */}\n <ControlCard\n title={t('security.web.title')}\n description={t('security.web.description')}\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <LabeledField label={t('security.web.allowPrivate')} hint={t('security.web.allowPrivateHelp')}>\n <Select\n value={envBool(env.AGIM_NATIVE_WEB_ALLOW_PRIVATE) ? '1' : '0'}\n onValueChange={(v) => void setValue('AGIM_NATIVE_WEB_ALLOW_PRIVATE', v === '1' ? '1' : null)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"0\">OFF</SelectItem>\n <SelectItem value=\"1\">ON</SelectItem>\n </SelectContent>\n </Select>\n </LabeledField>\n\n <LabeledField label={t('security.web.timeoutMs')}>\n <Input\n type=\"number\"\n defaultValue={env.AGIM_NATIVE_WEB_TIMEOUT_MS ?? ''}\n placeholder=\"30000\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_NATIVE_WEB_TIMEOUT_MS', v === '' ? null : v)\n }}\n />\n </LabeledField>\n\n <div className=\"sm:col-span-2\">\n <LabeledField label={t('security.web.ssrfWhitelist')}>\n <Input\n defaultValue={env.AGIM_NATIVE_WEB_SSRF_WHITELIST ?? ''}\n placeholder={t('security.web.ssrfWhitelistPlaceholder')}\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_NATIVE_WEB_SSRF_WHITELIST', v === '' ? null : v)\n }}\n />\n </LabeledField>\n </div>\n </div>\n </ControlCard>\n\n {/* FS */}\n <ControlCard\n title={t('security.fs.title')}\n description={t('security.fs.description')}\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <LabeledField label={t('security.fs.restrict')}>\n <Select\n value={(env.AGIM_NATIVE_FS_RESTRICT ?? '0') === '1' ? '1' : '0'}\n onValueChange={(v) => void setValue('AGIM_NATIVE_FS_RESTRICT', v === '1' ? '1' : null)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"1\">{t('security.fs.restrictOn')}</SelectItem>\n <SelectItem value=\"0\">{t('security.fs.restrictOff')}</SelectItem>\n </SelectContent>\n </Select>\n </LabeledField>\n\n <LabeledField label={t('security.fs.timeoutMs')}>\n <Input\n type=\"number\"\n defaultValue={env.AGIM_NATIVE_FS_TIMEOUT_MS ?? ''}\n placeholder=\"60000\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_NATIVE_FS_TIMEOUT_MS', v === '' ? null : v)\n }}\n />\n </LabeledField>\n </div>\n </ControlCard>\n\n {/* Delegation cap */}\n <ControlCard\n title={t('security.delegation.title')}\n description={t('security.delegation.description')}\n envKey=\"AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN\"\n >\n <Input\n type=\"number\"\n defaultValue={env.AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN ?? ''}\n placeholder=\"2\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN', v === '' ? null : v)\n }}\n />\n </ControlCard>\n\n {/* IM platform blacklist */}\n <ControlCard\n title={t('security.platformBlacklist.title')}\n description={t('security.platformBlacklist.description')}\n envKey=\"AGIM_PLATFORM_BLACKLIST\"\n >\n <Input\n defaultValue={env.AGIM_PLATFORM_BLACKLIST ?? ''}\n placeholder={t('security.platformBlacklist.placeholder')}\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_PLATFORM_BLACKLIST', v === '' ? null : v)\n }}\n />\n {diagnostics?.platformBlacklist && diagnostics.platformBlacklist.length > 0 && (\n <p className=\"mt-2 text-[10px] text-text-muted\">\n {t('security.platformBlacklist.currentLabel')}: {diagnostics.platformBlacklist.join(', ')}\n </p>\n )}\n </ControlCard>\n </div>\n )\n}\n\nfunction SecurityPosture({\n diagnostics,\n env,\n loading,\n onSetValue,\n}: {\n diagnostics: Diagnostics | null\n env: Record<string, string | undefined>\n loading: boolean\n onSetValue: (key: string, value: string | null) => void\n}): JSX.Element {\n const { t } = useTranslation('settings')\n const sender = parseSenderAllowlist(env.AGIM_ALLOWED_USERS)\n const issues = useMemo(() => {\n const rows: Array<{\n id: string\n level: 'danger' | 'warn'\n title: string\n detail: string\n action?: JSX.Element\n }> = []\n\n if (envBool(env.AGIM_DANGEROUSLY_SKIP_PERMISSIONS)) {\n rows.push({\n id: 'skip-permissions',\n level: 'danger',\n title: t('security.posture.issue.skipPermissions.title'),\n detail: t('security.posture.issue.skipPermissions.detail'),\n action: (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"link\"\n className=\"h-auto p-0 text-xs text-danger\"\n onClick={() => onSetValue('AGIM_DANGEROUSLY_SKIP_PERMISSIONS', '0')}\n >\n {t('security.posture.issue.skipPermissions.action')}\n </Button>\n ),\n })\n }\n\n if (sender.mode === 'open') {\n rows.push({\n id: 'sender-open',\n level: 'warn',\n title: sender.explicitOpen\n ? t('security.posture.issue.senderOpenExplicit.title')\n : t('security.posture.issue.senderOpenImplicit.title'),\n detail: sender.explicitOpen\n ? t('security.posture.issue.senderOpenExplicit.detail')\n : t('security.posture.issue.senderOpenImplicit.detail'),\n action: (\n <Button type=\"button\" size=\"sm\" variant=\"link\" className=\"h-auto p-0 text-xs\" asChild>\n <a href=\"#sender-allowlist\">{t('security.posture.issue.senderOpenImplicit.action')}</a>\n </Button>\n ),\n })\n }\n\n if (diagnostics && !diagnostics.adminAllowlistConfigured) {\n rows.push({\n id: 'admin-empty',\n level: 'warn',\n title: t('security.posture.issue.adminEmpty.title'),\n detail: t('security.posture.issue.adminEmpty.detail'),\n action: (\n <Button type=\"button\" size=\"sm\" variant=\"link\" className=\"h-auto p-0 text-xs\" asChild>\n <Link to=\"/settings/admins\">{t('security.posture.issue.adminEmpty.action')}</Link>\n </Button>\n ),\n })\n }\n\n if (diagnostics?.envFile.exists && diagnostics.envFile.tooPermissive) {\n rows.push({\n id: 'env-perms',\n level: 'warn',\n title: t('security.posture.issue.envPerms.title'),\n detail: t('security.posture.issue.envPerms.detail', { mode: diagnostics.envFile.mode ?? '---' }),\n })\n }\n\n if (diagnostics?.runningAsRoot === true) {\n rows.push({\n id: 'root',\n level: 'warn',\n title: t('security.posture.issue.root.title'),\n detail: t('security.posture.issue.root.detail'),\n })\n }\n\n if (envBool(env.AGIM_NATIVE_WEB_ALLOW_PRIVATE)) {\n rows.push({\n id: 'private-web',\n level: 'warn',\n title: t('security.posture.issue.privateWeb.title'),\n detail: t('security.posture.issue.privateWeb.detail'),\n action: (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"link\"\n className=\"h-auto p-0 text-xs\"\n onClick={() => onSetValue('AGIM_NATIVE_WEB_ALLOW_PRIVATE', null)}\n >\n {t('security.posture.issue.privateWeb.action')}\n </Button>\n ),\n })\n }\n\n if (!envBool(env.AGIM_NATIVE_FS_RESTRICT)) {\n rows.push({\n id: 'fs-open',\n level: 'warn',\n title: t('security.posture.issue.fsOpen.title'),\n detail: t('security.posture.issue.fsOpen.detail'),\n action: (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"link\"\n className=\"h-auto p-0 text-xs\"\n onClick={() => onSetValue('AGIM_NATIVE_FS_RESTRICT', '1')}\n >\n {t('security.posture.issue.fsOpen.action')}\n </Button>\n ),\n })\n }\n\n return rows\n }, [diagnostics, env, onSetValue, sender.explicitOpen, sender.mode, t])\n\n const dangerCount = issues.filter((issue) => issue.level === 'danger').length\n const ready = !loading && issues.length === 0\n\n return (\n <section className={cn(\n 'rounded-md border p-4 shadow-sm',\n dangerCount > 0 ? 'border-danger/60 bg-danger-bg/30' : 'border-border bg-surface',\n )}>\n <div className=\"flex flex-wrap items-center gap-2\">\n {ready ? <ShieldCheck className=\"h-4 w-4 text-success\" /> : <ShieldAlert className=\"h-4 w-4 text-warning\" />}\n <h2 className=\"text-sm font-semibold\">{t('security.posture.title')}</h2>\n <Badge variant={ready ? 'success' : dangerCount > 0 ? 'danger' : 'warning'}>\n {loading\n ? t('security.posture.loading')\n : ready\n ? t('security.posture.ready')\n : t('security.posture.needsAction', { count: issues.length })}\n </Badge>\n <p className=\"basis-full text-xs text-text-dim sm:basis-auto sm:ml-2\">\n {ready ? t('security.posture.readyDetail') : t('security.posture.detail')}\n </p>\n </div>\n\n {loading ? (\n <div className=\"mt-3 h-10 rounded-md bg-surface-2 animate-pulse\" />\n ) : issues.length > 0 ? (\n <ul className=\"mt-3 grid gap-3 md:grid-cols-3\">\n {issues.slice(0, 5).map((issue) => (\n <li\n key={issue.id}\n className={cn(\n 'min-w-0 rounded-md border border-l-2 p-3',\n issue.level === 'danger'\n ? 'border-danger/40 border-l-danger bg-danger-bg/45'\n : 'border-warning/40 border-l-warning bg-warning-bg/55',\n )}\n >\n <div className=\"text-sm font-medium\">{issue.title}</div>\n <div className=\"mt-0.5 text-xs text-text-dim\">{issue.detail}</div>\n {issue.action && (\n <div className=\"mt-1\">\n {issue.action}\n </div>\n )}\n </li>\n ))}\n </ul>\n ) : null}\n </section>\n )\n}\n\nfunction DiagnosticsPanel({\n diagnostics,\n loading,\n}: {\n diagnostics: Diagnostics | null\n loading: boolean\n}): JSX.Element {\n const { t } = useTranslation('settings')\n\n return (\n <details className=\"rounded-md border border-border bg-surface shadow-sm\">\n <summary className=\"flex cursor-pointer list-none flex-wrap items-center gap-2 px-3 py-2 text-sm font-medium\">\n <ShieldAlert className=\"h-4 w-4 text-text-dim\" />\n <span>{t('security.diagnostics.title')}</span>\n <span className=\"text-xs font-normal text-text-muted\">{t('security.diagnostics.summary')}</span>\n <Badge variant=\"outline\" className=\"ml-auto\">{t('security.diagnostics.advanced')}</Badge>\n </summary>\n <div className=\"border-t border-border bg-surface-2/35 px-3 py-3\">\n {diagnostics ? (\n <ul className=\"grid gap-2 text-sm sm:grid-cols-2\">\n <DiagRow\n label={t('security.diagnostics.runningAsRoot')}\n ok={diagnostics.runningAsRoot === false}\n text={diagnostics.runningAsRoot === true ? t('security.diagnostics.runningAsRootHelp') : 'OK'}\n />\n <DiagRow\n label={t('security.diagnostics.envFilePerms')}\n ok={diagnostics.envFile.exists && !diagnostics.envFile.tooPermissive}\n text={\n !diagnostics.envFile.exists\n ? '—'\n : diagnostics.envFile.tooPermissive\n ? `${diagnostics.envFile.mode} — ${t('security.diagnostics.envFilePermsLax')}`\n : t('security.diagnostics.envFilePermsOk')\n }\n />\n <DiagRow\n label={t('security.diagnostics.bwrapAvailable')}\n ok={diagnostics.bwrapAvailable}\n text={diagnostics.bwrapAvailable ? '/usr/bin/bwrap' : t('security.diagnostics.bwrapMissing')}\n />\n <DiagRow\n label={t('security.diagnostics.senderAllowlist')}\n ok={diagnostics.senderAllowlistConfigured}\n text={diagnostics.senderAllowlistConfigured\n ? t('security.diagnostics.senderAllowlistOn')\n : t('security.diagnostics.senderAllowlistOff')\n }\n />\n <DiagRow\n label={t('security.diagnostics.adminAllowlist')}\n ok={diagnostics.adminAllowlistConfigured}\n text={diagnostics.adminAllowlistConfigured\n ? t('security.diagnostics.adminAllowlistOn')\n : t('security.diagnostics.adminAllowlistOff')\n }\n />\n <DiagRow\n label={t('security.diagnosticsPlatformBlacklist')}\n ok={diagnostics.platformBlacklist.length === 0}\n text={diagnostics.platformBlacklist.length === 0\n ? '—'\n : diagnostics.platformBlacklist.join(', ')\n }\n />\n </ul>\n ) : (\n <p className=\"text-sm text-text-dim\">{loading ? t('security.posture.loading') : '…'}</p>\n )}\n </div>\n </details>\n )\n}\n\nfunction SenderAllowlistEditor({\n mode,\n members,\n choices,\n loading,\n explicitOpen,\n dirty,\n saving,\n onModeChange,\n onMembersChange,\n onSave,\n}: {\n mode: SenderMode\n members: string[]\n choices: SenderChoice[]\n loading: boolean\n explicitOpen: boolean\n dirty: boolean\n saving: boolean\n onModeChange: (mode: SenderMode) => void\n onMembersChange: (members: string[]) => void\n onSave: () => void\n}): JSX.Element {\n const { t } = useTranslation('settings')\n const [custom, setCustom] = useState('')\n const selected = uniqueStrings(members)\n const selectedSet = useMemo(() => new Set(selected), [selected])\n\n function toggle(value: string): void {\n if (selectedSet.has(value)) {\n onMembersChange(selected.filter((item) => item !== value))\n } else {\n onMembersChange([...selected, value])\n }\n }\n\n function addCustom(): void {\n const parsed = uniqueStrings(custom.split(','))\n if (parsed.length === 0) return\n onMembersChange(uniqueStrings([...selected, ...parsed]))\n setCustom('')\n onModeChange('restricted')\n }\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === 'restricted' ? 'default' : 'secondary'}\n onClick={() => onModeChange('restricted')}\n aria-pressed={mode === 'restricted'}\n >\n {t('security.sender.modeRestricted')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === 'open' ? 'default' : 'secondary'}\n onClick={() => onModeChange('open')}\n aria-pressed={mode === 'open'}\n >\n {t('security.sender.modeOpen')}\n </Button>\n {mode === 'open' && (\n <Badge variant={explicitOpen ? 'outline' : 'warning'}>\n {explicitOpen ? t('security.sender.openExplicit') : t('security.sender.openImplicit')}\n </Badge>\n )}\n </div>\n\n {mode === 'restricted' ? (\n <div className=\"rounded-md border border-border bg-surface-2 p-2\">\n <div className=\"flex min-h-8 flex-wrap items-center gap-1.5\">\n {selected.length === 0 ? (\n <span className=\"px-1 text-xs text-text-muted\">{t('security.sender.emptyMembers')}</span>\n ) : selected.map((item) => (\n <Badge key={item} variant=\"secondary\" className=\"normal-case tracking-normal\">\n <span className=\"font-mono\">{item}</span>\n <button\n type=\"button\"\n className=\"ml-1 rounded-full text-text-dim hover:text-text\"\n onClick={() => onMembersChange(selected.filter((value) => value !== item))}\n aria-label={t('security.sender.removeMember', { value: item })}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n ))}\n </div>\n\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={loading}>\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Plus className=\"h-4 w-4\" />}\n {t('security.sender.chooseMembers')}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"max-h-80 w-80 overflow-y-auto\">\n <DropdownMenuLabel>{t('security.sender.chooseMembers')}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {choices.length === 0 ? (\n <div className=\"px-2 py-2 text-sm text-text-muted\">{t('security.sender.noChoices')}</div>\n ) : choices.map((choice) => (\n <DropdownMenuCheckboxItem\n key={choice.value}\n checked={selectedSet.has(choice.value)}\n onCheckedChange={() => toggle(choice.value)}\n onSelect={(event) => event.preventDefault()}\n className=\"items-start gap-2\"\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate font-mono text-xs\">{choice.label}</span>\n {choice.detail && (\n <span className=\"mt-0.5 block truncate text-xs text-text-muted\">{choice.detail}</span>\n )}\n </span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n <div className=\"flex min-w-[220px] flex-1 gap-2\">\n <Input\n value={custom}\n onChange={(e) => setCustom(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addCustom()\n }\n }}\n placeholder={t('security.sender.placeholder')}\n className=\"h-7 font-mono text-xs\"\n />\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={addCustom} disabled={!custom.trim()}>\n {t('security.sender.addCustom')}\n </Button>\n </div>\n </div>\n </div>\n ) : (\n <p className=\"flex items-start gap-2 text-xs text-text-muted\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-warning\" />\n <span>{t('security.sender.openHint')}</span>\n </p>\n )}\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={onSave}\n disabled={saving || !dirty || (mode === 'restricted' && selected.length === 0)}\n >\n {saving ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <ShieldCheck className=\"h-4 w-4\" />}\n {t('security.sender.save')}\n </Button>\n <span className=\"text-[10px] text-text-muted\">\n {dirty ? t('security.sender.unsaved') : t('security.sender.saved')}\n </span>\n </div>\n </div>\n )\n}\n\nfunction DiagRow({ label, ok, text }: { label: string; ok: boolean; text: string }): JSX.Element {\n return (\n <li className=\"flex items-start gap-2 rounded-md border border-border bg-surface p-3\">\n {ok\n ? <CheckCircle2 className=\"mt-0.5 h-4 w-4 shrink-0 text-success\" />\n : <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0 text-warning\" />\n }\n <div className=\"flex-1\">\n <div className=\"font-medium\">{label}</div>\n <div className={cn('text-xs', ok ? 'text-text-muted' : 'text-warning')}>{text}</div>\n </div>\n </li>\n )\n}\n\nfunction ControlCard({\n id, title, description, envKey, children,\n}: { id?: string; title: string; description: string; envKey?: string; children: React.ReactNode }): JSX.Element {\n return (\n <section id={id} className=\"rounded-md border border-border bg-surface p-4 shadow-sm\">\n <div className=\"mb-2 flex flex-wrap items-baseline gap-2\">\n <h2 className=\"text-sm font-semibold\">{title}</h2>\n {envKey && <Badge variant=\"outline\" className=\"font-mono text-[10px]\">{envKey}</Badge>}\n </div>\n <p className=\"mb-3 text-xs text-text-dim\">{description}</p>\n {children}\n </section>\n )\n}\n\nfunction LabeledField({\n label, hint, children,\n}: { label: string; hint?: string; children: React.ReactNode }): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-medium text-text-dim\">{label}</label>\n {children}\n {hint && <p className=\"text-[10px] text-text-muted\">{hint}</p>}\n </div>\n )\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const out: string[] = []\n const seen = new Set<string>()\n for (const raw of values) {\n const value = raw.trim()\n if (!value || seen.has(value)) continue\n seen.add(value)\n out.push(value)\n }\n return out\n}\n\nfunction imUserKey(user: KnownImUser): string {\n return `${user.platform}:${user.userId}`\n}\n\nfunction formatSeenAt(value: string): string {\n const dt = new Date(value)\n if (Number.isNaN(dt.getTime())) return value\n return dt.toLocaleString()\n}\n"],"names":["envBool","v","t","parseSenderAllowlist","raw","value","uniqueStrings","serializeSenderAllowlist","mode","members","values","senderValueFingerprint","SettingsSecurityRoute","useTranslation","envQuery","useEnv","updateEnv","useUpdateEnv","adminsQuery","useAdminAllowlist","diagnostics","setDiagnostics","useState","diagLoading","setDiagLoading","senderMode","setSenderMode","senderMembers","setSenderMembers","loadDiagnostics","res","client","err","toast","describeError","useEffect","setValue","key","env","senderParsed","useMemo","senderChoices","choices","u","imUserKey","formatSeenAt","member","a","b","senderDirty","saveSenderAllowlist","next","jsxs","jsx","Button","Loader2","RefreshCcw","SecurityPosture","ControlCard","SenderAllowlistEditor","DiagnosticsPanel","LabeledField","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","e","loading","onSetValue","sender","issues","rows","Link","dangerCount","issue","ready","cn","ShieldCheck","ShieldAlert","Badge","DiagRow","explicitOpen","dirty","saving","onModeChange","onMembersChange","onSave","custom","setCustom","selected","selectedSet","toggle","item","addCustom","parsed","X","DropdownMenu","DropdownMenuTrigger","Plus","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","choice","DropdownMenuCheckboxItem","event","AlertTriangle","label","ok","text","CheckCircle2","id","title","description","envKey","children","hint","out","seen","user","dt"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{h as e}from"./index-DCfdN5R7.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 y=e("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);export{y as S};
|
|
7
|
+
//# sourceMappingURL=server-Dg4e8pvm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-Dg4e8pvm.js","sources":["../../node_modules/lucide-react/dist/esm/icons/server.js"],"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 Server = createLucideIcon(\"Server\", [\n [\"rect\", { width: \"20\", height: \"8\", x: \"2\", y: \"2\", rx: \"2\", ry: \"2\", key: \"ngkwjq\" }],\n [\"rect\", { width: \"20\", height: \"8\", x: \"2\", y: \"14\", rx: \"2\", ry: \"2\", key: \"iecqi9\" }],\n [\"line\", { x1: \"6\", x2: \"6.01\", y1: \"6\", y2: \"6\", key: \"16zg32\" }],\n [\"line\", { x1: \"6\", x2: \"6.01\", y1: \"18\", y2: \"18\", key: \"nzw8ys\" }]\n]);\n\nexport { Server as default };\n//# sourceMappingURL=server.js.map\n"],"names":["Server","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,SAAU,EACtF,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,IAAK,EAAG,IAAK,EAAG,KAAM,GAAI,IAAK,GAAI,IAAK,IAAK,SAAU,EACvF,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,OAAQ,GAAI,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,OAAQ,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,CACrE,CAAC","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{h as U,u as y,j as e,e as u,d as j,R as O,f as N,p as l,q as f,X as q,w as M,I as W}from"./index-DCfdN5R7.js";import{r as g}from"./react-DlP5eolq.js";import{C as R}from"./confirm-dialog-BDb0NLny.js";import{a as $,e as Q,n as H,f as V,u as X,d as G,o as J}from"./use-settings-DGIjmUX0.js";import{L as k}from"./loader-circle-DDdmcH0k.js";import{R as T}from"./refresh-ccw-DlAd-eTQ.js";import{P as K}from"./play-DX5wp4WH.js";import{N as Y}from"./network-BUeWK3bs.js";import{S as Z}from"./save-BDOtZrfp.js";import{T as L}from"./terminal-_pXeEjXG.js";import{F as b}from"./file-text-BxfdLM0-.js";import{C as ee}from"./copy-CD4A7VD8.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 se=U("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]),te={systemd:"success",background:"info",foreground:"warning",none:"default"},A=3e3,F=9090;function be(){const{t:s}=y(["settings","common"]),r=$(),t=r.data,a=t&&t.mode!=="none",n=Q(),i=H(),c=V(),[m,o]=g.useState(!1),[h,v]=g.useState(!1);async function w(){try{await n.mutateAsync(),l.success(s("service.toast.started"))}catch(d){l.error(f(d,s).message)}}async function x(){try{await i.mutateAsync(),l.success(s("service.toast.stopped"))}catch(d){throw l.error(f(d,s).message),d}}async function p(){try{await c.mutateAsync(),l.success(s("service.toast.restarted"))}catch(d){throw l.error(f(d,s).message),d}}return e.jsxs("div",{className:"mx-auto flex max-w-3xl 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("service.title")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>r.refetch(),disabled:r.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[r.isFetching?e.jsx(k,{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("service.subtitle")})]}),e.jsx(ne,{}),r.isLoading?e.jsx("div",{className:"h-48 rounded-md bg-surface-2 animate-pulse"}):t?e.jsxs("div",{className:"rounded-md border border-border bg-surface p-4",children:[e.jsxs("dl",{className:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 text-sm",children:[e.jsx("dt",{className:"text-text-dim",children:s("service.modeLabel")}),e.jsx("dd",{children:e.jsx(j,{variant:te[t.mode],children:s(`service.mode.${t.mode}`)})}),t.pid!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:s("service.pidLabel")}),e.jsx("dd",{className:"tabular-nums font-mono",children:t.pid})]}),t.uptime&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:s("service.uptimeLabel")}),e.jsx("dd",{className:"tabular-nums",children:t.uptime})]}),t.web&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:s("service.webLabel")}),e.jsxs("dd",{className:"font-mono text-xs",children:[t.web.bind,":",t.web.port]})]}),e.jsx("dt",{className:"text-text-dim",children:s("service.bootPhaseLabel")}),e.jsx("dd",{children:e.jsx("code",{className:"rounded bg-surface-2 px-1.5 py-0.5 text-xs",children:t.bootPhase})})]}),e.jsxs("div",{className:"mt-4 flex flex-wrap gap-2",children:[e.jsxs(u,{type:"button",variant:"default",size:"sm",disabled:a||n.isPending,onClick:()=>void w(),children:[n.isPending?e.jsx(k,{className:"h-4 w-4 animate-spin"}):e.jsx(K,{className:"h-4 w-4"}),s("service.actions.start")]}),e.jsxs(u,{type:"button",variant:"outline",size:"sm",disabled:!a||c.isPending,onClick:()=>v(!0),children:[e.jsx(O,{className:N("h-4 w-4",c.isPending&&"animate-spin")}),s("service.actions.restart")]}),e.jsxs(u,{type:"button",variant:"destructive",size:"sm",disabled:!a||i.isPending,onClick:()=>o(!0),children:[e.jsx(se,{className:"h-4 w-4"}),s("service.actions.stop")]})]})]}):null,e.jsx(re,{service:t}),e.jsx(R,{open:m,onOpenChange:o,title:s("service.actions.confirmStop"),description:s("service.actions.confirmStopDesc"),intent:"danger",confirmLabel:s("service.actions.stop"),onConfirm:x}),e.jsx(R,{open:h,onOpenChange:v,title:s("service.actions.confirmRestart"),description:s("service.actions.confirmRestartDesc"),intent:"danger",confirmLabel:s("service.actions.restart"),onConfirm:p})]})}function re({service:s}){const{t:r}=y(["settings","common"]),t=J(120),a=t.data?.path??"~/.agim/agim.log",n=!!(s&&s.mode!=="none"),i=!!(n&&s?.bootPhase&&s.bootPhase!=="ready"),c=s?n?i?"booting":"running":"stopped":"loading",m=t.data?.exists===!0;async function o(v){try{await navigator.clipboard.writeText(v),l.success(r("service.recovery.toast.copied"))}catch{l.error(r("service.recovery.toast.copyFailed"))}}const h=`tail -n 120 ${ie(a)}`;return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex flex-col gap-2 border-b border-border px-4 py-3 sm:flex-row sm:items-center",children:[e.jsxs("div",{className:"flex min-w-0 flex-1 items-center gap-2",children:[e.jsx(L,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:r("service.recovery.title")}),e.jsx(j,{variant:c==="running"?"success":c==="stopped"?"warning":"info",children:r(`service.recovery.state.${c}`)})]}),e.jsxs(u,{type:"button",variant:"ghost",size:"sm",disabled:t.isFetching,onClick:()=>void t.refetch(),children:[e.jsx(T,{className:N("h-4 w-4",t.isFetching&&"animate-spin")}),e.jsx("span",{children:r("service.recovery.refreshLog")})]})]}),e.jsxs("div",{className:"grid gap-4 p-4 lg:grid-cols-[minmax(0,0.85fr)_minmax(0,1.15fr)]",children:[e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("p",{className:"text-sm text-text-dim",children:c==="running"?r("service.recovery.detail.running"):c==="booting"?r("service.recovery.detail.booting",{phase:s?.bootPhase??""}):r(c==="stopped"?"service.recovery.detail.stopped":"service.recovery.detail.loading")}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(S,{icon:e.jsx(L,{className:"h-4 w-4"}),label:r("service.recovery.commands.doctor"),command:"agim doctor",onCopy:o}),e.jsx(S,{icon:e.jsx(b,{className:"h-4 w-4"}),label:r("service.recovery.commands.status"),command:"agim status",onCopy:o}),m?e.jsx(S,{icon:e.jsx(b,{className:"h-4 w-4"}),label:r("service.recovery.commands.tail"),command:h,onCopy:o}):e.jsx(ae,{icon:e.jsx(b,{className:"h-4 w-4"}),label:r("service.recovery.commands.tailPending"),detail:t.isLoading?r("service.recovery.commands.tailChecking"):r("service.recovery.commands.tailPendingDetail")})]})]}),e.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-surface-2",children:[e.jsxs("div",{className:"flex items-center gap-2 border-b border-border px-3 py-2",children:[e.jsx(b,{className:"h-4 w-4 text-text-dim"}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:a}),t.data?.truncated&&e.jsx(j,{variant:"warning",children:r("service.recovery.truncated")})]}),t.isLoading?e.jsx("div",{className:"h-40 animate-pulse"}):t.isError?e.jsx("p",{className:"p-3 text-sm text-danger",children:f(t.error,r).message}):t.data?.exists?e.jsx("pre",{className:"max-h-72 overflow-auto whitespace-pre-wrap break-words p-3 font-mono text-[11px] leading-5 text-text-dim",children:t.data.content||r("service.recovery.logEmpty")}):e.jsx("p",{className:"p-3 text-sm text-text-dim",children:r("service.recovery.logMissing")})]})]})]})}function ae({icon:s,label:r,detail:t}){return e.jsxs("div",{className:"flex min-w-0 items-center gap-2 rounded-md border border-border bg-surface-2 px-3 py-2",children:[e.jsx("span",{className:"text-text-dim","aria-hidden":"true",children:s}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-xs font-medium",children:r}),e.jsx("p",{className:"text-[11px] text-text-dim",children:t})]})]})}function S({icon:s,label:r,command:t,onCopy:a}){return e.jsxs("div",{className:"flex min-w-0 items-center gap-2 rounded-md border border-border bg-surface-2 px-3 py-2",children:[e.jsx("span",{className:"text-text-dim","aria-hidden":"true",children:s}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-xs font-medium",children:r}),e.jsx("code",{className:"block truncate text-[11px] text-text-dim",children:t})]}),e.jsx(u,{type:"button",variant:"ghost",size:"sm",onClick:()=>void a(t),"aria-label":r,children:e.jsx(ee,{className:"h-4 w-4"})})]})}function ie(s){return`'${s.replace(/'/g,"'\\''")}'`}function D(s){const r=s.trim();if(!r)return{ok:!0,value:void 0};const t=Number.parseInt(r,10);return!Number.isFinite(t)||t<1||t>65535?{ok:!1}:{ok:!0,value:t}}function ne(){const{t:s}=y(["settings","common"]),r=X(),t=G(),a=r.data,n=a?.webPort,i=a?.acpPort,[c,m]=g.useState(""),[o,h]=g.useState(""),[v,w]=g.useState(0);g.useEffect(()=>{a&&r.dataUpdatedAt!==v&&(m(n!=null?String(n):""),h(i!=null?String(i):""),w(r.dataUpdatedAt))},[a,r.dataUpdatedAt,n,i,v]);const x=D(c),p=D(o),d=!x.ok,C=!p.ok,z=g.useMemo(()=>{if(!a)return!1;const P=x.ok?x.value:void 0,B=p.ok?p.value:void 0;return P!==n||B!==i},[a,x,p,n,i]);function I(){m(n!=null?String(n):""),h(i!=null?String(i):"")}async function _(){if(!(!a||d||C))try{await t.mutateAsync({...a,webPort:x.ok?x.value:void 0,acpPort:p.ok?p.value:void 0}),l.success(s("service.ports.toast.saved"))}catch(P){l.error(f(P,s).message)}}return r.isLoading?e.jsx("div",{className:"h-32 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(Y,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:s("service.ports.title")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:s("service.ports.subtitle")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 px-4 py-3 sm:grid-cols-2",children:[e.jsx(E,{id:"web-port",label:s("service.ports.webPort"),hint:s("service.ports.webPortHint",{default:A}),value:c,onChange:m,invalid:d,placeholder:String(A)}),a?.features?.remoteAgent?e.jsx(E,{id:"acp-port",label:s("service.ports.acpPort"),hint:s("service.ports.acpPortHint",{default:F}),value:o,onChange:h,invalid:C,placeholder:String(F)}):null]}),z&&e.jsxs("div",{className:"flex items-center gap-2 border-t border-border px-4 py-3",children:[e.jsx(j,{variant:"warning",children:s("service.ports.restartRequired")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:I,disabled:t.isPending,children:[e.jsx(q,{className:"h-4 w-4"}),s("service.ports.discard")]}),e.jsxs(u,{size:"sm",onClick:()=>void _(),disabled:t.isPending||d||C,children:[t.isPending?e.jsx(k,{className:"h-4 w-4 animate-spin"}):e.jsx(Z,{className:"h-4 w-4"}),t.isPending?s("service.ports.saving"):s("service.ports.save")]})]})]})}function E({id:s,label:r,hint:t,value:a,onChange:n,invalid:i,placeholder:c}){const{t:m}=y("settings");return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(M,{htmlFor:s,className:"text-xs font-medium",children:r}),e.jsx(W,{id:s,type:"number",inputMode:"numeric",min:1,max:65535,value:a,onChange:o=>n(o.target.value),placeholder:c,"aria-invalid":i,className:N("font-mono",i&&"border-danger focus:ring-danger")}),e.jsx("p",{className:N("text-[11px]",i?"text-danger":"text-text-dim"),children:i?m("service.ports.invalidPort"):t})]})}export{be as default};
|
|
7
|
+
//# sourceMappingURL=service-gWZa3sup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-gWZa3sup.js","sources":["../../node_modules/lucide-react/dist/esm/icons/square.js","../../src/routes/settings/service.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 Square = createLucideIcon(\"Square\", [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }]\n]);\n\nexport { Square as default };\n//# sourceMappingURL=square.js.map\n","/**\n * /settings/service — operator-facing process control: see the\n * running agim daemon's mode/pid/uptime + start, stop, or restart it.\n *\n * R8 (this round) added a dedicated \"Ports\" card at the top covering\n * webPort + acpPort. They live in `~/.agim/config.json` (PUT /api/config),\n * and take effect on the next service restart — handled by the\n * Start/Restart buttons immediately below.\n *\n * Stop and restart go through ConfirmDialog because they\n * permanently interrupt every messenger adapter + in-flight job;\n * Start is one-click since it's safe to invoke even when already\n * running (backend short-circuits to alreadyRunning:true).\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n Copy, FileText, Loader2, Network, Play, RefreshCcw, RotateCcw, Save, Square, Terminal, X,\n} from 'lucide-react'\n\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\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 useConfig,\n useServiceLogTail,\n useRestartService,\n useServiceStatus,\n useStartService,\n useStopService,\n useUpdateConfig,\n} from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport type { ServiceMode, ServiceStatus } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst MODE_VARIANT: Record<ServiceMode, 'success' | 'info' | 'warning' | 'default'> = {\n systemd: 'success',\n background: 'info',\n foreground: 'warning',\n none: 'default',\n}\n\nconst DEFAULT_WEB_PORT = 3000\nconst DEFAULT_ACP_PORT = 9090\n\nexport default function SettingsServiceRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const status = useServiceStatus()\n const data = status.data\n const isRunning = data && data.mode !== 'none'\n\n const start = useStartService()\n const stop = useStopService()\n const restart = useRestartService()\n\n const [confirmStop, setConfirmStop] = useState(false)\n const [confirmRestart, setConfirmRestart] = useState(false)\n\n async function onStart(): Promise<void> {\n try {\n await start.mutateAsync()\n toast.success(t('service.toast.started'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n async function onConfirmStop(): Promise<void> {\n try {\n await stop.mutateAsync()\n toast.success(t('service.toast.stopped'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n throw err\n }\n }\n async function onConfirmRestart(): Promise<void> {\n try {\n await restart.mutateAsync()\n toast.success(t('service.toast.restarted'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n throw err\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-3xl 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('service.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => status.refetch()}\n disabled={status.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {status.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('service.subtitle')}</p>\n </header>\n\n <PortsCard />\n\n {status.isLoading ? (\n <div className=\"h-48 rounded-md bg-surface-2 animate-pulse\" />\n ) : data ? (\n <div className=\"rounded-md border border-border bg-surface p-4\">\n <dl className=\"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 text-sm\">\n <dt className=\"text-text-dim\">{t('service.modeLabel')}</dt>\n <dd>\n <Badge variant={MODE_VARIANT[data.mode]}>\n {t(`service.mode.${data.mode}`)}\n </Badge>\n </dd>\n {data.pid != null && (\n <>\n <dt className=\"text-text-dim\">{t('service.pidLabel')}</dt>\n <dd className=\"tabular-nums font-mono\">{data.pid}</dd>\n </>\n )}\n {data.uptime && (\n <>\n <dt className=\"text-text-dim\">{t('service.uptimeLabel')}</dt>\n <dd className=\"tabular-nums\">{data.uptime}</dd>\n </>\n )}\n {data.web && (\n <>\n <dt className=\"text-text-dim\">{t('service.webLabel')}</dt>\n <dd className=\"font-mono text-xs\">{data.web.bind}:{data.web.port}</dd>\n </>\n )}\n <dt className=\"text-text-dim\">{t('service.bootPhaseLabel')}</dt>\n <dd>\n <code className=\"rounded bg-surface-2 px-1.5 py-0.5 text-xs\">{data.bootPhase}</code>\n </dd>\n </dl>\n\n {/* Action buttons */}\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isRunning || start.isPending}\n onClick={() => void onStart()}\n >\n {start.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Play className=\"h-4 w-4\" />}\n {t('service.actions.start')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={!isRunning || restart.isPending}\n onClick={() => setConfirmRestart(true)}\n >\n <RotateCcw className={cn('h-4 w-4', restart.isPending && 'animate-spin')} />\n {t('service.actions.restart')}\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n disabled={!isRunning || stop.isPending}\n onClick={() => setConfirmStop(true)}\n >\n <Square className=\"h-4 w-4\" />\n {t('service.actions.stop')}\n </Button>\n </div>\n </div>\n ) : null}\n\n <ServiceRecoveryCard service={data} />\n\n <ConfirmDialog\n open={confirmStop}\n onOpenChange={setConfirmStop}\n title={t('service.actions.confirmStop')}\n description={t('service.actions.confirmStopDesc')}\n intent=\"danger\"\n confirmLabel={t('service.actions.stop')}\n onConfirm={onConfirmStop}\n />\n <ConfirmDialog\n open={confirmRestart}\n onOpenChange={setConfirmRestart}\n title={t('service.actions.confirmRestart')}\n description={t('service.actions.confirmRestartDesc')}\n intent=\"danger\"\n confirmLabel={t('service.actions.restart')}\n onConfirm={onConfirmRestart}\n />\n </div>\n )\n}\n\nfunction ServiceRecoveryCard({ service }: { service?: ServiceStatus }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const logQuery = useServiceLogTail(120)\n const logPath = logQuery.data?.path ?? '~/.agim/agim.log'\n const isRunning = Boolean(service && service.mode !== 'none')\n const isBooting = Boolean(isRunning && service?.bootPhase && service.bootPhase !== 'ready')\n const state = !service ? 'loading' : !isRunning ? 'stopped' : isBooting ? 'booting' : 'running'\n const logExists = logQuery.data?.exists === true\n\n async function copy(text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text)\n toast.success(t('service.recovery.toast.copied'))\n } catch {\n toast.error(t('service.recovery.toast.copyFailed'))\n }\n }\n\n const tailCommand = `tail -n 120 ${shellQuote(logPath)}`\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex flex-col gap-2 border-b border-border px-4 py-3 sm:flex-row sm:items-center\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <Terminal className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('service.recovery.title')}</h2>\n <Badge variant={state === 'running' ? 'success' : state === 'stopped' ? 'warning' : 'info'}>\n {t(`service.recovery.state.${state}`)}\n </Badge>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={logQuery.isFetching}\n onClick={() => void logQuery.refetch()}\n >\n <RefreshCcw className={cn('h-4 w-4', logQuery.isFetching && 'animate-spin')} />\n <span>{t('service.recovery.refreshLog')}</span>\n </Button>\n </header>\n\n <div className=\"grid gap-4 p-4 lg:grid-cols-[minmax(0,0.85fr)_minmax(0,1.15fr)]\">\n <div className=\"flex flex-col gap-3\">\n <p className=\"text-sm text-text-dim\">\n {state === 'running'\n ? t('service.recovery.detail.running')\n : state === 'booting'\n ? t('service.recovery.detail.booting', { phase: service?.bootPhase ?? '' })\n : state === 'stopped'\n ? t('service.recovery.detail.stopped')\n : t('service.recovery.detail.loading')}\n </p>\n\n <div className=\"grid gap-2\">\n <RecoveryCommand\n icon={<Terminal className=\"h-4 w-4\" />}\n label={t('service.recovery.commands.doctor')}\n command=\"agim doctor\"\n onCopy={copy}\n />\n <RecoveryCommand\n icon={<FileText className=\"h-4 w-4\" />}\n label={t('service.recovery.commands.status')}\n command=\"agim status\"\n onCopy={copy}\n />\n {logExists ? (\n <RecoveryCommand\n icon={<FileText className=\"h-4 w-4\" />}\n label={t('service.recovery.commands.tail')}\n command={tailCommand}\n onCopy={copy}\n />\n ) : (\n <RecoveryInfo\n icon={<FileText className=\"h-4 w-4\" />}\n label={t('service.recovery.commands.tailPending')}\n detail={logQuery.isLoading\n ? t('service.recovery.commands.tailChecking')\n : t('service.recovery.commands.tailPendingDetail')}\n />\n )}\n </div>\n </div>\n\n <div className=\"min-w-0 rounded-md border border-border bg-surface-2\">\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <FileText className=\"h-4 w-4 text-text-dim\" />\n <span className=\"min-w-0 flex-1 truncate text-xs font-medium\">{logPath}</span>\n {logQuery.data?.truncated && (\n <Badge variant=\"warning\">{t('service.recovery.truncated')}</Badge>\n )}\n </div>\n {logQuery.isLoading ? (\n <div className=\"h-40 animate-pulse\" />\n ) : logQuery.isError ? (\n <p className=\"p-3 text-sm text-danger\">{describeError(logQuery.error, t).message}</p>\n ) : !logQuery.data?.exists ? (\n <p className=\"p-3 text-sm text-text-dim\">{t('service.recovery.logMissing')}</p>\n ) : (\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap break-words p-3 font-mono text-[11px] leading-5 text-text-dim\">\n {logQuery.data.content || t('service.recovery.logEmpty')}\n </pre>\n )}\n </div>\n </div>\n </section>\n )\n}\n\nfunction RecoveryInfo({\n icon,\n label,\n detail,\n}: {\n icon: JSX.Element\n label: string\n detail: string\n}): JSX.Element {\n return (\n <div className=\"flex min-w-0 items-center gap-2 rounded-md border border-border bg-surface-2 px-3 py-2\">\n <span className=\"text-text-dim\" aria-hidden=\"true\">{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium\">{label}</div>\n <p className=\"text-[11px] text-text-dim\">{detail}</p>\n </div>\n </div>\n )\n}\n\nfunction RecoveryCommand({\n icon,\n label,\n command,\n onCopy,\n}: {\n icon: JSX.Element\n label: string\n command: string\n onCopy: (text: string) => Promise<void>\n}): JSX.Element {\n return (\n <div className=\"flex min-w-0 items-center gap-2 rounded-md border border-border bg-surface-2 px-3 py-2\">\n <span className=\"text-text-dim\" aria-hidden=\"true\">{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium\">{label}</div>\n <code className=\"block truncate text-[11px] text-text-dim\">{command}</code>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void onCopy(command)}\n aria-label={label}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </div>\n )\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`\n}\n\n/* ─────────────── Ports card (webPort + acpPort) ─────────────── */\n\n/** Validate a port string. Empty = \"use the default\", which we\n * represent on the wire as `undefined` (omitted field). Non-empty\n * must parse to 1..65535. */\nfunction parsePort(s: string): { ok: true; value: number | undefined } | { ok: false } {\n const trimmed = s.trim()\n if (!trimmed) return { ok: true, value: undefined }\n const n = Number.parseInt(trimmed, 10)\n if (!Number.isFinite(n) || n < 1 || n > 65535) return { ok: false }\n return { ok: true, value: n }\n}\n\nfunction PortsCard(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const cfgQuery = useConfig()\n const updateCfg = useUpdateConfig()\n\n const cfg = cfgQuery.data\n const currentWeb = cfg?.webPort\n const currentAcp = cfg?.acpPort\n\n const [webDraft, setWebDraft] = useState<string>('')\n const [acpDraft, setAcpDraft] = useState<string>('')\n // Tracks the cfg snapshot we last synced from, so post-save refetch\n // re-hydrates the drafts cleanly (and so local edits don't get\n // clobbered by background refetches).\n const [syncedAt, setSyncedAt] = useState<number>(0)\n\n useEffect(() => {\n if (!cfg) return\n if (cfgQuery.dataUpdatedAt === syncedAt) return\n setWebDraft(currentWeb != null ? String(currentWeb) : '')\n setAcpDraft(currentAcp != null ? String(currentAcp) : '')\n setSyncedAt(cfgQuery.dataUpdatedAt)\n }, [cfg, cfgQuery.dataUpdatedAt, currentWeb, currentAcp, syncedAt])\n\n const webParsed = parsePort(webDraft)\n const acpParsed = parsePort(acpDraft)\n const webInvalid = !webParsed.ok\n const acpInvalid = !acpParsed.ok\n\n const isDirty = useMemo(() => {\n if (!cfg) return false\n const nextWeb = webParsed.ok ? webParsed.value : undefined\n const nextAcp = acpParsed.ok ? acpParsed.value : undefined\n return nextWeb !== currentWeb || nextAcp !== currentAcp\n }, [cfg, webParsed, acpParsed, currentWeb, currentAcp])\n\n function onDiscard(): void {\n setWebDraft(currentWeb != null ? String(currentWeb) : '')\n setAcpDraft(currentAcp != null ? String(currentAcp) : '')\n }\n\n async function onSave(): Promise<void> {\n if (!cfg || webInvalid || acpInvalid) return\n try {\n await updateCfg.mutateAsync({\n ...cfg,\n webPort: webParsed.ok ? webParsed.value : undefined,\n acpPort: acpParsed.ok ? acpParsed.value : undefined,\n })\n toast.success(t('service.ports.toast.saved'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n if (cfgQuery.isLoading) {\n return <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <Network className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('service.ports.title')}</h2>\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('service.ports.subtitle')}</p>\n\n <div className=\"grid grid-cols-1 gap-3 px-4 py-3 sm:grid-cols-2\">\n <PortField\n id=\"web-port\"\n label={t('service.ports.webPort')}\n hint={t('service.ports.webPortHint', { default: DEFAULT_WEB_PORT })}\n value={webDraft}\n onChange={setWebDraft}\n invalid={webInvalid}\n placeholder={String(DEFAULT_WEB_PORT)}\n />\n {/* R15 — acpPort hidden when remote-agent feature is off (same\n gate as the ACP card in /settings/agents). Server already\n strips acpPort from GET /api/config and drops it from\n incoming PUT in the off state. */}\n {cfg?.features?.remoteAgent ? (\n <PortField\n id=\"acp-port\"\n label={t('service.ports.acpPort')}\n hint={t('service.ports.acpPortHint', { default: DEFAULT_ACP_PORT })}\n value={acpDraft}\n onChange={setAcpDraft}\n invalid={acpInvalid}\n placeholder={String(DEFAULT_ACP_PORT)}\n />\n ) : null}\n </div>\n\n {isDirty && (\n <div className=\"flex items-center gap-2 border-t border-border px-4 py-3\">\n <Badge variant=\"warning\">{t('service.ports.restartRequired')}</Badge>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={onDiscard}\n disabled={updateCfg.isPending}\n >\n <X className=\"h-4 w-4\" />\n {t('service.ports.discard')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateCfg.isPending || webInvalid || acpInvalid}\n >\n {updateCfg.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Save className=\"h-4 w-4\" />}\n {updateCfg.isPending ? t('service.ports.saving') : t('service.ports.save')}\n </Button>\n </div>\n )}\n </section>\n )\n}\n\ninterface PortFieldProps {\n id: string\n label: string\n hint: string\n value: string\n onChange: (v: string) => void\n invalid: boolean\n placeholder: string\n}\n\nfunction PortField({\n id, label, hint, value, onChange, invalid, placeholder,\n}: PortFieldProps): JSX.Element {\n const { t } = useTranslation('settings')\n return (\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={id} className=\"text-xs font-medium\">{label}</Label>\n <Input\n id={id}\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n max={65535}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n aria-invalid={invalid}\n className={cn('font-mono', invalid && 'border-danger focus:ring-danger')}\n />\n <p className={cn('text-[11px]', invalid ? 'text-danger' : 'text-text-dim')}>\n {invalid ? t('service.ports.invalidPort') : hint}\n </p>\n </div>\n )\n}\n"],"names":["Square","createLucideIcon","MODE_VARIANT","DEFAULT_WEB_PORT","DEFAULT_ACP_PORT","SettingsServiceRoute","t","useTranslation","status","useServiceStatus","data","isRunning","start","useStartService","stop","useStopService","restart","useRestartService","confirmStop","setConfirmStop","useState","confirmRestart","setConfirmRestart","onStart","toast","err","describeError","onConfirmStop","onConfirmRestart","jsxs","jsx","Button","Loader2","RefreshCcw","PortsCard","Badge","Fragment","Play","RotateCcw","cn","ServiceRecoveryCard","ConfirmDialog","service","logQuery","useServiceLogTail","logPath","isBooting","state","logExists","copy","text","tailCommand","shellQuote","Terminal","RecoveryCommand","FileText","RecoveryInfo","icon","label","detail","command","onCopy","Copy","value","parsePort","trimmed","n","cfgQuery","useConfig","updateCfg","useUpdateConfig","cfg","currentWeb","currentAcp","webDraft","setWebDraft","acpDraft","setAcpDraft","syncedAt","setSyncedAt","useEffect","webParsed","acpParsed","webInvalid","acpInvalid","isDirty","useMemo","nextWeb","nextAcp","onDiscard","onSave","Network","PortField","X","Save","id","hint","onChange","invalid","placeholder","Label","Input","e"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{h as e}from"./index-DCfdN5R7.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const t=e("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);export{t as S};
|
|
7
|
-
//# sourceMappingURL=shield-alert-
|
|
7
|
+
//# sourceMappingURL=shield-alert-DOKK9EnJ.js.map
|
package/dist/web/public/assets/{shield-alert-DXGk9Rak.js.map → shield-alert-DOKK9EnJ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shield-alert-
|
|
1
|
+
{"version":3,"file":"shield-alert-DOKK9EnJ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/shield-alert.js"],"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 ShieldAlert = createLucideIcon(\"ShieldAlert\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"M12 8v4\", key: \"1got3b\" }],\n [\"path\", { d: \"M12 16h.01\", key: \"1drbdi\" }]\n]);\n\nexport { ShieldAlert as default };\n//# sourceMappingURL=shield-alert.js.map\n"],"names":["ShieldAlert","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CACE,OACA,CACE,EAAG,qKACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{h as a}from"./index-DCfdN5R7.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 p=a("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);export{p as S};
|
|
7
|
+
//# sourceMappingURL=sparkles-G0QIs9nP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparkles-G0QIs9nP.js","sources":["../../node_modules/lucide-react/dist/esm/icons/sparkles.js"],"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 Sparkles = createLucideIcon(\"Sparkles\", [\n [\n \"path\",\n {\n d: \"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\",\n key: \"4pj2yx\"\n }\n ],\n [\"path\", { d: \"M20 3v4\", key: \"1olli1\" }],\n [\"path\", { d: \"M22 5h-4\", key: \"1gvqau\" }],\n [\"path\", { d: \"M4 17v2\", key: \"vumght\" }],\n [\"path\", { d: \"M5 18H3\", key: \"zchphs\" }]\n]);\n\nexport { Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n"],"names":["Sparkles","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CACE,OACA,CACE,EAAG,8PACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,CAC1C,CAAC","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as L,a as z,b as Q,j as e,M as S,B as C,P as E,d as k,e as c,L as g,f as A,C as T,g as _}from"./index-DCfdN5R7.js";import{u as D,a as M}from"./use-settings-DGIjmUX0.js";import{u as P}from"./use-workspace-CuytyHwb.js";import{R as q}from"./refresh-ccw-DlAd-eTQ.js";import{S as G}from"./server-Dg4e8pvm.js";import{A as F}from"./arrow-right-A889Wof8.js";import{L as $}from"./loader-circle-DDdmcH0k.js";import"./react-DlP5eolq.js";const H={done:"success",todo:"outline",warn:"warning",loading:"info"};function ee(){const{t:s}=L("settings"),t=D(),a=M(),r=P(),l=z(),d=t.data,i=d?.defaultAgent||d?.agents?.[0]||"",m=i?Q(i):s("start.unknown"),o=i?r.data?.[i]:void 0,R=t.isLoading||r.isLoading,x=a.data,h=!!(x&&x.mode!=="none"),f=(l.data?.backends??[]).filter(n=>n.secret.source!=="none"),u=f.length>0,p=d?.messengers??[],j=p.length>0,w=a.isLoading?"loading":h?"done":"warn",b=R?"loading":o===!0?"done":o===!1?"warn":i?"todo":"warn",N=l.isLoading?"loading":u?"done":"todo",v=t.isLoading?"loading":j?"done":"todo",y=[w,b,v,N].filter(n=>n==="done").length,B=[{id:"web",state:w,icon:e.jsx(S,{}),title:s("start.steps.web.title"),detail:h?s("start.steps.web.ready",{mode:x?.mode??""}):s("start.steps.web.needsStart"),action:s("start.steps.web.action"),to:"/?welcome=1"},{id:"agent",state:b,icon:e.jsx(C,{}),title:s("start.steps.agent.title"),detail:o===!0?s("start.steps.agent.ready",{agent:m}):o===!1?s("start.steps.agent.offline",{agent:m}):i?s("start.steps.agent.selected",{agent:m}):s("start.steps.agent.empty"),action:s("start.steps.agent.action"),to:"/settings/agents"},{id:"llm",state:N,icon:e.jsx(C,{}),title:s("start.steps.llm.title"),detail:u?s("start.steps.llm.ready",{count:f.length}):s("start.steps.llm.empty"),action:s("start.steps.llm.action"),to:"/settings/llm"},{id:"im",state:v,icon:e.jsx(E,{}),title:s("start.steps.im.title"),detail:j?s("start.steps.im.ready",{platforms:p.map(n=>J(n,s)).join(", ")}):s("start.steps.im.empty"),action:s("start.steps.im.action"),to:"/settings/messengers"}];return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-3 border-b border-border pb-4 sm:flex-row sm:items-end",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("start.title")}),e.jsxs(k,{variant:y>=3?"success":"info",children:[y,"/4"]})]}),e.jsx("p",{className:"mt-1 max-w-2xl text-sm text-text-dim",children:s("start.subtitle")})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(c,{asChild:!0,size:"sm",children:e.jsxs(g,{to:"/?welcome=1",children:[e.jsx(S,{className:"h-4 w-4"}),e.jsx("span",{children:s("start.actions.chat")})]})}),e.jsxs(c,{type:"button",variant:"ghost",size:"sm",disabled:t.isFetching||a.isFetching||r.isFetching||l.isFetching,onClick:()=>{t.refetch(),a.refetch(),r.refetch(),l.refetch()},children:[e.jsx(q,{className:A("h-4 w-4",(t.isFetching||a.isFetching||r.isFetching||l.isFetching)&&"animate-spin")}),e.jsx("span",{children:s("start.actions.refresh")})]})]})]}),e.jsx("section",{className:"grid gap-3 sm:grid-cols-2",children:B.map(n=>e.jsx(I,{step:n},n.id))}),e.jsx("section",{className:"rounded-md border border-border bg-surface p-4",children:e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center",children:[e.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-surface-2 text-text-dim",children:e.jsx(G,{className:"h-4 w-4"})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{className:"text-sm font-semibold",children:s("start.deploy.title")}),e.jsx("p",{className:"mt-1 text-sm text-text-dim",children:s("start.deploy.detail")})]}),e.jsx(c,{asChild:!0,variant:"secondary",size:"sm",children:e.jsxs(g,{to:"/settings/service",children:[e.jsx("span",{children:s("start.deploy.action")}),e.jsx(F,{className:"h-4 w-4"})]})})]})})]})}function I({step:s}){const{t}=L("settings"),a=s.state==="done";return e.jsx("article",{className:"rounded-md border border-border bg-surface p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("span",{className:A("flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-surface-2",s.state==="done"&&"text-success",s.state==="warn"&&"text-warning",s.state==="todo"&&"text-text-dim",s.state==="loading"&&"text-info","[&_svg]:h-4 [&_svg]:w-4"),"aria-hidden":"true",children:s.state==="done"?e.jsx(T,{}):s.state==="warn"?e.jsx(_,{}):s.state==="loading"?e.jsx($,{className:"animate-spin"}):s.icon}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold",children:s.title}),e.jsx(k,{variant:H[s.state],children:t(`start.state.${s.state}`)})]}),e.jsx("p",{className:"mt-1 text-sm text-text-dim",children:s.detail}),e.jsx(c,{asChild:!0,variant:a?"ghost":"secondary",size:"sm",className:"mt-3",children:e.jsxs(g,{to:s.to,children:[e.jsx("span",{children:s.action}),e.jsx(F,{className:"h-4 w-4"})]})})]})]})})}function J(s,t){return{"wechat-ilink":t("messengers.platform.wechat"),telegram:t("messengers.platform.telegram"),feishu:t("messengers.platform.feishu"),dingtalk:t("messengers.platform.dingtalk"),discord:t("messengers.platform.discord"),email:t("tabs.email")}[s]??s}export{ee as default};
|
|
2
|
+
//# sourceMappingURL=start-D-abhl3q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-D-abhl3q.js","sources":["../../src/routes/settings/start.tsx"],"sourcesContent":["/**\n * /settings/start — low-friction setup runway.\n *\n * This page does not replace the detailed settings pages. It gives new\n * operators a small number of visible next steps, each linking to the\n * existing page that owns the actual configuration.\n */\n\nimport { Link } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport {\n AlertCircle,\n ArrowRight,\n Bot,\n CheckCircle2,\n Loader2,\n MessageSquare,\n Plug,\n RefreshCcw,\n Server,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { useLlmList } from '@/hooks/use-llm-admin'\nimport { useConfig, useServiceStatus } from '@/hooks/use-settings'\nimport { useAgentsStatus } from '@/hooks/use-workspace'\nimport { agentDisplayName } from '@/lib/agent-label'\nimport { cn } from '@/lib/utils'\n\ntype StepState = 'done' | 'todo' | 'warn' | 'loading'\n\ninterface SetupStep {\n id: string\n state: StepState\n icon: JSX.Element\n title: string\n detail: string\n action: string\n to: string\n}\n\nconst STATE_BADGE: Record<StepState, 'success' | 'warning' | 'info' | 'outline'> = {\n done: 'success',\n todo: 'outline',\n warn: 'warning',\n loading: 'info',\n}\n\nexport default function SettingsStartRoute(): JSX.Element {\n const { t } = useTranslation('settings')\n const cfgQuery = useConfig()\n const serviceQuery = useServiceStatus()\n const agentsQuery = useAgentsStatus()\n const llmQuery = useLlmList()\n\n const cfg = cfgQuery.data\n const defaultAgent = cfg?.defaultAgent || cfg?.agents?.[0] || ''\n const agentName = defaultAgent ? agentDisplayName(defaultAgent) : t('start.unknown')\n const agentStatus = defaultAgent ? agentsQuery.data?.[defaultAgent] : undefined\n const agentLoading = cfgQuery.isLoading || agentsQuery.isLoading\n const service = serviceQuery.data\n const serviceRunning = Boolean(service && service.mode !== 'none')\n const usableBackends = (llmQuery.data?.backends ?? []).filter((b) => b.secret.source !== 'none')\n const llmReady = usableBackends.length > 0\n const messengers = cfg?.messengers ?? []\n const imReady = messengers.length > 0\n\n const webState: StepState = serviceQuery.isLoading ? 'loading' : serviceRunning ? 'done' : 'warn'\n const agentState: StepState = agentLoading\n ? 'loading'\n : agentStatus === true\n ? 'done'\n : agentStatus === false\n ? 'warn'\n : defaultAgent\n ? 'todo'\n : 'warn'\n const llmState: StepState = llmQuery.isLoading ? 'loading' : llmReady ? 'done' : 'todo'\n const imState: StepState = cfgQuery.isLoading ? 'loading' : imReady ? 'done' : 'todo'\n\n const doneCount = [webState, agentState, imState, llmState].filter((s) => s === 'done').length\n const steps: SetupStep[] = [\n {\n id: 'web',\n state: webState,\n icon: <MessageSquare />,\n title: t('start.steps.web.title'),\n detail: serviceRunning\n ? t('start.steps.web.ready', { mode: service?.mode ?? '' })\n : t('start.steps.web.needsStart'),\n action: t('start.steps.web.action'),\n to: '/?welcome=1',\n },\n {\n id: 'agent',\n state: agentState,\n icon: <Bot />,\n title: t('start.steps.agent.title'),\n detail: agentStatus === true\n ? t('start.steps.agent.ready', { agent: agentName })\n : agentStatus === false\n ? t('start.steps.agent.offline', { agent: agentName })\n : defaultAgent\n ? t('start.steps.agent.selected', { agent: agentName })\n : t('start.steps.agent.empty'),\n action: t('start.steps.agent.action'),\n to: '/settings/agents',\n },\n {\n id: 'llm',\n state: llmState,\n icon: <Bot />,\n title: t('start.steps.llm.title'),\n detail: llmReady\n ? t('start.steps.llm.ready', { count: usableBackends.length })\n : t('start.steps.llm.empty'),\n action: t('start.steps.llm.action'),\n to: '/settings/llm',\n },\n {\n id: 'im',\n state: imState,\n icon: <Plug />,\n title: t('start.steps.im.title'),\n detail: imReady\n ? t('start.steps.im.ready', { platforms: messengers.map((m) => platformLabel(m, t)).join(', ') })\n : t('start.steps.im.empty'),\n action: t('start.steps.im.action'),\n to: '/settings/messengers',\n },\n ]\n\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-4\">\n <header className=\"flex flex-col gap-3 border-b border-border pb-4 sm:flex-row sm:items-end\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-xl font-semibold\">{t('start.title')}</h1>\n <Badge variant={doneCount >= 3 ? 'success' : 'info'}>{doneCount}/4</Badge>\n </div>\n <p className=\"mt-1 max-w-2xl text-sm text-text-dim\">{t('start.subtitle')}</p>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button asChild size=\"sm\">\n <Link to=\"/?welcome=1\">\n <MessageSquare className=\"h-4 w-4\" />\n <span>{t('start.actions.chat')}</span>\n </Link>\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={cfgQuery.isFetching || serviceQuery.isFetching || agentsQuery.isFetching || llmQuery.isFetching}\n onClick={() => {\n void cfgQuery.refetch()\n void serviceQuery.refetch()\n void agentsQuery.refetch()\n void llmQuery.refetch()\n }}\n >\n <RefreshCcw\n className={cn(\n 'h-4 w-4',\n (cfgQuery.isFetching || serviceQuery.isFetching || agentsQuery.isFetching || llmQuery.isFetching)\n && 'animate-spin',\n )}\n />\n <span>{t('start.actions.refresh')}</span>\n </Button>\n </div>\n </header>\n\n <section className=\"grid gap-3 sm:grid-cols-2\">\n {steps.map((step) => (\n <SetupStepCard key={step.id} step={step} />\n ))}\n </section>\n\n <section className=\"rounded-md border border-border bg-surface p-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-surface-2 text-text-dim\">\n <Server className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"text-sm font-semibold\">{t('start.deploy.title')}</h2>\n <p className=\"mt-1 text-sm text-text-dim\">{t('start.deploy.detail')}</p>\n </div>\n <Button asChild variant=\"secondary\" size=\"sm\">\n <Link to=\"/settings/service\">\n <span>{t('start.deploy.action')}</span>\n <ArrowRight className=\"h-4 w-4\" />\n </Link>\n </Button>\n </div>\n </section>\n </div>\n )\n}\n\nfunction SetupStepCard({ step }: { step: SetupStep }): JSX.Element {\n const { t } = useTranslation('settings')\n const done = step.state === 'done'\n return (\n <article className=\"rounded-md border border-border bg-surface p-4\">\n <div className=\"flex items-start gap-3\">\n <span\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-surface-2',\n step.state === 'done' && 'text-success',\n step.state === 'warn' && 'text-warning',\n step.state === 'todo' && 'text-text-dim',\n step.state === 'loading' && 'text-info',\n '[&_svg]:h-4 [&_svg]:w-4',\n )}\n aria-hidden=\"true\"\n >\n {step.state === 'done'\n ? <CheckCircle2 />\n : step.state === 'warn'\n ? <AlertCircle />\n : step.state === 'loading'\n ? <Loader2 className=\"animate-spin\" />\n : step.icon}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-sm font-semibold\">{step.title}</h2>\n <Badge variant={STATE_BADGE[step.state]}>{t(`start.state.${step.state}`)}</Badge>\n </div>\n <p className=\"mt-1 text-sm text-text-dim\">{step.detail}</p>\n <Button asChild variant={done ? 'ghost' : 'secondary'} size=\"sm\" className=\"mt-3\">\n <Link to={step.to}>\n <span>{step.action}</span>\n <ArrowRight className=\"h-4 w-4\" />\n </Link>\n </Button>\n </div>\n </div>\n </article>\n )\n}\n\nfunction platformLabel(id: string, t: ReturnType<typeof useTranslation>['t']): string {\n const labels: Record<string, string> = {\n 'wechat-ilink': t('messengers.platform.wechat'),\n telegram: t('messengers.platform.telegram'),\n feishu: t('messengers.platform.feishu'),\n dingtalk: t('messengers.platform.dingtalk'),\n discord: t('messengers.platform.discord'),\n email: t('tabs.email'),\n }\n return labels[id] ?? id\n}\n"],"names":["STATE_BADGE","SettingsStartRoute","t","useTranslation","cfgQuery","useConfig","serviceQuery","useServiceStatus","agentsQuery","useAgentsStatus","llmQuery","useLlmList","cfg","defaultAgent","agentName","agentDisplayName","agentStatus","agentLoading","service","serviceRunning","usableBackends","b","llmReady","messengers","imReady","webState","agentState","llmState","imState","doneCount","s","steps","MessageSquare","Bot","Plug","m","platformLabel","jsxs","jsx","Badge","Button","Link","RefreshCcw","cn","step","SetupStepCard","Server","ArrowRight","done","CheckCircle2","AlertCircle","Loader2","id"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as r,
|
|
2
|
-
//# sourceMappingURL=status-badge-
|
|
1
|
+
import{j as r,d as c}from"./index-DCfdN5R7.js";const i={succeeded:"success",completed:"success",done:"success",approved:"success",allowed:"success",delivered:"success",active:"success",running:"info",in_progress:"info",pending:"info",queued:"info",scheduled:"info",open:"info",paused:"warning",awaiting:"warning",timeout:"warning",expired:"warning",failed:"danger",error:"danger",denied:"danger",rejected:"danger",cancelled:"danger",canceled:"danger",finished:"default",closed:"default",archived:"default"};function o({status:e,variant:n,children:d,...s}){const a=n??i[e.toLowerCase()]??"default";return r.jsx(c,{variant:a,...s,children:d??e})}o.displayName="StatusBadge";export{o as S};
|
|
2
|
+
//# sourceMappingURL=status-badge-CyLdpsXq.js.map
|
package/dist/web/public/assets/{status-badge-D0nbFSom.js.map → status-badge-CyLdpsXq.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-badge-
|
|
1
|
+
{"version":3,"file":"status-badge-CyLdpsXq.js","sources":["../../src/components/common/status-badge.tsx"],"sourcesContent":["/**\n * StatusBadge — domain status string → Badge variant + label.\n *\n * Single source of truth for the color mapping across the 4 M2 pages\n * (jobs / approvals / reminders / memos) plus the M3 observability\n * page. Without this every page would invent its own (job status\n * \"running\" mapped to \"warning\" on tasks.html, \"info\" on approvals.\n * html, \"secondary\" on observability — the kind of drift the v2\n * rewrite is supposed to eliminate).\n *\n * The label slot is intentionally a child rather than a prop: callers\n * pass i18n'd strings via `<StatusBadge status=\"running\">{t('jobs.\n * status.running')}</StatusBadge>` so the badge stays language-aware\n * without needing useTranslation here.\n *\n * Unknown status falls back to `default` variant (neutral gray pill)\n * so a backend that introduces a new state doesn't crash the page.\n */\n\nimport * as React from 'react'\nimport { Badge, type BadgeProps } from '@/components/ui/badge'\n\n/**\n * Status palette shared across domain entities. The mapping is\n * deliberately broad — both \"succeeded\" and \"completed\" land on\n * success; both \"running\" and \"in_progress\" land on info, etc. —\n * because the backend hasn't been canonicalised yet (memory.ts uses\n * one set, jobs.ts another).\n */\nconst STATUS_VARIANT: Record<string, BadgeProps['variant']> = {\n // Success-family\n succeeded: 'success',\n completed: 'success',\n done: 'success',\n approved: 'success',\n allowed: 'success',\n delivered: 'success',\n active: 'success',\n\n // In-flight\n running: 'info',\n in_progress:'info',\n pending: 'info',\n queued: 'info',\n scheduled: 'info',\n open: 'info',\n\n // Warnings (operator may need to look)\n paused: 'warning',\n awaiting: 'warning',\n timeout: 'warning',\n expired: 'warning',\n\n // Failed / errored\n failed: 'danger',\n error: 'danger',\n denied: 'danger',\n rejected: 'danger',\n cancelled: 'danger',\n canceled: 'danger',\n\n // Terminal-neutral\n finished: 'default',\n closed: 'default',\n archived: 'default',\n}\n\nexport interface StatusBadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {\n status: string\n children?: React.ReactNode\n /** Force-override the auto-mapped variant. */\n variant?: BadgeProps['variant']\n}\n\nfunction StatusBadge({\n status,\n variant,\n children,\n ...rest\n}: StatusBadgeProps): JSX.Element {\n const resolved = variant ?? STATUS_VARIANT[status.toLowerCase()] ?? 'default'\n return (\n <Badge variant={resolved} {...rest}>\n {children ?? status}\n </Badge>\n )\n}\nStatusBadge.displayName = 'StatusBadge'\n\nexport { StatusBadge, STATUS_VARIANT }\n"],"names":["STATUS_VARIANT","StatusBadge","status","variant","children","rest","resolved","Badge"],"mappings":"+CA6BA,MAAMA,EAAwD,CAE5D,UAAY,UACZ,UAAY,UACZ,KAAY,UACZ,SAAY,UACZ,QAAY,UACZ,UAAY,UACZ,OAAY,UAGZ,QAAY,OACZ,YAAY,OACZ,QAAY,OACZ,OAAY,OACZ,UAAY,OACZ,KAAY,OAGZ,OAAY,UACZ,SAAY,UACZ,QAAY,UACZ,QAAY,UAGZ,OAAY,SACZ,MAAY,SACZ,OAAY,SACZ,SAAY,SACZ,UAAY,SACZ,SAAY,SAGZ,SAAY,UACZ,OAAY,UACZ,SAAY,SACd,EASA,SAASC,EAAY,CACnB,OAAAC,EACA,QAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EAAkC,CAChC,MAAMC,EAAWH,GAAWH,EAAeE,EAAO,YAAA,CAAa,GAAK,UACpE,aACGK,EAAA,CAAM,QAASD,EAAW,GAAGD,EAC3B,YAAYH,EACf,CAEJ,CACAD,EAAY,YAAc"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{h as g,t as b,r as j,s as k,u as N,i as w,j as s,f as y,e as S,w as v,I as C}from"./index-DCfdN5R7.js";import{r as L}from"./react-DlP5eolq.js";import{D as T}from"./data-table-BkUshOZz.js";import{E as I}from"./empty-state-CuiqdZiB.js";import{S as A}from"./status-badge-CyLdpsXq.js";import{u as D}from"./use-event-stream-I1lMFEfh.js";import{L as M}from"./loader-circle-DDdmcH0k.js";import{R as E}from"./refresh-ccw-DlAd-eTQ.js";import"./table-sCMZBe_Z.js";import"./arrow-up-Dm0U4-6U.js";import"./arrow-down-7i0xwCI2.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const R=g("ListTree",[["path",{d:"M21 12h-8",key:"1bmf0i"}],["path",{d:"M21 6H8",key:"1pqkrb"}],["path",{d:"M21 18h-8",key:"1tm79t"}],["path",{d:"M3 6v4c0 1.1.9 2 2 2h3",key:"1ywdgy"}],["path",{d:"M3 10v6c0 1.1.9 2 2 2h3",key:"2wc746"}]]),
|
|
7
|
-
//# sourceMappingURL=subtasks-
|
|
6
|
+
*/const R=g("ListTree",[["path",{d:"M21 12h-8",key:"1bmf0i"}],["path",{d:"M21 6H8",key:"1pqkrb"}],["path",{d:"M21 18h-8",key:"1tm79t"}],["path",{d:"M3 6v4c0 1.1.9 2 2 2h3",key:"1ywdgy"}],["path",{d:"M3 10v6c0 1.1.9 2 2 2h3",key:"2wc746"}]]),m={all:["subtasks"],list:e=>["subtasks","list",e]};function q(e){return j({queryKey:m.list(e),queryFn:()=>k.listSubtasks(e)})}function F(){const e=b();return()=>e.invalidateQueries({queryKey:m.all})}const $={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function W(){const{t:e}=N(["tasks","common"]),[a,n]=w(),r=F(),i=a.get("agent")??"",{data:d,isLoading:u,isFetching:c,refetch:x}=q(i?{agent:i}:{}),h=d?.subtasks??[],o=D({job:()=>r()});function p(t){const l=new URLSearchParams(a);t?l.set("agent",t):l.delete("agent"),n(l,{replace:!0})}const f=L.useMemo(()=>[{id:"id",header:e("subtasks.col.id"),cell:t=>s.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",t.id]}),headClassName:"w-16"},{id:"agent",header:e("subtasks.col.agent"),cell:t=>s.jsx("span",{className:"font-medium",children:t.agent}),headClassName:"w-32"},{id:"prompt",header:e("subtasks.col.prompt"),cell:t=>s.jsx("span",{className:"line-clamp-2 text-text-dim",children:t.prompt}),asCardTitle:!0},{id:"status",header:e("subtasks.col.status"),cell:t=>s.jsx(A,{status:t.status,children:e(`subtasks.status.${t.status}`,{defaultValue:t.status})}),headClassName:"w-32"},{id:"parent",header:e("subtasks.col.parent"),cell:t=>s.jsxs("span",{className:"text-text-dim",children:[s.jsx("span",{className:"font-medium text-text",children:t.parentAgent}),s.jsx("span",{className:"text-text-muted",children:" / "}),s.jsx("span",{title:t.parentSessionId,children:t.parentSessionId.slice(0,8)})]}),headClassName:"w-40"},{id:"platform",header:e("subtasks.col.platform"),cell:t=>s.jsx("span",{className:"text-text-dim",children:t.platform}),headClassName:"w-28",hideOnMobile:!0},{id:"createdAt",header:e("subtasks.col.createdAt"),cell:t=>s.jsx("span",{className:"text-text-dim",children:K(t.createdAt)}),headClassName:"w-40",hideOnMobile:!0}],[e]);return s.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[s.jsxs("header",{className:"flex flex-col gap-1",children:[s.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[s.jsx("h1",{className:"text-xl font-semibold",children:e("subtasks.title")}),s.jsx("span",{className:y("text-xs font-medium tabular-nums",$[o]),children:e(`jobs.live.${o}`)}),s.jsxs(S,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>x(),disabled:c,"aria-label":e("actions.refresh",{ns:"common"}),children:[c?s.jsx(M,{className:"h-4 w-4 animate-spin"}):s.jsx(E,{className:"h-4 w-4"}),s.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),s.jsx("p",{className:"text-sm text-text-dim",children:e("subtasks.subtitle")})]}),s.jsx("div",{className:"flex flex-wrap items-end gap-2",children:s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsx(v,{htmlFor:"agent-filter",className:"text-xs text-text-dim",children:e("subtasks.filter.agent")}),s.jsx(C,{id:"agent-filter",value:i,onChange:t=>p(t.target.value),placeholder:e("subtasks.filter.agentAny"),className:"w-48"})]})}),s.jsx(T,{columns:f,rows:h,getRowId:t=>`${t.parentSessionId}:${t.id}`,loading:u,emptyState:s.jsx(I,{icon:s.jsx(R,{}),title:e("subtasks.empty.title"),description:e("subtasks.empty.description")})})]})}function K(e){try{const a=new Date(e);if(Number.isNaN(a.getTime()))return e;const n=new Date;return a.toDateString()===n.toDateString()?a.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}):a.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{W as default};
|
|
7
|
+
//# sourceMappingURL=subtasks-BnEjSGUR.js.map
|