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
|
@@ -0,0 +1,2079 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Editor API
|
|
3
|
+
*
|
|
4
|
+
* 为代码编辑器提供 AI 驱动的增强功能
|
|
5
|
+
* - 代码导游:分析代码结构,生成导游步骤
|
|
6
|
+
* - 选中代码提问:基于代码上下文回答问题
|
|
7
|
+
* - 代码复杂度热力图:分析每行代码的复杂度
|
|
8
|
+
* - 重构建议:分析代码质量,提出重构建议
|
|
9
|
+
* - AI 代码气泡注释:生成有价值的代码解释
|
|
10
|
+
*/
|
|
11
|
+
import { Router } from 'express';
|
|
12
|
+
import { ClaudeClient } from '../../../core/client.js';
|
|
13
|
+
import { webAuth } from '../web-auth.js';
|
|
14
|
+
import { LRUCache } from 'lru-cache';
|
|
15
|
+
import crypto from 'crypto';
|
|
16
|
+
import { execSync } from 'child_process';
|
|
17
|
+
import fs from 'fs';
|
|
18
|
+
import path from 'path';
|
|
19
|
+
const router = Router();
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// 缓存配置
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// 代码导游结果缓存
|
|
24
|
+
const tourCache = new LRUCache({
|
|
25
|
+
max: 500,
|
|
26
|
+
ttl: 1000 * 60 * 15, // 15分钟
|
|
27
|
+
});
|
|
28
|
+
// 提问结果缓存
|
|
29
|
+
const askCache = new LRUCache({
|
|
30
|
+
max: 500,
|
|
31
|
+
ttl: 1000 * 60 * 15,
|
|
32
|
+
});
|
|
33
|
+
// 热力图结果缓存
|
|
34
|
+
const heatmapCache = new LRUCache({
|
|
35
|
+
max: 500,
|
|
36
|
+
ttl: 1000 * 60 * 15,
|
|
37
|
+
});
|
|
38
|
+
// 重构建议结果缓存
|
|
39
|
+
const refactorCache = new LRUCache({
|
|
40
|
+
max: 500,
|
|
41
|
+
ttl: 1000 * 60 * 15,
|
|
42
|
+
});
|
|
43
|
+
// 气泡注释结果缓存
|
|
44
|
+
const bubblesCache = new LRUCache({
|
|
45
|
+
max: 500,
|
|
46
|
+
ttl: 1000 * 60 * 15,
|
|
47
|
+
});
|
|
48
|
+
// Intent-to-Code 结果缓存
|
|
49
|
+
const intentCache = new LRUCache({
|
|
50
|
+
max: 500,
|
|
51
|
+
ttl: 1000 * 60 * 15,
|
|
52
|
+
});
|
|
53
|
+
// Code Review 结果缓存
|
|
54
|
+
const reviewCache = new LRUCache({
|
|
55
|
+
max: 500,
|
|
56
|
+
ttl: 1000 * 60 * 15,
|
|
57
|
+
});
|
|
58
|
+
// Test Generator 结果缓存
|
|
59
|
+
const testGenCache = new LRUCache({
|
|
60
|
+
max: 200,
|
|
61
|
+
ttl: 1000 * 60 * 15,
|
|
62
|
+
});
|
|
63
|
+
// Smart Diff 结果缓存
|
|
64
|
+
const smartDiffCache = new LRUCache({
|
|
65
|
+
max: 200,
|
|
66
|
+
ttl: 1000 * 60 * 10, // 10分钟
|
|
67
|
+
});
|
|
68
|
+
// Dead Code 结果缓存
|
|
69
|
+
const deadCodeCache = new LRUCache({
|
|
70
|
+
max: 500,
|
|
71
|
+
ttl: 1000 * 60 * 15, // 15分钟
|
|
72
|
+
});
|
|
73
|
+
// Time Machine 结果缓存
|
|
74
|
+
const timeMachineCache = new LRUCache({
|
|
75
|
+
max: 200,
|
|
76
|
+
ttl: 1000 * 60 * 15, // 15分钟
|
|
77
|
+
});
|
|
78
|
+
// Pattern Detector 结果缓存
|
|
79
|
+
const patternCache = new LRUCache({
|
|
80
|
+
max: 300,
|
|
81
|
+
ttl: 1000 * 60 * 15, // 15分钟
|
|
82
|
+
});
|
|
83
|
+
// API Doc 结果缓存
|
|
84
|
+
const apiDocCache = new LRUCache({
|
|
85
|
+
max: 500,
|
|
86
|
+
ttl: 1000 * 60 * 30, // 30分钟(API文档不常变)
|
|
87
|
+
});
|
|
88
|
+
// Inline Complete 结果缓存
|
|
89
|
+
const inlineCompleteCache = new LRUCache({
|
|
90
|
+
max: 200,
|
|
91
|
+
ttl: 1000 * 60 * 5, // 5分钟(代码上下文变化快)
|
|
92
|
+
});
|
|
93
|
+
// 防止重复请求
|
|
94
|
+
const pendingRequests = new Map();
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// 工具函数
|
|
97
|
+
// ============================================================================
|
|
98
|
+
/**
|
|
99
|
+
* 生成内容哈希作为缓存键的一部分
|
|
100
|
+
*/
|
|
101
|
+
function hashContent(content) {
|
|
102
|
+
return crypto.createHash('md5').update(content).digest('hex').substring(0, 8);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 初始化 Claude 客户端
|
|
106
|
+
*/
|
|
107
|
+
function createClient() {
|
|
108
|
+
try {
|
|
109
|
+
const creds = webAuth.getCredentials();
|
|
110
|
+
const apiKey = creds.apiKey;
|
|
111
|
+
const authToken = creds.authToken;
|
|
112
|
+
if (!apiKey && !authToken) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
return new ClaudeClient({
|
|
116
|
+
apiKey,
|
|
117
|
+
authToken,
|
|
118
|
+
baseUrl: creds.baseUrl || process.env.ANTHROPIC_BASE_URL,
|
|
119
|
+
model: 'claude-haiku-4-5-20251001', // AI Editor 使用 haiku 以节省成本
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error('[AI Editor] Failed to initialize client:', error);
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 调用 Claude API
|
|
129
|
+
*/
|
|
130
|
+
async function callClaude(prompt) {
|
|
131
|
+
// 确保 OAuth token 有效(对齐官方 NM())
|
|
132
|
+
await webAuth.ensureValidToken();
|
|
133
|
+
const client = createClient();
|
|
134
|
+
if (!client) {
|
|
135
|
+
throw new Error('API client not initialized, please check API Key configuration');
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const response = await client.createMessage([
|
|
139
|
+
{
|
|
140
|
+
role: 'user',
|
|
141
|
+
content: [{ type: 'text', text: prompt }],
|
|
142
|
+
},
|
|
143
|
+
], undefined, // 无工具
|
|
144
|
+
undefined, // 无 system prompt
|
|
145
|
+
{
|
|
146
|
+
enableThinking: false, // 快速响应
|
|
147
|
+
});
|
|
148
|
+
const content = response.content?.[0];
|
|
149
|
+
if (content?.type === 'text') {
|
|
150
|
+
return content.text;
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error('[AI Editor] API call failed:', error);
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 从 AI 响应中提取 JSON
|
|
161
|
+
*/
|
|
162
|
+
function extractJSON(text) {
|
|
163
|
+
// 1. 尝试从 markdown 代码块中提取
|
|
164
|
+
const codeBlockMatch = text.match(/```(?:json)?\s*\n?([\s\S]*?)```/);
|
|
165
|
+
if (codeBlockMatch) {
|
|
166
|
+
const inner = codeBlockMatch[1].trim();
|
|
167
|
+
try {
|
|
168
|
+
return JSON.parse(inner);
|
|
169
|
+
}
|
|
170
|
+
catch { }
|
|
171
|
+
}
|
|
172
|
+
// 2. 尝试匹配最外层 JSON 对象(使用大括号计数而非贪婪正则)
|
|
173
|
+
const firstBrace = text.indexOf('{');
|
|
174
|
+
if (firstBrace === -1) {
|
|
175
|
+
throw new Error('Unable to extract JSON from response');
|
|
176
|
+
}
|
|
177
|
+
let depth = 0;
|
|
178
|
+
let inString = false;
|
|
179
|
+
let escape = false;
|
|
180
|
+
for (let i = firstBrace; i < text.length; i++) {
|
|
181
|
+
const ch = text[i];
|
|
182
|
+
if (escape) {
|
|
183
|
+
escape = false;
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (ch === '\\' && inString) {
|
|
187
|
+
escape = true;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (ch === '"') {
|
|
191
|
+
inString = !inString;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (inString)
|
|
195
|
+
continue;
|
|
196
|
+
if (ch === '{')
|
|
197
|
+
depth++;
|
|
198
|
+
if (ch === '}') {
|
|
199
|
+
depth--;
|
|
200
|
+
if (depth === 0)
|
|
201
|
+
return JSON.parse(text.slice(firstBrace, i + 1));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// 3. fallback: 贪婪正则
|
|
205
|
+
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
206
|
+
if (!jsonMatch) {
|
|
207
|
+
throw new Error('Unable to extract JSON from response');
|
|
208
|
+
}
|
|
209
|
+
return JSON.parse(jsonMatch[0]);
|
|
210
|
+
}
|
|
211
|
+
// ============================================================================
|
|
212
|
+
// API 端点
|
|
213
|
+
// ============================================================================
|
|
214
|
+
/**
|
|
215
|
+
* POST /tour - 代码导游
|
|
216
|
+
*/
|
|
217
|
+
router.post('/tour', async (req, res) => {
|
|
218
|
+
try {
|
|
219
|
+
const { filePath, content } = req.body;
|
|
220
|
+
if (!filePath || !content) {
|
|
221
|
+
return res.status(400).json({
|
|
222
|
+
success: false,
|
|
223
|
+
error: 'Missing required parameters: filePath and content',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// 检查缓存
|
|
227
|
+
const cacheKey = `tour:${filePath}:${hashContent(content)}`;
|
|
228
|
+
const cached = tourCache.get(cacheKey);
|
|
229
|
+
if (cached) {
|
|
230
|
+
return res.json({ ...cached, fromCache: true });
|
|
231
|
+
}
|
|
232
|
+
// 检查是否有正在进行的相同请求
|
|
233
|
+
const pending = pendingRequests.get(cacheKey);
|
|
234
|
+
if (pending) {
|
|
235
|
+
const result = await pending;
|
|
236
|
+
return res.json({ ...result, fromCache: true });
|
|
237
|
+
}
|
|
238
|
+
// 创建新请求
|
|
239
|
+
const requestPromise = (async () => {
|
|
240
|
+
const prompt = `You are a professional code tour guide. Please analyze the code below, extracting important functions, classes, components, etc. as tour steps.
|
|
241
|
+
|
|
242
|
+
## Code File: ${filePath}
|
|
243
|
+
\`\`\`
|
|
244
|
+
${content}
|
|
245
|
+
\`\`\`
|
|
246
|
+
|
|
247
|
+
## Output Requirements
|
|
248
|
+
Return JSON format containing a steps array, each step includes:
|
|
249
|
+
- type: 'file' | 'function' | 'class' | 'block'
|
|
250
|
+
- name: name
|
|
251
|
+
- line: starting line number (from 1)
|
|
252
|
+
- endLine: ending line number (optional)
|
|
253
|
+
- description: brief description (1-2 sentences)
|
|
254
|
+
- importance: 'high' | 'medium' | 'low'
|
|
255
|
+
|
|
256
|
+
Only return the 5-10 most important steps, sorted by line number. Output only JSON, no other content.
|
|
257
|
+
|
|
258
|
+
Example:
|
|
259
|
+
{
|
|
260
|
+
"steps": [
|
|
261
|
+
{
|
|
262
|
+
"type": "class",
|
|
263
|
+
"name": "UserController",
|
|
264
|
+
"line": 10,
|
|
265
|
+
"endLine": 50,
|
|
266
|
+
"description": "User controller, handles user-related HTTP requests",
|
|
267
|
+
"importance": "high"
|
|
268
|
+
}
|
|
269
|
+
]
|
|
270
|
+
}`;
|
|
271
|
+
try {
|
|
272
|
+
const response = await callClaude(prompt);
|
|
273
|
+
if (!response) {
|
|
274
|
+
return { success: false, error: 'Unable to get AI response' };
|
|
275
|
+
}
|
|
276
|
+
const parsed = extractJSON(response);
|
|
277
|
+
return {
|
|
278
|
+
success: true,
|
|
279
|
+
data: {
|
|
280
|
+
steps: parsed.steps || [],
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
return {
|
|
286
|
+
success: false,
|
|
287
|
+
error: error.message || 'AI analysis failed',
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
})();
|
|
291
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
292
|
+
try {
|
|
293
|
+
const result = await requestPromise;
|
|
294
|
+
// 只缓存成功的结果
|
|
295
|
+
if (result.success) {
|
|
296
|
+
tourCache.set(cacheKey, result);
|
|
297
|
+
}
|
|
298
|
+
res.json(result);
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
pendingRequests.delete(cacheKey);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
console.error('[AI Editor] /tour request processing failed:', error);
|
|
306
|
+
res.status(500).json({
|
|
307
|
+
success: false,
|
|
308
|
+
error: error.message || 'Internal server error',
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
/**
|
|
313
|
+
* POST /ask - 选中代码提问
|
|
314
|
+
*/
|
|
315
|
+
router.post('/ask', async (req, res) => {
|
|
316
|
+
try {
|
|
317
|
+
const { code, question, filePath, context } = req.body;
|
|
318
|
+
if (!code || !question) {
|
|
319
|
+
return res.status(400).json({
|
|
320
|
+
success: false,
|
|
321
|
+
error: 'Missing required parameters: code and question',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
// 检查缓存
|
|
325
|
+
const cacheKey = `ask:${hashContent(code)}:${hashContent(question)}`;
|
|
326
|
+
const cached = askCache.get(cacheKey);
|
|
327
|
+
if (cached) {
|
|
328
|
+
return res.json({ ...cached, fromCache: true });
|
|
329
|
+
}
|
|
330
|
+
// 检查是否有正在进行的相同请求
|
|
331
|
+
const pending = pendingRequests.get(cacheKey);
|
|
332
|
+
if (pending) {
|
|
333
|
+
const result = await pending;
|
|
334
|
+
return res.json({ ...result, fromCache: true });
|
|
335
|
+
}
|
|
336
|
+
// 创建新请求
|
|
337
|
+
const requestPromise = (async () => {
|
|
338
|
+
const parts = [
|
|
339
|
+
'You are a professional code analysis assistant. The user has selected a piece of code and asked a question. Please answer based on the code context.',
|
|
340
|
+
'',
|
|
341
|
+
'## User Question',
|
|
342
|
+
question,
|
|
343
|
+
'',
|
|
344
|
+
'## Code Context',
|
|
345
|
+
];
|
|
346
|
+
if (filePath) {
|
|
347
|
+
parts.push(`File path: ${filePath}`);
|
|
348
|
+
}
|
|
349
|
+
if (context?.language) {
|
|
350
|
+
parts.push(`Language: ${context.language}`);
|
|
351
|
+
}
|
|
352
|
+
parts.push('```' + (context?.language || ''));
|
|
353
|
+
parts.push(code);
|
|
354
|
+
parts.push('```');
|
|
355
|
+
parts.push('');
|
|
356
|
+
parts.push('## Output Requirements');
|
|
357
|
+
parts.push('Answer concisely in 2-4 sentences. Output only the answer text, no extra formatting.');
|
|
358
|
+
const prompt = parts.join('\n');
|
|
359
|
+
try {
|
|
360
|
+
const response = await callClaude(prompt);
|
|
361
|
+
if (!response) {
|
|
362
|
+
return { success: false, error: 'Unable to get AI response' };
|
|
363
|
+
}
|
|
364
|
+
return {
|
|
365
|
+
success: true,
|
|
366
|
+
answer: response.trim(),
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
return {
|
|
371
|
+
success: false,
|
|
372
|
+
error: error.message || 'AI analysis failed',
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
})();
|
|
376
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
377
|
+
try {
|
|
378
|
+
const result = await requestPromise;
|
|
379
|
+
// 只缓存成功的结果
|
|
380
|
+
if (result.success) {
|
|
381
|
+
askCache.set(cacheKey, result);
|
|
382
|
+
}
|
|
383
|
+
res.json(result);
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
pendingRequests.delete(cacheKey);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
console.error('[AI Editor] /ask request processing failed:', error);
|
|
391
|
+
res.status(500).json({
|
|
392
|
+
success: false,
|
|
393
|
+
error: error.message || 'Internal server error',
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
/**
|
|
398
|
+
* POST /heatmap - 代码复杂度热力图
|
|
399
|
+
*/
|
|
400
|
+
router.post('/heatmap', async (req, res) => {
|
|
401
|
+
try {
|
|
402
|
+
const { filePath, content, language } = req.body;
|
|
403
|
+
if (!filePath || !content || !language) {
|
|
404
|
+
return res.status(400).json({
|
|
405
|
+
success: false,
|
|
406
|
+
heatmap: [],
|
|
407
|
+
error: 'Missing required parameters: filePath, content, and language',
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
// 检查缓存
|
|
411
|
+
const cacheKey = `heatmap:${filePath}:${hashContent(content)}`;
|
|
412
|
+
const cached = heatmapCache.get(cacheKey);
|
|
413
|
+
if (cached) {
|
|
414
|
+
return res.json({ ...cached, fromCache: true });
|
|
415
|
+
}
|
|
416
|
+
// 检查是否有正在进行的相同请求
|
|
417
|
+
const pending = pendingRequests.get(cacheKey);
|
|
418
|
+
if (pending) {
|
|
419
|
+
const result = await pending;
|
|
420
|
+
return res.json({ ...result, fromCache: true });
|
|
421
|
+
}
|
|
422
|
+
// 创建新请求
|
|
423
|
+
const requestPromise = (async () => {
|
|
424
|
+
const prompt = `You are a code complexity analysis expert. Please analyze the code below and assess a complexity score (0-100) for each line.
|
|
425
|
+
|
|
426
|
+
## Code File: ${filePath}
|
|
427
|
+
Language: ${language}
|
|
428
|
+
|
|
429
|
+
\`\`\`${language}
|
|
430
|
+
${content}
|
|
431
|
+
\`\`\`
|
|
432
|
+
|
|
433
|
+
## Scoring Criteria
|
|
434
|
+
- 0-20: Simple statements (variable declarations, simple assignments, etc.)
|
|
435
|
+
- 21-40: Basic logic (single-level if/for/while)
|
|
436
|
+
- 41-60: Medium complexity (nested logic, multi-condition checks)
|
|
437
|
+
- 61-80: High complexity (deep nesting, complex algorithms)
|
|
438
|
+
- 81-100: Very high complexity (code that needs refactoring)
|
|
439
|
+
|
|
440
|
+
## Output Requirements
|
|
441
|
+
Return JSON format containing a heatmap array, only include lines with complexity > 30:
|
|
442
|
+
{
|
|
443
|
+
"heatmap": [
|
|
444
|
+
{
|
|
445
|
+
"line": line number (from 1),
|
|
446
|
+
"complexity": complexity score (0-100),
|
|
447
|
+
"reason": "brief reason (1 sentence)"
|
|
448
|
+
}
|
|
449
|
+
]
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
Output only JSON, no other content.`;
|
|
453
|
+
try {
|
|
454
|
+
const response = await callClaude(prompt);
|
|
455
|
+
if (!response) {
|
|
456
|
+
return { success: false, heatmap: [], error: 'Unable to get AI response' };
|
|
457
|
+
}
|
|
458
|
+
const parsed = extractJSON(response);
|
|
459
|
+
return {
|
|
460
|
+
success: true,
|
|
461
|
+
heatmap: parsed.heatmap || [],
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
return {
|
|
466
|
+
success: false,
|
|
467
|
+
heatmap: [],
|
|
468
|
+
error: error.message || 'AI analysis failed',
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
})();
|
|
472
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
473
|
+
try {
|
|
474
|
+
const result = await requestPromise;
|
|
475
|
+
// 只缓存成功的结果
|
|
476
|
+
if (result.success) {
|
|
477
|
+
heatmapCache.set(cacheKey, result);
|
|
478
|
+
}
|
|
479
|
+
res.json(result);
|
|
480
|
+
}
|
|
481
|
+
finally {
|
|
482
|
+
pendingRequests.delete(cacheKey);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
catch (error) {
|
|
486
|
+
console.error('[AI Editor] /heatmap request processing failed:', error);
|
|
487
|
+
res.status(500).json({
|
|
488
|
+
success: false,
|
|
489
|
+
heatmap: [],
|
|
490
|
+
error: error.message || 'Internal server error',
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
});
|
|
494
|
+
/**
|
|
495
|
+
* POST /refactor - 重构建议
|
|
496
|
+
*/
|
|
497
|
+
router.post('/refactor', async (req, res) => {
|
|
498
|
+
try {
|
|
499
|
+
const { filePath, content, language } = req.body;
|
|
500
|
+
if (!filePath || !content || !language) {
|
|
501
|
+
return res.status(400).json({
|
|
502
|
+
success: false,
|
|
503
|
+
suggestions: [],
|
|
504
|
+
error: 'Missing required parameters: filePath, content, and language',
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
// 检查缓存
|
|
508
|
+
const cacheKey = `refactor:${filePath}:${hashContent(content)}`;
|
|
509
|
+
const cached = refactorCache.get(cacheKey);
|
|
510
|
+
if (cached) {
|
|
511
|
+
return res.json({ ...cached, fromCache: true });
|
|
512
|
+
}
|
|
513
|
+
// 检查是否有正在进行的相同请求
|
|
514
|
+
const pending = pendingRequests.get(cacheKey);
|
|
515
|
+
if (pending) {
|
|
516
|
+
const result = await pending;
|
|
517
|
+
return res.json({ ...result, fromCache: true });
|
|
518
|
+
}
|
|
519
|
+
// 创建新请求
|
|
520
|
+
const requestPromise = (async () => {
|
|
521
|
+
const prompt = `You are a code quality expert. Please analyze the code below and propose refactoring suggestions.
|
|
522
|
+
|
|
523
|
+
## Code File: ${filePath}
|
|
524
|
+
Language: ${language}
|
|
525
|
+
|
|
526
|
+
\`\`\`${language}
|
|
527
|
+
${content}
|
|
528
|
+
\`\`\`
|
|
529
|
+
|
|
530
|
+
## Analysis Dimensions
|
|
531
|
+
- extract: Functions/methods that can be extracted
|
|
532
|
+
- simplify: Logic that can be simplified
|
|
533
|
+
- rename: Poorly named variables/functions
|
|
534
|
+
- unused: Unused code
|
|
535
|
+
- duplicate: Duplicate code
|
|
536
|
+
- performance: Performance issues
|
|
537
|
+
- safety: Security concerns
|
|
538
|
+
|
|
539
|
+
## Output Requirements
|
|
540
|
+
Return JSON format containing a suggestions array:
|
|
541
|
+
{
|
|
542
|
+
"suggestions": [
|
|
543
|
+
{
|
|
544
|
+
"line": starting line number (from 1),
|
|
545
|
+
"endLine": ending line number,
|
|
546
|
+
"type": "extract" | "simplify" | "rename" | "unused" | "duplicate" | "performance" | "safety",
|
|
547
|
+
"message": "suggestion description (1-2 sentences)",
|
|
548
|
+
"priority": "high" | "medium" | "low"
|
|
549
|
+
}
|
|
550
|
+
]
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
Only return the 5-10 most important suggestions. Output only JSON, no other content.`;
|
|
554
|
+
try {
|
|
555
|
+
const response = await callClaude(prompt);
|
|
556
|
+
if (!response) {
|
|
557
|
+
return { success: false, suggestions: [], error: 'Unable to get AI response' };
|
|
558
|
+
}
|
|
559
|
+
const parsed = extractJSON(response);
|
|
560
|
+
return {
|
|
561
|
+
success: true,
|
|
562
|
+
suggestions: parsed.suggestions || [],
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
catch (error) {
|
|
566
|
+
return {
|
|
567
|
+
success: false,
|
|
568
|
+
suggestions: [],
|
|
569
|
+
error: error.message || 'AI analysis failed',
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
})();
|
|
573
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
574
|
+
try {
|
|
575
|
+
const result = await requestPromise;
|
|
576
|
+
// 只缓存成功的结果
|
|
577
|
+
if (result.success) {
|
|
578
|
+
refactorCache.set(cacheKey, result);
|
|
579
|
+
}
|
|
580
|
+
res.json(result);
|
|
581
|
+
}
|
|
582
|
+
finally {
|
|
583
|
+
pendingRequests.delete(cacheKey);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
catch (error) {
|
|
587
|
+
console.error('[AI Editor] /refactor request processing failed:', error);
|
|
588
|
+
res.status(500).json({
|
|
589
|
+
success: false,
|
|
590
|
+
suggestions: [],
|
|
591
|
+
error: error.message || 'Internal server error',
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
});
|
|
595
|
+
/**
|
|
596
|
+
* POST /bubbles - AI 代码气泡注释
|
|
597
|
+
*/
|
|
598
|
+
router.post('/bubbles', async (req, res) => {
|
|
599
|
+
try {
|
|
600
|
+
const { filePath, content, language } = req.body;
|
|
601
|
+
if (!filePath || !content || !language) {
|
|
602
|
+
return res.status(400).json({
|
|
603
|
+
success: false,
|
|
604
|
+
bubbles: [],
|
|
605
|
+
error: 'Missing required parameters: filePath, content, and language',
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
// 检查缓存
|
|
609
|
+
const cacheKey = `bubbles:${filePath}:${hashContent(content)}`;
|
|
610
|
+
const cached = bubblesCache.get(cacheKey);
|
|
611
|
+
if (cached) {
|
|
612
|
+
return res.json({ ...cached, fromCache: true });
|
|
613
|
+
}
|
|
614
|
+
// 检查是否有正在进行的相同请求
|
|
615
|
+
const pending = pendingRequests.get(cacheKey);
|
|
616
|
+
if (pending) {
|
|
617
|
+
const result = await pending;
|
|
618
|
+
return res.json({ ...result, fromCache: true });
|
|
619
|
+
}
|
|
620
|
+
// 创建新请求
|
|
621
|
+
const requestPromise = (async () => {
|
|
622
|
+
const prompt = `You are a code explanation expert. Please generate valuable explanation bubbles for the code below to help readers understand the code.
|
|
623
|
+
|
|
624
|
+
## Code File: ${filePath}
|
|
625
|
+
Language: ${language}
|
|
626
|
+
|
|
627
|
+
\`\`\`${language}
|
|
628
|
+
${content}
|
|
629
|
+
\`\`\`
|
|
630
|
+
|
|
631
|
+
## Bubble Types
|
|
632
|
+
- info: General information (code purpose, design patterns, etc.)
|
|
633
|
+
- warning: Notes (boundary conditions, potential issues, etc.)
|
|
634
|
+
- tip: Optimization suggestions (better approaches, performance tips, etc.)
|
|
635
|
+
|
|
636
|
+
## Output Requirements
|
|
637
|
+
Return JSON format containing a bubbles array:
|
|
638
|
+
{
|
|
639
|
+
"bubbles": [
|
|
640
|
+
{
|
|
641
|
+
"line": line number (from 1),
|
|
642
|
+
"message": "explanation text (1-2 sentences, valuable content, avoid obvious statements)",
|
|
643
|
+
"type": "info" | "warning" | "tip"
|
|
644
|
+
}
|
|
645
|
+
]
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
Only return the 3-8 most valuable bubbles, avoid obvious content. Output only JSON, no other content.`;
|
|
649
|
+
try {
|
|
650
|
+
const response = await callClaude(prompt);
|
|
651
|
+
if (!response) {
|
|
652
|
+
return { success: false, bubbles: [], error: 'Unable to get AI response' };
|
|
653
|
+
}
|
|
654
|
+
const parsed = extractJSON(response);
|
|
655
|
+
return {
|
|
656
|
+
success: true,
|
|
657
|
+
bubbles: parsed.bubbles || [],
|
|
658
|
+
};
|
|
659
|
+
}
|
|
660
|
+
catch (error) {
|
|
661
|
+
return {
|
|
662
|
+
success: false,
|
|
663
|
+
bubbles: [],
|
|
664
|
+
error: error.message || 'AI analysis failed',
|
|
665
|
+
};
|
|
666
|
+
}
|
|
667
|
+
})();
|
|
668
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
669
|
+
try {
|
|
670
|
+
const result = await requestPromise;
|
|
671
|
+
// 只缓存成功的结果
|
|
672
|
+
if (result.success) {
|
|
673
|
+
bubblesCache.set(cacheKey, result);
|
|
674
|
+
}
|
|
675
|
+
res.json(result);
|
|
676
|
+
}
|
|
677
|
+
finally {
|
|
678
|
+
pendingRequests.delete(cacheKey);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
catch (error) {
|
|
682
|
+
console.error('[AI Editor] /bubbles request processing failed:', error);
|
|
683
|
+
res.status(500).json({
|
|
684
|
+
success: false,
|
|
685
|
+
bubbles: [],
|
|
686
|
+
error: error.message || 'Internal server error',
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
});
|
|
690
|
+
/**
|
|
691
|
+
* POST /intent-to-code - Intent-to-Code (意图编程)
|
|
692
|
+
*/
|
|
693
|
+
router.post('/intent-to-code', async (req, res) => {
|
|
694
|
+
try {
|
|
695
|
+
const { filePath, code, intent, language, mode } = req.body;
|
|
696
|
+
if (!filePath || !code || !intent || !language || !mode) {
|
|
697
|
+
return res.status(400).json({
|
|
698
|
+
success: false,
|
|
699
|
+
error: 'Missing required parameters: filePath, code, intent, language, and mode',
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
// 检查缓存
|
|
703
|
+
const cacheKey = `intent:${hashContent(code)}:${hashContent(intent)}:${mode}`;
|
|
704
|
+
const cached = intentCache.get(cacheKey);
|
|
705
|
+
if (cached) {
|
|
706
|
+
return res.json({ ...cached, fromCache: true });
|
|
707
|
+
}
|
|
708
|
+
// 检查是否有正在进行的相同请求
|
|
709
|
+
const pending = pendingRequests.get(cacheKey);
|
|
710
|
+
if (pending) {
|
|
711
|
+
const result = await pending;
|
|
712
|
+
return res.json({ ...result, fromCache: true });
|
|
713
|
+
}
|
|
714
|
+
// 创建新请求
|
|
715
|
+
const requestPromise = (async () => {
|
|
716
|
+
let prompt = '';
|
|
717
|
+
if (mode === 'rewrite') {
|
|
718
|
+
prompt = `You are a professional code writing assistant. The user has selected a piece of code and described their modification intent. Please rewrite the code according to the intent.
|
|
719
|
+
|
|
720
|
+
## Original Code
|
|
721
|
+
File path: ${filePath}
|
|
722
|
+
Language: ${language}
|
|
723
|
+
|
|
724
|
+
\`\`\`${language}
|
|
725
|
+
${code}
|
|
726
|
+
\`\`\`
|
|
727
|
+
|
|
728
|
+
## User Intent
|
|
729
|
+
${intent}
|
|
730
|
+
|
|
731
|
+
## Output Requirements
|
|
732
|
+
Return JSON format:
|
|
733
|
+
{
|
|
734
|
+
"code": "complete rewritten code (maintain formatting and style)",
|
|
735
|
+
"explanation": "brief description of what was changed (1-2 sentences)"
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
Output only JSON, no other content.`;
|
|
739
|
+
}
|
|
740
|
+
else {
|
|
741
|
+
// generate 模式
|
|
742
|
+
prompt = `You are a professional code writing assistant. The user wants to generate code after a code comment. Please generate code based on the intent.
|
|
743
|
+
|
|
744
|
+
## Context
|
|
745
|
+
File path: ${filePath}
|
|
746
|
+
Language: ${language}
|
|
747
|
+
Comment content: ${code}
|
|
748
|
+
|
|
749
|
+
## User Intent
|
|
750
|
+
${intent}
|
|
751
|
+
|
|
752
|
+
## Output Requirements
|
|
753
|
+
Return JSON format:
|
|
754
|
+
{
|
|
755
|
+
"code": "generated code (well-formatted, ready to use)",
|
|
756
|
+
"explanation": "brief description of what was generated (1-2 sentences)"
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
Output only JSON, no other content.`;
|
|
760
|
+
}
|
|
761
|
+
try {
|
|
762
|
+
const response = await callClaude(prompt);
|
|
763
|
+
if (!response) {
|
|
764
|
+
return { success: false, error: 'Unable to get AI response' };
|
|
765
|
+
}
|
|
766
|
+
const parsed = extractJSON(response);
|
|
767
|
+
return {
|
|
768
|
+
success: true,
|
|
769
|
+
code: parsed.code || '',
|
|
770
|
+
explanation: parsed.explanation || '',
|
|
771
|
+
};
|
|
772
|
+
}
|
|
773
|
+
catch (error) {
|
|
774
|
+
return {
|
|
775
|
+
success: false,
|
|
776
|
+
error: error.message || 'AI generation failed',
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
})();
|
|
780
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
781
|
+
try {
|
|
782
|
+
const result = await requestPromise;
|
|
783
|
+
// 只缓存成功的结果
|
|
784
|
+
if (result.success) {
|
|
785
|
+
intentCache.set(cacheKey, result);
|
|
786
|
+
}
|
|
787
|
+
res.json(result);
|
|
788
|
+
}
|
|
789
|
+
finally {
|
|
790
|
+
pendingRequests.delete(cacheKey);
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
catch (error) {
|
|
794
|
+
console.error('[AI Editor] /intent-to-code request processing failed:', error);
|
|
795
|
+
res.status(500).json({
|
|
796
|
+
success: false,
|
|
797
|
+
error: error.message || 'Internal server error',
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
/**
|
|
802
|
+
* POST /code-review - AI Code Review (代码审查)
|
|
803
|
+
*/
|
|
804
|
+
router.post('/code-review', async (req, res) => {
|
|
805
|
+
try {
|
|
806
|
+
const { filePath, content, language } = req.body;
|
|
807
|
+
if (!filePath || !content || !language) {
|
|
808
|
+
return res.status(400).json({
|
|
809
|
+
success: false,
|
|
810
|
+
issues: [],
|
|
811
|
+
error: 'Missing required parameters: filePath, content, and language',
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
// 检查缓存
|
|
815
|
+
const cacheKey = `review:${filePath}:${hashContent(content)}`;
|
|
816
|
+
const cached = reviewCache.get(cacheKey);
|
|
817
|
+
if (cached) {
|
|
818
|
+
return res.json({ ...cached, fromCache: true });
|
|
819
|
+
}
|
|
820
|
+
// 检查是否有正在进行的相同请求
|
|
821
|
+
const pending = pendingRequests.get(cacheKey);
|
|
822
|
+
if (pending) {
|
|
823
|
+
const result = await pending;
|
|
824
|
+
return res.json({ ...result, fromCache: true });
|
|
825
|
+
}
|
|
826
|
+
// 创建新请求
|
|
827
|
+
const requestPromise = (async () => {
|
|
828
|
+
const prompt = `You are a code review expert. Please analyze the code below, find potential issues, and categorize them by type.
|
|
829
|
+
|
|
830
|
+
## Code File: ${filePath}
|
|
831
|
+
Language: ${language}
|
|
832
|
+
|
|
833
|
+
\`\`\`${language}
|
|
834
|
+
${content}
|
|
835
|
+
\`\`\`
|
|
836
|
+
|
|
837
|
+
## Issue Categories
|
|
838
|
+
- bug: Potential bugs (null pointers, uninitialized variables, race conditions, boundary conditions, etc.)
|
|
839
|
+
- performance: Performance issues (N+1 queries, unnecessary renders, memory leaks, inefficient algorithms, etc.)
|
|
840
|
+
- security: Security concerns (injection vulnerabilities, XSS, sensitive data exposure, insecure random numbers, etc.)
|
|
841
|
+
- style: Code style and best practices (naming conventions, code duplication, readability, design patterns, etc.)
|
|
842
|
+
|
|
843
|
+
## Severity Levels
|
|
844
|
+
- error: Serious issue, must fix
|
|
845
|
+
- warning: Warning, should fix
|
|
846
|
+
- info: Informational, optional optimization
|
|
847
|
+
|
|
848
|
+
## Output Requirements
|
|
849
|
+
Return JSON format:
|
|
850
|
+
{
|
|
851
|
+
"issues": [
|
|
852
|
+
{
|
|
853
|
+
"line": starting line number (from 1),
|
|
854
|
+
"endLine": ending line number,
|
|
855
|
+
"type": "bug" | "performance" | "security" | "style",
|
|
856
|
+
"severity": "error" | "warning" | "info",
|
|
857
|
+
"message": "issue description (1 sentence)",
|
|
858
|
+
"suggestion": "fix suggestion (1 sentence, optional)"
|
|
859
|
+
}
|
|
860
|
+
],
|
|
861
|
+
"summary": "overall code quality summary (2-3 sentences)"
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
Only return the 5-15 most important issues. Output only JSON, no other content.`;
|
|
865
|
+
try {
|
|
866
|
+
const response = await callClaude(prompt);
|
|
867
|
+
if (!response) {
|
|
868
|
+
return { success: false, issues: [], error: 'Unable to get AI response' };
|
|
869
|
+
}
|
|
870
|
+
const parsed = extractJSON(response);
|
|
871
|
+
return {
|
|
872
|
+
success: true,
|
|
873
|
+
issues: parsed.issues || [],
|
|
874
|
+
summary: parsed.summary || '',
|
|
875
|
+
};
|
|
876
|
+
}
|
|
877
|
+
catch (error) {
|
|
878
|
+
return {
|
|
879
|
+
success: false,
|
|
880
|
+
issues: [],
|
|
881
|
+
error: error.message || 'AI analysis failed',
|
|
882
|
+
};
|
|
883
|
+
}
|
|
884
|
+
})();
|
|
885
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
886
|
+
try {
|
|
887
|
+
const result = await requestPromise;
|
|
888
|
+
// 只缓存成功的结果
|
|
889
|
+
if (result.success) {
|
|
890
|
+
reviewCache.set(cacheKey, result);
|
|
891
|
+
}
|
|
892
|
+
res.json(result);
|
|
893
|
+
}
|
|
894
|
+
finally {
|
|
895
|
+
pendingRequests.delete(cacheKey);
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
catch (error) {
|
|
899
|
+
console.error('[AI Editor] /code-review request processing failed:', error);
|
|
900
|
+
res.status(500).json({
|
|
901
|
+
success: false,
|
|
902
|
+
issues: [],
|
|
903
|
+
error: error.message || 'Internal server error',
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
});
|
|
907
|
+
/**
|
|
908
|
+
* POST /generate-test - Test Generator (测试生成)
|
|
909
|
+
*/
|
|
910
|
+
router.post('/generate-test', async (req, res) => {
|
|
911
|
+
try {
|
|
912
|
+
const { filePath, code, functionName, language, framework } = req.body;
|
|
913
|
+
if (!filePath || !code || !functionName || !language) {
|
|
914
|
+
return res.status(400).json({
|
|
915
|
+
success: false,
|
|
916
|
+
error: 'Missing required parameters: filePath, code, functionName, and language',
|
|
917
|
+
});
|
|
918
|
+
}
|
|
919
|
+
// 检查缓存
|
|
920
|
+
const cacheKey = `testgen:${hashContent(code)}:${functionName}:${language}`;
|
|
921
|
+
const cached = testGenCache.get(cacheKey);
|
|
922
|
+
if (cached) {
|
|
923
|
+
return res.json({ ...cached, fromCache: true });
|
|
924
|
+
}
|
|
925
|
+
// 检查是否有正在进行的相同请求
|
|
926
|
+
const pending = pendingRequests.get(cacheKey);
|
|
927
|
+
if (pending) {
|
|
928
|
+
const result = await pending;
|
|
929
|
+
return res.json({ ...result, fromCache: true });
|
|
930
|
+
}
|
|
931
|
+
// 创建新请求
|
|
932
|
+
const requestPromise = (async () => {
|
|
933
|
+
// 自动检测测试框架
|
|
934
|
+
const detectFramework = (lang) => {
|
|
935
|
+
const frameworks = {
|
|
936
|
+
'typescript': 'vitest',
|
|
937
|
+
'javascript': 'vitest',
|
|
938
|
+
'python': 'pytest',
|
|
939
|
+
'go': 'testing',
|
|
940
|
+
'rust': 'rust-test',
|
|
941
|
+
'java': 'junit',
|
|
942
|
+
};
|
|
943
|
+
return frameworks[lang] || 'vitest';
|
|
944
|
+
};
|
|
945
|
+
const testFramework = framework || detectFramework(language);
|
|
946
|
+
const prompt = `You are a test code generation expert. Please generate complete unit tests for the function below.
|
|
947
|
+
|
|
948
|
+
## Function Code
|
|
949
|
+
File path: ${filePath}
|
|
950
|
+
Language: ${language}
|
|
951
|
+
Function name: ${functionName}
|
|
952
|
+
|
|
953
|
+
\`\`\`${language}
|
|
954
|
+
${code}
|
|
955
|
+
\`\`\`
|
|
956
|
+
|
|
957
|
+
## Test Requirements
|
|
958
|
+
- Test framework: ${testFramework}
|
|
959
|
+
- Cover normal cases, boundary conditions, and error cases
|
|
960
|
+
- Test code should be complete and runnable, including necessary imports and setup
|
|
961
|
+
- Test case names should be clear and descriptive
|
|
962
|
+
- Each test should be an independent test case
|
|
963
|
+
|
|
964
|
+
## Output Requirements
|
|
965
|
+
Return JSON format:
|
|
966
|
+
{
|
|
967
|
+
"testCode": "complete test file code",
|
|
968
|
+
"testFramework": "${testFramework}",
|
|
969
|
+
"testCount": number of test cases (number),
|
|
970
|
+
"explanation": "what scenarios the tests cover (1-2 sentences)"
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
Output only JSON, no other content.`;
|
|
974
|
+
try {
|
|
975
|
+
const response = await callClaude(prompt);
|
|
976
|
+
if (!response) {
|
|
977
|
+
return { success: false, error: 'Unable to get AI response' };
|
|
978
|
+
}
|
|
979
|
+
const parsed = extractJSON(response);
|
|
980
|
+
return {
|
|
981
|
+
success: true,
|
|
982
|
+
testCode: parsed.testCode || '',
|
|
983
|
+
testFramework: parsed.testFramework || testFramework,
|
|
984
|
+
testCount: parsed.testCount || 0,
|
|
985
|
+
explanation: parsed.explanation || '',
|
|
986
|
+
};
|
|
987
|
+
}
|
|
988
|
+
catch (error) {
|
|
989
|
+
return {
|
|
990
|
+
success: false,
|
|
991
|
+
error: error.message || 'AI generation failed',
|
|
992
|
+
};
|
|
993
|
+
}
|
|
994
|
+
})();
|
|
995
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
996
|
+
try {
|
|
997
|
+
const result = await requestPromise;
|
|
998
|
+
// 只缓存成功的结果
|
|
999
|
+
if (result.success) {
|
|
1000
|
+
testGenCache.set(cacheKey, result);
|
|
1001
|
+
}
|
|
1002
|
+
res.json(result);
|
|
1003
|
+
}
|
|
1004
|
+
finally {
|
|
1005
|
+
pendingRequests.delete(cacheKey);
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
catch (error) {
|
|
1009
|
+
console.error('[AI Editor] /generate-test request processing failed:', error);
|
|
1010
|
+
res.status(500).json({
|
|
1011
|
+
success: false,
|
|
1012
|
+
error: error.message || 'Internal server error',
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1015
|
+
});
|
|
1016
|
+
/**
|
|
1017
|
+
* POST /api/ai-editor/smart-diff
|
|
1018
|
+
* 分析代码改动的语义影响
|
|
1019
|
+
*/
|
|
1020
|
+
router.post('/smart-diff', async (req, res) => {
|
|
1021
|
+
try {
|
|
1022
|
+
const { filePath, language, originalContent, modifiedContent } = req.body;
|
|
1023
|
+
// 参数验证
|
|
1024
|
+
if (!filePath || !originalContent || !modifiedContent) {
|
|
1025
|
+
return res.status(400).json({
|
|
1026
|
+
success: false,
|
|
1027
|
+
error: 'Missing required parameters (filePath, originalContent, modifiedContent)',
|
|
1028
|
+
});
|
|
1029
|
+
}
|
|
1030
|
+
// 生成缓存键
|
|
1031
|
+
const cacheKey = crypto
|
|
1032
|
+
.createHash('md5')
|
|
1033
|
+
.update(`smart-diff:${filePath}:${originalContent}:${modifiedContent}`)
|
|
1034
|
+
.digest('hex');
|
|
1035
|
+
// 检查缓存
|
|
1036
|
+
const cached = smartDiffCache.get(cacheKey);
|
|
1037
|
+
if (cached) {
|
|
1038
|
+
console.log(`[AI Editor] /smart-diff cache hit: ${cacheKey}`);
|
|
1039
|
+
return res.json({ ...cached, fromCache: true });
|
|
1040
|
+
}
|
|
1041
|
+
// 检查是否有正在处理的相同请求
|
|
1042
|
+
if (pendingRequests.has(cacheKey)) {
|
|
1043
|
+
console.log(`[AI Editor] /smart-diff request already in progress, reusing: ${cacheKey}`);
|
|
1044
|
+
const result = await pendingRequests.get(cacheKey);
|
|
1045
|
+
return res.json(result);
|
|
1046
|
+
}
|
|
1047
|
+
// 创建新请求
|
|
1048
|
+
const requestPromise = (async () => {
|
|
1049
|
+
try {
|
|
1050
|
+
const client = createClient();
|
|
1051
|
+
if (!client) {
|
|
1052
|
+
return {
|
|
1053
|
+
success: false,
|
|
1054
|
+
error: 'API client not initialized, please check API Key configuration',
|
|
1055
|
+
};
|
|
1056
|
+
}
|
|
1057
|
+
const prompt = `Please analyze the semantic impact of the following code changes.
|
|
1058
|
+
|
|
1059
|
+
File path: ${filePath}
|
|
1060
|
+
Programming language: ${language}
|
|
1061
|
+
|
|
1062
|
+
Original code:
|
|
1063
|
+
\`\`\`${language}
|
|
1064
|
+
${originalContent}
|
|
1065
|
+
\`\`\`
|
|
1066
|
+
|
|
1067
|
+
Modified code:
|
|
1068
|
+
\`\`\`${language}
|
|
1069
|
+
${modifiedContent}
|
|
1070
|
+
\`\`\`
|
|
1071
|
+
|
|
1072
|
+
Please analyze:
|
|
1073
|
+
1. Change summary: briefly describe what this change does
|
|
1074
|
+
2. Risk level (impact): safe (no risk), warning (potential issues to watch), danger (may introduce bugs)
|
|
1075
|
+
3. Specific changes list: each change includes type (added/removed/modified), description (semantic description), risk (optional risk note)
|
|
1076
|
+
4. Warnings list: list all potential issues
|
|
1077
|
+
|
|
1078
|
+
Return in JSON format as follows:
|
|
1079
|
+
{
|
|
1080
|
+
"summary": "change summary",
|
|
1081
|
+
"impact": "safe" | "warning" | "danger",
|
|
1082
|
+
"changes": [
|
|
1083
|
+
{ "type": "added" | "removed" | "modified", "description": "semantic description", "risk": "optional risk note" }
|
|
1084
|
+
],
|
|
1085
|
+
"warnings": ["warning 1", "warning 2"]
|
|
1086
|
+
}`;
|
|
1087
|
+
console.log(`[AI Editor] /smart-diff calling Claude: ${filePath}`);
|
|
1088
|
+
const response = await client.createMessage([{ role: 'user', content: [{ type: 'text', text: prompt }] }], undefined, // 无工具
|
|
1089
|
+
undefined, // 无 system prompt
|
|
1090
|
+
{ enableThinking: false });
|
|
1091
|
+
const rawText = response.content[0]?.type === 'text' ? response.content[0].text : '';
|
|
1092
|
+
if (!rawText) {
|
|
1093
|
+
return {
|
|
1094
|
+
success: false,
|
|
1095
|
+
error: 'AI did not return valid analysis results',
|
|
1096
|
+
};
|
|
1097
|
+
}
|
|
1098
|
+
// 尝试解析 JSON
|
|
1099
|
+
const parsed = extractJSON(rawText);
|
|
1100
|
+
if (!parsed || !parsed.summary || !parsed.impact) {
|
|
1101
|
+
console.error('[AI Editor] /smart-diff failed to parse AI response JSON:', rawText);
|
|
1102
|
+
return {
|
|
1103
|
+
success: false,
|
|
1104
|
+
error: 'AI returned incorrect format',
|
|
1105
|
+
};
|
|
1106
|
+
}
|
|
1107
|
+
return {
|
|
1108
|
+
success: true,
|
|
1109
|
+
analysis: {
|
|
1110
|
+
summary: parsed.summary,
|
|
1111
|
+
impact: parsed.impact,
|
|
1112
|
+
changes: parsed.changes || [],
|
|
1113
|
+
warnings: parsed.warnings || [],
|
|
1114
|
+
},
|
|
1115
|
+
};
|
|
1116
|
+
}
|
|
1117
|
+
catch (error) {
|
|
1118
|
+
console.error('[AI Editor] /smart-diff AI call failed:', error);
|
|
1119
|
+
return {
|
|
1120
|
+
success: false,
|
|
1121
|
+
error: error.message || 'AI call failed',
|
|
1122
|
+
};
|
|
1123
|
+
}
|
|
1124
|
+
})();
|
|
1125
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
1126
|
+
try {
|
|
1127
|
+
const result = await requestPromise;
|
|
1128
|
+
// 只缓存成功的结果
|
|
1129
|
+
if (result.success) {
|
|
1130
|
+
smartDiffCache.set(cacheKey, result);
|
|
1131
|
+
}
|
|
1132
|
+
res.json(result);
|
|
1133
|
+
}
|
|
1134
|
+
finally {
|
|
1135
|
+
pendingRequests.delete(cacheKey);
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
catch (error) {
|
|
1139
|
+
console.error('[AI Editor] /smart-diff request processing failed:', error);
|
|
1140
|
+
res.status(500).json({
|
|
1141
|
+
success: false,
|
|
1142
|
+
error: error.message || 'Internal server error',
|
|
1143
|
+
});
|
|
1144
|
+
}
|
|
1145
|
+
});
|
|
1146
|
+
/**
|
|
1147
|
+
* POST /api/ai-editor/dead-code
|
|
1148
|
+
* 检测代码中的死代码
|
|
1149
|
+
*/
|
|
1150
|
+
router.post('/dead-code', async (req, res) => {
|
|
1151
|
+
try {
|
|
1152
|
+
const { filePath, content, language } = req.body;
|
|
1153
|
+
// 参数验证
|
|
1154
|
+
if (!filePath || !content) {
|
|
1155
|
+
return res.status(400).json({
|
|
1156
|
+
success: false,
|
|
1157
|
+
deadCode: [],
|
|
1158
|
+
error: 'Missing required parameters (filePath, content)',
|
|
1159
|
+
});
|
|
1160
|
+
}
|
|
1161
|
+
// 生成缓存键
|
|
1162
|
+
const cacheKey = crypto
|
|
1163
|
+
.createHash('md5')
|
|
1164
|
+
.update(`dead-code:${filePath}:${content}`)
|
|
1165
|
+
.digest('hex');
|
|
1166
|
+
// 检查缓存
|
|
1167
|
+
const cached = deadCodeCache.get(cacheKey);
|
|
1168
|
+
if (cached) {
|
|
1169
|
+
console.log(`[AI Editor] /dead-code cache hit: ${cacheKey}`);
|
|
1170
|
+
return res.json({ ...cached, fromCache: true });
|
|
1171
|
+
}
|
|
1172
|
+
// 检查是否有正在处理的相同请求
|
|
1173
|
+
if (pendingRequests.has(cacheKey)) {
|
|
1174
|
+
console.log(`[AI Editor] /dead-code request already in progress, reusing: ${cacheKey}`);
|
|
1175
|
+
const result = await pendingRequests.get(cacheKey);
|
|
1176
|
+
return res.json(result);
|
|
1177
|
+
}
|
|
1178
|
+
// 创建新请求
|
|
1179
|
+
const requestPromise = (async () => {
|
|
1180
|
+
try {
|
|
1181
|
+
const client = createClient();
|
|
1182
|
+
if (!client) {
|
|
1183
|
+
return {
|
|
1184
|
+
success: false,
|
|
1185
|
+
deadCode: [],
|
|
1186
|
+
error: 'API client not initialized, please check API Key configuration',
|
|
1187
|
+
};
|
|
1188
|
+
}
|
|
1189
|
+
const prompt = `Please analyze the following code for dead code.
|
|
1190
|
+
|
|
1191
|
+
File path: ${filePath}
|
|
1192
|
+
Programming language: ${language}
|
|
1193
|
+
|
|
1194
|
+
Code content:
|
|
1195
|
+
\`\`\`${language}
|
|
1196
|
+
${content}
|
|
1197
|
+
\`\`\`
|
|
1198
|
+
|
|
1199
|
+
Please detect the following types of dead code:
|
|
1200
|
+
1. unused: Unused variables, functions, imports
|
|
1201
|
+
2. unreachable: Unreachable code (e.g., code after return)
|
|
1202
|
+
3. redundant: Redundant code (duplicate assignments, always-true conditions, etc.)
|
|
1203
|
+
4. suspicious: Exported but possibly unused across the entire project (cannot be determined from single-file analysis, mark as suspicious)
|
|
1204
|
+
|
|
1205
|
+
For each dead code instance, return:
|
|
1206
|
+
- line: starting line number
|
|
1207
|
+
- endLine: ending line number
|
|
1208
|
+
- type: type (unused/unreachable/redundant/suspicious)
|
|
1209
|
+
- name: variable/function/import name
|
|
1210
|
+
- reason: why it is considered dead code
|
|
1211
|
+
- confidence: confidence level (high/medium/low)
|
|
1212
|
+
|
|
1213
|
+
Return in JSON format as follows:
|
|
1214
|
+
{
|
|
1215
|
+
"deadCode": [
|
|
1216
|
+
{
|
|
1217
|
+
"line": 10,
|
|
1218
|
+
"endLine": 12,
|
|
1219
|
+
"type": "unused",
|
|
1220
|
+
"name": "unusedVar",
|
|
1221
|
+
"reason": "Variable declared but never used",
|
|
1222
|
+
"confidence": "high"
|
|
1223
|
+
}
|
|
1224
|
+
],
|
|
1225
|
+
"summary": "Detected N instances of dead code"
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
If there is no dead code, return an empty array.`;
|
|
1229
|
+
console.log(`[AI Editor] /dead-code calling Claude: ${filePath}`);
|
|
1230
|
+
const response = await client.createMessage([{ role: 'user', content: [{ type: 'text', text: prompt }] }], undefined, // 无工具
|
|
1231
|
+
undefined, // 无 system prompt
|
|
1232
|
+
{ enableThinking: false });
|
|
1233
|
+
const rawText = response.content[0]?.type === 'text' ? response.content[0].text : '';
|
|
1234
|
+
if (!rawText) {
|
|
1235
|
+
return {
|
|
1236
|
+
success: false,
|
|
1237
|
+
deadCode: [],
|
|
1238
|
+
error: 'AI did not return valid analysis results',
|
|
1239
|
+
};
|
|
1240
|
+
}
|
|
1241
|
+
// 尝试解析 JSON
|
|
1242
|
+
const parsed = extractJSON(rawText);
|
|
1243
|
+
if (!parsed || !Array.isArray(parsed.deadCode)) {
|
|
1244
|
+
console.error('[AI Editor] /dead-code failed to parse AI response JSON:', rawText);
|
|
1245
|
+
return {
|
|
1246
|
+
success: false,
|
|
1247
|
+
deadCode: [],
|
|
1248
|
+
error: 'AI returned incorrect format',
|
|
1249
|
+
};
|
|
1250
|
+
}
|
|
1251
|
+
return {
|
|
1252
|
+
success: true,
|
|
1253
|
+
deadCode: parsed.deadCode,
|
|
1254
|
+
summary: parsed.summary || `Detected ${parsed.deadCode.length} instances of dead code`,
|
|
1255
|
+
};
|
|
1256
|
+
}
|
|
1257
|
+
catch (error) {
|
|
1258
|
+
console.error('[AI Editor] /dead-code AI call failed:', error);
|
|
1259
|
+
return {
|
|
1260
|
+
success: false,
|
|
1261
|
+
deadCode: [],
|
|
1262
|
+
error: error.message || 'AI call failed',
|
|
1263
|
+
};
|
|
1264
|
+
}
|
|
1265
|
+
})();
|
|
1266
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
1267
|
+
try {
|
|
1268
|
+
const result = await requestPromise;
|
|
1269
|
+
// 只缓存成功的结果
|
|
1270
|
+
if (result.success) {
|
|
1271
|
+
deadCodeCache.set(cacheKey, result);
|
|
1272
|
+
}
|
|
1273
|
+
res.json(result);
|
|
1274
|
+
}
|
|
1275
|
+
finally {
|
|
1276
|
+
pendingRequests.delete(cacheKey);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
catch (error) {
|
|
1280
|
+
console.error('[AI Editor] /dead-code request processing failed:', error);
|
|
1281
|
+
res.status(500).json({
|
|
1282
|
+
success: false,
|
|
1283
|
+
deadCode: [],
|
|
1284
|
+
error: error.message || 'Internal server error',
|
|
1285
|
+
});
|
|
1286
|
+
}
|
|
1287
|
+
});
|
|
1288
|
+
/**
|
|
1289
|
+
* POST /api/ai-editor/conversation
|
|
1290
|
+
* 多轮代码对话,支持历史上下文
|
|
1291
|
+
*/
|
|
1292
|
+
router.post('/conversation', async (req, res) => {
|
|
1293
|
+
try {
|
|
1294
|
+
const { filePath, language, codeContext, cursorLine, messages, question } = req.body;
|
|
1295
|
+
// 参数验证
|
|
1296
|
+
if (!filePath || !codeContext || !question) {
|
|
1297
|
+
return res.status(400).json({
|
|
1298
|
+
success: false,
|
|
1299
|
+
error: 'Missing required parameters (filePath, codeContext, question)',
|
|
1300
|
+
});
|
|
1301
|
+
}
|
|
1302
|
+
// 生成缓存键(不缓存,但用于防重)
|
|
1303
|
+
const cacheKey = crypto
|
|
1304
|
+
.createHash('md5')
|
|
1305
|
+
.update(`conversation:${filePath}:${JSON.stringify(messages)}:${question}`)
|
|
1306
|
+
.digest('hex');
|
|
1307
|
+
// 检查是否有正在处理的相同请求(防重)
|
|
1308
|
+
if (pendingRequests.has(cacheKey)) {
|
|
1309
|
+
console.log(`[AI Editor] /conversation request already in progress, reusing: ${cacheKey}`);
|
|
1310
|
+
const result = await pendingRequests.get(cacheKey);
|
|
1311
|
+
return res.json(result);
|
|
1312
|
+
}
|
|
1313
|
+
// 创建新请求
|
|
1314
|
+
const requestPromise = (async () => {
|
|
1315
|
+
try {
|
|
1316
|
+
const client = createClient();
|
|
1317
|
+
if (!client) {
|
|
1318
|
+
return {
|
|
1319
|
+
success: false,
|
|
1320
|
+
error: 'API client not initialized, please check API Key configuration',
|
|
1321
|
+
};
|
|
1322
|
+
}
|
|
1323
|
+
// 构建 system prompt
|
|
1324
|
+
const systemPrompt = `You are a professional code assistant. The user is viewing the following file:
|
|
1325
|
+
|
|
1326
|
+
File path: ${filePath}
|
|
1327
|
+
Programming language: ${language}
|
|
1328
|
+
${cursorLine ? `Cursor line: ${cursorLine}` : ''}
|
|
1329
|
+
|
|
1330
|
+
Current code context:
|
|
1331
|
+
\`\`\`${language}
|
|
1332
|
+
${codeContext}
|
|
1333
|
+
\`\`\`
|
|
1334
|
+
|
|
1335
|
+
Please answer the user's questions based on the code context above. If the user mentions "this code", "current position", etc., refer to the code context above.`;
|
|
1336
|
+
// 构建消息列表
|
|
1337
|
+
const conversationMessages = [
|
|
1338
|
+
...messages.map(msg => ({
|
|
1339
|
+
role: msg.role,
|
|
1340
|
+
content: [{ type: 'text', text: msg.content }],
|
|
1341
|
+
})),
|
|
1342
|
+
{
|
|
1343
|
+
role: 'user',
|
|
1344
|
+
content: [{ type: 'text', text: question }],
|
|
1345
|
+
},
|
|
1346
|
+
];
|
|
1347
|
+
console.log(`[AI Editor] /conversation calling Claude: ${filePath}, ${conversationMessages.length} messages`);
|
|
1348
|
+
// 调用 Claude API
|
|
1349
|
+
const response = await client.createMessage(conversationMessages, undefined, // 无工具
|
|
1350
|
+
systemPrompt, // system prompt
|
|
1351
|
+
{ enableThinking: false });
|
|
1352
|
+
const answer = response.content[0]?.type === 'text' ? response.content[0].text : '';
|
|
1353
|
+
if (!answer) {
|
|
1354
|
+
return {
|
|
1355
|
+
success: false,
|
|
1356
|
+
error: 'AI did not return a valid answer',
|
|
1357
|
+
};
|
|
1358
|
+
}
|
|
1359
|
+
return {
|
|
1360
|
+
success: true,
|
|
1361
|
+
answer,
|
|
1362
|
+
};
|
|
1363
|
+
}
|
|
1364
|
+
catch (error) {
|
|
1365
|
+
console.error('[AI Editor] /conversation AI call failed:', error);
|
|
1366
|
+
return {
|
|
1367
|
+
success: false,
|
|
1368
|
+
error: error.message || 'AI call failed',
|
|
1369
|
+
};
|
|
1370
|
+
}
|
|
1371
|
+
})();
|
|
1372
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
1373
|
+
try {
|
|
1374
|
+
const result = await requestPromise;
|
|
1375
|
+
res.json(result);
|
|
1376
|
+
}
|
|
1377
|
+
finally {
|
|
1378
|
+
pendingRequests.delete(cacheKey);
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
catch (error) {
|
|
1382
|
+
console.error('[AI Editor] /conversation request processing failed:', error);
|
|
1383
|
+
res.status(500).json({
|
|
1384
|
+
success: false,
|
|
1385
|
+
error: error.message || 'Internal server error',
|
|
1386
|
+
});
|
|
1387
|
+
}
|
|
1388
|
+
});
|
|
1389
|
+
// ============================================================================
|
|
1390
|
+
// 第三批 AI 功能 API 端点
|
|
1391
|
+
// ============================================================================
|
|
1392
|
+
/**
|
|
1393
|
+
* POST /api/ai-editor/time-machine
|
|
1394
|
+
* 代码时光机:分析代码的 git 历史演变
|
|
1395
|
+
*/
|
|
1396
|
+
router.post('/time-machine', async (req, res) => {
|
|
1397
|
+
try {
|
|
1398
|
+
const { filePath, content, language, selectedCode, startLine, endLine } = req.body;
|
|
1399
|
+
// 参数验证
|
|
1400
|
+
if (!filePath || !content) {
|
|
1401
|
+
return res.status(400).json({
|
|
1402
|
+
success: false,
|
|
1403
|
+
error: 'Missing required parameters (filePath, content)',
|
|
1404
|
+
});
|
|
1405
|
+
}
|
|
1406
|
+
// 生成缓存键
|
|
1407
|
+
const cacheKey = crypto
|
|
1408
|
+
.createHash('md5')
|
|
1409
|
+
.update(`time-machine:${filePath}:${selectedCode || content}:${startLine}:${endLine}`)
|
|
1410
|
+
.digest('hex');
|
|
1411
|
+
// 检查缓存
|
|
1412
|
+
const cached = timeMachineCache.get(cacheKey);
|
|
1413
|
+
if (cached) {
|
|
1414
|
+
console.log(`[AI Editor] /time-machine cache hit: ${cacheKey}`);
|
|
1415
|
+
return res.json({ ...cached, fromCache: true });
|
|
1416
|
+
}
|
|
1417
|
+
// 检查是否有正在处理的相同请求
|
|
1418
|
+
if (pendingRequests.has(cacheKey)) {
|
|
1419
|
+
console.log(`[AI Editor] /time-machine request already in progress, reusing: ${cacheKey}`);
|
|
1420
|
+
const result = await pendingRequests.get(cacheKey);
|
|
1421
|
+
return res.json(result);
|
|
1422
|
+
}
|
|
1423
|
+
// 创建新请求
|
|
1424
|
+
const requestPromise = (async () => {
|
|
1425
|
+
try {
|
|
1426
|
+
const client = createClient();
|
|
1427
|
+
if (!client) {
|
|
1428
|
+
return {
|
|
1429
|
+
success: false,
|
|
1430
|
+
error: 'API client not initialized, please check API Key configuration',
|
|
1431
|
+
};
|
|
1432
|
+
}
|
|
1433
|
+
// 获取 git 历史
|
|
1434
|
+
let commits = [];
|
|
1435
|
+
let gitError = '';
|
|
1436
|
+
try {
|
|
1437
|
+
// 获取文件的整体历史(最近20条)
|
|
1438
|
+
const gitLogCmd = `git log --follow --format="%H|%an|%ae|%ad|%s" -20 -- "${filePath}"`;
|
|
1439
|
+
const gitOutput = execSync(gitLogCmd, {
|
|
1440
|
+
cwd: process.cwd(),
|
|
1441
|
+
encoding: 'utf-8',
|
|
1442
|
+
timeout: 5000,
|
|
1443
|
+
});
|
|
1444
|
+
// 解析 git log 输出
|
|
1445
|
+
const lines = gitOutput.trim().split('\n').filter(line => line);
|
|
1446
|
+
commits = lines.map(line => {
|
|
1447
|
+
const [hash, author, email, date, ...messageParts] = line.split('|');
|
|
1448
|
+
return {
|
|
1449
|
+
hash: hash || '',
|
|
1450
|
+
author: author || '',
|
|
1451
|
+
email: email || '',
|
|
1452
|
+
date: date || '',
|
|
1453
|
+
message: messageParts.join('|') || '',
|
|
1454
|
+
};
|
|
1455
|
+
});
|
|
1456
|
+
// 如果指定了行号范围,还获取该区域的历史
|
|
1457
|
+
if (startLine && endLine) {
|
|
1458
|
+
try {
|
|
1459
|
+
const gitLineLogCmd = `git log -L ${startLine},${endLine}:"${filePath}" --format="%H|%an|%ad|%s" -10`;
|
|
1460
|
+
const lineLogOutput = execSync(gitLineLogCmd, {
|
|
1461
|
+
cwd: process.cwd(),
|
|
1462
|
+
encoding: 'utf-8',
|
|
1463
|
+
timeout: 5000,
|
|
1464
|
+
});
|
|
1465
|
+
// 这个输出会更详细,但格式复杂,我们暂时只用于丰富上下文
|
|
1466
|
+
}
|
|
1467
|
+
catch (lineError) {
|
|
1468
|
+
console.log('[AI Editor] /time-machine git log -L failed (possibly unsupported), skipping');
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
}
|
|
1472
|
+
catch (error) {
|
|
1473
|
+
console.error('[AI Editor] /time-machine git command failed:', error);
|
|
1474
|
+
gitError = error.message || 'Git command execution failed';
|
|
1475
|
+
// 不是 git repo 或文件无历史,继续但通知 AI
|
|
1476
|
+
}
|
|
1477
|
+
// 构建 AI prompt
|
|
1478
|
+
const codeToAnalyze = selectedCode || content;
|
|
1479
|
+
const rangeDesc = startLine && endLine ? `Selected code range (lines ${startLine}-${endLine})` : 'entire file';
|
|
1480
|
+
const prompt = `Please analyze the evolution history of the following code.
|
|
1481
|
+
|
|
1482
|
+
File path: ${filePath}
|
|
1483
|
+
Analysis scope: ${rangeDesc}
|
|
1484
|
+
|
|
1485
|
+
${commits.length > 0 ? `Git history (last ${commits.length} commits):
|
|
1486
|
+
${commits.map(c => `- ${c.hash.substring(0, 7)} | ${c.author} | ${c.date} | ${c.message}`).join('\n')}
|
|
1487
|
+
` : `Note: This file has no Git history${gitError ? ` (reason: ${gitError})` : ''}, please infer the possible evolution process based on the code content.`}
|
|
1488
|
+
|
|
1489
|
+
Code content:
|
|
1490
|
+
\`\`\`${language}
|
|
1491
|
+
${codeToAnalyze}
|
|
1492
|
+
\`\`\`
|
|
1493
|
+
|
|
1494
|
+
Return the analysis results in JSON format:
|
|
1495
|
+
{
|
|
1496
|
+
"story": "Describe in plain language how this code evolved step by step to its current state, including major design decisions and refactoring processes",
|
|
1497
|
+
"keyChanges": [
|
|
1498
|
+
{
|
|
1499
|
+
"date": "2024-01-15",
|
|
1500
|
+
"description": "Initial version, implemented basic functionality"
|
|
1501
|
+
},
|
|
1502
|
+
{
|
|
1503
|
+
"date": "2024-02-20",
|
|
1504
|
+
"description": "Refactoring: introduced dependency injection pattern"
|
|
1505
|
+
}
|
|
1506
|
+
]
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1509
|
+
If there is no Git history, please infer the possible evolution process based on the code structure and comments (e.g., from simple to complex, from hardcoded to configurable, etc.).`;
|
|
1510
|
+
console.log(`[AI Editor] /time-machine calling Claude: ${filePath}, ${commits.length} commits`);
|
|
1511
|
+
const response = await client.createMessage([{ role: 'user', content: [{ type: 'text', text: prompt }] }], undefined, undefined, { enableThinking: false });
|
|
1512
|
+
const rawText = response.content[0]?.type === 'text' ? response.content[0].text : '';
|
|
1513
|
+
if (!rawText) {
|
|
1514
|
+
return {
|
|
1515
|
+
success: false,
|
|
1516
|
+
error: 'AI did not return valid analysis results',
|
|
1517
|
+
};
|
|
1518
|
+
}
|
|
1519
|
+
// 解析 JSON
|
|
1520
|
+
const parsed = extractJSON(rawText);
|
|
1521
|
+
if (!parsed || !parsed.story) {
|
|
1522
|
+
console.error('[AI Editor] /time-machine failed to parse AI response JSON:', rawText);
|
|
1523
|
+
return {
|
|
1524
|
+
success: false,
|
|
1525
|
+
error: 'AI returned incorrect format',
|
|
1526
|
+
};
|
|
1527
|
+
}
|
|
1528
|
+
return {
|
|
1529
|
+
success: true,
|
|
1530
|
+
history: {
|
|
1531
|
+
commits: commits,
|
|
1532
|
+
story: parsed.story,
|
|
1533
|
+
keyChanges: parsed.keyChanges || [],
|
|
1534
|
+
},
|
|
1535
|
+
};
|
|
1536
|
+
}
|
|
1537
|
+
catch (error) {
|
|
1538
|
+
console.error('[AI Editor] /time-machine AI call failed:', error);
|
|
1539
|
+
return {
|
|
1540
|
+
success: false,
|
|
1541
|
+
error: error.message || 'AI call failed',
|
|
1542
|
+
};
|
|
1543
|
+
}
|
|
1544
|
+
})();
|
|
1545
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
1546
|
+
try {
|
|
1547
|
+
const result = await requestPromise;
|
|
1548
|
+
// 只缓存成功的结果
|
|
1549
|
+
if (result.success) {
|
|
1550
|
+
timeMachineCache.set(cacheKey, result);
|
|
1551
|
+
}
|
|
1552
|
+
res.json(result);
|
|
1553
|
+
}
|
|
1554
|
+
finally {
|
|
1555
|
+
pendingRequests.delete(cacheKey);
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
catch (error) {
|
|
1559
|
+
console.error('[AI Editor] /time-machine request processing failed:', error);
|
|
1560
|
+
res.status(500).json({
|
|
1561
|
+
success: false,
|
|
1562
|
+
error: error.message || 'Internal server error',
|
|
1563
|
+
});
|
|
1564
|
+
}
|
|
1565
|
+
});
|
|
1566
|
+
/**
|
|
1567
|
+
* POST /api/ai-editor/detect-patterns
|
|
1568
|
+
* 模式检测器:检测代码中的重复模式
|
|
1569
|
+
*/
|
|
1570
|
+
router.post('/detect-patterns', async (req, res) => {
|
|
1571
|
+
try {
|
|
1572
|
+
const { filePath, content, language } = req.body;
|
|
1573
|
+
// 参数验证
|
|
1574
|
+
if (!filePath || !content) {
|
|
1575
|
+
return res.status(400).json({
|
|
1576
|
+
success: false,
|
|
1577
|
+
patterns: [],
|
|
1578
|
+
error: 'Missing required parameters (filePath, content)',
|
|
1579
|
+
});
|
|
1580
|
+
}
|
|
1581
|
+
// 生成缓存键
|
|
1582
|
+
const cacheKey = crypto
|
|
1583
|
+
.createHash('md5')
|
|
1584
|
+
.update(`detect-patterns:${filePath}:${content}`)
|
|
1585
|
+
.digest('hex');
|
|
1586
|
+
// 检查缓存
|
|
1587
|
+
const cached = patternCache.get(cacheKey);
|
|
1588
|
+
if (cached) {
|
|
1589
|
+
console.log(`[AI Editor] /detect-patterns cache hit: ${cacheKey}`);
|
|
1590
|
+
return res.json({ ...cached, fromCache: true });
|
|
1591
|
+
}
|
|
1592
|
+
// 检查是否有正在处理的相同请求
|
|
1593
|
+
if (pendingRequests.has(cacheKey)) {
|
|
1594
|
+
console.log(`[AI Editor] /detect-patterns request already in progress, reusing: ${cacheKey}`);
|
|
1595
|
+
const result = await pendingRequests.get(cacheKey);
|
|
1596
|
+
return res.json(result);
|
|
1597
|
+
}
|
|
1598
|
+
// 创建新请求
|
|
1599
|
+
const requestPromise = (async () => {
|
|
1600
|
+
try {
|
|
1601
|
+
const client = createClient();
|
|
1602
|
+
if (!client) {
|
|
1603
|
+
return {
|
|
1604
|
+
success: false,
|
|
1605
|
+
patterns: [],
|
|
1606
|
+
error: 'API client not initialized, please check API Key configuration',
|
|
1607
|
+
};
|
|
1608
|
+
}
|
|
1609
|
+
const prompt = `Please analyze the following code for duplicate patterns and abstractable code.
|
|
1610
|
+
|
|
1611
|
+
File path: ${filePath}
|
|
1612
|
+
Programming language: ${language}
|
|
1613
|
+
|
|
1614
|
+
Code content:
|
|
1615
|
+
\`\`\`${language}
|
|
1616
|
+
${content}
|
|
1617
|
+
\`\`\`
|
|
1618
|
+
|
|
1619
|
+
Please detect the following types of patterns:
|
|
1620
|
+
|
|
1621
|
+
1. **duplicate** (duplicate code blocks):
|
|
1622
|
+
- Similar try-catch blocks
|
|
1623
|
+
- Similar API call patterns
|
|
1624
|
+
- Duplicate data transformation logic
|
|
1625
|
+
- Duplicate validation code
|
|
1626
|
+
|
|
1627
|
+
2. **similar-logic** (similar logic):
|
|
1628
|
+
- Similar conditional checks
|
|
1629
|
+
- Similar loop processing
|
|
1630
|
+
- Similar error handling
|
|
1631
|
+
|
|
1632
|
+
3. **extract-candidate** (extraction candidates):
|
|
1633
|
+
- Code blocks that can be extracted into standalone functions
|
|
1634
|
+
- Methods that can be extracted into utility classes
|
|
1635
|
+
- Code that can be extracted into custom Hooks (React)
|
|
1636
|
+
|
|
1637
|
+
4. **design-pattern** (design pattern opportunities):
|
|
1638
|
+
- Places where the Strategy pattern can be applied
|
|
1639
|
+
- Places where the Factory pattern can be applied
|
|
1640
|
+
- Places where the Decorator pattern can be applied
|
|
1641
|
+
- Other design patterns
|
|
1642
|
+
|
|
1643
|
+
For each detected pattern, return:
|
|
1644
|
+
- type: pattern type
|
|
1645
|
+
- name: pattern name (brief description)
|
|
1646
|
+
- locations: array of locations [{ line, endLine }, ...]
|
|
1647
|
+
- description: detailed description
|
|
1648
|
+
- suggestion: suggested abstraction/refactoring approach
|
|
1649
|
+
- impact: impact level (high/medium/low)
|
|
1650
|
+
|
|
1651
|
+
Return in JSON format:
|
|
1652
|
+
{
|
|
1653
|
+
"patterns": [
|
|
1654
|
+
{
|
|
1655
|
+
"type": "duplicate",
|
|
1656
|
+
"name": "Duplicate error handling",
|
|
1657
|
+
"locations": [
|
|
1658
|
+
{ "line": 10, "endLine": 15 },
|
|
1659
|
+
{ "line": 30, "endLine": 35 }
|
|
1660
|
+
],
|
|
1661
|
+
"description": "Two similar try-catch error handling blocks",
|
|
1662
|
+
"suggestion": "Extract into a handleError utility function",
|
|
1663
|
+
"impact": "medium"
|
|
1664
|
+
}
|
|
1665
|
+
],
|
|
1666
|
+
"summary": "Detected N patterns, recommend prioritizing X high-impact patterns"
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
If no patterns are detected, return an empty array.`;
|
|
1670
|
+
console.log(`[AI Editor] /detect-patterns calling Claude: ${filePath}`);
|
|
1671
|
+
const response = await client.createMessage([{ role: 'user', content: [{ type: 'text', text: prompt }] }], undefined, undefined, { enableThinking: false });
|
|
1672
|
+
const rawText = response.content[0]?.type === 'text' ? response.content[0].text : '';
|
|
1673
|
+
if (!rawText) {
|
|
1674
|
+
return {
|
|
1675
|
+
success: false,
|
|
1676
|
+
patterns: [],
|
|
1677
|
+
error: 'AI did not return valid analysis results',
|
|
1678
|
+
};
|
|
1679
|
+
}
|
|
1680
|
+
// 解析 JSON
|
|
1681
|
+
const parsed = extractJSON(rawText);
|
|
1682
|
+
if (!parsed || !Array.isArray(parsed.patterns)) {
|
|
1683
|
+
console.error('[AI Editor] /detect-patterns failed to parse AI response JSON:', rawText);
|
|
1684
|
+
return {
|
|
1685
|
+
success: false,
|
|
1686
|
+
patterns: [],
|
|
1687
|
+
error: 'AI returned incorrect format',
|
|
1688
|
+
};
|
|
1689
|
+
}
|
|
1690
|
+
return {
|
|
1691
|
+
success: true,
|
|
1692
|
+
patterns: parsed.patterns,
|
|
1693
|
+
summary: parsed.summary || `Detected ${parsed.patterns.length} patterns`,
|
|
1694
|
+
};
|
|
1695
|
+
}
|
|
1696
|
+
catch (error) {
|
|
1697
|
+
console.error('[AI Editor] /detect-patterns AI call failed:', error);
|
|
1698
|
+
return {
|
|
1699
|
+
success: false,
|
|
1700
|
+
patterns: [],
|
|
1701
|
+
error: error.message || 'AI call failed',
|
|
1702
|
+
};
|
|
1703
|
+
}
|
|
1704
|
+
})();
|
|
1705
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
1706
|
+
try {
|
|
1707
|
+
const result = await requestPromise;
|
|
1708
|
+
// 只缓存成功的结果
|
|
1709
|
+
if (result.success) {
|
|
1710
|
+
patternCache.set(cacheKey, result);
|
|
1711
|
+
}
|
|
1712
|
+
res.json(result);
|
|
1713
|
+
}
|
|
1714
|
+
finally {
|
|
1715
|
+
pendingRequests.delete(cacheKey);
|
|
1716
|
+
}
|
|
1717
|
+
}
|
|
1718
|
+
catch (error) {
|
|
1719
|
+
console.error('[AI Editor] /detect-patterns request processing failed:', error);
|
|
1720
|
+
res.status(500).json({
|
|
1721
|
+
success: false,
|
|
1722
|
+
patterns: [],
|
|
1723
|
+
error: error.message || 'Internal server error',
|
|
1724
|
+
});
|
|
1725
|
+
}
|
|
1726
|
+
});
|
|
1727
|
+
/**
|
|
1728
|
+
* POST /api/ai-editor/api-doc
|
|
1729
|
+
* API 文档叠加:查询第三方库 API 的使用文档
|
|
1730
|
+
*/
|
|
1731
|
+
router.post('/api-doc', async (req, res) => {
|
|
1732
|
+
try {
|
|
1733
|
+
const { symbolName, packageName, language, codeContext } = req.body;
|
|
1734
|
+
// 参数验证
|
|
1735
|
+
if (!symbolName || !codeContext) {
|
|
1736
|
+
return res.status(400).json({
|
|
1737
|
+
success: false,
|
|
1738
|
+
error: 'Missing required parameters (symbolName, codeContext)',
|
|
1739
|
+
});
|
|
1740
|
+
}
|
|
1741
|
+
// 生成缓存键
|
|
1742
|
+
const cacheKey = crypto
|
|
1743
|
+
.createHash('md5')
|
|
1744
|
+
.update(`api-doc:${symbolName}:${packageName || ''}:${language}`)
|
|
1745
|
+
.digest('hex');
|
|
1746
|
+
// 检查缓存
|
|
1747
|
+
const cached = apiDocCache.get(cacheKey);
|
|
1748
|
+
if (cached) {
|
|
1749
|
+
console.log(`[AI Editor] /api-doc cache hit: ${cacheKey}`);
|
|
1750
|
+
return res.json({ ...cached, fromCache: true });
|
|
1751
|
+
}
|
|
1752
|
+
// 检查是否有正在处理的相同请求
|
|
1753
|
+
if (pendingRequests.has(cacheKey)) {
|
|
1754
|
+
console.log(`[AI Editor] /api-doc request already in progress, reusing: ${cacheKey}`);
|
|
1755
|
+
const result = await pendingRequests.get(cacheKey);
|
|
1756
|
+
return res.json(result);
|
|
1757
|
+
}
|
|
1758
|
+
// 创建新请求
|
|
1759
|
+
const requestPromise = (async () => {
|
|
1760
|
+
try {
|
|
1761
|
+
const client = createClient();
|
|
1762
|
+
if (!client) {
|
|
1763
|
+
return {
|
|
1764
|
+
success: false,
|
|
1765
|
+
error: 'API client not initialized, please check API Key configuration',
|
|
1766
|
+
};
|
|
1767
|
+
}
|
|
1768
|
+
const prompt = `Please provide usage documentation for the following third-party library API.
|
|
1769
|
+
|
|
1770
|
+
Symbol name: ${symbolName}
|
|
1771
|
+
${packageName ? `Package: ${packageName}` : ''}
|
|
1772
|
+
Programming language: ${language}
|
|
1773
|
+
|
|
1774
|
+
Code context:
|
|
1775
|
+
\`\`\`${language}
|
|
1776
|
+
${codeContext}
|
|
1777
|
+
\`\`\`
|
|
1778
|
+
|
|
1779
|
+
Please provide detailed usage instructions for this API, including:
|
|
1780
|
+
1. Brief description (one sentence explaining what this API does)
|
|
1781
|
+
2. Parameter descriptions (type, meaning, and whether optional for each parameter)
|
|
1782
|
+
3. Return value description (return type and meaning)
|
|
1783
|
+
4. Common usage examples (at least 2-3 practical examples)
|
|
1784
|
+
5. Common pitfalls/notes (issues to watch out for when using)
|
|
1785
|
+
6. Related APIs (related or alternative APIs)
|
|
1786
|
+
|
|
1787
|
+
Return in JSON format:
|
|
1788
|
+
{
|
|
1789
|
+
"name": "${symbolName}",
|
|
1790
|
+
"package": "${packageName || 'unknown'}",
|
|
1791
|
+
"brief": "brief description",
|
|
1792
|
+
"params": [
|
|
1793
|
+
{
|
|
1794
|
+
"name": "parameter name",
|
|
1795
|
+
"type": "type",
|
|
1796
|
+
"description": "description",
|
|
1797
|
+
"optional": false
|
|
1798
|
+
}
|
|
1799
|
+
],
|
|
1800
|
+
"returns": {
|
|
1801
|
+
"type": "return type",
|
|
1802
|
+
"description": "return value description"
|
|
1803
|
+
},
|
|
1804
|
+
"examples": [
|
|
1805
|
+
"example code 1",
|
|
1806
|
+
"example code 2"
|
|
1807
|
+
],
|
|
1808
|
+
"pitfalls": [
|
|
1809
|
+
"note 1",
|
|
1810
|
+
"note 2"
|
|
1811
|
+
],
|
|
1812
|
+
"seeAlso": [
|
|
1813
|
+
"relatedAPI1",
|
|
1814
|
+
"relatedAPI2"
|
|
1815
|
+
]
|
|
1816
|
+
}
|
|
1817
|
+
|
|
1818
|
+
If the API cannot be identified or is not a third-party library API, explain in the brief field.`;
|
|
1819
|
+
console.log(`[AI Editor] /api-doc calling Claude: ${symbolName}`);
|
|
1820
|
+
const response = await client.createMessage([{ role: 'user', content: [{ type: 'text', text: prompt }] }], undefined, undefined, { enableThinking: false });
|
|
1821
|
+
// 从 content blocks 中提取所有 text(跳过 thinking blocks)
|
|
1822
|
+
const rawText = response.content
|
|
1823
|
+
.filter((b) => b.type === 'text')
|
|
1824
|
+
.map((b) => b.text)
|
|
1825
|
+
.join('\n');
|
|
1826
|
+
console.log(`[AI Editor] /api-doc rawText (${rawText.length} chars):`, rawText.slice(0, 500));
|
|
1827
|
+
if (!rawText) {
|
|
1828
|
+
console.error('[AI Editor] /api-doc no text content, blocks:', response.content.map((b) => b.type));
|
|
1829
|
+
return {
|
|
1830
|
+
success: false,
|
|
1831
|
+
error: 'AI did not return valid documentation',
|
|
1832
|
+
};
|
|
1833
|
+
}
|
|
1834
|
+
// 解析 JSON
|
|
1835
|
+
const parsed = extractJSON(rawText);
|
|
1836
|
+
if (!parsed || !parsed.name) {
|
|
1837
|
+
console.error('[AI Editor] /api-doc failed to parse AI response JSON:', rawText);
|
|
1838
|
+
return {
|
|
1839
|
+
success: false,
|
|
1840
|
+
error: 'AI returned incorrect format',
|
|
1841
|
+
};
|
|
1842
|
+
}
|
|
1843
|
+
return {
|
|
1844
|
+
success: true,
|
|
1845
|
+
doc: {
|
|
1846
|
+
name: parsed.name,
|
|
1847
|
+
package: parsed.package || packageName || 'unknown',
|
|
1848
|
+
brief: parsed.brief || '',
|
|
1849
|
+
params: parsed.params || [],
|
|
1850
|
+
returns: parsed.returns,
|
|
1851
|
+
examples: parsed.examples || [],
|
|
1852
|
+
pitfalls: parsed.pitfalls || [],
|
|
1853
|
+
seeAlso: parsed.seeAlso || [],
|
|
1854
|
+
},
|
|
1855
|
+
};
|
|
1856
|
+
}
|
|
1857
|
+
catch (error) {
|
|
1858
|
+
console.error('[AI Editor] /api-doc AI call failed:', error);
|
|
1859
|
+
return {
|
|
1860
|
+
success: false,
|
|
1861
|
+
error: error.message || 'AI call failed',
|
|
1862
|
+
};
|
|
1863
|
+
}
|
|
1864
|
+
})();
|
|
1865
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
1866
|
+
try {
|
|
1867
|
+
const result = await requestPromise;
|
|
1868
|
+
// 只缓存成功的结果
|
|
1869
|
+
if (result.success) {
|
|
1870
|
+
apiDocCache.set(cacheKey, result);
|
|
1871
|
+
}
|
|
1872
|
+
res.json(result);
|
|
1873
|
+
}
|
|
1874
|
+
finally {
|
|
1875
|
+
pendingRequests.delete(cacheKey);
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
catch (error) {
|
|
1879
|
+
console.error('[AI Editor] /api-doc request processing failed:', error);
|
|
1880
|
+
res.status(500).json({
|
|
1881
|
+
success: false,
|
|
1882
|
+
error: error.message || 'Internal server error',
|
|
1883
|
+
});
|
|
1884
|
+
}
|
|
1885
|
+
});
|
|
1886
|
+
// ============================================================================
|
|
1887
|
+
// POST /complete-path - Import 路径补全
|
|
1888
|
+
// ============================================================================
|
|
1889
|
+
router.post('/complete-path', async (req, res) => {
|
|
1890
|
+
try {
|
|
1891
|
+
const { filePath, prefix, root } = req.body;
|
|
1892
|
+
if (!filePath) {
|
|
1893
|
+
return res.status(400).json({
|
|
1894
|
+
success: false,
|
|
1895
|
+
items: [],
|
|
1896
|
+
error: 'Missing required parameter filePath',
|
|
1897
|
+
});
|
|
1898
|
+
}
|
|
1899
|
+
// 解析基准目录
|
|
1900
|
+
const fileDir = path.dirname(filePath);
|
|
1901
|
+
let resolveBase;
|
|
1902
|
+
if (prefix.startsWith('.')) {
|
|
1903
|
+
// 相对路径:基于当前文件目录
|
|
1904
|
+
resolveBase = path.resolve(fileDir, prefix);
|
|
1905
|
+
}
|
|
1906
|
+
else if (root) {
|
|
1907
|
+
// 非相对路径:从项目根目录的 node_modules 查找
|
|
1908
|
+
resolveBase = path.resolve(root, 'node_modules', prefix);
|
|
1909
|
+
}
|
|
1910
|
+
else {
|
|
1911
|
+
return res.json({ success: true, items: [] });
|
|
1912
|
+
}
|
|
1913
|
+
// 判断 resolveBase 是文件夹还是需要列出其父目录的匹配项
|
|
1914
|
+
let dirToList;
|
|
1915
|
+
let filterPrefix = '';
|
|
1916
|
+
try {
|
|
1917
|
+
const stat = fs.statSync(resolveBase);
|
|
1918
|
+
if (stat.isDirectory()) {
|
|
1919
|
+
dirToList = resolveBase;
|
|
1920
|
+
}
|
|
1921
|
+
else {
|
|
1922
|
+
return res.json({ success: true, items: [] });
|
|
1923
|
+
}
|
|
1924
|
+
}
|
|
1925
|
+
catch {
|
|
1926
|
+
// resolveBase 不存在,列出其父目录并用最后一段做前缀过滤
|
|
1927
|
+
dirToList = path.dirname(resolveBase);
|
|
1928
|
+
filterPrefix = path.basename(resolveBase).toLowerCase();
|
|
1929
|
+
}
|
|
1930
|
+
// 读取目录
|
|
1931
|
+
let entries;
|
|
1932
|
+
try {
|
|
1933
|
+
entries = fs.readdirSync(dirToList, { withFileTypes: true });
|
|
1934
|
+
}
|
|
1935
|
+
catch {
|
|
1936
|
+
return res.json({ success: true, items: [] });
|
|
1937
|
+
}
|
|
1938
|
+
const items = [];
|
|
1939
|
+
for (const entry of entries) {
|
|
1940
|
+
// 跳过隐藏文件
|
|
1941
|
+
if (entry.name.startsWith('.'))
|
|
1942
|
+
continue;
|
|
1943
|
+
const nameLower = entry.name.toLowerCase();
|
|
1944
|
+
if (filterPrefix && !nameLower.startsWith(filterPrefix))
|
|
1945
|
+
continue;
|
|
1946
|
+
if (entry.isDirectory()) {
|
|
1947
|
+
items.push({
|
|
1948
|
+
label: entry.name,
|
|
1949
|
+
kind: 'folder',
|
|
1950
|
+
detail: 'Directory',
|
|
1951
|
+
});
|
|
1952
|
+
}
|
|
1953
|
+
else if (entry.isFile()) {
|
|
1954
|
+
// 只显示代码相关文件
|
|
1955
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
1956
|
+
const codeExts = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.json', '.css', '.scss', '.less', '.vue', '.svelte'];
|
|
1957
|
+
if (codeExts.includes(ext)) {
|
|
1958
|
+
// 显示时去掉 .ts/.tsx/.js/.jsx 扩展名
|
|
1959
|
+
const stripExts = ['.ts', '.tsx', '.js', '.jsx'];
|
|
1960
|
+
const label = stripExts.includes(ext) ? entry.name.replace(/\.(ts|tsx|js|jsx)$/, '') : entry.name;
|
|
1961
|
+
items.push({
|
|
1962
|
+
label,
|
|
1963
|
+
kind: 'file',
|
|
1964
|
+
detail: ext,
|
|
1965
|
+
});
|
|
1966
|
+
}
|
|
1967
|
+
}
|
|
1968
|
+
if (items.length >= 50)
|
|
1969
|
+
break;
|
|
1970
|
+
}
|
|
1971
|
+
// 文件夹排前面
|
|
1972
|
+
items.sort((a, b) => {
|
|
1973
|
+
if (a.kind !== b.kind)
|
|
1974
|
+
return a.kind === 'folder' ? -1 : 1;
|
|
1975
|
+
return a.label.localeCompare(b.label);
|
|
1976
|
+
});
|
|
1977
|
+
res.json({ success: true, items });
|
|
1978
|
+
}
|
|
1979
|
+
catch (error) {
|
|
1980
|
+
console.error('[AI Editor] /complete-path failed:', error);
|
|
1981
|
+
res.status(500).json({
|
|
1982
|
+
success: false,
|
|
1983
|
+
items: [],
|
|
1984
|
+
error: error.message || 'Internal server error',
|
|
1985
|
+
});
|
|
1986
|
+
}
|
|
1987
|
+
});
|
|
1988
|
+
// ============================================================================
|
|
1989
|
+
// POST /inline-complete - AI Inline 补全(Ghost Text)
|
|
1990
|
+
// ============================================================================
|
|
1991
|
+
router.post('/inline-complete', async (req, res) => {
|
|
1992
|
+
try {
|
|
1993
|
+
const { filePath, language, prefix, suffix, currentLine, cursorColumn } = req.body;
|
|
1994
|
+
if (!filePath || !prefix) {
|
|
1995
|
+
return res.status(400).json({
|
|
1996
|
+
success: false,
|
|
1997
|
+
error: 'Missing required parameters',
|
|
1998
|
+
});
|
|
1999
|
+
}
|
|
2000
|
+
// 缓存键:基于前缀最后 3 行 + 当前行前缀
|
|
2001
|
+
const lastLines = prefix.split('\n').slice(-3).join('\n');
|
|
2002
|
+
const cacheKey = crypto
|
|
2003
|
+
.createHash('md5')
|
|
2004
|
+
.update(`inline:${filePath}:${lastLines}`)
|
|
2005
|
+
.digest('hex');
|
|
2006
|
+
const cached = inlineCompleteCache.get(cacheKey);
|
|
2007
|
+
if (cached) {
|
|
2008
|
+
return res.json({ success: true, completion: cached.completion, fromCache: true });
|
|
2009
|
+
}
|
|
2010
|
+
// 检查重复请求
|
|
2011
|
+
if (pendingRequests.has(cacheKey)) {
|
|
2012
|
+
const result = await pendingRequests.get(cacheKey);
|
|
2013
|
+
return res.json(result);
|
|
2014
|
+
}
|
|
2015
|
+
const requestPromise = (async () => {
|
|
2016
|
+
try {
|
|
2017
|
+
const client = createClient();
|
|
2018
|
+
if (!client) {
|
|
2019
|
+
return { success: false, error: 'API client not initialized' };
|
|
2020
|
+
}
|
|
2021
|
+
// 截取上下文(避免 token 过多)
|
|
2022
|
+
const prefixLines = prefix.split('\n');
|
|
2023
|
+
const trimmedPrefix = prefixLines.slice(-30).join('\n');
|
|
2024
|
+
const suffixLines = suffix ? suffix.split('\n').slice(0, 10).join('\n') : '';
|
|
2025
|
+
const prompt = `You are a code completion engine. Predict the code the user will write next based on context.
|
|
2026
|
+
|
|
2027
|
+
File: ${path.basename(filePath)} (${language})
|
|
2028
|
+
|
|
2029
|
+
== Code before cursor ==
|
|
2030
|
+
${trimmedPrefix}
|
|
2031
|
+
== Cursor position (complete here) ==
|
|
2032
|
+
${suffixLines ? `== Code after cursor ==\n${suffixLines}` : ''}
|
|
2033
|
+
|
|
2034
|
+
Rules:
|
|
2035
|
+
- Only output the code snippet to complete, no explanations, no markdown
|
|
2036
|
+
- The completion should naturally continue from the code before the cursor
|
|
2037
|
+
- Typically complete 1-3 lines, do not make it too long
|
|
2038
|
+
- If the current line is partially written, complete the current line first
|
|
2039
|
+
- If unsure what to complete, return an empty string
|
|
2040
|
+
- Do not repeat existing code`;
|
|
2041
|
+
const response = await client.createMessage([{ role: 'user', content: [{ type: 'text', text: prompt }] }], undefined, undefined, { enableThinking: false });
|
|
2042
|
+
const rawText = response.content
|
|
2043
|
+
.filter((b) => b.type === 'text')
|
|
2044
|
+
.map((b) => b.text)
|
|
2045
|
+
.join('\n');
|
|
2046
|
+
// 清理:去除可能的 markdown 包裹
|
|
2047
|
+
let completion = rawText.trim();
|
|
2048
|
+
completion = completion.replace(/^```\w*\n?/, '').replace(/\n?```$/, '').trim();
|
|
2049
|
+
if (!completion) {
|
|
2050
|
+
return { success: true, completion: '' };
|
|
2051
|
+
}
|
|
2052
|
+
const result = { success: true, completion };
|
|
2053
|
+
inlineCompleteCache.set(cacheKey, { completion });
|
|
2054
|
+
return result;
|
|
2055
|
+
}
|
|
2056
|
+
catch (error) {
|
|
2057
|
+
console.error('[AI Editor] /inline-complete AI call failed:', error);
|
|
2058
|
+
return { success: false, error: error.message || 'AI call failed' };
|
|
2059
|
+
}
|
|
2060
|
+
})();
|
|
2061
|
+
pendingRequests.set(cacheKey, requestPromise);
|
|
2062
|
+
try {
|
|
2063
|
+
const result = await requestPromise;
|
|
2064
|
+
res.json(result);
|
|
2065
|
+
}
|
|
2066
|
+
finally {
|
|
2067
|
+
pendingRequests.delete(cacheKey);
|
|
2068
|
+
}
|
|
2069
|
+
}
|
|
2070
|
+
catch (error) {
|
|
2071
|
+
console.error('[AI Editor] /inline-complete request processing failed:', error);
|
|
2072
|
+
res.status(500).json({
|
|
2073
|
+
success: false,
|
|
2074
|
+
error: error.message || 'Internal server error',
|
|
2075
|
+
});
|
|
2076
|
+
}
|
|
2077
|
+
});
|
|
2078
|
+
export default router;
|
|
2079
|
+
//# sourceMappingURL=ai-editor.js.map
|