aws-runtime-bridge 1.9.79 → 1.9.81
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 +5 -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 -3
- package/dist/services/windows-service-manager.js +2 -59
- 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,123 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import { sendFileChanged } from './session-output.js';
|
|
4
|
-
const watchedFiles = new Map();
|
|
5
|
-
const WATCH_DEBOUNCE_MS = 300;
|
|
6
|
-
function toDisplayPath(targetPath) {
|
|
7
|
-
return String(targetPath || '').replace(/\\/g, '/');
|
|
8
|
-
}
|
|
9
|
-
function ensureInsideWorkspace(workspaceRoot, targetPath) {
|
|
10
|
-
const resolvedTargetPath = path.resolve(targetPath);
|
|
11
|
-
const relativePath = path.relative(workspaceRoot, resolvedTargetPath);
|
|
12
|
-
if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
|
|
13
|
-
throw new Error(`Target path is outside workspace: ${resolvedTargetPath}`);
|
|
14
|
-
}
|
|
15
|
-
return resolvedTargetPath;
|
|
16
|
-
}
|
|
17
|
-
async function resolveWatchTarget(params) {
|
|
18
|
-
const requestedWorkspaceRoot = path.resolve(String(params.workspacePath || '').trim());
|
|
19
|
-
const workspaceRoot = await fs.realpath(requestedWorkspaceRoot);
|
|
20
|
-
const requestedFilePath = path.resolve(String(params.filePath || '').trim());
|
|
21
|
-
const requestedRelativePath = path.relative(requestedWorkspaceRoot, requestedFilePath);
|
|
22
|
-
if (requestedRelativePath.startsWith('..') || path.isAbsolute(requestedRelativePath)) {
|
|
23
|
-
throw new Error(`Target path is outside workspace: ${requestedFilePath}`);
|
|
24
|
-
}
|
|
25
|
-
const filePath = ensureInsideWorkspace(workspaceRoot, path.join(workspaceRoot, requestedRelativePath));
|
|
26
|
-
const realFilePath = await fs.realpath(filePath);
|
|
27
|
-
ensureInsideWorkspace(workspaceRoot, realFilePath);
|
|
28
|
-
const stat = await fs.stat(realFilePath);
|
|
29
|
-
if (!stat.isFile()) {
|
|
30
|
-
throw new Error(`Path is not a file: ${realFilePath}`);
|
|
31
|
-
}
|
|
32
|
-
return { workspaceRoot, filePath: realFilePath };
|
|
33
|
-
}
|
|
34
|
-
function watchKey(workspaceRoot, filePath) {
|
|
35
|
-
return `${toDisplayPath(workspaceRoot)}::${toDisplayPath(filePath)}`;
|
|
36
|
-
}
|
|
37
|
-
function closeWatchRecord(key, record) {
|
|
38
|
-
if (record.timer) {
|
|
39
|
-
clearTimeout(record.timer);
|
|
40
|
-
record.timer = null;
|
|
41
|
-
}
|
|
42
|
-
record.watcher.close();
|
|
43
|
-
watchedFiles.delete(key);
|
|
44
|
-
}
|
|
45
|
-
async function resolveWatchKey(params) {
|
|
46
|
-
const requestedWorkspaceRoot = path.resolve(String(params.workspacePath || '').trim());
|
|
47
|
-
const workspaceRoot = await fs.realpath(requestedWorkspaceRoot);
|
|
48
|
-
const requestedFilePath = path.resolve(String(params.filePath || '').trim());
|
|
49
|
-
const requestedRelativePath = path.relative(requestedWorkspaceRoot, requestedFilePath);
|
|
50
|
-
if (requestedRelativePath.startsWith('..') || path.isAbsolute(requestedRelativePath)) {
|
|
51
|
-
throw new Error(`Target path is outside workspace: ${requestedFilePath}`);
|
|
52
|
-
}
|
|
53
|
-
const filePath = ensureInsideWorkspace(workspaceRoot, path.join(workspaceRoot, requestedRelativePath));
|
|
54
|
-
return watchKey(workspaceRoot, filePath);
|
|
55
|
-
}
|
|
56
|
-
async function notifyFileChanged(record, eventType) {
|
|
57
|
-
let size;
|
|
58
|
-
let mtimeMs;
|
|
59
|
-
try {
|
|
60
|
-
const stat = await fs.stat(record.filePath);
|
|
61
|
-
size = stat.size;
|
|
62
|
-
mtimeMs = stat.mtimeMs;
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
// Deletions or transient writes still notify the frontend so it can show a refresh error if needed.
|
|
66
|
-
}
|
|
67
|
-
await sendFileChanged({
|
|
68
|
-
workspacePath: toDisplayPath(record.workspacePath),
|
|
69
|
-
filePath: toDisplayPath(record.filePath),
|
|
70
|
-
eventType,
|
|
71
|
-
size,
|
|
72
|
-
mtimeMs,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
function scheduleFileChanged(record, eventType) {
|
|
76
|
-
if (record.timer) {
|
|
77
|
-
clearTimeout(record.timer);
|
|
78
|
-
}
|
|
79
|
-
record.timer = setTimeout(() => {
|
|
80
|
-
record.timer = null;
|
|
81
|
-
notifyFileChanged(record, eventType).catch(() => undefined);
|
|
82
|
-
}, WATCH_DEBOUNCE_MS);
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* 开始监听工作区内单个文件,重复监听同一文件会复用已有 watcher。
|
|
86
|
-
*/
|
|
87
|
-
export async function watchWorkspaceFile(params) {
|
|
88
|
-
const { workspaceRoot, filePath } = await resolveWatchTarget(params);
|
|
89
|
-
const key = watchKey(workspaceRoot, filePath);
|
|
90
|
-
const existingRecord = watchedFiles.get(key);
|
|
91
|
-
if (existingRecord) {
|
|
92
|
-
existingRecord.refCount += 1;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
const record = {
|
|
96
|
-
watcher: watch(filePath, (eventType) => scheduleFileChanged(record, String(eventType || 'change'))),
|
|
97
|
-
workspacePath: workspaceRoot,
|
|
98
|
-
filePath,
|
|
99
|
-
timer: null,
|
|
100
|
-
refCount: 1,
|
|
101
|
-
};
|
|
102
|
-
record.watcher.on('error', () => closeWatchRecord(key, record));
|
|
103
|
-
watchedFiles.set(key, record);
|
|
104
|
-
}
|
|
105
|
-
return { ok: true, workspacePath: toDisplayPath(workspaceRoot), filePath: toDisplayPath(filePath) };
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* 停止监听工作区内单个文件;未监听时保持幂等。
|
|
109
|
-
*/
|
|
110
|
-
export async function unwatchWorkspaceFile(params) {
|
|
111
|
-
const key = await resolveWatchKey(params);
|
|
112
|
-
const record = watchedFiles.get(key);
|
|
113
|
-
if (record) {
|
|
114
|
-
record.refCount -= 1;
|
|
115
|
-
if (record.refCount <= 0) {
|
|
116
|
-
closeWatchRecord(key, record);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return { ok: true };
|
|
120
|
-
}
|
|
121
|
-
export function getWorkspaceWatchCountForTests() {
|
|
122
|
-
return watchedFiles.size;
|
|
123
|
-
}
|
|
1
|
+
import{watch as p,promises as l}from"node:fs";import i from"node:path";import{sendFileChanged as P}from"./session-output.js";const h=new Map,m=300;function c(t){return String(t||"").replace(/\\/g,"/")}function u(t,e){const a=i.resolve(e),r=i.relative(t,a);if(r.startsWith("..")||i.isAbsolute(r))throw new Error(`Target path is outside workspace: ${a}`);return a}async function k(t){const e=i.resolve(String(t.workspacePath||"").trim()),a=await l.realpath(e),r=i.resolve(String(t.filePath||"").trim()),o=i.relative(e,r);if(o.startsWith("..")||i.isAbsolute(o))throw new Error(`Target path is outside workspace: ${r}`);const s=u(a,i.join(a,o)),n=await l.realpath(s);if(u(a,n),!(await l.stat(n)).isFile())throw new Error(`Path is not a file: ${n}`);return{workspaceRoot:a,filePath:n}}function f(t,e){return`${c(t)}::${c(e)}`}function w(t,e){e.timer&&(clearTimeout(e.timer),e.timer=null),e.watcher.close(),h.delete(t)}async function g(t){const e=i.resolve(String(t.workspacePath||"").trim()),a=await l.realpath(e),r=i.resolve(String(t.filePath||"").trim()),o=i.relative(e,r);if(o.startsWith("..")||i.isAbsolute(o))throw new Error(`Target path is outside workspace: ${r}`);const s=u(a,i.join(a,o));return f(a,s)}async function d(t,e){let a,r;try{const o=await l.stat(t.filePath);a=o.size,r=o.mtimeMs}catch{}await P({workspacePath:c(t.workspacePath),filePath:c(t.filePath),eventType:e,size:a,mtimeMs:r})}function v(t,e){t.timer&&clearTimeout(t.timer),t.timer=setTimeout(()=>{t.timer=null,d(t,e).catch(()=>{})},m)}async function T(t){const{workspaceRoot:e,filePath:a}=await k(t),r=f(e,a),o=h.get(r);if(o)o.refCount+=1;else{const s={watcher:p(a,n=>v(s,String(n||"change"))),workspacePath:e,filePath:a,timer:null,refCount:1};s.watcher.on("error",()=>w(r,s)),h.set(r,s)}return{ok:!0,workspacePath:c(e),filePath:c(a)}}async function R(t){const e=await g(t),a=h.get(e);return a&&(a.refCount-=1,a.refCount<=0&&w(e,a)),{ok:!0}}function S(){return h.size}export{S as getWorkspaceWatchCountForTests,R as unwatchWorkspaceFile,T as watchWorkspaceFile};
|
|
2
|
+
|
|
@@ -1,483 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* **仅通过 Agent 文件操作工具拦截记录变更**(write_file/edit_file/delete_file),
|
|
5
|
-
* 不再使用 fs.watch 全量监听(无法区分 Agent 修改与用户手动修改)。
|
|
6
|
-
*
|
|
7
|
-
* - recordAgentFileChange() 由工具 execute 成功后直接调用
|
|
8
|
-
* - 变更内容(diff/beforeContent)持久化到 bridge 本地 .agentswork/change-cache
|
|
9
|
-
* - 变更元数据 + cacheKey 通过 HTTP 上报到 mcp-server
|
|
10
|
-
* - 差异回滚时从数据库读取记录、从 bridge 缓存读取 diff
|
|
11
|
-
*/
|
|
12
|
-
import { promises as fs } from 'node:fs';
|
|
13
|
-
import path from 'node:path';
|
|
14
|
-
import { createHash } from 'node:crypto';
|
|
15
|
-
import axios from 'axios';
|
|
16
|
-
import * as Diff from 'diff';
|
|
17
|
-
import { createLogger } from '../utils/logger.js';
|
|
18
|
-
import { resolveSchedulerBaseUrl } from '../config.js';
|
|
19
|
-
import { getRuntimeAccessToken } from './runtime-binding.js';
|
|
20
|
-
const log = createLogger('workspace-task-change-watcher');
|
|
21
|
-
// ── 常量 ──────────────────────────────────────────────────────
|
|
22
|
-
/** 排除的目录名(任意层级精确匹配) */
|
|
23
|
-
const EXCLUDED_DIRS = new Set([
|
|
24
|
-
'.git', 'node_modules', '__pycache__', '.cache',
|
|
25
|
-
'.next', 'target', 'dist', '.idea', '.vscode',
|
|
26
|
-
'.agentswork-snapshots', '.aws-bridge',
|
|
27
|
-
]);
|
|
28
|
-
/** 排除的文件扩展名 */
|
|
29
|
-
const EXCLUDED_EXT = new Set([
|
|
30
|
-
'.lock', '.log', '.pid', '.swp', '.swo', '.tmp',
|
|
31
|
-
]);
|
|
32
|
-
/** 单一文件变更去抖间隔(ms) */
|
|
33
|
-
const DEBOUNCE_MS = 500;
|
|
34
|
-
/** 文件内容大小上限(10MB),超过不记录变更内容只记录路径 */
|
|
35
|
-
const MAX_CONTENT_SIZE = 10 * 1024 * 1024;
|
|
36
|
-
/** bridge 本地变更缓存目录(相对于 workspace) */
|
|
37
|
-
const CHANGE_CACHE_DIR = '.agentswork/change-cache';
|
|
38
|
-
// ── 状态 ──────────────────────────────────────────────────────
|
|
39
|
-
/** 当前活跃的任务上下文(同一时间只有一个活跃任务) */
|
|
40
|
-
let activeTaskContext = null;
|
|
41
|
-
/** 是否已启动监听 */
|
|
42
|
-
let watcherActive = false;
|
|
43
|
-
/** 工作区根目录 */
|
|
44
|
-
let workspaceRoot = '';
|
|
45
|
-
/** Node.js FSWatcher 实例(递归监听) */
|
|
46
|
-
let fsWatcher = null;
|
|
47
|
-
/** 待处理的文件变更(去抖用) */
|
|
48
|
-
const pendingChanges = new Map();
|
|
49
|
-
/** 文件最后已知内容缓存(用于检测变更前内容) */
|
|
50
|
-
const lastKnownContent = new Map();
|
|
51
|
-
/** 是否正在刷新待处理变更 */
|
|
52
|
-
let flushing = false;
|
|
53
|
-
// ── 公开 API ──────────────────────────────────────────────────
|
|
54
|
-
/**
|
|
55
|
-
* 设置当前活跃任务上下文。
|
|
56
|
-
* 调用时机:Agent 通过 startTaskNode 开始处理任务节点时,由 server 回调通知。
|
|
57
|
-
*/
|
|
58
|
-
export function setTaskContext(ctx) {
|
|
59
|
-
if (activeTaskContext && activeTaskContext.taskNodeId !== ctx.taskNodeId) {
|
|
60
|
-
// 先刷新所有待处理变更
|
|
61
|
-
flushAllPendingChanges().catch(() => undefined);
|
|
62
|
-
}
|
|
63
|
-
activeTaskContext = ctx;
|
|
64
|
-
log.info(`Task context set: agent=${ctx.agentId}, taskInstance=${ctx.taskInstanceId}, node=${ctx.taskNodeId}`);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* 清除当前任务上下文。
|
|
68
|
-
* 调用时机:Agent 提交任务结果后,或任务被中断/取消时。
|
|
69
|
-
*/
|
|
70
|
-
export function clearTaskContext() {
|
|
71
|
-
if (activeTaskContext) {
|
|
72
|
-
log.info(`Task context cleared: agent=${activeTaskContext.agentId}`);
|
|
73
|
-
flushAllPendingChanges().catch(() => undefined);
|
|
74
|
-
}
|
|
75
|
-
activeTaskContext = null;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* 获取当前活跃任务上下文。
|
|
79
|
-
*/
|
|
80
|
-
export function getTaskContext() {
|
|
81
|
-
return activeTaskContext;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* 检查是否有活跃任务上下文。
|
|
85
|
-
*/
|
|
86
|
-
export function hasActiveTask() {
|
|
87
|
-
return activeTaskContext !== null;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* 设置工作区路径(不再启动 fs.watch,仅记录路径供工具拦截上报使用)。
|
|
91
|
-
* 如果已有活跃的 watcher 则会先关闭。
|
|
92
|
-
*/
|
|
93
|
-
export async function startWatching(targetWorkspacePath) {
|
|
94
|
-
const normalizedPath = path.resolve(targetWorkspacePath.trim());
|
|
95
|
-
try {
|
|
96
|
-
const stat = await fs.stat(normalizedPath);
|
|
97
|
-
if (!stat.isDirectory()) {
|
|
98
|
-
throw new Error(`Not a directory: ${normalizedPath}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
catch (err) {
|
|
102
|
-
throw new Error(`Workspace path does not exist or inaccessible: ${normalizedPath}`);
|
|
103
|
-
}
|
|
104
|
-
// 关闭已有的 watcher(兼容旧调用方)
|
|
105
|
-
if (fsWatcher) {
|
|
106
|
-
try {
|
|
107
|
-
fsWatcher.close();
|
|
108
|
-
}
|
|
109
|
-
catch { /* ignore */ }
|
|
110
|
-
fsWatcher = null;
|
|
111
|
-
}
|
|
112
|
-
workspaceRoot = normalizedPath;
|
|
113
|
-
watcherActive = true;
|
|
114
|
-
log.info(`Workspace path set (fs.watch disabled, using tool interception only): ${workspaceRoot}`);
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* 停止工作区监听(清理状态)。
|
|
118
|
-
*/
|
|
119
|
-
export async function stopWatching() {
|
|
120
|
-
watcherActive = false;
|
|
121
|
-
if (fsWatcher) {
|
|
122
|
-
try {
|
|
123
|
-
fsWatcher.close();
|
|
124
|
-
}
|
|
125
|
-
catch { /* ignore */ }
|
|
126
|
-
fsWatcher = null;
|
|
127
|
-
}
|
|
128
|
-
// 清理 fs.watch 遗留的 pending(工具拦截走 recordAgentFileChange,不经过 pending)
|
|
129
|
-
pendingChanges.clear();
|
|
130
|
-
lastKnownContent.clear();
|
|
131
|
-
workspaceRoot = '';
|
|
132
|
-
log.info('Workspace watch stopped');
|
|
133
|
-
}
|
|
134
|
-
// ── 本地缓存辅助函数 ──────────────────────────────────────────
|
|
135
|
-
/**
|
|
136
|
-
* 生成变更缓存 key。
|
|
137
|
-
*/
|
|
138
|
-
function getCacheKey(taskInstanceId, filePath, timestamp) {
|
|
139
|
-
return createHash('sha256')
|
|
140
|
-
.update(`${taskInstanceId}:${filePath}:${timestamp}`, 'utf-8')
|
|
141
|
-
.digest('hex')
|
|
142
|
-
.slice(0, 32);
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* 获取本地缓存目录绝对路径。
|
|
146
|
-
*/
|
|
147
|
-
function getCacheDir(workspacePath) {
|
|
148
|
-
return path.join(workspacePath, CHANGE_CACHE_DIR);
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* 将 beforeContent 持久化到 bridge 本地文件系统(供 DELETE 回滚使用)。
|
|
152
|
-
*/
|
|
153
|
-
async function saveBeforeContentToCache(workspacePath, cacheKey, content) {
|
|
154
|
-
if (content === null)
|
|
155
|
-
return;
|
|
156
|
-
const cacheDir = getCacheDir(workspacePath);
|
|
157
|
-
await fs.mkdir(cacheDir, { recursive: true });
|
|
158
|
-
const cacheFile = path.join(cacheDir, `${cacheKey}.before`);
|
|
159
|
-
await fs.writeFile(cacheFile, content, 'utf-8');
|
|
160
|
-
log.debug(`Saved beforeContent cache: ${cacheFile}`);
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* 将 UPDATE 的 diff patch 持久化到 bridge 本地文件系统。
|
|
164
|
-
* 保存的是 before → after 的 forward patch,回滚时通过 reversePatch 得到反向补丁。
|
|
165
|
-
*/
|
|
166
|
-
async function saveDiffToCache(workspacePath, cacheKey, beforeContent, afterContent) {
|
|
167
|
-
const patch = Diff.createPatch('file', beforeContent, afterContent);
|
|
168
|
-
const cacheDir = getCacheDir(workspacePath);
|
|
169
|
-
await fs.mkdir(cacheDir, { recursive: true });
|
|
170
|
-
const cacheFile = path.join(cacheDir, `${cacheKey}.diff`);
|
|
171
|
-
await fs.writeFile(cacheFile, patch, 'utf-8');
|
|
172
|
-
log.debug(`Saved diff cache: ${cacheFile}`);
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* 从 bridge 本地缓存读取变更前的文件内容(供 DELETE 回滚使用)。
|
|
176
|
-
*/
|
|
177
|
-
export async function readBeforeContentFromCache(workspacePath, cacheKey) {
|
|
178
|
-
try {
|
|
179
|
-
const cacheFile = path.join(getCacheDir(workspacePath), `${cacheKey}.before`);
|
|
180
|
-
return await fs.readFile(cacheFile, 'utf-8');
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* 从 bridge 本地缓存读取 diff patch(供 UPDATE 精确回滚使用)。
|
|
188
|
-
*/
|
|
189
|
-
export async function readDiffFromCache(workspacePath, cacheKey) {
|
|
190
|
-
try {
|
|
191
|
-
const cacheFile = path.join(getCacheDir(workspacePath), `${cacheKey}.diff`);
|
|
192
|
-
return await fs.readFile(cacheFile, 'utf-8');
|
|
193
|
-
}
|
|
194
|
-
catch {
|
|
195
|
-
return null;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
// ── 内部处理 ─────────────────────────────────────────────────
|
|
199
|
-
/**
|
|
200
|
-
* 判断路径是否应被排除。
|
|
201
|
-
*/
|
|
202
|
-
function isExcluded(relativePath) {
|
|
203
|
-
const parts = relativePath.split(/[/\\]/);
|
|
204
|
-
// 检查目录排除
|
|
205
|
-
for (const part of parts.slice(0, -1)) {
|
|
206
|
-
if (EXCLUDED_DIRS.has(part))
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
// 检查文件扩展名
|
|
210
|
-
const ext = path.extname(parts[parts.length - 1]).toLowerCase();
|
|
211
|
-
if (EXCLUDED_EXT.has(ext))
|
|
212
|
-
return true;
|
|
213
|
-
return false;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* 读取文件内容,超过大小限制返回 null。
|
|
217
|
-
*/
|
|
218
|
-
async function readFileContent(filePath) {
|
|
219
|
-
try {
|
|
220
|
-
const stat = await fs.stat(filePath);
|
|
221
|
-
if (stat.size > MAX_CONTENT_SIZE) {
|
|
222
|
-
return null; // 文件太大,只记录元数据
|
|
223
|
-
}
|
|
224
|
-
return await fs.readFile(filePath, 'utf-8');
|
|
225
|
-
}
|
|
226
|
-
catch {
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* 计算内容哈希(SHA256 前 16 位)。
|
|
232
|
-
*/
|
|
233
|
-
function contentHash(content) {
|
|
234
|
-
if (content === null)
|
|
235
|
-
return null;
|
|
236
|
-
return createHash('sha256').update(content, 'utf-8').digest('hex').slice(0, 16);
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* fs.watch 事件处理(已禁用 — 变更记录仅通过 Agent 工具拦截产生)。
|
|
240
|
-
*/
|
|
241
|
-
async function handleFileEvent(_filename, _eventType) {
|
|
242
|
-
// fs.watch 已停用,所有变更记录由 recordAgentFileChange() 精确上报
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* 去抖处理文件变更。
|
|
247
|
-
*/
|
|
248
|
-
function debounceChange(relativePath, operation, fullPath) {
|
|
249
|
-
const existing = pendingChanges.get(fullPath);
|
|
250
|
-
if (existing) {
|
|
251
|
-
// 更新操作类型(DELETE 优先级最高)
|
|
252
|
-
if (operation === 'DELETE' || existing.operation === 'DELETE') {
|
|
253
|
-
existing.operation = 'DELETE';
|
|
254
|
-
}
|
|
255
|
-
else if (existing.operation === 'CREATE' && operation === 'UPDATE') {
|
|
256
|
-
// 保持 CREATE
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
existing.operation = operation;
|
|
260
|
-
}
|
|
261
|
-
// 重置定时器
|
|
262
|
-
if (existing.timer) {
|
|
263
|
-
clearTimeout(existing.timer);
|
|
264
|
-
}
|
|
265
|
-
existing.timer = setTimeout(() => {
|
|
266
|
-
flushChange(fullPath).catch(() => undefined);
|
|
267
|
-
}, DEBOUNCE_MS);
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
// 记录变更前内容(如果是 UPDATE 或 DELETE)
|
|
271
|
-
let beforeContent = null;
|
|
272
|
-
if (operation === 'UPDATE' || operation === 'DELETE') {
|
|
273
|
-
// 从 lastKnownContent 获取,如果没有则尝试读取
|
|
274
|
-
if (lastKnownContent.has(fullPath)) {
|
|
275
|
-
beforeContent = lastKnownContent.get(fullPath) ?? null;
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
// 首次见到这个文件,先记住当前内容不产生变更记录
|
|
279
|
-
readFileContent(fullPath).then((content) => {
|
|
280
|
-
if (content !== undefined) {
|
|
281
|
-
lastKnownContent.set(fullPath, content);
|
|
282
|
-
}
|
|
283
|
-
}).catch(() => undefined);
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
const pending = {
|
|
288
|
-
filePath: fullPath,
|
|
289
|
-
operation,
|
|
290
|
-
timer: null,
|
|
291
|
-
beforeContent,
|
|
292
|
-
};
|
|
293
|
-
pending.timer = setTimeout(() => {
|
|
294
|
-
flushChange(fullPath).catch(() => undefined);
|
|
295
|
-
}, DEBOUNCE_MS);
|
|
296
|
-
pendingChanges.set(fullPath, pending);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* 刷入一条变更记录。
|
|
301
|
-
*/
|
|
302
|
-
async function flushChange(fullPath) {
|
|
303
|
-
const pending = pendingChanges.get(fullPath);
|
|
304
|
-
if (!pending)
|
|
305
|
-
return;
|
|
306
|
-
pendingChanges.delete(fullPath);
|
|
307
|
-
if (pending.timer) {
|
|
308
|
-
clearTimeout(pending.timer);
|
|
309
|
-
}
|
|
310
|
-
// 如果没有活跃任务上下文,只更新 lastKnownContent 不发送
|
|
311
|
-
const ctx = activeTaskContext;
|
|
312
|
-
if (!ctx) {
|
|
313
|
-
// 更新缓存
|
|
314
|
-
if (pending.operation === 'DELETE') {
|
|
315
|
-
lastKnownContent.delete(fullPath);
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
const content = await readFileContent(fullPath);
|
|
319
|
-
if (content !== null) {
|
|
320
|
-
lastKnownContent.set(fullPath, content);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
const relativePath = path.relative(ctx.workspacePath, fullPath).replace(/\\/g, '/');
|
|
326
|
-
if (relativePath.startsWith('..'))
|
|
327
|
-
return; // 不在工作区内
|
|
328
|
-
let beforeContent = pending.beforeContent;
|
|
329
|
-
let afterContent = null;
|
|
330
|
-
if (pending.operation === 'DELETE') {
|
|
331
|
-
beforeContent = beforeContent ?? lastKnownContent.get(fullPath) ?? null;
|
|
332
|
-
afterContent = null;
|
|
333
|
-
}
|
|
334
|
-
else {
|
|
335
|
-
afterContent = await readFileContent(fullPath);
|
|
336
|
-
// 对于 CREATE,beforeContent 始终为 null
|
|
337
|
-
if (pending.operation === 'UPDATE' && beforeContent === null) {
|
|
338
|
-
beforeContent = lastKnownContent.get(fullPath) ?? null;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
// 更新缓存
|
|
342
|
-
if (pending.operation === 'DELETE') {
|
|
343
|
-
lastKnownContent.delete(fullPath);
|
|
344
|
-
}
|
|
345
|
-
else {
|
|
346
|
-
lastKnownContent.set(fullPath, afterContent);
|
|
347
|
-
}
|
|
348
|
-
const timestamp = new Date().toISOString();
|
|
349
|
-
const cacheKey = getCacheKey(ctx.taskInstanceId, relativePath, timestamp);
|
|
350
|
-
// 按操作类型保存不同的本地缓存:
|
|
351
|
-
// - UPDATE:保存 diff patch(精确回滚需要)
|
|
352
|
-
// - DELETE:保存删除前的完整内容(重建文件需要)
|
|
353
|
-
// - CREATE:不需要保存内容
|
|
354
|
-
if (pending.operation === 'UPDATE' && beforeContent !== null && afterContent !== null) {
|
|
355
|
-
await saveDiffToCache(ctx.workspacePath, cacheKey, beforeContent, afterContent);
|
|
356
|
-
}
|
|
357
|
-
else if (pending.operation === 'DELETE') {
|
|
358
|
-
await saveBeforeContentToCache(ctx.workspacePath, cacheKey, beforeContent);
|
|
359
|
-
}
|
|
360
|
-
// 发送到 server(只传元数据与 cacheKey)
|
|
361
|
-
await sendChangeRecord(ctx, {
|
|
362
|
-
workspacePath: ctx.workspacePath,
|
|
363
|
-
filePath: relativePath,
|
|
364
|
-
operation: pending.operation,
|
|
365
|
-
beforeContent,
|
|
366
|
-
afterContent,
|
|
367
|
-
beforeHash: contentHash(beforeContent),
|
|
368
|
-
afterHash: contentHash(afterContent),
|
|
369
|
-
timestamp,
|
|
370
|
-
}, cacheKey);
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* 发送文件变更记录到调度中心。
|
|
374
|
-
* beforeContent/afterContent 不再通过 HTTP 传输,仅传递 cacheKey 供后续差异回滚时本地读取。
|
|
375
|
-
*/
|
|
376
|
-
async function sendChangeRecord(ctx, record, cacheKey) {
|
|
377
|
-
try {
|
|
378
|
-
const callbackBaseUrl = resolveSchedulerBaseUrl().url;
|
|
379
|
-
const runtimeAccessToken = getRuntimeAccessToken(callbackBaseUrl) || getRuntimeAccessToken();
|
|
380
|
-
if (!runtimeAccessToken) {
|
|
381
|
-
log.warn('Cannot send change record: no auth token');
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
const metadata = JSON.stringify({
|
|
385
|
-
toolRecorded: true,
|
|
386
|
-
cacheKey,
|
|
387
|
-
timestamp: record.timestamp,
|
|
388
|
-
});
|
|
389
|
-
const response = await axios.post(`${callbackBaseUrl}/api/runtime/callback/task-file-changed`, {
|
|
390
|
-
agentId: ctx.agentId,
|
|
391
|
-
taskInstanceId: ctx.taskInstanceId,
|
|
392
|
-
taskNodeId: ctx.taskNodeId,
|
|
393
|
-
tenantId: ctx.tenantId,
|
|
394
|
-
operation: record.operation,
|
|
395
|
-
targetType: 'FILE',
|
|
396
|
-
targetPath: record.filePath,
|
|
397
|
-
beforeHash: record.beforeHash,
|
|
398
|
-
afterHash: record.afterHash,
|
|
399
|
-
metadata,
|
|
400
|
-
}, { headers: { 'X-Runtime-Token': runtimeAccessToken }, timeout: 10_000 });
|
|
401
|
-
// 检查服务端是否静默忽略了上报(如节点状态不是 PROCESSING)
|
|
402
|
-
const responseData = response.data;
|
|
403
|
-
if (responseData?.ignored === true) {
|
|
404
|
-
log.warn(`Change record ignored by server: ${record.filePath} (${record.operation}), reason: ${String(responseData.reason ?? 'unknown')}`);
|
|
405
|
-
}
|
|
406
|
-
else {
|
|
407
|
-
log.info(`Change record sent: ${record.filePath} (${record.operation})`);
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
catch (err) {
|
|
411
|
-
log.warn(`Failed to send change record: ${err.message}`);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
/**
|
|
415
|
-
* 刷新所有待处理的变更(停止监听或切换上下文时调用)。
|
|
416
|
-
*/
|
|
417
|
-
async function flushAllPendingChanges() {
|
|
418
|
-
if (flushing)
|
|
419
|
-
return;
|
|
420
|
-
flushing = true;
|
|
421
|
-
const keys = Array.from(pendingChanges.keys());
|
|
422
|
-
for (const key of keys) {
|
|
423
|
-
try {
|
|
424
|
-
await flushChange(key);
|
|
425
|
-
}
|
|
426
|
-
catch { /* ignore */ }
|
|
427
|
-
}
|
|
428
|
-
flushing = false;
|
|
429
|
-
}
|
|
430
|
-
/**
|
|
431
|
-
* 获取正在监控的文件变更数量(用于测试)。
|
|
432
|
-
*/
|
|
433
|
-
export function getPendingChangeCountForTest() {
|
|
434
|
-
return pendingChanges.size;
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* 判断工作区是否正在被监听。
|
|
438
|
-
*/
|
|
439
|
-
export function isWatching() {
|
|
440
|
-
return watcherActive && fsWatcher !== null;
|
|
441
|
-
}
|
|
442
|
-
/**
|
|
443
|
-
* 获取当前工作区路径。
|
|
444
|
-
*/
|
|
445
|
-
export function getWorkspaceRoot() {
|
|
446
|
-
return workspaceRoot;
|
|
447
|
-
}
|
|
448
|
-
// ── Agent 工具拦截上报 API ────────────────────────────────────
|
|
449
|
-
/**
|
|
450
|
-
* 由 Agent 文件操作工具直接调用,精确记录变更并上报。
|
|
451
|
-
* 仅在工具 execute 成功后调用,确保记录的都是实际发生的变更。
|
|
452
|
-
*/
|
|
453
|
-
export async function recordAgentFileChange(record) {
|
|
454
|
-
const ctx = activeTaskContext;
|
|
455
|
-
if (!ctx) {
|
|
456
|
-
log.warn(`Agent file change skipped (no active task context): ${record.filePath} (${record.operation})`);
|
|
457
|
-
return;
|
|
458
|
-
}
|
|
459
|
-
log.info(`Recording agent file change: ${record.filePath} (${record.operation}), taskNode=${ctx.taskNodeId}`);
|
|
460
|
-
const fullPath = path.join(ctx.workspacePath, record.filePath);
|
|
461
|
-
const timestamp = new Date().toISOString();
|
|
462
|
-
const cacheKey = getCacheKey(ctx.taskInstanceId, record.filePath, timestamp);
|
|
463
|
-
// 按操作类型保存本地缓存
|
|
464
|
-
if (record.operation === 'UPDATE' && record.beforeContent !== null && record.afterContent !== null) {
|
|
465
|
-
// UPDATE 同时保存 diff(精确回滚)和 beforeContent(兜底全量恢复)
|
|
466
|
-
await saveDiffToCache(ctx.workspacePath, cacheKey, record.beforeContent, record.afterContent);
|
|
467
|
-
await saveBeforeContentToCache(ctx.workspacePath, cacheKey, record.beforeContent);
|
|
468
|
-
}
|
|
469
|
-
else if (record.operation === 'DELETE') {
|
|
470
|
-
await saveBeforeContentToCache(ctx.workspacePath, cacheKey, record.beforeContent);
|
|
471
|
-
}
|
|
472
|
-
// 直接上报(不再走 fs.watch 的 pending + debounce 路径)
|
|
473
|
-
await sendChangeRecord(ctx, {
|
|
474
|
-
workspacePath: ctx.workspacePath,
|
|
475
|
-
filePath: record.filePath,
|
|
476
|
-
operation: record.operation,
|
|
477
|
-
beforeContent: record.beforeContent,
|
|
478
|
-
afterContent: record.afterContent,
|
|
479
|
-
beforeHash: contentHash(record.beforeContent),
|
|
480
|
-
afterHash: contentHash(record.afterContent),
|
|
481
|
-
timestamp,
|
|
482
|
-
}, cacheKey);
|
|
483
|
-
}
|
|
1
|
+
import{promises as l}from"node:fs";import u from"node:path";import{createHash as I}from"node:crypto";import P from"axios";import*as _ from"diff";import{createLogger as L}from"../utils/logger.js";import{resolveSchedulerBaseUrl as S}from"../config.js";import{getRuntimeAccessToken as $}from"./runtime-binding.js";const s=L("workspace-task-change-watcher"),N=new Set([".git","node_modules","__pycache__",".cache",".next","target","dist",".idea",".vscode",".agentswork-snapshots",".aws-bridge"]),H=new Set([".lock",".log",".pid",".swp",".swo",".tmp"]),b=500,R=10*1024*1024,U=".agentswork/change-cache";let r=null,m=!1,g="",h=null;const p=new Map,c=new Map;let C=!1;function z(e){r&&r.taskNodeId!==e.taskNodeId&&F().catch(()=>{}),r=e,s.info(`Task context set: agent=${e.agentId}, taskInstance=${e.taskInstanceId}, node=${e.taskNodeId}`)}function G(){r&&(s.info(`Task context cleared: agent=${r.agentId}`),F().catch(()=>{})),r=null}function J(){return r}function Z(){return r!==null}async function q(e){const t=u.resolve(e.trim());try{if(!(await l.stat(t)).isDirectory())throw new Error(`Not a directory: ${t}`)}catch{throw new Error(`Workspace path does not exist or inaccessible: ${t}`)}if(h){try{h.close()}catch{}h=null}g=t,m=!0,s.info(`Workspace path set (fs.watch disabled, using tool interception only): ${g}`)}async function Q(){if(m=!1,h){try{h.close()}catch{}h=null}p.clear(),c.clear(),g="",s.info("Workspace watch stopped")}function x(e,t,n){return I("sha256").update(`${e}:${t}:${n}`,"utf-8").digest("hex").slice(0,32)}function w(e){return u.join(e,U)}async function E(e,t,n){if(n===null)return;const a=w(e);await l.mkdir(a,{recursive:!0});const o=u.join(a,`${t}.before`);await l.writeFile(o,n,"utf-8"),s.debug(`Saved beforeContent cache: ${o}`)}async function v(e,t,n,a){const o=_.createPatch("file",n,a),i=w(e);await l.mkdir(i,{recursive:!0});const f=u.join(i,`${t}.diff`);await l.writeFile(f,o,"utf-8"),s.debug(`Saved diff cache: ${f}`)}async function V(e,t){try{const n=u.join(w(e),`${t}.before`);return await l.readFile(n,"utf-8")}catch{return null}}async function Y(e,t){try{const n=u.join(w(e),`${t}.diff`);return await l.readFile(n,"utf-8")}catch{return null}}function ee(e){const t=e.split(/[/\\]/);for(const a of t.slice(0,-1))if(N.has(a))return!0;const n=u.extname(t[t.length-1]).toLowerCase();return!!H.has(n)}async function T(e){try{return(await l.stat(e)).size>R?null:await l.readFile(e,"utf-8")}catch{return null}}function k(e){return e===null?null:I("sha256").update(e,"utf-8").digest("hex").slice(0,16)}async function te(e,t){}function ne(e,t,n){const a=p.get(n);if(a)t==="DELETE"||a.operation==="DELETE"?a.operation="DELETE":a.operation==="CREATE"&&t==="UPDATE"||(a.operation=t),a.timer&&clearTimeout(a.timer),a.timer=setTimeout(()=>{y(n).catch(()=>{})},b);else{let o=null;if(t==="UPDATE"||t==="DELETE")if(c.has(n))o=c.get(n)??null;else{T(n).then(f=>{f!==void 0&&c.set(n,f)}).catch(()=>{});return}const i={filePath:n,operation:t,timer:null,beforeContent:o};i.timer=setTimeout(()=>{y(n).catch(()=>{})},b),p.set(n,i)}}async function y(e){const t=p.get(e);if(!t)return;p.delete(e),t.timer&&clearTimeout(t.timer);const n=r;if(!n){if(t.operation==="DELETE")c.delete(e);else{const D=await T(e);D!==null&&c.set(e,D)}return}const a=u.relative(n.workspacePath,e).replace(/\\/g,"/");if(a.startsWith(".."))return;let o=t.beforeContent,i=null;t.operation==="DELETE"?(o=o??c.get(e)??null,i=null):(i=await T(e),t.operation==="UPDATE"&&o===null&&(o=c.get(e)??null)),t.operation==="DELETE"?c.delete(e):c.set(e,i);const f=new Date().toISOString(),d=x(n.taskInstanceId,a,f);t.operation==="UPDATE"&&o!==null&&i!==null?await v(n.workspacePath,d,o,i):t.operation==="DELETE"&&await E(n.workspacePath,d,o),await A(n,{workspacePath:n.workspacePath,filePath:a,operation:t.operation,beforeContent:o,afterContent:i,beforeHash:k(o),afterHash:k(i),timestamp:f},d)}async function A(e,t,n){try{const a=S().url,o=$(a)||$();if(!o){s.warn("Cannot send change record: no auth token");return}const i=JSON.stringify({toolRecorded:!0,cacheKey:n,timestamp:t.timestamp}),d=(await P.post(`${a}/api/runtime/callback/task-file-changed`,{agentId:e.agentId,taskInstanceId:e.taskInstanceId,taskNodeId:e.taskNodeId,tenantId:e.tenantId,operation:t.operation,targetType:"FILE",targetPath:t.filePath,beforeHash:t.beforeHash,afterHash:t.afterHash,metadata:i},{headers:{"X-Runtime-Token":o},timeout:1e4})).data;d?.ignored===!0?s.warn(`Change record ignored by server: ${t.filePath} (${t.operation}), reason: ${String(d.reason??"unknown")}`):s.info(`Change record sent: ${t.filePath} (${t.operation})`)}catch(a){s.warn(`Failed to send change record: ${a.message}`)}}async function F(){if(C)return;C=!0;const e=Array.from(p.keys());for(const t of e)try{await y(t)}catch{}C=!1}function ae(){return p.size}function oe(){return m&&h!==null}function ie(){return g}async function se(e){const t=r;if(!t){s.warn(`Agent file change skipped (no active task context): ${e.filePath} (${e.operation})`);return}s.info(`Recording agent file change: ${e.filePath} (${e.operation}), taskNode=${t.taskNodeId}`);const n=u.join(t.workspacePath,e.filePath),a=new Date().toISOString(),o=x(t.taskInstanceId,e.filePath,a);e.operation==="UPDATE"&&e.beforeContent!==null&&e.afterContent!==null?(await v(t.workspacePath,o,e.beforeContent,e.afterContent),await E(t.workspacePath,o,e.beforeContent)):e.operation==="DELETE"&&await E(t.workspacePath,o,e.beforeContent),await A(t,{workspacePath:t.workspacePath,filePath:e.filePath,operation:e.operation,beforeContent:e.beforeContent,afterContent:e.afterContent,beforeHash:k(e.beforeContent),afterHash:k(e.afterContent),timestamp:a},o)}export{G as clearTaskContext,ae as getPendingChangeCountForTest,J as getTaskContext,ie as getWorkspaceRoot,Z as hasActiveTask,oe as isWatching,V as readBeforeContentFromCache,Y as readDiffFromCache,se as recordAgentFileChange,z as setTaskContext,q as startWatching,Q as stopWatching};
|
|
2
|
+
|
package/dist/types.d.ts
CHANGED
package/dist/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
@@ -14,4 +14,3 @@ export declare function toSdkAppsFromEnabledTools(enabledTools: string[]): AppFl
|
|
|
14
14
|
export declare function resolveSkillSourceDir(skill: Skill): string;
|
|
15
15
|
export declare function ensureDirectoryExists(directoryPath: string): Promise<void>;
|
|
16
16
|
export declare function installSkillPackageToSdk(sdk: CcSwitchSdk, skillPackage: SkillPackage, skillDir: string, sdkApps: AppFlags): Promise<InstalledSkill | null>;
|
|
17
|
-
//# sourceMappingURL=file-utils.d.ts.map
|