aws-runtime-bridge 1.9.78 → 1.9.80
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/dist/adapter/AcodeSdkAdapter.d.ts +0 -1
- package/dist/adapter/AcodeSdkAdapter.js +11 -1986
- package/dist/adapter/AdapterRegistry.d.ts +0 -1
- package/dist/adapter/AdapterRegistry.js +2 -100
- package/dist/adapter/ClaudeSdkAdapter.d.ts +0 -1
- package/dist/adapter/ClaudeSdkAdapter.js +4 -1300
- package/dist/adapter/CodexSdkAdapter.d.ts +0 -1
- package/dist/adapter/CodexSdkAdapter.js +4 -836
- package/dist/adapter/OpencodeSdkAdapter.d.ts +0 -1
- package/dist/adapter/OpencodeSdkAdapter.js +4 -879
- package/dist/adapter/SdkProviderSpi.d.ts +0 -1
- package/dist/adapter/SdkProviderSpi.js +2 -55
- package/dist/adapter/acode-tool-names.d.ts +0 -1
- package/dist/adapter/acode-tool-names.js +2 -37
- package/dist/adapter/idle-poll-loop.d.ts +0 -1
- package/dist/adapter/idle-poll-loop.js +2 -59
- package/dist/adapter/index.d.ts +0 -1
- package/dist/adapter/index.js +2 -11
- package/dist/adapter/instance-ai-config-resolver.d.ts +0 -1
- package/dist/adapter/instance-ai-config-resolver.js +2 -46
- package/dist/adapter/types.d.ts +0 -1
- package/dist/adapter/types.js +2 -443
- package/dist/adapters/cc-switch/common.d.ts +0 -1
- package/dist/adapters/cc-switch/common.js +2 -61
- package/dist/adapters/cc-switch/index.d.ts +0 -1
- package/dist/adapters/cc-switch/index.js +2 -57
- package/dist/adapters/cc-switch/mcp-acode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-acode.js +2 -71
- package/dist/adapters/cc-switch/mcp-claude.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-claude.js +2 -89
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.js +2 -77
- package/dist/adapters/cc-switch/mcp-codex.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-codex.js +11 -249
- package/dist/adapters/cc-switch/mcp-opencode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.js +2 -97
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-placeholder.js +2 -19
- package/dist/adapters/cc-switch/skill-acode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-acode.js +2 -12
- package/dist/adapters/cc-switch/skill-claude.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-claude.js +2 -11
- package/dist/adapters/cc-switch/skill-claudecode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-claudecode.js +2 -11
- package/dist/adapters/cc-switch/skill-codex.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-codex.js +2 -6
- package/dist/adapters/cc-switch/skill-directory.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-directory.js +3 -137
- package/dist/adapters/cc-switch/skill-opencode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-opencode.js +2 -11
- package/dist/adapters/cc-switch/skill-placeholder.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-placeholder.js +2 -19
- package/dist/config.d.ts +0 -1
- package/dist/config.js +2 -290
- package/dist/index.d.ts +0 -1
- package/dist/index.js +2 -573
- package/dist/middleware/auth.d.ts +0 -1
- package/dist/middleware/auth.js +2 -98
- package/dist/routes/acode-todos.d.ts +0 -1
- package/dist/routes/acode-todos.js +2 -75
- package/dist/routes/ai-sources.d.ts +0 -1
- package/dist/routes/ai-sources.js +2 -132
- package/dist/routes/dashboard.d.ts +0 -1
- package/dist/routes/dashboard.js +182 -649
- package/dist/routes/events.d.ts +0 -1
- package/dist/routes/events.js +2 -22
- package/dist/routes/file-browser.d.ts +0 -1
- package/dist/routes/file-browser.js +2 -781
- package/dist/routes/file-diff-rollback.d.ts +0 -1
- package/dist/routes/file-diff-rollback.js +2 -301
- package/dist/routes/file-snapshot.d.ts +0 -1
- package/dist/routes/file-snapshot.js +2 -156
- package/dist/routes/git.d.ts +0 -1
- package/dist/routes/git.js +28 -1900
- package/dist/routes/instance.d.ts +0 -1
- package/dist/routes/instance.js +3 -748
- package/dist/routes/mcp.d.ts +0 -1
- package/dist/routes/mcp.js +2 -196
- package/dist/routes/processes.d.ts +0 -1
- package/dist/routes/processes.js +2 -252
- package/dist/routes/properties.d.ts +0 -1
- package/dist/routes/properties.js +2 -72
- package/dist/routes/pty.d.ts +0 -1
- package/dist/routes/pty.js +6 -560
- package/dist/routes/runtime-binding.d.ts +0 -1
- package/dist/routes/runtime-binding.js +2 -263
- package/dist/routes/sessions.d.ts +0 -1
- package/dist/routes/sessions.js +2 -758
- package/dist/routes/skills.d.ts +0 -1
- package/dist/routes/skills.js +2 -187
- package/dist/routes/sub-agents.d.ts +0 -1
- package/dist/routes/sub-agents.js +20 -279
- package/dist/routes/system-metrics.d.ts +0 -1
- package/dist/routes/system-metrics.js +2 -20
- package/dist/routes/task-context.d.ts +0 -1
- package/dist/routes/task-context.js +2 -78
- package/dist/routes/terminal.d.ts +0 -1
- package/dist/routes/terminal.js +54 -2882
- package/dist/routes/yml.d.ts +0 -1
- package/dist/routes/yml.js +2 -223
- package/dist/services/acode-package.d.ts +0 -1
- package/dist/services/acode-package.js +2 -111
- package/dist/services/agent-event-store.d.ts +0 -1
- package/dist/services/agent-event-store.js +2 -81
- package/dist/services/agent-process-manager.d.ts +0 -1
- package/dist/services/agent-process-manager.js +2 -796
- package/dist/services/ai-source-apply.d.ts +0 -1
- package/dist/services/ai-source-apply.js +2 -83
- package/dist/services/auto-register.d.ts +0 -1
- package/dist/services/auto-register.js +2 -1053
- package/dist/services/aws-client-agent-mcp.d.ts +0 -1
- package/dist/services/aws-client-agent-mcp.js +3 -337
- package/dist/services/bridge-package-publish-hooks.d.ts +0 -1
- package/dist/services/bridge-package-publish-hooks.js +2 -115
- package/dist/services/cc-switch-sdk.d.ts +0 -1
- package/dist/services/cc-switch-sdk.js +2 -135
- package/dist/services/cli-commands.d.ts +6 -1
- package/dist/services/cli-commands.js +6 -645
- package/dist/services/event-delta-pusher.d.ts +0 -1
- package/dist/services/event-delta-pusher.js +2 -95
- package/dist/services/fileSnapshotStore.d.ts +0 -1
- package/dist/services/fileSnapshotStore.js +2 -500
- package/dist/services/instance-ai-config-service.d.ts +0 -1
- package/dist/services/instance-ai-config-service.js +2 -174
- package/dist/services/instance-init-service.d.ts +0 -1
- package/dist/services/instance-init-service.js +2 -193
- package/dist/services/instance-service.d.ts +0 -1
- package/dist/services/instance-service.js +2 -237
- package/dist/services/instance-state.d.ts +0 -1
- package/dist/services/instance-state.js +2 -94
- package/dist/services/legacy-path-migration.d.ts +0 -1
- package/dist/services/legacy-path-migration.js +2 -66
- package/dist/services/lifecycle-state.d.ts +0 -1
- package/dist/services/lifecycle-state.js +3 -110
- package/dist/services/mcp-launch-binding-queue.d.ts +0 -1
- package/dist/services/mcp-launch-binding-queue.js +2 -175
- package/dist/services/orphan-monitor.d.ts +0 -1
- package/dist/services/orphan-monitor.js +2 -382
- package/dist/services/panel-auth.d.ts +0 -1
- package/dist/services/panel-auth.js +2 -168
- package/dist/services/process-detector.d.ts +0 -1
- package/dist/services/process-detector.js +18 -1019
- package/dist/services/process-registry.d.ts +0 -1
- package/dist/services/process-registry.js +2 -375
- package/dist/services/ring-buffer.d.ts +0 -1
- package/dist/services/ring-buffer.js +2 -103
- package/dist/services/runtime-binding.d.ts +0 -1
- package/dist/services/runtime-binding.js +6 -363
- package/dist/services/runtime-lifecycle-policy.d.ts +0 -1
- package/dist/services/runtime-lifecycle-policy.js +2 -35
- package/dist/services/session-output.d.ts +0 -1
- package/dist/services/session-output.js +5 -539
- package/dist/services/startup-config-wizard.d.ts +0 -1
- package/dist/services/startup-config-wizard.js +14 -258
- package/dist/services/sub-agent-manager-instance.d.ts +0 -1
- package/dist/services/sub-agent-manager-instance.js +2 -12
- package/dist/services/system-metrics.d.ts +0 -1
- package/dist/services/system-metrics.js +2 -252
- package/dist/services/terminal-persistence.d.ts +0 -1
- package/dist/services/terminal-persistence.js +2 -176
- package/dist/services/tool-installer.d.ts +0 -1
- package/dist/services/tool-installer.js +5 -751
- package/dist/services/tunnel-client.d.ts +0 -1
- package/dist/services/tunnel-client.js +2 -402
- package/dist/services/windows-service-manager.d.ts +3 -2
- package/dist/services/windows-service-manager.js +2 -54
- package/dist/services/workspace-files.d.ts +0 -1
- package/dist/services/workspace-files.js +2 -1275
- package/dist/services/workspace-watch.d.ts +0 -1
- package/dist/services/workspace-watch.js +2 -123
- package/dist/services/workspaceTaskChangeWatcher.d.ts +0 -1
- package/dist/services/workspaceTaskChangeWatcher.js +2 -483
- package/dist/types.d.ts +0 -1
- package/dist/types.js +1 -1
- package/dist/utils/file-utils.d.ts +0 -1
- package/dist/utils/file-utils.js +3 -208
- package/dist/utils/instance-ai-config-debug-logger.d.ts +0 -1
- package/dist/utils/instance-ai-config-debug-logger.js +4 -63
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.js +2 -154
- package/dist/utils/mcp-utils.d.ts +0 -1
- package/dist/utils/mcp-utils.js +2 -187
- package/dist/utils/path-utils.d.ts +0 -1
- package/dist/utils/path-utils.js +2 -44
- package/dist/utils/sdk-package-loader.d.ts +0 -1
- package/dist/utils/sdk-package-loader.js +2 -78
- package/dist/utils/validation.d.ts +0 -1
- package/dist/utils/validation.js +2 -53
- package/dist/utils/yaml-utils.d.ts +0 -1
- package/dist/utils/yaml-utils.js +2 -312
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/constants.js +2 -63
- package/node_modules/@cc-switch/sdk/dist/errors.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/errors.js +2 -8
- package/node_modules/@cc-switch/sdk/dist/index.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/index.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/schemas.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/schemas.js +2 -38
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.js +2 -470
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +4 -307
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +2 -37
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +2 -41
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/state.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/state.js +2 -19
- package/node_modules/@cc-switch/sdk/dist/types.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/types.js +1 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.js +3 -114
- package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/id.js +2 -12
- package/node_modules/@cc-switch/sdk/package.json +1 -1
- package/package/acode/dist/ask-user-question-tool.d.ts +0 -1
- package/package/acode/dist/ask-user-question-tool.js +4 -233
- package/package/acode/dist/built-in-file-tools.d.ts +0 -1
- package/package/acode/dist/built-in-file-tools.js +4 -966
- package/package/acode/dist/built-in-symbols-tool.d.ts +0 -1
- package/package/acode/dist/built-in-symbols-tool.js +2 -117
- package/package/acode/dist/builtins/commandArtifacts.d.ts +0 -1
- package/package/acode/dist/builtins/commandArtifacts.js +9 -97
- package/package/acode/dist/builtins/commandOutputEvents.d.ts +0 -1
- package/package/acode/dist/builtins/commandOutputEvents.js +2 -56
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandPreparation.js +5 -44
- package/package/acode/dist/builtins/shellCommandResult.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandResult.js +2 -71
- package/package/acode/dist/builtins/shellCommandRunner.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandRunner.js +2 -115
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts +0 -1
- package/package/acode/dist/builtins/shellOutputDecoder.js +2 -94
- package/package/acode/dist/cli.d.ts +0 -1
- package/package/acode/dist/cli.js +4 -38
- package/package/acode/dist/commands/commandLoader.d.ts +0 -1
- package/package/acode/dist/commands/commandLoader.js +2 -33
- package/package/acode/dist/commands/commandParser.d.ts +0 -1
- package/package/acode/dist/commands/commandParser.js +3 -77
- package/package/acode/dist/commands/commandRegistry.d.ts +0 -1
- package/package/acode/dist/commands/commandRegistry.js +2 -30
- package/package/acode/dist/compaction.d.ts +0 -1
- package/package/acode/dist/compaction.js +7 -919
- package/package/acode/dist/config.d.ts +0 -1
- package/package/acode/dist/config.js +5 -105
- package/package/acode/dist/fs-utils.d.ts +0 -1
- package/package/acode/dist/fs-utils.js +2 -79
- package/package/acode/dist/hooks/hookBus.d.ts +0 -1
- package/package/acode/dist/hooks/hookBus.js +2 -40
- package/package/acode/dist/index.d.ts +0 -1
- package/package/acode/dist/index.js +2 -19
- package/package/acode/dist/mcpToolNames.d.ts +0 -1
- package/package/acode/dist/mcpToolNames.js +2 -17
- package/package/acode/dist/parsers/ast-cache.d.ts +0 -1
- package/package/acode/dist/parsers/ast-cache.js +2 -76
- package/package/acode/dist/parsers/language-detector.d.ts +0 -1
- package/package/acode/dist/parsers/language-detector.js +2 -44
- package/package/acode/dist/parsers/language-queries.d.ts +0 -1
- package/package/acode/dist/parsers/language-queries.js +12 -602
- package/package/acode/dist/parsers/symbol-extractor.d.ts +0 -1
- package/package/acode/dist/parsers/symbol-extractor.js +3 -164
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts +0 -1
- package/package/acode/dist/parsers/tree-sitter-loader.js +2 -64
- package/package/acode/dist/parsers/types.d.ts +0 -1
- package/package/acode/dist/parsers/types.js +1 -7
- package/package/acode/dist/runtime.d.ts +0 -1
- package/package/acode/dist/runtime.js +86 -3771
- package/package/acode/dist/skill-tool.d.ts +0 -1
- package/package/acode/dist/skill-tool.js +5 -174
- package/package/acode/dist/sub-agent-manager.d.ts +0 -1
- package/package/acode/dist/sub-agent-manager.js +2 -1159
- package/package/acode/dist/sub-agent-store.d.ts +0 -1
- package/package/acode/dist/sub-agent-store.js +4 -236
- package/package/acode/dist/sub-agent-tools.d.ts +0 -1
- package/package/acode/dist/sub-agent-tools.js +15 -369
- package/package/acode/dist/sub-agent-types.d.ts +0 -1
- package/package/acode/dist/sub-agent-types.js +1 -8
- package/package/acode/dist/todo-store.d.ts +0 -1
- package/package/acode/dist/todo-store.js +2 -73
- package/package/acode/dist/todo-tool.d.ts +0 -1
- package/package/acode/dist/todo-tool.js +5 -121
- package/package/acode/dist/types.d.ts +0 -1
- package/package/acode/dist/types.js +1 -1
- package/package/acode/package.json +2 -2
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +2 -890
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/config.js +2 -243
- package/package/aws-client-agent-mcp/dist/config.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/constants.js +2 -24
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js +2 -477
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +2 -446
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/index.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/index.js +2 -34
- package/package/aws-client-agent-mcp/dist/logger.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/logger.js +3 -178
- package/package/aws-client-agent-mcp/dist/logger.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +38 -2709
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +22 -562
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +4 -826
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -294
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js +2 -288
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.js +2 -125
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +2 -103
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +2 -96
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -327
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/types.js +2 -9
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +2 -677
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js +0 -1
- package/package/aws-client-agent-mcp/package.json +1 -1
- package/package/cc-switch-sdk/dist/constants.d.ts +0 -1
- package/package/cc-switch-sdk/dist/constants.js +2 -63
- package/package/cc-switch-sdk/dist/errors.d.ts +0 -1
- package/package/cc-switch-sdk/dist/errors.js +2 -8
- package/package/cc-switch-sdk/dist/index.d.ts +0 -1
- package/package/cc-switch-sdk/dist/index.js +2 -9
- package/package/cc-switch-sdk/dist/schemas.d.ts +0 -1
- package/package/cc-switch-sdk/dist/schemas.js +2 -38
- package/package/cc-switch-sdk/dist/sdk.d.ts +0 -1
- package/package/cc-switch-sdk/dist/sdk.js +2 -470
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.js +4 -307
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-model.js +2 -37
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-service.js +2 -9
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/skill-model.js +2 -41
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/skill-service.js +2 -9
- package/package/cc-switch-sdk/dist/state.d.ts +0 -1
- package/package/cc-switch-sdk/dist/state.js +2 -19
- package/package/cc-switch-sdk/dist/types.d.ts +0 -1
- package/package/cc-switch-sdk/dist/types.js +1 -1
- package/package/cc-switch-sdk/dist/utils/fs.d.ts +0 -1
- package/package/cc-switch-sdk/dist/utils/fs.js +3 -114
- package/package/cc-switch-sdk/dist/utils/id.d.ts +0 -1
- package/package/cc-switch-sdk/dist/utils/id.js +2 -12
- package/package/cc-switch-sdk/package.json +1 -1
- package/package.json +4 -2
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/AdapterRegistry.d.ts.map +0 -1
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/CodexSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/SdkProviderSpi.d.ts.map +0 -1
- package/dist/adapter/acode-tool-names.d.ts.map +0 -1
- package/dist/adapter/idle-poll-loop.d.ts.map +0 -1
- package/dist/adapter/index.d.ts.map +0 -1
- package/dist/adapter/instance-ai-config-resolver.d.ts.map +0 -1
- package/dist/adapter/types.d.ts.map +0 -1
- package/dist/adapters/cc-switch/common.d.ts.map +0 -1
- package/dist/adapters/cc-switch/index.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-acode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claude.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-codex.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-acode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-claude.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-codex.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-directory.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-opencode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/routes/acode-todos.d.ts.map +0 -1
- package/dist/routes/ai-sources.d.ts.map +0 -1
- package/dist/routes/dashboard.d.ts.map +0 -1
- package/dist/routes/events.d.ts.map +0 -1
- package/dist/routes/file-browser.d.ts.map +0 -1
- package/dist/routes/file-diff-rollback.d.ts.map +0 -1
- package/dist/routes/file-snapshot.d.ts.map +0 -1
- package/dist/routes/git.d.ts.map +0 -1
- package/dist/routes/instance.d.ts.map +0 -1
- package/dist/routes/mcp.d.ts.map +0 -1
- package/dist/routes/processes.d.ts.map +0 -1
- package/dist/routes/properties.d.ts.map +0 -1
- package/dist/routes/pty.d.ts.map +0 -1
- package/dist/routes/runtime-binding.d.ts.map +0 -1
- package/dist/routes/sessions.d.ts.map +0 -1
- package/dist/routes/skills.d.ts.map +0 -1
- package/dist/routes/sub-agents.d.ts.map +0 -1
- package/dist/routes/system-metrics.d.ts.map +0 -1
- package/dist/routes/task-context.d.ts.map +0 -1
- package/dist/routes/terminal.d.ts.map +0 -1
- package/dist/routes/yml.d.ts.map +0 -1
- package/dist/services/acode-package.d.ts.map +0 -1
- package/dist/services/agent-event-store.d.ts.map +0 -1
- package/dist/services/agent-process-manager.d.ts.map +0 -1
- package/dist/services/ai-source-apply.d.ts.map +0 -1
- package/dist/services/auto-register.d.ts.map +0 -1
- package/dist/services/aws-client-agent-mcp.d.ts.map +0 -1
- package/dist/services/bridge-package-publish-hooks.d.ts.map +0 -1
- package/dist/services/cc-switch-sdk.d.ts.map +0 -1
- package/dist/services/cli-commands.d.ts.map +0 -1
- package/dist/services/event-delta-pusher.d.ts.map +0 -1
- package/dist/services/fileSnapshotStore.d.ts.map +0 -1
- package/dist/services/instance-ai-config-service.d.ts.map +0 -1
- package/dist/services/instance-init-service.d.ts.map +0 -1
- package/dist/services/instance-service.d.ts.map +0 -1
- package/dist/services/instance-state.d.ts.map +0 -1
- package/dist/services/legacy-path-migration.d.ts.map +0 -1
- package/dist/services/lifecycle-state.d.ts.map +0 -1
- package/dist/services/mcp-launch-binding-queue.d.ts.map +0 -1
- package/dist/services/orphan-monitor.d.ts.map +0 -1
- package/dist/services/panel-auth.d.ts.map +0 -1
- package/dist/services/process-detector.d.ts.map +0 -1
- package/dist/services/process-registry.d.ts.map +0 -1
- package/dist/services/ring-buffer.d.ts.map +0 -1
- package/dist/services/runtime-binding.d.ts.map +0 -1
- package/dist/services/runtime-lifecycle-policy.d.ts.map +0 -1
- package/dist/services/session-output.d.ts.map +0 -1
- package/dist/services/startup-config-wizard.d.ts.map +0 -1
- package/dist/services/sub-agent-manager-instance.d.ts.map +0 -1
- package/dist/services/system-metrics.d.ts.map +0 -1
- package/dist/services/terminal-persistence.d.ts.map +0 -1
- package/dist/services/tool-installer.d.ts.map +0 -1
- package/dist/services/tunnel-client.d.ts.map +0 -1
- package/dist/services/windows-service-manager.d.ts.map +0 -1
- package/dist/services/workspace-files.d.ts.map +0 -1
- package/dist/services/workspace-watch.d.ts.map +0 -1
- package/dist/services/workspaceTaskChangeWatcher.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/file-utils.d.ts.map +0 -1
- package/dist/utils/instance-ai-config-debug-logger.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/mcp-utils.d.ts.map +0 -1
- package/dist/utils/path-utils.d.ts.map +0 -1
- package/dist/utils/sdk-package-loader.d.ts.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/yaml-utils.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/errors.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/index.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/state.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts.map +0 -1
- package/package/acode/dist/ask-user-question-tool.d.ts.map +0 -1
- package/package/acode/dist/built-in-file-tools.d.ts.map +0 -1
- package/package/acode/dist/built-in-symbols-tool.d.ts.map +0 -1
- package/package/acode/dist/builtins/commandArtifacts.d.ts.map +0 -1
- package/package/acode/dist/builtins/commandOutputEvents.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandResult.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +0 -1
- package/package/acode/dist/cli.d.ts.map +0 -1
- package/package/acode/dist/commands/commandLoader.d.ts.map +0 -1
- package/package/acode/dist/commands/commandParser.d.ts.map +0 -1
- package/package/acode/dist/commands/commandRegistry.d.ts.map +0 -1
- package/package/acode/dist/compaction.d.ts.map +0 -1
- package/package/acode/dist/config.d.ts.map +0 -1
- package/package/acode/dist/fs-utils.d.ts.map +0 -1
- package/package/acode/dist/hooks/hookBus.d.ts.map +0 -1
- package/package/acode/dist/index.d.ts.map +0 -1
- package/package/acode/dist/mcpToolNames.d.ts.map +0 -1
- package/package/acode/dist/parsers/ast-cache.d.ts.map +0 -1
- package/package/acode/dist/parsers/language-detector.d.ts.map +0 -1
- package/package/acode/dist/parsers/language-queries.d.ts.map +0 -1
- package/package/acode/dist/parsers/symbol-extractor.d.ts.map +0 -1
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts.map +0 -1
- package/package/acode/dist/parsers/types.d.ts.map +0 -1
- package/package/acode/dist/runtime.d.ts.map +0 -1
- package/package/acode/dist/skill-tool.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-manager.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-store.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-tools.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-types.d.ts.map +0 -1
- package/package/acode/dist/todo-store.d.ts.map +0 -1
- package/package/acode/dist/todo-tool.d.ts.map +0 -1
- package/package/acode/dist/types.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/constants.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/index.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/index.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +0 -1
- package/package/cc-switch-sdk/dist/constants.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/errors.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/index.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/schemas.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/sdk.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/state.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/types.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/utils/id.d.ts.map +0 -1
|
@@ -1,301 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* 根据变更记录的反向操作执行文件回滚。
|
|
5
|
-
* 与全量快照还原不同的是,只还原被修改过的文件。
|
|
6
|
-
*
|
|
7
|
-
* 核心流程(两步走):
|
|
8
|
-
* 1. 内存预检:在内存中按修改时间逆序模拟所有反向操作,验证完整性。不触碰文件系统。
|
|
9
|
-
* - CREATE:检查文件是否存在,准备删除
|
|
10
|
-
* - UPDATE:读取 diff patch,读取当前文件内容,在内存中应用反向 patch 验证是否成功
|
|
11
|
-
* - DELETE:读取删除前的完整内容,准备重建
|
|
12
|
-
* 2. 原子执行:预检全部通过后,批量写入文件系统;任一预检失败则返回 previewFailed=true,
|
|
13
|
-
* 由调用方(前端)弹出"跳过不通过项 / 文件全量覆盖"二选一对话框。
|
|
14
|
-
* skipFailed=true 时仅执行通过项(partial);否则不写盘。
|
|
15
|
-
*
|
|
16
|
-
* 反向操作映射:
|
|
17
|
-
* CREATE → DELETE(删除创建的文件)
|
|
18
|
-
* UPDATE → 应用反向 diff patch(精确撤销修改的部分,保留用户后续改动);
|
|
19
|
-
* 若补丁无法精确应用(上下文不匹配=冲突),报为预检失败,不静默整文件覆盖
|
|
20
|
-
* DELETE → 重新创建被删除的文件(根据 cacheKey 从 bridge 本地缓存读取)
|
|
21
|
-
*/
|
|
22
|
-
import { promises as fs } from 'node:fs';
|
|
23
|
-
import path from 'node:path';
|
|
24
|
-
import { Router } from 'express';
|
|
25
|
-
import * as Diff from 'diff';
|
|
26
|
-
import { createLogger } from '../utils/logger.js';
|
|
27
|
-
import { validateToken } from '../middleware/auth.js';
|
|
28
|
-
import { readBeforeContentFromCache, readDiffFromCache } from '../services/workspaceTaskChangeWatcher.js';
|
|
29
|
-
const log = createLogger('file-diff-rollback');
|
|
30
|
-
export const fileDiffRollbackRouter = Router();
|
|
31
|
-
/**
|
|
32
|
-
* 内存预检:在内存中按时间逆序模拟所有反向操作,生成执行计划。
|
|
33
|
-
* 不实际触碰文件系统。
|
|
34
|
-
*
|
|
35
|
-
* 关键:使用内存文件状态跟踪(fileContentMap),每条回滚操作基于前一条执行后的内容,
|
|
36
|
-
* 确保同一文件多次 UPDATE 时链式回滚正确(D→C→B→A)。
|
|
37
|
-
*/
|
|
38
|
-
async function previewRollback(workspacePath, operations) {
|
|
39
|
-
const errors = [];
|
|
40
|
-
const plan = [];
|
|
41
|
-
const details = [];
|
|
42
|
-
const normalizedWorkspace = path.resolve(String(workspacePath).trim());
|
|
43
|
-
// 按 createdAt 逆序排列(最新的变更最先回滚)
|
|
44
|
-
const sortedOps = [...operations].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
45
|
-
// 内存中的文件内容跟踪:key = relativePath,value = 当前内容(null = 文件不存在)
|
|
46
|
-
// 首次访问某文件时从磁盘读取,后续操作基于内存中的最新状态
|
|
47
|
-
const fileContentMap = new Map();
|
|
48
|
-
const fileExistedMap = new Map();
|
|
49
|
-
for (const op of sortedOps) {
|
|
50
|
-
const fullPath = path.join(normalizedWorkspace, op.relativePath);
|
|
51
|
-
const relativePath = op.relativePath.replace(/\\/g, '/');
|
|
52
|
-
// 安全检查:路径不能跳出工作区
|
|
53
|
-
const resolvedPath = path.resolve(fullPath);
|
|
54
|
-
if (!resolvedPath.startsWith(normalizedWorkspace)) {
|
|
55
|
-
const reason = `Path escape detected: ${relativePath}`;
|
|
56
|
-
errors.push(reason);
|
|
57
|
-
details.push({ relativePath, originalOperation: op.originalOperation, status: 'preview_failed', reason });
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
// 获取当前内存中的文件状态(首次从磁盘读取)
|
|
61
|
-
if (!fileContentMap.has(relativePath)) {
|
|
62
|
-
let diskContent = null;
|
|
63
|
-
let diskExists = false;
|
|
64
|
-
try {
|
|
65
|
-
diskContent = await fs.readFile(fullPath, 'utf-8');
|
|
66
|
-
diskExists = true;
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
diskExists = false;
|
|
70
|
-
}
|
|
71
|
-
fileContentMap.set(relativePath, diskContent);
|
|
72
|
-
fileExistedMap.set(relativePath, diskExists);
|
|
73
|
-
}
|
|
74
|
-
switch (op.originalOperation) {
|
|
75
|
-
case 'CREATE': {
|
|
76
|
-
// 逆操作:删除文件
|
|
77
|
-
plan.push({ type: 'DELETE', fullPath, relativePath, originalOperation: 'CREATE' });
|
|
78
|
-
details.push({ relativePath, originalOperation: 'CREATE', status: 'preview_passed', action: '删除文件' });
|
|
79
|
-
// 更新内存状态:文件已删除
|
|
80
|
-
fileContentMap.set(relativePath, null);
|
|
81
|
-
fileExistedMap.set(relativePath, false);
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
case 'UPDATE': {
|
|
85
|
-
if (!op.cacheKey) {
|
|
86
|
-
const reason = `缺少 cacheKey,无法读取 diff 补丁`;
|
|
87
|
-
errors.push(`UPDATE rollback failed: ${reason} for ${relativePath}`);
|
|
88
|
-
details.push({ relativePath, originalOperation: 'UPDATE', status: 'preview_failed', reason });
|
|
89
|
-
break;
|
|
90
|
-
}
|
|
91
|
-
const currentContent = fileContentMap.get(relativePath) ?? null;
|
|
92
|
-
if (currentContent === null) {
|
|
93
|
-
const reason = `文件当前不存在,无法应用反向 diff 补丁`;
|
|
94
|
-
errors.push(`UPDATE rollback failed: ${reason} for ${relativePath}`);
|
|
95
|
-
details.push({ relativePath, originalOperation: 'UPDATE', status: 'preview_failed', reason });
|
|
96
|
-
break;
|
|
97
|
-
}
|
|
98
|
-
// 尝试用 diff patch 精确回滚。
|
|
99
|
-
// 关键设计:applyPatch 失败时不再静默回退到 beforeContent(那会丢弃用户/其他任务
|
|
100
|
-
// 对该文件的所有改动),而是报为 preview_failed,让前端弹出
|
|
101
|
-
// "跳过不通过项 / 文件全量覆盖" 二选一对话框。
|
|
102
|
-
const patch = await readDiffFromCache(normalizedWorkspace, op.cacheKey);
|
|
103
|
-
if (patch === null) {
|
|
104
|
-
const reason = `本地缓存中找不到 diff 补丁 (cacheKey=${op.cacheKey}),无法精确回滚`;
|
|
105
|
-
errors.push(`UPDATE rollback failed: ${reason} for ${relativePath}`);
|
|
106
|
-
details.push({ relativePath, originalOperation: 'UPDATE', status: 'preview_failed', reason });
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
let rollbackContent = null;
|
|
110
|
-
try {
|
|
111
|
-
const parsed = Diff.parsePatch(patch);
|
|
112
|
-
const reversed = Diff.reversePatch(parsed);
|
|
113
|
-
const result = Diff.applyPatch(currentContent, reversed);
|
|
114
|
-
if (result !== false) {
|
|
115
|
-
rollbackContent = result;
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
// 反向 diff 补丁无法精确应用(上下文不匹配),
|
|
119
|
-
// 说明文件已被其他任务或用户修改了 AI 改动的同一区域,存在冲突。
|
|
120
|
-
const reason = `反向 diff 补丁无法精确应用:文件当前内容与 AI 变更后的预期上下文不匹配,可能已被其他任务或用户修改了相同区域,存在冲突`;
|
|
121
|
-
errors.push(`UPDATE rollback failed: ${reason} for ${relativePath}`);
|
|
122
|
-
details.push({ relativePath, originalOperation: 'UPDATE', status: 'preview_failed', reason });
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
catch (err) {
|
|
127
|
-
const reason = `反向 diff 补丁应用异常: ${err.message}`;
|
|
128
|
-
errors.push(`UPDATE rollback failed: ${reason} for ${relativePath}`);
|
|
129
|
-
details.push({ relativePath, originalOperation: 'UPDATE', status: 'preview_failed', reason });
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
plan.push({ type: 'WRITE', fullPath, relativePath, originalOperation: 'UPDATE', content: rollbackContent });
|
|
133
|
-
details.push({ relativePath, originalOperation: 'UPDATE', status: 'preview_passed', action: '应用反向 diff 补丁' });
|
|
134
|
-
// 更新内存状态:文件内容已回滚
|
|
135
|
-
fileContentMap.set(relativePath, rollbackContent);
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
case 'DELETE': {
|
|
139
|
-
if (!op.cacheKey) {
|
|
140
|
-
const reason = `缺少 cacheKey,无法读取删除前的文件内容`;
|
|
141
|
-
errors.push(`DELETE rollback failed: ${reason} for ${relativePath}`);
|
|
142
|
-
details.push({ relativePath, originalOperation: 'DELETE', status: 'preview_failed', reason });
|
|
143
|
-
break;
|
|
144
|
-
}
|
|
145
|
-
const content = await readBeforeContentFromCache(normalizedWorkspace, op.cacheKey);
|
|
146
|
-
if (content === null) {
|
|
147
|
-
const reason = `本地缓存中找不到删除前的文件内容 (cacheKey=${op.cacheKey})`;
|
|
148
|
-
errors.push(`DELETE rollback failed: ${reason} for ${relativePath}`);
|
|
149
|
-
details.push({ relativePath, originalOperation: 'DELETE', status: 'preview_failed', reason });
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
plan.push({ type: 'WRITE', fullPath, relativePath, originalOperation: 'DELETE', content });
|
|
153
|
-
details.push({ relativePath, originalOperation: 'DELETE', status: 'preview_passed', action: '重建文件' });
|
|
154
|
-
// 更新内存状态:文件已重建
|
|
155
|
-
fileContentMap.set(relativePath, content);
|
|
156
|
-
fileExistedMap.set(relativePath, true);
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
default: {
|
|
160
|
-
const reason = `未知的操作类型 "${op.originalOperation}"`;
|
|
161
|
-
errors.push(`${reason} for ${relativePath}`);
|
|
162
|
-
details.push({ relativePath, originalOperation: op.originalOperation, status: 'preview_failed', reason });
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return { ok: errors.length === 0, errors, plan, details };
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* 批量执行回滚计划。
|
|
171
|
-
* 返回每条操作的执行状态详情。
|
|
172
|
-
*/
|
|
173
|
-
async function executePlan(plan, previewDetails) {
|
|
174
|
-
let restored = 0;
|
|
175
|
-
let skipped = 0;
|
|
176
|
-
const errors = [];
|
|
177
|
-
// 以预检 details 为基础,更新执行阶段状态
|
|
178
|
-
const details = previewDetails.map((d) => ({ ...d }));
|
|
179
|
-
for (const item of plan) {
|
|
180
|
-
const detail = details.find((d) => d.relativePath === item.relativePath && d.status === 'preview_passed');
|
|
181
|
-
try {
|
|
182
|
-
if (item.type === 'DELETE') {
|
|
183
|
-
await fs.unlink(item.fullPath);
|
|
184
|
-
log.info(`Rollback executed: deleted created file ${item.relativePath}`);
|
|
185
|
-
if (detail) {
|
|
186
|
-
detail.status = 'success';
|
|
187
|
-
detail.action = '删除文件';
|
|
188
|
-
}
|
|
189
|
-
restored++;
|
|
190
|
-
}
|
|
191
|
-
else if (item.type === 'WRITE') {
|
|
192
|
-
await fs.mkdir(path.dirname(item.fullPath), { recursive: true });
|
|
193
|
-
await fs.writeFile(item.fullPath, item.content, 'utf-8');
|
|
194
|
-
log.info(`Rollback executed: restored file ${item.relativePath}`);
|
|
195
|
-
if (detail) {
|
|
196
|
-
detail.status = 'success';
|
|
197
|
-
detail.action = item.originalOperation === 'UPDATE' ? '应用反向 diff 补丁' : '重建文件';
|
|
198
|
-
}
|
|
199
|
-
restored++;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
catch (err) {
|
|
203
|
-
const reason = `${err.message}`;
|
|
204
|
-
const msg = `Rollback failed for ${item.relativePath}: ${reason}`;
|
|
205
|
-
errors.push(msg);
|
|
206
|
-
log.warn(msg);
|
|
207
|
-
if (detail) {
|
|
208
|
-
detail.status = 'failed';
|
|
209
|
-
detail.reason = reason;
|
|
210
|
-
}
|
|
211
|
-
skipped++;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return { restored, skipped, errors, details };
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* 差异回滚预检接口
|
|
218
|
-
* POST /runtime/file-diff-rollback/preview
|
|
219
|
-
*
|
|
220
|
-
* 仅做内存模拟,不触碰文件系统。
|
|
221
|
-
* 返回每条操作的预检状态(preview_passed / preview_failed / skipped)及原因。
|
|
222
|
-
*/
|
|
223
|
-
fileDiffRollbackRouter.post('/file-diff-rollback/preview', validateToken, async (req, res) => {
|
|
224
|
-
const { workspacePath, operations } = req.body;
|
|
225
|
-
if (!workspacePath || !Array.isArray(operations)) {
|
|
226
|
-
res.status(400).json({ error: 'workspacePath and operations (array) are required' });
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
const { ok, errors, plan, details } = await previewRollback(workspacePath, operations);
|
|
230
|
-
res.json({
|
|
231
|
-
ok,
|
|
232
|
-
errors,
|
|
233
|
-
plan: plan.map((p) => ({ type: p.type, relativePath: p.relativePath })),
|
|
234
|
-
totalOperations: operations.length,
|
|
235
|
-
plannedOperations: plan.length,
|
|
236
|
-
details,
|
|
237
|
-
});
|
|
238
|
-
});
|
|
239
|
-
/**
|
|
240
|
-
* 执行文件差异回滚
|
|
241
|
-
* POST /runtime/file-diff-rollback/execute
|
|
242
|
-
*
|
|
243
|
-
* 第一步:内存预检(previewRollback)。
|
|
244
|
-
* 第二步:若预检全部通过,则批量原子写入;若任一预检失败,直接返回错误,不写盘。
|
|
245
|
-
*
|
|
246
|
-
* 调用方在收到 previewFailed=true 时,可提示用户选择使用文件快照进行完整覆盖。
|
|
247
|
-
* 无论成功失败,都返回每条操作的详细状态。
|
|
248
|
-
*/
|
|
249
|
-
fileDiffRollbackRouter.post('/file-diff-rollback/execute', validateToken, async (req, res) => {
|
|
250
|
-
const { workspacePath, operations, skipFailed } = req.body;
|
|
251
|
-
if (!workspacePath || !Array.isArray(operations)) {
|
|
252
|
-
res.status(400).json({ error: 'workspacePath and operations (array) are required' });
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
// ── 第一步:内存预检 ──
|
|
256
|
-
const preview = await previewRollback(workspacePath, operations);
|
|
257
|
-
if (!preview.ok) {
|
|
258
|
-
// 策略:仅执行通过预检的项(跳过失败项)。
|
|
259
|
-
// preview.plan 只装通过项,且链式预演中失败项不会污染 fileContentMap,
|
|
260
|
-
// 因此通过项预计算出的目标内容天然保留了失败项的改动 —— 直接执行 plan 即等价于"跳过不通过项"。
|
|
261
|
-
if (skipFailed && preview.plan.length > 0) {
|
|
262
|
-
const execResult = await executePlan(preview.plan, preview.details);
|
|
263
|
-
const failedCount = preview.details.filter((d) => d.status === 'preview_failed').length;
|
|
264
|
-
log.warn(`Diff rollback partial execute: passed=${execResult.restored}, skippedFailed=${failedCount}, ioSkipped=${execResult.skipped}`);
|
|
265
|
-
const result = {
|
|
266
|
-
ok: execResult.errors.length === 0,
|
|
267
|
-
restored: execResult.restored,
|
|
268
|
-
skipped: execResult.skipped + failedCount,
|
|
269
|
-
errors: execResult.errors,
|
|
270
|
-
previewFailed: false,
|
|
271
|
-
partial: true,
|
|
272
|
-
details: execResult.details,
|
|
273
|
-
};
|
|
274
|
-
res.json(result);
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
const result = {
|
|
278
|
-
ok: false,
|
|
279
|
-
restored: 0,
|
|
280
|
-
skipped: operations.length,
|
|
281
|
-
errors: preview.errors,
|
|
282
|
-
previewFailed: true,
|
|
283
|
-
details: preview.details,
|
|
284
|
-
};
|
|
285
|
-
log.warn(`Diff rollback preview failed, no files touched: errors=${preview.errors.length}`);
|
|
286
|
-
res.json(result);
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
// ── 第二步:批量原子执行 ──
|
|
290
|
-
const execResult = await executePlan(preview.plan, preview.details);
|
|
291
|
-
const result = {
|
|
292
|
-
ok: execResult.errors.length === 0,
|
|
293
|
-
restored: execResult.restored,
|
|
294
|
-
skipped: execResult.skipped,
|
|
295
|
-
errors: execResult.errors,
|
|
296
|
-
previewFailed: false,
|
|
297
|
-
details: execResult.details,
|
|
298
|
-
};
|
|
299
|
-
log.info(`Diff rollback completed: restored=${execResult.restored}, skipped=${execResult.skipped}, errors=${execResult.errors.length}`);
|
|
300
|
-
res.json(result);
|
|
301
|
-
});
|
|
1
|
+
import{promises as w}from"node:fs";import g from"node:path";import{Router as O}from"express";import*as P from"diff";import{createLogger as R}from"../utils/logger.js";import{validateToken as T}from"../middleware/auth.js";import{readBeforeContentFromCache as U,readDiffFromCache as _}from"../services/workspaceTaskChangeWatcher.js";const k=R("file-diff-rollback"),D=O();async function m(h,u){const r=[],l=[],s=[],i=g.resolve(String(h).trim()),t=[...u].sort((a,c)=>new Date(c.createdAt).getTime()-new Date(a.createdAt).getTime()),o=new Map,p=new Map;for(const a of t){const c=g.join(i,a.relativePath),e=a.relativePath.replace(/\\/g,"/");if(!g.resolve(c).startsWith(i)){const n=`Path escape detected: ${e}`;r.push(n),s.push({relativePath:e,originalOperation:a.originalOperation,status:"preview_failed",reason:n});continue}if(!o.has(e)){let n=null,f=!1;try{n=await w.readFile(c,"utf-8"),f=!0}catch{f=!1}o.set(e,n),p.set(e,f)}switch(a.originalOperation){case"CREATE":{l.push({type:"DELETE",fullPath:c,relativePath:e,originalOperation:"CREATE"}),s.push({relativePath:e,originalOperation:"CREATE",status:"preview_passed",action:"\u5220\u9664\u6587\u4EF6"}),o.set(e,null),p.set(e,!1);break}case"UPDATE":{if(!a.cacheKey){const d="\u7F3A\u5C11 cacheKey\uFF0C\u65E0\u6CD5\u8BFB\u53D6 diff \u8865\u4E01";r.push(`UPDATE rollback failed: ${d} for ${e}`),s.push({relativePath:e,originalOperation:"UPDATE",status:"preview_failed",reason:d});break}const n=o.get(e)??null;if(n===null){const d="\u6587\u4EF6\u5F53\u524D\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u5E94\u7528\u53CD\u5411 diff \u8865\u4E01";r.push(`UPDATE rollback failed: ${d} for ${e}`),s.push({relativePath:e,originalOperation:"UPDATE",status:"preview_failed",reason:d});break}const f=await _(i,a.cacheKey);if(f===null){const d=`\u672C\u5730\u7F13\u5B58\u4E2D\u627E\u4E0D\u5230 diff \u8865\u4E01 (cacheKey=${a.cacheKey})\uFF0C\u65E0\u6CD5\u7CBE\u786E\u56DE\u6EDA`;r.push(`UPDATE rollback failed: ${d} for ${e}`),s.push({relativePath:e,originalOperation:"UPDATE",status:"preview_failed",reason:d});break}let v=null;try{const d=P.parsePatch(f),E=P.reversePatch(d),$=P.applyPatch(n,E);if($!==!1)v=$;else{const b="\u53CD\u5411 diff \u8865\u4E01\u65E0\u6CD5\u7CBE\u786E\u5E94\u7528\uFF1A\u6587\u4EF6\u5F53\u524D\u5185\u5BB9\u4E0E AI \u53D8\u66F4\u540E\u7684\u9884\u671F\u4E0A\u4E0B\u6587\u4E0D\u5339\u914D\uFF0C\u53EF\u80FD\u5DF2\u88AB\u5176\u4ED6\u4EFB\u52A1\u6216\u7528\u6237\u4FEE\u6539\u4E86\u76F8\u540C\u533A\u57DF\uFF0C\u5B58\u5728\u51B2\u7A81";r.push(`UPDATE rollback failed: ${b} for ${e}`),s.push({relativePath:e,originalOperation:"UPDATE",status:"preview_failed",reason:b});break}}catch(d){const E=`\u53CD\u5411 diff \u8865\u4E01\u5E94\u7528\u5F02\u5E38: ${d.message}`;r.push(`UPDATE rollback failed: ${E} for ${e}`),s.push({relativePath:e,originalOperation:"UPDATE",status:"preview_failed",reason:E});break}l.push({type:"WRITE",fullPath:c,relativePath:e,originalOperation:"UPDATE",content:v}),s.push({relativePath:e,originalOperation:"UPDATE",status:"preview_passed",action:"\u5E94\u7528\u53CD\u5411 diff \u8865\u4E01"}),o.set(e,v);break}case"DELETE":{if(!a.cacheKey){const f="\u7F3A\u5C11 cacheKey\uFF0C\u65E0\u6CD5\u8BFB\u53D6\u5220\u9664\u524D\u7684\u6587\u4EF6\u5185\u5BB9";r.push(`DELETE rollback failed: ${f} for ${e}`),s.push({relativePath:e,originalOperation:"DELETE",status:"preview_failed",reason:f});break}const n=await U(i,a.cacheKey);if(n===null){const f=`\u672C\u5730\u7F13\u5B58\u4E2D\u627E\u4E0D\u5230\u5220\u9664\u524D\u7684\u6587\u4EF6\u5185\u5BB9 (cacheKey=${a.cacheKey})`;r.push(`DELETE rollback failed: ${f} for ${e}`),s.push({relativePath:e,originalOperation:"DELETE",status:"preview_failed",reason:f});break}l.push({type:"WRITE",fullPath:c,relativePath:e,originalOperation:"DELETE",content:n}),s.push({relativePath:e,originalOperation:"DELETE",status:"preview_passed",action:"\u91CD\u5EFA\u6587\u4EF6"}),o.set(e,n),p.set(e,!0);break}default:{const n=`\u672A\u77E5\u7684\u64CD\u4F5C\u7C7B\u578B "${a.originalOperation}"`;r.push(`${n} for ${e}`),s.push({relativePath:e,originalOperation:a.originalOperation,status:"preview_failed",reason:n});break}}}return{ok:r.length===0,errors:r,plan:l,details:s}}async function A(h,u){let r=0,l=0;const s=[],i=u.map(t=>({...t}));for(const t of h){const o=i.find(p=>p.relativePath===t.relativePath&&p.status==="preview_passed");try{t.type==="DELETE"?(await w.unlink(t.fullPath),k.info(`Rollback executed: deleted created file ${t.relativePath}`),o&&(o.status="success",o.action="\u5220\u9664\u6587\u4EF6"),r++):t.type==="WRITE"&&(await w.mkdir(g.dirname(t.fullPath),{recursive:!0}),await w.writeFile(t.fullPath,t.content,"utf-8"),k.info(`Rollback executed: restored file ${t.relativePath}`),o&&(o.status="success",o.action=t.originalOperation==="UPDATE"?"\u5E94\u7528\u53CD\u5411 diff \u8865\u4E01":"\u91CD\u5EFA\u6587\u4EF6"),r++)}catch(p){const a=`${p.message}`,c=`Rollback failed for ${t.relativePath}: ${a}`;s.push(c),k.warn(c),o&&(o.status="failed",o.reason=a),l++}}return{restored:r,skipped:l,errors:s,details:i}}D.post("/file-diff-rollback/preview",T,async(h,u)=>{const{workspacePath:r,operations:l}=h.body;if(!r||!Array.isArray(l)){u.status(400).json({error:"workspacePath and operations (array) are required"});return}const{ok:s,errors:i,plan:t,details:o}=await m(r,l);u.json({ok:s,errors:i,plan:t.map(p=>({type:p.type,relativePath:p.relativePath})),totalOperations:l.length,plannedOperations:t.length,details:o})}),D.post("/file-diff-rollback/execute",T,async(h,u)=>{const{workspacePath:r,operations:l,skipFailed:s}=h.body;if(!r||!Array.isArray(l)){u.status(400).json({error:"workspacePath and operations (array) are required"});return}const i=await m(r,l);if(!i.ok){if(s&&i.plan.length>0){const a=await A(i.plan,i.details),c=i.details.filter(y=>y.status==="preview_failed").length;k.warn(`Diff rollback partial execute: passed=${a.restored}, skippedFailed=${c}, ioSkipped=${a.skipped}`);const e={ok:a.errors.length===0,restored:a.restored,skipped:a.skipped+c,errors:a.errors,previewFailed:!1,partial:!0,details:a.details};u.json(e);return}const p={ok:!1,restored:0,skipped:l.length,errors:i.errors,previewFailed:!0,details:i.details};k.warn(`Diff rollback preview failed, no files touched: errors=${i.errors.length}`),u.json(p);return}const t=await A(i.plan,i.details),o={ok:t.errors.length===0,restored:t.restored,skipped:t.skipped,errors:t.errors,previewFailed:!1,details:t.details};k.info(`Diff rollback completed: restored=${t.restored}, skipped=${t.skipped}, errors=${t.errors.length}`),u.json(o)});export{D as fileDiffRollbackRouter};
|
|
2
|
+
|
|
@@ -1,156 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* 提供基于文件内容哈希的确定性快照,替代 git stash 实现稳定可靠的快照与还原。
|
|
5
|
-
* - 创建快照:遍历工作区,整文件备份 + 内容哈希去重
|
|
6
|
-
* - 还原快照:先清后写,整文件覆盖,零冲突,幂等
|
|
7
|
-
* - 列表/删除:按快照 key 管理生命周期
|
|
8
|
-
*/
|
|
9
|
-
import { Router } from "express";
|
|
10
|
-
import { validateToken } from "../middleware/auth.js";
|
|
11
|
-
import { createLogger } from "../utils/logger.js";
|
|
12
|
-
import { createSnapshot, restoreSnapshot, listSnapshots, deleteSnapshot, getSnapshotRootPath, } from "../services/fileSnapshotStore.js";
|
|
13
|
-
export const fileSnapshotRouter = Router();
|
|
14
|
-
const log = createLogger("file-snapshot");
|
|
15
|
-
/**
|
|
16
|
-
* 创建文件快照
|
|
17
|
-
* POST /runtime/file-snapshot/create
|
|
18
|
-
*/
|
|
19
|
-
fileSnapshotRouter.post("/file-snapshot/create", validateToken, async (req, res) => {
|
|
20
|
-
const { workspacePath, snapshotId, snapshotName, triggerType } = req.body || {};
|
|
21
|
-
if (!workspacePath || !String(workspacePath).trim()) {
|
|
22
|
-
res.status(400).json({ error: "workspacePath is required" });
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
try {
|
|
26
|
-
const result = await createSnapshot({
|
|
27
|
-
workspacePath: String(workspacePath).trim(),
|
|
28
|
-
snapshotId: snapshotId ? String(snapshotId).trim() : undefined,
|
|
29
|
-
snapshotName: snapshotName ? String(snapshotName).trim() : undefined,
|
|
30
|
-
triggerType: triggerType ? String(triggerType).trim() : undefined,
|
|
31
|
-
});
|
|
32
|
-
if (!result.ok) {
|
|
33
|
-
log.warn(`[FileSnapshot] 创建快照失败: ${result.error}`);
|
|
34
|
-
res.status(500).json({ ok: false, error: result.error });
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
res.json({
|
|
38
|
-
ok: true,
|
|
39
|
-
snapshotId: result.snapshotId,
|
|
40
|
-
snapshotKey: result.snapshotKey,
|
|
41
|
-
fileCount: result.fileCount,
|
|
42
|
-
totalBytes: result.totalBytes,
|
|
43
|
-
workspaceHash: result.workspaceHash,
|
|
44
|
-
workspacePath: String(workspacePath).trim(),
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
catch (error) {
|
|
48
|
-
const err = error;
|
|
49
|
-
log.error(`[FileSnapshot] 创建快照异常: ${err.message}`);
|
|
50
|
-
res.status(500).json({ ok: false, error: err.message || "create snapshot failed" });
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
/**
|
|
54
|
-
* 还原文件快照
|
|
55
|
-
* POST /runtime/file-snapshot/restore
|
|
56
|
-
*/
|
|
57
|
-
fileSnapshotRouter.post("/file-snapshot/restore", validateToken, async (req, res) => {
|
|
58
|
-
const { workspacePath, snapshotKey, preRestoreBackup } = req.body || {};
|
|
59
|
-
if (!workspacePath || !String(workspacePath).trim()) {
|
|
60
|
-
res.status(400).json({ error: "workspacePath is required" });
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
if (!snapshotKey || !String(snapshotKey).trim()) {
|
|
64
|
-
res.status(400).json({ error: "snapshotKey is required" });
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
try {
|
|
68
|
-
const result = await restoreSnapshot({
|
|
69
|
-
workspacePath: String(workspacePath).trim(),
|
|
70
|
-
snapshotKey: String(snapshotKey).trim(),
|
|
71
|
-
preRestoreBackup: preRestoreBackup !== false,
|
|
72
|
-
});
|
|
73
|
-
if (!result.ok) {
|
|
74
|
-
log.warn(`[FileSnapshot] 还原快照失败: ${result.error}`);
|
|
75
|
-
res.status(500).json({ ok: false, error: result.error });
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
res.json({
|
|
79
|
-
ok: true,
|
|
80
|
-
filesRestored: result.filesRestored,
|
|
81
|
-
filesDeleted: result.filesDeleted,
|
|
82
|
-
filesSkipped: result.filesSkipped,
|
|
83
|
-
preRestoreSnapshotKey: result.preRestoreSnapshotKey || null,
|
|
84
|
-
workspacePath: String(workspacePath).trim(),
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
const err = error;
|
|
89
|
-
log.error(`[FileSnapshot] 还原快照异常: ${err.message}`);
|
|
90
|
-
res.status(500).json({ ok: false, error: err.message || "restore snapshot failed" });
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
/**
|
|
94
|
-
* 列出快照
|
|
95
|
-
* POST /runtime/file-snapshot/list
|
|
96
|
-
*/
|
|
97
|
-
fileSnapshotRouter.post("/file-snapshot/list", validateToken, async (req, res) => {
|
|
98
|
-
const { workspacePath } = req.body || {};
|
|
99
|
-
if (!workspacePath || !String(workspacePath).trim()) {
|
|
100
|
-
res.status(400).json({ error: "workspacePath is required" });
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
try {
|
|
104
|
-
const snapshots = await listSnapshots(String(workspacePath).trim());
|
|
105
|
-
res.json({
|
|
106
|
-
ok: true,
|
|
107
|
-
snapshots,
|
|
108
|
-
count: snapshots.length,
|
|
109
|
-
workspacePath: String(workspacePath).trim(),
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
const err = error;
|
|
114
|
-
log.error(`[FileSnapshot] 列出快照异常: ${err.message}`);
|
|
115
|
-
res.status(500).json({ ok: false, error: err.message || "list snapshots failed" });
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
/**
|
|
119
|
-
* 删除快照
|
|
120
|
-
* POST /runtime/file-snapshot/delete
|
|
121
|
-
*/
|
|
122
|
-
fileSnapshotRouter.post("/file-snapshot/delete", validateToken, async (req, res) => {
|
|
123
|
-
const { snapshotKey } = req.body || {};
|
|
124
|
-
if (!snapshotKey || !String(snapshotKey).trim()) {
|
|
125
|
-
res.status(400).json({ error: "snapshotKey is required" });
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
try {
|
|
129
|
-
const result = await deleteSnapshot(String(snapshotKey).trim());
|
|
130
|
-
if (!result.ok) {
|
|
131
|
-
log.warn(`[FileSnapshot] 删除快照失败: ${result.error}`);
|
|
132
|
-
res.status(result.error?.includes("not found") ? 404 : 500).json({ ok: false, error: result.error });
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
res.json({
|
|
136
|
-
ok: true,
|
|
137
|
-
snapshotKey: String(snapshotKey).trim(),
|
|
138
|
-
message: `已删除快照 ${snapshotKey}`,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
catch (error) {
|
|
142
|
-
const err = error;
|
|
143
|
-
log.error(`[FileSnapshot] 删除快照异常: ${err.message}`);
|
|
144
|
-
res.status(500).json({ ok: false, error: err.message || "delete snapshot failed" });
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
/**
|
|
148
|
-
* 快照存储诊断信息
|
|
149
|
-
* POST /runtime/file-snapshot/info
|
|
150
|
-
*/
|
|
151
|
-
fileSnapshotRouter.post("/file-snapshot/info", validateToken, async (_req, res) => {
|
|
152
|
-
res.json({
|
|
153
|
-
ok: true,
|
|
154
|
-
snapshotRoot: getSnapshotRootPath(),
|
|
155
|
-
});
|
|
156
|
-
});
|
|
1
|
+
import{Router as c}from"express";import{validateToken as p}from"../middleware/auth.js";import{createLogger as u}from"../utils/logger.js";import{createSnapshot as f,restoreSnapshot as m,listSnapshots as d,deleteSnapshot as g,getSnapshotRootPath as S}from"../services/fileSnapshotStore.js";const h=c(),i=u("file-snapshot");h.post("/file-snapshot/create",p,async(n,t)=>{const{workspacePath:r,snapshotId:s,snapshotName:a,triggerType:o}=n.body||{};if(!r||!String(r).trim()){t.status(400).json({error:"workspacePath is required"});return}try{const e=await f({workspacePath:String(r).trim(),snapshotId:s?String(s).trim():void 0,snapshotName:a?String(a).trim():void 0,triggerType:o?String(o).trim():void 0});if(!e.ok){i.warn(`[FileSnapshot] \u521B\u5EFA\u5FEB\u7167\u5931\u8D25: ${e.error}`),t.status(500).json({ok:!1,error:e.error});return}t.json({ok:!0,snapshotId:e.snapshotId,snapshotKey:e.snapshotKey,fileCount:e.fileCount,totalBytes:e.totalBytes,workspaceHash:e.workspaceHash,workspacePath:String(r).trim()})}catch(e){const l=e;i.error(`[FileSnapshot] \u521B\u5EFA\u5FEB\u7167\u5F02\u5E38: ${l.message}`),t.status(500).json({ok:!1,error:l.message||"create snapshot failed"})}}),h.post("/file-snapshot/restore",p,async(n,t)=>{const{workspacePath:r,snapshotKey:s,preRestoreBackup:a}=n.body||{};if(!r||!String(r).trim()){t.status(400).json({error:"workspacePath is required"});return}if(!s||!String(s).trim()){t.status(400).json({error:"snapshotKey is required"});return}try{const o=await m({workspacePath:String(r).trim(),snapshotKey:String(s).trim(),preRestoreBackup:a!==!1});if(!o.ok){i.warn(`[FileSnapshot] \u8FD8\u539F\u5FEB\u7167\u5931\u8D25: ${o.error}`),t.status(500).json({ok:!1,error:o.error});return}t.json({ok:!0,filesRestored:o.filesRestored,filesDeleted:o.filesDeleted,filesSkipped:o.filesSkipped,preRestoreSnapshotKey:o.preRestoreSnapshotKey||null,workspacePath:String(r).trim()})}catch(o){const e=o;i.error(`[FileSnapshot] \u8FD8\u539F\u5FEB\u7167\u5F02\u5E38: ${e.message}`),t.status(500).json({ok:!1,error:e.message||"restore snapshot failed"})}}),h.post("/file-snapshot/list",p,async(n,t)=>{const{workspacePath:r}=n.body||{};if(!r||!String(r).trim()){t.status(400).json({error:"workspacePath is required"});return}try{const s=await d(String(r).trim());t.json({ok:!0,snapshots:s,count:s.length,workspacePath:String(r).trim()})}catch(s){const a=s;i.error(`[FileSnapshot] \u5217\u51FA\u5FEB\u7167\u5F02\u5E38: ${a.message}`),t.status(500).json({ok:!1,error:a.message||"list snapshots failed"})}}),h.post("/file-snapshot/delete",p,async(n,t)=>{const{snapshotKey:r}=n.body||{};if(!r||!String(r).trim()){t.status(400).json({error:"snapshotKey is required"});return}try{const s=await g(String(r).trim());if(!s.ok){i.warn(`[FileSnapshot] \u5220\u9664\u5FEB\u7167\u5931\u8D25: ${s.error}`),t.status(s.error?.includes("not found")?404:500).json({ok:!1,error:s.error});return}t.json({ok:!0,snapshotKey:String(r).trim(),message:`\u5DF2\u5220\u9664\u5FEB\u7167 ${r}`})}catch(s){const a=s;i.error(`[FileSnapshot] \u5220\u9664\u5FEB\u7167\u5F02\u5E38: ${a.message}`),t.status(500).json({ok:!1,error:a.message||"delete snapshot failed"})}}),h.post("/file-snapshot/info",p,async(n,t)=>{t.json({ok:!0,snapshotRoot:S()})});export{h as fileSnapshotRouter};
|
|
2
|
+
|
package/dist/routes/git.d.ts
CHANGED
|
@@ -141,4 +141,3 @@ export declare function callAiForCommitMessage(aiBaseUrl: string, aiApiKey: stri
|
|
|
141
141
|
*/
|
|
142
142
|
export declare function streamAiForCommitMessage(aiBaseUrl: string, aiApiKey: string, aiModel: string, diffContent: string, onDelta: (delta: string, accumulated: string) => void, abortSignal?: AbortSignal): Promise<string>;
|
|
143
143
|
export {};
|
|
144
|
-
//# sourceMappingURL=git.d.ts.map
|