axon-code 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +261 -0
- package/README.zh-CN.md +261 -0
- package/dist/agents/context.d.ts +289 -0
- package/dist/agents/context.d.ts.map +1 -0
- package/dist/agents/context.js +944 -0
- package/dist/agents/context.js.map +1 -0
- package/dist/agents/explore.d.ts +190 -0
- package/dist/agents/explore.d.ts.map +1 -0
- package/dist/agents/explore.js +582 -0
- package/dist/agents/explore.js.map +1 -0
- package/dist/agents/guide.d.ts +117 -0
- package/dist/agents/guide.d.ts.map +1 -0
- package/dist/agents/guide.js +690 -0
- package/dist/agents/guide.js.map +1 -0
- package/dist/agents/index.d.ts +11 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +17 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/monitor.d.ts +343 -0
- package/dist/agents/monitor.d.ts.map +1 -0
- package/dist/agents/monitor.js +963 -0
- package/dist/agents/monitor.js.map +1 -0
- package/dist/agents/parallel.d.ts +305 -0
- package/dist/agents/parallel.d.ts.map +1 -0
- package/dist/agents/parallel.js +717 -0
- package/dist/agents/parallel.js.map +1 -0
- package/dist/agents/plan.d.ts +236 -0
- package/dist/agents/plan.d.ts.map +1 -0
- package/dist/agents/plan.js +292 -0
- package/dist/agents/plan.js.map +1 -0
- package/dist/agents/resume.d.ts +209 -0
- package/dist/agents/resume.d.ts.map +1 -0
- package/dist/agents/resume.js +520 -0
- package/dist/agents/resume.js.map +1 -0
- package/dist/agents/statusline.d.ts +167 -0
- package/dist/agents/statusline.d.ts.map +1 -0
- package/dist/agents/statusline.js +546 -0
- package/dist/agents/statusline.js.map +1 -0
- package/dist/agents/teammate-context.d.ts +163 -0
- package/dist/agents/teammate-context.d.ts.map +1 -0
- package/dist/agents/teammate-context.js +272 -0
- package/dist/agents/teammate-context.js.map +1 -0
- package/dist/agents/tools.d.ts +30 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +116 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/auth/index.d.ts +204 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +1266 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/keychain.d.ts +74 -0
- package/dist/auth/keychain.d.ts.map +1 -0
- package/dist/auth/keychain.js +181 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/auth/settings.d.ts +58 -0
- package/dist/auth/settings.d.ts.map +1 -0
- package/dist/auth/settings.js +260 -0
- package/dist/auth/settings.js.map +1 -0
- package/dist/background/index.d.ts +83 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +106 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/persistence.d.ts +146 -0
- package/dist/background/persistence.d.ts.map +1 -0
- package/dist/background/persistence.js +347 -0
- package/dist/background/persistence.js.map +1 -0
- package/dist/background/shell-manager.d.ts +130 -0
- package/dist/background/shell-manager.d.ts.map +1 -0
- package/dist/background/shell-manager.js +401 -0
- package/dist/background/shell-manager.js.map +1 -0
- package/dist/background/task-queue.d.ts +96 -0
- package/dist/background/task-queue.d.ts.map +1 -0
- package/dist/background/task-queue.js +199 -0
- package/dist/background/task-queue.js.map +1 -0
- package/dist/background/timeout.d.ts +122 -0
- package/dist/background/timeout.d.ts.map +1 -0
- package/dist/background/timeout.js +247 -0
- package/dist/background/timeout.js.map +1 -0
- package/dist/blueprint/agent-decision-maker.d.ts +126 -0
- package/dist/blueprint/agent-decision-maker.d.ts.map +1 -0
- package/dist/blueprint/agent-decision-maker.js +433 -0
- package/dist/blueprint/agent-decision-maker.js.map +1 -0
- package/dist/blueprint/autonomous-worker.d.ts +182 -0
- package/dist/blueprint/autonomous-worker.d.ts.map +1 -0
- package/dist/blueprint/autonomous-worker.js +808 -0
- package/dist/blueprint/autonomous-worker.js.map +1 -0
- package/dist/blueprint/browser-test-tools.d.ts +277 -0
- package/dist/blueprint/browser-test-tools.d.ts.map +1 -0
- package/dist/blueprint/browser-test-tools.js +645 -0
- package/dist/blueprint/browser-test-tools.js.map +1 -0
- package/dist/blueprint/e2e-agent-registry.d.ts +27 -0
- package/dist/blueprint/e2e-agent-registry.d.ts.map +1 -0
- package/dist/blueprint/e2e-agent-registry.js +39 -0
- package/dist/blueprint/e2e-agent-registry.js.map +1 -0
- package/dist/blueprint/e2e-test-agent.d.ts +151 -0
- package/dist/blueprint/e2e-test-agent.d.ts.map +1 -0
- package/dist/blueprint/e2e-test-agent.js +612 -0
- package/dist/blueprint/e2e-test-agent.js.map +1 -0
- package/dist/blueprint/environment-checker.d.ts +113 -0
- package/dist/blueprint/environment-checker.d.ts.map +1 -0
- package/dist/blueprint/environment-checker.js +409 -0
- package/dist/blueprint/environment-checker.js.map +1 -0
- package/dist/blueprint/index.d.ts +26 -0
- package/dist/blueprint/index.d.ts.map +1 -0
- package/dist/blueprint/index.js +50 -0
- package/dist/blueprint/index.js.map +1 -0
- package/dist/blueprint/lead-agent.d.ts +97 -0
- package/dist/blueprint/lead-agent.d.ts.map +1 -0
- package/dist/blueprint/lead-agent.js +905 -0
- package/dist/blueprint/lead-agent.js.map +1 -0
- package/dist/blueprint/model-selector.d.ts +34 -0
- package/dist/blueprint/model-selector.d.ts.map +1 -0
- package/dist/blueprint/model-selector.js +83 -0
- package/dist/blueprint/model-selector.js.map +1 -0
- package/dist/blueprint/planner-session.d.ts +130 -0
- package/dist/blueprint/planner-session.d.ts.map +1 -0
- package/dist/blueprint/planner-session.js +479 -0
- package/dist/blueprint/planner-session.js.map +1 -0
- package/dist/blueprint/realtime-coordinator.d.ts +373 -0
- package/dist/blueprint/realtime-coordinator.d.ts.map +1 -0
- package/dist/blueprint/realtime-coordinator.js +1454 -0
- package/dist/blueprint/realtime-coordinator.js.map +1 -0
- package/dist/blueprint/smart-planner.d.ts +346 -0
- package/dist/blueprint/smart-planner.d.ts.map +1 -0
- package/dist/blueprint/smart-planner.js +2426 -0
- package/dist/blueprint/smart-planner.js.map +1 -0
- package/dist/blueprint/task-queue.d.ts +62 -0
- package/dist/blueprint/task-queue.d.ts.map +1 -0
- package/dist/blueprint/task-queue.js +185 -0
- package/dist/blueprint/task-queue.js.map +1 -0
- package/dist/blueprint/task-reviewer.d.ts +168 -0
- package/dist/blueprint/task-reviewer.d.ts.map +1 -0
- package/dist/blueprint/task-reviewer.js +570 -0
- package/dist/blueprint/task-reviewer.js.map +1 -0
- package/dist/blueprint/types.d.ts +1054 -0
- package/dist/blueprint/types.d.ts.map +1 -0
- package/dist/blueprint/types.js +49 -0
- package/dist/blueprint/types.js.map +1 -0
- package/dist/blueprint/verification-service.d.ts +134 -0
- package/dist/blueprint/verification-service.d.ts.map +1 -0
- package/dist/blueprint/verification-service.js +315 -0
- package/dist/blueprint/verification-service.js.map +1 -0
- package/dist/blueprint/visual-comparator.d.ts +112 -0
- package/dist/blueprint/visual-comparator.d.ts.map +1 -0
- package/dist/blueprint/visual-comparator.js +309 -0
- package/dist/blueprint/visual-comparator.js.map +1 -0
- package/dist/browser/controller.d.ts +188 -0
- package/dist/browser/controller.d.ts.map +1 -0
- package/dist/browser/controller.js +1256 -0
- package/dist/browser/controller.js.map +1 -0
- package/dist/browser/detect.d.ts +14 -0
- package/dist/browser/detect.d.ts.map +1 -0
- package/dist/browser/detect.js +93 -0
- package/dist/browser/detect.js.map +1 -0
- package/dist/browser/errors.d.ts +14 -0
- package/dist/browser/errors.d.ts.map +1 -0
- package/dist/browser/errors.js +45 -0
- package/dist/browser/errors.js.map +1 -0
- package/dist/browser/extension/background-utils.js +53 -0
- package/dist/browser/extension/background.js +895 -0
- package/dist/browser/extension/manifest.json +28 -0
- package/dist/browser/extension/options.html +214 -0
- package/dist/browser/extension/options.js +201 -0
- package/dist/browser/extension-relay-auth.d.ts +18 -0
- package/dist/browser/extension-relay-auth.d.ts.map +1 -0
- package/dist/browser/extension-relay-auth.js +53 -0
- package/dist/browser/extension-relay-auth.js.map +1 -0
- package/dist/browser/extension-relay.d.ts +39 -0
- package/dist/browser/extension-relay.d.ts.map +1 -0
- package/dist/browser/extension-relay.js +855 -0
- package/dist/browser/extension-relay.js.map +1 -0
- package/dist/browser/index.d.ts +11 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +11 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/manager.d.ts +77 -0
- package/dist/browser/manager.d.ts.map +1 -0
- package/dist/browser/manager.js +911 -0
- package/dist/browser/manager.js.map +1 -0
- package/dist/browser/navigation-guard.d.ts +15 -0
- package/dist/browser/navigation-guard.d.ts.map +1 -0
- package/dist/browser/navigation-guard.js +163 -0
- package/dist/browser/navigation-guard.js.map +1 -0
- package/dist/browser/profiles.d.ts +49 -0
- package/dist/browser/profiles.d.ts.map +1 -0
- package/dist/browser/profiles.js +211 -0
- package/dist/browser/profiles.js.map +1 -0
- package/dist/browser/types.d.ts +96 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +5 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/checkpoint/index.d.ts +289 -0
- package/dist/checkpoint/index.d.ts.map +1 -0
- package/dist/checkpoint/index.js +1424 -0
- package/dist/checkpoint/index.js.map +1 -0
- package/dist/chrome/index.d.ts +31 -0
- package/dist/chrome/index.d.ts.map +1 -0
- package/dist/chrome/index.js +41 -0
- package/dist/chrome/index.js.map +1 -0
- package/dist/chrome-mcp/index.d.ts +84 -0
- package/dist/chrome-mcp/index.d.ts.map +1 -0
- package/dist/chrome-mcp/index.js +192 -0
- package/dist/chrome-mcp/index.js.map +1 -0
- package/dist/chrome-mcp/mcp-server.d.ts +115 -0
- package/dist/chrome-mcp/mcp-server.d.ts.map +1 -0
- package/dist/chrome-mcp/mcp-server.js +312 -0
- package/dist/chrome-mcp/mcp-server.js.map +1 -0
- package/dist/chrome-mcp/native-host.d.ts +65 -0
- package/dist/chrome-mcp/native-host.d.ts.map +1 -0
- package/dist/chrome-mcp/native-host.js +357 -0
- package/dist/chrome-mcp/native-host.js.map +1 -0
- package/dist/chrome-mcp/socket-client.d.ts +105 -0
- package/dist/chrome-mcp/socket-client.d.ts.map +1 -0
- package/dist/chrome-mcp/socket-client.js +325 -0
- package/dist/chrome-mcp/socket-client.js.map +1 -0
- package/dist/chrome-mcp/socket-server.d.ts +65 -0
- package/dist/chrome-mcp/socket-server.d.ts.map +1 -0
- package/dist/chrome-mcp/socket-server.js +354 -0
- package/dist/chrome-mcp/socket-server.js.map +1 -0
- package/dist/chrome-mcp/tools.d.ts +22 -0
- package/dist/chrome-mcp/tools.d.ts.map +1 -0
- package/dist/chrome-mcp/tools.js +372 -0
- package/dist/chrome-mcp/tools.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3302 -0
- package/dist/cli.js.map +1 -0
- package/dist/codesign/index.d.ts +84 -0
- package/dist/codesign/index.d.ts.map +1 -0
- package/dist/codesign/index.js +289 -0
- package/dist/codesign/index.js.map +1 -0
- package/dist/commands/api.d.ts +8 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +510 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/auth.d.ts +13 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +713 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +12 -0
- package/dist/commands/config-cmd.d.ts.map +1 -0
- package/dist/commands/config-cmd.js +578 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/dist/commands/config.d.ts +22 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +2457 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/development.d.ts +14 -0
- package/dist/commands/development.d.ts.map +1 -0
- package/dist/commands/development.js +905 -0
- package/dist/commands/development.js.map +1 -0
- package/dist/commands/general.d.ts +15 -0
- package/dist/commands/general.d.ts.map +1 -0
- package/dist/commands/general.js +620 -0
- package/dist/commands/general.js.map +1 -0
- package/dist/commands/index.d.ts +28 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +70 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/registry.d.ts +16 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +55 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/session.d.ts +14 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +1256 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/settings.d.ts +15 -0
- package/dist/commands/settings.d.ts.map +1 -0
- package/dist/commands/settings.js +439 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/tools.d.ts +14 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +1579 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/types.d.ts +82 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +5 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/utility.d.ts +19 -0
- package/dist/commands/utility.d.ts.map +1 -0
- package/dist/commands/utility.js +738 -0
- package/dist/commands/utility.js.map +1 -0
- package/dist/config/axon-md-parser.d.ts +167 -0
- package/dist/config/axon-md-parser.d.ts.map +1 -0
- package/dist/config/axon-md-parser.js +472 -0
- package/dist/config/axon-md-parser.js.map +1 -0
- package/dist/config/builtin-api.d.ts +2 -0
- package/dist/config/builtin-api.d.ts.map +1 -0
- package/dist/config/builtin-api.js +2 -0
- package/dist/config/builtin-api.js.map +1 -0
- package/dist/config/config-command.d.ts +81 -0
- package/dist/config/config-command.d.ts.map +1 -0
- package/dist/config/config-command.js +292 -0
- package/dist/config/config-command.js.map +1 -0
- package/dist/config/index.d.ts +1700 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +1677 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/keybindings.d.ts +141 -0
- package/dist/config/keybindings.d.ts.map +1 -0
- package/dist/config/keybindings.js +708 -0
- package/dist/config/keybindings.js.map +1 -0
- package/dist/context/__tests__/enhanced.test.d.ts +5 -0
- package/dist/context/__tests__/enhanced.test.d.ts.map +1 -0
- package/dist/context/__tests__/enhanced.test.js +298 -0
- package/dist/context/__tests__/enhanced.test.js.map +1 -0
- package/dist/context/enhanced.d.ts +244 -0
- package/dist/context/enhanced.d.ts.map +1 -0
- package/dist/context/enhanced.js +527 -0
- package/dist/context/enhanced.js.map +1 -0
- package/dist/context/index.d.ts +249 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +1043 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/intent-enricher.d.ts +38 -0
- package/dist/context/intent-enricher.d.ts.map +1 -0
- package/dist/context/intent-enricher.js +212 -0
- package/dist/context/intent-enricher.js.map +1 -0
- package/dist/context/link-detector.d.ts +20 -0
- package/dist/context/link-detector.d.ts.map +1 -0
- package/dist/context/link-detector.js +99 -0
- package/dist/context/link-detector.js.map +1 -0
- package/dist/context/session-memory.d.ts +206 -0
- package/dist/context/session-memory.d.ts.map +1 -0
- package/dist/context/session-memory.js +542 -0
- package/dist/context/session-memory.js.map +1 -0
- package/dist/context/summarizer.d.ts +27 -0
- package/dist/context/summarizer.d.ts.map +1 -0
- package/dist/context/summarizer.js +157 -0
- package/dist/context/summarizer.js.map +1 -0
- package/dist/context/window.d.ts +104 -0
- package/dist/context/window.d.ts.map +1 -0
- package/dist/context/window.js +140 -0
- package/dist/context/window.js.map +1 -0
- package/dist/core/backgroundTasks.d.ts +87 -0
- package/dist/core/backgroundTasks.d.ts.map +1 -0
- package/dist/core/backgroundTasks.js +229 -0
- package/dist/core/backgroundTasks.js.map +1 -0
- package/dist/core/cache-keepalive.d.ts +37 -0
- package/dist/core/cache-keepalive.d.ts.map +1 -0
- package/dist/core/cache-keepalive.js +130 -0
- package/dist/core/cache-keepalive.js.map +1 -0
- package/dist/core/client.cache.test.d.ts +13 -0
- package/dist/core/client.cache.test.d.ts.map +1 -0
- package/dist/core/client.cache.test.js +315 -0
- package/dist/core/client.cache.test.js.map +1 -0
- package/dist/core/client.d.ts +306 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +1930 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/cwd-context.d.ts +53 -0
- package/dist/core/cwd-context.d.ts.map +1 -0
- package/dist/core/cwd-context.js +102 -0
- package/dist/core/cwd-context.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/loop.d.ts +401 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +3375 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/retryLogic.d.ts +84 -0
- package/dist/core/retryLogic.d.ts.map +1 -0
- package/dist/core/retryLogic.js +157 -0
- package/dist/core/retryLogic.js.map +1 -0
- package/dist/core/session-context.d.ts +24 -0
- package/dist/core/session-context.d.ts.map +1 -0
- package/dist/core/session-context.js +35 -0
- package/dist/core/session-context.js.map +1 -0
- package/dist/core/session.d.ts +229 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +729 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/validateToolResults.test.d.ts +6 -0
- package/dist/core/validateToolResults.test.d.ts.map +1 -0
- package/dist/core/validateToolResults.test.js +303 -0
- package/dist/core/validateToolResults.test.js.map +1 -0
- package/dist/daemon/alarm.d.ts +62 -0
- package/dist/daemon/alarm.d.ts.map +1 -0
- package/dist/daemon/alarm.js +145 -0
- package/dist/daemon/alarm.js.map +1 -0
- package/dist/daemon/config.d.ts +225 -0
- package/dist/daemon/config.d.ts.map +1 -0
- package/dist/daemon/config.js +104 -0
- package/dist/daemon/config.js.map +1 -0
- package/dist/daemon/executor.d.ts +52 -0
- package/dist/daemon/executor.d.ts.map +1 -0
- package/dist/daemon/executor.js +288 -0
- package/dist/daemon/executor.js.map +1 -0
- package/dist/daemon/index.d.ts +72 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +394 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/locked.d.ts +15 -0
- package/dist/daemon/locked.d.ts.map +1 -0
- package/dist/daemon/locked.js +16 -0
- package/dist/daemon/locked.js.map +1 -0
- package/dist/daemon/notifier.d.ts +25 -0
- package/dist/daemon/notifier.d.ts.map +1 -0
- package/dist/daemon/notifier.js +87 -0
- package/dist/daemon/notifier.js.map +1 -0
- package/dist/daemon/run-log.d.ts +43 -0
- package/dist/daemon/run-log.d.ts.map +1 -0
- package/dist/daemon/run-log.js +126 -0
- package/dist/daemon/run-log.js.map +1 -0
- package/dist/daemon/scheduler.d.ts +85 -0
- package/dist/daemon/scheduler.d.ts.map +1 -0
- package/dist/daemon/scheduler.js +379 -0
- package/dist/daemon/scheduler.js.map +1 -0
- package/dist/daemon/store.d.ts +94 -0
- package/dist/daemon/store.d.ts.map +1 -0
- package/dist/daemon/store.js +121 -0
- package/dist/daemon/store.js.map +1 -0
- package/dist/daemon/time-parser.d.ts +15 -0
- package/dist/daemon/time-parser.d.ts.map +1 -0
- package/dist/daemon/time-parser.js +68 -0
- package/dist/daemon/time-parser.js.map +1 -0
- package/dist/daemon/watcher.d.ts +34 -0
- package/dist/daemon/watcher.d.ts.map +1 -0
- package/dist/daemon/watcher.js +105 -0
- package/dist/daemon/watcher.js.map +1 -0
- package/dist/database/drivers/mongo.d.ts +14 -0
- package/dist/database/drivers/mongo.d.ts.map +1 -0
- package/dist/database/drivers/mongo.js +112 -0
- package/dist/database/drivers/mongo.js.map +1 -0
- package/dist/database/drivers/mysql.d.ts +13 -0
- package/dist/database/drivers/mysql.d.ts.map +1 -0
- package/dist/database/drivers/mysql.js +76 -0
- package/dist/database/drivers/mysql.js.map +1 -0
- package/dist/database/drivers/postgres.d.ts +13 -0
- package/dist/database/drivers/postgres.d.ts.map +1 -0
- package/dist/database/drivers/postgres.js +79 -0
- package/dist/database/drivers/postgres.js.map +1 -0
- package/dist/database/drivers/redis.d.ts +13 -0
- package/dist/database/drivers/redis.d.ts.map +1 -0
- package/dist/database/drivers/redis.js +100 -0
- package/dist/database/drivers/redis.js.map +1 -0
- package/dist/database/drivers/sqlite.d.ts +13 -0
- package/dist/database/drivers/sqlite.d.ts.map +1 -0
- package/dist/database/drivers/sqlite.js +89 -0
- package/dist/database/drivers/sqlite.js.map +1 -0
- package/dist/database/index.d.ts +21 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +97 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/types.d.ts +54 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +2 -0
- package/dist/database/types.js.map +1 -0
- package/dist/debugger/dap-client.d.ts +32 -0
- package/dist/debugger/dap-client.d.ts.map +1 -0
- package/dist/debugger/dap-client.js +108 -0
- package/dist/debugger/dap-client.js.map +1 -0
- package/dist/debugger/index.d.ts +30 -0
- package/dist/debugger/index.d.ts.map +1 -0
- package/dist/debugger/index.js +574 -0
- package/dist/debugger/index.js.map +1 -0
- package/dist/debugger/types.d.ts +59 -0
- package/dist/debugger/types.d.ts.map +1 -0
- package/dist/debugger/types.js +2 -0
- package/dist/debugger/types.js.map +1 -0
- package/dist/diagnostics/index.d.ts +72 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +1013 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/ear/index.d.ts +73 -0
- package/dist/ear/index.d.ts.map +1 -0
- package/dist/ear/index.js +114 -0
- package/dist/ear/index.js.map +1 -0
- package/dist/email-mcp/index.d.ts +12 -0
- package/dist/email-mcp/index.d.ts.map +1 -0
- package/dist/email-mcp/index.js +11 -0
- package/dist/email-mcp/index.js.map +1 -0
- package/dist/email-mcp/mcp-server.d.ts +18 -0
- package/dist/email-mcp/mcp-server.d.ts.map +1 -0
- package/dist/email-mcp/mcp-server.js +381 -0
- package/dist/email-mcp/mcp-server.js.map +1 -0
- package/dist/email-mcp/tools.d.ts +22 -0
- package/dist/email-mcp/tools.d.ts.map +1 -0
- package/dist/email-mcp/tools.js +251 -0
- package/dist/email-mcp/tools.js.map +1 -0
- package/dist/env/index.d.ts +27 -0
- package/dist/env/index.d.ts.map +1 -0
- package/dist/env/index.js +31 -0
- package/dist/env/index.js.map +1 -0
- package/dist/env/manager.d.ts +150 -0
- package/dist/env/manager.d.ts.map +1 -0
- package/dist/env/manager.js +290 -0
- package/dist/env/manager.js.map +1 -0
- package/dist/env/sensitive.d.ts +134 -0
- package/dist/env/sensitive.d.ts.map +1 -0
- package/dist/env/sensitive.js +255 -0
- package/dist/env/sensitive.js.map +1 -0
- package/dist/env/validator.d.ts +93 -0
- package/dist/env/validator.d.ts.map +1 -0
- package/dist/env/validator.js +122 -0
- package/dist/env/validator.js.map +1 -0
- package/dist/env/validators/builtin.d.ts +68 -0
- package/dist/env/validators/builtin.d.ts.map +1 -0
- package/dist/env/validators/builtin.js +294 -0
- package/dist/env/validators/builtin.js.map +1 -0
- package/dist/eye/camera.py +396 -0
- package/dist/eye/index.d.ts +70 -0
- package/dist/eye/index.d.ts.map +1 -0
- package/dist/eye/index.js +356 -0
- package/dist/eye/index.js.map +1 -0
- package/dist/fast-mode/index.d.ts +136 -0
- package/dist/fast-mode/index.d.ts.map +1 -0
- package/dist/fast-mode/index.js +390 -0
- package/dist/fast-mode/index.js.map +1 -0
- package/dist/fast-mode/provider.d.ts +10 -0
- package/dist/fast-mode/provider.d.ts.map +1 -0
- package/dist/fast-mode/provider.js +23 -0
- package/dist/fast-mode/provider.js.map +1 -0
- package/dist/feishu/bot.d.ts +71 -0
- package/dist/feishu/bot.d.ts.map +1 -0
- package/dist/feishu/bot.js +287 -0
- package/dist/feishu/bot.js.map +1 -0
- package/dist/feishu/config.d.ts +54 -0
- package/dist/feishu/config.d.ts.map +1 -0
- package/dist/feishu/config.js +100 -0
- package/dist/feishu/config.js.map +1 -0
- package/dist/feishu/index.d.ts +7 -0
- package/dist/feishu/index.d.ts.map +1 -0
- package/dist/feishu/index.js +5 -0
- package/dist/feishu/index.js.map +1 -0
- package/dist/feishu/message-handler.d.ts +42 -0
- package/dist/feishu/message-handler.d.ts.map +1 -0
- package/dist/feishu/message-handler.js +112 -0
- package/dist/feishu/message-handler.js.map +1 -0
- package/dist/feishu/session-manager.d.ts +57 -0
- package/dist/feishu/session-manager.d.ts.map +1 -0
- package/dist/feishu/session-manager.js +179 -0
- package/dist/feishu/session-manager.js.map +1 -0
- package/dist/feishu-cli.d.ts +34 -0
- package/dist/feishu-cli.d.ts.map +1 -0
- package/dist/feishu-cli.js +132 -0
- package/dist/feishu-cli.js.map +1 -0
- package/dist/git/analysis.d.ts +135 -0
- package/dist/git/analysis.d.ts.map +1 -0
- package/dist/git/analysis.js +259 -0
- package/dist/git/analysis.js.map +1 -0
- package/dist/git/core.d.ts +175 -0
- package/dist/git/core.d.ts.map +1 -0
- package/dist/git/core.js +349 -0
- package/dist/git/core.js.map +1 -0
- package/dist/git/ignore.d.ts +74 -0
- package/dist/git/ignore.d.ts.map +1 -0
- package/dist/git/ignore.js +257 -0
- package/dist/git/ignore.js.map +1 -0
- package/dist/git/index.d.ts +37 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +48 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/operations.d.ts +96 -0
- package/dist/git/operations.d.ts.map +1 -0
- package/dist/git/operations.js +288 -0
- package/dist/git/operations.js.map +1 -0
- package/dist/git/safety.d.ts +107 -0
- package/dist/git/safety.d.ts.map +1 -0
- package/dist/git/safety.js +293 -0
- package/dist/git/safety.js.map +1 -0
- package/dist/github/index.d.ts +58 -0
- package/dist/github/index.d.ts.map +1 -0
- package/dist/github/index.js +246 -0
- package/dist/github/index.js.map +1 -0
- package/dist/goals/goal-daemon.d.ts +54 -0
- package/dist/goals/goal-daemon.d.ts.map +1 -0
- package/dist/goals/goal-daemon.js +171 -0
- package/dist/goals/goal-daemon.js.map +1 -0
- package/dist/goals/goal-evaluator.d.ts +28 -0
- package/dist/goals/goal-evaluator.d.ts.map +1 -0
- package/dist/goals/goal-evaluator.js +117 -0
- package/dist/goals/goal-evaluator.js.map +1 -0
- package/dist/goals/goal-planner.d.ts +21 -0
- package/dist/goals/goal-planner.d.ts.map +1 -0
- package/dist/goals/goal-planner.js +80 -0
- package/dist/goals/goal-planner.js.map +1 -0
- package/dist/goals/goal-store.d.ts +31 -0
- package/dist/goals/goal-store.d.ts.map +1 -0
- package/dist/goals/goal-store.js +238 -0
- package/dist/goals/goal-store.js.map +1 -0
- package/dist/goals/index.d.ts +15 -0
- package/dist/goals/index.d.ts.map +1 -0
- package/dist/goals/index.js +22 -0
- package/dist/goals/index.js.map +1 -0
- package/dist/goals/storage.d.ts +83 -0
- package/dist/goals/storage.d.ts.map +1 -0
- package/dist/goals/storage.js +235 -0
- package/dist/goals/storage.js.map +1 -0
- package/dist/goals/types.d.ts +138 -0
- package/dist/goals/types.d.ts.map +1 -0
- package/dist/goals/types.js +5 -0
- package/dist/goals/types.js.map +1 -0
- package/dist/hooks/blueprint-hooks.d.ts +52 -0
- package/dist/hooks/blueprint-hooks.d.ts.map +1 -0
- package/dist/hooks/blueprint-hooks.js +75 -0
- package/dist/hooks/blueprint-hooks.js.map +1 -0
- package/dist/hooks/index.d.ts +421 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +1225 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.test.d.ts +33 -0
- package/dist/hooks/index.test.d.ts.map +1 -0
- package/dist/hooks/index.test.js +199 -0
- package/dist/hooks/index.test.js.map +1 -0
- package/dist/i18n/index.d.ts +25 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +96 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en.d.ts +786 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/en.js +865 -0
- package/dist/i18n/locales/en.js.map +1 -0
- package/dist/i18n/locales/zh.d.ts +7 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -0
- package/dist/i18n/locales/zh.js +862 -0
- package/dist/i18n/locales/zh.js.map +1 -0
- package/dist/ide/index.d.ts +81 -0
- package/dist/ide/index.d.ts.map +1 -0
- package/dist/ide/index.js +371 -0
- package/dist/ide/index.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/index.d.ts +120 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +178 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lsp/index.d.ts +12 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +20 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/manager.d.ts +307 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +1012 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/map/index.d.ts +2 -0
- package/dist/map/index.d.ts.map +1 -0
- package/dist/map/index.js +2 -0
- package/dist/map/index.js.map +1 -0
- package/dist/map/types.d.ts +264 -0
- package/dist/map/types.d.ts.map +1 -0
- package/dist/map/types.js +6 -0
- package/dist/map/types.js.map +1 -0
- package/dist/mcp/adapter.d.ts +217 -0
- package/dist/mcp/adapter.d.ts.map +1 -0
- package/dist/mcp/adapter.js +527 -0
- package/dist/mcp/adapter.js.map +1 -0
- package/dist/mcp/auto-discovery.d.ts +303 -0
- package/dist/mcp/auto-discovery.d.ts.map +1 -0
- package/dist/mcp/auto-discovery.js +1009 -0
- package/dist/mcp/auto-discovery.js.map +1 -0
- package/dist/mcp/cancellation.d.ts +258 -0
- package/dist/mcp/cancellation.d.ts.map +1 -0
- package/dist/mcp/cancellation.js +478 -0
- package/dist/mcp/cancellation.js.map +1 -0
- package/dist/mcp/config.d.ts +521 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +694 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/connection.d.ts +228 -0
- package/dist/mcp/connection.d.ts.map +1 -0
- package/dist/mcp/connection.js +707 -0
- package/dist/mcp/connection.js.map +1 -0
- package/dist/mcp/discovery.d.ts +128 -0
- package/dist/mcp/discovery.d.ts.map +1 -0
- package/dist/mcp/discovery.js +577 -0
- package/dist/mcp/discovery.js.map +1 -0
- package/dist/mcp/errors.d.ts +273 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +566 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +10 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +29 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/integration.d.ts +71 -0
- package/dist/mcp/integration.d.ts.map +1 -0
- package/dist/mcp/integration.js +198 -0
- package/dist/mcp/integration.js.map +1 -0
- package/dist/mcp/lifecycle.d.ts +261 -0
- package/dist/mcp/lifecycle.d.ts.map +1 -0
- package/dist/mcp/lifecycle.js +714 -0
- package/dist/mcp/lifecycle.js.map +1 -0
- package/dist/mcp/logging.d.ts +166 -0
- package/dist/mcp/logging.d.ts.map +1 -0
- package/dist/mcp/logging.js +346 -0
- package/dist/mcp/logging.js.map +1 -0
- package/dist/mcp/notifications.d.ts +221 -0
- package/dist/mcp/notifications.d.ts.map +1 -0
- package/dist/mcp/notifications.js +356 -0
- package/dist/mcp/notifications.js.map +1 -0
- package/dist/mcp/protocol.d.ts +516 -0
- package/dist/mcp/protocol.d.ts.map +1 -0
- package/dist/mcp/protocol.js +490 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/resources.d.ts +197 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +432 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/roots.d.ts +149 -0
- package/dist/mcp/roots.d.ts.map +1 -0
- package/dist/mcp/roots.js +368 -0
- package/dist/mcp/roots.js.map +1 -0
- package/dist/mcp/sampling.d.ts +170 -0
- package/dist/mcp/sampling.d.ts.map +1 -0
- package/dist/mcp/sampling.js +373 -0
- package/dist/mcp/sampling.js.map +1 -0
- package/dist/mcp/tools.d.ts +347 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +773 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/websocket-connection.d.ts +164 -0
- package/dist/mcp/websocket-connection.d.ts.map +1 -0
- package/dist/mcp/websocket-connection.js +503 -0
- package/dist/mcp/websocket-connection.js.map +1 -0
- package/dist/mcp-cli.d.ts +26 -0
- package/dist/mcp-cli.d.ts.map +1 -0
- package/dist/mcp-cli.js +366 -0
- package/dist/mcp-cli.js.map +1 -0
- package/dist/media/image.d.ts +91 -0
- package/dist/media/image.d.ts.map +1 -0
- package/dist/media/image.js +400 -0
- package/dist/media/image.js.map +1 -0
- package/dist/media/index.d.ts +66 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +122 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/mime.d.ts +23 -0
- package/dist/media/mime.d.ts.map +1 -0
- package/dist/media/mime.js +110 -0
- package/dist/media/mime.js.map +1 -0
- package/dist/media/office.d.ts +93 -0
- package/dist/media/office.d.ts.map +1 -0
- package/dist/media/office.js +735 -0
- package/dist/media/office.js.map +1 -0
- package/dist/media/pdf.d.ts +132 -0
- package/dist/media/pdf.d.ts.map +1 -0
- package/dist/media/pdf.js +281 -0
- package/dist/media/pdf.js.map +1 -0
- package/dist/media/svg.d.ts +55 -0
- package/dist/media/svg.d.ts.map +1 -0
- package/dist/media/svg.js +217 -0
- package/dist/media/svg.js.map +1 -0
- package/dist/memory/embedding-cache.d.ts +40 -0
- package/dist/memory/embedding-cache.d.ts.map +1 -0
- package/dist/memory/embedding-cache.js +105 -0
- package/dist/memory/embedding-cache.js.map +1 -0
- package/dist/memory/embedding-provider.d.ts +36 -0
- package/dist/memory/embedding-provider.d.ts.map +1 -0
- package/dist/memory/embedding-provider.js +105 -0
- package/dist/memory/embedding-provider.js.map +1 -0
- package/dist/memory/hybrid-search.d.ts +58 -0
- package/dist/memory/hybrid-search.d.ts.map +1 -0
- package/dist/memory/hybrid-search.js +68 -0
- package/dist/memory/hybrid-search.js.map +1 -0
- package/dist/memory/index.d.ts +15 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +12 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/long-term-store.d.ts +131 -0
- package/dist/memory/long-term-store.d.ts.map +1 -0
- package/dist/memory/long-term-store.js +701 -0
- package/dist/memory/long-term-store.js.map +1 -0
- package/dist/memory/memory-search.d.ts +134 -0
- package/dist/memory/memory-search.d.ts.map +1 -0
- package/dist/memory/memory-search.js +338 -0
- package/dist/memory/memory-search.js.map +1 -0
- package/dist/memory/memory-sync.d.ts +66 -0
- package/dist/memory/memory-sync.d.ts.map +1 -0
- package/dist/memory/memory-sync.js +429 -0
- package/dist/memory/memory-sync.js.map +1 -0
- package/dist/memory/mmr.d.ts +34 -0
- package/dist/memory/mmr.d.ts.map +1 -0
- package/dist/memory/mmr.js +101 -0
- package/dist/memory/mmr.js.map +1 -0
- package/dist/memory/notebook.d.ts +80 -0
- package/dist/memory/notebook.d.ts.map +1 -0
- package/dist/memory/notebook.js +320 -0
- package/dist/memory/notebook.js.map +1 -0
- package/dist/memory/query-expansion.d.ts +22 -0
- package/dist/memory/query-expansion.d.ts.map +1 -0
- package/dist/memory/query-expansion.js +60 -0
- package/dist/memory/query-expansion.js.map +1 -0
- package/dist/memory/types.d.ts +16 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +5 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/models/config.d.ts +85 -0
- package/dist/models/config.d.ts.map +1 -0
- package/dist/models/config.js +427 -0
- package/dist/models/config.js.map +1 -0
- package/dist/models/fallback.d.ts +80 -0
- package/dist/models/fallback.d.ts.map +1 -0
- package/dist/models/fallback.js +215 -0
- package/dist/models/fallback.js.map +1 -0
- package/dist/models/index.d.ts +12 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +11 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/quota.d.ts +121 -0
- package/dist/models/quota.d.ts.map +1 -0
- package/dist/models/quota.js +397 -0
- package/dist/models/quota.js.map +1 -0
- package/dist/models/stats.d.ts +96 -0
- package/dist/models/stats.d.ts.map +1 -0
- package/dist/models/stats.js +224 -0
- package/dist/models/stats.js.map +1 -0
- package/dist/models/subagent-config.d.ts +119 -0
- package/dist/models/subagent-config.d.ts.map +1 -0
- package/dist/models/subagent-config.js +267 -0
- package/dist/models/subagent-config.js.map +1 -0
- package/dist/models/thinking.d.ts +102 -0
- package/dist/models/thinking.d.ts.map +1 -0
- package/dist/models/thinking.js +213 -0
- package/dist/models/thinking.js.map +1 -0
- package/dist/models/types.d.ts +250 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +33 -0
- package/dist/models/types.js.map +1 -0
- package/dist/network/audit-log.d.ts +93 -0
- package/dist/network/audit-log.d.ts.map +1 -0
- package/dist/network/audit-log.js +319 -0
- package/dist/network/audit-log.js.map +1 -0
- package/dist/network/discovery.d.ts +91 -0
- package/dist/network/discovery.d.ts.map +1 -0
- package/dist/network/discovery.js +398 -0
- package/dist/network/discovery.js.map +1 -0
- package/dist/network/global-proxy.d.ts +19 -0
- package/dist/network/global-proxy.d.ts.map +1 -0
- package/dist/network/global-proxy.js +81 -0
- package/dist/network/global-proxy.js.map +1 -0
- package/dist/network/identity.d.ts +58 -0
- package/dist/network/identity.d.ts.map +1 -0
- package/dist/network/identity.js +267 -0
- package/dist/network/identity.js.map +1 -0
- package/dist/network/index.d.ts +153 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +916 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/permission.d.ts +60 -0
- package/dist/network/permission.d.ts.map +1 -0
- package/dist/network/permission.js +124 -0
- package/dist/network/permission.js.map +1 -0
- package/dist/network/project-probe.d.ts +12 -0
- package/dist/network/project-probe.d.ts.map +1 -0
- package/dist/network/project-probe.js +74 -0
- package/dist/network/project-probe.js.map +1 -0
- package/dist/network/protocol.d.ts +59 -0
- package/dist/network/protocol.d.ts.map +1 -0
- package/dist/network/protocol.js +158 -0
- package/dist/network/protocol.js.map +1 -0
- package/dist/network/proxy.d.ts +93 -0
- package/dist/network/proxy.d.ts.map +1 -0
- package/dist/network/proxy.js +228 -0
- package/dist/network/proxy.js.map +1 -0
- package/dist/network/retry.d.ts +44 -0
- package/dist/network/retry.d.ts.map +1 -0
- package/dist/network/retry.js +110 -0
- package/dist/network/retry.js.map +1 -0
- package/dist/network/router.d.ts +36 -0
- package/dist/network/router.d.ts.map +1 -0
- package/dist/network/router.js +73 -0
- package/dist/network/router.js.map +1 -0
- package/dist/network/timeout.d.ts +59 -0
- package/dist/network/timeout.d.ts.map +1 -0
- package/dist/network/timeout.js +120 -0
- package/dist/network/timeout.js.map +1 -0
- package/dist/network/transport.d.ts +97 -0
- package/dist/network/transport.d.ts.map +1 -0
- package/dist/network/transport.js +397 -0
- package/dist/network/transport.js.map +1 -0
- package/dist/network/types.d.ts +282 -0
- package/dist/network/types.d.ts.map +1 -0
- package/dist/network/types.js +31 -0
- package/dist/network/types.js.map +1 -0
- package/dist/notifications/index.d.ts +161 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +341 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/organization/index.d.ts +125 -0
- package/dist/organization/index.d.ts.map +1 -0
- package/dist/organization/index.js +237 -0
- package/dist/organization/index.js.map +1 -0
- package/dist/permissions/elevated-commands.d.ts +38 -0
- package/dist/permissions/elevated-commands.d.ts.map +1 -0
- package/dist/permissions/elevated-commands.js +256 -0
- package/dist/permissions/elevated-commands.js.map +1 -0
- package/dist/permissions/index.d.ts +120 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +689 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/rule-parser.d.ts +396 -0
- package/dist/permissions/rule-parser.d.ts.map +1 -0
- package/dist/permissions/rule-parser.js +990 -0
- package/dist/permissions/rule-parser.js.map +1 -0
- package/dist/permissions/rule-parser.test.d.ts +15 -0
- package/dist/permissions/rule-parser.test.d.ts.map +1 -0
- package/dist/permissions/rule-parser.test.js +489 -0
- package/dist/permissions/rule-parser.test.js.map +1 -0
- package/dist/permissions/shell-security.d.ts +128 -0
- package/dist/permissions/shell-security.d.ts.map +1 -0
- package/dist/permissions/shell-security.js +669 -0
- package/dist/permissions/shell-security.js.map +1 -0
- package/dist/permissions/shell-security.test.d.ts +7 -0
- package/dist/permissions/shell-security.test.d.ts.map +1 -0
- package/dist/permissions/shell-security.test.js +286 -0
- package/dist/permissions/shell-security.test.js.map +1 -0
- package/dist/permissions/tools.d.ts +255 -0
- package/dist/permissions/tools.d.ts.map +1 -0
- package/dist/permissions/tools.js +733 -0
- package/dist/permissions/tools.js.map +1 -0
- package/dist/permissions/tools.test.d.ts +11 -0
- package/dist/permissions/tools.test.d.ts.map +1 -0
- package/dist/permissions/tools.test.js +530 -0
- package/dist/permissions/tools.test.js.map +1 -0
- package/dist/permissions/ui-integration.d.ts +69 -0
- package/dist/permissions/ui-integration.d.ts.map +1 -0
- package/dist/permissions/ui-integration.js +129 -0
- package/dist/permissions/ui-integration.js.map +1 -0
- package/dist/permissions/ui.d.ts +188 -0
- package/dist/permissions/ui.d.ts.map +1 -0
- package/dist/permissions/ui.js +590 -0
- package/dist/permissions/ui.js.map +1 -0
- package/dist/plan/comparison.d.ts +67 -0
- package/dist/plan/comparison.d.ts.map +1 -0
- package/dist/plan/comparison.js +451 -0
- package/dist/plan/comparison.js.map +1 -0
- package/dist/plan/index.d.ts +91 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +151 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/persistence.d.ts +131 -0
- package/dist/plan/persistence.d.ts.map +1 -0
- package/dist/plan/persistence.js +781 -0
- package/dist/plan/persistence.js.map +1 -0
- package/dist/plan/types.d.ts +353 -0
- package/dist/plan/types.d.ts.map +1 -0
- package/dist/plan/types.js +6 -0
- package/dist/plan/types.js.map +1 -0
- package/dist/plugins/cli.d.ts +14 -0
- package/dist/plugins/cli.d.ts.map +1 -0
- package/dist/plugins/cli.js +1050 -0
- package/dist/plugins/cli.js.map +1 -0
- package/dist/plugins/index.d.ts +621 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +1978 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/marketplace.d.ts +120 -0
- package/dist/plugins/marketplace.d.ts.map +1 -0
- package/dist/plugins/marketplace.js +630 -0
- package/dist/plugins/marketplace.js.map +1 -0
- package/dist/prompt/attachments.d.ts +94 -0
- package/dist/prompt/attachments.d.ts.map +1 -0
- package/dist/prompt/attachments.js +486 -0
- package/dist/prompt/attachments.js.map +1 -0
- package/dist/prompt/builder.d.ts +45 -0
- package/dist/prompt/builder.d.ts.map +1 -0
- package/dist/prompt/builder.js +298 -0
- package/dist/prompt/builder.js.map +1 -0
- package/dist/prompt/cache.d.ts +71 -0
- package/dist/prompt/cache.d.ts.map +1 -0
- package/dist/prompt/cache.js +150 -0
- package/dist/prompt/cache.js.map +1 -0
- package/dist/prompt/index.d.ts +10 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +9 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/templates.d.ts +216 -0
- package/dist/prompt/templates.d.ts.map +1 -0
- package/dist/prompt/templates.js +670 -0
- package/dist/prompt/templates.js.map +1 -0
- package/dist/prompt/types.d.ts +234 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +19 -0
- package/dist/prompt/types.js.map +1 -0
- package/dist/providers/cli.d.ts +14 -0
- package/dist/providers/cli.d.ts.map +1 -0
- package/dist/providers/cli.js +466 -0
- package/dist/providers/cli.js.map +1 -0
- package/dist/providers/index.d.ts +128 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +662 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/vertex.d.ts +174 -0
- package/dist/providers/vertex.d.ts.map +1 -0
- package/dist/providers/vertex.js +499 -0
- package/dist/providers/vertex.js.map +1 -0
- package/dist/proxy/ollama-adapter.d.ts +41 -0
- package/dist/proxy/ollama-adapter.d.ts.map +1 -0
- package/dist/proxy/ollama-adapter.js +669 -0
- package/dist/proxy/ollama-adapter.js.map +1 -0
- package/dist/proxy/server.d.ts +63 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +1160 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/proxy-cli.d.ts +19 -0
- package/dist/proxy-cli.d.ts.map +1 -0
- package/dist/proxy-cli.js +308 -0
- package/dist/proxy-cli.js.map +1 -0
- package/dist/ratelimit/index.d.ts +252 -0
- package/dist/ratelimit/index.d.ts.map +1 -0
- package/dist/ratelimit/index.js +580 -0
- package/dist/ratelimit/index.js.map +1 -0
- package/dist/renderer/index.d.ts +75 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +383 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/tree-render.d.ts +172 -0
- package/dist/renderer/tree-render.d.ts.map +1 -0
- package/dist/renderer/tree-render.js +397 -0
- package/dist/renderer/tree-render.js.map +1 -0
- package/dist/rewind/fileHistory.d.ts +140 -0
- package/dist/rewind/fileHistory.d.ts.map +1 -0
- package/dist/rewind/fileHistory.js +326 -0
- package/dist/rewind/fileHistory.js.map +1 -0
- package/dist/rewind/index.d.ts +8 -0
- package/dist/rewind/index.d.ts.map +1 -0
- package/dist/rewind/index.js +8 -0
- package/dist/rewind/index.js.map +1 -0
- package/dist/rewind/rewindManager.d.ts +98 -0
- package/dist/rewind/rewindManager.d.ts.map +1 -0
- package/dist/rewind/rewindManager.js +199 -0
- package/dist/rewind/rewindManager.js.map +1 -0
- package/dist/rules/index.d.ts +69 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +410 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/sandbox/bubblewrap.d.ts +157 -0
- package/dist/sandbox/bubblewrap.d.ts.map +1 -0
- package/dist/sandbox/bubblewrap.js +637 -0
- package/dist/sandbox/bubblewrap.js.map +1 -0
- package/dist/sandbox/config.d.ts +497 -0
- package/dist/sandbox/config.d.ts.map +1 -0
- package/dist/sandbox/config.js +696 -0
- package/dist/sandbox/config.js.map +1 -0
- package/dist/sandbox/docker.d.ts +104 -0
- package/dist/sandbox/docker.d.ts.map +1 -0
- package/dist/sandbox/docker.js +347 -0
- package/dist/sandbox/docker.js.map +1 -0
- package/dist/sandbox/executor.d.ts +68 -0
- package/dist/sandbox/executor.d.ts.map +1 -0
- package/dist/sandbox/executor.js +341 -0
- package/dist/sandbox/executor.js.map +1 -0
- package/dist/sandbox/filesystem.d.ts +146 -0
- package/dist/sandbox/filesystem.d.ts.map +1 -0
- package/dist/sandbox/filesystem.js +501 -0
- package/dist/sandbox/filesystem.js.map +1 -0
- package/dist/sandbox/index.d.ts +21 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +21 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/network.d.ts +174 -0
- package/dist/sandbox/network.d.ts.map +1 -0
- package/dist/sandbox/network.js +487 -0
- package/dist/sandbox/network.js.map +1 -0
- package/dist/sandbox/resource-limits.d.ts +83 -0
- package/dist/sandbox/resource-limits.d.ts.map +1 -0
- package/dist/sandbox/resource-limits.js +305 -0
- package/dist/sandbox/resource-limits.js.map +1 -0
- package/dist/sandbox/seatbelt.d.ts +70 -0
- package/dist/sandbox/seatbelt.d.ts.map +1 -0
- package/dist/sandbox/seatbelt.js +256 -0
- package/dist/sandbox/seatbelt.js.map +1 -0
- package/dist/search/ripgrep.d.ts +82 -0
- package/dist/search/ripgrep.d.ts.map +1 -0
- package/dist/search/ripgrep.js +399 -0
- package/dist/search/ripgrep.js.map +1 -0
- package/dist/security/skill-scanner.d.ts +18 -0
- package/dist/security/skill-scanner.d.ts.map +1 -0
- package/dist/security/skill-scanner.js +115 -0
- package/dist/security/skill-scanner.js.map +1 -0
- package/dist/session/cleanup.d.ts +62 -0
- package/dist/session/cleanup.d.ts.map +1 -0
- package/dist/session/cleanup.js +218 -0
- package/dist/session/cleanup.js.map +1 -0
- package/dist/session/index.d.ts +584 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +1910 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/list.d.ts +150 -0
- package/dist/session/list.d.ts.map +1 -0
- package/dist/session/list.js +807 -0
- package/dist/session/list.js.map +1 -0
- package/dist/session/resume.d.ts +103 -0
- package/dist/session/resume.d.ts.map +1 -0
- package/dist/session/resume.js +173 -0
- package/dist/session/resume.js.map +1 -0
- package/dist/skills/builtin/skill-hub/SKILL.md +51 -0
- package/dist/skills/builtin/tool-discovery/SKILL.md +194 -0
- package/dist/skills/hub.d.ts +54 -0
- package/dist/skills/hub.d.ts.map +1 -0
- package/dist/skills/hub.js +251 -0
- package/dist/skills/hub.js.map +1 -0
- package/dist/streaming/index.d.ts +115 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +249 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming/message-stream.d.ts +237 -0
- package/dist/streaming/message-stream.d.ts.map +1 -0
- package/dist/streaming/message-stream.js +480 -0
- package/dist/streaming/message-stream.js.map +1 -0
- package/dist/streaming/sse.d.ts +94 -0
- package/dist/streaming/sse.d.ts.map +1 -0
- package/dist/streaming/sse.js +314 -0
- package/dist/streaming/sse.js.map +1 -0
- package/dist/teams/index.d.ts +7 -0
- package/dist/teams/index.d.ts.map +1 -0
- package/dist/teams/index.js +7 -0
- package/dist/teams/index.js.map +1 -0
- package/dist/teams/storage.d.ts +94 -0
- package/dist/teams/storage.d.ts.map +1 -0
- package/dist/teams/storage.js +350 -0
- package/dist/teams/storage.js.map +1 -0
- package/dist/teams/tmux.d.ts +122 -0
- package/dist/teams/tmux.d.ts.map +1 -0
- package/dist/teams/tmux.js +419 -0
- package/dist/teams/tmux.js.map +1 -0
- package/dist/teams/types.d.ts +139 -0
- package/dist/teams/types.d.ts.map +1 -0
- package/dist/teams/types.js +8 -0
- package/dist/teams/types.js.map +1 -0
- package/dist/telemetry/index.d.ts +215 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +776 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/teleport/index.d.ts +43 -0
- package/dist/teleport/index.d.ts.map +1 -0
- package/dist/teleport/index.js +71 -0
- package/dist/teleport/index.js.map +1 -0
- package/dist/teleport/session.d.ts +78 -0
- package/dist/teleport/session.d.ts.map +1 -0
- package/dist/teleport/session.js +273 -0
- package/dist/teleport/session.js.map +1 -0
- package/dist/teleport/types.d.ts +93 -0
- package/dist/teleport/types.d.ts.map +1 -0
- package/dist/teleport/types.js +6 -0
- package/dist/teleport/types.js.map +1 -0
- package/dist/teleport/validation.d.ts +30 -0
- package/dist/teleport/validation.d.ts.map +1 -0
- package/dist/teleport/validation.js +124 -0
- package/dist/teleport/validation.js.map +1 -0
- package/dist/tools/agent-teams.d.ts +26 -0
- package/dist/tools/agent-teams.d.ts.map +1 -0
- package/dist/tools/agent-teams.js +171 -0
- package/dist/tools/agent-teams.js.map +1 -0
- package/dist/tools/agent.d.ts +223 -0
- package/dist/tools/agent.d.ts.map +1 -0
- package/dist/tools/agent.js +1540 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/ask.d.ts +87 -0
- package/dist/tools/ask.d.ts.map +1 -0
- package/dist/tools/ask.js +572 -0
- package/dist/tools/ask.js.map +1 -0
- package/dist/tools/base.d.ts +89 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +199 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/bash-history.d.ts +83 -0
- package/dist/tools/bash-history.d.ts.map +1 -0
- package/dist/tools/bash-history.js +245 -0
- package/dist/tools/bash-history.js.map +1 -0
- package/dist/tools/bash.d.ts +214 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +1823 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/blueprint.d.ts +91 -0
- package/dist/tools/blueprint.d.ts.map +1 -0
- package/dist/tools/blueprint.js +618 -0
- package/dist/tools/blueprint.js.map +1 -0
- package/dist/tools/browser.d.ts +28 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +776 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/create-tool.d.ts +63 -0
- package/dist/tools/create-tool.d.ts.map +1 -0
- package/dist/tools/create-tool.js +230 -0
- package/dist/tools/create-tool.js.map +1 -0
- package/dist/tools/database.d.ts +12 -0
- package/dist/tools/database.d.ts.map +1 -0
- package/dist/tools/database.js +223 -0
- package/dist/tools/database.js.map +1 -0
- package/dist/tools/dispatch-worker.d.ts +46 -0
- package/dist/tools/dispatch-worker.d.ts.map +1 -0
- package/dist/tools/dispatch-worker.js +276 -0
- package/dist/tools/dispatch-worker.js.map +1 -0
- package/dist/tools/ear.d.ts +25 -0
- package/dist/tools/ear.d.ts.map +1 -0
- package/dist/tools/ear.js +43 -0
- package/dist/tools/ear.js.map +1 -0
- package/dist/tools/eye.d.ts +29 -0
- package/dist/tools/eye.d.ts.map +1 -0
- package/dist/tools/eye.js +104 -0
- package/dist/tools/eye.js.map +1 -0
- package/dist/tools/file.d.ts +164 -0
- package/dist/tools/file.d.ts.map +1 -0
- package/dist/tools/file.js +1638 -0
- package/dist/tools/file.js.map +1 -0
- package/dist/tools/generate-blueprint.d.ts +62 -0
- package/dist/tools/generate-blueprint.d.ts.map +1 -0
- package/dist/tools/generate-blueprint.js +141 -0
- package/dist/tools/generate-blueprint.js.map +1 -0
- package/dist/tools/generate-design.d.ts +27 -0
- package/dist/tools/generate-design.d.ts.map +1 -0
- package/dist/tools/generate-design.js +66 -0
- package/dist/tools/generate-design.js.map +1 -0
- package/dist/tools/goal.d.ts +56 -0
- package/dist/tools/goal.d.ts.map +1 -0
- package/dist/tools/goal.js +298 -0
- package/dist/tools/goal.js.map +1 -0
- package/dist/tools/index.d.ts +53 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +183 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/mcp-manage.d.ts +32 -0
- package/dist/tools/mcp-manage.d.ts.map +1 -0
- package/dist/tools/mcp-manage.js +61 -0
- package/dist/tools/mcp-manage.js.map +1 -0
- package/dist/tools/mcp.d.ts +311 -0
- package/dist/tools/mcp.d.ts.map +1 -0
- package/dist/tools/mcp.js +1696 -0
- package/dist/tools/mcp.js.map +1 -0
- package/dist/tools/memory-search.d.ts +26 -0
- package/dist/tools/memory-search.d.ts.map +1 -0
- package/dist/tools/memory-search.js +89 -0
- package/dist/tools/memory-search.js.map +1 -0
- package/dist/tools/network-agent.d.ts +55 -0
- package/dist/tools/network-agent.d.ts.map +1 -0
- package/dist/tools/network-agent.js +349 -0
- package/dist/tools/network-agent.js.map +1 -0
- package/dist/tools/notebook-write.d.ts +23 -0
- package/dist/tools/notebook-write.d.ts.map +1 -0
- package/dist/tools/notebook-write.js +86 -0
- package/dist/tools/notebook-write.js.map +1 -0
- package/dist/tools/notebook.d.ts +46 -0
- package/dist/tools/notebook.d.ts.map +1 -0
- package/dist/tools/notebook.js +335 -0
- package/dist/tools/notebook.js.map +1 -0
- package/dist/tools/output-persistence.d.ts +73 -0
- package/dist/tools/output-persistence.d.ts.map +1 -0
- package/dist/tools/output-persistence.js +258 -0
- package/dist/tools/output-persistence.js.map +1 -0
- package/dist/tools/planmode.d.ts +73 -0
- package/dist/tools/planmode.d.ts.map +1 -0
- package/dist/tools/planmode.js +464 -0
- package/dist/tools/planmode.js.map +1 -0
- package/dist/tools/sandbox.d.ts +192 -0
- package/dist/tools/sandbox.d.ts.map +1 -0
- package/dist/tools/sandbox.js +932 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/schedule.d.ts +65 -0
- package/dist/tools/schedule.d.ts.map +1 -0
- package/dist/tools/schedule.js +537 -0
- package/dist/tools/schedule.js.map +1 -0
- package/dist/tools/search.d.ts +48 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +568 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/self-evolve.d.ts +53 -0
- package/dist/tools/self-evolve.d.ts.map +1 -0
- package/dist/tools/self-evolve.js +241 -0
- package/dist/tools/self-evolve.js.map +1 -0
- package/dist/tools/skill.d.ts +182 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +1274 -0
- package/dist/tools/skill.js.map +1 -0
- package/dist/tools/start-lead-agent.d.ts +103 -0
- package/dist/tools/start-lead-agent.d.ts.map +1 -0
- package/dist/tools/start-lead-agent.js +243 -0
- package/dist/tools/start-lead-agent.js.map +1 -0
- package/dist/tools/structured-output.d.ts +80 -0
- package/dist/tools/structured-output.d.ts.map +1 -0
- package/dist/tools/structured-output.js +113 -0
- package/dist/tools/structured-output.js.map +1 -0
- package/dist/tools/submit-e2e-result.d.ts +57 -0
- package/dist/tools/submit-e2e-result.d.ts.map +1 -0
- package/dist/tools/submit-e2e-result.js +161 -0
- package/dist/tools/submit-e2e-result.js.map +1 -0
- package/dist/tools/submit-review.d.ts +42 -0
- package/dist/tools/submit-review.d.ts.map +1 -0
- package/dist/tools/submit-review.js +122 -0
- package/dist/tools/submit-review.js.map +1 -0
- package/dist/tools/task-status.d.ts +33 -0
- package/dist/tools/task-status.d.ts.map +1 -0
- package/dist/tools/task-status.js +86 -0
- package/dist/tools/task-status.js.map +1 -0
- package/dist/tools/task-storage.d.ts +165 -0
- package/dist/tools/task-storage.d.ts.map +1 -0
- package/dist/tools/task-storage.js +354 -0
- package/dist/tools/task-storage.js.map +1 -0
- package/dist/tools/task-v2.d.ts +38 -0
- package/dist/tools/task-v2.d.ts.map +1 -0
- package/dist/tools/task-v2.js +472 -0
- package/dist/tools/task-v2.js.map +1 -0
- package/dist/tools/team.d.ts +51 -0
- package/dist/tools/team.d.ts.map +1 -0
- package/dist/tools/team.js +441 -0
- package/dist/tools/team.js.map +1 -0
- package/dist/tools/todo.d.ts +30 -0
- package/dist/tools/todo.d.ts.map +1 -0
- package/dist/tools/todo.js +204 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/trigger-e2e-test.d.ts +62 -0
- package/dist/tools/trigger-e2e-test.d.ts.map +1 -0
- package/dist/tools/trigger-e2e-test.js +228 -0
- package/dist/tools/trigger-e2e-test.js.map +1 -0
- package/dist/tools/update-task-plan.d.ts +43 -0
- package/dist/tools/update-task-plan.d.ts.map +1 -0
- package/dist/tools/update-task-plan.js +214 -0
- package/dist/tools/update-task-plan.js.map +1 -0
- package/dist/tools/web.d.ts +78 -0
- package/dist/tools/web.d.ts.map +1 -0
- package/dist/tools/web.js +535 -0
- package/dist/tools/web.js.map +1 -0
- package/dist/trust/index.d.ts +165 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +408 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/types/config.d.ts +1259 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +245 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +389 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +670 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +30 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +761 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +10 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/results.d.ts +583 -0
- package/dist/types/results.d.ts.map +1 -0
- package/dist/types/results.js +111 -0
- package/dist/types/results.js.map +1 -0
- package/dist/types/tools.d.ts +734 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +9 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/ui/App.d.ts +17 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +977 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/ChromeSettings.d.ts +18 -0
- package/dist/ui/ChromeSettings.d.ts.map +1 -0
- package/dist/ui/ChromeSettings.js +224 -0
- package/dist/ui/ChromeSettings.js.map +1 -0
- package/dist/ui/LoginSelector.d.ts +29 -0
- package/dist/ui/LoginSelector.d.ts.map +1 -0
- package/dist/ui/LoginSelector.js +168 -0
- package/dist/ui/LoginSelector.js.map +1 -0
- package/dist/ui/McpSettings.d.ts +29 -0
- package/dist/ui/McpSettings.d.ts.map +1 -0
- package/dist/ui/McpSettings.js +689 -0
- package/dist/ui/McpSettings.js.map +1 -0
- package/dist/ui/PluginsDialog.d.ts +21 -0
- package/dist/ui/PluginsDialog.d.ts.map +1 -0
- package/dist/ui/PluginsDialog.js +923 -0
- package/dist/ui/PluginsDialog.js.map +1 -0
- package/dist/ui/autocomplete/bash-history.d.ts +58 -0
- package/dist/ui/autocomplete/bash-history.d.ts.map +1 -0
- package/dist/ui/autocomplete/bash-history.js +196 -0
- package/dist/ui/autocomplete/bash-history.js.map +1 -0
- package/dist/ui/autocomplete/commands.d.ts +25 -0
- package/dist/ui/autocomplete/commands.d.ts.map +1 -0
- package/dist/ui/autocomplete/commands.js +535 -0
- package/dist/ui/autocomplete/commands.js.map +1 -0
- package/dist/ui/autocomplete/example.d.ts +10 -0
- package/dist/ui/autocomplete/example.d.ts.map +1 -0
- package/dist/ui/autocomplete/example.js +118 -0
- package/dist/ui/autocomplete/example.js.map +1 -0
- package/dist/ui/autocomplete/files.d.ts +27 -0
- package/dist/ui/autocomplete/files.d.ts.map +1 -0
- package/dist/ui/autocomplete/files.js +127 -0
- package/dist/ui/autocomplete/files.js.map +1 -0
- package/dist/ui/autocomplete/index.d.ts +25 -0
- package/dist/ui/autocomplete/index.d.ts.map +1 -0
- package/dist/ui/autocomplete/index.js +85 -0
- package/dist/ui/autocomplete/index.js.map +1 -0
- package/dist/ui/autocomplete/mentions.d.ts +29 -0
- package/dist/ui/autocomplete/mentions.d.ts.map +1 -0
- package/dist/ui/autocomplete/mentions.js +170 -0
- package/dist/ui/autocomplete/mentions.js.map +1 -0
- package/dist/ui/autocomplete/types.d.ts +58 -0
- package/dist/ui/autocomplete/types.d.ts.map +1 -0
- package/dist/ui/autocomplete/types.js +110 -0
- package/dist/ui/autocomplete/types.js.map +1 -0
- package/dist/ui/components/AxonMdImportDialog.d.ts +79 -0
- package/dist/ui/components/AxonMdImportDialog.d.ts.map +1 -0
- package/dist/ui/components/AxonMdImportDialog.js +420 -0
- package/dist/ui/components/AxonMdImportDialog.js.map +1 -0
- package/dist/ui/components/BackgroundTasksPanel.d.ts +16 -0
- package/dist/ui/components/BackgroundTasksPanel.d.ts.map +1 -0
- package/dist/ui/components/BackgroundTasksPanel.js +90 -0
- package/dist/ui/components/BackgroundTasksPanel.js.map +1 -0
- package/dist/ui/components/BreathingLight.d.ts +68 -0
- package/dist/ui/components/BreathingLight.d.ts.map +1 -0
- package/dist/ui/components/BreathingLight.js +110 -0
- package/dist/ui/components/BreathingLight.js.map +1 -0
- package/dist/ui/components/DiffView.d.ts +21 -0
- package/dist/ui/components/DiffView.d.ts.map +1 -0
- package/dist/ui/components/DiffView.js +387 -0
- package/dist/ui/components/DiffView.js.map +1 -0
- package/dist/ui/components/Header.d.ts +38 -0
- package/dist/ui/components/Header.d.ts.map +1 -0
- package/dist/ui/components/Header.js +163 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/HistorySearch.d.ts +18 -0
- package/dist/ui/components/HistorySearch.d.ts.map +1 -0
- package/dist/ui/components/HistorySearch.js +59 -0
- package/dist/ui/components/HistorySearch.js.map +1 -0
- package/dist/ui/components/HiveConsole.d.ts +45 -0
- package/dist/ui/components/HiveConsole.d.ts.map +1 -0
- package/dist/ui/components/HiveConsole.js +166 -0
- package/dist/ui/components/HiveConsole.js.map +1 -0
- package/dist/ui/components/HiveConsole.test.d.ts +8 -0
- package/dist/ui/components/HiveConsole.test.d.ts.map +1 -0
- package/dist/ui/components/HiveConsole.test.js +330 -0
- package/dist/ui/components/HiveConsole.test.js.map +1 -0
- package/dist/ui/components/Input.d.ts +25 -0
- package/dist/ui/components/Input.d.ts.map +1 -0
- package/dist/ui/components/Input.js +1097 -0
- package/dist/ui/components/Input.js.map +1 -0
- package/dist/ui/components/Message.d.ts +18 -0
- package/dist/ui/components/Message.d.ts.map +1 -0
- package/dist/ui/components/Message.js +212 -0
- package/dist/ui/components/Message.js.map +1 -0
- package/dist/ui/components/MessageSelector.d.ts +66 -0
- package/dist/ui/components/MessageSelector.d.ts.map +1 -0
- package/dist/ui/components/MessageSelector.js +272 -0
- package/dist/ui/components/MessageSelector.js.map +1 -0
- package/dist/ui/components/ModelSelector.d.ts +27 -0
- package/dist/ui/components/ModelSelector.d.ts.map +1 -0
- package/dist/ui/components/ModelSelector.js +135 -0
- package/dist/ui/components/ModelSelector.js.map +1 -0
- package/dist/ui/components/PermissionPrompt.d.ts +44 -0
- package/dist/ui/components/PermissionPrompt.d.ts.map +1 -0
- package/dist/ui/components/PermissionPrompt.js +416 -0
- package/dist/ui/components/PermissionPrompt.js.map +1 -0
- package/dist/ui/components/ProgressBar.d.ts +61 -0
- package/dist/ui/components/ProgressBar.d.ts.map +1 -0
- package/dist/ui/components/ProgressBar.js +174 -0
- package/dist/ui/components/ProgressBar.js.map +1 -0
- package/dist/ui/components/ResumeSession.d.ts +27 -0
- package/dist/ui/components/ResumeSession.d.ts.map +1 -0
- package/dist/ui/components/ResumeSession.js +330 -0
- package/dist/ui/components/ResumeSession.js.map +1 -0
- package/dist/ui/components/SelectInput.d.ts +22 -0
- package/dist/ui/components/SelectInput.d.ts.map +1 -0
- package/dist/ui/components/SelectInput.js +84 -0
- package/dist/ui/components/SelectInput.js.map +1 -0
- package/dist/ui/components/ShortcutHelp.d.ts +12 -0
- package/dist/ui/components/ShortcutHelp.d.ts.map +1 -0
- package/dist/ui/components/ShortcutHelp.js +55 -0
- package/dist/ui/components/ShortcutHelp.js.map +1 -0
- package/dist/ui/components/SkillsDialog.d.ts +12 -0
- package/dist/ui/components/SkillsDialog.d.ts.map +1 -0
- package/dist/ui/components/SkillsDialog.js +239 -0
- package/dist/ui/components/SkillsDialog.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +81 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +165 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/StatsPanel.d.ts +20 -0
- package/dist/ui/components/StatsPanel.d.ts.map +1 -0
- package/dist/ui/components/StatsPanel.js +584 -0
- package/dist/ui/components/StatsPanel.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +43 -0
- package/dist/ui/components/StatusBar.d.ts.map +1 -0
- package/dist/ui/components/StatusBar.js +160 -0
- package/dist/ui/components/StatusBar.js.map +1 -0
- package/dist/ui/components/StatusBar.test.d.ts +10 -0
- package/dist/ui/components/StatusBar.test.d.ts.map +1 -0
- package/dist/ui/components/StatusBar.test.js +70 -0
- package/dist/ui/components/StatusBar.test.js.map +1 -0
- package/dist/ui/components/TodoList.d.ts +25 -0
- package/dist/ui/components/TodoList.d.ts.map +1 -0
- package/dist/ui/components/TodoList.js +146 -0
- package/dist/ui/components/TodoList.js.map +1 -0
- package/dist/ui/components/ToolCall.d.ts +19 -0
- package/dist/ui/components/ToolCall.d.ts.map +1 -0
- package/dist/ui/components/ToolCall.js +196 -0
- package/dist/ui/components/ToolCall.js.map +1 -0
- package/dist/ui/components/TrustDialog.d.ts +35 -0
- package/dist/ui/components/TrustDialog.d.ts.map +1 -0
- package/dist/ui/components/TrustDialog.js +163 -0
- package/dist/ui/components/TrustDialog.js.map +1 -0
- package/dist/ui/components/UpdateNotification.d.ts +11 -0
- package/dist/ui/components/UpdateNotification.d.ts.map +1 -0
- package/dist/ui/components/UpdateNotification.js +66 -0
- package/dist/ui/components/UpdateNotification.js.map +1 -0
- package/dist/ui/components/WelcomeScreen.d.ts +22 -0
- package/dist/ui/components/WelcomeScreen.d.ts.map +1 -0
- package/dist/ui/components/WelcomeScreen.js +156 -0
- package/dist/ui/components/WelcomeScreen.js.map +1 -0
- package/dist/ui/components/index.d.ts +35 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +25 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/hooks/index.d.ts +12 -0
- package/dist/ui/hooks/index.d.ts.map +1 -0
- package/dist/ui/hooks/index.js +9 -0
- package/dist/ui/hooks/index.js.map +1 -0
- package/dist/ui/hooks/useAutoScroll.d.ts +22 -0
- package/dist/ui/hooks/useAutoScroll.d.ts.map +1 -0
- package/dist/ui/hooks/useAutoScroll.js +46 -0
- package/dist/ui/hooks/useAutoScroll.js.map +1 -0
- package/dist/ui/hooks/useAxonMdImport.d.ts +57 -0
- package/dist/ui/hooks/useAxonMdImport.d.ts.map +1 -0
- package/dist/ui/hooks/useAxonMdImport.js +248 -0
- package/dist/ui/hooks/useAxonMdImport.js.map +1 -0
- package/dist/ui/hooks/useGlobalKeybindings.d.ts +60 -0
- package/dist/ui/hooks/useGlobalKeybindings.d.ts.map +1 -0
- package/dist/ui/hooks/useGlobalKeybindings.js +460 -0
- package/dist/ui/hooks/useGlobalKeybindings.js.map +1 -0
- package/dist/ui/hooks/useRewind.d.ts +44 -0
- package/dist/ui/hooks/useRewind.d.ts.map +1 -0
- package/dist/ui/hooks/useRewind.js +67 -0
- package/dist/ui/hooks/useRewind.js.map +1 -0
- package/dist/ui/hooks/useTerminalSize.d.ts +32 -0
- package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -0
- package/dist/ui/hooks/useTerminalSize.js +70 -0
- package/dist/ui/hooks/useTerminalSize.js.map +1 -0
- package/dist/ui/index.d.ts +29 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +42 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/ink-v2/dom-renderer.d.ts +58 -0
- package/dist/ui/ink-v2/dom-renderer.d.ts.map +1 -0
- package/dist/ui/ink-v2/dom-renderer.js +295 -0
- package/dist/ui/ink-v2/dom-renderer.js.map +1 -0
- package/dist/ui/ink-v2/frame.d.ts +25 -0
- package/dist/ui/ink-v2/frame.d.ts.map +1 -0
- package/dist/ui/ink-v2/frame.js +120 -0
- package/dist/ui/ink-v2/frame.js.map +1 -0
- package/dist/ui/ink-v2/index.d.ts +92 -0
- package/dist/ui/ink-v2/index.d.ts.map +1 -0
- package/dist/ui/ink-v2/index.js +185 -0
- package/dist/ui/ink-v2/index.js.map +1 -0
- package/dist/ui/ink-v2/output.d.ts +43 -0
- package/dist/ui/ink-v2/output.d.ts.map +1 -0
- package/dist/ui/ink-v2/output.js +154 -0
- package/dist/ui/ink-v2/output.js.map +1 -0
- package/dist/ui/ink-v2/renderer.d.ts +49 -0
- package/dist/ui/ink-v2/renderer.d.ts.map +1 -0
- package/dist/ui/ink-v2/renderer.js +411 -0
- package/dist/ui/ink-v2/renderer.js.map +1 -0
- package/dist/ui/ink-v2/screen.d.ts +65 -0
- package/dist/ui/ink-v2/screen.d.ts.map +1 -0
- package/dist/ui/ink-v2/screen.js +260 -0
- package/dist/ui/ink-v2/screen.js.map +1 -0
- package/dist/ui/ink-v2/style-pool.d.ts +28 -0
- package/dist/ui/ink-v2/style-pool.d.ts.map +1 -0
- package/dist/ui/ink-v2/style-pool.js +50 -0
- package/dist/ui/ink-v2/style-pool.js.map +1 -0
- package/dist/ui/ink-v2/types.d.ts +138 -0
- package/dist/ui/ink-v2/types.d.ts.map +1 -0
- package/dist/ui/ink-v2/types.js +11 -0
- package/dist/ui/ink-v2/types.js.map +1 -0
- package/dist/ui/markdown-renderer.d.ts +35 -0
- package/dist/ui/markdown-renderer.d.ts.map +1 -0
- package/dist/ui/markdown-renderer.js +369 -0
- package/dist/ui/markdown-renderer.js.map +1 -0
- package/dist/ui/spinner-verbs.d.ts +15 -0
- package/dist/ui/spinner-verbs.d.ts.map +1 -0
- package/dist/ui/spinner-verbs.js +75 -0
- package/dist/ui/spinner-verbs.js.map +1 -0
- package/dist/ui/utils/history-manager.d.ts +41 -0
- package/dist/ui/utils/history-manager.d.ts.map +1 -0
- package/dist/ui/utils/history-manager.js +109 -0
- package/dist/ui/utils/history-manager.js.map +1 -0
- package/dist/ui/utils/index.d.ts +9 -0
- package/dist/ui/utils/index.d.ts.map +1 -0
- package/dist/ui/utils/index.js +10 -0
- package/dist/ui/utils/index.js.map +1 -0
- package/dist/ui/utils/kitty-keyboard.d.ts +239 -0
- package/dist/ui/utils/kitty-keyboard.d.ts.map +1 -0
- package/dist/ui/utils/kitty-keyboard.js +341 -0
- package/dist/ui/utils/kitty-keyboard.js.map +1 -0
- package/dist/ui/utils/string-width.d.ts +36 -0
- package/dist/ui/utils/string-width.d.ts.map +1 -0
- package/dist/ui/utils/string-width.js +339 -0
- package/dist/ui/utils/string-width.js.map +1 -0
- package/dist/ui/utils/syntaxHighlight.d.ts +94 -0
- package/dist/ui/utils/syntaxHighlight.d.ts.map +1 -0
- package/dist/ui/utils/syntaxHighlight.js +415 -0
- package/dist/ui/utils/syntaxHighlight.js.map +1 -0
- package/dist/ui/utils/terminal.d.ts +145 -0
- package/dist/ui/utils/terminal.d.ts.map +1 -0
- package/dist/ui/utils/terminal.js +229 -0
- package/dist/ui/utils/terminal.js.map +1 -0
- package/dist/updater/index.d.ts +115 -0
- package/dist/updater/index.d.ts.map +1 -0
- package/dist/updater/index.js +546 -0
- package/dist/updater/index.js.map +1 -0
- package/dist/utils/AppError.d.ts +24 -0
- package/dist/utils/AppError.d.ts.map +1 -0
- package/dist/utils/AppError.js +33 -0
- package/dist/utils/AppError.js.map +1 -0
- package/dist/utils/AppError.test.d.ts +2 -0
- package/dist/utils/AppError.test.d.ts.map +1 -0
- package/dist/utils/AppError.test.js +257 -0
- package/dist/utils/AppError.test.js.map +1 -0
- package/dist/utils/attribution.d.ts +111 -0
- package/dist/utils/attribution.d.ts.map +1 -0
- package/dist/utils/attribution.js +219 -0
- package/dist/utils/attribution.js.map +1 -0
- package/dist/utils/editor.d.ts +19 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +115 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/env-check.d.ts +78 -0
- package/dist/utils/env-check.d.ts.map +1 -0
- package/dist/utils/env-check.js +114 -0
- package/dist/utils/env-check.js.map +1 -0
- package/dist/utils/error-watcher.d.ts +78 -0
- package/dist/utils/error-watcher.d.ts.map +1 -0
- package/dist/utils/error-watcher.js +355 -0
- package/dist/utils/error-watcher.js.map +1 -0
- package/dist/utils/git-helper.d.ts +55 -0
- package/dist/utils/git-helper.d.ts.map +1 -0
- package/dist/utils/git-helper.js +238 -0
- package/dist/utils/git-helper.js.map +1 -0
- package/dist/utils/index.d.ts +188 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +472 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +117 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +458 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-manager.d.ts +134 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +325 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/platform.d.ts +283 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +748 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/pr-status.d.ts +50 -0
- package/dist/utils/pr-status.d.ts.map +1 -0
- package/dist/utils/pr-status.js +182 -0
- package/dist/utils/pr-status.js.map +1 -0
- package/dist/utils/retry.d.ts +86 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +202 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/temp-dir.d.ts +31 -0
- package/dist/utils/temp-dir.d.ts.map +1 -0
- package/dist/utils/temp-dir.js +141 -0
- package/dist/utils/temp-dir.js.map +1 -0
- package/dist/utils/terminal-setup.d.ts +31 -0
- package/dist/utils/terminal-setup.d.ts.map +1 -0
- package/dist/utils/terminal-setup.js +224 -0
- package/dist/utils/terminal-setup.js.map +1 -0
- package/dist/utils/terminal-tab.d.ts +15 -0
- package/dist/utils/terminal-tab.d.ts.map +1 -0
- package/dist/utils/terminal-tab.js +173 -0
- package/dist/utils/terminal-tab.js.map +1 -0
- package/dist/utils/token-estimate.d.ts +26 -0
- package/dist/utils/token-estimate.d.ts.map +1 -0
- package/dist/utils/token-estimate.js +62 -0
- package/dist/utils/token-estimate.js.map +1 -0
- package/dist/utils/truncated-buffer.d.ts +70 -0
- package/dist/utils/truncated-buffer.d.ts.map +1 -0
- package/dist/utils/truncated-buffer.js +124 -0
- package/dist/utils/truncated-buffer.js.map +1 -0
- package/dist/version.d.ts +30 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +32 -0
- package/dist/version.js.map +1 -0
- package/dist/web/index.d.ts +7 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +7 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/server/api-manager.d.ts +53 -0
- package/dist/web/server/api-manager.d.ts.map +1 -0
- package/dist/web/server/api-manager.js +271 -0
- package/dist/web/server/api-manager.js.map +1 -0
- package/dist/web/server/channels/adapters/discord.d.ts +41 -0
- package/dist/web/server/channels/adapters/discord.d.ts.map +1 -0
- package/dist/web/server/channels/adapters/discord.js +326 -0
- package/dist/web/server/channels/adapters/discord.js.map +1 -0
- package/dist/web/server/channels/adapters/feishu.d.ts +38 -0
- package/dist/web/server/channels/adapters/feishu.d.ts.map +1 -0
- package/dist/web/server/channels/adapters/feishu.js +442 -0
- package/dist/web/server/channels/adapters/feishu.js.map +1 -0
- package/dist/web/server/channels/adapters/slack-bot.d.ts +30 -0
- package/dist/web/server/channels/adapters/slack-bot.d.ts.map +1 -0
- package/dist/web/server/channels/adapters/slack-bot.js +226 -0
- package/dist/web/server/channels/adapters/slack-bot.js.map +1 -0
- package/dist/web/server/channels/adapters/telegram.d.ts +32 -0
- package/dist/web/server/channels/adapters/telegram.d.ts.map +1 -0
- package/dist/web/server/channels/adapters/telegram.js +261 -0
- package/dist/web/server/channels/adapters/telegram.js.map +1 -0
- package/dist/web/server/channels/adapters/whatsapp.d.ts +48 -0
- package/dist/web/server/channels/adapters/whatsapp.d.ts.map +1 -0
- package/dist/web/server/channels/adapters/whatsapp.js +316 -0
- package/dist/web/server/channels/adapters/whatsapp.js.map +1 -0
- package/dist/web/server/channels/bridge.d.ts +103 -0
- package/dist/web/server/channels/bridge.d.ts.map +1 -0
- package/dist/web/server/channels/bridge.js +728 -0
- package/dist/web/server/channels/bridge.js.map +1 -0
- package/dist/web/server/channels/index.d.ts +71 -0
- package/dist/web/server/channels/index.d.ts.map +1 -0
- package/dist/web/server/channels/index.js +307 -0
- package/dist/web/server/channels/index.js.map +1 -0
- package/dist/web/server/channels/types.d.ts +249 -0
- package/dist/web/server/channels/types.d.ts.map +1 -0
- package/dist/web/server/channels/types.js +8 -0
- package/dist/web/server/channels/types.js.map +1 -0
- package/dist/web/server/checkpoint-manager.d.ts +152 -0
- package/dist/web/server/checkpoint-manager.d.ts.map +1 -0
- package/dist/web/server/checkpoint-manager.js +359 -0
- package/dist/web/server/checkpoint-manager.js.map +1 -0
- package/dist/web/server/connectors/index.d.ts +115 -0
- package/dist/web/server/connectors/index.d.ts.map +1 -0
- package/dist/web/server/connectors/index.js +759 -0
- package/dist/web/server/connectors/index.js.map +1 -0
- package/dist/web/server/connectors/providers.d.ts +6 -0
- package/dist/web/server/connectors/providers.d.ts.map +1 -0
- package/dist/web/server/connectors/providers.js +238 -0
- package/dist/web/server/connectors/providers.js.map +1 -0
- package/dist/web/server/connectors/types.d.ts +79 -0
- package/dist/web/server/connectors/types.d.ts.map +1 -0
- package/dist/web/server/connectors/types.js +5 -0
- package/dist/web/server/connectors/types.js.map +1 -0
- package/dist/web/server/conversation.d.ts +593 -0
- package/dist/web/server/conversation.d.ts.map +1 -0
- package/dist/web/server/conversation.js +5170 -0
- package/dist/web/server/conversation.js.map +1 -0
- package/dist/web/server/database/swarm-logs.d.ts +150 -0
- package/dist/web/server/database/swarm-logs.d.ts.map +1 -0
- package/dist/web/server/database/swarm-logs.js +456 -0
- package/dist/web/server/database/swarm-logs.js.map +1 -0
- package/dist/web/server/doctor.d.ts +59 -0
- package/dist/web/server/doctor.d.ts.map +1 -0
- package/dist/web/server/doctor.js +666 -0
- package/dist/web/server/doctor.js.map +1 -0
- package/dist/web/server/evolve-state.d.ts +30 -0
- package/dist/web/server/evolve-state.d.ts.map +1 -0
- package/dist/web/server/evolve-state.js +54 -0
- package/dist/web/server/evolve-state.js.map +1 -0
- package/dist/web/server/git-manager.d.ts +373 -0
- package/dist/web/server/git-manager.d.ts.map +1 -0
- package/dist/web/server/git-manager.js +1556 -0
- package/dist/web/server/git-manager.js.map +1 -0
- package/dist/web/server/handlers/types.d.ts +95 -0
- package/dist/web/server/handlers/types.d.ts.map +1 -0
- package/dist/web/server/handlers/types.js +22 -0
- package/dist/web/server/handlers/types.js.map +1 -0
- package/dist/web/server/index.d.ts +41 -0
- package/dist/web/server/index.d.ts.map +1 -0
- package/dist/web/server/index.js +935 -0
- package/dist/web/server/index.js.map +1 -0
- package/dist/web/server/oauth-manager.d.ts +89 -0
- package/dist/web/server/oauth-manager.d.ts.map +1 -0
- package/dist/web/server/oauth-manager.js +361 -0
- package/dist/web/server/oauth-manager.js.map +1 -0
- package/dist/web/server/permission-handler.d.ts +170 -0
- package/dist/web/server/permission-handler.d.ts.map +1 -0
- package/dist/web/server/permission-handler.js +591 -0
- package/dist/web/server/permission-handler.js.map +1 -0
- package/dist/web/server/project-suggestions.d.ts +39 -0
- package/dist/web/server/project-suggestions.d.ts.map +1 -0
- package/dist/web/server/project-suggestions.js +365 -0
- package/dist/web/server/project-suggestions.js.map +1 -0
- package/dist/web/server/prompt-snippets.d.ts +92 -0
- package/dist/web/server/prompt-snippets.d.ts.map +1 -0
- package/dist/web/server/prompt-snippets.js +206 -0
- package/dist/web/server/prompt-snippets.js.map +1 -0
- package/dist/web/server/routes/__tests__/artifacts-api.test.d.ts +2 -0
- package/dist/web/server/routes/__tests__/artifacts-api.test.d.ts.map +1 -0
- package/dist/web/server/routes/__tests__/artifacts-api.test.js +572 -0
- package/dist/web/server/routes/__tests__/artifacts-api.test.js.map +1 -0
- package/dist/web/server/routes/agent-api.d.ts +7 -0
- package/dist/web/server/routes/agent-api.d.ts.map +1 -0
- package/dist/web/server/routes/agent-api.js +225 -0
- package/dist/web/server/routes/agent-api.js.map +1 -0
- package/dist/web/server/routes/ai-editor.d.ts +13 -0
- package/dist/web/server/routes/ai-editor.d.ts.map +1 -0
- package/dist/web/server/routes/ai-editor.js +2079 -0
- package/dist/web/server/routes/ai-editor.js.map +1 -0
- package/dist/web/server/routes/ai-hover.d.ts +10 -0
- package/dist/web/server/routes/ai-hover.d.ts.map +1 -0
- package/dist/web/server/routes/ai-hover.js +359 -0
- package/dist/web/server/routes/ai-hover.js.map +1 -0
- package/dist/web/server/routes/api.d.ts +7 -0
- package/dist/web/server/routes/api.d.ts.map +1 -0
- package/dist/web/server/routes/api.js +1200 -0
- package/dist/web/server/routes/api.js.map +1 -0
- package/dist/web/server/routes/artifacts-api.d.ts +15 -0
- package/dist/web/server/routes/artifacts-api.d.ts.map +1 -0
- package/dist/web/server/routes/artifacts-api.js +231 -0
- package/dist/web/server/routes/artifacts-api.js.map +1 -0
- package/dist/web/server/routes/auth.d.ts +7 -0
- package/dist/web/server/routes/auth.d.ts.map +1 -0
- package/dist/web/server/routes/auth.js +292 -0
- package/dist/web/server/routes/auth.js.map +1 -0
- package/dist/web/server/routes/autocomplete-api.d.ts +10 -0
- package/dist/web/server/routes/autocomplete-api.d.ts.map +1 -0
- package/dist/web/server/routes/autocomplete-api.js +302 -0
- package/dist/web/server/routes/autocomplete-api.js.map +1 -0
- package/dist/web/server/routes/axon-cloud.d.ts +7 -0
- package/dist/web/server/routes/axon-cloud.d.ts.map +1 -0
- package/dist/web/server/routes/axon-cloud.js +160 -0
- package/dist/web/server/routes/axon-cloud.js.map +1 -0
- package/dist/web/server/routes/blueprint-api.d.ts +459 -0
- package/dist/web/server/routes/blueprint-api.d.ts.map +1 -0
- package/dist/web/server/routes/blueprint-api.js +6057 -0
- package/dist/web/server/routes/blueprint-api.js.map +1 -0
- package/dist/web/server/routes/blueprint-requirement-api.d.ts +11 -0
- package/dist/web/server/routes/blueprint-requirement-api.d.ts.map +1 -0
- package/dist/web/server/routes/blueprint-requirement-api.js +91 -0
- package/dist/web/server/routes/blueprint-requirement-api.js.map +1 -0
- package/dist/web/server/routes/code-parser.d.ts +14 -0
- package/dist/web/server/routes/code-parser.d.ts.map +1 -0
- package/dist/web/server/routes/code-parser.js +191 -0
- package/dist/web/server/routes/code-parser.js.map +1 -0
- package/dist/web/server/routes/config-api.d.ts +14 -0
- package/dist/web/server/routes/config-api.d.ts.map +1 -0
- package/dist/web/server/routes/config-api.js +670 -0
- package/dist/web/server/routes/config-api.js.map +1 -0
- package/dist/web/server/routes/connectors-api.d.ts +7 -0
- package/dist/web/server/routes/connectors-api.d.ts.map +1 -0
- package/dist/web/server/routes/connectors-api.js +267 -0
- package/dist/web/server/routes/connectors-api.js.map +1 -0
- package/dist/web/server/routes/data-flow-analyzer.d.ts +60 -0
- package/dist/web/server/routes/data-flow-analyzer.d.ts.map +1 -0
- package/dist/web/server/routes/data-flow-analyzer.js +220 -0
- package/dist/web/server/routes/data-flow-analyzer.js.map +1 -0
- package/dist/web/server/routes/download-proxy.d.ts +16 -0
- package/dist/web/server/routes/download-proxy.d.ts.map +1 -0
- package/dist/web/server/routes/download-proxy.js +114 -0
- package/dist/web/server/routes/download-proxy.js.map +1 -0
- package/dist/web/server/routes/file-api.d.ts +18 -0
- package/dist/web/server/routes/file-api.d.ts.map +1 -0
- package/dist/web/server/routes/file-api.js +1514 -0
- package/dist/web/server/routes/file-api.js.map +1 -0
- package/dist/web/server/routes/lsp-analyzer.d.ts +76 -0
- package/dist/web/server/routes/lsp-analyzer.d.ts.map +1 -0
- package/dist/web/server/routes/lsp-analyzer.js +457 -0
- package/dist/web/server/routes/lsp-analyzer.js.map +1 -0
- package/dist/web/server/routes/lsp-api.d.ts +8 -0
- package/dist/web/server/routes/lsp-api.d.ts.map +1 -0
- package/dist/web/server/routes/lsp-api.js +283 -0
- package/dist/web/server/routes/lsp-api.js.map +1 -0
- package/dist/web/server/routes/mcp-cli-api.d.ts +19 -0
- package/dist/web/server/routes/mcp-cli-api.d.ts.map +1 -0
- package/dist/web/server/routes/mcp-cli-api.js +223 -0
- package/dist/web/server/routes/mcp-cli-api.js.map +1 -0
- package/dist/web/server/routes/network-api.d.ts +8 -0
- package/dist/web/server/routes/network-api.d.ts.map +1 -0
- package/dist/web/server/routes/network-api.js +367 -0
- package/dist/web/server/routes/network-api.js.map +1 -0
- package/dist/web/server/routes/notebook-api.d.ts +12 -0
- package/dist/web/server/routes/notebook-api.d.ts.map +1 -0
- package/dist/web/server/routes/notebook-api.js +164 -0
- package/dist/web/server/routes/notebook-api.js.map +1 -0
- package/dist/web/server/routes/port-forward.d.ts +20 -0
- package/dist/web/server/routes/port-forward.d.ts.map +1 -0
- package/dist/web/server/routes/port-forward.js +155 -0
- package/dist/web/server/routes/port-forward.js.map +1 -0
- package/dist/web/server/routes/project-map-generator.d.ts +126 -0
- package/dist/web/server/routes/project-map-generator.d.ts.map +1 -0
- package/dist/web/server/routes/project-map-generator.js +800 -0
- package/dist/web/server/routes/project-map-generator.js.map +1 -0
- package/dist/web/server/routes/schedule-api.d.ts +7 -0
- package/dist/web/server/routes/schedule-api.d.ts.map +1 -0
- package/dist/web/server/routes/schedule-api.js +324 -0
- package/dist/web/server/routes/schedule-api.js.map +1 -0
- package/dist/web/server/routes/symbol-classifier.d.ts +71 -0
- package/dist/web/server/routes/symbol-classifier.d.ts.map +1 -0
- package/dist/web/server/routes/symbol-classifier.js +190 -0
- package/dist/web/server/routes/symbol-classifier.js.map +1 -0
- package/dist/web/server/services/axon-cloud-service.d.ts +95 -0
- package/dist/web/server/services/axon-cloud-service.d.ts.map +1 -0
- package/dist/web/server/services/axon-cloud-service.js +210 -0
- package/dist/web/server/services/axon-cloud-service.js.map +1 -0
- package/dist/web/server/services/config-service.d.ts +436 -0
- package/dist/web/server/services/config-service.d.ts.map +1 -0
- package/dist/web/server/services/config-service.js +872 -0
- package/dist/web/server/services/config-service.js.map +1 -0
- package/dist/web/server/services/gemini-image-service.d.ts +80 -0
- package/dist/web/server/services/gemini-image-service.d.ts.map +1 -0
- package/dist/web/server/services/gemini-image-service.js +373 -0
- package/dist/web/server/services/gemini-image-service.js.map +1 -0
- package/dist/web/server/services/mode-presets.d.ts +40 -0
- package/dist/web/server/services/mode-presets.d.ts.map +1 -0
- package/dist/web/server/services/mode-presets.js +167 -0
- package/dist/web/server/services/mode-presets.js.map +1 -0
- package/dist/web/server/services/proxy-service.d.ts +59 -0
- package/dist/web/server/services/proxy-service.d.ts.map +1 -0
- package/dist/web/server/services/proxy-service.js +132 -0
- package/dist/web/server/services/proxy-service.js.map +1 -0
- package/dist/web/server/session-manager.d.ts +152 -0
- package/dist/web/server/session-manager.d.ts.map +1 -0
- package/dist/web/server/session-manager.js +421 -0
- package/dist/web/server/session-manager.js.map +1 -0
- package/dist/web/server/slash-commands.d.ts +46 -0
- package/dist/web/server/slash-commands.d.ts.map +1 -0
- package/dist/web/server/slash-commands.js +774 -0
- package/dist/web/server/slash-commands.js.map +1 -0
- package/dist/web/server/task-manager.d.ts +190 -0
- package/dist/web/server/task-manager.d.ts.map +1 -0
- package/dist/web/server/task-manager.js +596 -0
- package/dist/web/server/task-manager.js.map +1 -0
- package/dist/web/server/terminal-manager.d.ts +50 -0
- package/dist/web/server/terminal-manager.d.ts.map +1 -0
- package/dist/web/server/terminal-manager.js +274 -0
- package/dist/web/server/terminal-manager.js.map +1 -0
- package/dist/web/server/trpc/appRouter.d.ts +429 -0
- package/dist/web/server/trpc/appRouter.d.ts.map +1 -0
- package/dist/web/server/trpc/appRouter.js +18 -0
- package/dist/web/server/trpc/appRouter.js.map +1 -0
- package/dist/web/server/trpc/index.d.ts +29 -0
- package/dist/web/server/trpc/index.d.ts.map +1 -0
- package/dist/web/server/trpc/index.js +25 -0
- package/dist/web/server/trpc/index.js.map +1 -0
- package/dist/web/server/trpc/routers/blueprint.d.ts +162 -0
- package/dist/web/server/trpc/routers/blueprint.d.ts.map +1 -0
- package/dist/web/server/trpc/routers/blueprint.js +225 -0
- package/dist/web/server/trpc/routers/blueprint.js.map +1 -0
- package/dist/web/server/trpc/routers/coordinator.d.ts +247 -0
- package/dist/web/server/trpc/routers/coordinator.d.ts.map +1 -0
- package/dist/web/server/trpc/routers/coordinator.js +363 -0
- package/dist/web/server/trpc/routers/coordinator.js.map +1 -0
- package/dist/web/server/trpc/routers/execution.d.ts +106 -0
- package/dist/web/server/trpc/routers/execution.d.ts.map +1 -0
- package/dist/web/server/trpc/routers/execution.js +176 -0
- package/dist/web/server/trpc/routers/execution.js.map +1 -0
- package/dist/web/server/user-interaction.d.ts +61 -0
- package/dist/web/server/user-interaction.d.ts.map +1 -0
- package/dist/web/server/user-interaction.js +133 -0
- package/dist/web/server/user-interaction.js.map +1 -0
- package/dist/web/server/web-auth.d.ts +125 -0
- package/dist/web/server/web-auth.d.ts.map +1 -0
- package/dist/web/server/web-auth.js +364 -0
- package/dist/web/server/web-auth.js.map +1 -0
- package/dist/web/server/web-scheduler.d.ts +96 -0
- package/dist/web/server/web-scheduler.d.ts.map +1 -0
- package/dist/web/server/web-scheduler.js +762 -0
- package/dist/web/server/web-scheduler.js.map +1 -0
- package/dist/web/server/websocket-git-handlers.d.ts +107 -0
- package/dist/web/server/websocket-git-handlers.d.ts.map +1 -0
- package/dist/web/server/websocket-git-handlers.js +855 -0
- package/dist/web/server/websocket-git-handlers.js.map +1 -0
- package/dist/web/server/websocket.d.ts +18 -0
- package/dist/web/server/websocket.d.ts.map +1 -0
- package/dist/web/server/websocket.js +6158 -0
- package/dist/web/server/websocket.js.map +1 -0
- package/dist/web/shared/types.d.ts +4100 -0
- package/dist/web/shared/types.d.ts.map +1 -0
- package/dist/web/shared/types.js +123 -0
- package/dist/web/shared/types.js.map +1 -0
- package/dist/web-cli.d.ts +11 -0
- package/dist/web-cli.d.ts.map +1 -0
- package/dist/web-cli.js +196 -0
- package/dist/web-cli.js.map +1 -0
- package/dist/wizard/onboarding.d.ts +13 -0
- package/dist/wizard/onboarding.d.ts.map +1 -0
- package/dist/wizard/onboarding.js +196 -0
- package/dist/wizard/onboarding.js.map +1 -0
- package/electron/README.md +41 -0
- package/electron/main.cjs +341 -0
- package/package.json +236 -0
- package/scripts/postinstall.js +110 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,3302 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Axon CLI 入口点
|
|
4
|
+
* 还原版本 2.1.4 - 完整功能版
|
|
5
|
+
*/
|
|
6
|
+
import { setupGlobalFetchProxy } from './network/global-proxy.js';
|
|
7
|
+
setupGlobalFetchProxy();
|
|
8
|
+
import { Command, Option } from 'commander';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import * as readline from 'readline';
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import * as os from 'os';
|
|
14
|
+
import React from 'react';
|
|
15
|
+
import { render } from 'ink';
|
|
16
|
+
import { ConversationLoop } from './core/loop.js';
|
|
17
|
+
import { Session } from './core/session.js';
|
|
18
|
+
import { toolRegistry } from './tools/index.js';
|
|
19
|
+
import { configManager } from './config/index.js';
|
|
20
|
+
import { listSessions, loadSession, forkSession, findSessionByPr } from './session/index.js';
|
|
21
|
+
import { emitLifecycleEvent } from './lifecycle/index.js';
|
|
22
|
+
import { runHooks, runSessionEndHooks } from './hooks/index.js';
|
|
23
|
+
import { scheduleCleanup } from './session/cleanup.js';
|
|
24
|
+
import { createPluginCommand } from './plugins/cli.js';
|
|
25
|
+
import { VERSION_FULL } from './version.js';
|
|
26
|
+
import { resetTerminalTitle } from './utils/platform.js';
|
|
27
|
+
import { t } from './i18n/index.js';
|
|
28
|
+
import { disconnectAllMcpServers } from './tools/mcp.js';
|
|
29
|
+
import { findClaudeMd } from './rules/index.js';
|
|
30
|
+
import { logger } from './utils/logger.js';
|
|
31
|
+
// 初始化运行时日志系统(CLI 模式)
|
|
32
|
+
logger.init({ interceptConsole: true, minLevel: 'info' });
|
|
33
|
+
// 工作目录列表
|
|
34
|
+
const additionalDirectories = [];
|
|
35
|
+
// 全局 MCP 进程清理标志,防止重复清理
|
|
36
|
+
let mcpCleanupScheduled = false;
|
|
37
|
+
// v2.1.31: 追踪当前活跃的 session ID,用于退出时显示 resume 提示
|
|
38
|
+
let activeSessionId = null;
|
|
39
|
+
// v2.1.31: 追踪是否为交互模式
|
|
40
|
+
let isInteractiveMode = false;
|
|
41
|
+
// v2.1.31: 追踪是否禁用了 session 持久化
|
|
42
|
+
let sessionPersistenceDisabled = false;
|
|
43
|
+
// 全局 loop 引用,用于 SIGINT 时自动记忆
|
|
44
|
+
let activeLoop = null;
|
|
45
|
+
/**
|
|
46
|
+
* 安全退出函数
|
|
47
|
+
* 官方 Ch6() 函数 - v2.1.19 新增
|
|
48
|
+
*
|
|
49
|
+
* 当 process.exit() 失败时(例如终端已关闭导致 EIO 错误),
|
|
50
|
+
* 使用 SIGKILL 强制终止进程,避免悬挂的进程。
|
|
51
|
+
*
|
|
52
|
+
* @param exitCode 退出码
|
|
53
|
+
*/
|
|
54
|
+
function safeExit(exitCode = 0) {
|
|
55
|
+
try {
|
|
56
|
+
process.exit(exitCode);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
// 如果 process.exit 失败(例如 EIO 错误),使用 SIGKILL
|
|
60
|
+
process.kill(process.pid, 'SIGKILL');
|
|
61
|
+
}
|
|
62
|
+
// 理论上不应该到达这里
|
|
63
|
+
throw new Error('unreachable');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* v2.1.31: 退出时显示 session resume 提示
|
|
67
|
+
* 官方 kMA() 函数 - 仅在交互模式 TTY 环境下显示
|
|
68
|
+
*
|
|
69
|
+
* 条件:
|
|
70
|
+
* 1. stdout 是 TTY(交互终端)
|
|
71
|
+
* 2. 处于交互模式
|
|
72
|
+
* 3. session 持久化未被禁用
|
|
73
|
+
* 4. 有有效的 session ID
|
|
74
|
+
*/
|
|
75
|
+
function showSessionResumeHint() {
|
|
76
|
+
if (!process.stdout.isTTY || !isInteractiveMode || sessionPersistenceDisabled) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const sessionId = activeSessionId;
|
|
81
|
+
if (!sessionId)
|
|
82
|
+
return;
|
|
83
|
+
// 对包含特殊字符的 session ID 进行转义
|
|
84
|
+
const escapedId = sessionId.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
85
|
+
process.stderr.write(chalk.dim(`\nResume this session with:\nclaude --resume "${escapedId}"\n`));
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// 忽略任何错误,不影响退出流程
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 确保所有 MCP 服务器进程在程序退出前被正确清理
|
|
93
|
+
*
|
|
94
|
+
* 这个函数会在以下情况被调用:
|
|
95
|
+
* 1. 正常退出 (beforeExit)
|
|
96
|
+
* 2. 收到 SIGINT/SIGTERM 信号
|
|
97
|
+
* 3. 发生未捕获的异常
|
|
98
|
+
* 4. mcp list --status 或 mcp get --status 命令完成后
|
|
99
|
+
*
|
|
100
|
+
* v2.1.6 修复: 防止 mcp list 和 mcp get 命令留下孤儿进程
|
|
101
|
+
*
|
|
102
|
+
* @param resetFlag 是否在清理后重置标志,允许后续再次清理(用于命令级清理)
|
|
103
|
+
*/
|
|
104
|
+
async function cleanupMcpServers(resetFlag = false) {
|
|
105
|
+
if (mcpCleanupScheduled && !resetFlag)
|
|
106
|
+
return;
|
|
107
|
+
mcpCleanupScheduled = true;
|
|
108
|
+
try {
|
|
109
|
+
await disconnectAllMcpServers();
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
// 静默处理清理错误,避免干扰用户
|
|
113
|
+
if (process.env.DEBUG) {
|
|
114
|
+
console.error('[MCP] Cleanup error:', err);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// 如果是命令级清理,重置标志以允许后续清理
|
|
118
|
+
if (resetFlag) {
|
|
119
|
+
mcpCleanupScheduled = false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// 注册进程退出时的 MCP 清理
|
|
123
|
+
process.on('beforeExit', async () => {
|
|
124
|
+
await cleanupMcpServers();
|
|
125
|
+
});
|
|
126
|
+
// 优雅退出清理(带超时保护)
|
|
127
|
+
// v2.1.53: 改进 - session flush 在 hooks 之前,并行执行清理,缩短超时
|
|
128
|
+
let cleanupInProgress = false;
|
|
129
|
+
async function gracefulShutdown() {
|
|
130
|
+
if (cleanupInProgress) {
|
|
131
|
+
// 二次信号,强制退出
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
cleanupInProgress = true;
|
|
135
|
+
const CLEANUP_TIMEOUT = 3000; // v2.1.53: 缩短到 3 秒
|
|
136
|
+
const timeoutHandle = setTimeout(() => {
|
|
137
|
+
console.error(chalk.yellow('\nCleanup timeout, forcing exit...'));
|
|
138
|
+
process.exit(0);
|
|
139
|
+
}, CLEANUP_TIMEOUT);
|
|
140
|
+
try {
|
|
141
|
+
// v2.1.50: session flush 优先于 hooks,防止断连丢失会话数据
|
|
142
|
+
// 并行执行所有清理操作,不让任何一个阻塞其他
|
|
143
|
+
await Promise.all([
|
|
144
|
+
activeLoop?.autoMemorize().catch(() => { }),
|
|
145
|
+
runSessionEndHooks(activeSessionId || 'unknown', 'prompt_input_exit').catch(() => { }),
|
|
146
|
+
cleanupMcpServers().catch(() => { }),
|
|
147
|
+
]);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// 忽略清理错误
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
clearTimeout(timeoutHandle);
|
|
154
|
+
showSessionResumeHint();
|
|
155
|
+
safeExit(0);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// 注册 SIGINT 信号处理(Ctrl+C)
|
|
159
|
+
process.on('SIGINT', gracefulShutdown);
|
|
160
|
+
// 注册 SIGTERM 信号处理
|
|
161
|
+
process.on('SIGTERM', gracefulShutdown);
|
|
162
|
+
// v2.1.39: 修复致命错误被吞掉 - 先输出错误再清理
|
|
163
|
+
process.on('uncaughtException', (err) => {
|
|
164
|
+
// 立即输出错误,确保不被后续清理吞掉
|
|
165
|
+
try {
|
|
166
|
+
process.stderr.write(`\n[FATAL] Uncaught exception: ${err?.message || err}\n`);
|
|
167
|
+
if (err?.stack) {
|
|
168
|
+
process.stderr.write(err.stack + '\n');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// stderr 写入失败也不能阻止退出
|
|
173
|
+
}
|
|
174
|
+
// 同步退出,不等待异步清理(防止挂起)
|
|
175
|
+
safeExit(1);
|
|
176
|
+
});
|
|
177
|
+
// v2.1.39: 修复致命错误被吞掉
|
|
178
|
+
process.on('unhandledRejection', (reason) => {
|
|
179
|
+
try {
|
|
180
|
+
const msg = reason instanceof Error ? reason.message : String(reason);
|
|
181
|
+
const stack = reason instanceof Error ? reason.stack : '';
|
|
182
|
+
process.stderr.write(`\n[FATAL] Unhandled rejection: ${msg}\n`);
|
|
183
|
+
if (stack) {
|
|
184
|
+
process.stderr.write(stack + '\n');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// stderr 写入失败也不能阻止退出
|
|
189
|
+
}
|
|
190
|
+
safeExit(1);
|
|
191
|
+
});
|
|
192
|
+
const program = new Command();
|
|
193
|
+
program
|
|
194
|
+
.name('claude')
|
|
195
|
+
.description('Axon - starts an interactive session by default, use -p/--print for non-interactive output')
|
|
196
|
+
.version(VERSION_FULL, '-v, --version', 'Output the version number');
|
|
197
|
+
// 主命令 - 交互模式
|
|
198
|
+
program
|
|
199
|
+
.argument('[prompt]', 'Your prompt')
|
|
200
|
+
// 调试选项
|
|
201
|
+
.option('-d, --debug [filter]', 'Enable debug mode with optional category filtering')
|
|
202
|
+
.option('--verbose', 'Override verbose mode setting from config')
|
|
203
|
+
// 输出选项
|
|
204
|
+
.option('-p, --print', 'Print response and exit (useful for pipes)')
|
|
205
|
+
.addOption(new Option('--output-format <format>', 'Output format (only works with --print)')
|
|
206
|
+
.choices(['text', 'json', 'stream-json'])
|
|
207
|
+
.default('text'))
|
|
208
|
+
.option('--json-schema <schema>', 'JSON Schema for structured output validation')
|
|
209
|
+
.option('--include-partial-messages', 'Include partial message chunks (only with --print and stream-json)')
|
|
210
|
+
.addOption(new Option('--input-format <format>', 'Input format (only works with --print)')
|
|
211
|
+
.choices(['text', 'stream-json'])
|
|
212
|
+
.default('text'))
|
|
213
|
+
// 安全选项
|
|
214
|
+
.option('--dangerously-skip-permissions', 'Bypass all permission checks (sandbox only)')
|
|
215
|
+
.option('--allow-dangerously-skip-permissions', 'Enable bypassing permissions as an option')
|
|
216
|
+
// 预算选项
|
|
217
|
+
.option('--max-budget-usd <amount>', 'Maximum dollar amount for API calls (only with --print)')
|
|
218
|
+
.option('--replay-user-messages', 'Re-emit user messages from stdin (stream-json only)')
|
|
219
|
+
// 工具选项
|
|
220
|
+
.option('--allowedTools, --allowed-tools <tools...>', 'Comma or space-separated list of allowed tools')
|
|
221
|
+
.option('--tools <tools...>', 'Specify available tools from built-in set')
|
|
222
|
+
.option('--disallowedTools, --disallowed-tools <tools...>', 'Comma or space-separated list of denied tools')
|
|
223
|
+
// MCP 选项
|
|
224
|
+
.option('--mcp-config <configs...>', 'Load MCP servers from JSON files or strings')
|
|
225
|
+
.option('--mcp-debug', '[DEPRECATED] Enable MCP debug mode')
|
|
226
|
+
.option('--strict-mcp-config', 'Only use MCP servers from --mcp-config')
|
|
227
|
+
// 系统提示
|
|
228
|
+
.option('--system-prompt <prompt>', 'System prompt to use for the session')
|
|
229
|
+
.option('--system-prompt-file <file>', 'Read system prompt from a file')
|
|
230
|
+
.option('--append-system-prompt <prompt>', 'Append to default system prompt')
|
|
231
|
+
.option('--append-system-prompt-file <file>', 'Read system prompt from a file and append to the default system prompt')
|
|
232
|
+
// 权限模式
|
|
233
|
+
.addOption(new Option('--permission-mode <mode>', 'Permission mode for the session')
|
|
234
|
+
.choices(['acceptEdits', 'bypassPermissions', 'default', 'delegate', 'dontAsk', 'plan']))
|
|
235
|
+
// 会话选项
|
|
236
|
+
.option('-c, --continue', 'Continue the most recent conversation')
|
|
237
|
+
.option('-r, --resume [value]', 'Resume by session ID, or open interactive picker')
|
|
238
|
+
.option('--fork-session', 'Create new session ID when resuming')
|
|
239
|
+
.option('--from-pr [value]', 'Resume a session linked to a PR by PR number/URL, or open interactive picker')
|
|
240
|
+
.option('--no-session-persistence', 'Disable session persistence (only with --print)')
|
|
241
|
+
.option('--session-id <uuid>', 'Use a specific session ID (must be valid UUID)')
|
|
242
|
+
// 模型选项
|
|
243
|
+
.option('-m, --model <model>', 'Model for the current session', 'sonnet')
|
|
244
|
+
.option('--agent <agent>', 'Agent for the current session')
|
|
245
|
+
.option('--betas <betas...>', 'Beta headers for API requests')
|
|
246
|
+
.option('--fallback-model <model>', 'Fallback model when default is overloaded')
|
|
247
|
+
.option('--max-tokens <tokens>', 'Maximum tokens for response', '32000')
|
|
248
|
+
// 其他选项
|
|
249
|
+
.option('--settings <file-or-json>', 'Path to settings JSON file or JSON string')
|
|
250
|
+
.option('--add-dir <directories...>', 'Additional directories to allow tool access')
|
|
251
|
+
.option('--ide', 'Auto-connect to IDE on startup')
|
|
252
|
+
.option('--agents <json>', 'JSON object defining custom agents')
|
|
253
|
+
.option('--teleport <session-id>', 'Connect to remote Axon session')
|
|
254
|
+
.option('--include-dependencies', 'Auto-include project dependency type definitions')
|
|
255
|
+
.option('--solo', 'Disable background processes and parallel execution')
|
|
256
|
+
.option('--setting-sources <sources>', 'Comma-separated list of setting sources')
|
|
257
|
+
.option('--plugin-dir <paths...>', 'Load plugins from directories')
|
|
258
|
+
.option('--disable-slash-commands', 'Disable all slash commands')
|
|
259
|
+
.option('--chrome', 'Enable Claude in Chrome integration')
|
|
260
|
+
.option('--no-chrome', 'Disable Claude in Chrome integration')
|
|
261
|
+
.option('--text', 'Use text-based interface instead of TUI')
|
|
262
|
+
// v2.1.10: Setup hook 触发器
|
|
263
|
+
.option('--init', 'Run Setup hook and start interactive session')
|
|
264
|
+
.option('--init-only', 'Run Setup hook and exit (repository setup/maintenance)')
|
|
265
|
+
.option('--maintenance', 'Alias for --init-only')
|
|
266
|
+
.action(async (prompt, options) => {
|
|
267
|
+
// Print 模式下,将 console.log/warn/info 重定向到 stderr
|
|
268
|
+
// 避免各模块的调试日志污染 stdout(用户只期望看到 AI 回复)
|
|
269
|
+
if (options.print) {
|
|
270
|
+
const origLog = console.log;
|
|
271
|
+
const origWarn = console.warn;
|
|
272
|
+
const origInfo = console.info;
|
|
273
|
+
console.log = (...args) => process.stderr.write(args.join(' ') + '\n');
|
|
274
|
+
console.warn = (...args) => process.stderr.write(args.join(' ') + '\n');
|
|
275
|
+
console.info = (...args) => process.stderr.write(args.join(' ') + '\n');
|
|
276
|
+
}
|
|
277
|
+
// T504: action_handler_start - Action 处理器开始
|
|
278
|
+
await emitLifecycleEvent('action_handler_start');
|
|
279
|
+
// v2.1.6: 设置终端标题为 "Axon"
|
|
280
|
+
resetTerminalTitle();
|
|
281
|
+
// ✅ 启动时自动清理过期数据(异步,不阻塞)
|
|
282
|
+
scheduleCleanup();
|
|
283
|
+
// 🔍 提前验证系统提示选项的互斥性
|
|
284
|
+
if (options.systemPrompt && options.systemPromptFile) {
|
|
285
|
+
process.stderr.write(chalk.red(t('cli.misc.sysPromptBothError') + '\n'));
|
|
286
|
+
process.exit(1);
|
|
287
|
+
}
|
|
288
|
+
if (options.appendSystemPrompt && options.appendSystemPromptFile) {
|
|
289
|
+
process.stderr.write(chalk.red(t('cli.misc.appendPromptBothError') + '\n'));
|
|
290
|
+
process.exit(1);
|
|
291
|
+
}
|
|
292
|
+
// 检查是否需要显示登录选择器
|
|
293
|
+
// 只在没有 prompt 且没有认证凭据时显示
|
|
294
|
+
// v2.1.6: 添加 resume 检查,避免 --resume 时登录菜单闪现
|
|
295
|
+
if (!prompt && !options.print && !options.text && options.resume === undefined) {
|
|
296
|
+
const { shouldShowLoginSelector } = await import('./ui/LoginSelector.js');
|
|
297
|
+
if (shouldShowLoginSelector()) {
|
|
298
|
+
await showLoginSelectorUI();
|
|
299
|
+
// 登录成功后继续启动交互界面,不要 return
|
|
300
|
+
// return; // ❌ 移除这个 return
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// 调试模式
|
|
304
|
+
if (options.debug) {
|
|
305
|
+
process.env.AXON_DEBUG = options.debug === true ? '*' : options.debug;
|
|
306
|
+
}
|
|
307
|
+
// Solo 模式 - 禁用后台进程和并行执行
|
|
308
|
+
if (options.solo) {
|
|
309
|
+
process.env.AXON_SOLO_MODE = 'true';
|
|
310
|
+
}
|
|
311
|
+
// v2.1.33: 将 settings.json 中配置的环境变量应用到 process.env
|
|
312
|
+
// 修复: 通过 settings.json environment 配置的代理设置不会应用到 WebFetch 和其他 HTTP 请求
|
|
313
|
+
// 官方实现: 在启动早期阶段将 settings.json 的 env 字段注入 process.env
|
|
314
|
+
const settingsConfig = configManager.getAll();
|
|
315
|
+
if (settingsConfig.env && typeof settingsConfig.env === 'object') {
|
|
316
|
+
for (const [key, value] of Object.entries(settingsConfig.env)) {
|
|
317
|
+
if (value !== undefined && value !== null && !process.env[key]) {
|
|
318
|
+
process.env[key] = String(value);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// i18n 初始化:从 settings.json 的 language 字段读取语言偏好
|
|
323
|
+
const { initI18n } = await import('./i18n/index.js');
|
|
324
|
+
await initI18n(settingsConfig.language);
|
|
325
|
+
// v2.1.32: 将 --add-dir 传递给 Skill 模块以自动加载额外目录的 skills
|
|
326
|
+
if (options.addDir && Array.isArray(options.addDir)) {
|
|
327
|
+
const { setAdditionalDirectories } = await import('./tools/skill.js');
|
|
328
|
+
const resolvedDirs = options.addDir.map((d) => path.resolve(d));
|
|
329
|
+
setAdditionalDirectories(resolvedDirs);
|
|
330
|
+
}
|
|
331
|
+
// 模型映射(官方 Axon 使用的模型版本)
|
|
332
|
+
// v2.1.33: Claude Opus 4.6 is now available (2026-02)
|
|
333
|
+
const modelMap = {
|
|
334
|
+
'sonnet': 'claude-sonnet-4-5-20250929',
|
|
335
|
+
'opus': 'claude-opus-4-6',
|
|
336
|
+
'haiku': 'claude-haiku-4-5-20251001',
|
|
337
|
+
};
|
|
338
|
+
// 加载 MCP 配置
|
|
339
|
+
if (options.mcpConfig) {
|
|
340
|
+
loadMcpConfigs(options.mcpConfig);
|
|
341
|
+
}
|
|
342
|
+
// 加载 Chrome 集成配置(如果启用)
|
|
343
|
+
// 与官方实现一致:在启动时自动检测并加载 Chrome MCP
|
|
344
|
+
let chromeSystemPrompt;
|
|
345
|
+
try {
|
|
346
|
+
const { getChromeIntegrationConfig } = await import('./chrome-mcp/index.js');
|
|
347
|
+
// options.chrome 可能是 true(--chrome)、false(--no-chrome)或 undefined
|
|
348
|
+
const chromeConfig = await getChromeIntegrationConfig(options.chrome);
|
|
349
|
+
if (chromeConfig) {
|
|
350
|
+
// 导入 MCP 注册函数和 Chrome 工具定义
|
|
351
|
+
const { registerMcpServer, registerMcpToolsToRegistry } = await import('./tools/mcp.js');
|
|
352
|
+
const { toolRegistry } = await import('./tools/index.js');
|
|
353
|
+
const { CHROME_MCP_TOOLS } = await import('./chrome-mcp/tools.js');
|
|
354
|
+
// 添加 Chrome MCP 服务器配置并注册到 MCP 系统
|
|
355
|
+
for (const [name, config] of Object.entries(chromeConfig.mcpConfig)) {
|
|
356
|
+
// 保存到配置文件(持久化)
|
|
357
|
+
try {
|
|
358
|
+
configManager.addMcpServer(name, config);
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
// 可能已存在,忽略
|
|
362
|
+
}
|
|
363
|
+
// 注册到 MCP 服务器映射(运行时),使用预加载的工具定义
|
|
364
|
+
// 这样工具可以立即被发现,无需连接 MCP 服务器
|
|
365
|
+
registerMcpServer(name, config, CHROME_MCP_TOOLS);
|
|
366
|
+
// 将工具直接注册到 ToolRegistry,这样 AI 可以直接调用它们
|
|
367
|
+
registerMcpToolsToRegistry(name, CHROME_MCP_TOOLS, toolRegistry);
|
|
368
|
+
}
|
|
369
|
+
// 保存 Chrome 系统提示以便后续合并
|
|
370
|
+
chromeSystemPrompt = chromeConfig.systemPrompt;
|
|
371
|
+
if (options.verbose) {
|
|
372
|
+
console.log(chalk.dim('[Chrome] Browser automation tools loaded'));
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
// Chrome 集成失败不应该阻止程序运行
|
|
378
|
+
if (options.debug) {
|
|
379
|
+
console.warn(chalk.yellow('[Chrome] Failed to load browser integration:'), error);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// T507: action_mcp_configs_loaded - MCP 配置加载完成
|
|
383
|
+
await emitLifecycleEvent('action_mcp_configs_loaded');
|
|
384
|
+
await runHooks({ event: 'McpConfigsLoaded' });
|
|
385
|
+
// 【与官方一致】自动加载并连接所有配置的 MCP 服务器
|
|
386
|
+
// 官方逻辑:在 useManageMcpConnections hook 中,自动加载所有配置的 MCP 服务器并连接
|
|
387
|
+
// 除非服务器在 disabledMcpServers 列表中
|
|
388
|
+
try {
|
|
389
|
+
await initializeAllMcpServers(options.verbose, options.strictMcpConfig);
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
if (options.debug) {
|
|
393
|
+
console.warn(chalk.yellow(`[MCP] ${t('cli.misc.mcpInitFailed')}`), error);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// 构建系统提示
|
|
397
|
+
let systemPrompt = options.systemPrompt;
|
|
398
|
+
// 如果 Chrome 集成已启用,添加 Chrome 系统提示
|
|
399
|
+
if (chromeSystemPrompt) {
|
|
400
|
+
systemPrompt = systemPrompt ? `${chromeSystemPrompt}\n\n${systemPrompt}` : chromeSystemPrompt;
|
|
401
|
+
}
|
|
402
|
+
// 处理 --system-prompt-file(互斥性已在前面验证)
|
|
403
|
+
if (options.systemPromptFile) {
|
|
404
|
+
try {
|
|
405
|
+
const filePath = path.resolve(options.systemPromptFile);
|
|
406
|
+
if (!fs.existsSync(filePath)) {
|
|
407
|
+
process.stderr.write(chalk.red(t('cli.misc.sysPromptFileNotFound', { path: filePath }) + '\n'));
|
|
408
|
+
process.exit(1);
|
|
409
|
+
}
|
|
410
|
+
systemPrompt = fs.readFileSync(filePath, 'utf-8');
|
|
411
|
+
}
|
|
412
|
+
catch (err) {
|
|
413
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
414
|
+
process.stderr.write(chalk.red(t('cli.misc.sysPromptFileError', { error: errorMsg }) + '\n'));
|
|
415
|
+
process.exit(1);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// 处理 --append-system-prompt 和 --append-system-prompt-file(互斥性已在前面验证)
|
|
419
|
+
let appendSystemPrompt = options.appendSystemPrompt;
|
|
420
|
+
if (options.appendSystemPromptFile) {
|
|
421
|
+
try {
|
|
422
|
+
const filePath = path.resolve(options.appendSystemPromptFile);
|
|
423
|
+
if (!fs.existsSync(filePath)) {
|
|
424
|
+
process.stderr.write(chalk.red(t('cli.misc.appendPromptFileNotFound', { path: filePath }) + '\n'));
|
|
425
|
+
process.exit(1);
|
|
426
|
+
}
|
|
427
|
+
appendSystemPrompt = fs.readFileSync(filePath, 'utf-8');
|
|
428
|
+
}
|
|
429
|
+
catch (err) {
|
|
430
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
431
|
+
process.stderr.write(chalk.red(t('cli.misc.appendPromptFileError', { error: errorMsg }) + '\n'));
|
|
432
|
+
process.exit(1);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// 合并 append system prompt
|
|
436
|
+
if (appendSystemPrompt) {
|
|
437
|
+
systemPrompt = (systemPrompt || '') + '\n' + appendSystemPrompt;
|
|
438
|
+
}
|
|
439
|
+
// Include dependencies - 添加依赖类型定义到系统提示
|
|
440
|
+
if (options.includeDependencies) {
|
|
441
|
+
const dependenciesContext = '\n\nNote: Project dependency type definitions are automatically included for better code understanding.';
|
|
442
|
+
systemPrompt = (systemPrompt || '') + dependenciesContext;
|
|
443
|
+
}
|
|
444
|
+
// 加载设置
|
|
445
|
+
if (options.settings) {
|
|
446
|
+
loadSettings(options.settings);
|
|
447
|
+
}
|
|
448
|
+
// T509: action_after_input_prompt - 输入提示处理后
|
|
449
|
+
await emitLifecycleEvent('action_after_input_prompt', { prompt });
|
|
450
|
+
// T506: action_tools_loaded - 工具加载完成
|
|
451
|
+
// 注意:工具在 toolRegistry 导入时已加载,这里触发事件
|
|
452
|
+
await emitLifecycleEvent('action_tools_loaded', { toolCount: toolRegistry.getAll().length });
|
|
453
|
+
await runHooks({ event: 'ToolsLoaded' });
|
|
454
|
+
// T502: action_before_setup - 设置前
|
|
455
|
+
await emitLifecycleEvent('action_before_setup');
|
|
456
|
+
await runHooks({ event: 'BeforeSetup' });
|
|
457
|
+
// v2.1.10: Setup hook 系统
|
|
458
|
+
// 当使用 --init, --init-only 或 --maintenance 标志时触发
|
|
459
|
+
const shouldRunSetupHook = options.init || options.initOnly || options.maintenance;
|
|
460
|
+
const isSetupOnlyMode = options.initOnly || options.maintenance;
|
|
461
|
+
if (shouldRunSetupHook) {
|
|
462
|
+
console.log(chalk.cyan(`\n🔧 ${t('cli.setup.running')}\n`));
|
|
463
|
+
// 添加新的 Setup hook 事件类型
|
|
464
|
+
const setupHookResult = await runHooks({
|
|
465
|
+
event: 'Setup',
|
|
466
|
+
sessionId: undefined // Setup hook 可能在会话之前运行
|
|
467
|
+
});
|
|
468
|
+
if (setupHookResult.some(r => !r.success)) {
|
|
469
|
+
console.error(chalk.red(`\n❌ ${t('cli.setup.failed')}\n`));
|
|
470
|
+
const failed = setupHookResult.filter(r => !r.success);
|
|
471
|
+
failed.forEach(r => {
|
|
472
|
+
if (r.error) {
|
|
473
|
+
console.error(chalk.red(` Error: ${r.error}`));
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
if (isSetupOnlyMode) {
|
|
477
|
+
process.exit(1);
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
console.log(chalk.yellow(t('cli.setup.continuing') + '\n'));
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
console.log(chalk.green(`✓ ${t('cli.setup.completed')}\n`));
|
|
485
|
+
}
|
|
486
|
+
// 如果是 --init-only 或 --maintenance 模式,在 Setup hook 后退出
|
|
487
|
+
if (isSetupOnlyMode) {
|
|
488
|
+
console.log(chalk.gray(t('cli.setup.exitingInit') + '\n'));
|
|
489
|
+
process.exit(0);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
// 这里进行必要的设置(setup logic)
|
|
493
|
+
// 在本项目中,设置逻辑较为简单,主要是配置和会话管理
|
|
494
|
+
// T503: action_after_setup - 设置后
|
|
495
|
+
await emitLifecycleEvent('action_after_setup');
|
|
496
|
+
await runHooks({ event: 'AfterSetup' });
|
|
497
|
+
// 初始化 LSP 管理器
|
|
498
|
+
try {
|
|
499
|
+
const { initializeLSPManager } = await import('./lsp/index.js');
|
|
500
|
+
const workspaceRoot = process.cwd();
|
|
501
|
+
await initializeLSPManager(workspaceRoot);
|
|
502
|
+
console.log(chalk.dim(`[LSP] ${t('cli.misc.lspInitialized')}`));
|
|
503
|
+
}
|
|
504
|
+
catch (error) {
|
|
505
|
+
// LSP 初始化失败不应该阻止程序运行
|
|
506
|
+
if (options.debug) {
|
|
507
|
+
console.warn(chalk.yellow(`[LSP] ${t('cli.misc.lspFailed')}`), error);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
// T505: action_commands_loaded - 命令加载完成
|
|
511
|
+
// 注意:本项目的斜杠命令是内联定义的,这里标记为已加载
|
|
512
|
+
await emitLifecycleEvent('action_commands_loaded');
|
|
513
|
+
await runHooks({ event: 'CommandsLoaded' });
|
|
514
|
+
// T508: action_after_plugins_init - 插件初始化后
|
|
515
|
+
// 注意:本项目的插件系统尚未完全实现,但仍触发事件
|
|
516
|
+
await emitLifecycleEvent('action_after_plugins_init');
|
|
517
|
+
await runHooks({ event: 'PluginsInitialized' });
|
|
518
|
+
// T510: action_after_hooks - Hooks 执行后
|
|
519
|
+
// 注意:Hooks 在需要时执行,这里标记为已准备就绪
|
|
520
|
+
await emitLifecycleEvent('action_after_hooks');
|
|
521
|
+
await runHooks({ event: 'AfterHooks' });
|
|
522
|
+
// Teleport 模式 - 连接到远程会话
|
|
523
|
+
if (options.teleport) {
|
|
524
|
+
try {
|
|
525
|
+
console.log(chalk.cyan(`Connecting to remote session: ${options.teleport}...`));
|
|
526
|
+
// 动态导入 teleport 模块
|
|
527
|
+
const { connectToRemoteSession, validateSessionRepository } = await import('./teleport/index.js');
|
|
528
|
+
// 获取远程服务器 URL(可以从环境变量或配置获取)
|
|
529
|
+
const ingressUrl = process.env.AXON_TELEPORT_URL;
|
|
530
|
+
const authToken = process.env.AXON_TELEPORT_TOKEN;
|
|
531
|
+
if (!ingressUrl) {
|
|
532
|
+
console.log(chalk.yellow('Warning: No AXON_TELEPORT_URL environment variable set.'));
|
|
533
|
+
console.log(chalk.gray('Attempting to connect using local session...'));
|
|
534
|
+
// 尝试从本地加载会话
|
|
535
|
+
const session = Session.load(options.teleport);
|
|
536
|
+
if (session) {
|
|
537
|
+
console.log(chalk.green(`Loaded local session: ${options.teleport}`));
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
console.log(chalk.yellow(`Session ${options.teleport} not found locally.`));
|
|
541
|
+
console.log(chalk.gray('Starting new session instead...'));
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
// 连接到远程会话
|
|
546
|
+
const remoteSession = await connectToRemoteSession(options.teleport, ingressUrl, authToken);
|
|
547
|
+
console.log(chalk.green(`Connected to remote session: ${options.teleport}`));
|
|
548
|
+
console.log(chalk.gray(`Remote URL: ${ingressUrl}`));
|
|
549
|
+
// 监听远程会话事件
|
|
550
|
+
remoteSession.on('message', (message) => {
|
|
551
|
+
if (options.verbose) {
|
|
552
|
+
console.log(chalk.dim(`[Remote] ${JSON.stringify(message)}`));
|
|
553
|
+
}
|
|
554
|
+
});
|
|
555
|
+
remoteSession.on('disconnected', () => {
|
|
556
|
+
console.log(chalk.yellow('Remote session disconnected'));
|
|
557
|
+
});
|
|
558
|
+
remoteSession.on('error', (error) => {
|
|
559
|
+
console.error(chalk.red(`Remote session error: ${error.message}`));
|
|
560
|
+
});
|
|
561
|
+
// 在程序退出时断开连接
|
|
562
|
+
process.on('SIGINT', async () => {
|
|
563
|
+
console.log(chalk.yellow('\nDisconnecting from remote session...'));
|
|
564
|
+
await remoteSession.disconnect();
|
|
565
|
+
process.exit(0);
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
catch (err) {
|
|
570
|
+
console.log(chalk.red(`Failed to connect to remote session: ${err instanceof Error ? err.message : err}`));
|
|
571
|
+
console.log(chalk.gray('Starting new session instead...'));
|
|
572
|
+
if (options.verbose && err instanceof Error) {
|
|
573
|
+
console.error(chalk.dim(err.stack));
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
// v2.1.32: 主 agent 选择 - 对应官方 h6=S??Gq().agent
|
|
578
|
+
// 当指定了 --agent 或 settings.agent 时,非 built-in agent 的 systemPrompt 和 model 会覆盖默认值
|
|
579
|
+
{
|
|
580
|
+
const { initializeCustomAgents, getAllActiveAgents, getAgentTypeDefinition } = await import('./tools/agent.js');
|
|
581
|
+
// 初始化自定义 agent(从插件缓存、用户目录、项目目录加载)
|
|
582
|
+
await initializeCustomAgents();
|
|
583
|
+
// 确定主 agent:CLI --agent 优先,其次 settings.agent
|
|
584
|
+
const agentName = options.agent ?? configManager.getAll().agent;
|
|
585
|
+
if (agentName) {
|
|
586
|
+
const agentDef = getAgentTypeDefinition(agentName);
|
|
587
|
+
if (agentDef) {
|
|
588
|
+
// 非 built-in agent 且用户未指定 systemPrompt 时,用 agent 的 systemPrompt
|
|
589
|
+
if (agentDef.source !== 'built-in' && !systemPrompt) {
|
|
590
|
+
const agentPrompt = agentDef.getSystemPrompt?.();
|
|
591
|
+
if (agentPrompt) {
|
|
592
|
+
systemPrompt = agentPrompt;
|
|
593
|
+
if (options.verbose) {
|
|
594
|
+
console.log(chalk.dim(`[Agent] Using system prompt from agent "${agentName}" (${agentPrompt.length} chars)`));
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
// agent 的 model 覆盖默认 model(仅当用户未通过 CLI 指定 model 时)
|
|
599
|
+
if (!options.model && agentDef.model && agentDef.model !== 'inherit') {
|
|
600
|
+
options.model = agentDef.model;
|
|
601
|
+
if (options.verbose) {
|
|
602
|
+
console.log(chalk.dim(`[Agent] Using model "${agentDef.model}" from agent "${agentName}"`));
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
if (options.verbose) {
|
|
606
|
+
console.log(chalk.dim(`[Agent] Main agent: "${agentName}" (source: ${agentDef.source})`));
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
console.log(chalk.yellow(`Warning: agent "${agentName}" not found. Available agents: ${getAllActiveAgents().map(d => d.agentType).join(', ')}. Using default behavior.`));
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
// 打印模式 (JSON 格式支持) - 不使用 TUI
|
|
615
|
+
if (options.print && prompt) {
|
|
616
|
+
// 从配置管理器获取完整配置(包括环境变量)
|
|
617
|
+
const config = configManager.getAll();
|
|
618
|
+
// v2.1.29: 处理 --json-schema 选项,创建 StructuredOutput 工具
|
|
619
|
+
let structuredOutputTool = null;
|
|
620
|
+
if (options.jsonSchema) {
|
|
621
|
+
const { parseJsonSchema, createStructuredOutputTool } = await import('./tools/structured-output.js');
|
|
622
|
+
const schema = parseJsonSchema(options.jsonSchema);
|
|
623
|
+
if (schema) {
|
|
624
|
+
structuredOutputTool = createStructuredOutputTool(schema);
|
|
625
|
+
if (structuredOutputTool) {
|
|
626
|
+
// 注册 StructuredOutput 工具
|
|
627
|
+
toolRegistry.register(structuredOutputTool);
|
|
628
|
+
if (options.verbose) {
|
|
629
|
+
console.log(chalk.dim('[StructuredOutput] Schema validated and tool registered'));
|
|
630
|
+
console.log(chalk.dim(`[StructuredOutput] Properties: ${Object.keys(schema.properties || {}).join(', ')}`));
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
else {
|
|
634
|
+
console.error(chalk.red(t('cli.misc.invalidJsonSchema')));
|
|
635
|
+
process.exit(1);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
else {
|
|
639
|
+
console.error(chalk.red(t('cli.misc.jsonSchemaParseError')));
|
|
640
|
+
process.exit(1);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
const loop = new ConversationLoop({
|
|
644
|
+
model: modelMap[options.model] || options.model,
|
|
645
|
+
maxTokens: parseInt(options.maxTokens),
|
|
646
|
+
verbose: options.verbose,
|
|
647
|
+
systemPrompt,
|
|
648
|
+
permissionMode: options.permissionMode,
|
|
649
|
+
allowedTools: options.allowedTools,
|
|
650
|
+
disallowedTools: options.disallowedTools,
|
|
651
|
+
// 传递 Extended Thinking 配置
|
|
652
|
+
thinking: config.thinking,
|
|
653
|
+
// 传递回退模型配置
|
|
654
|
+
fallbackModel: options.fallbackModel || config.fallbackModel,
|
|
655
|
+
// 传递调试配置
|
|
656
|
+
debug: options.debug || config.debug,
|
|
657
|
+
});
|
|
658
|
+
const outputFormat = options.outputFormat;
|
|
659
|
+
if (outputFormat === 'json') {
|
|
660
|
+
const response = await loop.processMessage(prompt);
|
|
661
|
+
// v2.1.29: 如果使用了 structured output,包含 structured_output 字段
|
|
662
|
+
const result = {
|
|
663
|
+
type: 'result',
|
|
664
|
+
content: response,
|
|
665
|
+
session_id: loop.getSession().sessionId,
|
|
666
|
+
};
|
|
667
|
+
// 检查是否有 structured output 结果
|
|
668
|
+
if (structuredOutputTool) {
|
|
669
|
+
const session = loop.getSession();
|
|
670
|
+
const messages = session.getMessages();
|
|
671
|
+
// 查找最后一个 tool_result 消息
|
|
672
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
673
|
+
const msg = messages[i];
|
|
674
|
+
if (msg.role === 'user' && Array.isArray(msg.content)) {
|
|
675
|
+
const toolResult = msg.content.find((c) => c.type === 'tool_result' && typeof c.content === 'string' && c.content.includes('structured_output'));
|
|
676
|
+
if (toolResult && typeof toolResult.content === 'string') {
|
|
677
|
+
try {
|
|
678
|
+
const parsed = JSON.parse(toolResult.content);
|
|
679
|
+
if (parsed.structured_output) {
|
|
680
|
+
result.structured_output = parsed.structured_output;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
catch {
|
|
684
|
+
// 忽略解析错误
|
|
685
|
+
}
|
|
686
|
+
break;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
process.stdout.write(JSON.stringify(result) + '\n');
|
|
692
|
+
}
|
|
693
|
+
else if (outputFormat === 'stream-json') {
|
|
694
|
+
for await (const event of loop.processMessageStream(prompt)) {
|
|
695
|
+
process.stdout.write(JSON.stringify(event) + '\n');
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
else {
|
|
699
|
+
const response = await loop.processMessage(prompt);
|
|
700
|
+
process.stdout.write(response + '\n');
|
|
701
|
+
}
|
|
702
|
+
process.exit(0);
|
|
703
|
+
}
|
|
704
|
+
// AXON.md 初始化检查:没有就直接用模板创建
|
|
705
|
+
if (!findClaudeMd(process.cwd())) {
|
|
706
|
+
const { createClaudeMdTemplate } = await import('./rules/index.js');
|
|
707
|
+
const axonMdPath = path.join(process.cwd(), 'AXON.md');
|
|
708
|
+
fs.writeFileSync(axonMdPath, createClaudeMdTemplate(), 'utf-8');
|
|
709
|
+
console.log(chalk.green(`✓ Created AXON.md`));
|
|
710
|
+
}
|
|
711
|
+
// 使用文本界面还是 TUI
|
|
712
|
+
if (options.text) {
|
|
713
|
+
// 使用基于 readline 的文本界面
|
|
714
|
+
await runTextInterface(prompt, options, modelMap, systemPrompt);
|
|
715
|
+
}
|
|
716
|
+
else {
|
|
717
|
+
// 使用 Ink TUI 界面
|
|
718
|
+
await runTuiInterface(prompt, options, modelMap, systemPrompt);
|
|
719
|
+
}
|
|
720
|
+
});
|
|
721
|
+
// 运行 TUI 界面 (Ink)
|
|
722
|
+
async function runTuiInterface(prompt, options, modelMap, systemPrompt) {
|
|
723
|
+
try {
|
|
724
|
+
// 动态导入 App 组件
|
|
725
|
+
const { App } = await import('./ui/App.js');
|
|
726
|
+
// 获取用户名
|
|
727
|
+
const username = process.env.USER || process.env.USERNAME || undefined;
|
|
728
|
+
// 渲染 Ink 应用
|
|
729
|
+
render(React.createElement(App, {
|
|
730
|
+
model: options.model,
|
|
731
|
+
initialPrompt: prompt,
|
|
732
|
+
verbose: options.verbose,
|
|
733
|
+
systemPrompt,
|
|
734
|
+
username,
|
|
735
|
+
apiType: 'Claude API',
|
|
736
|
+
organization: undefined,
|
|
737
|
+
}));
|
|
738
|
+
}
|
|
739
|
+
catch (error) {
|
|
740
|
+
console.error(chalk.red(t('cli.misc.tuiFailed')), error);
|
|
741
|
+
console.log(chalk.yellow(t('cli.misc.tuiFallback')));
|
|
742
|
+
await runTextInterface(prompt, options, modelMap, systemPrompt);
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
// 运行文本界面 (readline)
|
|
746
|
+
async function runTextInterface(prompt, options, modelMap, systemPrompt) {
|
|
747
|
+
// 官方 claude 颜色 (clawd_body): rgb(215,119,87)
|
|
748
|
+
const claudeColor = chalk.rgb(215, 119, 87);
|
|
749
|
+
// ASCII Art Logo for text mode - 使用官方 clawd 设计
|
|
750
|
+
const LOGO = `
|
|
751
|
+
╭─────────────────────────────────────────────────────╮
|
|
752
|
+
│ │
|
|
753
|
+
│ ${claudeColor('Axon')} ${chalk.gray('v' + VERSION_FULL)} │
|
|
754
|
+
│ │
|
|
755
|
+
│ ${claudeColor('*')} ${claudeColor('*')} │
|
|
756
|
+
│ ${claudeColor('*')} ${claudeColor(' ▐')}${claudeColor.bgBlack('▛███▜')}${claudeColor('▌')} ${claudeColor('*')} │
|
|
757
|
+
│ ${claudeColor('*')} ${claudeColor('▝▜')}${claudeColor.bgBlack('█████')}${claudeColor('▛▘')} ${claudeColor('*')} │
|
|
758
|
+
│ ${claudeColor('▘▘ ▝▝')} │
|
|
759
|
+
│ │
|
|
760
|
+
│ ${chalk.cyan('Sonnet 4')} · ${chalk.gray('Claude API')} │
|
|
761
|
+
│ ${chalk.gray(process.cwd())}
|
|
762
|
+
╰─────────────────────────────────────────────────────╯
|
|
763
|
+
`;
|
|
764
|
+
console.log(LOGO);
|
|
765
|
+
// 从配置管理器获取完整配置(包括环境变量)
|
|
766
|
+
const config = configManager.getAll();
|
|
767
|
+
const loop = new ConversationLoop({
|
|
768
|
+
model: modelMap[options.model] || options.model,
|
|
769
|
+
maxTokens: parseInt(options.maxTokens),
|
|
770
|
+
verbose: options.verbose,
|
|
771
|
+
systemPrompt,
|
|
772
|
+
permissionMode: options.permissionMode,
|
|
773
|
+
allowedTools: options.allowedTools,
|
|
774
|
+
disallowedTools: options.disallowedTools,
|
|
775
|
+
// 传递 Extended Thinking 配置
|
|
776
|
+
thinking: config.thinking,
|
|
777
|
+
// 传递回退模型配置
|
|
778
|
+
fallbackModel: options.fallbackModel || config.fallbackModel,
|
|
779
|
+
// 传递调试配置
|
|
780
|
+
debug: options.debug || config.debug,
|
|
781
|
+
});
|
|
782
|
+
// 设置全局引用,供 SIGINT 退出时自动记忆
|
|
783
|
+
activeLoop = loop;
|
|
784
|
+
// 恢复会话逻辑
|
|
785
|
+
if (options.continue) {
|
|
786
|
+
const sessions = listSessions({ limit: 1, sortBy: 'updatedAt', sortOrder: 'desc' });
|
|
787
|
+
if (sessions.length > 0) {
|
|
788
|
+
const session = loadSession(sessions[0].id);
|
|
789
|
+
if (session) {
|
|
790
|
+
console.log(chalk.green(t('cli.session.continuing', { id: sessions[0].id })));
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
else {
|
|
794
|
+
console.log(chalk.yellow(t('cli.session.noRecent')));
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
else if (options.resume !== undefined) {
|
|
798
|
+
if (options.resume === true || options.resume === '') {
|
|
799
|
+
await showSessionPicker(loop);
|
|
800
|
+
}
|
|
801
|
+
else {
|
|
802
|
+
// 检查是否需要 fork 会话
|
|
803
|
+
if (options.forkSession) {
|
|
804
|
+
// Fork 会话:创建新会话 ID,但保留历史消息
|
|
805
|
+
const forkedSessionData = forkSession(options.resume, {
|
|
806
|
+
name: undefined, // 使用默认名称
|
|
807
|
+
tags: undefined,
|
|
808
|
+
fromMessageIndex: 0, // 从开始复制所有消息
|
|
809
|
+
includeFutureMessages: true,
|
|
810
|
+
});
|
|
811
|
+
if (forkedSessionData) {
|
|
812
|
+
// 从 forkedSessionData 创建 Session 对象
|
|
813
|
+
const forkedSession = new Session(forkedSessionData.metadata.workingDirectory);
|
|
814
|
+
// 手动设置会话状态
|
|
815
|
+
forkedSession['state'] = {
|
|
816
|
+
sessionId: forkedSessionData.metadata.id,
|
|
817
|
+
cwd: forkedSessionData.metadata.workingDirectory,
|
|
818
|
+
originalCwd: forkedSessionData.metadata.workingDirectory,
|
|
819
|
+
startTime: forkedSessionData.metadata.createdAt,
|
|
820
|
+
totalCostUSD: forkedSessionData.metadata.cost || 0,
|
|
821
|
+
totalAPIDuration: 0,
|
|
822
|
+
totalAPIDurationWithoutRetries: 0,
|
|
823
|
+
totalToolDuration: 0,
|
|
824
|
+
totalLinesAdded: 0,
|
|
825
|
+
totalLinesRemoved: 0,
|
|
826
|
+
modelUsage: {},
|
|
827
|
+
alwaysAllowedTools: [],
|
|
828
|
+
todos: [],
|
|
829
|
+
};
|
|
830
|
+
// 设置消息历史
|
|
831
|
+
forkedSessionData.messages.forEach(msg => forkedSession.addMessage(msg));
|
|
832
|
+
// 设置到 loop
|
|
833
|
+
loop.setSession(forkedSession);
|
|
834
|
+
console.log(chalk.green(`✓ ${t('cli.session.forked', { id: options.resume.slice(0, 8) })}`));
|
|
835
|
+
console.log(chalk.green(` ${t('cli.session.newId', { id: forkedSessionData.metadata.id.slice(0, 8) })}`));
|
|
836
|
+
console.log(chalk.gray(` ${t('cli.session.copiedMessages', { count: forkedSessionData.messages.length })}`));
|
|
837
|
+
console.log(chalk.gray(` ${t('cli.session.independent')}`));
|
|
838
|
+
}
|
|
839
|
+
else {
|
|
840
|
+
console.log(chalk.yellow(t('cli.session.notFound', { id: options.resume })));
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
else {
|
|
844
|
+
// 正常恢复会话
|
|
845
|
+
const session = Session.load(options.resume);
|
|
846
|
+
if (session) {
|
|
847
|
+
loop.setSession(session);
|
|
848
|
+
// v2.1.32: 如果用户没有指定 --agent,但会话保存了 agent 值,则复用
|
|
849
|
+
if (!options.agent && session.getAgent()) {
|
|
850
|
+
options.agent = session.getAgent();
|
|
851
|
+
console.log(chalk.gray(` ${t('cli.session.reusingAgent', { agent: options.agent })}`));
|
|
852
|
+
}
|
|
853
|
+
console.log(chalk.green(t('cli.session.resumed', { id: options.resume })));
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
console.log(chalk.yellow(t('cli.session.notFound', { id: options.resume })));
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
else if (options.fromPr !== undefined) {
|
|
862
|
+
// v2.1.27: 通过 PR 号或 URL 恢复会话
|
|
863
|
+
if (options.fromPr === true || options.fromPr === '') {
|
|
864
|
+
// 显示 PR 会话选择器
|
|
865
|
+
await showPrSessionPicker(loop);
|
|
866
|
+
}
|
|
867
|
+
else {
|
|
868
|
+
// 通过 PR 号或 URL 查找会话
|
|
869
|
+
const sessionData = findSessionByPr(options.fromPr);
|
|
870
|
+
if (sessionData) {
|
|
871
|
+
const session = Session.load(sessionData.metadata.id);
|
|
872
|
+
if (session) {
|
|
873
|
+
loop.setSession(session);
|
|
874
|
+
const prInfo = sessionData.metadata.prNumber
|
|
875
|
+
? `PR #${sessionData.metadata.prNumber}`
|
|
876
|
+
: options.fromPr;
|
|
877
|
+
console.log(chalk.green(`Resumed session linked to ${prInfo}`));
|
|
878
|
+
}
|
|
879
|
+
else {
|
|
880
|
+
console.log(chalk.yellow(t('cli.session.prLoadFailed', { pr: options.fromPr })));
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
else {
|
|
884
|
+
console.log(chalk.yellow(t('cli.session.prNotFound', { pr: options.fromPr })));
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
// v2.1.32: 保存 --agent 值到会话(供 resume 复用)
|
|
889
|
+
if (options.agent && loop.getSession()) {
|
|
890
|
+
loop.getSession().setAgent(options.agent);
|
|
891
|
+
}
|
|
892
|
+
// v2.1.31: 设置全局追踪变量,用于退出时显示 resume 提示
|
|
893
|
+
activeSessionId = loop.getSession().sessionId;
|
|
894
|
+
isInteractiveMode = !options.print;
|
|
895
|
+
sessionPersistenceDisabled = options.sessionPersistence === false;
|
|
896
|
+
// 自动启动 daemon(如果未运行且存在动态任务或配置文件)
|
|
897
|
+
if (isInteractiveMode) {
|
|
898
|
+
try {
|
|
899
|
+
const { isDaemonRunning } = await import('./daemon/index.js');
|
|
900
|
+
const { TaskStore } = await import('./daemon/store.js');
|
|
901
|
+
const daemonFs = await import('fs');
|
|
902
|
+
const daemonPath = await import('path');
|
|
903
|
+
if (!isDaemonRunning()) {
|
|
904
|
+
const store = new TaskStore();
|
|
905
|
+
const hasTasks = store.listTasks().length > 0;
|
|
906
|
+
const hasConfig = daemonFs.existsSync(daemonPath.join(process.cwd(), '.axon', 'daemon.yml'))
|
|
907
|
+
|| daemonFs.existsSync(daemonPath.join((await import('os')).homedir(), '.axon', 'daemon.yml'));
|
|
908
|
+
if (hasTasks || hasConfig) {
|
|
909
|
+
// 后台启动 daemon(fork 子进程),stdout/stderr 重定向到日志文件
|
|
910
|
+
const { spawn } = await import('child_process');
|
|
911
|
+
const daemonOs = await import('os');
|
|
912
|
+
const claudeDir = daemonPath.join(daemonOs.homedir(), '.axon');
|
|
913
|
+
if (!daemonFs.existsSync(claudeDir)) {
|
|
914
|
+
daemonFs.mkdirSync(claudeDir, { recursive: true });
|
|
915
|
+
}
|
|
916
|
+
const logPath = daemonPath.join(claudeDir, 'daemon.log');
|
|
917
|
+
const logFd = daemonFs.openSync(logPath, 'a');
|
|
918
|
+
const daemonProcess = spawn(process.execPath, [daemonPath.join(import.meta.dirname, 'cli.js'), 'daemon', 'start'], {
|
|
919
|
+
detached: true,
|
|
920
|
+
stdio: ['ignore', logFd, logFd],
|
|
921
|
+
cwd: process.cwd(),
|
|
922
|
+
windowsHide: true,
|
|
923
|
+
});
|
|
924
|
+
daemonProcess.unref();
|
|
925
|
+
daemonFs.closeSync(logFd);
|
|
926
|
+
console.log(chalk.gray(`[Daemon auto-started, PID: ${daemonProcess.pid}]`));
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
catch {
|
|
931
|
+
// daemon 自动启动失败不影响主程序
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
// 如果有初始 prompt
|
|
935
|
+
if (prompt) {
|
|
936
|
+
console.log(chalk.blue('> ') + prompt);
|
|
937
|
+
console.log();
|
|
938
|
+
for await (const event of loop.processMessageStream(prompt)) {
|
|
939
|
+
if (event.type === 'text') {
|
|
940
|
+
process.stdout.write(event.content || '');
|
|
941
|
+
}
|
|
942
|
+
else if (event.type === 'tool_start') {
|
|
943
|
+
console.log(chalk.cyan(`\n[Using tool: ${event.toolName}]`));
|
|
944
|
+
}
|
|
945
|
+
else if (event.type === 'tool_end') {
|
|
946
|
+
console.log(chalk.gray(`[Result: ${(event.toolResult || '').substring(0, 100)}...]`));
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
console.log('\n');
|
|
950
|
+
}
|
|
951
|
+
// v2.1.10: 键盘缓冲 - 在 REPL 完全就绪前捕捉按键
|
|
952
|
+
// 这确保用户在启动过程中输入的内容不会丢失
|
|
953
|
+
const keyboardBuffer = [];
|
|
954
|
+
let isReplReady = false;
|
|
955
|
+
// 启用原始模式以捕捉按键(如果 stdin 是 TTY)
|
|
956
|
+
if (process.stdin.isTTY) {
|
|
957
|
+
process.stdin.setRawMode(true);
|
|
958
|
+
process.stdin.resume();
|
|
959
|
+
// 捕捉启动期间的按键
|
|
960
|
+
const earlyKeypressHandler = (chunk) => {
|
|
961
|
+
if (!isReplReady) {
|
|
962
|
+
const str = chunk.toString('utf8');
|
|
963
|
+
// Ctrl+C (0x03) — 在 raw mode 下不会自动产生 SIGINT,需要手动处理
|
|
964
|
+
if (str === '\x03') {
|
|
965
|
+
process.exit(0);
|
|
966
|
+
}
|
|
967
|
+
// 捕捉可打印字符和空格,忽略其他控制字符
|
|
968
|
+
if (str.length > 0 && str.charCodeAt(0) >= 32) {
|
|
969
|
+
keyboardBuffer.push(str);
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
};
|
|
973
|
+
process.stdin.on('data', earlyKeypressHandler);
|
|
974
|
+
// 设置超时,确保即使有问题也会停止捕捉
|
|
975
|
+
setTimeout(() => {
|
|
976
|
+
if (!isReplReady) {
|
|
977
|
+
isReplReady = true;
|
|
978
|
+
process.stdin.removeListener('data', earlyKeypressHandler);
|
|
979
|
+
if (process.stdin.isTTY) {
|
|
980
|
+
process.stdin.setRawMode(false);
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
}, 5000); // 5秒后强制停止捕捉
|
|
984
|
+
}
|
|
985
|
+
// 注册活跃会话标记(闹钟系统需要知道是否有前台会话)
|
|
986
|
+
const { writeActiveSession, clearActiveSession } = await import('./daemon/alarm.js');
|
|
987
|
+
writeActiveSession({
|
|
988
|
+
pid: process.pid,
|
|
989
|
+
sessionId: loop.getSession().sessionId,
|
|
990
|
+
startedAt: Date.now(),
|
|
991
|
+
});
|
|
992
|
+
// 退出时清除标记
|
|
993
|
+
const cleanupActiveSession = () => { try {
|
|
994
|
+
clearActiveSession();
|
|
995
|
+
}
|
|
996
|
+
catch { } };
|
|
997
|
+
process.on('exit', cleanupActiveSession);
|
|
998
|
+
// 交互式循环
|
|
999
|
+
const rl = readline.createInterface({
|
|
1000
|
+
input: process.stdin,
|
|
1001
|
+
output: process.stdout,
|
|
1002
|
+
});
|
|
1003
|
+
// REPL 现在已准备好
|
|
1004
|
+
isReplReady = true;
|
|
1005
|
+
// 如果有缓冲的按键,显示提示
|
|
1006
|
+
if (keyboardBuffer.length > 0) {
|
|
1007
|
+
console.log(chalk.dim(`[Captured ${keyboardBuffer.length} keystrokes during startup]`));
|
|
1008
|
+
}
|
|
1009
|
+
console.log(chalk.gray('> Try "how do I log an error?"'));
|
|
1010
|
+
console.log(chalk.gray('? for shortcuts'));
|
|
1011
|
+
console.log();
|
|
1012
|
+
// 如果有缓冲的按键,重放它们
|
|
1013
|
+
if (keyboardBuffer.length > 0) {
|
|
1014
|
+
const bufferedInput = keyboardBuffer.join('');
|
|
1015
|
+
if (bufferedInput.trim()) {
|
|
1016
|
+
console.log(chalk.blue('> ') + bufferedInput);
|
|
1017
|
+
// 自动处理缓冲的输入
|
|
1018
|
+
setTimeout(() => {
|
|
1019
|
+
rl.write(bufferedInput);
|
|
1020
|
+
}, 100);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
// 闹钟轮询:等待用户输入期间每 3 秒检查一次
|
|
1024
|
+
let alarmPollTimer = null;
|
|
1025
|
+
let isProcessing = false; // 模型正在处理时不检查闹钟
|
|
1026
|
+
const startAlarmPolling = () => {
|
|
1027
|
+
if (alarmPollTimer)
|
|
1028
|
+
return;
|
|
1029
|
+
alarmPollTimer = setInterval(async () => {
|
|
1030
|
+
if (isProcessing)
|
|
1031
|
+
return;
|
|
1032
|
+
try {
|
|
1033
|
+
const { readAlarms } = await import('./daemon/alarm.js');
|
|
1034
|
+
const alarms = readAlarms();
|
|
1035
|
+
if (alarms.length > 0) {
|
|
1036
|
+
// 有闹钟!暂停轮询,处理闹钟
|
|
1037
|
+
stopAlarmPolling();
|
|
1038
|
+
isProcessing = true;
|
|
1039
|
+
await loop.checkAndInjectAlarms();
|
|
1040
|
+
isProcessing = false;
|
|
1041
|
+
// 处理完后继续等待用户输入
|
|
1042
|
+
startAlarmPolling();
|
|
1043
|
+
process.stdout.write(chalk.white('> '));
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
catch {
|
|
1047
|
+
// 静默失败
|
|
1048
|
+
}
|
|
1049
|
+
}, 3000);
|
|
1050
|
+
};
|
|
1051
|
+
const stopAlarmPolling = () => {
|
|
1052
|
+
if (alarmPollTimer) {
|
|
1053
|
+
clearInterval(alarmPollTimer);
|
|
1054
|
+
alarmPollTimer = null;
|
|
1055
|
+
}
|
|
1056
|
+
};
|
|
1057
|
+
const askQuestion = () => {
|
|
1058
|
+
startAlarmPolling();
|
|
1059
|
+
rl.question(chalk.white('> '), async (input) => {
|
|
1060
|
+
stopAlarmPolling();
|
|
1061
|
+
input = input.trim();
|
|
1062
|
+
if (!input) {
|
|
1063
|
+
askQuestion();
|
|
1064
|
+
return;
|
|
1065
|
+
}
|
|
1066
|
+
// 斜杠命令
|
|
1067
|
+
if (input.startsWith('/') && !options.disableSlashCommands) {
|
|
1068
|
+
await handleSlashCommand(input, loop);
|
|
1069
|
+
askQuestion();
|
|
1070
|
+
return;
|
|
1071
|
+
}
|
|
1072
|
+
// 退出命令
|
|
1073
|
+
if (input.toLowerCase() === 'exit' || input.toLowerCase() === 'quit') {
|
|
1074
|
+
console.log(chalk.yellow(`\n${t('cli.misc.goodbye')}`));
|
|
1075
|
+
// 自动记忆:提取本次对话值得记住的信息
|
|
1076
|
+
console.error(chalk.gray('[AutoMemory] Saving conversation memory...'));
|
|
1077
|
+
await loop.autoMemorize();
|
|
1078
|
+
// SessionEnd hooks
|
|
1079
|
+
try {
|
|
1080
|
+
await runSessionEndHooks(activeSessionId || 'unknown', 'prompt_input_exit');
|
|
1081
|
+
}
|
|
1082
|
+
catch {
|
|
1083
|
+
// 不让 hook 失败阻止退出
|
|
1084
|
+
}
|
|
1085
|
+
const stats = loop.getSession().getStats();
|
|
1086
|
+
console.log(chalk.gray(`Session stats: ${stats.messageCount} messages, ${stats.totalCost}`));
|
|
1087
|
+
showSessionResumeHint();
|
|
1088
|
+
rl.close();
|
|
1089
|
+
process.exit(0);
|
|
1090
|
+
}
|
|
1091
|
+
// 处理消息
|
|
1092
|
+
console.log();
|
|
1093
|
+
isProcessing = true;
|
|
1094
|
+
try {
|
|
1095
|
+
for await (const event of loop.processMessageStream(input)) {
|
|
1096
|
+
if (event.type === 'text') {
|
|
1097
|
+
process.stdout.write(event.content || '');
|
|
1098
|
+
}
|
|
1099
|
+
else if (event.type === 'tool_start') {
|
|
1100
|
+
console.log(chalk.cyan(`\n[Using tool: ${event.toolName}]`));
|
|
1101
|
+
}
|
|
1102
|
+
else if (event.type === 'tool_end') {
|
|
1103
|
+
const preview = (event.toolResult || '').substring(0, 200);
|
|
1104
|
+
console.log(chalk.gray(`[Result: ${preview}${preview.length >= 200 ? '...' : ''}]`));
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
console.log('\n');
|
|
1108
|
+
}
|
|
1109
|
+
catch (err) {
|
|
1110
|
+
console.error(chalk.red(`\nError: ${err}`));
|
|
1111
|
+
}
|
|
1112
|
+
isProcessing = false;
|
|
1113
|
+
askQuestion();
|
|
1114
|
+
});
|
|
1115
|
+
};
|
|
1116
|
+
askQuestion();
|
|
1117
|
+
}
|
|
1118
|
+
// MCP 子命令
|
|
1119
|
+
const mcpCommand = program.command('mcp').description('Configure and manage MCP servers');
|
|
1120
|
+
// serve 命令 - 启动 Axon MCP 服务器
|
|
1121
|
+
mcpCommand
|
|
1122
|
+
.command('serve')
|
|
1123
|
+
.description('Start the Axon MCP server')
|
|
1124
|
+
.option('-p, --port <port>', 'Port to listen on', '3000')
|
|
1125
|
+
.option('--stdio', 'Use stdio transport instead of HTTP')
|
|
1126
|
+
.action(async (options) => {
|
|
1127
|
+
console.log(chalk.bold(`\n🚀 ${t('cli.mcp.startingServer')}\n`));
|
|
1128
|
+
// MCP Server 功能 - 占位实现
|
|
1129
|
+
console.log(chalk.cyan(t('cli.mcp.transport', { transport: options.stdio ? 'stdio' : `HTTP on port ${options.port}` })));
|
|
1130
|
+
console.log();
|
|
1131
|
+
console.log(chalk.yellow(`⚠️ ${t('cli.mcp.notImplemented')}`));
|
|
1132
|
+
console.log(chalk.gray('This feature allows Axon to act as an MCP server,'));
|
|
1133
|
+
console.log(chalk.gray('exposing its tools to other MCP-compatible applications.'));
|
|
1134
|
+
console.log();
|
|
1135
|
+
console.log(chalk.gray('For now, you can:'));
|
|
1136
|
+
console.log(chalk.gray(' • Use `claude mcp add` to add external MCP servers'));
|
|
1137
|
+
console.log(chalk.gray(' • Use `claude mcp list` to see configured servers'));
|
|
1138
|
+
console.log();
|
|
1139
|
+
});
|
|
1140
|
+
// add 命令 - 添加 MCP 服务器(支持命令和 URL)
|
|
1141
|
+
mcpCommand
|
|
1142
|
+
.command('add <name> <commandOrUrl> [args...]')
|
|
1143
|
+
.description('Add an MCP server to Axon')
|
|
1144
|
+
.option('-s, --scope <scope>', 'Configuration scope (local, user, project)', 'local')
|
|
1145
|
+
.option('-e, --env <env...>', 'Environment variables (KEY=VALUE)')
|
|
1146
|
+
.option('--client-id <clientId>', 'OAuth client ID for HTTP/SSE servers')
|
|
1147
|
+
.option('--client-secret', 'Prompt for OAuth client secret (or set MCP_CLIENT_SECRET env var)')
|
|
1148
|
+
.option('--callback-port <port>', 'Fixed port for OAuth callback (for servers requiring pre-registered redirect URIs)')
|
|
1149
|
+
.action(async (name, commandOrUrl, args, options) => {
|
|
1150
|
+
const env = {};
|
|
1151
|
+
if (options.env) {
|
|
1152
|
+
options.env.forEach((e) => {
|
|
1153
|
+
const [key, ...valueParts] = e.split('=');
|
|
1154
|
+
env[key] = valueParts.join('=');
|
|
1155
|
+
});
|
|
1156
|
+
}
|
|
1157
|
+
// 判断是 URL 还是命令
|
|
1158
|
+
const isUrl = commandOrUrl.startsWith('http://') || commandOrUrl.startsWith('https://');
|
|
1159
|
+
if (isUrl) {
|
|
1160
|
+
// v2.1.30: 构建 OAuth 配置
|
|
1161
|
+
const oauth = options.clientId ? {
|
|
1162
|
+
clientId: options.clientId,
|
|
1163
|
+
...(options.callbackPort ? { callbackPort: parseInt(options.callbackPort, 10) } : {}),
|
|
1164
|
+
} : undefined;
|
|
1165
|
+
// v2.1.30: 获取 client secret(从环境变量或提示输入)
|
|
1166
|
+
let clientSecret;
|
|
1167
|
+
if (options.clientSecret && options.clientId) {
|
|
1168
|
+
clientSecret = process.env.MCP_CLIENT_SECRET;
|
|
1169
|
+
if (!clientSecret) {
|
|
1170
|
+
// 使用 readline 提示输入
|
|
1171
|
+
const readline = await import('readline');
|
|
1172
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1173
|
+
clientSecret = await new Promise((resolve) => {
|
|
1174
|
+
rl.question(t('cli.mcp.enterSecret'), (answer) => {
|
|
1175
|
+
rl.close();
|
|
1176
|
+
resolve(answer);
|
|
1177
|
+
});
|
|
1178
|
+
});
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
// SSE 服务器
|
|
1182
|
+
const serverConfig = {
|
|
1183
|
+
type: 'sse',
|
|
1184
|
+
url: commandOrUrl,
|
|
1185
|
+
...(oauth ? { oauth } : {}),
|
|
1186
|
+
...(clientSecret ? { clientSecret } : {}),
|
|
1187
|
+
};
|
|
1188
|
+
configManager.addMcpServer(name, serverConfig);
|
|
1189
|
+
console.log(chalk.green(`✓ ${oauth ? t('cli.mcp.addedSseOauth', { name }) : t('cli.mcp.addedSse', { name })}`));
|
|
1190
|
+
}
|
|
1191
|
+
else {
|
|
1192
|
+
// stdio 服务器
|
|
1193
|
+
configManager.addMcpServer(name, {
|
|
1194
|
+
type: 'stdio',
|
|
1195
|
+
command: commandOrUrl,
|
|
1196
|
+
args: args || [],
|
|
1197
|
+
env,
|
|
1198
|
+
});
|
|
1199
|
+
console.log(chalk.green(`✓ ${t('cli.mcp.addedStdio', { name })}`));
|
|
1200
|
+
}
|
|
1201
|
+
});
|
|
1202
|
+
// remove 命令 - 移除 MCP 服务器
|
|
1203
|
+
mcpCommand
|
|
1204
|
+
.command('remove <name>')
|
|
1205
|
+
.description('Remove an MCP server')
|
|
1206
|
+
.option('-s, --scope <scope>', 'Configuration scope (local, user, project)', 'local')
|
|
1207
|
+
.action((name, options) => {
|
|
1208
|
+
if (configManager.removeMcpServer(name)) {
|
|
1209
|
+
console.log(chalk.green(`✓ ${t('cli.mcp.removed', { name })}`));
|
|
1210
|
+
}
|
|
1211
|
+
else {
|
|
1212
|
+
console.log(chalk.red(t('cli.mcp.notFound', { name })));
|
|
1213
|
+
}
|
|
1214
|
+
});
|
|
1215
|
+
// list 命令 - 列出所有 MCP 服务器
|
|
1216
|
+
mcpCommand
|
|
1217
|
+
.command('list')
|
|
1218
|
+
.description('List configured MCP servers')
|
|
1219
|
+
.option('--status', 'Check connection status of each server (starts and stops server processes)')
|
|
1220
|
+
.action(async (options) => {
|
|
1221
|
+
const servers = configManager.getMcpServers();
|
|
1222
|
+
const serverNames = Object.keys(servers);
|
|
1223
|
+
if (serverNames.length === 0) {
|
|
1224
|
+
console.log(t('cli.mcp.noServers'));
|
|
1225
|
+
return;
|
|
1226
|
+
}
|
|
1227
|
+
console.log(chalk.bold(`\n${t('cli.mcp.configuredServers')}\n`));
|
|
1228
|
+
// 如果请求状态,需要连接服务器检测
|
|
1229
|
+
if (options.status) {
|
|
1230
|
+
const { registerMcpServer, connectMcpServer, getServerStatus } = await import('./tools/mcp.js');
|
|
1231
|
+
for (const name of serverNames) {
|
|
1232
|
+
const config = servers[name];
|
|
1233
|
+
console.log(chalk.cyan(` ${name}`));
|
|
1234
|
+
console.log(chalk.gray(` Type: ${config.type}`));
|
|
1235
|
+
if (config.command) {
|
|
1236
|
+
console.log(chalk.gray(` Command: ${config.command} ${(config.args || []).join(' ')}`));
|
|
1237
|
+
}
|
|
1238
|
+
if (config.url) {
|
|
1239
|
+
console.log(chalk.gray(` URL: ${config.url}`));
|
|
1240
|
+
}
|
|
1241
|
+
// 尝试连接并获取状态
|
|
1242
|
+
try {
|
|
1243
|
+
registerMcpServer(name, config);
|
|
1244
|
+
const connected = await connectMcpServer(name, false); // 不重试
|
|
1245
|
+
const status = getServerStatus(name);
|
|
1246
|
+
if (connected && status) {
|
|
1247
|
+
console.log(chalk.green(` ${t('cli.mcp.statusConnected')}`));
|
|
1248
|
+
console.log(chalk.gray(` Tools: ${status.toolCount}`));
|
|
1249
|
+
console.log(chalk.gray(` Resources: ${status.resourceCount}`));
|
|
1250
|
+
}
|
|
1251
|
+
else {
|
|
1252
|
+
console.log(chalk.yellow(` ${t('cli.mcp.statusNotConnected')}`));
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
catch (err) {
|
|
1256
|
+
console.log(chalk.red(` ${t('cli.mcp.statusError', { error: err instanceof Error ? err.message : String(err) })}`));
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
// v2.1.6 修复: 确保所有启动的 MCP 进程都被清理
|
|
1260
|
+
console.log(chalk.gray(`\n${t('cli.mcp.cleaningUp')}`));
|
|
1261
|
+
await cleanupMcpServers(true); // resetFlag = true 允许后续再次清理
|
|
1262
|
+
console.log(chalk.gray(t('cli.mcp.done')));
|
|
1263
|
+
}
|
|
1264
|
+
else {
|
|
1265
|
+
// 不检查状态,只显示配置
|
|
1266
|
+
serverNames.forEach(name => {
|
|
1267
|
+
const config = servers[name];
|
|
1268
|
+
console.log(chalk.cyan(` ${name}`));
|
|
1269
|
+
console.log(chalk.gray(` Type: ${config.type}`));
|
|
1270
|
+
if (config.command) {
|
|
1271
|
+
console.log(chalk.gray(` Command: ${config.command} ${(config.args || []).join(' ')}`));
|
|
1272
|
+
}
|
|
1273
|
+
if (config.url) {
|
|
1274
|
+
console.log(chalk.gray(` URL: ${config.url}`));
|
|
1275
|
+
}
|
|
1276
|
+
});
|
|
1277
|
+
}
|
|
1278
|
+
console.log();
|
|
1279
|
+
});
|
|
1280
|
+
// get 命令 - 获取 MCP 服务器详情
|
|
1281
|
+
mcpCommand
|
|
1282
|
+
.command('get <name>')
|
|
1283
|
+
.description('Get details about an MCP server')
|
|
1284
|
+
.option('--status', 'Check connection status (starts and stops the server process)')
|
|
1285
|
+
.action(async (name, options) => {
|
|
1286
|
+
const servers = configManager.getMcpServers();
|
|
1287
|
+
const config = servers[name];
|
|
1288
|
+
if (!config) {
|
|
1289
|
+
console.log(chalk.red(`\n${t('cli.mcp.notFound', { name })}\n`));
|
|
1290
|
+
return;
|
|
1291
|
+
}
|
|
1292
|
+
console.log(chalk.bold(`\nMCP Server: ${chalk.cyan(name)}\n`));
|
|
1293
|
+
console.log(` Type: ${config.type}`);
|
|
1294
|
+
if (config.command) {
|
|
1295
|
+
console.log(` Command: ${config.command}`);
|
|
1296
|
+
if (config.args && config.args.length > 0) {
|
|
1297
|
+
console.log(` Arguments: ${config.args.join(' ')}`);
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
if (config.url) {
|
|
1301
|
+
console.log(` URL: ${config.url}`);
|
|
1302
|
+
}
|
|
1303
|
+
if (config.env && Object.keys(config.env).length > 0) {
|
|
1304
|
+
console.log(' Environment:');
|
|
1305
|
+
Object.entries(config.env).forEach(([key, value]) => {
|
|
1306
|
+
console.log(` ${key}=${value}`);
|
|
1307
|
+
});
|
|
1308
|
+
}
|
|
1309
|
+
// 如果请求状态,尝试连接服务器
|
|
1310
|
+
if (options.status) {
|
|
1311
|
+
const { registerMcpServer, connectMcpServer, getServerStatus } = await import('./tools/mcp.js');
|
|
1312
|
+
console.log(chalk.gray('\n Checking connection status...'));
|
|
1313
|
+
try {
|
|
1314
|
+
registerMcpServer(name, config);
|
|
1315
|
+
const connected = await connectMcpServer(name, false); // 不重试
|
|
1316
|
+
const status = getServerStatus(name);
|
|
1317
|
+
if (connected && status) {
|
|
1318
|
+
console.log(chalk.green(` ${t('cli.mcp.statusConnected')}`));
|
|
1319
|
+
console.log(` Capabilities: ${status.capabilities.join(', ') || 'none'}`);
|
|
1320
|
+
console.log(` Tools: ${status.toolCount}`);
|
|
1321
|
+
console.log(` Resources: ${status.resourceCount}`);
|
|
1322
|
+
}
|
|
1323
|
+
else {
|
|
1324
|
+
console.log(chalk.yellow(` ${t('cli.mcp.statusNotConnected')}`));
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
catch (err) {
|
|
1328
|
+
console.log(chalk.red(` ${t('cli.mcp.statusError', { error: err instanceof Error ? err.message : String(err) })}`));
|
|
1329
|
+
}
|
|
1330
|
+
// v2.1.6 修复: 确保启动的 MCP 进程被清理
|
|
1331
|
+
console.log(chalk.gray('\n Cleaning up MCP server process...'));
|
|
1332
|
+
await cleanupMcpServers(true); // resetFlag = true 允许后续再次清理
|
|
1333
|
+
console.log(chalk.gray(' Done.'));
|
|
1334
|
+
}
|
|
1335
|
+
else {
|
|
1336
|
+
// 不检查状态时的提示
|
|
1337
|
+
console.log(chalk.gray('\n Status: Use --status flag to check connection status'));
|
|
1338
|
+
}
|
|
1339
|
+
console.log();
|
|
1340
|
+
});
|
|
1341
|
+
// add-json 命令 - 用 JSON 字符串添加 MCP 服务器
|
|
1342
|
+
mcpCommand
|
|
1343
|
+
.command('add-json <name> <json>')
|
|
1344
|
+
.description('Add an MCP server (stdio or SSE) with a JSON string')
|
|
1345
|
+
.option('-s, --scope <scope>', 'Configuration scope (local, user, project)', 'local')
|
|
1346
|
+
.action((name, jsonString, options) => {
|
|
1347
|
+
try {
|
|
1348
|
+
const config = JSON.parse(jsonString);
|
|
1349
|
+
// 验证配置格式
|
|
1350
|
+
if (!config.type || !['stdio', 'sse', 'http'].includes(config.type)) {
|
|
1351
|
+
console.log(chalk.red(`\n❌ ${t('cli.mcp.invalidType')}\n`));
|
|
1352
|
+
return;
|
|
1353
|
+
}
|
|
1354
|
+
if (config.type === 'stdio' && !config.command) {
|
|
1355
|
+
console.log(chalk.red(`\n❌ ${t('cli.mcp.stdioRequiresCmd')}\n`));
|
|
1356
|
+
return;
|
|
1357
|
+
}
|
|
1358
|
+
if ((config.type === 'sse' || config.type === 'http') && !config.url) {
|
|
1359
|
+
console.log(chalk.red(`\n❌ ${t('cli.mcp.sseRequiresUrl')}\n`));
|
|
1360
|
+
return;
|
|
1361
|
+
}
|
|
1362
|
+
configManager.addMcpServer(name, config);
|
|
1363
|
+
console.log(chalk.green(`\n✓ ${t('cli.mcp.addedServer', { name })}\n`));
|
|
1364
|
+
console.log(chalk.gray(`Config: ${JSON.stringify(config, null, 2)}\n`));
|
|
1365
|
+
}
|
|
1366
|
+
catch (error) {
|
|
1367
|
+
console.log(chalk.red(`\n❌ ${t('cli.mcp.invalidJson', { error: error instanceof Error ? error.message : String(error) })}\n`));
|
|
1368
|
+
}
|
|
1369
|
+
});
|
|
1370
|
+
// add-from-claude-desktop 命令 - 从 Claude Desktop 导入 MCP 服务器
|
|
1371
|
+
mcpCommand
|
|
1372
|
+
.command('add-from-claude-desktop')
|
|
1373
|
+
.description('Import MCP servers from Claude Desktop (Mac and WSL only)')
|
|
1374
|
+
.option('--select <names...>', 'Select specific servers to import')
|
|
1375
|
+
.option('--all', 'Import all servers without prompting')
|
|
1376
|
+
.action(async (options) => {
|
|
1377
|
+
console.log(chalk.bold('\n📥 Importing MCP servers from Claude Desktop\n'));
|
|
1378
|
+
// 从 Claude Desktop 导入 MCP 服务器(功能尚未完全实现)
|
|
1379
|
+
console.log(chalk.yellow('⚠️ This feature is not yet fully implemented.\n'));
|
|
1380
|
+
console.log('Claude Desktop config locations:');
|
|
1381
|
+
console.log(chalk.gray(' macOS: ~/Library/Application Support/Claude/claude_desktop_config.json'));
|
|
1382
|
+
console.log(chalk.gray(' Windows: %APPDATA%\\Claude\\claude_desktop_config.json'));
|
|
1383
|
+
console.log(chalk.gray(' WSL: /mnt/c/Users/<username>/AppData/Roaming/Claude/claude_desktop_config.json\n'));
|
|
1384
|
+
console.log(chalk.cyan('To import manually, use: claude mcp add-json <server-name> \'{"command": "..."}\''));
|
|
1385
|
+
});
|
|
1386
|
+
// reset-project-choices 命令 - 重置项目级 MCP 服务器选择
|
|
1387
|
+
mcpCommand
|
|
1388
|
+
.command('reset-project-choices')
|
|
1389
|
+
.description('Reset all approved and rejected project-scoped (.mcp.json) servers')
|
|
1390
|
+
.action(() => {
|
|
1391
|
+
console.log(chalk.bold('\n🔄 Resetting project MCP server choices\n'));
|
|
1392
|
+
try {
|
|
1393
|
+
const projectMcpFile = path.join(process.cwd(), '.axon', '.mcp.json');
|
|
1394
|
+
if (fs.existsSync(projectMcpFile)) {
|
|
1395
|
+
fs.unlinkSync(projectMcpFile);
|
|
1396
|
+
console.log(chalk.green('✓ Reset project MCP server choices'));
|
|
1397
|
+
console.log(chalk.gray(` Removed: ${projectMcpFile}\n`));
|
|
1398
|
+
}
|
|
1399
|
+
else {
|
|
1400
|
+
console.log(chalk.gray('No project MCP choices found.\n'));
|
|
1401
|
+
}
|
|
1402
|
+
// 同时清除项目配置中的禁用服务器列表
|
|
1403
|
+
const projectSettingsFile = path.join(process.cwd(), '.axon', 'settings.json');
|
|
1404
|
+
if (fs.existsSync(projectSettingsFile)) {
|
|
1405
|
+
try {
|
|
1406
|
+
const settings = JSON.parse(fs.readFileSync(projectSettingsFile, 'utf-8'));
|
|
1407
|
+
if (settings.disabledMcpServers) {
|
|
1408
|
+
delete settings.disabledMcpServers;
|
|
1409
|
+
fs.writeFileSync(projectSettingsFile, JSON.stringify(settings, null, 2));
|
|
1410
|
+
console.log(chalk.green('✓ Cleared disabled MCP servers list'));
|
|
1411
|
+
console.log(chalk.gray(` Updated: ${projectSettingsFile}\n`));
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
catch (err) {
|
|
1415
|
+
// 忽略解析错误
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
console.log('All project MCP server choices have been reset.');
|
|
1419
|
+
console.log('You will be prompted again for approval when using project-scoped servers.\n');
|
|
1420
|
+
}
|
|
1421
|
+
catch (error) {
|
|
1422
|
+
console.log(chalk.red(`\n❌ Failed to reset: ${error instanceof Error ? error.message : error}\n`));
|
|
1423
|
+
}
|
|
1424
|
+
});
|
|
1425
|
+
// Plugin 子命令 - 使用完整实现
|
|
1426
|
+
program.addCommand(createPluginCommand());
|
|
1427
|
+
// Daemon 子命令
|
|
1428
|
+
const daemonCmd = program
|
|
1429
|
+
.command('daemon')
|
|
1430
|
+
.description('Manage daemon process for scheduled tasks and file watching');
|
|
1431
|
+
daemonCmd
|
|
1432
|
+
.command('start')
|
|
1433
|
+
.description('Start the daemon process (foreground)')
|
|
1434
|
+
.option('-c, --config <path>', 'Path to daemon config file')
|
|
1435
|
+
.action(async () => {
|
|
1436
|
+
const { DaemonManager } = await import('./daemon/index.js');
|
|
1437
|
+
const manager = new DaemonManager({ cwd: process.cwd() });
|
|
1438
|
+
try {
|
|
1439
|
+
await manager.start();
|
|
1440
|
+
// 保持进程运行
|
|
1441
|
+
await new Promise(() => { });
|
|
1442
|
+
}
|
|
1443
|
+
catch (err) {
|
|
1444
|
+
console.error(chalk.red(`Daemon start failed: ${err instanceof Error ? err.message : err}`));
|
|
1445
|
+
process.exit(1);
|
|
1446
|
+
}
|
|
1447
|
+
});
|
|
1448
|
+
daemonCmd
|
|
1449
|
+
.command('stop')
|
|
1450
|
+
.description('Stop the running daemon')
|
|
1451
|
+
.action(async () => {
|
|
1452
|
+
const { stopDaemon, isDaemonRunning } = await import('./daemon/index.js');
|
|
1453
|
+
if (!isDaemonRunning()) {
|
|
1454
|
+
console.log(chalk.yellow('No daemon is running.'));
|
|
1455
|
+
return;
|
|
1456
|
+
}
|
|
1457
|
+
if (stopDaemon()) {
|
|
1458
|
+
console.log(chalk.green('Daemon stopped.'));
|
|
1459
|
+
}
|
|
1460
|
+
else {
|
|
1461
|
+
console.log(chalk.red('Failed to stop daemon.'));
|
|
1462
|
+
}
|
|
1463
|
+
});
|
|
1464
|
+
daemonCmd
|
|
1465
|
+
.command('status')
|
|
1466
|
+
.description('Show daemon status')
|
|
1467
|
+
.action(async () => {
|
|
1468
|
+
const { getDaemonStatus } = await import('./daemon/index.js');
|
|
1469
|
+
const status = getDaemonStatus();
|
|
1470
|
+
if (!status.running) {
|
|
1471
|
+
console.log(chalk.yellow('Daemon is not running.'));
|
|
1472
|
+
console.log(chalk.gray('Start with: claude daemon start'));
|
|
1473
|
+
return;
|
|
1474
|
+
}
|
|
1475
|
+
console.log(chalk.green('Daemon is running.'));
|
|
1476
|
+
console.log(chalk.gray(` PID: ${status.pid}`));
|
|
1477
|
+
console.log(chalk.gray(` Dynamic tasks: ${status.dynamicTaskCount}`));
|
|
1478
|
+
});
|
|
1479
|
+
daemonCmd
|
|
1480
|
+
.command('tasks')
|
|
1481
|
+
.description('List all scheduled tasks')
|
|
1482
|
+
.action(async () => {
|
|
1483
|
+
const { TaskStore } = await import('./daemon/store.js');
|
|
1484
|
+
const store = new TaskStore();
|
|
1485
|
+
const tasks = store.listTasks();
|
|
1486
|
+
if (tasks.length === 0) {
|
|
1487
|
+
console.log(chalk.yellow('No scheduled tasks.'));
|
|
1488
|
+
return;
|
|
1489
|
+
}
|
|
1490
|
+
console.log(chalk.bold(`\nScheduled Tasks (${tasks.length}):\n`));
|
|
1491
|
+
for (const t of tasks) {
|
|
1492
|
+
console.log(chalk.cyan(` [${t.type}] ${t.name}`));
|
|
1493
|
+
console.log(chalk.gray(` ID: ${t.id}`));
|
|
1494
|
+
if (t.type === 'once' && t.triggerAt) {
|
|
1495
|
+
console.log(chalk.gray(` Trigger: ${new Date(t.triggerAt).toLocaleString()}`));
|
|
1496
|
+
}
|
|
1497
|
+
if (t.type === 'interval' && t.intervalMs) {
|
|
1498
|
+
console.log(chalk.gray(` Every: ${Math.round(t.intervalMs / 60000)} min`));
|
|
1499
|
+
}
|
|
1500
|
+
if (t.type === 'watch' && t.watchPaths) {
|
|
1501
|
+
console.log(chalk.gray(` Watch: ${t.watchPaths.join(', ')}`));
|
|
1502
|
+
}
|
|
1503
|
+
console.log(chalk.gray(` Prompt: ${t.prompt.slice(0, 80)}${t.prompt.length > 80 ? '...' : ''}`));
|
|
1504
|
+
console.log(chalk.gray(` Notify: ${t.notify.join(', ')}`));
|
|
1505
|
+
console.log(chalk.gray(` Enabled: ${t.enabled}`));
|
|
1506
|
+
console.log();
|
|
1507
|
+
}
|
|
1508
|
+
});
|
|
1509
|
+
// 工具子命令
|
|
1510
|
+
program
|
|
1511
|
+
.command('tools')
|
|
1512
|
+
.description('List available tools')
|
|
1513
|
+
.action(() => {
|
|
1514
|
+
console.log(chalk.bold('\nAvailable Tools:\n'));
|
|
1515
|
+
const tools = toolRegistry.getDefinitions();
|
|
1516
|
+
tools.forEach(tool => {
|
|
1517
|
+
console.log(chalk.cyan(` ${tool.name}`));
|
|
1518
|
+
console.log(chalk.gray(` ${tool.description.split('\n')[0]}`));
|
|
1519
|
+
});
|
|
1520
|
+
console.log();
|
|
1521
|
+
});
|
|
1522
|
+
// 会话子命令
|
|
1523
|
+
program
|
|
1524
|
+
.command('sessions')
|
|
1525
|
+
.description('List previous sessions')
|
|
1526
|
+
.option('-l, --limit <number>', 'Maximum sessions to show', '20')
|
|
1527
|
+
.option('-s, --search <term>', 'Search sessions')
|
|
1528
|
+
.action((options) => {
|
|
1529
|
+
const sessions = listSessions({
|
|
1530
|
+
limit: parseInt(options.limit),
|
|
1531
|
+
search: options.search,
|
|
1532
|
+
});
|
|
1533
|
+
if (sessions.length === 0) {
|
|
1534
|
+
console.log('No saved sessions found.');
|
|
1535
|
+
return;
|
|
1536
|
+
}
|
|
1537
|
+
console.log(chalk.bold('\nSaved Sessions:\n'));
|
|
1538
|
+
sessions.forEach(s => {
|
|
1539
|
+
const date = new Date(s.createdAt).toLocaleString();
|
|
1540
|
+
console.log(` ${chalk.cyan(s.id)}`);
|
|
1541
|
+
if (s.name) {
|
|
1542
|
+
console.log(` Name: ${s.name}`);
|
|
1543
|
+
}
|
|
1544
|
+
console.log(` Created: ${date}`);
|
|
1545
|
+
console.log(` Directory: ${s.workingDirectory}`);
|
|
1546
|
+
console.log(` Messages: ${s.messageCount}\n`);
|
|
1547
|
+
});
|
|
1548
|
+
});
|
|
1549
|
+
// Doctor 命令
|
|
1550
|
+
program
|
|
1551
|
+
.command('doctor')
|
|
1552
|
+
.description('Check the health of your Axon installation')
|
|
1553
|
+
.option('--verbose', 'Show detailed diagnostics')
|
|
1554
|
+
.action(async (options) => {
|
|
1555
|
+
const { runDiagnostics, formatDiagnosticReport } = await import('./diagnostics/index.js');
|
|
1556
|
+
console.log(chalk.bold('\nRunning Axon diagnostics...\n'));
|
|
1557
|
+
try {
|
|
1558
|
+
const report = await runDiagnostics();
|
|
1559
|
+
console.log(formatDiagnosticReport(report));
|
|
1560
|
+
if (report.summary.failed > 0) {
|
|
1561
|
+
console.log(chalk.red(` ✗ ${report.summary.failed} critical issue(s) found`));
|
|
1562
|
+
}
|
|
1563
|
+
if (report.summary.warnings > 0) {
|
|
1564
|
+
console.log(chalk.yellow(` ⚠ ${report.summary.warnings} warning(s)`));
|
|
1565
|
+
}
|
|
1566
|
+
if (report.summary.failed === 0 && report.summary.warnings === 0) {
|
|
1567
|
+
console.log(chalk.green(' ✓ All checks passed!'));
|
|
1568
|
+
}
|
|
1569
|
+
if (options.verbose) {
|
|
1570
|
+
console.log(chalk.gray('\n Additional info:'));
|
|
1571
|
+
console.log(chalk.gray(` - Working directory: ${process.cwd()}`));
|
|
1572
|
+
console.log(chalk.gray(` - Tools registered: ${toolRegistry.getAll().length}`));
|
|
1573
|
+
const mcpServers = Object.keys(configManager.getMcpServers());
|
|
1574
|
+
console.log(chalk.gray(` - MCP servers: ${mcpServers.length}`));
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
catch (err) {
|
|
1578
|
+
console.log(chalk.red(`\n ✗ Diagnostics failed: ${err}`));
|
|
1579
|
+
}
|
|
1580
|
+
console.log();
|
|
1581
|
+
});
|
|
1582
|
+
// Setup Token 命令
|
|
1583
|
+
program
|
|
1584
|
+
.command('setup-token')
|
|
1585
|
+
.description('Set up a long-lived authentication token (requires Claude subscription)')
|
|
1586
|
+
.action(async () => {
|
|
1587
|
+
console.log(chalk.bold('\nSetup Authentication Token\n'));
|
|
1588
|
+
console.log(chalk.gray('This feature requires a Claude subscription.'));
|
|
1589
|
+
console.log(chalk.gray('Visit https://platform.claude.com to get your API key.\n'));
|
|
1590
|
+
const rl = readline.createInterface({
|
|
1591
|
+
input: process.stdin,
|
|
1592
|
+
output: process.stdout,
|
|
1593
|
+
});
|
|
1594
|
+
rl.question('Enter your API key: ', (apiKey) => {
|
|
1595
|
+
if (apiKey.trim()) {
|
|
1596
|
+
configManager.set('apiKey', apiKey.trim());
|
|
1597
|
+
console.log(chalk.green('\n✓ API key saved successfully!'));
|
|
1598
|
+
}
|
|
1599
|
+
else {
|
|
1600
|
+
console.log(chalk.yellow('\nNo API key provided.'));
|
|
1601
|
+
}
|
|
1602
|
+
rl.close();
|
|
1603
|
+
});
|
|
1604
|
+
});
|
|
1605
|
+
// Update 命令
|
|
1606
|
+
program
|
|
1607
|
+
.command('update')
|
|
1608
|
+
.description('Check for updates and install if available')
|
|
1609
|
+
.option('--force', 'Force reinstall even if already up to date')
|
|
1610
|
+
.option('--beta', 'Install beta version')
|
|
1611
|
+
.option('--canary', 'Install canary version')
|
|
1612
|
+
.option('--dry-run', 'Show what would be updated without actually updating')
|
|
1613
|
+
.option('--list-versions', 'List all available versions')
|
|
1614
|
+
.option('--version <version>', 'Install a specific version')
|
|
1615
|
+
.option('--rollback <version>', 'Rollback to a specific version')
|
|
1616
|
+
.action(async (options) => {
|
|
1617
|
+
const { checkForUpdates, performUpdate, rollbackVersion, listVersions } = await import('./updater/index.js');
|
|
1618
|
+
console.log(chalk.bold('\n📦 Axon Update Manager\n'));
|
|
1619
|
+
try {
|
|
1620
|
+
// 列出可用版本
|
|
1621
|
+
if (options.listVersions) {
|
|
1622
|
+
console.log(chalk.cyan('Fetching available versions...\n'));
|
|
1623
|
+
const versions = await listVersions();
|
|
1624
|
+
console.log(chalk.bold('Available Versions:\n'));
|
|
1625
|
+
versions.slice(0, 20).forEach((v, i) => {
|
|
1626
|
+
if (i === 0) {
|
|
1627
|
+
console.log(chalk.green(` ✓ ${v} (latest)`));
|
|
1628
|
+
}
|
|
1629
|
+
else {
|
|
1630
|
+
console.log(chalk.gray(` ${v}`));
|
|
1631
|
+
}
|
|
1632
|
+
});
|
|
1633
|
+
if (versions.length > 20) {
|
|
1634
|
+
console.log(chalk.gray(`\n ... and ${versions.length - 20} more versions`));
|
|
1635
|
+
}
|
|
1636
|
+
console.log();
|
|
1637
|
+
return;
|
|
1638
|
+
}
|
|
1639
|
+
// 回滚版本
|
|
1640
|
+
if (options.rollback) {
|
|
1641
|
+
console.log(chalk.yellow(`Rolling back to version ${options.rollback}...\n`));
|
|
1642
|
+
const success = await rollbackVersion(options.rollback, {
|
|
1643
|
+
showProgress: true,
|
|
1644
|
+
dryRun: options.dryRun,
|
|
1645
|
+
});
|
|
1646
|
+
if (success) {
|
|
1647
|
+
console.log(chalk.green(`\n✓ Successfully rolled back to version ${options.rollback}`));
|
|
1648
|
+
}
|
|
1649
|
+
else {
|
|
1650
|
+
console.log(chalk.red('\n✗ Rollback failed'));
|
|
1651
|
+
}
|
|
1652
|
+
return;
|
|
1653
|
+
}
|
|
1654
|
+
// 检查更新
|
|
1655
|
+
console.log(chalk.cyan(`Current version: ${VERSION_FULL}\n`));
|
|
1656
|
+
console.log(chalk.gray('Checking for updates...\n'));
|
|
1657
|
+
const updateInfo = await checkForUpdates({
|
|
1658
|
+
channel: options.canary ? 'canary' : options.beta ? 'beta' : 'stable',
|
|
1659
|
+
});
|
|
1660
|
+
if (!updateInfo.hasUpdate && !options.force) {
|
|
1661
|
+
console.log(chalk.green('✓ You are already on the latest version!'));
|
|
1662
|
+
console.log();
|
|
1663
|
+
return;
|
|
1664
|
+
}
|
|
1665
|
+
// 显示版本信息
|
|
1666
|
+
console.log(chalk.bold('Update Available:\n'));
|
|
1667
|
+
console.log(` Current: ${chalk.gray(updateInfo.current)}`);
|
|
1668
|
+
console.log(` Latest: ${chalk.green(updateInfo.latest)}\n`);
|
|
1669
|
+
// 显示变更日志
|
|
1670
|
+
if (updateInfo.changelog && updateInfo.changelog.length > 0) {
|
|
1671
|
+
console.log(chalk.bold('Recent Versions:\n'));
|
|
1672
|
+
updateInfo.changelog.slice(0, 5).forEach(v => {
|
|
1673
|
+
console.log(chalk.gray(` • ${v}`));
|
|
1674
|
+
});
|
|
1675
|
+
console.log();
|
|
1676
|
+
}
|
|
1677
|
+
// 显示版本详情
|
|
1678
|
+
if (updateInfo.versionInfo) {
|
|
1679
|
+
const info = updateInfo.versionInfo;
|
|
1680
|
+
if (info.description) {
|
|
1681
|
+
console.log(chalk.gray(`Description: ${info.description}\n`));
|
|
1682
|
+
}
|
|
1683
|
+
if (info.minimumNodeVersion) {
|
|
1684
|
+
console.log(chalk.gray(`Required Node.js: ${info.minimumNodeVersion}\n`));
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
// 执行更新
|
|
1688
|
+
if (options.dryRun) {
|
|
1689
|
+
console.log(chalk.yellow('[DRY-RUN] Would update to version ' + updateInfo.latest));
|
|
1690
|
+
console.log(chalk.gray('Run without --dry-run to perform the actual update\n'));
|
|
1691
|
+
return;
|
|
1692
|
+
}
|
|
1693
|
+
// 确认更新
|
|
1694
|
+
const rl = readline.createInterface({
|
|
1695
|
+
input: process.stdin,
|
|
1696
|
+
output: process.stdout,
|
|
1697
|
+
});
|
|
1698
|
+
const shouldUpdate = await new Promise((resolve) => {
|
|
1699
|
+
rl.question(chalk.yellow(`\nUpdate to ${updateInfo.latest}? (y/N) `), (answer) => {
|
|
1700
|
+
rl.close();
|
|
1701
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
1702
|
+
});
|
|
1703
|
+
});
|
|
1704
|
+
if (!shouldUpdate && !options.force) {
|
|
1705
|
+
console.log(chalk.gray('\nUpdate cancelled.\n'));
|
|
1706
|
+
return;
|
|
1707
|
+
}
|
|
1708
|
+
console.log(chalk.cyan('\nUpdating...\n'));
|
|
1709
|
+
const success = await performUpdate({
|
|
1710
|
+
version: options.version,
|
|
1711
|
+
force: options.force,
|
|
1712
|
+
beta: options.beta,
|
|
1713
|
+
canary: options.canary,
|
|
1714
|
+
showProgress: true,
|
|
1715
|
+
dryRun: false,
|
|
1716
|
+
});
|
|
1717
|
+
if (success) {
|
|
1718
|
+
console.log(chalk.green('\n✓ Update completed successfully!'));
|
|
1719
|
+
console.log(chalk.gray('Please restart Axon to use the new version.\n'));
|
|
1720
|
+
}
|
|
1721
|
+
else {
|
|
1722
|
+
console.log(chalk.red('\n✗ Update failed'));
|
|
1723
|
+
console.log(chalk.gray('Try running: npm install -g axon-code\n'));
|
|
1724
|
+
}
|
|
1725
|
+
}
|
|
1726
|
+
catch (error) {
|
|
1727
|
+
console.error(chalk.red('Error during update:'), error);
|
|
1728
|
+
console.log(chalk.gray('\nManual update:'));
|
|
1729
|
+
console.log(chalk.gray(' npm install -g axon-code\n'));
|
|
1730
|
+
}
|
|
1731
|
+
});
|
|
1732
|
+
// Install 命令
|
|
1733
|
+
program
|
|
1734
|
+
.command('install [target]')
|
|
1735
|
+
.description('Install Axon native build')
|
|
1736
|
+
.option('--force', 'Force reinstall')
|
|
1737
|
+
.action((target, options) => {
|
|
1738
|
+
const version = target || 'stable';
|
|
1739
|
+
console.log(chalk.bold(`\nInstalling Axon (${version})...\n`));
|
|
1740
|
+
console.log(chalk.gray('For native builds, please visit:'));
|
|
1741
|
+
console.log(chalk.cyan('https://github.com/anthropics/claude-code\n'));
|
|
1742
|
+
});
|
|
1743
|
+
// GitHub Actions 设置命令
|
|
1744
|
+
program
|
|
1745
|
+
.command('github-setup')
|
|
1746
|
+
.description('Set up Axon GitHub Actions workflow')
|
|
1747
|
+
.action(async () => {
|
|
1748
|
+
console.log(chalk.bold('\n🐙 Setting up Axon GitHub Actions...\n'));
|
|
1749
|
+
const { checkGitHubCLI, setupGitHubWorkflow } = await import('./github/index.js');
|
|
1750
|
+
const ghStatus = await checkGitHubCLI();
|
|
1751
|
+
if (!ghStatus.installed) {
|
|
1752
|
+
console.log(chalk.yellow(`⚠️ ${t('cli.github.ghNotInstalled')}`));
|
|
1753
|
+
console.log(chalk.gray(` ${t('cli.github.installFrom')}\n`));
|
|
1754
|
+
}
|
|
1755
|
+
else if (!ghStatus.authenticated) {
|
|
1756
|
+
console.log(chalk.yellow(`⚠️ ${t('cli.github.ghNotAuth')}`));
|
|
1757
|
+
console.log(chalk.gray(` ${t('cli.github.runGhAuth')}\n`));
|
|
1758
|
+
}
|
|
1759
|
+
else {
|
|
1760
|
+
console.log(chalk.green(`✓ ${t('cli.github.ghReady')}`));
|
|
1761
|
+
}
|
|
1762
|
+
const result = await setupGitHubWorkflow(process.cwd());
|
|
1763
|
+
if (result.success) {
|
|
1764
|
+
console.log(chalk.green(`\n✓ ${result.message}`));
|
|
1765
|
+
console.log(chalk.gray(` Path: ${result.workflowPath}`));
|
|
1766
|
+
console.log(chalk.bold(`\n${t('cli.github.nextSteps')}`));
|
|
1767
|
+
console.log(t('cli.github.addSecret'));
|
|
1768
|
+
console.log(t('cli.github.settingsPath'));
|
|
1769
|
+
console.log(t('cli.github.commitPush'));
|
|
1770
|
+
console.log(t('cli.github.openPr'));
|
|
1771
|
+
}
|
|
1772
|
+
else {
|
|
1773
|
+
console.log(chalk.yellow(`\n⚠️ ${result.message}`));
|
|
1774
|
+
if (result.workflowPath) {
|
|
1775
|
+
console.log(chalk.gray(` Path: ${result.workflowPath}`));
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1778
|
+
console.log();
|
|
1779
|
+
});
|
|
1780
|
+
// PR Review 命令
|
|
1781
|
+
program
|
|
1782
|
+
.command('review-pr <number>')
|
|
1783
|
+
.description('Review a GitHub pull request')
|
|
1784
|
+
.action(async (prNumber) => {
|
|
1785
|
+
console.log(chalk.bold(`\n📝 Reviewing PR #${prNumber}...\n`));
|
|
1786
|
+
const { checkGitHubCLI, getPRInfo } = await import('./github/index.js');
|
|
1787
|
+
const ghStatus = await checkGitHubCLI();
|
|
1788
|
+
if (!ghStatus.authenticated) {
|
|
1789
|
+
console.log(chalk.red(`${t('cli.github.ghNotAuth')} ${t('cli.github.runGhAuth')}`));
|
|
1790
|
+
return;
|
|
1791
|
+
}
|
|
1792
|
+
const prInfo = await getPRInfo(parseInt(prNumber));
|
|
1793
|
+
if (!prInfo) {
|
|
1794
|
+
console.log(chalk.red(`Failed to get PR #${prNumber} info`));
|
|
1795
|
+
return;
|
|
1796
|
+
}
|
|
1797
|
+
console.log(chalk.cyan(`Title: ${prInfo.title}`));
|
|
1798
|
+
console.log(chalk.gray(`Author: ${prInfo.author}`));
|
|
1799
|
+
console.log(chalk.gray(`State: ${prInfo.state}`));
|
|
1800
|
+
console.log(chalk.gray(`Changes: +${prInfo.additions} -${prInfo.deletions} (${prInfo.changedFiles} files)`));
|
|
1801
|
+
console.log();
|
|
1802
|
+
console.log(chalk.gray('Use Claude to review: claude "review PR #' + prNumber + '"'));
|
|
1803
|
+
console.log();
|
|
1804
|
+
});
|
|
1805
|
+
// Provider 命令
|
|
1806
|
+
program
|
|
1807
|
+
.command('provider')
|
|
1808
|
+
.description('Show current API provider configuration')
|
|
1809
|
+
.action(async () => {
|
|
1810
|
+
const { detectProvider, getProviderInfo, validateProviderConfig, getProviderDisplayName } = await import('./providers/index.js');
|
|
1811
|
+
console.log(chalk.bold('\n☁️ API Provider Configuration\n'));
|
|
1812
|
+
const config = detectProvider();
|
|
1813
|
+
const info = getProviderInfo(config);
|
|
1814
|
+
const validation = validateProviderConfig(config);
|
|
1815
|
+
console.log(` Provider: ${chalk.cyan(getProviderDisplayName(config.type))}`);
|
|
1816
|
+
console.log(` Model: ${chalk.gray(info.model)}`);
|
|
1817
|
+
console.log(` Base URL: ${chalk.gray(info.baseUrl)}`);
|
|
1818
|
+
if (info.region) {
|
|
1819
|
+
console.log(` Region: ${chalk.gray(info.region)}`);
|
|
1820
|
+
}
|
|
1821
|
+
if (validation.valid) {
|
|
1822
|
+
console.log(chalk.green('\n ✓ Configuration is valid'));
|
|
1823
|
+
}
|
|
1824
|
+
else {
|
|
1825
|
+
console.log(chalk.red('\n ✗ Configuration issues:'));
|
|
1826
|
+
validation.errors.forEach((err) => {
|
|
1827
|
+
console.log(chalk.red(` - ${err}`));
|
|
1828
|
+
});
|
|
1829
|
+
}
|
|
1830
|
+
console.log(chalk.gray('\n Environment variables:'));
|
|
1831
|
+
const envVars = [
|
|
1832
|
+
'ANTHROPIC_API_KEY',
|
|
1833
|
+
'AXON_USE_BEDROCK',
|
|
1834
|
+
'AXON_USE_VERTEX',
|
|
1835
|
+
'AWS_REGION',
|
|
1836
|
+
'ANTHROPIC_VERTEX_PROJECT_ID',
|
|
1837
|
+
];
|
|
1838
|
+
envVars.forEach((v) => {
|
|
1839
|
+
const val = process.env[v];
|
|
1840
|
+
if (val) {
|
|
1841
|
+
const display = v.includes('KEY') ? `***${val.slice(-4)}` : val;
|
|
1842
|
+
console.log(chalk.gray(` ${v}=${display}`));
|
|
1843
|
+
}
|
|
1844
|
+
});
|
|
1845
|
+
console.log();
|
|
1846
|
+
});
|
|
1847
|
+
// Checkpoint 命令
|
|
1848
|
+
program
|
|
1849
|
+
.command('checkpoint')
|
|
1850
|
+
.description('Manage file checkpoints')
|
|
1851
|
+
.argument('[action]', 'Action: list, restore, clear')
|
|
1852
|
+
.argument('[file]', 'File path (for restore)')
|
|
1853
|
+
.action(async (action, file) => {
|
|
1854
|
+
const { getCurrentSession, getCheckpointHistory, restoreCheckpoint, clearCheckpoints } = await import('./checkpoint/index.js');
|
|
1855
|
+
const session = getCurrentSession();
|
|
1856
|
+
if (!action || action === 'list') {
|
|
1857
|
+
console.log(chalk.bold('\n📌 File Checkpoints\n'));
|
|
1858
|
+
if (!session) {
|
|
1859
|
+
console.log(chalk.gray(' No active checkpoint session.'));
|
|
1860
|
+
console.log();
|
|
1861
|
+
return;
|
|
1862
|
+
}
|
|
1863
|
+
const files = Array.from(session.checkpoints.keys());
|
|
1864
|
+
if (files.length === 0) {
|
|
1865
|
+
console.log(chalk.gray(' No checkpoints recorded yet.'));
|
|
1866
|
+
}
|
|
1867
|
+
else {
|
|
1868
|
+
files.forEach((f) => {
|
|
1869
|
+
const history = getCheckpointHistory(f);
|
|
1870
|
+
console.log(chalk.cyan(` ${f}`));
|
|
1871
|
+
console.log(chalk.gray(` ${history.checkpoints.length} checkpoint(s), current: #${history.currentIndex + 1}`));
|
|
1872
|
+
});
|
|
1873
|
+
}
|
|
1874
|
+
}
|
|
1875
|
+
else if (action === 'restore' && file) {
|
|
1876
|
+
const result = restoreCheckpoint(file);
|
|
1877
|
+
if (result.success) {
|
|
1878
|
+
console.log(chalk.green(`\n ✓ ${result.message}`));
|
|
1879
|
+
}
|
|
1880
|
+
else {
|
|
1881
|
+
console.log(chalk.red(`\n ✗ ${result.message}`));
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
else if (action === 'clear') {
|
|
1885
|
+
clearCheckpoints();
|
|
1886
|
+
console.log(chalk.green('\n ✓ All checkpoints cleared'));
|
|
1887
|
+
}
|
|
1888
|
+
else {
|
|
1889
|
+
console.log(chalk.yellow('\n Usage: claude checkpoint [list|restore <file>|clear]'));
|
|
1890
|
+
}
|
|
1891
|
+
console.log();
|
|
1892
|
+
});
|
|
1893
|
+
// Login 命令
|
|
1894
|
+
program
|
|
1895
|
+
.command('login')
|
|
1896
|
+
.description('Login to Claude API or claude.ai')
|
|
1897
|
+
.option('--api-key', 'Setup with API key')
|
|
1898
|
+
.option('--oauth', 'OAuth login (interactive)')
|
|
1899
|
+
.option('--claudeai', 'OAuth with Claude.ai account')
|
|
1900
|
+
.option('--console', 'OAuth with Anthropic Console account')
|
|
1901
|
+
.action(async (options) => {
|
|
1902
|
+
const { startOAuthLogin, isAuthenticated, getAuthType, getAuth, } = await import('./auth/index.js');
|
|
1903
|
+
console.log(chalk.bold('\n🔐 Axon Login\n'));
|
|
1904
|
+
// 检查当前认证状态
|
|
1905
|
+
const hasApiKey = !!(process.env.ANTHROPIC_API_KEY || process.env.AXON_API_KEY);
|
|
1906
|
+
const hasCredentials = fs.existsSync(path.join(os.homedir(), '.axon', 'credentials.json'));
|
|
1907
|
+
const hasOAuthToken = fs.existsSync(path.join(os.homedir(), '.axon', 'auth.json'));
|
|
1908
|
+
let authStatus = 'Not authenticated';
|
|
1909
|
+
if (hasApiKey) {
|
|
1910
|
+
authStatus = 'Authenticated (API Key from environment)';
|
|
1911
|
+
}
|
|
1912
|
+
else if (hasCredentials) {
|
|
1913
|
+
authStatus = 'Authenticated (API Key from file)';
|
|
1914
|
+
}
|
|
1915
|
+
else if (hasOAuthToken) {
|
|
1916
|
+
authStatus = 'Authenticated (OAuth)';
|
|
1917
|
+
}
|
|
1918
|
+
// 无参数时显示帮助
|
|
1919
|
+
if (!options.apiKey && !options.oauth && !options.claudeai && !options.console) {
|
|
1920
|
+
console.log(`Current Status: ${chalk.cyan(authStatus)}\n`);
|
|
1921
|
+
console.log(chalk.bold('Login Methods:\n'));
|
|
1922
|
+
console.log(' 1. API Key (Recommended for developers)');
|
|
1923
|
+
console.log(' • Get key from: https://platform.claude.com');
|
|
1924
|
+
console.log(chalk.cyan(' • Command: claude login --api-key\n'));
|
|
1925
|
+
console.log(' 2. OAuth with Claude.ai Account');
|
|
1926
|
+
console.log(' • For Claude Pro/Max subscribers');
|
|
1927
|
+
console.log(chalk.cyan(' • Command: claude login --claudeai\n'));
|
|
1928
|
+
console.log(' 3. OAuth with Console Account');
|
|
1929
|
+
console.log(' • For Anthropic Console users');
|
|
1930
|
+
console.log(chalk.cyan(' • Command: claude login --console\n'));
|
|
1931
|
+
console.log(chalk.bold('Quick Start:\n'));
|
|
1932
|
+
console.log(chalk.gray(' claude login --api-key Setup API key'));
|
|
1933
|
+
console.log(chalk.gray(' claude login --oauth Interactive OAuth'));
|
|
1934
|
+
console.log(chalk.gray(' claude setup-token Generate long-term token\n'));
|
|
1935
|
+
return;
|
|
1936
|
+
}
|
|
1937
|
+
// --api-key 方法
|
|
1938
|
+
if (options.apiKey) {
|
|
1939
|
+
console.log(chalk.bold('API Key Setup\n'));
|
|
1940
|
+
console.log('API keys provide usage-based billing and are the recommended method');
|
|
1941
|
+
console.log('for developers using Axon.\n');
|
|
1942
|
+
console.log(chalk.bold('Steps:\n'));
|
|
1943
|
+
console.log('1. Get your API key:');
|
|
1944
|
+
console.log(chalk.cyan(' Visit: https://platform.claude.com/settings/keys'));
|
|
1945
|
+
console.log(' Create or copy an existing key\n');
|
|
1946
|
+
console.log('2. Set the API key (choose one method):\n');
|
|
1947
|
+
console.log(' a) Environment variable (recommended):');
|
|
1948
|
+
console.log(chalk.gray(' export ANTHROPIC_API_KEY=sk-ant-your-key-here\n'));
|
|
1949
|
+
console.log(' b) Direct setup (stores in ~/.axon/credentials.json):');
|
|
1950
|
+
console.log(chalk.gray(' claude setup-token\n'));
|
|
1951
|
+
console.log('3. Verify:');
|
|
1952
|
+
console.log(chalk.gray(' claude doctor\n'));
|
|
1953
|
+
console.log(`Current Status: ${chalk.cyan(authStatus)}\n`);
|
|
1954
|
+
return;
|
|
1955
|
+
}
|
|
1956
|
+
// OAuth 方法
|
|
1957
|
+
if (options.oauth || options.claudeai || options.console) {
|
|
1958
|
+
const loginType = options.claudeai
|
|
1959
|
+
? 'Claude.ai (Subscription)'
|
|
1960
|
+
: options.console
|
|
1961
|
+
? 'Console (API Billing)'
|
|
1962
|
+
: 'OAuth';
|
|
1963
|
+
console.log(chalk.bold(`OAuth Login: ${loginType}\n`));
|
|
1964
|
+
console.log('OAuth authentication provides seamless integration with your Claude');
|
|
1965
|
+
console.log('or Anthropic Console account.\n');
|
|
1966
|
+
try {
|
|
1967
|
+
console.log(chalk.cyan('Starting OAuth login flow...\n'));
|
|
1968
|
+
const accountType = options.claudeai ? 'claude.ai' : 'console';
|
|
1969
|
+
const authResult = await startOAuthLogin({ accountType });
|
|
1970
|
+
if (authResult && authResult.accessToken) {
|
|
1971
|
+
console.log(chalk.green(`\n✅ ${t('cli.auth.oauthSuccess')}\n`));
|
|
1972
|
+
console.log(t('cli.auth.authDetails'));
|
|
1973
|
+
console.log(` • Type: OAuth`);
|
|
1974
|
+
console.log(` • Access Token: ${authResult.accessToken.substring(0, 20)}...`);
|
|
1975
|
+
if (authResult.expiresAt) {
|
|
1976
|
+
console.log(` • Expires At: ${new Date(authResult.expiresAt).toLocaleString()}`);
|
|
1977
|
+
}
|
|
1978
|
+
console.log(`\n${t('cli.auth.credsSaved')}\n`);
|
|
1979
|
+
console.log(`${t('cli.auth.canUseNow')}\n`);
|
|
1980
|
+
console.log(t('cli.auth.toVerify'));
|
|
1981
|
+
console.log(chalk.gray(' claude doctor'));
|
|
1982
|
+
console.log(chalk.gray(' claude api test\n'));
|
|
1983
|
+
}
|
|
1984
|
+
else {
|
|
1985
|
+
throw new Error('OAuth login returned invalid result');
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
catch (error) {
|
|
1989
|
+
console.log(chalk.red(`\n❌ ${t('cli.auth.oauthFailed')}\n`));
|
|
1990
|
+
console.log(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
1991
|
+
console.log(t('cli.auth.oauthFrameworkNote'));
|
|
1992
|
+
console.log();
|
|
1993
|
+
console.log(t('cli.auth.forImmediate'));
|
|
1994
|
+
console.log(chalk.cyan(' claude login --api-key Setup with API key'));
|
|
1995
|
+
console.log(chalk.cyan(' claude setup-token Quick API key setup\n'));
|
|
1996
|
+
}
|
|
1997
|
+
}
|
|
1998
|
+
});
|
|
1999
|
+
// Logout 命令
|
|
2000
|
+
program
|
|
2001
|
+
.command('logout')
|
|
2002
|
+
.description('Logout from Claude')
|
|
2003
|
+
.action(async () => {
|
|
2004
|
+
const { logout, isAuthenticated, getAuthType, getAuth } = await import('./auth/index.js');
|
|
2005
|
+
console.log(chalk.bold(`\n🔐 ${t('cli.auth.logoutTitle')}\n`));
|
|
2006
|
+
// 检查当前认证状态
|
|
2007
|
+
const wasAuthenticated = isAuthenticated();
|
|
2008
|
+
const authType = getAuthType();
|
|
2009
|
+
const currentAuthInfo = getAuth();
|
|
2010
|
+
if (!wasAuthenticated) {
|
|
2011
|
+
console.log(t('cli.auth.noActiveSession'));
|
|
2012
|
+
console.log(`\n${t('cli.auth.notAuthenticated')}\n`);
|
|
2013
|
+
console.log(t('cli.auth.toLogin'));
|
|
2014
|
+
console.log(chalk.gray(' claude login Show login options'));
|
|
2015
|
+
console.log(chalk.gray(' claude login --api-key Setup with API key'));
|
|
2016
|
+
console.log(chalk.gray(' claude login --oauth OAuth login'));
|
|
2017
|
+
console.log(chalk.gray(' claude setup-token Quick API key setup\n'));
|
|
2018
|
+
return;
|
|
2019
|
+
}
|
|
2020
|
+
let clearedItems = [];
|
|
2021
|
+
// 调用认证系统的 logout() 函数
|
|
2022
|
+
try {
|
|
2023
|
+
logout();
|
|
2024
|
+
clearedItems.push('OAuth token (from auth system)');
|
|
2025
|
+
}
|
|
2026
|
+
catch (err) {
|
|
2027
|
+
// 继续处理其他清理
|
|
2028
|
+
}
|
|
2029
|
+
// 清除存储的 API key
|
|
2030
|
+
const credentialsFile = path.join(os.homedir(), '.axon', 'credentials.json');
|
|
2031
|
+
if (fs.existsSync(credentialsFile)) {
|
|
2032
|
+
try {
|
|
2033
|
+
fs.unlinkSync(credentialsFile);
|
|
2034
|
+
clearedItems.push('Stored API key');
|
|
2035
|
+
}
|
|
2036
|
+
catch (err) {
|
|
2037
|
+
// 忽略错误
|
|
2038
|
+
}
|
|
2039
|
+
}
|
|
2040
|
+
// 清除配置文件中的会话信息
|
|
2041
|
+
const configFile = path.join(os.homedir(), '.axon', 'settings.json');
|
|
2042
|
+
if (fs.existsSync(configFile)) {
|
|
2043
|
+
try {
|
|
2044
|
+
const config = JSON.parse(fs.readFileSync(configFile, 'utf-8'));
|
|
2045
|
+
let modified = false;
|
|
2046
|
+
if (config.sessionToken) {
|
|
2047
|
+
delete config.sessionToken;
|
|
2048
|
+
modified = true;
|
|
2049
|
+
clearedItems.push('Session token');
|
|
2050
|
+
}
|
|
2051
|
+
if (config.oauthAccount) {
|
|
2052
|
+
delete config.oauthAccount;
|
|
2053
|
+
modified = true;
|
|
2054
|
+
clearedItems.push('OAuth account');
|
|
2055
|
+
}
|
|
2056
|
+
if (modified) {
|
|
2057
|
+
fs.writeFileSync(configFile, JSON.stringify(config, null, 2));
|
|
2058
|
+
}
|
|
2059
|
+
}
|
|
2060
|
+
catch (err) {
|
|
2061
|
+
// 忽略错误
|
|
2062
|
+
}
|
|
2063
|
+
}
|
|
2064
|
+
// 构建退出消息
|
|
2065
|
+
console.log(chalk.green(`✅ ${t('cli.auth.logoutSuccess')}\n`));
|
|
2066
|
+
console.log(t('cli.auth.prevAuth'));
|
|
2067
|
+
console.log(` • Type: ${authType || 'Unknown'}`);
|
|
2068
|
+
if (currentAuthInfo?.accessToken) {
|
|
2069
|
+
console.log(` • Access Token: ${currentAuthInfo.accessToken.substring(0, 20)}...`);
|
|
2070
|
+
}
|
|
2071
|
+
if (currentAuthInfo?.apiKey) {
|
|
2072
|
+
console.log(` • API Key: ${currentAuthInfo.apiKey.substring(0, 15)}...`);
|
|
2073
|
+
}
|
|
2074
|
+
console.log(`\n${t('cli.auth.cleared')}`);
|
|
2075
|
+
for (const item of clearedItems) {
|
|
2076
|
+
console.log(` • ${item}`);
|
|
2077
|
+
}
|
|
2078
|
+
console.log(`\n${t('cli.auth.toCompletelyRemove')}\n`);
|
|
2079
|
+
console.log(t('cli.auth.removeEnvVars'));
|
|
2080
|
+
console.log(chalk.gray(' unset ANTHROPIC_API_KEY'));
|
|
2081
|
+
console.log(chalk.gray(' unset AXON_API_KEY\n'));
|
|
2082
|
+
console.log(t('cli.auth.verifyCleared'));
|
|
2083
|
+
console.log(chalk.gray(' ls -la ~/.axon/\n'));
|
|
2084
|
+
console.log(t('cli.auth.toLoginAgain'));
|
|
2085
|
+
console.log(chalk.gray(' claude login Show login options'));
|
|
2086
|
+
console.log(chalk.gray(' claude login --api-key Setup with API key'));
|
|
2087
|
+
console.log(chalk.gray(' claude login --oauth OAuth login\n'));
|
|
2088
|
+
});
|
|
2089
|
+
// API 命令
|
|
2090
|
+
const apiCommand = program.command('api').description('Interact with Claude API directly');
|
|
2091
|
+
// api query
|
|
2092
|
+
apiCommand
|
|
2093
|
+
.command('query <query...>')
|
|
2094
|
+
.description('Send a direct query to Claude API')
|
|
2095
|
+
.option('-m, --model <model>', 'Model to use', 'claude-sonnet-4-20250514')
|
|
2096
|
+
.action(async (queryParts, options) => {
|
|
2097
|
+
const Anthropic = (await import('@anthropic-ai/sdk')).default;
|
|
2098
|
+
const query = queryParts.join(' ');
|
|
2099
|
+
// 获取 API key
|
|
2100
|
+
const apiKey = process.env.ANTHROPIC_API_KEY || process.env.AXON_API_KEY;
|
|
2101
|
+
if (!apiKey) {
|
|
2102
|
+
const credentialsFile = path.join(os.homedir(), '.axon', 'credentials.json');
|
|
2103
|
+
if (fs.existsSync(credentialsFile)) {
|
|
2104
|
+
try {
|
|
2105
|
+
const creds = JSON.parse(fs.readFileSync(credentialsFile, 'utf-8'));
|
|
2106
|
+
if (!creds.apiKey) {
|
|
2107
|
+
console.log(chalk.red(`\n❌ ${t('cli.api.noKeyFound')}\n`));
|
|
2108
|
+
console.log(t('cli.api.setupKey'));
|
|
2109
|
+
console.log(chalk.gray(' claude login --api-key Setup with API key'));
|
|
2110
|
+
console.log(chalk.gray(' claude setup-token Quick API key setup\n'));
|
|
2111
|
+
return;
|
|
2112
|
+
}
|
|
2113
|
+
}
|
|
2114
|
+
catch {
|
|
2115
|
+
console.log(chalk.red(`\n❌ ${t('cli.api.noKeyFound')}\n`));
|
|
2116
|
+
return;
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
2119
|
+
else {
|
|
2120
|
+
console.log(chalk.red(`\n❌ ${t('cli.api.noKeyFound')}\n`));
|
|
2121
|
+
console.log(t('cli.api.setupKey'));
|
|
2122
|
+
console.log(chalk.gray(' claude login --api-key Setup with API key'));
|
|
2123
|
+
console.log(chalk.gray(' claude setup-token Quick API key setup\n'));
|
|
2124
|
+
return;
|
|
2125
|
+
}
|
|
2126
|
+
}
|
|
2127
|
+
console.log(chalk.cyan(`\n🤖 ${t('cli.api.sendingQuery')}\n`));
|
|
2128
|
+
try {
|
|
2129
|
+
const client = new Anthropic({ apiKey });
|
|
2130
|
+
const response = await client.messages.create({
|
|
2131
|
+
model: options.model,
|
|
2132
|
+
max_tokens: 1024,
|
|
2133
|
+
messages: [
|
|
2134
|
+
{
|
|
2135
|
+
role: 'user',
|
|
2136
|
+
content: query,
|
|
2137
|
+
},
|
|
2138
|
+
],
|
|
2139
|
+
});
|
|
2140
|
+
// 提取响应文本
|
|
2141
|
+
const textContent = response.content.find((block) => block.type === 'text');
|
|
2142
|
+
const responseText = textContent && 'text' in textContent ? textContent.text : 'No text response';
|
|
2143
|
+
console.log(chalk.bold(`${t('cli.api.response')}\n`));
|
|
2144
|
+
console.log(responseText);
|
|
2145
|
+
console.log(chalk.gray('\n─────────────────────────────────────'));
|
|
2146
|
+
console.log(chalk.gray(`Usage: ${response.usage.input_tokens} in / ${response.usage.output_tokens} out`));
|
|
2147
|
+
console.log(chalk.gray(`Model: ${response.model}`));
|
|
2148
|
+
console.log(chalk.gray(`Stop reason: ${response.stop_reason}\n`));
|
|
2149
|
+
}
|
|
2150
|
+
catch (error) {
|
|
2151
|
+
console.log(chalk.red(`\n❌ ${t('cli.api.apiError', { error: error instanceof Error ? error.message : String(error) })}\n`));
|
|
2152
|
+
}
|
|
2153
|
+
});
|
|
2154
|
+
// api models
|
|
2155
|
+
apiCommand
|
|
2156
|
+
.command('models')
|
|
2157
|
+
.description('List available Claude models')
|
|
2158
|
+
.action(() => {
|
|
2159
|
+
console.log(chalk.bold('\n📋 Available Claude Models\n'));
|
|
2160
|
+
console.log(chalk.bold('Claude 4.6 Series (Latest)\n'));
|
|
2161
|
+
console.log(chalk.cyan(' claude-opus-4-6'));
|
|
2162
|
+
console.log(' • Context: 1M tokens');
|
|
2163
|
+
console.log(' • Best for: Complex reasoning, long tasks');
|
|
2164
|
+
console.log(' • Pricing: $15 / $75 per MTok (in/out)');
|
|
2165
|
+
console.log(' • Highest capability (latest)\n');
|
|
2166
|
+
console.log(chalk.bold('Claude 4.5 Series\n'));
|
|
2167
|
+
console.log(chalk.cyan(' claude-opus-4-5-20251101'));
|
|
2168
|
+
console.log(' • Context: 1M tokens');
|
|
2169
|
+
console.log(' • Best for: Complex reasoning, long tasks');
|
|
2170
|
+
console.log(' • Pricing: $15 / $75 per MTok (in/out)\n');
|
|
2171
|
+
console.log(chalk.cyan(' claude-sonnet-4-5-20250929'));
|
|
2172
|
+
console.log(' • Context: 200K tokens');
|
|
2173
|
+
console.log(' • Best for: Most tasks, balanced performance');
|
|
2174
|
+
console.log(' • Pricing: $3 / $15 per MTok (in/out)');
|
|
2175
|
+
console.log(' • Recommended: Default choice\n');
|
|
2176
|
+
console.log(chalk.cyan(' claude-haiku-4-5-20250514'));
|
|
2177
|
+
console.log(' • Context: 200K tokens');
|
|
2178
|
+
console.log(' • Best for: Fast, simple tasks');
|
|
2179
|
+
console.log(' • Pricing: $0.80 / $4 per MTok (in/out)');
|
|
2180
|
+
console.log(' • Most cost-effective\n');
|
|
2181
|
+
console.log(chalk.bold('Claude 3.5 Series\n'));
|
|
2182
|
+
console.log(chalk.gray(' • claude-3-5-sonnet-20241022'));
|
|
2183
|
+
console.log(chalk.gray(' • claude-3-5-haiku-20241022\n'));
|
|
2184
|
+
console.log('Documentation: https://docs.anthropic.com/en/docs/models-overview\n');
|
|
2185
|
+
});
|
|
2186
|
+
// api test
|
|
2187
|
+
apiCommand
|
|
2188
|
+
.command('test')
|
|
2189
|
+
.description('Test API connection')
|
|
2190
|
+
.action(async () => {
|
|
2191
|
+
const Anthropic = (await import('@anthropic-ai/sdk')).default;
|
|
2192
|
+
console.log(chalk.bold(`\n🧪 ${t('cli.api.testingConnection')}\n`));
|
|
2193
|
+
// 获取 API key
|
|
2194
|
+
const apiKey = process.env.ANTHROPIC_API_KEY || process.env.AXON_API_KEY;
|
|
2195
|
+
if (!apiKey) {
|
|
2196
|
+
const credentialsFile = path.join(os.homedir(), '.axon', 'credentials.json');
|
|
2197
|
+
if (fs.existsSync(credentialsFile)) {
|
|
2198
|
+
try {
|
|
2199
|
+
const creds = JSON.parse(fs.readFileSync(credentialsFile, 'utf-8'));
|
|
2200
|
+
if (!creds.apiKey) {
|
|
2201
|
+
console.log(chalk.red(`❌ ${t('cli.api.keyNotFound')}\n`));
|
|
2202
|
+
console.log(t('cli.api.setupKey'));
|
|
2203
|
+
console.log(chalk.gray(' claude login --api-key'));
|
|
2204
|
+
console.log(chalk.gray(' claude setup-token\n'));
|
|
2205
|
+
return;
|
|
2206
|
+
}
|
|
2207
|
+
}
|
|
2208
|
+
catch {
|
|
2209
|
+
console.log(chalk.red(`❌ ${t('cli.api.keyNotFound')}\n`));
|
|
2210
|
+
return;
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
else {
|
|
2214
|
+
console.log(chalk.red(`❌ ${t('cli.api.keyNotFound')}\n`));
|
|
2215
|
+
console.log(t('cli.api.setupKey'));
|
|
2216
|
+
console.log(chalk.gray(' claude login --api-key'));
|
|
2217
|
+
console.log(chalk.gray(' claude setup-token\n'));
|
|
2218
|
+
return;
|
|
2219
|
+
}
|
|
2220
|
+
}
|
|
2221
|
+
// 验证 API key 格式
|
|
2222
|
+
if (!apiKey.startsWith('sk-ant-')) {
|
|
2223
|
+
console.log(chalk.yellow(`⚠️ ${t('cli.api.invalidKeyFormat')}\n`));
|
|
2224
|
+
console.log(t('cli.api.keyFormatHint'));
|
|
2225
|
+
console.log(`Current key: ${apiKey.substring(0, 15)}...\n`);
|
|
2226
|
+
return;
|
|
2227
|
+
}
|
|
2228
|
+
console.log(chalk.cyan(`${t('cli.api.sendingTest')}\n`));
|
|
2229
|
+
try {
|
|
2230
|
+
const client = new Anthropic({ apiKey });
|
|
2231
|
+
const response = await client.messages.create({
|
|
2232
|
+
model: 'claude-haiku-4-5-20250514',
|
|
2233
|
+
max_tokens: 10,
|
|
2234
|
+
messages: [
|
|
2235
|
+
{
|
|
2236
|
+
role: 'user',
|
|
2237
|
+
content: 'Hello',
|
|
2238
|
+
},
|
|
2239
|
+
],
|
|
2240
|
+
});
|
|
2241
|
+
console.log(chalk.green(`✅ ${t('cli.api.connectionSuccess')}\n`));
|
|
2242
|
+
console.log(t('cli.api.keyStatus'));
|
|
2243
|
+
console.log(' • Format: Valid (sk-ant-...)');
|
|
2244
|
+
console.log(' • Authentication: ✓ Successful');
|
|
2245
|
+
console.log(` • API Key: ${apiKey.substring(0, 20)}...\n`);
|
|
2246
|
+
console.log('Test Request:');
|
|
2247
|
+
console.log(` • Model: ${response.model}`);
|
|
2248
|
+
console.log(` • Input tokens: ${response.usage.input_tokens}`);
|
|
2249
|
+
console.log(` • Output tokens: ${response.usage.output_tokens}`);
|
|
2250
|
+
console.log(' • Response time: < 1s\n');
|
|
2251
|
+
console.log(`${t('cli.api.connectionWorking')}\n`);
|
|
2252
|
+
}
|
|
2253
|
+
catch (error) {
|
|
2254
|
+
console.log(chalk.red(`❌ ${t('cli.api.connectionFailed')}\n`));
|
|
2255
|
+
console.log(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
2256
|
+
console.log(`${t('cli.api.commonIssues')}\n`);
|
|
2257
|
+
console.log('1. Invalid API Key:');
|
|
2258
|
+
console.log(' • Verify the key at https://platform.claude.com/settings/keys');
|
|
2259
|
+
console.log(' • Try regenerating your API key\n');
|
|
2260
|
+
console.log('2. Network Issues:');
|
|
2261
|
+
console.log(' • Check your internet connection');
|
|
2262
|
+
console.log(' • Verify firewall settings\n');
|
|
2263
|
+
console.log('3. Rate Limits:');
|
|
2264
|
+
console.log(' • Visit https://platform.claude.com/settings/limits\n');
|
|
2265
|
+
}
|
|
2266
|
+
});
|
|
2267
|
+
// api tokens
|
|
2268
|
+
const tokensCommand = apiCommand.command('tokens').description('Manage API tokens');
|
|
2269
|
+
tokensCommand
|
|
2270
|
+
.command('status')
|
|
2271
|
+
.description('Show current token configuration')
|
|
2272
|
+
.action(() => {
|
|
2273
|
+
console.log(chalk.bold('\n🔑 API Token Status\n'));
|
|
2274
|
+
const envKey = process.env.ANTHROPIC_API_KEY || process.env.AXON_API_KEY;
|
|
2275
|
+
const credentialsFile = path.join(os.homedir(), '.axon', 'credentials.json');
|
|
2276
|
+
const hasFileKey = fs.existsSync(credentialsFile);
|
|
2277
|
+
if (envKey) {
|
|
2278
|
+
console.log(chalk.green('✓ Environment Variable:'), `${envKey.substring(0, 20)}...`);
|
|
2279
|
+
console.log(` Source: ${process.env.ANTHROPIC_API_KEY ? 'ANTHROPIC_API_KEY' : 'AXON_API_KEY'}\n`);
|
|
2280
|
+
}
|
|
2281
|
+
else {
|
|
2282
|
+
console.log(chalk.gray('✗ Environment Variable: Not set\n'));
|
|
2283
|
+
}
|
|
2284
|
+
if (hasFileKey) {
|
|
2285
|
+
try {
|
|
2286
|
+
const creds = JSON.parse(fs.readFileSync(credentialsFile, 'utf-8'));
|
|
2287
|
+
const fileKey = creds.apiKey || creds.api_key;
|
|
2288
|
+
if (fileKey) {
|
|
2289
|
+
console.log(chalk.green('✓ File Token:'), `${fileKey.substring(0, 20)}...`);
|
|
2290
|
+
console.log(' Location: ~/.axon/credentials.json\n');
|
|
2291
|
+
}
|
|
2292
|
+
else {
|
|
2293
|
+
console.log(chalk.yellow('✗ File Token: File exists but no key found\n'));
|
|
2294
|
+
}
|
|
2295
|
+
}
|
|
2296
|
+
catch {
|
|
2297
|
+
console.log(chalk.yellow('✗ File Token: File exists but invalid format\n'));
|
|
2298
|
+
}
|
|
2299
|
+
}
|
|
2300
|
+
else {
|
|
2301
|
+
console.log(chalk.gray('✗ File Token: Not found\n'));
|
|
2302
|
+
}
|
|
2303
|
+
if (!envKey && !hasFileKey) {
|
|
2304
|
+
console.log(chalk.yellow('⚠️ No API token configured\n'));
|
|
2305
|
+
console.log('To set up a token:');
|
|
2306
|
+
console.log(chalk.gray(' claude login --api-key'));
|
|
2307
|
+
console.log(chalk.gray(' claude setup-token\n'));
|
|
2308
|
+
}
|
|
2309
|
+
console.log('Priority Order:');
|
|
2310
|
+
console.log(' 1. ANTHROPIC_API_KEY (environment)');
|
|
2311
|
+
console.log(' 2. AXON_API_KEY (environment)');
|
|
2312
|
+
console.log(' 3. ~/.axon/credentials.json (file)\n');
|
|
2313
|
+
});
|
|
2314
|
+
tokensCommand
|
|
2315
|
+
.command('clear')
|
|
2316
|
+
.description('Clear stored API token')
|
|
2317
|
+
.action(() => {
|
|
2318
|
+
const credentialsFile = path.join(os.homedir(), '.axon', 'credentials.json');
|
|
2319
|
+
if (fs.existsSync(credentialsFile)) {
|
|
2320
|
+
try {
|
|
2321
|
+
fs.unlinkSync(credentialsFile);
|
|
2322
|
+
console.log(chalk.green('\n✅ Cleared stored API token\n'));
|
|
2323
|
+
console.log('Removed: ~/.axon/credentials.json\n');
|
|
2324
|
+
console.log('Note: Environment variables are still set if you have them.');
|
|
2325
|
+
console.log('To clear environment variables:');
|
|
2326
|
+
console.log(chalk.gray(' unset ANTHROPIC_API_KEY'));
|
|
2327
|
+
console.log(chalk.gray(' unset AXON_API_KEY\n'));
|
|
2328
|
+
}
|
|
2329
|
+
catch (error) {
|
|
2330
|
+
console.log(chalk.red(`\n❌ Error clearing token: ${error}\n`));
|
|
2331
|
+
}
|
|
2332
|
+
}
|
|
2333
|
+
else {
|
|
2334
|
+
console.log(chalk.yellow('\nNo stored token file found.\n'));
|
|
2335
|
+
console.log('If you have environment variables set:');
|
|
2336
|
+
console.log(chalk.gray(' unset ANTHROPIC_API_KEY'));
|
|
2337
|
+
console.log(chalk.gray(' unset AXON_API_KEY\n'));
|
|
2338
|
+
}
|
|
2339
|
+
});
|
|
2340
|
+
// 辅助函数: 登录选择器 UI
|
|
2341
|
+
async function showLoginSelectorUI() {
|
|
2342
|
+
const { LoginSelector } = await import('./ui/LoginSelector.js');
|
|
2343
|
+
const { startOAuthLogin } = await import('./auth/index.js');
|
|
2344
|
+
return new Promise((resolve) => {
|
|
2345
|
+
// 使用已导入的 render,不使用 require
|
|
2346
|
+
const onSelect = async (method) => {
|
|
2347
|
+
// 卸载 UI
|
|
2348
|
+
app.unmount();
|
|
2349
|
+
if (method === 'exit') {
|
|
2350
|
+
console.log(chalk.yellow('\nSetup cancelled.'));
|
|
2351
|
+
console.log(chalk.gray('\nTo login later, run:'));
|
|
2352
|
+
console.log(chalk.gray(' claude login --api-key Setup with API key'));
|
|
2353
|
+
console.log(chalk.gray(' claude login --oauth OAuth login'));
|
|
2354
|
+
console.log(chalk.gray(' claude setup-token Quick setup\n'));
|
|
2355
|
+
process.exit(0);
|
|
2356
|
+
}
|
|
2357
|
+
// 执行 OAuth 登录
|
|
2358
|
+
console.log(chalk.cyan(`\nStarting OAuth login with ${method === 'claudeai' ? 'Claude.ai' : 'Anthropic Console'}...\n`));
|
|
2359
|
+
try {
|
|
2360
|
+
// 转换方法名称: claudeai -> claude.ai
|
|
2361
|
+
const accountType = method === 'claudeai' ? 'claude.ai' : 'console';
|
|
2362
|
+
const authResult = await startOAuthLogin({ accountType });
|
|
2363
|
+
if (authResult && authResult.accessToken) {
|
|
2364
|
+
console.log(chalk.green(`\n✅ ${t('cli.auth.oauthSuccess')}\n`));
|
|
2365
|
+
if (authResult.email) {
|
|
2366
|
+
console.log(`Logged in as ${authResult.email}`);
|
|
2367
|
+
}
|
|
2368
|
+
// 等待用户按回车后继续
|
|
2369
|
+
const readline = await import('readline');
|
|
2370
|
+
const rl = readline.createInterface({
|
|
2371
|
+
input: process.stdin,
|
|
2372
|
+
output: process.stdout,
|
|
2373
|
+
});
|
|
2374
|
+
await new Promise((resolve) => {
|
|
2375
|
+
console.log(chalk.gray('\nLogin successful. Press Enter to continue…'));
|
|
2376
|
+
rl.question('', () => {
|
|
2377
|
+
rl.close();
|
|
2378
|
+
resolve();
|
|
2379
|
+
});
|
|
2380
|
+
});
|
|
2381
|
+
// 登录成功后直接启动交互会话,而不是退出
|
|
2382
|
+
console.log('\n');
|
|
2383
|
+
resolve(); // 返回到主流程,让程序继续执行
|
|
2384
|
+
}
|
|
2385
|
+
else {
|
|
2386
|
+
throw new Error('OAuth login failed');
|
|
2387
|
+
}
|
|
2388
|
+
}
|
|
2389
|
+
catch (error) {
|
|
2390
|
+
console.log(chalk.red(`\n❌ ${t('cli.auth.oauthFailed')}: ${error instanceof Error ? error.message : String(error)}\n`));
|
|
2391
|
+
console.log(chalk.yellow('Alternative setup methods:\n'));
|
|
2392
|
+
console.log('1. Use API key (recommended for developers):');
|
|
2393
|
+
console.log(chalk.gray(' claude login --api-key\n'));
|
|
2394
|
+
console.log('2. Set environment variable:');
|
|
2395
|
+
console.log(chalk.gray(' export ANTHROPIC_API_KEY=sk-ant-your-key-here\n'));
|
|
2396
|
+
console.log('3. Quick setup:');
|
|
2397
|
+
console.log(chalk.gray(' claude setup-token\n'));
|
|
2398
|
+
process.exit(1);
|
|
2399
|
+
}
|
|
2400
|
+
resolve();
|
|
2401
|
+
};
|
|
2402
|
+
const app = render(React.createElement(LoginSelector, { onSelect }));
|
|
2403
|
+
});
|
|
2404
|
+
}
|
|
2405
|
+
// 辅助函数: 会话选择器
|
|
2406
|
+
async function showSessionPicker(loop) {
|
|
2407
|
+
const sessions = listSessions({ limit: 10 });
|
|
2408
|
+
if (sessions.length === 0) {
|
|
2409
|
+
console.log(chalk.yellow('No sessions found.'));
|
|
2410
|
+
return;
|
|
2411
|
+
}
|
|
2412
|
+
console.log(chalk.bold('\nSelect a session to resume:\n'));
|
|
2413
|
+
sessions.forEach((s, i) => {
|
|
2414
|
+
const date = new Date(s.createdAt).toLocaleString();
|
|
2415
|
+
console.log(` ${chalk.cyan(`[${i + 1}]`)} ${s.id}`);
|
|
2416
|
+
console.log(` ${chalk.gray(date)} - ${s.messageCount} messages`);
|
|
2417
|
+
});
|
|
2418
|
+
console.log();
|
|
2419
|
+
const rl = readline.createInterface({
|
|
2420
|
+
input: process.stdin,
|
|
2421
|
+
output: process.stdout,
|
|
2422
|
+
});
|
|
2423
|
+
return new Promise((resolve) => {
|
|
2424
|
+
rl.question('Enter session number (or press Enter to cancel): ', (answer) => {
|
|
2425
|
+
rl.close();
|
|
2426
|
+
const num = parseInt(answer);
|
|
2427
|
+
if (num >= 1 && num <= sessions.length) {
|
|
2428
|
+
const session = loadSession(sessions[num - 1].id);
|
|
2429
|
+
if (session) {
|
|
2430
|
+
console.log(chalk.green(`\nResumed session: ${sessions[num - 1].id}\n`));
|
|
2431
|
+
}
|
|
2432
|
+
}
|
|
2433
|
+
resolve();
|
|
2434
|
+
});
|
|
2435
|
+
});
|
|
2436
|
+
}
|
|
2437
|
+
// v2.1.27: PR 会话选择器
|
|
2438
|
+
async function showPrSessionPicker(loop) {
|
|
2439
|
+
// 获取所有有 PR 链接的会话
|
|
2440
|
+
const allSessions = listSessions({ limit: 100 });
|
|
2441
|
+
const prSessions = allSessions.filter(s => s.prNumber !== undefined);
|
|
2442
|
+
if (prSessions.length === 0) {
|
|
2443
|
+
console.log(chalk.yellow('No sessions linked to PRs found.'));
|
|
2444
|
+
return;
|
|
2445
|
+
}
|
|
2446
|
+
console.log(chalk.bold('\nSelect a PR-linked session to resume:\n'));
|
|
2447
|
+
prSessions.forEach((s, i) => {
|
|
2448
|
+
const date = new Date(s.updatedAt).toLocaleString();
|
|
2449
|
+
const prInfo = s.prRepository
|
|
2450
|
+
? `${s.prRepository.split('/')[1]}#${s.prNumber}`
|
|
2451
|
+
: `PR #${s.prNumber}`;
|
|
2452
|
+
console.log(` ${chalk.cyan(`[${i + 1}]`)} ${prInfo}`);
|
|
2453
|
+
console.log(` ${chalk.gray(date)} - ${s.messageCount} messages`);
|
|
2454
|
+
if (s.gitBranch) {
|
|
2455
|
+
console.log(` ${chalk.dim(`Branch: ${s.gitBranch}`)}`);
|
|
2456
|
+
}
|
|
2457
|
+
});
|
|
2458
|
+
console.log();
|
|
2459
|
+
const rl = readline.createInterface({
|
|
2460
|
+
input: process.stdin,
|
|
2461
|
+
output: process.stdout,
|
|
2462
|
+
});
|
|
2463
|
+
return new Promise((resolve) => {
|
|
2464
|
+
rl.question('Enter session number (or press Enter to cancel): ', (answer) => {
|
|
2465
|
+
rl.close();
|
|
2466
|
+
const num = parseInt(answer);
|
|
2467
|
+
if (num >= 1 && num <= prSessions.length) {
|
|
2468
|
+
const sessionData = loadSession(prSessions[num - 1].id);
|
|
2469
|
+
if (sessionData) {
|
|
2470
|
+
const session = Session.load(prSessions[num - 1].id);
|
|
2471
|
+
if (session) {
|
|
2472
|
+
loop.setSession(session);
|
|
2473
|
+
const prInfo = prSessions[num - 1].prRepository
|
|
2474
|
+
? `${prSessions[num - 1].prRepository?.split('/')[1]}#${prSessions[num - 1].prNumber}`
|
|
2475
|
+
: `PR #${prSessions[num - 1].prNumber}`;
|
|
2476
|
+
console.log(chalk.green(`\nResumed session linked to ${prInfo}\n`));
|
|
2477
|
+
}
|
|
2478
|
+
}
|
|
2479
|
+
}
|
|
2480
|
+
resolve();
|
|
2481
|
+
});
|
|
2482
|
+
});
|
|
2483
|
+
}
|
|
2484
|
+
// 辅助函数: 加载 MCP 配置
|
|
2485
|
+
function loadMcpConfigs(configs) {
|
|
2486
|
+
for (const config of configs) {
|
|
2487
|
+
try {
|
|
2488
|
+
let mcpConfig;
|
|
2489
|
+
if (config.startsWith('{')) {
|
|
2490
|
+
mcpConfig = JSON.parse(config);
|
|
2491
|
+
}
|
|
2492
|
+
else if (fs.existsSync(config)) {
|
|
2493
|
+
const content = fs.readFileSync(config, 'utf-8');
|
|
2494
|
+
mcpConfig = JSON.parse(content);
|
|
2495
|
+
}
|
|
2496
|
+
else {
|
|
2497
|
+
console.warn(chalk.yellow(`MCP config not found: ${config}`));
|
|
2498
|
+
continue;
|
|
2499
|
+
}
|
|
2500
|
+
if (mcpConfig.mcpServers && typeof mcpConfig.mcpServers === 'object') {
|
|
2501
|
+
const servers = mcpConfig.mcpServers;
|
|
2502
|
+
for (const [name, serverConfig] of Object.entries(servers)) {
|
|
2503
|
+
configManager.addMcpServer(name, serverConfig);
|
|
2504
|
+
}
|
|
2505
|
+
}
|
|
2506
|
+
}
|
|
2507
|
+
catch (err) {
|
|
2508
|
+
console.warn(chalk.yellow(`Failed to load MCP config: ${config}`));
|
|
2509
|
+
}
|
|
2510
|
+
}
|
|
2511
|
+
}
|
|
2512
|
+
// 辅助函数: 加载设置
|
|
2513
|
+
function loadSettings(settingsPath) {
|
|
2514
|
+
try {
|
|
2515
|
+
let settings;
|
|
2516
|
+
if (settingsPath.startsWith('{')) {
|
|
2517
|
+
settings = JSON.parse(settingsPath);
|
|
2518
|
+
}
|
|
2519
|
+
else if (fs.existsSync(settingsPath)) {
|
|
2520
|
+
const content = fs.readFileSync(settingsPath, 'utf-8');
|
|
2521
|
+
settings = JSON.parse(content);
|
|
2522
|
+
}
|
|
2523
|
+
else {
|
|
2524
|
+
console.warn(chalk.yellow(`Settings file not found: ${settingsPath}`));
|
|
2525
|
+
return;
|
|
2526
|
+
}
|
|
2527
|
+
if (settings.model) {
|
|
2528
|
+
// 使用 any 避免严格的模型类型检查,因为设置文件可能包含任意模型名
|
|
2529
|
+
configManager.set('model', settings.model);
|
|
2530
|
+
}
|
|
2531
|
+
if (settings.maxTokens) {
|
|
2532
|
+
configManager.set('maxTokens', settings.maxTokens);
|
|
2533
|
+
}
|
|
2534
|
+
if (settings.verbose !== undefined) {
|
|
2535
|
+
configManager.set('verbose', settings.verbose);
|
|
2536
|
+
}
|
|
2537
|
+
}
|
|
2538
|
+
catch (err) {
|
|
2539
|
+
console.warn(chalk.yellow(`Failed to load settings: ${settingsPath}`));
|
|
2540
|
+
}
|
|
2541
|
+
}
|
|
2542
|
+
/**
|
|
2543
|
+
* 【与官方一致】自动初始化所有 MCP 服务器
|
|
2544
|
+
*
|
|
2545
|
+
* 官方逻辑(DZ0 函数):
|
|
2546
|
+
* 1. 从配置中获取所有 MCP 服务器
|
|
2547
|
+
* 2. 检查每个服务器是否在 disabledMcpServers 列表中
|
|
2548
|
+
* 3. 如果未禁用,则连接服务器
|
|
2549
|
+
* 4. 连接成功后,获取工具列表并注册到 ToolRegistry
|
|
2550
|
+
*
|
|
2551
|
+
* @param verbose 是否显示详细信息
|
|
2552
|
+
* @param strictMode 严格模式 - 仅使用命令行指定的 MCP 配置
|
|
2553
|
+
*/
|
|
2554
|
+
async function initializeAllMcpServers(verbose, strictMode) {
|
|
2555
|
+
// 导入必要的模块
|
|
2556
|
+
const { registerMcpServer, connectMcpServer, getMcpServers, createMcpTools } = await import('./tools/mcp.js');
|
|
2557
|
+
// 获取所有配置的 MCP 服务器
|
|
2558
|
+
const mcpServers = configManager.getMcpServers();
|
|
2559
|
+
const serverNames = Object.keys(mcpServers);
|
|
2560
|
+
if (serverNames.length === 0) {
|
|
2561
|
+
return; // 没有配置的服务器
|
|
2562
|
+
}
|
|
2563
|
+
// 获取禁用的服务器列表(从 settings.local.json 或 settings.json)
|
|
2564
|
+
const disabledServers = getDisabledMcpServers();
|
|
2565
|
+
// 统计信息
|
|
2566
|
+
let connectedCount = 0;
|
|
2567
|
+
let skippedCount = 0;
|
|
2568
|
+
let failedCount = 0;
|
|
2569
|
+
// 并发连接所有服务器(与官方一致,使用 Promise.all)
|
|
2570
|
+
const connectionPromises = serverNames.map(async (name) => {
|
|
2571
|
+
const config = mcpServers[name];
|
|
2572
|
+
// 检查是否被禁用
|
|
2573
|
+
if (disabledServers.includes(name)) {
|
|
2574
|
+
if (verbose) {
|
|
2575
|
+
console.log(chalk.gray(`[MCP] Skipping disabled server: ${name}`));
|
|
2576
|
+
}
|
|
2577
|
+
skippedCount++;
|
|
2578
|
+
return;
|
|
2579
|
+
}
|
|
2580
|
+
try {
|
|
2581
|
+
// 注册服务器配置
|
|
2582
|
+
registerMcpServer(name, config);
|
|
2583
|
+
// 连接服务器
|
|
2584
|
+
const connected = await connectMcpServer(name);
|
|
2585
|
+
if (connected) {
|
|
2586
|
+
connectedCount++;
|
|
2587
|
+
// 获取工具列表并注册到 ToolRegistry
|
|
2588
|
+
const mcpTools = await createMcpTools(name);
|
|
2589
|
+
for (const tool of mcpTools) {
|
|
2590
|
+
toolRegistry.register(tool);
|
|
2591
|
+
}
|
|
2592
|
+
if (verbose) {
|
|
2593
|
+
console.log(chalk.green(`[MCP] Connected: ${name} (${mcpTools.length} tools)`));
|
|
2594
|
+
}
|
|
2595
|
+
}
|
|
2596
|
+
else {
|
|
2597
|
+
failedCount++;
|
|
2598
|
+
if (verbose) {
|
|
2599
|
+
console.log(chalk.yellow(`[MCP] Failed to connect: ${name}`));
|
|
2600
|
+
}
|
|
2601
|
+
}
|
|
2602
|
+
}
|
|
2603
|
+
catch (error) {
|
|
2604
|
+
failedCount++;
|
|
2605
|
+
if (verbose) {
|
|
2606
|
+
console.log(chalk.yellow(`[MCP] Error connecting to ${name}:`, error));
|
|
2607
|
+
}
|
|
2608
|
+
}
|
|
2609
|
+
});
|
|
2610
|
+
// 等待所有连接完成
|
|
2611
|
+
await Promise.all(connectionPromises);
|
|
2612
|
+
// 显示摘要
|
|
2613
|
+
if (verbose && (connectedCount > 0 || failedCount > 0)) {
|
|
2614
|
+
console.log(chalk.dim(`[MCP] Summary: ${connectedCount} connected, ${skippedCount} skipped, ${failedCount} failed`));
|
|
2615
|
+
}
|
|
2616
|
+
}
|
|
2617
|
+
/**
|
|
2618
|
+
* 获取禁用的 MCP 服务器列表
|
|
2619
|
+
*
|
|
2620
|
+
* 官方逻辑(MPA 函数):
|
|
2621
|
+
* 从 settings 中读取 disabledMcpServers 数组
|
|
2622
|
+
*/
|
|
2623
|
+
function getDisabledMcpServers() {
|
|
2624
|
+
try {
|
|
2625
|
+
// 尝试从 settings.local.json 读取
|
|
2626
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '~';
|
|
2627
|
+
const globalDir = process.env.AXON_CONFIG_DIR || path.join(homeDir, '.axon');
|
|
2628
|
+
// 读取顺序:local -> project -> global
|
|
2629
|
+
const configPaths = [
|
|
2630
|
+
path.join(process.cwd(), '.axon', 'settings.local.json'),
|
|
2631
|
+
path.join(process.cwd(), '.axon', 'settings.json'),
|
|
2632
|
+
path.join(globalDir, 'settings.json'),
|
|
2633
|
+
];
|
|
2634
|
+
for (const configPath of configPaths) {
|
|
2635
|
+
if (fs.existsSync(configPath)) {
|
|
2636
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
2637
|
+
const config = JSON.parse(content);
|
|
2638
|
+
if (config.disabledMcpServers && Array.isArray(config.disabledMcpServers)) {
|
|
2639
|
+
return config.disabledMcpServers;
|
|
2640
|
+
}
|
|
2641
|
+
}
|
|
2642
|
+
}
|
|
2643
|
+
}
|
|
2644
|
+
catch (error) {
|
|
2645
|
+
// 忽略读取错误
|
|
2646
|
+
}
|
|
2647
|
+
return [];
|
|
2648
|
+
}
|
|
2649
|
+
// 斜杠命令处理 (for text mode)
|
|
2650
|
+
async function handleSlashCommand(input, loop) {
|
|
2651
|
+
const [cmd, ...args] = input.slice(1).split(' ');
|
|
2652
|
+
switch (cmd.toLowerCase()) {
|
|
2653
|
+
// === General ===
|
|
2654
|
+
case 'help': {
|
|
2655
|
+
console.log(chalk.bold('\nAvailable commands:\n'));
|
|
2656
|
+
console.log(chalk.cyan('General:'));
|
|
2657
|
+
console.log(' /help - Show help and available commands');
|
|
2658
|
+
console.log(' /clear - Clear conversation history (aliases: reset, new)');
|
|
2659
|
+
console.log(' /status - Show status (version, model, API, etc.)');
|
|
2660
|
+
console.log(' /doctor - Diagnose installation and settings');
|
|
2661
|
+
console.log(' /exit - Exit the REPL (alias: quit)');
|
|
2662
|
+
console.log(' /color - Set the prompt bar color for this session');
|
|
2663
|
+
console.log(' /release-notes - View release notes');
|
|
2664
|
+
console.log(' /btw - Ask a quick side question');
|
|
2665
|
+
console.log();
|
|
2666
|
+
console.log(chalk.cyan('Session:'));
|
|
2667
|
+
console.log(' /compact - Clear history but keep a summary');
|
|
2668
|
+
console.log(' /context - Show current context usage');
|
|
2669
|
+
console.log(' /cost - Show total cost and duration');
|
|
2670
|
+
console.log(' /resume - Resume a previous conversation (alias: continue)');
|
|
2671
|
+
console.log(' /rename - Rename the current conversation');
|
|
2672
|
+
console.log(' /export - Export conversation to file or clipboard');
|
|
2673
|
+
console.log(' /tag - Toggle a searchable tag on session');
|
|
2674
|
+
console.log(' /stats - Show usage statistics');
|
|
2675
|
+
console.log(' /files - List all files currently in context');
|
|
2676
|
+
console.log(' /fork - Create a fork of the conversation');
|
|
2677
|
+
console.log(' /copy - Copy Claude\'s last response');
|
|
2678
|
+
console.log(' /session - Show remote session URL (alias: remote)');
|
|
2679
|
+
console.log(' /rewind - Restore code/conversation (alias: checkpoint)');
|
|
2680
|
+
console.log();
|
|
2681
|
+
console.log(chalk.cyan('Configuration:'));
|
|
2682
|
+
console.log(' /model - Set the AI model');
|
|
2683
|
+
console.log(' /config - Open config panel (alias: settings)');
|
|
2684
|
+
console.log(' /permissions - Manage tool permission rules (alias: allowed-tools)');
|
|
2685
|
+
console.log(' /hooks - Manage hook configurations');
|
|
2686
|
+
console.log(' /privacy-settings - View and update privacy settings');
|
|
2687
|
+
console.log(' /theme - Change the theme');
|
|
2688
|
+
console.log(' /vim - Toggle Vim editing mode');
|
|
2689
|
+
console.log(' /keybindings - Open keybindings configuration');
|
|
2690
|
+
console.log(' /output-style - Set the output style');
|
|
2691
|
+
console.log(' /plan - Enable plan mode or view session plan');
|
|
2692
|
+
console.log(' /terminal-setup - Terminal configuration');
|
|
2693
|
+
console.log(' /remote-env - Configure remote environment');
|
|
2694
|
+
console.log();
|
|
2695
|
+
console.log(chalk.cyan('Utility:'));
|
|
2696
|
+
console.log(' /tasks - List and manage background tasks (alias: bashes)');
|
|
2697
|
+
console.log(' /todos - List current todo items');
|
|
2698
|
+
console.log(' /add-dir - Add a new working directory');
|
|
2699
|
+
console.log(' /skills - List available skills');
|
|
2700
|
+
console.log(' /usage - Show plan usage limits');
|
|
2701
|
+
console.log(' /extra-usage - Configure extra usage');
|
|
2702
|
+
console.log(' /rate-limit-options - Show rate limit options');
|
|
2703
|
+
console.log(' /stickers - Order Axon stickers');
|
|
2704
|
+
console.log();
|
|
2705
|
+
console.log(chalk.cyan('Integration:'));
|
|
2706
|
+
console.log(' /mcp - Manage MCP servers');
|
|
2707
|
+
console.log(' /agents - Manage agent configurations (alias: plugins, marketplace)');
|
|
2708
|
+
console.log(' /plugin - Manage Axon plugins');
|
|
2709
|
+
console.log(' /ide - Manage IDE integrations');
|
|
2710
|
+
console.log(' /chrome - Claude in Chrome settings');
|
|
2711
|
+
console.log(' /mobile - Show QR code for mobile app (alias: ios, android)');
|
|
2712
|
+
console.log(' /install - Install Axon native build');
|
|
2713
|
+
console.log(' /install-github-app - Set up Claude GitHub Actions');
|
|
2714
|
+
console.log(' /install-slack-app - Install the Claude Slack app');
|
|
2715
|
+
console.log();
|
|
2716
|
+
console.log(chalk.cyan('Auth:'));
|
|
2717
|
+
console.log(' /login - Sign in with Anthropic account');
|
|
2718
|
+
console.log(' /logout - Sign out from Anthropic account');
|
|
2719
|
+
console.log(' /upgrade - Upgrade to Max for higher rate limits');
|
|
2720
|
+
console.log(' /passes - Manage passes');
|
|
2721
|
+
console.log();
|
|
2722
|
+
console.log(chalk.cyan('Development:'));
|
|
2723
|
+
console.log(' /review - Review a pull request');
|
|
2724
|
+
console.log(' /feedback - Submit feedback (alias: bug)');
|
|
2725
|
+
console.log(' /pr-comments - Get comments from a GitHub PR');
|
|
2726
|
+
console.log(' /init - Initialize a new AXON.md file');
|
|
2727
|
+
console.log(' /think-back - Your 2025 Axon Year in Review');
|
|
2728
|
+
console.log(' /thinkback-play - Play the thinkback animation');
|
|
2729
|
+
console.log(' /insights - Generate session analysis report');
|
|
2730
|
+
console.log();
|
|
2731
|
+
break;
|
|
2732
|
+
}
|
|
2733
|
+
case 'clear':
|
|
2734
|
+
case 'reset':
|
|
2735
|
+
case 'new':
|
|
2736
|
+
loop.getSession().clearMessages();
|
|
2737
|
+
console.log(chalk.yellow('Conversation cleared.\n'));
|
|
2738
|
+
break;
|
|
2739
|
+
case 'status': {
|
|
2740
|
+
const sessionStats = loop.getSession().getStats();
|
|
2741
|
+
console.log(chalk.bold('\nSession Status:\n'));
|
|
2742
|
+
console.log(` Version: ${VERSION_FULL}`);
|
|
2743
|
+
console.log(` Session ID: ${loop.getSession().sessionId}`);
|
|
2744
|
+
console.log(` Messages: ${sessionStats.messageCount}`);
|
|
2745
|
+
console.log(` Duration: ${Math.round(sessionStats.duration / 1000)}s`);
|
|
2746
|
+
console.log(` Cost: ${sessionStats.totalCost}`);
|
|
2747
|
+
console.log(` Working Dir: ${process.cwd()}`);
|
|
2748
|
+
console.log();
|
|
2749
|
+
break;
|
|
2750
|
+
}
|
|
2751
|
+
case 'doctor': {
|
|
2752
|
+
console.log(chalk.bold('\nSystem Diagnostics:\n'));
|
|
2753
|
+
console.log(` Node.js: ${chalk.green(process.version)}`);
|
|
2754
|
+
console.log(` Platform: ${chalk.green(process.platform)}`);
|
|
2755
|
+
console.log(` Arch: ${chalk.green(process.arch)}`);
|
|
2756
|
+
const apiKey = process.env.ANTHROPIC_API_KEY || process.env.AXON_API_KEY;
|
|
2757
|
+
console.log(` API Key: ${apiKey ? chalk.green('configured') : chalk.red('not set')}`);
|
|
2758
|
+
console.log(` Working Dir: ${chalk.green(process.cwd())}`);
|
|
2759
|
+
const claudeMd = fs.existsSync(path.join(process.cwd(), 'AXON.md'));
|
|
2760
|
+
console.log(` AXON.md: ${claudeMd ? chalk.green('found') : chalk.gray('not found')}`);
|
|
2761
|
+
console.log();
|
|
2762
|
+
break;
|
|
2763
|
+
}
|
|
2764
|
+
case 'exit':
|
|
2765
|
+
case 'quit':
|
|
2766
|
+
console.log(chalk.yellow(`\n${t('cli.misc.goodbye')}`));
|
|
2767
|
+
console.error(chalk.gray('[AutoMemory] Saving conversation memory...'));
|
|
2768
|
+
await loop.autoMemorize();
|
|
2769
|
+
// SessionEnd hooks
|
|
2770
|
+
try {
|
|
2771
|
+
await runSessionEndHooks(activeSessionId || 'unknown', 'prompt_input_exit');
|
|
2772
|
+
}
|
|
2773
|
+
catch {
|
|
2774
|
+
// 不让 hook 失败阻止退出
|
|
2775
|
+
}
|
|
2776
|
+
const exitStats = loop.getSession().getStats();
|
|
2777
|
+
console.log(chalk.gray(`Session: ${exitStats.messageCount} messages, ${exitStats.totalCost}`));
|
|
2778
|
+
showSessionResumeHint();
|
|
2779
|
+
safeExit(0);
|
|
2780
|
+
case 'color': {
|
|
2781
|
+
console.log(chalk.bold('\nPrompt Bar Color:\n'));
|
|
2782
|
+
console.log(chalk.gray(' Color customization is available in the interactive UI.\n'));
|
|
2783
|
+
break;
|
|
2784
|
+
}
|
|
2785
|
+
case 'release-notes': {
|
|
2786
|
+
console.log(chalk.bold(`\nAxon ${VERSION_FULL}\n`));
|
|
2787
|
+
console.log(chalk.gray(' Visit https://docs.anthropic.com/en/docs/claude-code for release notes.\n'));
|
|
2788
|
+
break;
|
|
2789
|
+
}
|
|
2790
|
+
case 'btw': {
|
|
2791
|
+
console.log(chalk.gray('\nJust type your side question directly in the conversation.\n'));
|
|
2792
|
+
break;
|
|
2793
|
+
}
|
|
2794
|
+
// === Session ===
|
|
2795
|
+
case 'compact': {
|
|
2796
|
+
const session = loop.getSession();
|
|
2797
|
+
const msgCount = session.getMessages().length;
|
|
2798
|
+
if (msgCount <= 2) {
|
|
2799
|
+
console.log(chalk.gray('\nConversation is already compact.\n'));
|
|
2800
|
+
}
|
|
2801
|
+
else {
|
|
2802
|
+
console.log(chalk.yellow(`\nContext compaction is triggered automatically when needed.`));
|
|
2803
|
+
console.log(chalk.gray(`Current messages: ${msgCount}`));
|
|
2804
|
+
console.log(chalk.gray('The conversation will be compacted before the next API call if the context exceeds the threshold.\n'));
|
|
2805
|
+
}
|
|
2806
|
+
break;
|
|
2807
|
+
}
|
|
2808
|
+
case 'context': {
|
|
2809
|
+
const session = loop.getSession();
|
|
2810
|
+
const msgs = session.getMessages();
|
|
2811
|
+
let totalChars = 0;
|
|
2812
|
+
msgs.forEach(m => {
|
|
2813
|
+
if (typeof m.content === 'string')
|
|
2814
|
+
totalChars += m.content.length;
|
|
2815
|
+
else if (Array.isArray(m.content)) {
|
|
2816
|
+
m.content.forEach((c) => { if (c.text)
|
|
2817
|
+
totalChars += c.text.length; });
|
|
2818
|
+
}
|
|
2819
|
+
});
|
|
2820
|
+
const estimatedTokens = Math.round(totalChars / 4);
|
|
2821
|
+
console.log(chalk.bold('\nContext Usage:\n'));
|
|
2822
|
+
console.log(` Messages: ${msgs.length}`);
|
|
2823
|
+
console.log(` Estimated tokens: ~${estimatedTokens.toLocaleString()}`);
|
|
2824
|
+
console.log(chalk.gray(` (rough estimate: 1 token ≈ 4 chars)\n`));
|
|
2825
|
+
break;
|
|
2826
|
+
}
|
|
2827
|
+
case 'cost': {
|
|
2828
|
+
const costStats = loop.getSession().getStats();
|
|
2829
|
+
console.log(chalk.bold('\nSession Cost:\n'));
|
|
2830
|
+
console.log(` Total cost: ${costStats.totalCost}`);
|
|
2831
|
+
console.log(` Messages: ${costStats.messageCount}`);
|
|
2832
|
+
console.log();
|
|
2833
|
+
break;
|
|
2834
|
+
}
|
|
2835
|
+
case 'resume':
|
|
2836
|
+
case 'continue': {
|
|
2837
|
+
if (args[0]) {
|
|
2838
|
+
console.log(chalk.yellow(`\nTo resume a session, restart with: claude --resume ${args[0]}\n`));
|
|
2839
|
+
}
|
|
2840
|
+
else {
|
|
2841
|
+
const sessions = listSessions();
|
|
2842
|
+
if (sessions.length === 0) {
|
|
2843
|
+
console.log(chalk.gray('\nNo previous sessions found.\n'));
|
|
2844
|
+
}
|
|
2845
|
+
else {
|
|
2846
|
+
console.log(chalk.bold('\nRecent sessions:\n'));
|
|
2847
|
+
sessions.slice(0, 10).forEach((s, i) => {
|
|
2848
|
+
const date = new Date(s.updatedAt).toLocaleString();
|
|
2849
|
+
console.log(` ${chalk.cyan(s.id.slice(0, 8))} ${s.name || '(untitled)'} ${chalk.gray(date)}`);
|
|
2850
|
+
});
|
|
2851
|
+
console.log(chalk.gray('\nUse: claude --resume <id> to resume\n'));
|
|
2852
|
+
}
|
|
2853
|
+
}
|
|
2854
|
+
break;
|
|
2855
|
+
}
|
|
2856
|
+
case 'rename': {
|
|
2857
|
+
const newName = args.join(' ').trim();
|
|
2858
|
+
if (!newName) {
|
|
2859
|
+
console.log(chalk.red('\nUsage: /rename <new-name>\n'));
|
|
2860
|
+
}
|
|
2861
|
+
else {
|
|
2862
|
+
console.log(chalk.green(`\nConversation renamed to: ${newName}\n`));
|
|
2863
|
+
}
|
|
2864
|
+
break;
|
|
2865
|
+
}
|
|
2866
|
+
case 'export': {
|
|
2867
|
+
console.log(chalk.bold('\nExport Conversation:\n'));
|
|
2868
|
+
console.log(chalk.gray(' Export functionality is available in the interactive UI.\n'));
|
|
2869
|
+
break;
|
|
2870
|
+
}
|
|
2871
|
+
case 'tag': {
|
|
2872
|
+
const tagName = args.join(' ').trim();
|
|
2873
|
+
if (!tagName) {
|
|
2874
|
+
console.log(chalk.red('\nUsage: /tag <tag-name>\n'));
|
|
2875
|
+
}
|
|
2876
|
+
else {
|
|
2877
|
+
console.log(chalk.green(`\nTag toggled: ${tagName}\n`));
|
|
2878
|
+
}
|
|
2879
|
+
break;
|
|
2880
|
+
}
|
|
2881
|
+
case 'stats': {
|
|
2882
|
+
const stats = loop.getSession().getStats();
|
|
2883
|
+
console.log(chalk.bold('\nSession Statistics:'));
|
|
2884
|
+
console.log(` Duration: ${Math.round(stats.duration / 1000)}s`);
|
|
2885
|
+
console.log(` Messages: ${stats.messageCount}`);
|
|
2886
|
+
console.log(` Cost: ${stats.totalCost}`);
|
|
2887
|
+
console.log();
|
|
2888
|
+
break;
|
|
2889
|
+
}
|
|
2890
|
+
case 'files': {
|
|
2891
|
+
const targetDir = args[0] ? path.resolve(args[0]) : process.cwd();
|
|
2892
|
+
try {
|
|
2893
|
+
const entries = fs.readdirSync(targetDir, { withFileTypes: true });
|
|
2894
|
+
console.log(chalk.bold(`\nFiles in ${targetDir}:\n`));
|
|
2895
|
+
entries.forEach(e => {
|
|
2896
|
+
const prefix = e.isDirectory() ? chalk.cyan(' d ') : chalk.gray(' f ');
|
|
2897
|
+
console.log(`${prefix}${e.name}`);
|
|
2898
|
+
});
|
|
2899
|
+
console.log(chalk.gray(`\n ${entries.length} items\n`));
|
|
2900
|
+
}
|
|
2901
|
+
catch {
|
|
2902
|
+
console.log(chalk.red(`\nCannot read directory: ${targetDir}\n`));
|
|
2903
|
+
}
|
|
2904
|
+
break;
|
|
2905
|
+
}
|
|
2906
|
+
case 'fork': {
|
|
2907
|
+
console.log(chalk.bold('\nFork Conversation:\n'));
|
|
2908
|
+
console.log(chalk.gray(' Creates a new conversation branch from the current point.\n'));
|
|
2909
|
+
break;
|
|
2910
|
+
}
|
|
2911
|
+
case 'copy': {
|
|
2912
|
+
console.log(chalk.gray('\nCopy functionality is available in the interactive UI.\n'));
|
|
2913
|
+
break;
|
|
2914
|
+
}
|
|
2915
|
+
case 'session':
|
|
2916
|
+
case 'remote': {
|
|
2917
|
+
console.log(chalk.bold('\nSession Info:\n'));
|
|
2918
|
+
console.log(` Session ID: ${loop.getSession().sessionId}`);
|
|
2919
|
+
console.log(chalk.gray('\n Remote session features require Claude Pro/Team.\n'));
|
|
2920
|
+
break;
|
|
2921
|
+
}
|
|
2922
|
+
case 'rewind':
|
|
2923
|
+
case 'checkpoint': {
|
|
2924
|
+
console.log(chalk.bold('\nRewind / Checkpoint:\n'));
|
|
2925
|
+
console.log(chalk.gray(' Restore code and conversation to a previous checkpoint.\n'));
|
|
2926
|
+
break;
|
|
2927
|
+
}
|
|
2928
|
+
// === Configuration ===
|
|
2929
|
+
case 'model': {
|
|
2930
|
+
if (args[0]) {
|
|
2931
|
+
console.log(chalk.yellow(`\nModel switching requires restart. Use: claude -m ${args[0]}\n`));
|
|
2932
|
+
}
|
|
2933
|
+
else {
|
|
2934
|
+
console.log(chalk.bold('\nCurrent model: sonnet'));
|
|
2935
|
+
console.log(chalk.gray('\nAvailable models:'));
|
|
2936
|
+
console.log(' • opus - Claude Opus 4 (most capable)');
|
|
2937
|
+
console.log(' • sonnet - Claude Sonnet 4 (balanced)');
|
|
2938
|
+
console.log(' • haiku - Claude Haiku 3.5 (fastest)');
|
|
2939
|
+
console.log(chalk.gray('\nUse: /model <name> to switch\n'));
|
|
2940
|
+
}
|
|
2941
|
+
break;
|
|
2942
|
+
}
|
|
2943
|
+
case 'config':
|
|
2944
|
+
case 'settings': {
|
|
2945
|
+
const config = configManager.getAll();
|
|
2946
|
+
console.log(chalk.bold('\nCurrent Configuration:\n'));
|
|
2947
|
+
console.log(JSON.stringify(config, null, 2));
|
|
2948
|
+
console.log();
|
|
2949
|
+
break;
|
|
2950
|
+
}
|
|
2951
|
+
case 'permissions':
|
|
2952
|
+
case 'allowed-tools': {
|
|
2953
|
+
console.log(chalk.bold('\nPermission Settings:\n'));
|
|
2954
|
+
const config = configManager.getAll();
|
|
2955
|
+
const mode = config.permissionMode || 'default';
|
|
2956
|
+
console.log(` Mode: ${chalk.cyan(mode)}`);
|
|
2957
|
+
console.log(chalk.gray('\n Modes: default, acceptEdits, bypassPermissions, plan'));
|
|
2958
|
+
console.log(chalk.gray(' Use: claude --permission-mode <mode>\n'));
|
|
2959
|
+
break;
|
|
2960
|
+
}
|
|
2961
|
+
case 'hooks': {
|
|
2962
|
+
console.log(chalk.bold('\nHook Management:\n'));
|
|
2963
|
+
console.log(' Hooks are configured in ~/.axon/settings.json');
|
|
2964
|
+
console.log(chalk.gray(' Available hook points: PreToolUse, PostToolUse, Notification'));
|
|
2965
|
+
console.log(chalk.gray('\n Example in settings.json:'));
|
|
2966
|
+
console.log(chalk.gray(' { "hooks": { "PreToolUse": [{ "matcher": "*", "command": "..." }] } }\n'));
|
|
2967
|
+
break;
|
|
2968
|
+
}
|
|
2969
|
+
case 'privacy-settings': {
|
|
2970
|
+
console.log(chalk.bold('\nPrivacy Settings:\n'));
|
|
2971
|
+
console.log(chalk.gray(' View and update privacy settings in the interactive UI.\n'));
|
|
2972
|
+
break;
|
|
2973
|
+
}
|
|
2974
|
+
case 'theme': {
|
|
2975
|
+
console.log(chalk.bold('\nTheme:\n'));
|
|
2976
|
+
console.log(chalk.gray(' Theme customization is available in the interactive UI.\n'));
|
|
2977
|
+
break;
|
|
2978
|
+
}
|
|
2979
|
+
case 'vim': {
|
|
2980
|
+
console.log(chalk.gray('\nVim editing mode toggled.\n'));
|
|
2981
|
+
break;
|
|
2982
|
+
}
|
|
2983
|
+
case 'keybindings': {
|
|
2984
|
+
const keybindingsPath = path.join(os.homedir(), '.axon', 'keybindings.json');
|
|
2985
|
+
console.log(chalk.bold('\nKeybindings:\n'));
|
|
2986
|
+
console.log(` Config file: ${chalk.cyan(keybindingsPath)}`);
|
|
2987
|
+
console.log(chalk.gray('\n Edit the file to customize keybindings.\n'));
|
|
2988
|
+
break;
|
|
2989
|
+
}
|
|
2990
|
+
case 'output-style': {
|
|
2991
|
+
const style = args[0] || '';
|
|
2992
|
+
if (style) {
|
|
2993
|
+
console.log(chalk.green(`\nOutput style set to: ${style}\n`));
|
|
2994
|
+
}
|
|
2995
|
+
else {
|
|
2996
|
+
console.log(chalk.bold('\nOutput Style:\n'));
|
|
2997
|
+
console.log(chalk.gray(' Usage: /output-style <style>\n'));
|
|
2998
|
+
}
|
|
2999
|
+
break;
|
|
3000
|
+
}
|
|
3001
|
+
case 'plan': {
|
|
3002
|
+
console.log(chalk.yellow('\nTo enter planning mode, restart with:'));
|
|
3003
|
+
console.log(chalk.gray(' claude --permission-mode plan\n'));
|
|
3004
|
+
break;
|
|
3005
|
+
}
|
|
3006
|
+
case 'terminal-setup': {
|
|
3007
|
+
console.log(chalk.bold('\nTerminal Setup:\n'));
|
|
3008
|
+
console.log(chalk.gray(' Configure your terminal for optimal Axon experience.\n'));
|
|
3009
|
+
break;
|
|
3010
|
+
}
|
|
3011
|
+
case 'remote-env': {
|
|
3012
|
+
console.log(chalk.bold('\nRemote Environment:\n'));
|
|
3013
|
+
console.log(chalk.gray(' Configure remote environment settings for teleport.\n'));
|
|
3014
|
+
break;
|
|
3015
|
+
}
|
|
3016
|
+
// === Utility ===
|
|
3017
|
+
case 'tasks':
|
|
3018
|
+
case 'bashes': {
|
|
3019
|
+
console.log(chalk.bold('\nBackground Tasks:\n'));
|
|
3020
|
+
console.log(chalk.gray(' No background tasks running.\n'));
|
|
3021
|
+
break;
|
|
3022
|
+
}
|
|
3023
|
+
case 'todos': {
|
|
3024
|
+
console.log(chalk.bold('\nTodo Items:\n'));
|
|
3025
|
+
console.log(chalk.gray(' No todo items.\n'));
|
|
3026
|
+
break;
|
|
3027
|
+
}
|
|
3028
|
+
case 'add-dir': {
|
|
3029
|
+
if (!args[0]) {
|
|
3030
|
+
console.log(chalk.red('\nUsage: /add-dir <directory-path>\n'));
|
|
3031
|
+
break;
|
|
3032
|
+
}
|
|
3033
|
+
const dirPath = path.resolve(args[0]);
|
|
3034
|
+
if (!fs.existsSync(dirPath) || !fs.statSync(dirPath).isDirectory()) {
|
|
3035
|
+
console.log(chalk.red(`\nDirectory not found: ${dirPath}\n`));
|
|
3036
|
+
break;
|
|
3037
|
+
}
|
|
3038
|
+
additionalDirectories.push(dirPath);
|
|
3039
|
+
console.log(chalk.green(`\nAdded directory: ${dirPath}\n`));
|
|
3040
|
+
break;
|
|
3041
|
+
}
|
|
3042
|
+
case 'skills': {
|
|
3043
|
+
console.log(chalk.bold('\nAvailable Skills:\n'));
|
|
3044
|
+
console.log(chalk.gray(' Skills are loaded from ~/.axon/skills/ and .axon/commands/'));
|
|
3045
|
+
console.log(chalk.gray(' Use /skills to list or invoke skills.\n'));
|
|
3046
|
+
break;
|
|
3047
|
+
}
|
|
3048
|
+
case 'usage': {
|
|
3049
|
+
console.log(chalk.bold('\nPlan Usage:\n'));
|
|
3050
|
+
console.log(chalk.gray(' Usage information is available for authenticated users.\n'));
|
|
3051
|
+
break;
|
|
3052
|
+
}
|
|
3053
|
+
case 'extra-usage': {
|
|
3054
|
+
console.log(chalk.bold('\nExtra Usage:\n'));
|
|
3055
|
+
console.log(chalk.gray(' Configure extra usage settings for higher rate limits.\n'));
|
|
3056
|
+
break;
|
|
3057
|
+
}
|
|
3058
|
+
case 'rate-limit-options': {
|
|
3059
|
+
console.log(chalk.bold('\nRate Limit Options:\n'));
|
|
3060
|
+
console.log(chalk.gray(' Options available when rate limit is reached.\n'));
|
|
3061
|
+
break;
|
|
3062
|
+
}
|
|
3063
|
+
case 'stickers': {
|
|
3064
|
+
console.log(chalk.bold('\nAxon Stickers:\n'));
|
|
3065
|
+
console.log(chalk.gray(' Visit https://store.anthropic.com for Axon stickers.\n'));
|
|
3066
|
+
break;
|
|
3067
|
+
}
|
|
3068
|
+
// === Integration ===
|
|
3069
|
+
case 'mcp': {
|
|
3070
|
+
console.log(chalk.bold('\nMCP Server Management:\n'));
|
|
3071
|
+
console.log(' MCP servers are configured in ~/.axon/settings.json');
|
|
3072
|
+
console.log(chalk.gray('\n Use the WebUI for interactive MCP management.'));
|
|
3073
|
+
console.log(chalk.gray(' Or edit settings.json directly.\n'));
|
|
3074
|
+
break;
|
|
3075
|
+
}
|
|
3076
|
+
case 'agents':
|
|
3077
|
+
case 'plugins':
|
|
3078
|
+
case 'marketplace': {
|
|
3079
|
+
console.log(chalk.bold('\nAgent Management:\n'));
|
|
3080
|
+
console.log(' Custom agents are loaded from:');
|
|
3081
|
+
console.log(` User: ${chalk.cyan('~/.axon/agents/*.md')}`);
|
|
3082
|
+
console.log(` Project: ${chalk.cyan('.axon/agents/*.md')}`);
|
|
3083
|
+
console.log(chalk.gray('\n Create .md files with frontmatter to define agents.\n'));
|
|
3084
|
+
break;
|
|
3085
|
+
}
|
|
3086
|
+
case 'plugin': {
|
|
3087
|
+
console.log(chalk.bold('\nPlugin Management:\n'));
|
|
3088
|
+
console.log(chalk.gray(' Manage Axon plugins from the marketplace.\n'));
|
|
3089
|
+
break;
|
|
3090
|
+
}
|
|
3091
|
+
case 'ide': {
|
|
3092
|
+
console.log(chalk.bold('\nIDE Integration:\n'));
|
|
3093
|
+
console.log(' VS Code: Install the Axon extension');
|
|
3094
|
+
console.log(' JetBrains: Use the Axon plugin');
|
|
3095
|
+
console.log(chalk.gray('\n IDE integration connects Claude to your editor.\n'));
|
|
3096
|
+
break;
|
|
3097
|
+
}
|
|
3098
|
+
case 'chrome': {
|
|
3099
|
+
(async () => {
|
|
3100
|
+
const { showChromeSettings } = await import('./ui/ChromeSettings.js');
|
|
3101
|
+
await showChromeSettings();
|
|
3102
|
+
})();
|
|
3103
|
+
break;
|
|
3104
|
+
}
|
|
3105
|
+
case 'mobile':
|
|
3106
|
+
case 'ios':
|
|
3107
|
+
case 'android': {
|
|
3108
|
+
console.log(chalk.bold('\nClaude Mobile App:\n'));
|
|
3109
|
+
console.log(chalk.gray(' QR code display is available in the interactive UI.\n'));
|
|
3110
|
+
break;
|
|
3111
|
+
}
|
|
3112
|
+
case 'install': {
|
|
3113
|
+
console.log(chalk.bold('\nInstall Axon:\n'));
|
|
3114
|
+
console.log(chalk.gray(' Install Axon native build for your platform.\n'));
|
|
3115
|
+
break;
|
|
3116
|
+
}
|
|
3117
|
+
case 'install-github-app': {
|
|
3118
|
+
console.log(chalk.bold('\nClaude GitHub Actions:\n'));
|
|
3119
|
+
console.log(chalk.gray(' Set up Claude as a GitHub Actions bot for automated code review.\n'));
|
|
3120
|
+
break;
|
|
3121
|
+
}
|
|
3122
|
+
case 'install-slack-app': {
|
|
3123
|
+
console.log(chalk.bold('\nClaude Slack App:\n'));
|
|
3124
|
+
console.log(chalk.gray(' Install the Claude Slack app for team collaboration.\n'));
|
|
3125
|
+
break;
|
|
3126
|
+
}
|
|
3127
|
+
// === Auth ===
|
|
3128
|
+
case 'login': {
|
|
3129
|
+
const loginSubCmd = args[0]?.toLowerCase();
|
|
3130
|
+
if (loginSubCmd === 'status') {
|
|
3131
|
+
const loginApiKey = process.env.ANTHROPIC_API_KEY || process.env.AXON_API_KEY;
|
|
3132
|
+
if (loginApiKey) {
|
|
3133
|
+
console.log(chalk.green(`\nAuthenticated (API key: ${loginApiKey.slice(0, 10)}...)\n`));
|
|
3134
|
+
}
|
|
3135
|
+
else {
|
|
3136
|
+
console.log(chalk.red('\nNot authenticated. Set ANTHROPIC_API_KEY environment variable.\n'));
|
|
3137
|
+
}
|
|
3138
|
+
}
|
|
3139
|
+
else {
|
|
3140
|
+
console.log(chalk.bold('\nAuthentication:\n'));
|
|
3141
|
+
console.log(' /login status - Check authentication status');
|
|
3142
|
+
console.log(chalk.gray('\n Set ANTHROPIC_API_KEY environment variable to authenticate.\n'));
|
|
3143
|
+
}
|
|
3144
|
+
break;
|
|
3145
|
+
}
|
|
3146
|
+
case 'logout': {
|
|
3147
|
+
console.log(chalk.yellow('\nTo logout, unset the API key:'));
|
|
3148
|
+
console.log(chalk.gray(' unset ANTHROPIC_API_KEY\n'));
|
|
3149
|
+
break;
|
|
3150
|
+
}
|
|
3151
|
+
case 'upgrade': {
|
|
3152
|
+
console.log(chalk.bold('\nUpgrade to Max:\n'));
|
|
3153
|
+
console.log(chalk.gray(' Visit https://console.anthropic.com for higher rate limits.\n'));
|
|
3154
|
+
break;
|
|
3155
|
+
}
|
|
3156
|
+
case 'passes': {
|
|
3157
|
+
console.log(chalk.bold('\nPasses:\n'));
|
|
3158
|
+
console.log(chalk.gray(' Manage your Axon passes.\n'));
|
|
3159
|
+
break;
|
|
3160
|
+
}
|
|
3161
|
+
// === Development ===
|
|
3162
|
+
case 'review': {
|
|
3163
|
+
const target = args[0] || '.';
|
|
3164
|
+
console.log(chalk.yellow(`\nTo review code, ask Claude directly:`));
|
|
3165
|
+
console.log(chalk.gray(` "Review the code in ${target}"\n`));
|
|
3166
|
+
break;
|
|
3167
|
+
}
|
|
3168
|
+
case 'feedback':
|
|
3169
|
+
case 'bug': {
|
|
3170
|
+
console.log(chalk.bold('\nSubmit Feedback:\n'));
|
|
3171
|
+
console.log(` GitHub Issues: ${chalk.cyan('https://github.com/anthropics/claude-code/issues')}`);
|
|
3172
|
+
console.log();
|
|
3173
|
+
break;
|
|
3174
|
+
}
|
|
3175
|
+
case 'pr-comments': {
|
|
3176
|
+
console.log(chalk.yellow('\nTo get PR comments, ask Claude directly:'));
|
|
3177
|
+
console.log(chalk.gray(' "Get comments from PR #123"\n'));
|
|
3178
|
+
break;
|
|
3179
|
+
}
|
|
3180
|
+
case 'init': {
|
|
3181
|
+
const claudeMdPath = path.join(process.cwd(), 'AXON.md');
|
|
3182
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
3183
|
+
console.log(chalk.yellow(`\nAXON.md already exists at ${claudeMdPath}\n`));
|
|
3184
|
+
}
|
|
3185
|
+
else {
|
|
3186
|
+
fs.writeFileSync(claudeMdPath, `# AXON.md\n\n## Project Overview\n\nDescribe your project here.\n\n## Development Commands\n\n\`\`\`bash\n# Add your development commands here\n\`\`\`\n`, 'utf-8');
|
|
3187
|
+
console.log(chalk.green(`\nCreated AXON.md at ${claudeMdPath}\n`));
|
|
3188
|
+
}
|
|
3189
|
+
break;
|
|
3190
|
+
}
|
|
3191
|
+
case 'think-back': {
|
|
3192
|
+
console.log(chalk.bold('\nYour 2025 Axon Year in Review:\n'));
|
|
3193
|
+
console.log(chalk.gray(' Year in review is available in the interactive UI.\n'));
|
|
3194
|
+
break;
|
|
3195
|
+
}
|
|
3196
|
+
case 'thinkback-play': {
|
|
3197
|
+
console.log(chalk.gray('\nThinkback animation playback is available in the interactive UI.\n'));
|
|
3198
|
+
break;
|
|
3199
|
+
}
|
|
3200
|
+
case 'insights': {
|
|
3201
|
+
console.log(chalk.yellow('\nTo generate session insights, ask Claude directly:'));
|
|
3202
|
+
console.log(chalk.gray(' "Analyze this session and generate a report"\n'));
|
|
3203
|
+
break;
|
|
3204
|
+
}
|
|
3205
|
+
default:
|
|
3206
|
+
console.log(chalk.red(`Unknown command: /${cmd}`));
|
|
3207
|
+
console.log(chalk.gray('Type /help for available commands.\n'));
|
|
3208
|
+
}
|
|
3209
|
+
}
|
|
3210
|
+
// ============================================================================
|
|
3211
|
+
// Onboard command - 首次启动引导向导
|
|
3212
|
+
// ============================================================================
|
|
3213
|
+
program
|
|
3214
|
+
.command('onboard')
|
|
3215
|
+
.description('Run the onboarding wizard to configure Axon')
|
|
3216
|
+
.action(async () => {
|
|
3217
|
+
const { runOnboardingWizard } = await import('./wizard/onboarding.js');
|
|
3218
|
+
await runOnboardingWizard();
|
|
3219
|
+
safeExit(0);
|
|
3220
|
+
});
|
|
3221
|
+
// 错误处理
|
|
3222
|
+
process.on('uncaughtException', (err) => {
|
|
3223
|
+
console.error(chalk.red('Uncaught Exception:'), err.message);
|
|
3224
|
+
if (process.env.AXON_DEBUG) {
|
|
3225
|
+
console.error(chalk.red('Stack trace:'), err.stack);
|
|
3226
|
+
}
|
|
3227
|
+
safeExit(1);
|
|
3228
|
+
});
|
|
3229
|
+
process.on('unhandledRejection', (reason) => {
|
|
3230
|
+
console.error(chalk.red('Unhandled Rejection:'), reason?.message || reason);
|
|
3231
|
+
if (process.env.AXON_DEBUG && reason?.stack) {
|
|
3232
|
+
console.error(chalk.red('Stack trace:'), reason.stack);
|
|
3233
|
+
}
|
|
3234
|
+
});
|
|
3235
|
+
/**
|
|
3236
|
+
* 主函数 - 包装 CLI 执行以支持生命周期事件
|
|
3237
|
+
* 对应官方的 ZV7 函数和 tK7 函数
|
|
3238
|
+
*/
|
|
3239
|
+
async function main() {
|
|
3240
|
+
// 设置 AXON_ENTRYPOINT 环境变量(如果未设置)
|
|
3241
|
+
// 官方 Axon 使用此变量标识启动入口点
|
|
3242
|
+
if (!process.env.AXON_ENTRYPOINT) {
|
|
3243
|
+
process.env.AXON_ENTRYPOINT = 'cli';
|
|
3244
|
+
}
|
|
3245
|
+
// CLI 级别生命周期事件
|
|
3246
|
+
await emitLifecycleEvent('cli_entry');
|
|
3247
|
+
await emitLifecycleEvent('cli_imports_loaded');
|
|
3248
|
+
// 检查特殊路径(对应官方的 fast path 检查)
|
|
3249
|
+
const args = process.argv.slice(2);
|
|
3250
|
+
// 版本快速路径
|
|
3251
|
+
if (args.length === 1 && (args[0] === '--version' || args[0] === '-v')) {
|
|
3252
|
+
await emitLifecycleEvent('cli_version_fast_path');
|
|
3253
|
+
program.parse();
|
|
3254
|
+
return;
|
|
3255
|
+
}
|
|
3256
|
+
// Chrome MCP 服务器路径 - 用于 Claude CLI 与 Chrome 扩展通信
|
|
3257
|
+
if (args[0] === '--claude-in-chrome-mcp') {
|
|
3258
|
+
await emitLifecycleEvent('cli_claude_in_chrome_mcp_path');
|
|
3259
|
+
const { runMcpServer } = await import('./chrome-mcp/index.js');
|
|
3260
|
+
await runMcpServer();
|
|
3261
|
+
return;
|
|
3262
|
+
}
|
|
3263
|
+
// Email MCP 服务器路径 - 用于邮件 IMAP/SMTP 操作
|
|
3264
|
+
if (args[0] === '--email-mcp') {
|
|
3265
|
+
const { main: runEmailMcp } = await import('./email-mcp/mcp-server.js');
|
|
3266
|
+
await runEmailMcp();
|
|
3267
|
+
return;
|
|
3268
|
+
}
|
|
3269
|
+
// Chrome Native Host 路径 - 用于 Chrome 扩展与 Native Host 通信
|
|
3270
|
+
if (args[0] === '--chrome-native-host') {
|
|
3271
|
+
await emitLifecycleEvent('cli_chrome_native_host_path');
|
|
3272
|
+
const { runNativeHost } = await import('./chrome-mcp/index.js');
|
|
3273
|
+
await runNativeHost();
|
|
3274
|
+
return;
|
|
3275
|
+
}
|
|
3276
|
+
// 主函数导入前
|
|
3277
|
+
await emitLifecycleEvent('cli_before_main_import');
|
|
3278
|
+
// 这里主模块已经导入(在 Node.js ES Module 中,导入是同步的)
|
|
3279
|
+
// 所以我们直接触发导入后事件
|
|
3280
|
+
await emitLifecycleEvent('cli_after_main_import');
|
|
3281
|
+
// 检查是否首次启动(非 --print 模式)
|
|
3282
|
+
const isPrintMode = args.includes('--print') || args.includes('-p');
|
|
3283
|
+
const isOnboardCommand = args.includes('onboard');
|
|
3284
|
+
if (!isPrintMode && !isOnboardCommand) {
|
|
3285
|
+
const { isOnboarded, runOnboardingWizard } = await import('./wizard/onboarding.js');
|
|
3286
|
+
if (!isOnboarded()) {
|
|
3287
|
+
// 首次启动,运行向导
|
|
3288
|
+
await runOnboardingWizard();
|
|
3289
|
+
return;
|
|
3290
|
+
}
|
|
3291
|
+
}
|
|
3292
|
+
// 运行主程序
|
|
3293
|
+
program.parse();
|
|
3294
|
+
// T511: cli_after_main_complete - CLI 完成
|
|
3295
|
+
await emitLifecycleEvent('cli_after_main_complete');
|
|
3296
|
+
}
|
|
3297
|
+
// 运行主函数
|
|
3298
|
+
main().catch((error) => {
|
|
3299
|
+
console.error(chalk.red('Fatal error:'), error);
|
|
3300
|
+
safeExit(1);
|
|
3301
|
+
});
|
|
3302
|
+
//# sourceMappingURL=cli.js.map
|