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
package/dist/cli.js
CHANGED
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// Agim (阿吉姆) CLI
|
|
2
|
+
// Agim (阿吉姆) CLI.
|
|
3
3
|
//
|
|
4
|
-
// Brand: "Agim" (English) / "阿吉姆" (Chinese).
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// On-disk paths (~/.im-hub/, ~/.im-hub-workspaces/), env vars (IMHUB_*),
|
|
9
|
-
// HTTP headers (X-IM-Hub-Token), and the systemd unit `im-hub.service`
|
|
10
|
-
// keep their legacy "im-hub" identifier for drop-in compatibility with
|
|
11
|
-
// existing installations. Do not "fix" them — millions of bytes of user
|
|
12
|
-
// data + every existing deployment's systemd config depend on those
|
|
13
|
-
// names being stable. The rename is a brand surface only.
|
|
4
|
+
// Brand: "Agim" (English) / "阿吉姆" (Chinese). Public runtime surfaces use
|
|
5
|
+
// the `agim` binary, `~/.agim/` state, `~/.agim-workspaces/` workspaces,
|
|
6
|
+
// `AGIM_*` env vars, `X-Agim-Token` headers, and `agim.service`.
|
|
14
7
|
import { program } from 'commander';
|
|
15
8
|
import { dirname, join } from 'node:path';
|
|
16
9
|
import { fileURLToPath } from 'node:url';
|
|
@@ -21,7 +14,6 @@ import { getDefaultAgent } from './core/live-config.js';
|
|
|
21
14
|
import { sessionManager } from './core/session.js';
|
|
22
15
|
import { runOnThread } from './core/thread-queue.js';
|
|
23
16
|
import { parseMessage, routeMessage } from './core/router.js';
|
|
24
|
-
import { crossSpawn } from './utils/cross-platform.js';
|
|
25
17
|
import { generateTraceId, createLogger, sanitizeUserText, logger as rootLogger } from './core/logger.js';
|
|
26
18
|
import { validateConfig } from './core/config-schema.js';
|
|
27
19
|
import { workspaceRegistry } from './core/workspace.js';
|
|
@@ -35,14 +27,10 @@ import { createReminder } from './core/reminders.js';
|
|
|
35
27
|
import { setReminderConfirmNotifier } from './core/reminder-rpc.js';
|
|
36
28
|
import { sink } from './core/message-sink.js';
|
|
37
29
|
import { createInlineJob, markJobRunning, markJobCompleted, markJobFailed, linkJobOutbox, updateJobAgent, } from './core/job-board.js';
|
|
38
|
-
import { checkMessengerConfig, checkAgentAvailability, runMessengerOnboarding,
|
|
30
|
+
import { checkMessengerConfig, checkAgentAvailability, runMessengerOnboarding, formatMessengerStartError, loadConfig as loadOnboardingConfig, saveConfig as saveOnboardingConfig, } from './core/onboarding.js';
|
|
39
31
|
import { startWebServer } from './web/server.js';
|
|
40
32
|
import { startACPServer } from './core/acp-server.js';
|
|
41
33
|
import { AGIM_HOME } from './core/agim-paths.js';
|
|
42
|
-
// Helper to format agent install hint for missing agents
|
|
43
|
-
function _formatMissingAgentHint(missing) {
|
|
44
|
-
return formatAgentInstallHint(missing);
|
|
45
|
-
}
|
|
46
34
|
const CONFIG_DIR = AGIM_HOME;
|
|
47
35
|
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
48
36
|
const PACKAGE_JSON = join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json');
|
|
@@ -67,10 +55,30 @@ function readPackageVersion() {
|
|
|
67
55
|
program
|
|
68
56
|
.name('agim')
|
|
69
57
|
.description('Universal messenger-to-agent bridge')
|
|
70
|
-
.version(readPackageVersion())
|
|
58
|
+
.version(readPackageVersion())
|
|
59
|
+
.addHelpText('afterAll', `
|
|
60
|
+
Common path:
|
|
61
|
+
agim go First run: choose/configure one agent and start Web
|
|
62
|
+
agim web Find the Web console URL, service state, and token hint
|
|
63
|
+
agim web --open Open the Web console in your default browser
|
|
64
|
+
agim web --start --open
|
|
65
|
+
Start the background service and open Web
|
|
66
|
+
agim config Continue setup: Agent, IM, Web port, admins, SMTP
|
|
67
|
+
agim doctor Explain local readiness problems
|
|
68
|
+
|
|
69
|
+
Service:
|
|
70
|
+
agim start --bg Run Agim in the background
|
|
71
|
+
agim status Show runtime state
|
|
72
|
+
agim restart Restart after config changes
|
|
73
|
+
agim stop Stop the service
|
|
74
|
+
|
|
75
|
+
Advanced:
|
|
76
|
+
agim setup llm|mcp
|
|
77
|
+
agim diag llm|mcp
|
|
78
|
+
`);
|
|
71
79
|
program
|
|
72
80
|
.command('start')
|
|
73
|
-
.description('Start the Agim
|
|
81
|
+
.description('Start the Agim runtime; use --bg for the normal background service')
|
|
74
82
|
.option('--bg, --background', 'Start as a detached background daemon (writes pid file + log to ~/.agim/)')
|
|
75
83
|
.action(async (opts) => {
|
|
76
84
|
// v1.2.85 — load ~/.agim/env into process.env BEFORE any branch
|
|
@@ -197,7 +205,7 @@ program
|
|
|
197
205
|
const inSystemd = typeof process.env.INVOCATION_ID === 'string' && process.env.INVOCATION_ID.length > 0;
|
|
198
206
|
if (!inSystemd) {
|
|
199
207
|
const { existsSync: _exists2 } = await import('node:fs');
|
|
200
|
-
const hasUnit = _exists2('/etc/systemd/system/agim.service')
|
|
208
|
+
const hasUnit = _exists2('/etc/systemd/system/agim.service');
|
|
201
209
|
if (hasUnit) {
|
|
202
210
|
console.warn();
|
|
203
211
|
console.warn('⚠️ agim is starting OUTSIDE systemd, but a systemd unit exists on this host.');
|
|
@@ -268,8 +276,8 @@ program
|
|
|
268
276
|
await sessionManager.start();
|
|
269
277
|
// Start approval-bus before any agent can spawn — failure here is
|
|
270
278
|
// non-fatal: claude-code falls back to legacy --permission-mode dontAsk.
|
|
271
|
-
if (process.env.
|
|
272
|
-
console.log('🛑 Approval bus disabled via
|
|
279
|
+
if (process.env.AGIM_APPROVAL_DISABLED === '1') {
|
|
280
|
+
console.log('🛑 Approval bus disabled via AGIM_APPROVAL_DISABLED=1');
|
|
273
281
|
}
|
|
274
282
|
else {
|
|
275
283
|
try {
|
|
@@ -287,7 +295,7 @@ program
|
|
|
287
295
|
// `env: process.env`) can connect without per-spawn config.
|
|
288
296
|
// claude-code and opencode stdio still set this per-spawn via
|
|
289
297
|
// extraEnv — that override wins inside their spawn scope.
|
|
290
|
-
process.env.
|
|
298
|
+
process.env.AGIM_APPROVAL_SOCK = sockPath;
|
|
291
299
|
}
|
|
292
300
|
catch (err) {
|
|
293
301
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -358,20 +366,6 @@ program
|
|
|
358
366
|
console.warn(`⚠️ ${cliT(bootLang, 'start.workspace_boot_failed', { message: msg })}`);
|
|
359
367
|
console.warn(` ${cliT(bootLang, 'start.workspace_fallback')}`);
|
|
360
368
|
}
|
|
361
|
-
// Register the imhub MCP server in opencode's global config so opencode
|
|
362
|
-
// (stdio mode) can see the reminder tools. Idempotent; quietly skips if
|
|
363
|
-
// opencode isn't installed / no config dir / write fails. HTTP mode
|
|
364
|
-
// can't use this — see ensure-mcp-config.ts comments.
|
|
365
|
-
try {
|
|
366
|
-
const { ensureOpencodeMcpRegistered } = await import('./plugins/agents/opencode/ensure-mcp-config.js');
|
|
367
|
-
const wrote = await ensureOpencodeMcpRegistered();
|
|
368
|
-
if (wrote)
|
|
369
|
-
console.log('🔧 Registered imhub MCP in opencode global config');
|
|
370
|
-
}
|
|
371
|
-
catch (err) {
|
|
372
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
373
|
-
console.warn(`⚠️ opencode MCP registration skipped: ${msg}`);
|
|
374
|
-
}
|
|
375
369
|
// Load ACP (remote) agents from config
|
|
376
370
|
if (config.acpAgents?.length) {
|
|
377
371
|
await registry.loadACPAgents(config.acpAgents);
|
|
@@ -594,7 +588,7 @@ program
|
|
|
594
588
|
}, 'failed to record known IM user; continuing');
|
|
595
589
|
}
|
|
596
590
|
// v1.2.66 — sender allowlist gate. When configured (env
|
|
597
|
-
//
|
|
591
|
+
// AGIM_ALLOWED_USERS set), unknown senders get a short refusal
|
|
598
592
|
// and the message is dropped before reaching any agent or
|
|
599
593
|
// tool. When unconfigured, this passes through unchanged
|
|
600
594
|
// (default-open; boot log warns OPEN_IM_ACCESS).
|
|
@@ -623,7 +617,7 @@ program
|
|
|
623
617
|
event: 'sender.allowlist.denied',
|
|
624
618
|
platform: ctx.platform,
|
|
625
619
|
userId: ctx.message.userId,
|
|
626
|
-
}, 'message dropped — sender not on
|
|
620
|
+
}, 'message dropped — sender not on AGIM_ALLOWED_USERS');
|
|
627
621
|
try {
|
|
628
622
|
await sink.deliver({
|
|
629
623
|
platform: ctx.platform,
|
|
@@ -647,7 +641,7 @@ program
|
|
|
647
641
|
ctx.logger.error({
|
|
648
642
|
event: 'sender.allowlist.error',
|
|
649
643
|
err: err instanceof Error ? err.message : String(err),
|
|
650
|
-
}, 'sender allowlist module failed to load; cannot enforce — review
|
|
644
|
+
}, 'sender allowlist module failed to load; cannot enforce — review AGIM_ALLOWED_USERS');
|
|
651
645
|
}
|
|
652
646
|
// Phase 3 — interrupted-job recovery reply. If the user has a
|
|
653
647
|
// pending "retry / cancel" prompt outstanding on this thread AND
|
|
@@ -712,7 +706,7 @@ program
|
|
|
712
706
|
// the user replies with one of the choice tokens (1 / a / 通过 / …),
|
|
713
707
|
// we resolve the pending Promise the calling agent is awaiting.
|
|
714
708
|
// BEFORE this commit, tryHandleAskReply was defined but never
|
|
715
|
-
// called from anywhere — so an agent's
|
|
709
|
+
// called from anywhere — so an agent's mcp__agim__ask_user call
|
|
716
710
|
// would surface the choice card but the user's typed reply went
|
|
717
711
|
// straight to the agent as a fresh prompt, leaving the ask
|
|
718
712
|
// dangling until the configured timeout. Runs BEFORE the approval
|
|
@@ -909,12 +903,12 @@ program
|
|
|
909
903
|
// started. If we started it earlier, every queued row from a prior run
|
|
910
904
|
// would fail "messenger not registered" on the first tick and bounce
|
|
911
905
|
// into backoff — minor but pointless. Worker is single-threaded and
|
|
912
|
-
// ticks at
|
|
906
|
+
// ticks at AGIM_OUTBOX_TICK_MS (default 1s).
|
|
913
907
|
sink.startWorker();
|
|
914
908
|
console.log('✅ Message-sink worker started');
|
|
915
909
|
// Phase 3 — startup recovery scan. Look at jobs.db for inline rows
|
|
916
910
|
// that got 'interrupted' on the previous shutdown and are still inside
|
|
917
|
-
// the recovery window (default 10 min, env
|
|
911
|
+
// the recovery window (default 10 min, env AGIM_RECOVERY_WINDOW_MS).
|
|
918
912
|
// For each, send a "回 1 重发 / 2 取消" prompt via sink — outbox will
|
|
919
913
|
// hold the notification until the messenger is fully connected. Older
|
|
920
914
|
// interrupted rows transition to 'abandoned' so we don't ask the user
|
|
@@ -976,7 +970,7 @@ program
|
|
|
976
970
|
// v1.5 — long-term memory consolidator. Runs periodically (default
|
|
977
971
|
// every 24h) to refresh persona_profile from accumulated facts using
|
|
978
972
|
// the user's most recently active agent. No-op when
|
|
979
|
-
//
|
|
973
|
+
// AGIM_MEMORY_ENABLED != 1.
|
|
980
974
|
try {
|
|
981
975
|
const { startMemoryConsolidator } = await import('./core/memory-consolidate.js');
|
|
982
976
|
startMemoryConsolidator();
|
|
@@ -986,7 +980,7 @@ program
|
|
|
986
980
|
}
|
|
987
981
|
// P1 — dream distillation. Background pass that batch-extracts the turns
|
|
988
982
|
// buffered on the hot path when the system is idle (or past the staleness
|
|
989
|
-
// floor). No-op when
|
|
983
|
+
// floor). No-op when AGIM_MEMORY_ENABLED != 1.
|
|
990
984
|
try {
|
|
991
985
|
const { startMemoryDistiller } = await import('./core/memory-distiller.js');
|
|
992
986
|
startMemoryDistiller();
|
|
@@ -1306,7 +1300,7 @@ async function handleMessage(ctx, defaultAgent) {
|
|
|
1306
1300
|
// Inline-job tracking id (Phase 2). Declared at function scope so the
|
|
1307
1301
|
// catch block below can mark the row 'failed' on any throw. -1 means
|
|
1308
1302
|
// "not tracked": either the message didn't reach willInvokeAgent, or
|
|
1309
|
-
// createInlineJob fell back to in-memory (DB locked /
|
|
1303
|
+
// createInlineJob fell back to in-memory (DB locked / AGIM_INLINE_JOB_TRACKING=0).
|
|
1310
1304
|
let inlineJobId = -1;
|
|
1311
1305
|
try {
|
|
1312
1306
|
if (messenger.sendTyping) {
|
|
@@ -1386,7 +1380,7 @@ async function handleMessage(ctx, defaultAgent) {
|
|
|
1386
1380
|
// and the Phase 3 startup scan can offer the user a retry. Built-ins
|
|
1387
1381
|
// (status/audit/router) return string immediately and never touch the
|
|
1388
1382
|
// agent — no point tracking them. Inline tracking can be killed wholesale
|
|
1389
|
-
// via env
|
|
1383
|
+
// via env AGIM_INLINE_JOB_TRACKING=0 (createInlineJob returns -1, every
|
|
1390
1384
|
// mark*Job helper no-ops on id<=0). createInlineJob itself never throws —
|
|
1391
1385
|
// if the DB is locked or disk-full we get -1 and the user path runs
|
|
1392
1386
|
// unchanged on the in-memory fast path.
|
|
@@ -1417,7 +1411,7 @@ async function handleMessage(ctx, defaultAgent) {
|
|
|
1417
1411
|
}
|
|
1418
1412
|
// A2A-L1: stash on routeCtx so callAgentWithHistory can forward it
|
|
1419
1413
|
// through AgentSendOpts → adapter.registerRun → RunContext. When the
|
|
1420
|
-
// agent fires
|
|
1414
|
+
// agent fires mcp__agim__call_agent the bus then knows what
|
|
1421
1415
|
// parent_id to stamp on the callee inline-job row. User-originated
|
|
1422
1416
|
// runs are call_depth=0; nested runs (A2A callees) reach this same
|
|
1423
1417
|
// handler with their own ctx.inlineJobId and ctx.callDepth set.
|
|
@@ -1581,364 +1575,32 @@ async function handleMessage(ctx, defaultAgent) {
|
|
|
1581
1575
|
}
|
|
1582
1576
|
program
|
|
1583
1577
|
.command('config [component]')
|
|
1584
|
-
.description('
|
|
1578
|
+
.description('Unified config wizard; optional shortcuts jump to a section, e.g. `config wechat`')
|
|
1585
1579
|
.action(async (component) => {
|
|
1580
|
+
const { pickLang } = await import('./cli-ui/lang-picker.js');
|
|
1581
|
+
const { runConfigWizard, sectionForConfigComponent } = await import('./cli-ui/config-wizard.js');
|
|
1582
|
+
const { t: cliT } = await import('./cli-ui/i18n.js');
|
|
1583
|
+
const lang = await pickLang();
|
|
1586
1584
|
if (!component) {
|
|
1587
|
-
// New interactive wizard (since v0.5.0). Falls through to the
|
|
1588
|
-
// per-component switch below when an explicit `config wechat` etc.
|
|
1589
|
-
// is passed — keeps scripted setups working.
|
|
1590
|
-
const { pickLang } = await import('./cli-ui/lang-picker.js');
|
|
1591
|
-
const { runConfigWizard } = await import('./cli-ui/config-wizard.js');
|
|
1592
|
-
const lang = await pickLang();
|
|
1593
1585
|
await runConfigWizard(lang);
|
|
1594
1586
|
return;
|
|
1595
1587
|
}
|
|
1596
|
-
const
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
// Import the iLink adapter for QR login
|
|
1602
|
-
const { ILinkWeChatAdapter } = await import('./plugins/messengers/wechat/ilink-adapter.js');
|
|
1603
|
-
const adapter = new ILinkWeChatAdapter();
|
|
1604
|
-
try {
|
|
1605
|
-
// Get QR code URL and token
|
|
1606
|
-
const { qrUrl, qrToken } = await adapter.startQRLogin();
|
|
1607
|
-
console.log('📱 Scan this QR code with WeChat:\n');
|
|
1608
|
-
console.log(qrUrl);
|
|
1609
|
-
console.log('\n');
|
|
1610
|
-
// Poll for login status
|
|
1611
|
-
const credentials = await adapter.waitForQRLogin(qrToken, (status) => {
|
|
1612
|
-
console.log(`[${new Date().toLocaleTimeString()}] ${status}`);
|
|
1613
|
-
});
|
|
1614
|
-
if (credentials) {
|
|
1615
|
-
console.log(`\n✅ Logged in as ${credentials.userId}`);
|
|
1616
|
-
console.log(` Bot ID: ${credentials.accountId}`);
|
|
1617
|
-
// Add wechat-ilink to config
|
|
1618
|
-
if (!config.messengers.includes('wechat-ilink')) {
|
|
1619
|
-
config.messengers.push('wechat-ilink');
|
|
1620
|
-
}
|
|
1621
|
-
}
|
|
1622
|
-
else {
|
|
1623
|
-
console.log('\n❌ Login failed or timed out');
|
|
1624
|
-
return;
|
|
1625
|
-
}
|
|
1626
|
-
}
|
|
1627
|
-
catch (error) {
|
|
1628
|
-
console.error('\n❌ Failed to configure WeChat:', error);
|
|
1629
|
-
return;
|
|
1630
|
-
}
|
|
1631
|
-
break;
|
|
1632
|
-
}
|
|
1633
|
-
case 'claude': {
|
|
1634
|
-
console.log('🤖 Configuring Claude Code agent...');
|
|
1635
|
-
// Check if claude CLI is available
|
|
1636
|
-
const checkClaude = crossSpawn('claude', ['--version'], { stdio: 'ignore' });
|
|
1637
|
-
checkClaude.on('close', (code) => {
|
|
1638
|
-
if (code === 0) {
|
|
1639
|
-
console.log('✅ Claude Code CLI found!');
|
|
1640
|
-
}
|
|
1641
|
-
else {
|
|
1642
|
-
console.log('❌ Claude Code CLI not found.');
|
|
1643
|
-
console.log('Install with: npm install -g @anthropic-ai/claude-code');
|
|
1644
|
-
}
|
|
1645
|
-
});
|
|
1646
|
-
if (!config.agents.includes('claude-code')) {
|
|
1647
|
-
config.agents.push('claude-code');
|
|
1648
|
-
}
|
|
1649
|
-
config.defaultAgent = 'claude-code';
|
|
1650
|
-
break;
|
|
1651
|
-
}
|
|
1652
|
-
case 'codex': {
|
|
1653
|
-
console.log('🤖 Configuring Codex agent...');
|
|
1654
|
-
const checkCodex = crossSpawn('codex', ['--version'], { stdio: 'ignore' });
|
|
1655
|
-
checkCodex.on('close', (code) => {
|
|
1656
|
-
if (code === 0) {
|
|
1657
|
-
console.log('✅ Codex CLI found!');
|
|
1658
|
-
}
|
|
1659
|
-
else {
|
|
1660
|
-
console.log('❌ Codex CLI not found.');
|
|
1661
|
-
console.log('Install with: npm install -g @openai/codex');
|
|
1662
|
-
}
|
|
1663
|
-
});
|
|
1664
|
-
if (!config.agents.includes('codex')) {
|
|
1665
|
-
config.agents.push('codex');
|
|
1666
|
-
}
|
|
1667
|
-
config.defaultAgent = 'codex';
|
|
1668
|
-
break;
|
|
1669
|
-
}
|
|
1670
|
-
case 'telegram': {
|
|
1671
|
-
console.log('📱 Configuring Telegram adapter...');
|
|
1672
|
-
console.log('To get a bot token:');
|
|
1673
|
-
console.log('1. Open Telegram and search for @BotFather');
|
|
1674
|
-
console.log('2. Send /newbot and follow instructions');
|
|
1675
|
-
console.log('3. Copy the bot token\n');
|
|
1676
|
-
const { createInterface } = await import('node:readline');
|
|
1677
|
-
const rl = createInterface({
|
|
1678
|
-
input: process.stdin,
|
|
1679
|
-
output: process.stdout,
|
|
1680
|
-
});
|
|
1681
|
-
const token = await new Promise((resolve) => {
|
|
1682
|
-
rl.question('Enter your bot token: ', (answer) => {
|
|
1683
|
-
resolve(answer.trim());
|
|
1684
|
-
});
|
|
1685
|
-
});
|
|
1686
|
-
if (!token) {
|
|
1687
|
-
console.log('❌ Bot token is required');
|
|
1688
|
-
return;
|
|
1689
|
-
}
|
|
1690
|
-
const channelId = await new Promise((resolve) => {
|
|
1691
|
-
rl.question('Enter channel ID (optional, press Enter for default): ', (answer) => {
|
|
1692
|
-
resolve(answer.trim() || 'default');
|
|
1693
|
-
});
|
|
1694
|
-
});
|
|
1695
|
-
rl.close();
|
|
1696
|
-
config.telegram = { botToken: token, channelId };
|
|
1697
|
-
if (!config.messengers.includes('telegram')) {
|
|
1698
|
-
config.messengers.push('telegram');
|
|
1699
|
-
}
|
|
1700
|
-
console.log('✅ Telegram bot token saved');
|
|
1701
|
-
console.log(` Channel ID: ${channelId}`);
|
|
1702
|
-
break;
|
|
1703
|
-
}
|
|
1704
|
-
case 'feishu': {
|
|
1705
|
-
console.log('📱 Configuring Feishu adapter (WebSocket long polling mode)...');
|
|
1706
|
-
console.log('To create a Feishu bot:');
|
|
1707
|
-
console.log('1. Go to https://open.feishu.cn/app');
|
|
1708
|
-
console.log('2. Create a custom bot app');
|
|
1709
|
-
console.log('3. Enable Bot capability');
|
|
1710
|
-
console.log('4. Configure event subscriptions (Subscribe to "im.message.receive_v1" event)');
|
|
1711
|
-
console.log('5. Go to Permissions management and enable: im:message, im:message.p2p_msg:readonly, im:message:send_as_bot');
|
|
1712
|
-
console.log('6. Create a version and publish it');
|
|
1713
|
-
console.log('7. Copy App ID and App Secret\n');
|
|
1714
|
-
const { createInterface: createRl } = await import('node:readline');
|
|
1715
|
-
const feishuRl = createRl({
|
|
1716
|
-
input: process.stdin,
|
|
1717
|
-
output: process.stdout,
|
|
1718
|
-
});
|
|
1719
|
-
const appId = await new Promise((resolve) => {
|
|
1720
|
-
feishuRl.question('Enter App ID: ', (answer) => {
|
|
1721
|
-
resolve(answer.trim());
|
|
1722
|
-
});
|
|
1723
|
-
});
|
|
1724
|
-
const appSecret = await new Promise((resolve) => {
|
|
1725
|
-
feishuRl.question('Enter App Secret: ', (answer) => {
|
|
1726
|
-
resolve(answer.trim());
|
|
1727
|
-
});
|
|
1728
|
-
});
|
|
1729
|
-
feishuRl.close();
|
|
1730
|
-
if (!appId || !appSecret) {
|
|
1731
|
-
console.log('❌ App ID and App Secret are required');
|
|
1732
|
-
return;
|
|
1733
|
-
}
|
|
1734
|
-
config.feishu = {
|
|
1735
|
-
appId,
|
|
1736
|
-
appSecret
|
|
1737
|
-
};
|
|
1738
|
-
if (!config.messengers.includes('feishu')) {
|
|
1739
|
-
config.messengers.push('feishu');
|
|
1740
|
-
}
|
|
1741
|
-
console.log('✅ Feishu bot credentials saved');
|
|
1742
|
-
console.log(`\n✅ Using WebSocket long polling mode - no webhook configuration needed!`);
|
|
1743
|
-
console.log(` The bot will automatically connect to Feishu servers.`);
|
|
1744
|
-
break;
|
|
1745
|
-
}
|
|
1746
|
-
case 'discord': {
|
|
1747
|
-
console.log('📱 Configuring Discord adapter...');
|
|
1748
|
-
console.log('To create a Discord bot:');
|
|
1749
|
-
console.log('1. Go to https://discord.com/developers/applications');
|
|
1750
|
-
console.log('2. Click "New Application" and give it a name');
|
|
1751
|
-
console.log('3. Go to "Bot" tab and click "Add Bot"');
|
|
1752
|
-
console.log('4. IMPORTANT: Enable "MESSAGE CONTENT INTENT" under Privileged Gateway Intents');
|
|
1753
|
-
console.log('5. Click "Reset Token" to get your bot token');
|
|
1754
|
-
console.log('6. Use OAuth2 URL Generator to invite the bot to your server\n');
|
|
1755
|
-
const { createInterface: createDiscordRl } = await import('node:readline');
|
|
1756
|
-
const discordRl = createDiscordRl({
|
|
1757
|
-
input: process.stdin,
|
|
1758
|
-
output: process.stdout,
|
|
1759
|
-
});
|
|
1760
|
-
const discordToken = await new Promise((resolve) => {
|
|
1761
|
-
discordRl.question('Enter your bot token: ', (answer) => {
|
|
1762
|
-
resolve(answer.trim());
|
|
1763
|
-
});
|
|
1764
|
-
});
|
|
1765
|
-
if (!discordToken) {
|
|
1766
|
-
console.log('❌ Bot token is required');
|
|
1767
|
-
discordRl.close();
|
|
1768
|
-
return;
|
|
1769
|
-
}
|
|
1770
|
-
const discordChannelId = await new Promise((resolve) => {
|
|
1771
|
-
discordRl.question('Enter channel ID (optional, press Enter for default): ', (answer) => {
|
|
1772
|
-
resolve(answer.trim() || 'default');
|
|
1773
|
-
});
|
|
1774
|
-
});
|
|
1775
|
-
const allowedGuilds = await new Promise((resolve) => {
|
|
1776
|
-
discordRl.question('Allowed guild IDs (comma-separated, optional): ', (answer) => {
|
|
1777
|
-
resolve(answer.trim());
|
|
1778
|
-
});
|
|
1779
|
-
});
|
|
1780
|
-
const allowedChannels = await new Promise((resolve) => {
|
|
1781
|
-
discordRl.question('Allowed channel IDs (comma-separated, optional): ', (answer) => {
|
|
1782
|
-
resolve(answer.trim());
|
|
1783
|
-
});
|
|
1784
|
-
});
|
|
1785
|
-
discordRl.close();
|
|
1786
|
-
config.discord = {
|
|
1787
|
-
botToken: discordToken,
|
|
1788
|
-
channelId: discordChannelId,
|
|
1789
|
-
allowedGuilds: allowedGuilds ? allowedGuilds.split(',').map(s => s.trim()).filter(Boolean) : undefined,
|
|
1790
|
-
allowedChannels: allowedChannels ? allowedChannels.split(',').map(s => s.trim()).filter(Boolean) : undefined,
|
|
1791
|
-
};
|
|
1792
|
-
if (!config.messengers.includes('discord')) {
|
|
1793
|
-
config.messengers.push('discord');
|
|
1794
|
-
}
|
|
1795
|
-
console.log('✅ Discord bot token saved');
|
|
1796
|
-
console.log(` Channel ID: ${discordChannelId}`);
|
|
1797
|
-
if (config.discord.allowedGuilds?.length) {
|
|
1798
|
-
console.log(` Allowed guilds: ${config.discord.allowedGuilds.join(', ')}`);
|
|
1799
|
-
}
|
|
1800
|
-
if (config.discord.allowedChannels?.length) {
|
|
1801
|
-
console.log(` Allowed channels: ${config.discord.allowedChannels.join(', ')}`);
|
|
1802
|
-
}
|
|
1803
|
-
break;
|
|
1804
|
-
}
|
|
1805
|
-
case 'cursor': {
|
|
1806
|
-
console.log('🤖 Configuring Cursor agent...');
|
|
1807
|
-
const cursorAvailable = await new Promise((resolve) => {
|
|
1808
|
-
const proc = crossSpawn('cursor-agent', ['--version'], { stdio: 'ignore' });
|
|
1809
|
-
proc.on('error', () => resolve(false));
|
|
1810
|
-
proc.on('close', (code) => resolve(code === 0));
|
|
1811
|
-
});
|
|
1812
|
-
if (cursorAvailable) {
|
|
1813
|
-
console.log('✅ Cursor CLI found!');
|
|
1814
|
-
console.log('\nTo authenticate, run: cursor-agent login (OAuth) or set CURSOR_API_KEY');
|
|
1815
|
-
}
|
|
1816
|
-
else {
|
|
1817
|
-
console.log('❌ Cursor CLI not found.');
|
|
1818
|
-
console.log('Install with: curl https://cursor.com/install -fsS | bash');
|
|
1819
|
-
}
|
|
1820
|
-
if (!config.agents.includes('cursor')) {
|
|
1821
|
-
config.agents.push('cursor');
|
|
1822
|
-
}
|
|
1823
|
-
config.defaultAgent = 'cursor';
|
|
1824
|
-
break;
|
|
1825
|
-
}
|
|
1826
|
-
case 'opencode': {
|
|
1827
|
-
console.log('🤖 Configuring OpenCode agent...');
|
|
1828
|
-
// Check if opencode CLI is available
|
|
1829
|
-
const openCodeAvailable = await new Promise((resolve) => {
|
|
1830
|
-
const proc = crossSpawn('opencode', ['--version'], { stdio: 'ignore' });
|
|
1831
|
-
proc.on('error', () => resolve(false));
|
|
1832
|
-
proc.on('close', (code) => resolve(code === 0));
|
|
1833
|
-
});
|
|
1834
|
-
if (openCodeAvailable) {
|
|
1835
|
-
console.log('✅ OpenCode CLI found!');
|
|
1836
|
-
console.log('\nTo authenticate, run: opencode auth login');
|
|
1837
|
-
}
|
|
1838
|
-
else {
|
|
1839
|
-
console.log('❌ OpenCode CLI not found.');
|
|
1840
|
-
console.log('Install with: npm i -g opencode-ai@latest');
|
|
1841
|
-
console.log('Or visit: https://github.com/anomalyco/opencode');
|
|
1842
|
-
}
|
|
1843
|
-
if (!config.agents.includes('opencode')) {
|
|
1844
|
-
config.agents.push('opencode');
|
|
1845
|
-
}
|
|
1846
|
-
config.defaultAgent = 'opencode';
|
|
1847
|
-
break;
|
|
1848
|
-
}
|
|
1849
|
-
case 'agent': {
|
|
1850
|
-
console.log('🔌 Configuring remote ACP agent...');
|
|
1851
|
-
console.log('This adds a remote agent that speaks the Agent Communication Protocol.');
|
|
1852
|
-
console.log('ACP is an open standard (https://agentcommunicationprotocol.dev)\n');
|
|
1853
|
-
const { createInterface: createAgentRl } = await import('node:readline');
|
|
1854
|
-
const agentRl = createAgentRl({ input: process.stdin, output: process.stdout });
|
|
1855
|
-
const agentName = await new Promise((resolve) => {
|
|
1856
|
-
agentRl.question('Agent name (e.g. openclaw-dev): ', (answer) => resolve(answer.trim()));
|
|
1857
|
-
});
|
|
1858
|
-
if (!agentName) {
|
|
1859
|
-
console.log('❌ Name is required');
|
|
1860
|
-
agentRl.close();
|
|
1861
|
-
return;
|
|
1862
|
-
}
|
|
1863
|
-
const agentAlias = await new Promise((resolve) => {
|
|
1864
|
-
agentRl.question('Aliases, comma-separated (optional): ', (answer) => resolve(answer.trim()));
|
|
1865
|
-
});
|
|
1866
|
-
const endpoint = await new Promise((resolve) => {
|
|
1867
|
-
agentRl.question('ACP endpoint URL (e.g. http://localhost:8080): ', (answer) => resolve(answer.trim()));
|
|
1868
|
-
});
|
|
1869
|
-
if (!endpoint) {
|
|
1870
|
-
console.log('❌ Endpoint is required');
|
|
1871
|
-
agentRl.close();
|
|
1872
|
-
return;
|
|
1873
|
-
}
|
|
1874
|
-
console.log('\nAuthentication type:');
|
|
1875
|
-
console.log(' 1. none');
|
|
1876
|
-
console.log(' 2. apikey');
|
|
1877
|
-
console.log(' 3. bearer');
|
|
1878
|
-
const authTypeInput = await new Promise((resolve) => {
|
|
1879
|
-
agentRl.question('Choose (1-3, default: none): ', (answer) => resolve(answer.trim() || '1'));
|
|
1880
|
-
});
|
|
1881
|
-
const authTypeMap = { '1': 'none', '2': 'apikey', '3': 'bearer' };
|
|
1882
|
-
const authType = authTypeMap[authTypeInput] || 'none';
|
|
1883
|
-
let auth;
|
|
1884
|
-
if (authType !== 'none') {
|
|
1885
|
-
const token = await new Promise((resolve) => {
|
|
1886
|
-
agentRl.question('Auth token: ', (answer) => resolve(answer.trim()));
|
|
1887
|
-
});
|
|
1888
|
-
if (!token) {
|
|
1889
|
-
console.log('❌ Token is required when auth is enabled');
|
|
1890
|
-
agentRl.close();
|
|
1891
|
-
return;
|
|
1892
|
-
}
|
|
1893
|
-
auth = { type: authType, token };
|
|
1894
|
-
}
|
|
1895
|
-
agentRl.close();
|
|
1896
|
-
// Validate connection
|
|
1897
|
-
console.log('\n🔍 Testing connection...');
|
|
1898
|
-
const { ACPClient } = await import('./plugins/agents/acp/acp-client.js');
|
|
1899
|
-
const testClient = new ACPClient({ name: agentName, endpoint, auth });
|
|
1900
|
-
try {
|
|
1901
|
-
const manifest = await testClient.fetchManifest();
|
|
1902
|
-
console.log(`✅ Connected! Agent: ${manifest.name}`);
|
|
1903
|
-
if (manifest.description)
|
|
1904
|
-
console.log(` ${manifest.description}`);
|
|
1905
|
-
}
|
|
1906
|
-
catch (e) {
|
|
1907
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
1908
|
-
console.log(`⚠️ Connection failed: ${msg}`);
|
|
1909
|
-
console.log(' Agent will be saved but may not work until endpoint is available.');
|
|
1910
|
-
}
|
|
1911
|
-
// Save
|
|
1912
|
-
if (!config.acpAgents)
|
|
1913
|
-
config.acpAgents = [];
|
|
1914
|
-
const existing = config.acpAgents.findIndex(a => a.name === agentName);
|
|
1915
|
-
const agentConfig = {
|
|
1916
|
-
name: agentName,
|
|
1917
|
-
aliases: agentAlias?.split(',').map(s => s.trim()).filter(Boolean) || [],
|
|
1918
|
-
endpoint,
|
|
1919
|
-
auth,
|
|
1920
|
-
enabled: true
|
|
1921
|
-
};
|
|
1922
|
-
if (existing >= 0) {
|
|
1923
|
-
config.acpAgents[existing] = agentConfig;
|
|
1924
|
-
}
|
|
1925
|
-
else {
|
|
1926
|
-
config.acpAgents.push(agentConfig);
|
|
1927
|
-
}
|
|
1928
|
-
break;
|
|
1929
|
-
}
|
|
1930
|
-
default:
|
|
1931
|
-
console.log(`Unknown component: ${component}`);
|
|
1932
|
-
console.log('Run "agim config" to see available components.');
|
|
1933
|
-
process.exitCode = 1;
|
|
1934
|
-
return;
|
|
1588
|
+
const section = sectionForConfigComponent(component);
|
|
1589
|
+
if (!section) {
|
|
1590
|
+
console.log(cliT(lang, 'config.shortcut.unknown', { component }));
|
|
1591
|
+
process.exitCode = 1;
|
|
1592
|
+
return;
|
|
1935
1593
|
}
|
|
1936
|
-
await
|
|
1937
|
-
|
|
1594
|
+
await runConfigWizard(lang, {
|
|
1595
|
+
initialSection: section,
|
|
1596
|
+
initialOnly: true,
|
|
1597
|
+
shortcutLabel: component,
|
|
1598
|
+
});
|
|
1599
|
+
return;
|
|
1938
1600
|
});
|
|
1939
1601
|
program
|
|
1940
1602
|
.command('tui')
|
|
1941
|
-
.description('Open the terminal chat UI
|
|
1603
|
+
.description('Open the terminal chat UI for local agent conversations')
|
|
1942
1604
|
.option('-a, --agent <name>', 'Pre-select an agent by name (e.g. claude-code, codex, native)')
|
|
1943
1605
|
.option('-r, --resume [id]', 'Resume a saved session by id; "last" or empty picks the most recent')
|
|
1944
1606
|
.option('--list-sessions', 'Print saved TUI sessions (latest first) and exit')
|
|
@@ -1949,7 +1611,29 @@ program
|
|
|
1949
1611
|
await runTui({ agent: opts.agent, resume, listSessions: opts.listSessions });
|
|
1950
1612
|
});
|
|
1951
1613
|
program
|
|
1952
|
-
.command('
|
|
1614
|
+
.command('go')
|
|
1615
|
+
.description('First run: configure one agent, start Web, then continue in `agim web`')
|
|
1616
|
+
.action(async () => {
|
|
1617
|
+
const { runQuickstart } = await import('./cli-ui/quickstart.js');
|
|
1618
|
+
await runQuickstart();
|
|
1619
|
+
});
|
|
1620
|
+
program.addCommand(program.createCommand('quickstart')
|
|
1621
|
+
.description('Compatibility alias for `agim go`')
|
|
1622
|
+
.action(async () => {
|
|
1623
|
+
const { runQuickstart } = await import('./cli-ui/quickstart.js');
|
|
1624
|
+
await runQuickstart();
|
|
1625
|
+
}), { hidden: true });
|
|
1626
|
+
program
|
|
1627
|
+
.command('doctor')
|
|
1628
|
+
.description('Run a local readiness check and suggest the next command')
|
|
1629
|
+
.action(async () => {
|
|
1630
|
+
const { runDoctor } = await import('./cli-ui/doctor.js');
|
|
1631
|
+
const code = await runDoctor();
|
|
1632
|
+
if (code !== 0)
|
|
1633
|
+
process.exit(code);
|
|
1634
|
+
});
|
|
1635
|
+
program
|
|
1636
|
+
.command('agents', { hidden: true })
|
|
1953
1637
|
.description('List available agents')
|
|
1954
1638
|
.action(async () => {
|
|
1955
1639
|
await registry.loadBuiltInPlugins();
|
|
@@ -1992,7 +1676,7 @@ program
|
|
|
1992
1676
|
}
|
|
1993
1677
|
});
|
|
1994
1678
|
program
|
|
1995
|
-
.command('messengers')
|
|
1679
|
+
.command('messengers', { hidden: true })
|
|
1996
1680
|
.description('List available messengers')
|
|
1997
1681
|
.action(async () => {
|
|
1998
1682
|
await registry.loadBuiltInPlugins();
|
|
@@ -2015,7 +1699,7 @@ program
|
|
|
2015
1699
|
// agim diag mcp
|
|
2016
1700
|
const setupCmd = program
|
|
2017
1701
|
.command('setup')
|
|
2018
|
-
.description('
|
|
1702
|
+
.description('Advanced setup helpers for LLM backends and MCP servers');
|
|
2019
1703
|
setupCmd
|
|
2020
1704
|
.command('llm [args...]')
|
|
2021
1705
|
.description('Manage Agim Agent model API backends')
|
|
@@ -2036,7 +1720,7 @@ setupCmd
|
|
|
2036
1720
|
});
|
|
2037
1721
|
const diagCmd = program
|
|
2038
1722
|
.command('diag')
|
|
2039
|
-
.description('
|
|
1723
|
+
.description('Advanced diagnostics for configured LLM/MCP backends');
|
|
2040
1724
|
diagCmd
|
|
2041
1725
|
.command('llm')
|
|
2042
1726
|
.description('Diagnose configured LLM backends')
|
|
@@ -2059,7 +1743,7 @@ diagCmd
|
|
|
2059
1743
|
// status / restart / stop / uninstall — all delegate to cli-ui/cmd-handlers.ts.
|
|
2060
1744
|
program
|
|
2061
1745
|
.command('status')
|
|
2062
|
-
.description('Show whether
|
|
1746
|
+
.description('Show whether Agim is running and where the Web console is')
|
|
2063
1747
|
.action(async () => {
|
|
2064
1748
|
const { cmdStatus } = await import('./cli-ui/cmd-handlers.js');
|
|
2065
1749
|
cmdStatus();
|
|
@@ -2179,7 +1863,7 @@ tokenCmd
|
|
|
2179
1863
|
process.exit(1);
|
|
2180
1864
|
});
|
|
2181
1865
|
// ─── IM admin registry helpers (v2 model) ────────────────────────────
|
|
2182
|
-
const adminCmd = program.command('admin').description('Inspect IM admin assignments');
|
|
1866
|
+
const adminCmd = program.command('admin', { hidden: true }).description('Inspect IM admin assignments');
|
|
2183
1867
|
adminCmd
|
|
2184
1868
|
.command('list')
|
|
2185
1869
|
.description('List current IM admins')
|
|
@@ -2218,38 +1902,21 @@ adminCmd
|
|
|
2218
1902
|
// hint to use IM `/web` instead.
|
|
2219
1903
|
program
|
|
2220
1904
|
.command('web')
|
|
2221
|
-
.description('
|
|
2222
|
-
.
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
const url = getEffectivePublicBaseUrl();
|
|
2237
|
-
if (url) {
|
|
2238
|
-
const source = cfg.publicBaseUrl ? 'IMHUB_VIEWER_PUBLIC_BASE_URL' : 'cloudflared tunnel';
|
|
2239
|
-
console.log(url);
|
|
2240
|
-
console.log(`(来源: ${source})`);
|
|
2241
|
-
return;
|
|
2242
|
-
}
|
|
2243
|
-
if (cfg.tunnelMode === 'quick') {
|
|
2244
|
-
console.log('Web 后台地址当前由 cloudflared 临时隧道提供,但本进程查不到隧道 URL。');
|
|
2245
|
-
console.log('请在 IM 内发送 /web 让运行中的 daemon 返回最新地址。');
|
|
2246
|
-
process.exit(2);
|
|
2247
|
-
}
|
|
2248
|
-
console.log('Web 后台地址未配置。');
|
|
2249
|
-
console.log('设置以下任一项后重启服务:');
|
|
2250
|
-
console.log(' IMHUB_VIEWER_PUBLIC_BASE_URL=https://your-domain (反代 / 自定义域名)');
|
|
2251
|
-
console.log(' IMHUB_VIEWER_TUNNEL_MODE=quick (cloudflared 临时隧道)');
|
|
2252
|
-
process.exit(2);
|
|
1905
|
+
.description('Show the web console URL, service state, and login hint')
|
|
1906
|
+
.option('--public', 'Print the public/reverse-proxy URL only')
|
|
1907
|
+
.option('--welcome', 'Append the first-run welcome flag to the local URL')
|
|
1908
|
+
.option('--open', 'Open the Web console in the default browser')
|
|
1909
|
+
.option('--start', 'Start Agim in the background first when it is not running')
|
|
1910
|
+
.action(async (opts) => {
|
|
1911
|
+
const { cmdWeb } = await import('./cli-ui/cmd-handlers.js');
|
|
1912
|
+
const code = await cmdWeb({
|
|
1913
|
+
public: opts.public,
|
|
1914
|
+
welcome: opts.welcome,
|
|
1915
|
+
open: opts.open,
|
|
1916
|
+
start: opts.start,
|
|
1917
|
+
});
|
|
1918
|
+
if (code !== 0)
|
|
1919
|
+
process.exit(code);
|
|
2253
1920
|
});
|
|
2254
1921
|
// ─── bare `agim` → entry menu (v0.5.0+) ─────────────────────────────
|
|
2255
1922
|
// If the user invoked us with no args (just `agim`), drop them at
|
|
@@ -2265,14 +1932,29 @@ async function maybeRunEntryMenu() {
|
|
|
2265
1932
|
if (!process.stdin.isTTY)
|
|
2266
1933
|
return false; // piped / non-interactive — fall back to commander's help
|
|
2267
1934
|
const { runEntryMenu } = await import('./cli-ui/entry-menu.js');
|
|
2268
|
-
const { cmdStatus, cmdStart, cmdStop, cmdRestart, cmdUninstall } = await import('./cli-ui/cmd-handlers.js');
|
|
1935
|
+
const { cmdStatus, cmdStart, cmdStop, cmdRestart, cmdUninstall, cmdWeb } = await import('./cli-ui/cmd-handlers.js');
|
|
2269
1936
|
const { action, lang } = await runEntryMenu();
|
|
2270
1937
|
switch (action.kind) {
|
|
2271
1938
|
case 'quit':
|
|
2272
1939
|
return true;
|
|
1940
|
+
case 'quickstart': {
|
|
1941
|
+
const { runQuickstart } = await import('./cli-ui/quickstart.js');
|
|
1942
|
+
await runQuickstart(lang);
|
|
1943
|
+
return true;
|
|
1944
|
+
}
|
|
1945
|
+
case 'doctor': {
|
|
1946
|
+
const { runDoctor } = await import('./cli-ui/doctor.js');
|
|
1947
|
+
const code = await runDoctor();
|
|
1948
|
+
if (code !== 0)
|
|
1949
|
+
process.exitCode = code;
|
|
1950
|
+
return true;
|
|
1951
|
+
}
|
|
2273
1952
|
case 'status':
|
|
2274
1953
|
cmdStatus();
|
|
2275
1954
|
return true;
|
|
1955
|
+
case 'web':
|
|
1956
|
+
await cmdWeb({ welcome: true, start: true, open: true });
|
|
1957
|
+
return true;
|
|
2276
1958
|
case 'config': {
|
|
2277
1959
|
// Reuse the lang the user just picked in runEntryMenu — re-prompting
|
|
2278
1960
|
// here was a v0.5.1 regression (user reported: "已经选过语言不要再问").
|