aws-runtime-bridge 1.9.175 → 1.9.179
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +188 -0
- package/README.md +61 -2
- package/dist/adapter/AcodeSdkAdapter.d.ts +369 -0
- package/dist/adapter/AcodeSdkAdapter.js +2 -2
- package/dist/adapter/AdapterRegistry.d.ts +28 -0
- package/dist/adapter/ClaudeSdkAdapter.d.ts +71 -0
- package/dist/adapter/CodexSdkAdapter.d.ts +14 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts +44 -0
- package/dist/adapter/acode-tool-names.d.ts +9 -0
- package/dist/adapter/idle-poll-loop.d.ts +20 -0
- package/dist/adapter/index.d.ts +3 -0
- package/dist/adapter/instance-ai-config-resolver.d.ts +20 -0
- package/dist/adapter/prompts.d.ts +12 -0
- package/dist/adapter/types.d.ts +182 -0
- package/dist/browser/browser-bootstrap.d.ts +15 -0
- package/dist/browser/browser-connect-token.d.ts +11 -0
- package/dist/browser/browser-frame-encode.d.ts +32 -0
- package/dist/browser/browser-pool.d.ts +129 -0
- package/dist/browser/browser-profile-store.d.ts +41 -0
- package/dist/browser/browser-ws-bridge.d.ts +20 -0
- package/dist/browser/built-in-browser-tools.d.ts +44 -0
- package/dist/browser/element-locator.d.ts +25 -0
- package/dist/browser/element-picker.d.ts +30 -0
- package/dist/browser/frame-encode.d.ts +19 -0
- package/dist/browser/input-dispatcher.d.ts +35 -0
- package/dist/browser/listener-store.d.ts +44 -0
- package/dist/browser/page-listener-manager.d.ts +88 -0
- package/dist/browser/page-listener-types.d.ts +38 -0
- package/dist/browser/screencast-differ.d.ts +10 -0
- package/dist/browser/screencast-manager.d.ts +94 -0
- package/dist/browser/snapshot-serializer.d.ts +56 -0
- package/dist/browser/ssrf-guard.d.ts +44 -0
- package/dist/browser/stealth.d.ts +21 -0
- package/dist/browser/step-archive.d.ts +13 -0
- package/dist/browser/types.d.ts +100 -0
- package/dist/browser/ws-server.d.ts +54 -0
- package/dist/config.d.ts +138 -2
- package/dist/config.js +2 -2
- package/dist/desktop/built-in-desktop-tools.d.ts +68 -0
- package/dist/desktop/built-in-desktop-tools.js +2 -1
- package/dist/desktop/desktop-control.d.ts +142 -0
- package/dist/desktop/desktop-control.js +2 -0
- package/dist/desktop/desktop-mcp-client.d.ts +28 -0
- package/dist/desktop/desktop-staleness.d.ts +66 -0
- package/dist/desktop/desktop-staleness.js +2 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1 -1
- package/dist/middleware/auth.d.ts +26 -0
- package/dist/middleware/auth.js +1 -1
- package/dist/remote-desktop/computer-control.d.ts +3 -0
- package/dist/remote-desktop/coords.d.ts +6 -0
- package/dist/remote-desktop/frame-backpressure.d.ts +10 -0
- package/dist/remote-desktop/frame-encode.d.ts +3 -0
- package/dist/remote-desktop/index.js +2 -2
- package/dist/remote-desktop/input-dispatcher.d.ts +4 -0
- package/dist/remote-desktop/permission-manager.d.ts +3 -0
- package/dist/remote-desktop/screen-capture.d.ts +91 -0
- package/dist/remote-desktop/session-manager.d.ts +47 -0
- package/dist/remote-desktop/session-manager.js +1 -1
- package/dist/remote-desktop/system-backend.d.ts +64 -0
- package/dist/remote-desktop/types.d.ts +25 -0
- package/dist/remote-desktop/ui-automation.d.ts +11 -0
- package/dist/remote-desktop/win32-api.d.ts +10 -0
- package/dist/routes/acode-todos.d.ts +13 -0
- package/dist/routes/agent-state.d.ts +15 -0
- package/dist/routes/ai-sources.js +1 -1
- package/dist/routes/background-tasks.d.ts +18 -0
- package/dist/routes/background-tasks.js +2 -2
- package/dist/routes/browser-listeners.d.ts +17 -0
- package/dist/routes/browser-sessions.d.ts +10 -0
- package/dist/routes/capabilities.js +1 -1
- package/dist/routes/dashboard-icon.d.ts +9 -0
- package/dist/routes/dashboard-icon.js +2 -0
- package/dist/routes/dashboard-theme.d.ts +24 -0
- package/dist/routes/dashboard-theme.js +157 -0
- package/dist/routes/dashboard.d.ts +9 -0
- package/dist/routes/dashboard.js +1988 -625
- package/dist/routes/debug-mount.d.ts +16 -0
- package/dist/routes/desktop-control.d.ts +15 -0
- package/dist/routes/desktop-control.js +2 -0
- package/dist/routes/events.d.ts +4 -0
- package/dist/routes/file-browser.d.ts +11 -0
- package/dist/routes/file-change-diff.d.ts +25 -0
- package/dist/routes/file-diff-rollback.d.ts +28 -0
- package/dist/routes/file-snapshot.d.ts +7 -0
- package/dist/routes/git.d.ts +143 -0
- package/dist/routes/instance-tool-status.d.ts +5 -0
- package/dist/routes/instance.d.ts +8 -0
- package/dist/routes/instance.js +1 -1
- package/dist/routes/jdks.d.ts +4 -0
- package/dist/routes/launch.d.ts +5 -0
- package/dist/routes/lsp-providers.d.ts +11 -0
- package/dist/routes/lsp-providers.js +2 -0
- package/dist/routes/lsp.d.ts +41 -0
- package/dist/routes/lsp.js +4 -2
- package/dist/routes/mcp-extra.d.ts +15 -0
- package/dist/routes/mcp.d.ts +16 -0
- package/dist/routes/mcp.js +1 -1
- package/dist/routes/plugins.d.ts +19 -0
- package/dist/routes/plugins.js +1 -1
- package/dist/routes/processes.d.ts +4 -0
- package/dist/routes/properties.d.ts +4 -0
- package/dist/routes/pty.d.ts +29 -0
- package/dist/routes/runtime-binding.d.ts +3 -0
- package/dist/routes/sessions.d.ts +22 -0
- package/dist/routes/skills.d.ts +15 -0
- package/dist/routes/skills.js +1 -1
- package/dist/routes/sub-agents.d.ts +11 -0
- package/dist/routes/sub-agents.js +1 -1
- package/dist/routes/task-context.d.ts +5 -0
- package/dist/routes/tech-stack.d.ts +4 -0
- package/dist/routes/terminal.d.ts +122 -0
- package/dist/routes/terminal.js +16 -16
- package/dist/routes/workspace-index.d.ts +12 -0
- package/dist/routes/workspace-index.js +2 -0
- package/dist/routes/yml.d.ts +4 -0
- package/dist/scripts/migrate-user-scopes.d.ts +26 -0
- package/dist/scripts/migrate-user-scopes.js +2 -0
- package/dist/services/access-control.d.ts +21 -0
- package/dist/services/acode-bg-manager.d.ts +21 -0
- package/dist/services/acode-package.d.ts +10 -0
- package/dist/services/acode-package.js +1 -1
- package/dist/services/agent-capability-sync.d.ts +26 -0
- package/dist/services/agent-capability-sync.js +1 -1
- package/dist/services/agent-event-store.d.ts +20 -0
- package/dist/services/agent-ownership.d.ts +58 -0
- package/dist/services/agent-ownership.js +3 -0
- package/dist/services/agent-process-manager.d.ts +154 -0
- package/dist/services/agent-pty-manager.d.ts +37 -0
- package/dist/services/agent-startup-memory.d.ts +34 -0
- package/dist/services/agent-startup-memory.js +1 -1
- package/dist/services/ai-config-service.d.ts +26 -52
- package/dist/services/ai-config-service.js +1 -3
- package/dist/services/ai-source-apply.d.ts +7 -15
- package/dist/services/ai-source-apply.js +1 -1
- package/dist/services/auto-register.d.ts +165 -1
- package/dist/services/auto-register.js +1 -1
- package/dist/services/aws-client-agent-mcp.d.ts +14 -0
- package/dist/services/aws-client-agent-mcp.js +2 -2
- package/dist/services/bridge-package-publish-hooks.d.ts +14 -0
- package/dist/services/bridge-pairing.d.ts +82 -0
- package/dist/services/bridge-pairing.js +2 -0
- package/dist/services/bridge-temp-files.d.ts +29 -0
- package/dist/services/browser-session-manager.d.ts +71 -0
- package/dist/services/capability-config.d.ts +60 -15
- package/dist/services/capability-config.js +2 -2
- package/dist/services/change-cache-retention.d.ts +9 -0
- package/dist/services/changelog.d.ts +9 -0
- package/dist/services/cli-commands.d.ts +82 -0
- package/dist/services/cli-commands.js +6 -6
- package/dist/services/connection-key-rotation.d.ts +27 -0
- package/dist/services/connection-key-rotation.js +2 -0
- package/dist/services/debug-mount.d.ts +49 -0
- package/dist/services/desktop-mcp-manager.d.ts +103 -1
- package/dist/services/desktop-mcp-manager.js +1 -1
- package/dist/services/event-delta-pusher.d.ts +15 -0
- package/dist/services/fileSnapshotStore.d.ts +33 -0
- package/dist/services/gitignore.d.ts +9 -0
- package/dist/services/instance-ai-config-service.d.ts +9 -0
- package/dist/services/instance-ai-config-service.js +1 -1
- package/dist/services/instance-features.d.ts +127 -0
- package/dist/services/instance-features.js +1 -1
- package/dist/services/instance-init-service.d.ts +3 -0
- package/dist/services/instance-init-service.js +1 -1
- package/dist/services/instance-state.d.ts +23 -0
- package/dist/services/jdk-scanner.d.ts +15 -0
- package/dist/services/launch-manager.d.ts +138 -0
- package/dist/services/launch-metrics.d.ts +42 -0
- package/dist/services/launch-streams.d.ts +19 -0
- package/dist/services/lifecycle-state.d.ts +5 -0
- package/dist/services/log-retention.d.ts +38 -0
- package/dist/services/lsp/install-manager.d.ts +55 -0
- package/dist/services/lsp/install-manager.js +2 -0
- package/dist/services/lsp/provider-registry.d.ts +108 -0
- package/dist/services/lsp/provider-registry.js +2 -0
- package/dist/services/lsp/uri-rewrite.d.ts +44 -0
- package/dist/services/lsp/uri-rewrite.js +2 -0
- package/dist/services/lsp-stdio-bridge.d.ts +41 -4
- package/dist/services/lsp-stdio-bridge.js +3 -3
- package/dist/services/mcp-deploy.d.ts +45 -4
- package/dist/services/mcp-deploy.js +4 -4
- package/dist/services/mcp-env-injector.d.ts +52 -0
- package/dist/services/mcp-launch-binding-queue.d.ts +12 -0
- package/dist/services/mcp-package.d.ts +22 -0
- package/dist/services/mcp-package.js +1 -1
- package/dist/services/mcp-probe-client.d.ts +19 -0
- package/dist/services/mcp-probe-client.js +1 -1
- package/dist/services/open-doc-events.d.ts +22 -0
- package/dist/services/open-doc-registry.d.ts +35 -0
- package/dist/services/orphan-monitor.d.ts +43 -0
- package/dist/services/panel-auth.d.ts +24 -0
- package/dist/services/panel-env.d.ts +28 -0
- package/dist/services/plugin-deployment.d.ts +34 -1
- package/dist/services/plugin-deployment.js +2 -2
- package/dist/services/plugin-event-buffer.d.ts +21 -0
- package/dist/services/plugin-fs.d.ts +11 -0
- package/dist/services/plugin-handler-adapter.d.ts +13 -0
- package/dist/services/plugin-listener-runner.d.ts +10 -0
- package/dist/services/plugin-loader.d.ts +15 -0
- package/dist/services/plugin-manager.d.ts +95 -9
- package/dist/services/plugin-manager.js +4 -4
- package/dist/services/plugin-manifest.d.ts +14 -0
- package/dist/services/plugin-package.d.ts +13 -0
- package/dist/services/plugin-runtime.d.ts +15 -0
- package/dist/services/port-detector.d.ts +15 -0
- package/dist/services/process-detail.d.ts +3 -0
- package/dist/services/process-detector.d.ts +132 -0
- package/dist/services/process-registry.d.ts +120 -0
- package/dist/services/process-top.d.ts +6 -0
- package/dist/services/request-identity.d.ts +77 -0
- package/dist/services/request-identity.js +2 -0
- package/dist/services/request-invalid-dump.d.ts +4 -0
- package/dist/services/ring-buffer.d.ts +33 -0
- package/dist/services/runtime-binding.d.ts +56 -4
- package/dist/services/runtime-binding.js +4 -4
- package/dist/services/runtime-lifecycle-policy.d.ts +17 -0
- package/dist/services/runtime-resources-snapshot.d.ts +26 -0
- package/dist/services/sdk-tool-file-change-recorder.d.ts +9 -0
- package/dist/services/session-output.d.ts +63 -0
- package/dist/services/session-output.js +3 -3
- package/dist/services/skill-manager.d.ts +42 -5
- package/dist/services/skill-manager.js +3 -3
- package/dist/services/snapshot-retention.d.ts +23 -0
- package/dist/services/startup-config-wizard.d.ts +7 -1
- package/dist/services/startup-config-wizard.js +10 -10
- package/dist/services/system-metrics.d.ts +3 -0
- package/dist/services/tech-stack-scanner.d.ts +12 -0
- package/dist/services/terminal-persistence.d.ts +43 -0
- package/dist/services/tool-installer.d.ts +12 -0
- package/dist/services/tunnel-client.d.ts +57 -2
- package/dist/services/tunnel-client.js +1 -1
- package/dist/services/update-log.d.ts +6 -0
- package/dist/services/update-notifier.d.ts +17 -0
- package/dist/services/update-notifier.js +2 -2
- package/dist/services/user-scope.d.ts +115 -0
- package/dist/services/user-scope.js +2 -0
- package/dist/services/windows-service-manager.d.ts +12 -0
- package/dist/services/workspace-files.d.ts +64 -0
- package/dist/services/workspace-index/index-manager.d.ts +46 -0
- package/dist/services/workspace-index/index-manager.js +2 -0
- package/dist/services/workspace-index/indexer.d.ts +15 -0
- package/dist/services/workspace-index/indexer.js +2 -0
- package/dist/services/workspace-index/query.d.ts +74 -0
- package/dist/services/workspace-index/query.js +5 -0
- package/dist/services/workspace-index/resolver.d.ts +26 -0
- package/dist/services/workspace-index/resolver.js +2 -0
- package/dist/services/workspace-index/types.d.ts +89 -0
- package/dist/services/workspace-index/types.js +2 -0
- package/dist/services/workspace-watch.d.ts +4 -0
- package/dist/services/workspaceTaskChangeWatcher.d.ts +49 -0
- package/dist/services/workspaceTaskChangeWatcher.js +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/utils/config-write-queue.d.ts +11 -0
- package/dist/utils/env-safety.d.ts +21 -0
- package/dist/utils/file-utils.d.ts +15 -0
- package/dist/utils/instance-ai-config-debug-logger.d.ts +15 -0
- package/dist/utils/lifecycle-log.d.ts +5 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.js +2 -1
- package/dist/utils/npm-version.d.ts +10 -0
- package/dist/utils/path-utils.d.ts +12 -0
- package/dist/utils/scheduler-url.d.ts +18 -0
- package/dist/utils/scheduler-url.js +2 -0
- package/dist/utils/sdk-package-loader.d.ts +13 -0
- package/dist/utils/sdk-package-loader.js +1 -1
- package/dist/utils/target-identity.d.ts +31 -0
- package/dist/utils/target-identity.js +2 -0
- package/dist/utils/validation.d.ts +17 -0
- package/dist/utils/yaml-utils.d.ts +48 -0
- package/package/acode/dist/__tests__/summary-request-helper.d.ts +10 -0
- package/package/acode/dist/ask-user-question-tool.d.ts +17 -0
- package/package/acode/dist/await-complete-tool.d.ts +12 -0
- package/package/acode/dist/background-command-manager.d.ts +105 -0
- package/package/acode/dist/background-command-store.d.ts +27 -0
- package/package/acode/dist/background-command-tools.d.ts +8 -0
- package/package/acode/dist/background-output-ringbuffer.d.ts +15 -0
- package/package/acode/dist/built-in-file-tools.d.ts +65 -0
- package/package/acode/dist/built-in-symbols-tool.d.ts +3 -0
- package/package/acode/dist/builtins/commandArtifacts.d.ts +3 -0
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts +17 -0
- package/package/acode/dist/builtins/shellCommandRunner.d.ts +4 -0
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts +15 -0
- package/package/acode/dist/cache-control.d.ts +45 -0
- package/package/acode/dist/commands/commandLoader.d.ts +3 -0
- package/package/acode/dist/commands/commandParser.d.ts +3 -0
- package/package/acode/dist/commands/commandRegistry.d.ts +3 -0
- package/package/acode/dist/compaction.d.ts +354 -0
- package/package/acode/dist/config.d.ts +3 -0
- package/package/acode/dist/context-overflow.d.ts +32 -0
- package/package/acode/dist/fs-utils.d.ts +18 -0
- package/package/acode/dist/hooks/hookBus.d.ts +3 -0
- package/package/acode/dist/image-utils.d.ts +35 -0
- package/package/acode/dist/index.d.ts +1 -0
- package/package/acode/dist/index.js +1 -1
- package/package/acode/dist/mcpToolNames.d.ts +32 -0
- package/package/acode/dist/microcompact.d.ts +53 -0
- package/package/acode/dist/parsers/ast-cache.d.ts +41 -0
- package/package/acode/dist/parsers/file-index.d.ts +83 -0
- package/package/acode/dist/parsers/file-index.js +4 -0
- package/package/acode/dist/parsers/language-detector.d.ts +4 -0
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts +12 -0
- package/package/acode/dist/parsers/types.d.ts +11 -0
- package/package/acode/dist/paths.d.ts +14 -0
- package/package/acode/dist/plugin-types.d.ts +34 -0
- package/package/acode/dist/read-file-state.d.ts +15 -0
- package/package/acode/dist/runtime-environment.d.ts +16 -0
- package/package/acode/dist/runtime.d.ts +824 -9
- package/package/acode/dist/runtime.js +21 -21
- package/package/acode/dist/skill-tool.d.ts +20 -0
- package/package/acode/dist/sub-agent-manager.d.ts +169 -0
- package/package/acode/dist/sub-agent-manager.js +1 -1
- package/package/acode/dist/sub-agent-store.d.ts +50 -0
- package/package/acode/dist/sub-agent-tools.d.ts +15 -0
- package/package/acode/dist/sub-agent-types.d.ts +13 -0
- package/package/acode/dist/terminal-tool.d.ts +15 -0
- package/package/acode/dist/terminal-types.d.ts +10 -0
- package/package/acode/dist/todo-store.d.ts +15 -0
- package/package/acode/dist/token-estimator.d.ts +17 -0
- package/package/acode/dist/tool-allocation.d.ts +113 -0
- package/package/acode/dist/tool-concurrency/index.d.ts +8 -0
- package/package/acode/dist/tool-concurrency/observability.d.ts +32 -0
- package/package/acode/dist/tool-concurrency/resource-lock.d.ts +30 -0
- package/package/acode/dist/tool-concurrency/scheduler.d.ts +19 -0
- package/package/acode/dist/tool-concurrency/types.d.ts +57 -0
- package/package/acode/dist/tool-group-manager.d.ts +195 -0
- package/package/acode/dist/tool-group-manager.js +4 -4
- package/package/acode/dist/types.d.ts +179 -0
- package/package/aws-client-agent-mcp/README.md +130 -215
- package/package/aws-client-agent-mcp/dist/ability-market-tools.d.ts +57 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +277 -3
- package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts +18 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +70 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +61 -0
- package/package/aws-client-agent-mcp/dist/index.d.ts +10 -0
- package/package/aws-client-agent-mcp/dist/logger.d.ts +24 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +606 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +4 -4
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +158 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +38 -22
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +81 -0
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +18 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +86 -0
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +24 -0
- package/package/aws-client-agent-mcp/dist/office/office-equation.d.ts +19 -0
- package/package/aws-client-agent-mcp/dist/office/office-image.d.ts +18 -0
- package/package/aws-client-agent-mcp/dist/office/office-workspace.d.ts +29 -0
- package/package/aws-client-agent-mcp/dist/parent-lifecycle.d.ts +18 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +6 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +4 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +41 -0
- package/package/aws-client-agent-mcp/dist/tool-groups.d.ts +136 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts +123 -0
- package/package/aws-client-agent-mcp/dist/watchdog.d.ts +7 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +108 -0
- package/package.json +1 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Router as i}from"express";import{broadcastControlState as p,getControlState as u,getRecentActions as c,setPaused as g}from"../desktop/desktop-control.js";import{validateToken as n}from"../middleware/auth.js";import{createLogger as m}from"../utils/logger.js";const f=m("desktop-control"),a=i();a.post("/desktop-control/:agentId/pause",n,(r,o)=>{const t=String(r.params.agentId??"").trim();if(!t){o.status(400).json({ok:!1,error:"agentId is required"});return}const e=r.body??{};if(typeof e.paused!="boolean"){o.status(400).json({ok:!1,error:"paused (boolean) is required"});return}const s=typeof e.by=="string"&&e.by.trim()?e.by.trim():"dashboard",d=g(t,e.paused,s);p(t),f.info(`[desktop-control] ${e.paused?"paused":"resumed"} by ${s} for ${t}`),o.json({ok:!0,agentId:t,state:d})}),a.get("/desktop-control/:agentId/state",n,(r,o)=>{const t=String(r.params.agentId??"").trim();if(!t){o.status(400).json({ok:!1,error:"agentId is required"});return}o.json({ok:!0,agentId:t,state:u(t),recentActions:c(t)})});export{a as desktopControlRouter};
|
|
2
|
+
|
package/dist/routes/events.d.ts
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
2
6
|
import multer from 'multer';
|
|
3
7
|
export declare const fileBrowserRouter: import("express-serve-static-core").Router;
|
|
4
8
|
export declare const WORKSPACE_UPLOAD_FILE_LIMIT = 2000;
|
|
5
9
|
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
6
15
|
export declare const WORKSPACE_UPLOAD_MAX_FILE_SIZE_BYTES: number;
|
|
7
16
|
interface FileBrowserItem {
|
|
8
17
|
name: string;
|
|
@@ -32,6 +41,8 @@ export declare function createWorkspaceUploadLimitResponse(error: multer.MulterE
|
|
|
32
41
|
};
|
|
33
42
|
export declare function parseWorkspaceUploadRelativePaths(body: Record<string, unknown>): string[];
|
|
34
43
|
|
|
44
|
+
|
|
45
|
+
|
|
35
46
|
export declare function listHostDirectoryTree(requestPath?: string): Promise<DirectoryTreeResponse>;
|
|
36
47
|
|
|
37
48
|
export { isIgnoredByGitIgnore, loadGitIgnoreRules, parseGitIgnoreRules, type GitIgnoreRule, } from '../services/gitignore.js';
|
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
2
17
|
export declare const fileChangeDiffRouter: import("express-serve-static-core").Router;
|
|
3
18
|
|
|
4
19
|
export type ChangeDiffLineType = 'hunk' | 'context' | 'add' | 'remove';
|
|
@@ -22,6 +37,16 @@ export interface ChangeDiffResponse {
|
|
|
22
37
|
error?: string;
|
|
23
38
|
}
|
|
24
39
|
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
25
44
|
export declare function parseDiffPatchLines(patch: string): ChangeDiffLine[];
|
|
26
45
|
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
27
52
|
export declare function buildChangeDiffResponse(workspacePath: string, cacheKey: string | null | undefined, operation: string, filePath: string): Promise<ChangeDiffResponse>;
|
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
1
21
|
|
|
2
22
|
export declare const fileDiffRollbackRouter: import("express-serve-static-core").Router;
|
|
3
23
|
export interface ReverseOperation {
|
|
@@ -14,6 +34,11 @@ export interface DiffRollbackRequest {
|
|
|
14
34
|
workspacePath: string;
|
|
15
35
|
operations: ReverseOperation[];
|
|
16
36
|
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
17
42
|
skipFailed?: boolean;
|
|
18
43
|
}
|
|
19
44
|
|
|
@@ -35,6 +60,9 @@ export interface DiffRollbackResult {
|
|
|
35
60
|
|
|
36
61
|
previewFailed?: boolean;
|
|
37
62
|
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
38
66
|
partial?: boolean;
|
|
39
67
|
|
|
40
68
|
details: OperationDetail[];
|
package/dist/routes/git.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
2
6
|
export declare const gitRouter: import("express-serve-static-core").Router;
|
|
3
7
|
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
4
11
|
export declare function resolveGitCommandTimeoutMs(): number;
|
|
5
12
|
interface GitRepositoryContext {
|
|
6
13
|
workspacePath: string;
|
|
@@ -40,8 +47,13 @@ interface GitCommitItem {
|
|
|
40
47
|
isRemote: boolean;
|
|
41
48
|
}
|
|
42
49
|
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
43
53
|
export declare function resolveCommitPageLimit(rawLimit: unknown, graphMode: boolean): number;
|
|
44
54
|
|
|
55
|
+
|
|
56
|
+
|
|
45
57
|
export declare function resolveCommitPageSkip(rawSkip: unknown): number;
|
|
46
58
|
|
|
47
59
|
export interface CommitPageResult<T> {
|
|
@@ -50,6 +62,10 @@ export interface CommitPageResult<T> {
|
|
|
50
62
|
nextSkip: number;
|
|
51
63
|
}
|
|
52
64
|
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
53
69
|
export declare function sliceCommitPage<T>(fetched: T[], limit: number, skip: number): CommitPageResult<T>;
|
|
54
70
|
interface GitCommitLogQuery {
|
|
55
71
|
|
|
@@ -62,9 +78,18 @@ interface GitCommitLogQuery {
|
|
|
62
78
|
|
|
63
79
|
relativeWorkspacePath: string;
|
|
64
80
|
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
65
84
|
graphHeadRef?: string | null;
|
|
66
85
|
}
|
|
67
86
|
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
68
93
|
export declare function buildGitCommitLogArgs(query: GitCommitLogQuery): string[];
|
|
69
94
|
export interface GitBranchItem {
|
|
70
95
|
|
|
@@ -78,11 +103,20 @@ export interface GitBranchItem {
|
|
|
78
103
|
upstream: string;
|
|
79
104
|
}
|
|
80
105
|
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
81
109
|
export declare function shouldIncludeGitDiffSummaryFile(status: GitDiffFileStatus, additions: number, deletions: number, isBinaryDiff: boolean): boolean;
|
|
82
110
|
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
83
114
|
export declare function isGitStashMissingInitialCommitError(output: string): boolean;
|
|
84
115
|
export declare function createMissingInitialCommitSnapshotError(): string;
|
|
85
116
|
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
86
120
|
export declare function isGitStashNoChangesOutput(output: string): boolean;
|
|
87
121
|
interface LatestGitStash {
|
|
88
122
|
ref: string;
|
|
@@ -90,39 +124,88 @@ interface LatestGitStash {
|
|
|
90
124
|
message: string;
|
|
91
125
|
}
|
|
92
126
|
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
93
130
|
export declare function createAgentsWorkStashSnapshotRef(stashRef: string): string | null;
|
|
94
131
|
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
95
135
|
export declare function parseGitStashListLine(line: string): GitStashItem | null;
|
|
96
136
|
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
97
140
|
export declare function parseLatestGitStash(output: string): LatestGitStash | null;
|
|
98
141
|
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
99
145
|
export declare function resolveGitPushTimeoutMs(): number;
|
|
100
146
|
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
101
150
|
export declare function persistAgentsWorkStashSnapshotRef(workspacePath: string, stashRef: string): Promise<string | null>;
|
|
102
151
|
|
|
152
|
+
|
|
153
|
+
|
|
103
154
|
export declare function parseGitStatusStagedPaths(output: string): Set<string>;
|
|
104
155
|
|
|
156
|
+
|
|
157
|
+
|
|
105
158
|
export declare function parseGitDiffSummary(nameStatusOutput: string, numstatOutput: string, stagedPaths?: Set<string>, forceStaged?: boolean): GitDiffSummaryFile[];
|
|
106
159
|
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
107
163
|
export declare function parseGitStatusUntrackedPaths(output: string): string[];
|
|
108
164
|
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
109
169
|
export declare function countUntrackedFileAdditions(content: string): number;
|
|
110
170
|
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
111
174
|
export declare function collectUntrackedFiles(repoRootPath: string, untrackedPaths: string[], existingFilePaths: Set<string>, maxDepth?: number): Promise<GitDiffSummaryFile[]>;
|
|
112
175
|
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
|
|
113
179
|
export declare function mergeGitDiffSummaryFiles(unstagedFiles: GitDiffSummaryFile[], stagedFiles: GitDiffSummaryFile[]): GitDiffSummaryFile[];
|
|
114
180
|
export declare function normalizeGitCommitMessage(message: unknown): string;
|
|
115
181
|
export declare function createScopedGitPathspecArgs(context: Pick<GitRepositoryContext, 'relativeWorkspacePath'>): string[];
|
|
116
182
|
export declare function createScopedFilePathspecArgs(filePath: string, context: Pick<GitRepositoryContext, 'relativeWorkspacePath'>): string[];
|
|
117
183
|
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
|
|
118
188
|
export declare function parseGitCommitLog(output: string): Omit<GitCommitItem, 'isRemote'>[];
|
|
119
189
|
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
120
194
|
export declare function resolveRemoteCommitHashes(repoRootPath: string): Promise<Set<string>>;
|
|
121
195
|
|
|
196
|
+
|
|
197
|
+
|
|
122
198
|
export declare function resolveCurrentBranchName(repoRootPath: string): Promise<string>;
|
|
123
199
|
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
|
|
124
203
|
export declare function listGitBranches(repoRootPath: string): Promise<GitBranchItem[]>;
|
|
125
204
|
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
|
|
126
209
|
export declare function buildCommitDiffBaseArgs(commitHash: string, aggregate: boolean): string[];
|
|
127
210
|
export interface GitPushResult {
|
|
128
211
|
branch: string;
|
|
@@ -131,6 +214,10 @@ export interface GitPushResult {
|
|
|
131
214
|
output: string;
|
|
132
215
|
}
|
|
133
216
|
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
134
221
|
export declare function pushBranchToRemote(repoRootPath: string): Promise<GitPushResult>;
|
|
135
222
|
export interface GitStashSnapshotResult {
|
|
136
223
|
|
|
@@ -142,12 +229,22 @@ export interface GitStashSnapshotResult {
|
|
|
142
229
|
message: string;
|
|
143
230
|
}
|
|
144
231
|
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
|
|
145
236
|
export declare function createGitStashSnapshot(workspacePath: string, message?: string): Promise<GitStashSnapshotResult>;
|
|
146
237
|
export interface GitCommitOutcome {
|
|
147
238
|
committedPaths: string[];
|
|
148
239
|
output: string;
|
|
149
240
|
}
|
|
150
241
|
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
|
|
151
248
|
export declare function commitSelectedFiles(repoRootPath: string, message: string, pathspecs: string[]): Promise<GitCommitOutcome>;
|
|
152
249
|
export type GitResetMode = 'soft' | 'hard';
|
|
153
250
|
export interface GitResetPreview {
|
|
@@ -163,17 +260,63 @@ export interface GitResetPreview {
|
|
|
163
260
|
affectsRemote: boolean;
|
|
164
261
|
}
|
|
165
262
|
|
|
263
|
+
|
|
264
|
+
|
|
166
265
|
export declare function previewRepositoryReset(repoRootPath: string, commitHash: string, mode: GitResetMode): Promise<GitResetPreview>;
|
|
167
266
|
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
|
|
168
276
|
export declare function resetRepositoryTo(repoRootPath: string, commitHash: string, mode: GitResetMode, cleanScopePath?: string): Promise<GitResetPreview>;
|
|
169
277
|
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
|
|
170
290
|
export declare function sanitizeCommitMessage(raw: string): string;
|
|
171
291
|
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
|
|
172
295
|
export declare function extractOpenAiStreamDelta(chunkText: string): string;
|
|
173
296
|
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
|
|
174
300
|
export declare function debugAiStreamChunk(chunkText: string, index: number): void;
|
|
175
301
|
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
|
|
176
307
|
export declare function callAiForCommitMessage(aiBaseUrl: string, aiApiKey: string, aiModel: string, diffContent: string): Promise<string>;
|
|
177
308
|
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
|
|
178
321
|
export declare function streamAiForCommitMessage(aiBaseUrl: string, aiApiKey: string, aiModel: string, diffContent: string, onDelta: (delta: string, accumulated: string) => void, abortSignal?: AbortSignal): Promise<string>;
|
|
179
322
|
export {};
|
|
@@ -30,9 +30,17 @@ interface AmbiguousSchedulerBaseUrlResponse {
|
|
|
30
30
|
hint: string;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
33
36
|
export declare function buildSchedulerPingFailureResponse(error: Error, configuredSchedulerBaseUrl: string): SchedulerPingFailureResponse;
|
|
34
37
|
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
35
41
|
export declare function buildAmbiguousSchedulerBaseUrlResponse(targetUrls: string[]): AmbiguousSchedulerBaseUrlResponse;
|
|
36
42
|
|
|
43
|
+
|
|
44
|
+
|
|
37
45
|
export declare function summarizeToolStatus(toolStatus: Record<string, ToolInstallStatus>): Record<string, Pick<ToolInstallStatus, "installed" | "version" | "executable" | "error">>;
|
|
38
46
|
export {};
|
package/dist/routes/instance.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{spawn as A}from"node:child_process";import{createHash as W,timingSafeEqual as G}from"node:crypto";import J from"node:fs/promises";import w from"node:path";import{fileURLToPath as _}from"node:url";import O from"axios";import{Router as Q}from"express";import{adapterRegistry as Y}from"../adapter/index.js";import{getBridgeVersion as R,resolveSchedulerBaseUrlFrom as Z}from"../config.js";import{validateToken as h,validateTokenOrPanelSession as T}from"../middleware/auth.js";import{getConfiguredConnectionKeys as C,getRegistrationState as ee,requestRuntimeAccessTokenRefreshForServer as te,resolveSchedulerBaseUrlFromToken as re}from"../services/auto-register.js";import{getEffective as v,getOverrides as j}from"../services/capability-config.js";import{appendChangelogSection as se,readChangelog as ne}from"../services/changelog.js";import{setAgentFeatures as oe,setAgentCapabilities as ae,setAgentInheritedFeatures as ie,setAgentCapabilitiesInherited as de,getAgentFeatures as x,getAgentInheritedFeatures as ce}from"../services/instance-features.js";import{initInstance as le}from"../services/instance-init-service.js";import{loadInstanceState as U,saveInstanceState as L}from"../services/instance-state.js";import{createBridgeLifecycleOperation as P,deliverPendingBridgeLifecycleNotifications as $,loadLifecycleState as ue,removeBridgeLifecycleOperation as ge,upsertBridgeLifecycleOperation as k}from"../services/lifecycle-state.js";import{mcpDeployManager as pe}from"../services/mcp-deploy.js";import{pluginManager as fe}from"../services/plugin-manager.js";import{getRuntimeAccessToken as me}from"../services/runtime-binding.js";import{skillManager as he}from"../services/skill-manager.js";import{detectToolStatuses as E,ensureToolsInstalled as Se,SUPPORTED_INSTALLABLE_TOOLS as F,SUPPORTED_UNINSTALLABLE_TOOLS as D,uninstallTools as ye}from"../services/tool-installer.js";import{appendUpdateLog as m,readUpdateLog as be}from"../services/update-log.js";import{createLogger as we}from"../utils/logger.js";import{checkBridgeUpdate as N}from"../utils/npm-version.js";const d=we("instance");import{buildToolStatusDetectionTargets as ke}from"./instance-tool-status.js";let I=null;function it(r){I=r}const g=Q();function M(r){return String(r||"").trim()||void 0}function K(r){const t=r.get("host");if(t)return`${r.protocol}://${t}`}function q(){const r=w.resolve(w.dirname(_(import.meta.url)),"..","..");return w.join(r,"dist","index.js")}function Be(){return new Promise((r,t)=>{const e=A(process.execPath,[q(),"update","--no-kill"],{shell:!1,windowsHide:!0});let s="",n="";e.stdout.on("data",o=>{s+=o.toString("utf8")}),e.stderr.on("data",o=>{n+=o.toString("utf8")}),e.on("error",t),e.on("close",o=>{r({exitCode:o,stdout:s,stderr:n})})})}function z(){const r=A(process.execPath,[q(),"service","restart"],{shell:!1,windowsHide:!0,stdio:["ignore","pipe","pipe"]});r.stdout.on("data",t=>{m(String(t)).catch(()=>{})}),r.stderr.on("data",t=>{m(String(t)).catch(()=>{})})}async function Ie(){try{const r=w.join(w.dirname(w.dirname(_(import.meta.url))),"package.json"),t=JSON.parse(await J.readFile(r,{encoding:"utf8"}));return(typeof t.version=="string"?t.version.trim():"")||null}catch{return null}}const V=3e3;async function Re(r){const t={...r,status:"running",message:"Bridge \u66F4\u65B0\u6B63\u5728\u540E\u53F0\u6267\u884C\u3002"};await k(t);try{d.info("[update-bridge] \u6B63\u5728\u540E\u53F0\u6267\u884C awsb update --yes"),await m(`===== Bridge \u66F4\u65B0\u5F00\u59CB\uFF1Av${R()} -> latest\uFF08\u64CD\u4F5C ${r.operationId}\uFF09 =====`);const e=await Be();if(e.stdout&&await m(e.stdout),e.stderr&&await m(e.stderr),e.exitCode===0){const s=await Ie(),n=r.latestVersion||s||R();await se(n,`Bridge \u5DF2\u66F4\u65B0\u81F3 ${n}\u3002`).catch(a=>{const i=a;d.warn(`[update-bridge] \u8FFD\u52A0 changelog \u6BB5\u5931\u8D25\uFF08\u5DF2\u5FFD\u7565\uFF09: ${i.message}`)}),await m("===== Bridge \u66F4\u65B0\u6210\u529F\uFF0C\u51C6\u5907\u81EA\u52A8\u91CD\u542F ===== ");const o={...t,status:"restarting",message:"Bridge \u66F4\u65B0\u5B8C\u6210\uFF0C\u6B63\u5728\u91CD\u542F..."};await k(o),d.info("[update-bridge] \u6B63\u5728\u6267\u884C awsb service restart"),z(),setTimeout(()=>{if(process.exitCode=42,I){I("BRIDGE_UPDATE_RESTART",!0).catch(a=>{const i=a;d.error("[update-bridge] graceful shutdown failed:",i),process.exit(42)});return}process.exit(42)},V)}else await m(`===== Bridge \u66F4\u65B0\u5931\u8D25\uFF1A\u9000\u51FA\u7801 ${e.exitCode??"unknown"} =====`),await k({...t,status:"failed",message:`Bridge \u66F4\u65B0\u5931\u8D25\uFF0Cnpm \u9000\u51FA\u7801: ${e.exitCode??"unknown"}`,error:e.stderr||e.stdout}),await $()}catch(e){const s=e;d.error("[update-bridge] background update failed:",s),await m(`===== Bridge \u66F4\u65B0\u5F02\u5E38\uFF1A${s.message} =====`).catch(()=>{}),await k({...t,status:"failed",message:"Bridge \u66F4\u65B0\u5931\u8D25\u3002",error:s.message||"update bridge failed"}),await $()}}async function X(r){const t=await import("node:fs/promises"),e=await import("node:path"),s=await import("node:os"),n=e.join(s.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");if(r){await t.mkdir(e.dirname(n),{recursive:!0}),await t.writeFile(n,JSON.stringify({preserveSessions:!0,timestamp:new Date().toISOString()}),"utf-8"),d.info(`[prepare-restart] \u5DF2\u521B\u5EFA\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6: ${n}`);return}try{await t.unlink(n),d.info("[prepare-restart] \u5DF2\u5220\u9664\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6")}catch{}}function Te(r){return W("md5").update(r,"utf8").digest("hex")}function ve(r){const t=r.trim().toLowerCase();if(!/^[a-f0-9]{32}$/.test(t))return!1;const e=Buffer.from(t,"hex");return C().map(s=>s.trim()).filter(Boolean).some(s=>{const n=Buffer.from(Te(s),"hex");return n.length===e.length&&G(n,e)})}function je(r){const e=C().length>0,s=R();return e?ve(r)?{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!0}}:{status:401,body:{ok:!1,error:"connection_key_mismatch",version:s,connectionKeyMatched:!1,connectionKeyRequired:!0}}:{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!1}}}function Ue(r,t){const s=t.trim()||"http://localhost:8080",n=/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?(?:\/|$)/i.test(s);return{ok:!1,error:r.message||"scheduler ping failed",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:s,hint:n?"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u5728 bridge \u542F\u52A8\u73AF\u5883\u4E2D\u5C06 AWS_RUNTIME_SCHEDULER_BASE_URL \u914D\u7F6E\u4E3A\u8BE5\u5B9E\u4F8B\u53EF\u8BBF\u95EE\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF0C\u4F8B\u5982 http://<server-host>:7380\u3002":"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u786E\u8BA4 AWS_RUNTIME_SCHEDULER_BASE_URL \u6307\u5411\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\u53EF\u4ECE bridge \u673A\u5668\u8BBF\u95EE\uFF0C\u5E76\u4E14\u8FD0\u884C\u65F6\u8BBF\u95EE\u4EE4\u724C\u4ECD\u6709\u6548\u3002"}}function Ee(r){if(typeof r!="object"||r===null)return;const t=Reflect.get(r,"response");if(typeof t!="object"||t===null)return;const e=Reflect.get(t,"status");return typeof e=="number"?e:void 0}async function Ae(r,t){try{const e=await O.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":t}});return{schedulerReachable:e.status>=200&&e.status<300,tokenRefreshed:!1}}catch(e){if(Ee(e)!==401)throw e;const s=await te(r);if(!s.success||!s.runtimeAccessToken)throw e;const n=await O.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":s.runtimeAccessToken}});return{schedulerReachable:n.status>=200&&n.status<300,tokenRefreshed:!0}}}function _e(r){return{ok:!1,error:"ambiguous_scheduler_base_url",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:"",autoRegisterTargetUrls:r,hint:"Multiple autoRegisterTargets.serverUrl values were found, so bridge cannot safely infer which scheduler /runtime/ping should call back. Set AWS_RUNTIME_SCHEDULER_BASE_URL explicitly, or use future schedulerId/token-bound multi-scheduler routing."}}function Oe(r){return Object.fromEntries(Object.entries(r||{}).map(([t,e])=>[t,{installed:!!e?.installed,version:e?.version||null,executable:e?.executable||null,error:e?.error||null}]))}g.get("/check-update",async(r,t)=>{t.json(await N())}),g.get("/update-log",T,async(r,t)=>{try{const e=await be();t.json({ok:!0,...e})}catch(e){const s=e;d.error("[update-log] Error:",s),t.status(500).json({ok:!1,error:s.message||"read update log failed"})}}),g.get("/changelog",T,async(r,t)=>{const e=String(r.query?.version||"").trim();if(!e){t.status(400).json({ok:!1,error:"version is required"});return}try{const s=await ne(e);t.json({ok:!0,version:e,...s})}catch(s){const n=s;d.error("[changelog] Error:",n),t.status(500).json({ok:!1,error:n.message||"read changelog failed"})}}),g.get("/healthz",(r,t)=>{t.json({ok:!0,runtimeBridge:"healthy"})}),g.get("/connection-check",(r,t)=>{const e=String(r.header("X-Bridge-Connection-Key-MD5")||""),s=je(e);t.status(s.status).json(s.body)}),g.get("/ping",h,async(r,t)=>{let e=Z(r.header("X-Scheduler-Base-Url"),r.header("X-Bridge-Instance-Id"),r.header("X-Bridge-Instance-Name"));if(e.source==="ambiguous-auto-register-targets"){const n=re(r.header("X-Runtime-Token"));if(n)e={url:n,source:"token-match",ambiguousTargetUrls:[]};else{const o=r.header("X-Bridge-Instance-Id");if(o){const a=ee(),i=Object.entries(a.registrations).find(([,l])=>l===o)?.[0];i&&(e={url:i,source:"instance-id-match",ambiguousTargetUrls:[]})}if(!e.url||e.source==="ambiguous-auto-register-targets"){t.status(400).json(_e(e.ambiguousTargetUrls));return}}}const s=e.url;try{const n=me(s);if(!n){t.status(401).json({ok:!1,error:"runtime_access_token_required"});return}const o=await Ae(s,n);t.json({ok:!0,runtimeBridge:"healthy",version:R(),schedulerReachable:o.schedulerReachable,tokenRefreshed:o.tokenRefreshed,schedulerBaseUrl:s,instanceId:e.instanceId,instanceName:e.instanceName})}catch(n){const o=n;t.status(502).json(Ue(o,s))}}),g.post("/init-instance",h,async(r,t)=>{const{agentId:e,workspacePath:s,skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a,skillPackage:i,skillPackages:l,pluginPackages:f,mcpServers:S}=r.body||{};if(!e||!s){t.status(400).json({error:"agentId and workspacePath are required"});return}try{d.info("[init-instance] Request received",{agentId:String(e),workspacePath:String(s),skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a});const u=await le(e,s,{skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a,skillPackage:i,skillPackages:l,pluginPackages:f,mcpServers:S});d.info("[init-instance] Initialization completed",{agentId:String(e),ok:u.ok,logCount:u.logs?.length||0,enabledTools:u.enabledTools}),t.json(u)}catch(u){const p=u;d.error("[init-instance] Initialization failed",{agentId:String(e),workspacePath:String(s),error:p?.message||String(u),stack:p?.stack||null}),t.status(400).json({error:p?.message||"initialize instance failed"})}}),g.post("/features",h,async(r,t)=>{const{agentId:e,features:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}oe(String(e),s),r.body.inheritedFeatures!==void 0&&ie(String(e),r.body.inheritedFeatures),r.body.capabilities!==void 0&&ae(String(e),r.body.capabilities),r.body.capabilitiesInherited!==void 0&&de(String(e),r.body.capabilitiesInherited),d.info("[instance/features] \u80FD\u529B\u5F00\u5173\u5DF2\u66F4\u65B0",{agentId:String(e),features:x(String(e)),inheritedFeatures:ce(String(e))});let n=0;for(const o of Y.getAll())if(typeof o.applyAgentFeatures=="function")try{await o.applyAgentFeatures(String(e)),n+=1}catch(a){d.error("[instance/features] adapter \u70ED\u540C\u6B65\u5931\u8D25",{agentId:String(e),providerId:o.providerId,error:a?.message||String(a)})}t.json({ok:!0,agentId:String(e),features:x(String(e)),hotSyncedAdapters:n})}),g.post("/cc-switch/state",h,async(r,t)=>{const{agentId:e}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}try{d.info("[cc-switch/state] Request received",{agentId:String(e)});const s=await U(e),n=ke(s.enabledTools||[]);d.info("[cc-switch/state] Detecting SDK statuses",{agentId:String(e),detectionTargets:n});const o=await E(n),a=await fe.listDeployed(),i=he.listDeployed(),l=pe.listDeployed(),f=j(e,"skills"),S=j(e,"mcp"),u=j(e,"plugins"),p=i.map(c=>({...c,enabled:v(e,"skills",c.skillName),source:f[c.skillName]!==void 0?"agent":"bridge"})),y=l.map(c=>({...c,enabled:v(e,"mcp",c.name),source:S[c.name]!==void 0?"agent":"bridge"})),b=a.map(c=>({...c,enabled:v(e,"plugins",c.pluginName),source:u[c.pluginName]!==void 0?"agent":"bridge"}));d.info("[cc-switch/state] SDK status detection completed",{agentId:String(e),toolStatus:Oe(o)}),t.json({ok:!0,agentId:String(e),imported:{mcpServers:0,skills:0},deployedPlugins:b,deployedSkills:p,deployedMcp:y,state:{...s,toolStatus:o}})}catch(s){const n=s;d.error("[cc-switch/state] Failed to load state",{agentId:String(e),error:n?.message||String(s),stack:n?.stack||null}),t.status(400).json({error:n?.message||"load state failed"})}}),g.post("/tools/install",h,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(i=>String(i||"").trim().toLowerCase()).filter(Boolean):[],o=new Set(F),a=n.filter(i=>o.has(i));if(a.length===0){t.status(400).json({error:`tools must include ${F.join(", ")}`});return}try{const i=await U(e),l=Array.from(new Set([...i.enabledTools||[],...a])),f=await Se(a),u={...await E(l),...f},p=await L(e,{...i,enabledTools:l,toolStatus:u}),y=new Set(a),b=Object.entries(u).filter(([c])=>y.has(c)).filter(([,c])=>!c.installed).map(([c,B])=>({tool:c,error:B.error||null}));t.json({ok:b.length===0,agentId:String(e),toolStatus:u,failedTools:b,state:p})}catch(i){const l=i;t.status(400).json({error:l?.message||"install tools failed"})}}),g.post("/tools/uninstall",h,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(i=>String(i||"").trim().toLowerCase()).filter(Boolean):[],o=new Set(D),a=n.filter(i=>o.has(i));if(a.length===0){t.status(400).json({error:`tools must include ${D.join(", ")}`});return}try{const i=await U(e),l=new Set(a),f=(i.enabledTools||[]).filter(B=>!l.has(String(B||"").trim().toLowerCase())),S=await ye(a),p={...await E([...f,...a]),...S},y=a.filter(B=>p[B]?.installed),b=y.length>0?i.enabledTools||[]:f,c=await L(e,{...i,enabledTools:b,toolStatus:p});if(y.length>0){t.status(400).json({ok:!1,agentId:String(e),error:"uninstall incomplete",toolStatus:p,state:c});return}t.json({ok:!0,agentId:String(e),toolStatus:p,state:c})}catch(i){const l=i;t.status(400).json({error:l?.message||"uninstall tools failed"})}}),g.post("/prepare-restart",h,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{};try{d.info(`[prepare-restart] \u6536\u5230\u51C6\u5907\u91CD\u542F\u901A\u77E5\uFF0CpreserveSessions=${e}`),await X(!!e),t.json({ok:!0,preserveSessions:e,message:e?"Bridge will preserve sessions for aws-mcp-server restart":"Bridge will clean up sessions on shutdown"})}catch(s){const n=s;d.error("[prepare-restart] Error:",n),t.status(500).json({error:n.message})}});const Ce={update:15*60*1e3,restart:5*60*1e3};async function xe(r){try{const t=await ue(),e=Date.now(),s=Ce[r],n=[];for(const o of t.operations){if(o.operationType!==r||!["accepted","running","restarting"].includes(o.status))continue;const a=new Date(o.updatedAt).getTime();if(!Number.isNaN(a)&&e-a<=s)return{operationId:o.operationId};n.push(o.operationId)}for(const o of n)try{await ge(o),d.info(`[${r}-bridge] \u5DF2\u6E05\u7406\u8D85\u65F6\u672A\u4EA4\u4ED8\u7684\u9648\u65E7\u64CD\u4F5C: ${o}`)}catch(a){const i=a;d.warn(`[${r}-bridge] \u6E05\u7406\u9648\u65E7\u64CD\u4F5C\u5931\u8D25\uFF0C\u7EE7\u7EED\u653E\u884C: ${o}, ${i.message}`)}return null}catch(t){const e=t;return d.warn(`[${r}-bridge] \u5728\u9014\u64CD\u4F5C\u68C0\u67E5\u5931\u8D25\uFF0C\u653E\u884C\u8BF7\u6C42: ${e.message}`),null}}async function H(r,t,e){const s=await xe(r);return s?(e.status(409).json({error:t,operationId:s.operationId}),!0):!1}g.post("/update-bridge",T,async(r,t)=>{const e=M(r.body?.requestedByUserId);try{if(!e){t.status(400).json({error:"requestedByUserId is required"});return}if(await H("update","\u5B9E\u4F8B Bridge \u66F4\u65B0\u6B63\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u52FF\u91CD\u590D\u89E6\u53D1",t))return;const s=await N(),n=P({operationType:"update",requestedByUserId:e,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:K(r),status:"accepted",message:"Bridge \u66F4\u65B0\u8BF7\u6C42\u5DF2\u6536\u5230\uFF0C\u5C06\u5728\u540E\u53F0\u6267\u884C\u5E76\u81EA\u52A8\u91CD\u542F\u3002",latestVersion:s.ok&&s.latestVersion||void 0});await k(n),Re(n),t.json({ok:!0,operationId:n.operationId,message:"Bridge \u66F4\u65B0\u5DF2\u5728\u540E\u53F0\u5F00\u59CB\uFF0C\u66F4\u65B0\u5B8C\u6210\u540E\u5C06\u81EA\u52A8\u91CD\u542F\u5B9E\u4F8B Bridge\u3002"})}catch(s){const n=s;d.error("[update-bridge] Error:",n),t.status(500).json({error:n.message||"update bridge failed"})}}),g.post("/restart-bridge",T,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{},s=M(r.body?.requestedByUserId);try{if(!s){t.status(400).json({error:"requestedByUserId is required"});return}if(await H("restart","\u5B9E\u4F8B Bridge \u6B63\u5728\u91CD\u542F\u4E2D\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5",t))return;d.info(`[restart-bridge] \u6536\u5230\u5B9E\u4F8B Bridge \u91CD\u542F\u8BF7\u6C42\uFF0CpreserveSessions=${e}`);const n=P({operationType:"restart",requestedByUserId:s,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:K(r),status:"accepted",message:"Bridge \u5DF2\u6536\u5230\u91CD\u542F\u8BF7\u6C42\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u53D1\u9001\u786E\u8BA4\u901A\u77E5\u3002"});await k(n),await X(!!e),t.json({ok:!0,operationId:n.operationId,preserveSessions:!!e,message:"Bridge \u6B63\u5728\u91CD\u542F\uFF0C\u670D\u52A1\u7BA1\u7406\u5668\u4F1A\u81EA\u52A8\u62C9\u8D77\u5B9E\u4F8B\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u901A\u8FC7\u6D88\u606F\u4E2D\u5FC3\u901A\u77E5\u7ED3\u679C\u3002"}),d.info("[restart-bridge] \u6B63\u5728\u6267\u884C awsb service restart"),z(),setTimeout(()=>{if(process.exitCode=42,I){I("PANEL_RESTART",!!e).catch(o=>{const a=o;d.error("[restart-bridge] graceful shutdown failed:",a),process.exit(42)});return}process.exit(42)},V)}catch(n){const o=n;d.error("[restart-bridge] Error:",o),t.status(500).json({error:o.message||"restart bridge failed"})}});export{_e as buildAmbiguousSchedulerBaseUrlResponse,je as buildConnectionCheckResponse,Ue as buildSchedulerPingFailureResponse,g as instanceRouter,it as setGracefulShutdownFn,Oe as summarizeToolStatus};
|
|
1
|
+
import{spawn as _}from"node:child_process";import{createHash as ee,timingSafeEqual as te}from"node:crypto";import re from"node:fs/promises";import k from"node:path";import{fileURLToPath as C}from"node:url";import O from"axios";import{Router as se}from"express";import{adapterRegistry as ne}from"../adapter/index.js";import{getBridgeVersion as T,isDesktopAppMode as oe,resolveSchedulerBaseUrlFrom as x}from"../config.js";import{validateToken as m,validateTokenOrPanelSession as R}from"../middleware/auth.js";import{registerAgentOwner as ae}from"../services/agent-ownership.js";import{getConfiguredConnectionKeys as L,getRegistrationState as ie,listConfiguredTargetSummaries as de,requestRuntimeAccessTokenRefreshForServer as ce,resolveTargetIdentityFromToken as P}from"../services/auto-register.js";import{getEffective as j,getOverrides as U}from"../services/capability-config.js";import{appendChangelogSection as le,readChangelog as ue}from"../services/changelog.js";import{rotateConnectionKeyFromServer as ge}from"../services/connection-key-rotation.js";import{setAgentFeatures as pe,setAgentCapabilities as fe,setAgentInheritedFeatures as me,setAgentCapabilitiesInherited as he,getAgentFeatures as F,getAgentInheritedFeatures as ye}from"../services/instance-features.js";import{initInstance as Se}from"../services/instance-init-service.js";import{loadInstanceState as A,saveInstanceState as $}from"../services/instance-state.js";import{createBridgeLifecycleOperation as D,deliverPendingBridgeLifecycleNotifications as K,loadLifecycleState as we,removeBridgeLifecycleOperation as be,upsertBridgeLifecycleOperation as B}from"../services/lifecycle-state.js";import{McpDeployManager as Ie}from"../services/mcp-deploy.js";import{pluginManager as ke}from"../services/plugin-manager.js";import{getRuntimeAccessToken as Be}from"../services/runtime-binding.js";import{SkillManager as ve}from"../services/skill-manager.js";import{detectToolStatuses as E,ensureToolsInstalled as Te,SUPPORTED_INSTALLABLE_TOOLS as M,SUPPORTED_UNINSTALLABLE_TOOLS as N,uninstallTools as Re}from"../services/tool-installer.js";import{appendUpdateLog as y,readUpdateLog as je}from"../services/update-log.js";import{getUserScopeOrThrow as X,requireUserScope as q}from"../services/user-scope.js";import{createLogger as Ue}from"../utils/logger.js";import{checkBridgeUpdate as z}from"../utils/npm-version.js";import{serverUrlOfTargetKey as Ae}from"../utils/target-identity.js";const d=Ue("instance");import{buildToolStatusDetectionTargets as Ee}from"./instance-tool-status.js";let v=null;function bt(r){v=r}const l=se();function H(r){return String(r||"").trim()||void 0}function V(r){const t=r.get("host");if(t)return`${r.protocol}://${t}`}function W(){const r=k.resolve(k.dirname(C(import.meta.url)),"..","..");return k.join(r,"dist","index.js")}function _e(){return new Promise((r,t)=>{const e=_(process.execPath,[W(),"update","--no-kill"],{shell:!1,windowsHide:!0});let s="",n="";e.stdout.on("data",o=>{s+=o.toString("utf8")}),e.stderr.on("data",o=>{n+=o.toString("utf8")}),e.on("error",t),e.on("close",o=>{r({exitCode:o,stdout:s,stderr:n})})})}function G(){const r=_(process.execPath,[W(),"service","restart"],{shell:!1,windowsHide:!0,stdio:["ignore","pipe","pipe"]});r.stdout.on("data",t=>{y(String(t)).catch(()=>{})}),r.stderr.on("data",t=>{y(String(t)).catch(()=>{})})}async function Ce(){try{const r=k.join(k.dirname(k.dirname(C(import.meta.url))),"package.json"),t=JSON.parse(await re.readFile(r,{encoding:"utf8"}));return(typeof t.version=="string"?t.version.trim():"")||null}catch{return null}}const J=3e3;async function Oe(r){const t={...r,status:"running",message:"Bridge \u66F4\u65B0\u6B63\u5728\u540E\u53F0\u6267\u884C\u3002"};await B(t);try{d.info("[update-bridge] \u6B63\u5728\u540E\u53F0\u6267\u884C awsb update --yes"),await y(`===== Bridge \u66F4\u65B0\u5F00\u59CB\uFF1Av${T()} -> latest\uFF08\u64CD\u4F5C ${r.operationId}\uFF09 =====`);const e=await _e();if(e.stdout&&await y(e.stdout),e.stderr&&await y(e.stderr),e.exitCode===0){const s=await Ce(),n=r.latestVersion||s||T();await le(n,`Bridge \u5DF2\u66F4\u65B0\u81F3 ${n}\u3002`).catch(a=>{const i=a;d.warn(`[update-bridge] \u8FFD\u52A0 changelog \u6BB5\u5931\u8D25\uFF08\u5DF2\u5FFD\u7565\uFF09: ${i.message}`)}),await y("===== Bridge \u66F4\u65B0\u6210\u529F\uFF0C\u51C6\u5907\u81EA\u52A8\u91CD\u542F ===== ");const o={...t,status:"restarting",message:"Bridge \u66F4\u65B0\u5B8C\u6210\uFF0C\u6B63\u5728\u91CD\u542F..."};await B(o),d.info("[update-bridge] \u6B63\u5728\u6267\u884C awsb service restart"),G(),setTimeout(()=>{if(process.exitCode=42,v){v("BRIDGE_UPDATE_RESTART",!0).catch(a=>{const i=a;d.error("[update-bridge] graceful shutdown failed:",i),process.exit(42)});return}process.exit(42)},J)}else await y(`===== Bridge \u66F4\u65B0\u5931\u8D25\uFF1A\u9000\u51FA\u7801 ${e.exitCode??"unknown"} =====`),await B({...t,status:"failed",message:`Bridge \u66F4\u65B0\u5931\u8D25\uFF0Cnpm \u9000\u51FA\u7801: ${e.exitCode??"unknown"}`,error:e.stderr||e.stdout}),await K()}catch(e){const s=e;d.error("[update-bridge] background update failed:",s),await y(`===== Bridge \u66F4\u65B0\u5F02\u5E38\uFF1A${s.message} =====`).catch(()=>{}),await B({...t,status:"failed",message:"Bridge \u66F4\u65B0\u5931\u8D25\u3002",error:s.message||"update bridge failed"}),await K()}}async function Q(r){const t=await import("node:fs/promises"),e=await import("node:path"),s=await import("node:os"),n=e.join(s.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");if(r){await t.mkdir(e.dirname(n),{recursive:!0}),await t.writeFile(n,JSON.stringify({preserveSessions:!0,timestamp:new Date().toISOString()}),"utf-8"),d.info(`[prepare-restart] \u5DF2\u521B\u5EFA\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6: ${n}`);return}try{await t.unlink(n),d.info("[prepare-restart] \u5DF2\u5220\u9664\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6")}catch{}}function xe(r){return ee("md5").update(r,"utf8").digest("hex")}function Le(r){const t=r.trim().toLowerCase();if(!/^[a-f0-9]{32}$/.test(t))return!1;const e=Buffer.from(t,"hex");return L().map(s=>s.trim()).filter(Boolean).some(s=>{const n=Buffer.from(xe(s),"hex");return n.length===e.length&&te(n,e)})}function Pe(r){const e=L().length>0,s=T();return e?Le(r)?{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!0}}:{status:401,body:{ok:!1,error:"connection_key_mismatch",version:s,connectionKeyMatched:!1,connectionKeyRequired:!0}}:{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!1}}}function Fe(r,t){const s=t.trim()||"http://localhost:8080",n=/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?(?:\/|$)/i.test(s);return{ok:!1,error:r.message||"scheduler ping failed",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:s,hint:n?"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u5728 bridge \u542F\u52A8\u73AF\u5883\u4E2D\u5C06 AWS_RUNTIME_SCHEDULER_BASE_URL \u914D\u7F6E\u4E3A\u8BE5\u5B9E\u4F8B\u53EF\u8BBF\u95EE\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF0C\u4F8B\u5982 http://<server-host>:7380\u3002":"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u786E\u8BA4 AWS_RUNTIME_SCHEDULER_BASE_URL \u6307\u5411\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\u53EF\u4ECE bridge \u673A\u5668\u8BBF\u95EE\uFF0C\u5E76\u4E14\u8FD0\u884C\u65F6\u8BBF\u95EE\u4EE4\u724C\u4ECD\u6709\u6548\u3002"}}function $e(r){if(typeof r!="object"||r===null)return;const t=Reflect.get(r,"response");if(typeof t!="object"||t===null)return;const e=Reflect.get(t,"status");return typeof e=="number"?e:void 0}async function De(r,t){try{const e=await O.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":t}});return{schedulerReachable:e.status>=200&&e.status<300,tokenRefreshed:!1}}catch(e){if($e(e)!==401)throw e;const s=await ce(r,P(t)?.identityKey);if(!s.success||!s.runtimeAccessToken)throw e;const n=await O.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":s.runtimeAccessToken}});return{schedulerReachable:n.status>=200&&n.status<300,tokenRefreshed:!0}}}function Ke(r){return{ok:!1,error:"ambiguous_scheduler_base_url",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:"",autoRegisterTargetUrls:r,hint:"Multiple autoRegisterTargets.serverUrl values were found, so bridge cannot safely infer which scheduler /runtime/ping should call back. Set AWS_RUNTIME_SCHEDULER_BASE_URL explicitly, or use future schedulerId/token-bound multi-scheduler routing."}}function Me(r){return Object.fromEntries(Object.entries(r||{}).map(([t,e])=>[t,{installed:!!e?.installed,version:e?.version||null,executable:e?.executable||null,error:e?.error||null}]))}l.get("/check-update",async(r,t)=>{t.json(await z())}),l.get("/update-log",R,async(r,t)=>{try{const e=await je();t.json({ok:!0,...e})}catch(e){const s=e;d.error("[update-log] Error:",s),t.status(500).json({ok:!1,error:s.message||"read update log failed"})}}),l.get("/changelog",R,async(r,t)=>{const e=String(r.query?.version||"").trim();if(!e){t.status(400).json({ok:!1,error:"version is required"});return}try{const s=await ue(e);t.json({ok:!0,version:e,...s})}catch(s){const n=s;d.error("[changelog] Error:",n),t.status(500).json({ok:!1,error:n.message||"read changelog failed"})}}),l.get("/healthz",(r,t)=>{t.json({ok:!0,runtimeBridge:"healthy"})}),l.get("/connection-check",(r,t)=>{const e=String(r.header("X-Bridge-Connection-Key-MD5")||""),s=Pe(e);t.status(s.status).json(s.body)}),l.get("/server-config/summary",m,(r,t)=>{try{t.setHeader("Cache-Control","no-store"),t.json({ok:!0,targets:de()})}catch(e){const s=e;t.status(500).json({ok:!1,error:s.message||"read targets failed"})}}),l.post("/connection-key/rotate",m,async(r,t)=>{const e=r.body||{},s=x(e.serverUrl||r.header("X-Scheduler-Base-Url"),e.instanceId||r.header("X-Bridge-Instance-Id"),r.header("X-Bridge-Instance-Name")),n=await ge(e.connectionKey,{serverUrl:s.url,instanceId:String(e.instanceId||r.header("X-Bridge-Instance-Id")||"").trim(),credentialId:String(e.credentialId||"").trim()});t.status(n.status).json(n.body)}),l.get("/ping",m,async(r,t)=>{let e=x(r.header("X-Scheduler-Base-Url"),r.header("X-Bridge-Instance-Id"),r.header("X-Bridge-Instance-Name"));if(e.source==="ambiguous-auto-register-targets"){const n=P(r.header("X-Runtime-Token"));if(n)e={url:n.serverUrl,source:"token-match",ambiguousTargetUrls:[],userKey:n.userKey};else{const o=r.header("X-Bridge-Instance-Id");if(o){const a=ie(),i=Object.entries(a.registrations).find(([,u])=>u===o)?.[0];i&&(e={url:Ae(i),source:"instance-id-match",ambiguousTargetUrls:[]})}if(!e.url||e.source==="ambiguous-auto-register-targets"){t.status(400).json(Ke(e.ambiguousTargetUrls));return}}}const s=e.url;try{const n=Be(s,e.userKey);if(!n){t.status(401).json({ok:!1,error:"runtime_access_token_required"});return}const o=await De(s,n);t.json({ok:!0,runtimeBridge:"healthy",version:T(),schedulerReachable:o.schedulerReachable,tokenRefreshed:o.tokenRefreshed,schedulerBaseUrl:s,instanceId:e.instanceId,instanceName:e.instanceName})}catch(n){const o=n;t.status(502).json(Fe(o,s))}}),l.post("/init-instance",m,q,async(r,t)=>{const{agentId:e,workspacePath:s,skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a,skillPackage:i,skillPackages:u,pluginPackages:h,mcpServers:w}=r.body||{};if(!e||!s){t.status(400).json({error:"agentId and workspacePath are required"});return}try{const g=X(r);ae(e,g),d.info("[init-instance] Request received",{agentId:String(e),workspacePath:String(s),tenantId:g.tenantId,userId:g.userId,skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a});const c=await Se(e,s,{skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a,skillPackage:i,skillPackages:u,pluginPackages:h,mcpServers:w,scope:g});d.info("[init-instance] Initialization completed",{agentId:String(e),ok:c.ok,logCount:c.logs?.length||0,enabledTools:c.enabledTools}),t.json(c)}catch(g){const c=g;if(d.error("[init-instance] Initialization failed",{agentId:String(e),workspacePath:String(s),error:c?.message||String(g),stack:c?.stack||null}),c?.message.includes("agent-ownership-mismatch")){t.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}t.status(400).json({error:c?.message||"initialize instance failed"})}}),l.post("/features",m,async(r,t)=>{const{agentId:e,features:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}pe(String(e),s),r.body.inheritedFeatures!==void 0&&me(String(e),r.body.inheritedFeatures),r.body.capabilities!==void 0&&fe(String(e),r.body.capabilities),r.body.capabilitiesInherited!==void 0&&he(String(e),r.body.capabilitiesInherited),d.info("[instance/features] \u80FD\u529B\u5F00\u5173\u5DF2\u66F4\u65B0",{agentId:String(e),features:F(String(e)),inheritedFeatures:ye(String(e))});let n=0;for(const o of ne.getAll())if(typeof o.applyAgentFeatures=="function")try{await o.applyAgentFeatures(String(e)),n+=1}catch(a){d.error("[instance/features] adapter \u70ED\u540C\u6B65\u5931\u8D25",{agentId:String(e),providerId:o.providerId,error:a?.message||String(a)})}t.json({ok:!0,agentId:String(e),features:F(String(e)),hotSyncedAdapters:n})}),l.post("/cc-switch/state",m,q,async(r,t)=>{const{agentId:e}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}try{const s=X(r);d.info("[cc-switch/state] Request received",{agentId:String(e)});const n=await A(e),o=Ee(n.enabledTools||[]);d.info("[cc-switch/state] Detecting SDK statuses",{agentId:String(e),detectionTargets:o});const a=await E(o),i=ve.forScope(s),u=Ie.forScope(s),h=await ke.listDeployed(s),w=i.listDeployed(),g=u.listDeployed(),c=U(s,e,"skills"),b=U(s,e,"mcp"),I=U(s,e,"plugins"),f=w.map(p=>({...p,enabled:j(s,e,"skills",p.skillName),source:c[p.skillName]!==void 0?"agent":"bridge"})),S=g.map(p=>({...p,enabled:j(s,e,"mcp",p.name),source:b[p.name]!==void 0?"agent":"bridge"})),Z=h.map(p=>({...p,enabled:j(s,e,"plugins",p.pluginName),source:I[p.pluginName]!==void 0?"agent":"bridge"}));d.info("[cc-switch/state] SDK status detection completed",{agentId:String(e),toolStatus:Me(a)}),t.json({ok:!0,agentId:String(e),imported:{mcpServers:0,skills:0},deployedPlugins:Z,deployedSkills:f,deployedMcp:S,state:{...n,toolStatus:a}})}catch(s){const n=s;d.error("[cc-switch/state] Failed to load state",{agentId:String(e),error:n?.message||String(s),stack:n?.stack||null}),t.status(400).json({error:n?.message||"load state failed"})}}),l.post("/tools/install",m,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(i=>String(i||"").trim().toLowerCase()).filter(Boolean):[],o=new Set(M),a=n.filter(i=>o.has(i));if(a.length===0){t.status(400).json({error:`tools must include ${M.join(", ")}`});return}try{const i=await A(e),u=Array.from(new Set([...i.enabledTools||[],...a])),h=await Te(a),g={...await E(u),...h},c=await $(e,{...i,enabledTools:u,toolStatus:g}),b=new Set(a),I=Object.entries(g).filter(([f])=>b.has(f)).filter(([,f])=>!f.installed).map(([f,S])=>({tool:f,error:S.error||null}));t.json({ok:I.length===0,agentId:String(e),toolStatus:g,failedTools:I,state:c})}catch(i){const u=i;t.status(400).json({error:u?.message||"install tools failed"})}}),l.post("/tools/uninstall",m,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(i=>String(i||"").trim().toLowerCase()).filter(Boolean):[],o=new Set(N),a=n.filter(i=>o.has(i));if(a.length===0){t.status(400).json({error:`tools must include ${N.join(", ")}`});return}try{const i=await A(e),u=new Set(a),h=(i.enabledTools||[]).filter(S=>!u.has(String(S||"").trim().toLowerCase())),w=await Re(a),c={...await E([...h,...a]),...w},b=a.filter(S=>c[S]?.installed),I=b.length>0?i.enabledTools||[]:h,f=await $(e,{...i,enabledTools:I,toolStatus:c});if(b.length>0){t.status(400).json({ok:!1,agentId:String(e),error:"uninstall incomplete",toolStatus:c,state:f});return}t.json({ok:!0,agentId:String(e),toolStatus:c,state:f})}catch(i){const u=i;t.status(400).json({error:u?.message||"uninstall tools failed"})}}),l.post("/prepare-restart",m,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{};try{d.info(`[prepare-restart] \u6536\u5230\u51C6\u5907\u91CD\u542F\u901A\u77E5\uFF0CpreserveSessions=${e}`),await Q(!!e),t.json({ok:!0,preserveSessions:e,message:e?"Bridge will preserve sessions for aws-mcp-server restart":"Bridge will clean up sessions on shutdown"})}catch(s){const n=s;d.error("[prepare-restart] Error:",n),t.status(500).json({error:n.message})}});const Ne={update:15*60*1e3,restart:5*60*1e3};async function Xe(r){try{const t=await we(),e=Date.now(),s=Ne[r],n=[];for(const o of t.operations){if(o.operationType!==r||!["accepted","running","restarting"].includes(o.status))continue;const a=new Date(o.updatedAt).getTime();if(!Number.isNaN(a)&&e-a<=s)return{operationId:o.operationId};n.push(o.operationId)}for(const o of n)try{await be(o),d.info(`[${r}-bridge] \u5DF2\u6E05\u7406\u8D85\u65F6\u672A\u4EA4\u4ED8\u7684\u9648\u65E7\u64CD\u4F5C: ${o}`)}catch(a){const i=a;d.warn(`[${r}-bridge] \u6E05\u7406\u9648\u65E7\u64CD\u4F5C\u5931\u8D25\uFF0C\u7EE7\u7EED\u653E\u884C: ${o}, ${i.message}`)}return null}catch(t){const e=t;return d.warn(`[${r}-bridge] \u5728\u9014\u64CD\u4F5C\u68C0\u67E5\u5931\u8D25\uFF0C\u653E\u884C\u8BF7\u6C42: ${e.message}`),null}}async function Y(r,t,e){const s=await Xe(r);return s?(e.status(409).json({error:t,operationId:s.operationId}),!0):!1}l.post("/update-bridge",R,async(r,t)=>{const e=H(r.body?.requestedByUserId);try{if(!e){t.status(400).json({error:"requestedByUserId is required"});return}if(oe()){t.status(409).json({error:"desktop_app_managed_update",message:"\u684C\u9762\u7248\u7531\u5E94\u7528\u81EA\u8EAB\u7684\u66F4\u65B0\u673A\u5236\u7BA1\u7406\uFF0C\u8BF7\u901A\u8FC7\u6258\u76D8\u83DC\u5355\u6216\u66F4\u65B0\u63D0\u793A\u5B8C\u6210\u5347\u7EA7\u3002"});return}if(await Y("update","\u5B9E\u4F8B Bridge \u66F4\u65B0\u6B63\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u52FF\u91CD\u590D\u89E6\u53D1",t))return;const s=await z(),n=D({operationType:"update",requestedByUserId:e,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:V(r),status:"accepted",message:"Bridge \u66F4\u65B0\u8BF7\u6C42\u5DF2\u6536\u5230\uFF0C\u5C06\u5728\u540E\u53F0\u6267\u884C\u5E76\u81EA\u52A8\u91CD\u542F\u3002",latestVersion:s.ok&&s.latestVersion||void 0});await B(n),Oe(n),t.json({ok:!0,operationId:n.operationId,message:"Bridge \u66F4\u65B0\u5DF2\u5728\u540E\u53F0\u5F00\u59CB\uFF0C\u66F4\u65B0\u5B8C\u6210\u540E\u5C06\u81EA\u52A8\u91CD\u542F\u5B9E\u4F8B Bridge\u3002"})}catch(s){const n=s;d.error("[update-bridge] Error:",n),t.status(500).json({error:n.message||"update bridge failed"})}}),l.post("/restart-bridge",R,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{},s=H(r.body?.requestedByUserId);try{if(!s){t.status(400).json({error:"requestedByUserId is required"});return}if(await Y("restart","\u5B9E\u4F8B Bridge \u6B63\u5728\u91CD\u542F\u4E2D\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5",t))return;d.info(`[restart-bridge] \u6536\u5230\u5B9E\u4F8B Bridge \u91CD\u542F\u8BF7\u6C42\uFF0CpreserveSessions=${e}`);const n=D({operationType:"restart",requestedByUserId:s,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:V(r),status:"accepted",message:"Bridge \u5DF2\u6536\u5230\u91CD\u542F\u8BF7\u6C42\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u53D1\u9001\u786E\u8BA4\u901A\u77E5\u3002"});await B(n),await Q(!!e),t.json({ok:!0,operationId:n.operationId,preserveSessions:!!e,message:"Bridge \u6B63\u5728\u91CD\u542F\uFF0C\u670D\u52A1\u7BA1\u7406\u5668\u4F1A\u81EA\u52A8\u62C9\u8D77\u5B9E\u4F8B\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u901A\u8FC7\u6D88\u606F\u4E2D\u5FC3\u901A\u77E5\u7ED3\u679C\u3002"}),d.info("[restart-bridge] \u6B63\u5728\u6267\u884C awsb service restart"),G(),setTimeout(()=>{if(process.exitCode=42,v){v("PANEL_RESTART",!!e).catch(o=>{const a=o;d.error("[restart-bridge] graceful shutdown failed:",a),process.exit(42)});return}process.exit(42)},J)}catch(n){const o=n;d.error("[restart-bridge] Error:",o),t.status(500).json({error:o.message||"restart bridge failed"})}});export{Ke as buildAmbiguousSchedulerBaseUrlResponse,Pe as buildConnectionCheckResponse,Fe as buildSchedulerPingFailureResponse,l as instanceRouter,bt as setGracefulShutdownFn,Me as summarizeToolStatus};
|
|
2
2
|
|
package/dist/routes/jdks.d.ts
CHANGED
package/dist/routes/launch.d.ts
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Router as a}from"express";import{validateToken as e}from"../middleware/auth.js";import{listLspProcesses as n}from"../routes/lsp.js";import{getLspInstallTask as p,installLspProvider as d,isInstallBusy as l,listLspInstallTasks as u,uninstallLspProvider as m}from"../services/lsp/install-manager.js";import{listProviderSummaries as c}from"../services/lsp/provider-registry.js";import{createLogger as v}from"../utils/logger.js";const g=v("lsp-providers"),i=a();i.get("/lsp/providers",e,async(t,r)=>{try{const s=await c();r.json({ok:!0,providers:s,installTasks:u(),busy:l()})}catch(s){r.status(500).json({error:s.message})}}),i.post("/lsp/providers/install",e,async(t,r)=>{const s=String(t.body?.providerId||"").trim().toLowerCase();if(!s){r.status(400).json({error:"providerId is required"});return}try{const o=await d(s,{registry:String(t.body?.registry||"").trim()||void 0});r.json({ok:o.phase==="done",task:o})}catch(o){g.warn(`[lsp-providers] \u5B89\u88C5\u5931\u8D25 provider=${s}: ${o.message}`),r.status(400).json({error:o.message})}}),i.post("/lsp/providers/uninstall",e,async(t,r)=>{const s=String(t.body?.providerId||"").trim().toLowerCase();if(!s){r.status(400).json({error:"providerId is required"});return}try{const o=await m(s);r.json({ok:!0,task:o})}catch(o){r.status(400).json({error:o.message})}}),i.get("/lsp/providers/task/:providerId",e,(t,r)=>{const s=p(t.params.providerId);if(!s){r.status(404).json({error:"task not found"});return}r.json({ok:!0,task:s})}),i.get("/lsp/processes",e,(t,r)=>{r.json({ok:!0,processes:n()})});export{i as lspProvidersRouter};
|
|
2
|
+
|
package/dist/routes/lsp.d.ts
CHANGED
|
@@ -1,6 +1,47 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
1
15
|
import type { IncomingMessage } from "node:http";
|
|
2
16
|
import type { Socket } from "node:net";
|
|
17
|
+
import { type LspProviderSpec } from "../services/lsp/provider-registry.js";
|
|
18
|
+
interface LspSocketContext {
|
|
19
|
+
workspacePath: string;
|
|
20
|
+
filePath: string;
|
|
21
|
+
language: string;
|
|
22
|
+
providerId: string;
|
|
23
|
+
clientId: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export declare function resolveLspSocketContext(requestUrl: URL): {
|
|
27
|
+
ctx: LspSocketContext;
|
|
28
|
+
provider: LspProviderSpec | null;
|
|
29
|
+
error?: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
3
34
|
|
|
4
35
|
export declare function attachLspWebSocketServer(server: {
|
|
5
36
|
on: (event: "upgrade", listener: (request: IncomingMessage, socket: Socket, head: Buffer) => void) => unknown;
|
|
6
37
|
}): void;
|
|
38
|
+
|
|
39
|
+
export declare function listLspProcesses(): Array<{
|
|
40
|
+
key: string;
|
|
41
|
+
providerId: string;
|
|
42
|
+
running: boolean;
|
|
43
|
+
connected: boolean;
|
|
44
|
+
}>;
|
|
45
|
+
|
|
46
|
+
export declare function disposeAllLspProcesses(): void;
|
|
47
|
+
export {};
|