aws-runtime-bridge 1.9.175 → 1.9.180
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 +223 -0
- package/README.md +61 -2
- package/dist/adapter/AcodeSdkAdapter.d.ts +382 -0
- package/dist/adapter/AcodeSdkAdapter.js +3 -3
- 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 +201 -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 +131 -0
- package/dist/routes/terminal.js +25 -25
- 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 +22 -22
- 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 +194 -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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{promises as g}from"node:fs";import p from"node:path";import{resolveSchedulerBaseUrl as y}from"../config.js";import{
|
|
1
|
+
import{promises as g}from"node:fs";import p from"node:path";import{resolveSchedulerBaseUrl as y}from"../config.js";import{createLogger as A}from"../utils/logger.js";import{getRuntimeAccessToken as f}from"./runtime-binding.js";const m=A("agent-startup-memory"),d=10;async function S(u,n){const e=[],i=p.join(u,".agentswork","memory");try{const s=(await g.readdir(i)).filter(r=>r.endsWith(".json")),t=await Promise.all(s.map(async r=>{try{const o=await g.readFile(p.join(i,r),"utf-8");return JSON.parse(o)}catch{return m.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",p.join(i,r)),null}}));for(const r of t)if(r?.by_uri)for(const o of Object.values(r.by_uri)){const l=o.memory_type||"memory",h=(o.content||"").trim();h&&l==="instance_hotspot_memory"&&e.push({title:o.title,content:h,uri:o.uri||""})}}catch{m.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",i)}if(e.length===0&&n?.schedulerBaseUrl&&n?.runtimeAccessToken&&n?.agentId){const c=`${n.schedulerBaseUrl.replace(/\/+$/,"")}/mcp/call`,s={"Content-Type":"application/json","X-Runtime-Token":n.runtimeAccessToken,Authorization:`Bearer ${n.runtimeAccessToken}`};try{const t=await fetch(c,{method:"POST",headers:s,body:JSON.stringify({tool:"list_memories",arguments:{agentId:n.agentId,memory_type:"instance_hotspot_memory"}})});if(!t.ok)throw new Error(`Server returned ${t.status}`);const r=await t.json();if(Array.isArray(r))for(const o of r){const l=(o.content||"").trim();l&&e.push({title:o.title,content:l,uri:o.uri||""})}e.length>0&&m.info(`[loadAgentStartupMemories] Loaded ${e.length} instance memory(s) from server for ${n.agentId}`)}catch(t){m.warn("[loadAgentStartupMemories] \u4ECE server \u52A0\u8F7D instance_hotspot_memory \u5931\u8D25: %s",t instanceof Error?t.message:String(t))}}e.sort((c,s)=>s.uri.localeCompare(c.uri));const a=[];if(e.length>0){const s=e.slice(0,d).map((t,r)=>`${t.title?`\u3010${t.title}\u3011`:`\u6761\u76EE ${r+1}`}
|
|
2
2
|
${t.content}`);a.push(`\u3010\u5B9E\u4F8B\u70ED\u70B9\u8BB0\u5FC6\u3011
|
|
3
3
|
${s.join(`
|
|
4
4
|
|
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
import { type UserScope } from "./user-scope.js";
|
|
14
|
+
|
|
15
|
+
export declare function createAiConfigService(scope: UserScope): AiConfigService;
|
|
4
16
|
export interface AiConfigTemplate {
|
|
5
17
|
baseUrl: string;
|
|
6
18
|
apiKey: string;
|
|
7
19
|
model: string;
|
|
8
20
|
models?: string[];
|
|
9
21
|
}
|
|
10
|
-
export interface
|
|
11
|
-
env?: {
|
|
12
|
-
ANTHROPIC_BASE_URL?: string;
|
|
13
|
-
ANTHROPIC_AUTH_TOKEN?: string;
|
|
14
|
-
ANTHROPIC_MODEL?: string;
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
export interface OpenCodeProviderConfig {
|
|
22
|
+
export interface AcodeProviderConfig {
|
|
18
23
|
npm?: string;
|
|
19
24
|
model?: string;
|
|
20
25
|
options?: {
|
|
@@ -29,56 +34,25 @@ export interface OpenCodeProviderConfig {
|
|
|
29
34
|
};
|
|
30
35
|
}>;
|
|
31
36
|
}
|
|
32
|
-
export interface
|
|
37
|
+
export interface AcodeConfig {
|
|
33
38
|
provider?: {
|
|
34
|
-
default?:
|
|
39
|
+
default?: AcodeProviderConfig;
|
|
35
40
|
};
|
|
36
41
|
}
|
|
37
|
-
export interface CodexModelProviderConfig {
|
|
38
|
-
name?: string;
|
|
39
|
-
base_url?: string;
|
|
40
|
-
wire_api?: "responses" | "chat" | string;
|
|
41
|
-
env_key?: string;
|
|
42
|
-
env_key_instructions?: string;
|
|
43
|
-
requires_openai_auth?: boolean;
|
|
44
|
-
}
|
|
45
|
-
export interface CodexConfig {
|
|
46
|
-
model?: string;
|
|
47
|
-
model_provider?: string;
|
|
48
|
-
openai_base_url?: string;
|
|
49
|
-
model_providers?: Record<string, CodexModelProviderConfig>;
|
|
50
|
-
}
|
|
51
42
|
export interface AiConfigPaths {
|
|
52
43
|
acodeConfigFile: string;
|
|
53
|
-
claudecodeConfigFile: string;
|
|
54
|
-
codexConfigFile: string;
|
|
55
|
-
opencodeConfigFile: string;
|
|
56
44
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
} | null;
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
export declare function buildAcodeAiConfig(template: AiConfigTemplate): AcodeConfig | null;
|
|
63
50
|
export declare class AiConfigService {
|
|
64
51
|
private readonly paths;
|
|
65
52
|
constructor(paths: AiConfigPaths);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
writeAcodeConfig(config: OpenCodeConfig): Promise<void>;
|
|
72
|
-
writeOpenCodeConfig(config: OpenCodeConfig): Promise<void>;
|
|
73
|
-
writeCodexConfig(config: CodexConfig): Promise<void>;
|
|
74
|
-
applyClaudeCodeConfig(patch: ClaudeCodeConfig): Promise<ClaudeCodeConfig>;
|
|
75
|
-
applyOpenCodeConfig(patch: OpenCodeConfig): Promise<OpenCodeConfig>;
|
|
76
|
-
applyAcodeConfig(patch: OpenCodeConfig): Promise<OpenCodeConfig>;
|
|
77
|
-
applyCodexConfig(patch: CodexConfig): Promise<CodexConfig>;
|
|
78
|
-
applyAiConfigTemplate(template: AiConfigTemplate): Promise<{
|
|
79
|
-
acode: OpenCodeConfig;
|
|
80
|
-
claudecode: ClaudeCodeConfig;
|
|
81
|
-
codex: CodexConfig;
|
|
82
|
-
opencode: OpenCodeConfig;
|
|
83
|
-
} | null>;
|
|
53
|
+
readAcodeConfig(): Promise<AcodeConfig>;
|
|
54
|
+
writeAcodeConfig(config: AcodeConfig): Promise<void>;
|
|
55
|
+
applyAcodeConfig(patch: AcodeConfig): Promise<AcodeConfig>;
|
|
56
|
+
|
|
57
|
+
applyAiConfigTemplate(template: AiConfigTemplate): Promise<AcodeConfig | null>;
|
|
84
58
|
}
|
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
import{promises as
|
|
2
|
-
`)}
|
|
3
|
-
`}function k(o){let e=String(o.baseUrl||"").trim();const i=String(o.apiKey||"").trim(),n=x(o),r=String(o.model||"").trim()||n[0];if(!e||!i||!r)return null;e&&!e.startsWith("http://")&&!e.startsWith("https://")&&(e=`https://${e}`),e=e.replace(/\/+$/,"");const s=h(e),c=F(e),t=Object.fromEntries(n.map(l=>[l,{name:l,modalities:{input:["text","image"],output:["text"]}}]));return{acode:{provider:{default:{npm:"@ai-sdk/openai-compatible",model:r,options:{baseURL:s,apiKey:i},models:t}}},claudecode:{env:{ANTHROPIC_BASE_URL:e,ANTHROPIC_AUTH_TOKEN:i,ANTHROPIC_MODEL:r}},codex:{model:r,model_provider:"default",model_providers:{default:{name:"Default",base_url:c,wire_api:"responses",env_key:"OPENAI_API_KEY",env_key_instructions:"Set OPENAI_API_KEY in your environment"}}},opencode:{provider:{default:{npm:"@ai-sdk/openai-compatible",model:r,options:{baseURL:s,apiKey:i},models:t}}}}}function h(o){const e=String(o||"").trim().replace(/\/+$/,"");return e&&(e.endsWith("/v1")?e:`${e}/v1`)}class T{constructor(e){this.paths=e}async readClaudeCodeConfig(){return m(this.paths.claudecodeConfigFile,{})}async readAcodeConfig(){return m(this.paths.acodeConfigFile,{})}async readOpenCodeConfig(){return m(this.paths.opencodeConfigFile,{})}async readCodexConfig(){try{const e=await u.readFile(this.paths.codexConfigFile,"utf-8");return S(e)}catch{return{}}}async writeClaudeCodeConfig(e){await C(this.paths.claudecodeConfigFile,e)}async writeAcodeConfig(e){await C(this.paths.acodeConfigFile,e)}async writeOpenCodeConfig(e){await C(this.paths.opencodeConfigFile,e)}async writeCodexConfig(e){const i=d.dirname(this.paths.codexConfigFile);await u.mkdir(i,{recursive:!0}),await u.writeFile(this.paths.codexConfigFile,$(e),"utf-8")}async applyClaudeCodeConfig(e){const i=await this.readClaudeCodeConfig(),n=p(i,e);return await this.writeClaudeCodeConfig(n),n}async applyOpenCodeConfig(e){const i=await this.readOpenCodeConfig(),n=p(i,e);return await this.writeOpenCodeConfig(n),n}async applyAcodeConfig(e){const i=await this.readAcodeConfig(),n=p(i,e);return await this.writeAcodeConfig(n),n}async applyCodexConfig(e){const i=await this.readCodexConfig(),n=p(i,e);return await this.writeCodexConfig(n),n}async applyAiConfigTemplate(e){const i=k(e);if(!i)return null;const n=await this.applyAcodeConfig(i.acode),r=await this.applyClaudeCodeConfig(i.claudecode),s=await this.applyCodexConfig(i.codex),c=await this.applyOpenCodeConfig(i.opencode);return{acode:n,claudecode:r,codex:s,opencode:c}}}export{T as AiConfigService,k as buildToolSpecificAiConfig,z as createAiConfigService};
|
|
1
|
+
import{promises as o}from"node:fs";import a from"node:path";import{getUserAiConfigFile as l}from"./user-scope.js";function b(t){return new A({acodeConfigFile:a.resolve(l(t))})}function p(t){const e=new Set,r=i=>{const n=String(i||"").trim();n&&e.add(n)};return Array.isArray(t.models)&&t.models.forEach(r),r(t.model),[...e]}async function u(t,e){try{const r=await o.readFile(t,"utf-8"),i=JSON.parse(r);return i&&typeof i=="object"&&!Array.isArray(i)?i:{...e}}catch{return{...e}}}async function m(t,e){const r=a.dirname(t);await o.mkdir(r,{recursive:!0}),await o.writeFile(t,JSON.stringify(e,null,2),"utf-8")}function c(t,e){if(!e||typeof e!="object"||Array.isArray(e))return t;const r={...t};for(const[i,n]of Object.entries(e))n!==void 0&&(n!==null&&typeof n=="object"&&!Array.isArray(n)&&r[i]!==null&&typeof r[i]=="object"&&!Array.isArray(r[i])?r[i]=c(r[i],n):r[i]=n);return r}function y(t){let e=String(t.baseUrl||"").trim();const r=String(t.apiKey||"").trim(),i=p(t),n=String(t.model||"").trim()||i[0];if(!e||!r||!n)return null;e&&!e.startsWith("http://")&&!e.startsWith("https://")&&(e=`https://${e}`),e=e.replace(/\/+$/,"");const f=g(e),d=Object.fromEntries(i.map(s=>[s,{name:s,modalities:{input:["text","image"],output:["text"]}}]));return{provider:{default:{npm:"@ai-sdk/openai-compatible",model:n,options:{baseURL:f,apiKey:r},models:d}}}}function g(t){const e=String(t||"").trim().replace(/\/+$/,"");return e&&(e.endsWith("/v1")?e:`${e}/v1`)}class A{constructor(e){this.paths=e}async readAcodeConfig(){return u(this.paths.acodeConfigFile,{})}async writeAcodeConfig(e){await m(this.paths.acodeConfigFile,e)}async applyAcodeConfig(e){const r=await this.readAcodeConfig(),i=c(r,e);return await this.writeAcodeConfig(i),i}async applyAiConfigTemplate(e){const r=y(e);return r?this.applyAcodeConfig(r):null}}export{A as AiConfigService,y as buildAcodeAiConfig,b as createAiConfigService};
|
|
4
2
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ToolInstallStatus } from '../types.js';
|
|
2
|
-
import { type
|
|
2
|
+
import { type AcodeConfig } from './ai-config-service.js';
|
|
3
3
|
export interface AiSourceTemplateInput {
|
|
4
4
|
baseUrl?: unknown;
|
|
5
5
|
apiKey?: unknown;
|
|
@@ -8,18 +8,13 @@ export interface AiSourceTemplateInput {
|
|
|
8
8
|
}
|
|
9
9
|
export interface RequestedAiSources {
|
|
10
10
|
acode?: unknown;
|
|
11
|
-
claudecode?: unknown;
|
|
12
|
-
codex?: unknown;
|
|
13
|
-
opencode?: unknown;
|
|
14
11
|
}
|
|
15
12
|
export interface AiConfigApplier {
|
|
16
|
-
applyAcodeConfig(config:
|
|
17
|
-
applyClaudeCodeConfig(config: ClaudeCodeConfig): Promise<ClaudeCodeConfig>;
|
|
18
|
-
applyCodexConfig(config: CodexConfig): Promise<CodexConfig>;
|
|
19
|
-
applyOpenCodeConfig(config: OpenCodeConfig): Promise<OpenCodeConfig>;
|
|
13
|
+
applyAcodeConfig(config: AcodeConfig): Promise<AcodeConfig>;
|
|
20
14
|
}
|
|
21
15
|
export interface ApplyCurrentAiConfigOptions {
|
|
22
16
|
template: AiSourceTemplateInput | null | undefined;
|
|
17
|
+
|
|
23
18
|
requestedSources?: RequestedAiSources;
|
|
24
19
|
toolStatus: Record<string, ToolInstallStatus>;
|
|
25
20
|
aiConfigService: AiConfigApplier;
|
|
@@ -28,17 +23,14 @@ export interface AppliedAiConfigSummary {
|
|
|
28
23
|
generatedFromUnifiedTemplate: boolean;
|
|
29
24
|
applied: {
|
|
30
25
|
acode: string[];
|
|
31
|
-
claudecode: string[];
|
|
32
|
-
codex: string[];
|
|
33
|
-
opencode: string[];
|
|
34
26
|
};
|
|
35
27
|
skippedTools: string[];
|
|
36
28
|
merged: {
|
|
37
|
-
acode:
|
|
38
|
-
claudecode: ClaudeCodeConfig | null;
|
|
39
|
-
codex: CodexConfig | null;
|
|
40
|
-
opencode: OpenCodeConfig | null;
|
|
29
|
+
acode: AcodeConfig | null;
|
|
41
30
|
};
|
|
42
31
|
}
|
|
43
32
|
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
44
36
|
export declare function applyCurrentAiConfigToInstalledTools(options: ApplyCurrentAiConfigOptions): Promise<AppliedAiConfigSummary>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{buildAcodeAiConfig as a}from"./ai-config-service.js";function d(e){return{baseUrl:String(e?.baseUrl||""),apiKey:String(e?.apiKey||""),model:String(e?.model||""),models:Array.isArray(e?.models)?e.models.map(n=>String(n||"").trim()).filter(Boolean):void 0}}function c(e,n){return!!e[n]?.installed}function s(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function f(e){return Object.keys(e).length>0}function u(e){return!s(e)||!f(e)?null:e}async function m(e){const n=e.template?a(d(e.template)):null,i=u(e.requestedSources?.acode),o=n||i,l=Object.values(e.toolStatus).filter(t=>!t.installed).map(t=>t.tool);let r=null;return o&&c(e.toolStatus,"acode")&&(r=await e.aiConfigService.applyAcodeConfig(o)),{generatedFromUnifiedTemplate:!!n,applied:{acode:o&&r?Object.keys(o):[]},skippedTools:l,merged:{acode:r}}}export{m as applyCurrentAiConfigToInstalledTools};
|
|
2
2
|
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
2
10
|
import { getAutoRegisterConfigFilePath } from "../config.js";
|
|
3
11
|
|
|
12
|
+
|
|
13
|
+
|
|
4
14
|
interface AutoRegisterConfig {
|
|
5
15
|
|
|
6
16
|
enabled: boolean;
|
|
@@ -9,26 +19,60 @@ interface AutoRegisterConfig {
|
|
|
9
19
|
|
|
10
20
|
tenantId?: string;
|
|
11
21
|
|
|
22
|
+
userId?: string;
|
|
23
|
+
|
|
12
24
|
userKey: string;
|
|
13
25
|
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
machineToken?: string;
|
|
32
|
+
|
|
14
33
|
connectionKey?: string;
|
|
15
34
|
|
|
16
35
|
instanceName?: string;
|
|
17
36
|
|
|
18
37
|
instanceId?: string;
|
|
19
38
|
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
credentialId?: string;
|
|
45
|
+
|
|
46
|
+
credentialRef?: string;
|
|
47
|
+
|
|
48
|
+
credentialType?: string;
|
|
49
|
+
|
|
20
50
|
projectId?: string;
|
|
21
51
|
|
|
22
52
|
roleName?: string;
|
|
23
53
|
|
|
24
54
|
workspacePath?: string;
|
|
25
55
|
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
26
60
|
registerAddr?: string;
|
|
27
61
|
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
28
66
|
registerIp?: string;
|
|
29
67
|
|
|
30
68
|
virtualIp?: string;
|
|
31
69
|
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
32
76
|
tunnel?: boolean;
|
|
33
77
|
|
|
34
78
|
preferSameLanIp?: boolean;
|
|
@@ -39,27 +83,125 @@ interface AutoRegisterConfig {
|
|
|
39
83
|
}
|
|
40
84
|
export declare function getConfiguredConnectionKeys(): string[];
|
|
41
85
|
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
export declare function findConfigsByConnectionKey(connectionKey: string): AutoRegisterConfig[];
|
|
92
|
+
|
|
93
|
+
export declare function getCurrentConfiguredConnectionKey(): string;
|
|
94
|
+
|
|
42
95
|
export declare function cancelBackgroundRegisterRetries(): void;
|
|
43
96
|
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
export declare function collapseDuplicatedSecret(value: string): string;
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
44
111
|
export { getAutoRegisterConfigFilePath };
|
|
45
112
|
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
export declare function listConfiguredTargetSummaries(): Array<Record<string, unknown>>;
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
46
130
|
export declare function loadConfig(): AutoRegisterConfig;
|
|
47
131
|
export declare function loadConfigs(): AutoRegisterConfig[];
|
|
48
132
|
export declare function isTunnelConfig(config?: AutoRegisterConfig): boolean;
|
|
49
133
|
export declare function resolveRuntimeBridgeBaseUrl(config: AutoRegisterConfig): string;
|
|
50
134
|
export declare function loadPrimaryLifecycleConfig(): AutoRegisterConfig;
|
|
51
135
|
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
52
147
|
export declare function resolveSchedulerBaseUrlFromToken(token: unknown): string | undefined;
|
|
53
148
|
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
export declare function resolveTargetIdentityFromToken(token: unknown): {
|
|
155
|
+
serverUrl: string;
|
|
156
|
+
userKey?: string;
|
|
157
|
+
identityKey?: string;
|
|
158
|
+
instanceId?: string;
|
|
159
|
+
} | undefined;
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
export declare function resolveInstanceIdForTarget(serverUrl: string, identity?: string): string | undefined;
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
export declare function replaceConfiguredConnectionKey(newConnectionKey: string, target?: {
|
|
176
|
+
serverUrl?: string;
|
|
177
|
+
instanceId?: string;
|
|
178
|
+
credentialId?: string;
|
|
179
|
+
}): Promise<{
|
|
180
|
+
envOverrideWarning: boolean;
|
|
181
|
+
rotated: boolean;
|
|
182
|
+
}>;
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
54
194
|
export declare function autoRegister(customConfig?: Partial<AutoRegisterConfig>): Promise<boolean>;
|
|
55
195
|
|
|
196
|
+
|
|
197
|
+
|
|
56
198
|
export declare function requestRuntimeAccessTokenRefresh(): Promise<{
|
|
57
199
|
success: boolean;
|
|
58
200
|
runtimeAccessToken?: string;
|
|
59
201
|
updated?: boolean;
|
|
60
202
|
error?: string;
|
|
61
203
|
}>;
|
|
62
|
-
export declare function requestRuntimeAccessTokenRefreshForServer(serverBaseUrl: string): Promise<{
|
|
204
|
+
export declare function requestRuntimeAccessTokenRefreshForServer(serverBaseUrl: string, userKey?: string): Promise<{
|
|
63
205
|
success: boolean;
|
|
64
206
|
runtimeAccessToken?: string;
|
|
65
207
|
updated?: boolean;
|
|
@@ -67,18 +209,40 @@ export declare function requestRuntimeAccessTokenRefreshForServer(serverBaseUrl:
|
|
|
67
209
|
}>;
|
|
68
210
|
export declare function unregister(): Promise<boolean>;
|
|
69
211
|
|
|
212
|
+
|
|
213
|
+
|
|
70
214
|
export declare function getRegistrationState(): {
|
|
71
215
|
registered: boolean;
|
|
72
216
|
instanceId?: string;
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
|
|
73
222
|
registrations: Record<string, string>;
|
|
74
223
|
lastAttempt?: Date;
|
|
75
224
|
error?: string;
|
|
76
225
|
};
|
|
77
226
|
|
|
227
|
+
|
|
228
|
+
|
|
78
229
|
export declare function isRegistered(): boolean;
|
|
79
230
|
|
|
231
|
+
|
|
232
|
+
|
|
80
233
|
export declare function getInstanceId(): string | undefined;
|
|
81
234
|
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
|
|
82
246
|
export declare function bridgeRestartCleanup(): Promise<{
|
|
83
247
|
success: boolean;
|
|
84
248
|
agentCount?: number;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import g from"node:fs";import A from"node:os";import I from"axios";import{v4 as G}from"uuid";import{getActiveBridgeHttpPort as M,getAutoRegisterConfigFilePath as m,schedulerBaseUrl as d}from"../config.js";import{runExclusiveConfigWrite as z}from"../utils/config-write-queue.js";import{logger as i}from"../utils/logger.js";import{clearRuntimeBinding as J,clearScopedRuntimeAccessToken as Y,getRuntimeAccessToken as E,getRuntimeBindingPublicState as w,getScopedRuntimeAccessToken as q,loadRuntimeBinding as h,normalizeSchedulerBaseUrl as p,saveRuntimeBinding as K,saveScopedRuntimeAccessToken as C}from"./runtime-binding.js";const P={enabled:!1,serverUrl:d,preferSameLanIp:!0,maxRetries:3,retryInterval:2e3},u={registered:!1,registrations:{}};let b=[];function Ae(){return[...b]}const H=3e4;function W(){const e=Number(process.env.AWS_REGISTER_BACKGROUND_RETRY_INTERVAL);return Number.isFinite(e)&&e>0?e:H}const R=new Map;function L(e){const r=e.serverUrl||d,t=p(r)||r;if(R.has(t))return;const n=setTimeout(()=>{R.delete(t),V(e,t)},W());n.unref?.(),R.set(t,n)}async function V(e,r){try{const t=S().find(n=>(p(n.serverUrl||d)||n.serverUrl||d)===r)||e;await $(t,{backgroundRetry:!0})}catch(t){i.warn(`[AutoRegister] \u540E\u53F0\u91CD\u8BD5\u6CE8\u518C\u5F02\u5E38: ${t.message}`),L(e)}}function Ie(){for(const e of R.values())clearTimeout(e);R.clear()}function f(e){return e==null?void 0:String(e).trim()||void 0}function x(e){return p(e)}function v(e){if(typeof e=="boolean")return e;if(typeof e=="string"){const r=e.trim().toLowerCase();if(["true","1","yes","y"].includes(r))return!0;if(["false","0","no","n"].includes(r))return!1}}function O(e){if(e==null||e==="")return;const r=Number(e);return Number.isFinite(r)?r:void 0}function k(e){const r=f(e.serverUrl)||f(e.schedulerBaseUrl),t=f(e.connectionKey)||f(e.password);return{enabled:v(e.enabled),serverUrl:r,tenantId:f(e.tenantId),userKey:f(e.userKey),connectionKey:t,instanceName:f(e.instanceName),instanceId:f(e.instanceId),projectId:f(e.projectId),roleName:f(e.roleName),workspacePath:f(e.workspacePath),registerAddr:f(e.registerAddr),registerIp:f(e.registerIp),virtualIp:f(e.virtualIp),tunnel:v(e.tunnel),preferSameLanIp:v(e.preferSameLanIp),maxRetries:O(e.maxRetries),retryInterval:O(e.retryInterval)}}function j(){const e=m();try{if(!g.existsSync(e))return i.debug(`[AutoRegister] \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;const r=g.readFileSync(e,"utf-8"),t=JSON.parse(r);return i.info(`[AutoRegister] \u4ECE\u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D\u914D\u7F6E: ${e}`),k(t)}catch(r){const t=r;return i.warn(`[AutoRegister] \u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${e}, error: ${t.message}`),null}}function X(){const e=m();try{if(!g.existsSync(e))return[];const r=g.readFileSync(e,"utf-8"),t=JSON.parse(r),n=k(t),o=Array.isArray(t.autoRegisterTargets)?t.autoRegisterTargets:[];return o.length===0?n.userKey?[n]:[]:o.filter(s=>!!(s&&typeof s=="object"&&!Array.isArray(s))).map(s=>{const a=k(s);return{...n,...a,connectionKey:a.connectionKey||n.connectionKey}})}catch(r){const t=r;return i.warn(`[AutoRegister] \u8BFB\u53D6\u81EA\u52A8\u6CE8\u518C\u76EE\u6807\u5931\u8D25: ${e}, error: ${t.message}`),[]}}function F(){const e={};return process.env.AWS_AUTO_REGISTER==="true"&&(e.enabled=!0),process.env.AWS_RUNTIME_SCHEDULER_BASE_URL&&(e.serverUrl=process.env.AWS_RUNTIME_SCHEDULER_BASE_URL),process.env.AWS_TENANT_ID&&(e.tenantId=process.env.AWS_TENANT_ID),process.env.AWS_USER_KEY&&(e.userKey=process.env.AWS_USER_KEY),process.env.AWS_BRIDGE_CONNECTION_KEY&&(e.connectionKey=process.env.AWS_BRIDGE_CONNECTION_KEY),process.env.AWS_INSTANCE_NAME&&(e.instanceName=process.env.AWS_INSTANCE_NAME),process.env.AWS_PROJECT_NAME&&(e.projectId=process.env.AWS_PROJECT_NAME),process.env.AWS_ROLE_NAME&&(e.roleName=process.env.AWS_ROLE_NAME),process.env.AWS_WORKSPACE_PATH&&(e.workspacePath=process.env.AWS_WORKSPACE_PATH),process.env.AWS_REGISTER_ADDR&&(e.registerAddr=process.env.AWS_REGISTER_ADDR),process.env.AWS_REGISTER_IP&&(e.registerIp=process.env.AWS_REGISTER_IP),process.env.AWS_VIRTUAL_IP&&(e.virtualIp=process.env.AWS_VIRTUAL_IP),process.env.AWS_PREFER_SAME_LAN_IP&&(e.preferSameLanIp=v(process.env.AWS_PREFER_SAME_LAN_IP)??!0),process.env.AWS_REGISTER_MAX_RETRIES&&(e.maxRetries=parseInt(process.env.AWS_REGISTER_MAX_RETRIES,10)),process.env.AWS_REGISTER_RETRY_INTERVAL&&(e.retryInterval=parseInt(process.env.AWS_REGISTER_RETRY_INTERVAL,10)),e}function T(){const e=j(),r=F(),t={...P,...e||{},...r},n=t.instanceName||A.hostname();let o=!1;return process.env.AWS_AUTO_REGISTER!==void 0?o=process.env.AWS_AUTO_REGISTER==="true":e&&(o=!0),{enabled:o,serverUrl:t.serverUrl||d,tenantId:t.tenantId||"",userKey:t.userKey||"",connectionKey:t.connectionKey,instanceName:n,instanceId:t.instanceId,projectId:t.projectId,roleName:t.roleName,workspacePath:t.workspacePath,registerAddr:t.registerAddr,registerIp:t.registerIp,virtualIp:t.virtualIp,tunnel:typeof t.tunnel=="boolean"?t.tunnel:void 0,preferSameLanIp:t.preferSameLanIp!==!1,maxRetries:t.maxRetries,retryInterval:t.retryInterval}}function S(){const e=X(),r=F(),n=(e.length>0?e:[j()||{}]).map(o=>{const s={...P,...o,...r};let a=!1;return process.env.AWS_AUTO_REGISTER!==void 0?a=process.env.AWS_AUTO_REGISTER==="true":a=e.length>0||!!s.userKey,{enabled:a,serverUrl:s.serverUrl||d,tenantId:s.tenantId||"",userKey:s.userKey||"",connectionKey:s.connectionKey,instanceName:s.instanceName||A.hostname(),instanceId:s.instanceId,projectId:s.projectId,roleName:s.roleName,workspacePath:s.workspacePath,registerAddr:s.registerAddr,registerIp:s.registerIp,virtualIp:s.virtualIp,tunnel:typeof s.tunnel=="boolean"?s.tunnel:void 0,preferSameLanIp:s.preferSameLanIp!==!1,maxRetries:s.maxRetries,retryInterval:s.retryInterval}});return b=n.map(o=>o.connectionKey).filter(o=>!!(o&&o.trim())),n}function Q(){const e=A.networkInterfaces(),r=[];for(const t of Object.keys(e)){const n=e[t];if(n)for(const o of n)o.family==="IPv4"&&!o.internal&&r.push({address:o.address,netmask:o.netmask,name:t})}return r}function N(e){const r=e.split(".").map(Number);return(r[0]<<24)+(r[1]<<16)+(r[2]<<8)+r[3]}function Z(e,r,t){const n=N(e),o=N(r),s=N(t);return(n&s)===(o&s)}function ee(e){try{const r=new URL(e);return r.hostname==="localhost"||r.hostname==="127.0.0.1"?"127.0.0.1":/^(\d{1,3}\.){3}\d{1,3}$/.test(r.hostname)?r.hostname:null}catch{return null}}function re(e){return e==="127.0.0.1"}function te(e){const r=Q();if(r.length===0)return i.warn("[AutoRegister] \u672A\u627E\u5230\u4EFB\u4F55\u975E\u5185\u90E8 IP \u5730\u5740\uFF0C\u4F7F\u7528 127.0.0.1"),"127.0.0.1";const t=ee(e);if(t){if(re(t))return"127.0.0.1";for(const n of r)if(Z(n.address,t,n.netmask))return i.info(`[AutoRegister] \u627E\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u540C\u5B50\u7F51\u7684 IP: ${n.address} (\u7F51\u5361: ${n.name}, \u5B50\u7F51\u63A9\u7801: ${n.netmask})`),n.address;i.warn(`[AutoRegister] \u672A\u627E\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3 (${t}) \u540C\u5B50\u7F51\u7684\u672C\u673A IP\uFF0C\u4F7F\u7528 127.0.0.1`)}else i.warn("[AutoRegister] \u65E0\u6CD5\u89E3\u6790\u8C03\u5EA6\u4E2D\u5FC3 IP\uFF0C\u4F7F\u7528 127.0.0.1");return"127.0.0.1"}function ne(e=d){return te(e)}function D(e){const r=e||T();return!r.enabled||!r.userKey?!1:r.tunnel===!0?!0:r.tunnel===!1?!1:!r.registerAddr&&!r.registerIp&&!r.virtualIp}function U(e){const r=M();if(D(e)){const s=e.serverUrl||d;try{const a=new URL(s);if(!e.instanceId)i.warn("[AutoRegister] \u96A7\u9053\u6A21\u5F0F\u4F46\u7F3A\u5C11 instanceId\uFF0C\u964D\u7EA7\u4E3A\u76F4\u8FDE\u6A21\u5F0F");else return`${a.protocol}//${a.host}/tunnel/${e.instanceId}`}catch{i.warn("[AutoRegister] serverUrl \u89E3\u6790\u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A\u76F4\u8FDE\u6A21\u5F0F")}}const t=e.preferSameLanIp===!1?"127.0.0.1":ne(e.serverUrl||d),n=e.registerAddr||e.registerIp||e.virtualIp||t;return n?/^https?:\/\//i.test(n)?n:/:[0-9]+$/.test(n)?`http://${n}`:`http://${n}:${r}`:`http://127.0.0.1:${r}`}function y(){return S()[0]||T()}function Re(e){const r=String(e||"").trim();if(!r)return;const t=[];for(const o of S())o?.serverUrl&&t.push(o.serverUrl);const n=h();n.schedulerBaseUrl&&t.push(n.schedulerBaseUrl);for(const o of t){const s=q(o);if(s&&s===r)return p(o)}}function se(e){return e?Object.entries(u.registrations).find(([,t])=>t===e)?.[0]:void 0}function _(e,r){const t=se(r);if(t)return t;const n=f(e.serverUrl);if(n&&(n!==d||process.env.AWS_RUNTIME_SCHEDULER_BASE_URL))return n;const o=h(),s=f(o.schedulerBaseUrl);return o.status==="paired"&&s?s:n||d}async function oe(e){const r=e.instanceName||A.hostname(),t=e.serverUrl||d,n={tenantId:e.tenantId,userKey:e.userKey,instanceId:e.instanceId,instanceName:r,hostname:A.hostname(),virtualIp:e.registerAddr||e.registerIp||e.virtualIp,runtimeBridgeBaseUrl:U(e),connectionKey:e.connectionKey,workspacePath:e.workspacePath,projectId:e.projectId,roleName:e.roleName};return i.info(`[AutoRegister] \u6B63\u5728\u6CE8\u518C\u5B9E\u4F8B: ${r}`),i.info(`[AutoRegister] \u8C03\u5EA6\u4E2D\u5FC3: ${t}`),i.info(`[AutoRegister] \u7528\u6237 Key: ${e.userKey?"****"+e.userKey.slice(-4):"(\u672A\u8BBE\u7F6E)"}`),i.info(`[AutoRegister] \u79DF\u6237 ID: ${e.tenantId||"(\u81EA\u52A8\u63A8\u5BFC)"}`),(await I.post(`${t}/api/instances/register`,n,{headers:{"Content-Type":"application/json"},timeout:1e4})).data}function ie(e,r){const t=m();return z(t,()=>{if(!g.existsSync(t))return;const n=g.readFileSync(t,"utf-8"),o=JSON.parse(n),s=p(e);if(!s)return;let a=!1;const l=c=>{p(String(c.serverUrl||c.schedulerBaseUrl||""))===s&&r&&c.instanceId!==r&&(c.instanceId=r,a=!0)};if(Array.isArray(o.autoRegisterTargets))for(const c of o.autoRegisterTargets)c&&typeof c=="object"&&!Array.isArray(c)&&l(c);else l(o);a&&(g.writeFileSync(t,JSON.stringify(o,null,2),"utf-8"),i.info(`[AutoRegister] \u5DF2\u56DE\u5199 instanceId \u5230 config.json (serverUrl=${e})`))})}async function ae(e){const r=_(y(),e),t=E(r);if(!t)throw new Error("runtimeAccessToken is required to unregister bridge instance");return(await I.post(`${r}/api/instances/unregister`,{instanceId:e},{headers:{"Content-Type":"application/json","X-Runtime-Token":t},timeout:1e4})).data}async function Se(e){const r=e?[{...T(),...e}]:S(),n=(r.length>1?await Promise.all(r.map(s=>$(s))):[await $(r[0]||T())]).every(Boolean),o=r.every(s=>!s.enabled||!s.userKey);if(!e&&(n||o)){const{stopTunnelClientsExcept:s}=await import("./tunnel-client.js");s(r.map(a=>a.serverUrl).filter(a=>!!a))}return n}async function $(e,r){if(!e.enabled)return i.info("[AutoRegister] \u81EA\u52A8\u6CE8\u518C\u672A\u542F\u7528"),i.info(`[AutoRegister] \u8981\u542F\u7528\u81EA\u52A8\u6CE8\u518C\uFF0C\u8BF7\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6 ${m()} \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF AWS_AUTO_REGISTER=true`),!1;if(!e.userKey)return i.error("[AutoRegister] \u7F3A\u5C11\u7528\u6237 Key\uFF08\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u8BBE\u7F6E userKey \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF AWS_USER_KEY\uFF09"),!1;const t=D(e);t&&!e.instanceId&&(e={...e,instanceId:`bridge-${G().replace(/-/g,"").slice(0,12)}`},i.info(`[AutoRegister] \u96A7\u9053\u6A21\u5F0F\uFF1A\u5DF2\u9884\u58F0\u660E instanceId=${e.instanceId}`));const n=r?.backgroundRetry?1:e.maxRetries??3,o=e.retryInterval??2e3;for(let s=1;s<=n;s++){try{u.lastAttempt=new Date;const a=await oe(e);if(a.success){if(u.registered=!0,u.instanceId=a.instanceId,a.instanceId&&(u.registrations[e.serverUrl||d]=a.instanceId),u.error=void 0,i.info("[AutoRegister] \u2713 \u6CE8\u518C\u6210\u529F\uFF01"),i.info(`[AutoRegister] \u5B9E\u4F8B ID: ${a.instanceId}`),i.info(`[AutoRegister] \u6D88\u606F: ${a.message}`),i.info(`[AutoRegister] \u66F4\u65B0: ${a.isUpdate?"\u662F":"\u5426"}`),a.runtimeAccessToken)try{const l=e.serverUrl||d;K({accessToken:a.runtimeAccessToken,instanceId:a.instanceId,userId:a.userId,schedulerBaseUrl:l});const c=p(a.serverUrl);c&&c!==p(l)&&(C({serverBaseUrl:c,accessToken:a.runtimeAccessToken}),i.info(`[AutoRegister] \u68C0\u6D4B\u5230 server \u4E0B\u53D1\u5730\u5740(${c})\u4E0E\u8FDE\u63A5\u5730\u5740(${l})\u4E0D\u540C\uFF0C\u5DF2\u6309\u4E24\u4E2A\u5730\u5740\u5206\u522B\u4FDD\u5B58 scoped token`)),i.info("[AutoRegister] \u5DF2\u4FDD\u5B58\u8C03\u5EA6\u4E2D\u5FC3\u4E0B\u53D1\u7684 runtime access token"),a.instanceId&&ie(e.serverUrl||d,a.instanceId).catch(B=>{i.warn(`[AutoRegister] \u56DE\u5199 instanceId \u5230 config.json \u5931\u8D25: ${B.message}`)})}catch(l){const c=l;return i.error(`[AutoRegister] \u4FDD\u5B58 runtime access token \u5931\u8D25: ${c.message}`),u.error=c.message,!1}else i.warn("[AutoRegister] \u6CE8\u518C\u54CD\u5E94\u672A\u5305\u542B runtime access token\uFF0CMCP \u5C06\u65E0\u6CD5\u8BBF\u95EE\u8C03\u5EA6\u4E2D\u5FC3\uFF0C\u8BF7\u68C0\u67E5 server \u7684 bridge \u5B9E\u4F8B token \u9881\u53D1\u903B\u8F91");if(t&&a.instanceId&&a.runtimeAccessToken){const{startTunnelClient:l}=await import("./tunnel-client.js"),c=e.serverUrl||d;l(c,a.instanceId),i.info(`[AutoRegister] \u96A7\u9053\u5BA2\u6237\u7AEF\u5DF2\u542F\u52A8: server=${c}, instanceId=${a.instanceId}`)}return!0}else i.warn(`[AutoRegister] \u6CE8\u518C\u5931\u8D25: ${a.message}`),u.error=a.message}catch(a){const l=a,c=l.response?.data?JSON.stringify(l.response.data):l.message;i.error(`[AutoRegister] \u6CE8\u518C\u8BF7\u6C42\u5931\u8D25 (\u5C1D\u8BD5 ${s}/${n}): ${c}`),u.error=c}s<n&&(i.info(`[AutoRegister] ${o/1e3} \u79D2\u540E\u91CD\u8BD5...`),await new Promise(a=>setTimeout(a,o)))}return r?.backgroundRetry?i.warn(`[AutoRegister] \u540E\u53F0\u91CD\u8BD5\u6CE8\u518C\u4ECD\u672A\u6210\u529F (server=${e.serverUrl||d}): ${u.error||"\u672A\u77E5"}`):(i.error("[AutoRegister] \u2717 \u6CE8\u518C\u5931\u8D25\uFF0C\u5DF2\u8FBE\u6700\u5927\u91CD\u8BD5\u6B21\u6570"),i.error("[AutoRegister] ========================================"),i.error("[AutoRegister] \u81EA\u52A8\u6CE8\u518C\u5DF2\u542F\u7528\u4F46\u6CE8\u518C\u5931\u8D25\uFF0C\u5B9E\u4F8B\u6682\u65F6\u65E0\u6CD5\u6B63\u5E38\u5DE5\u4F5C"),i.error("[AutoRegister] \u8BF7\u68C0\u67E5\u4EE5\u4E0B\u914D\u7F6E\uFF1A"),i.error(`[AutoRegister] - \u7528\u6237 Key (userKey): ${e.userKey?"****"+e.userKey.slice(-4):"(\u672A\u8BBE\u7F6E)"}`),i.error(`[AutoRegister] - \u79DF\u6237 ID (tenantId): ${e.tenantId||"(\u53EF\u9009\uFF0C\u5C06\u81EA\u52A8\u63A8\u5BFC)"}`),i.error(`[AutoRegister] - \u5B9E\u4F8B\u540D (instanceName): ${e.instanceName||"(\u4F7F\u7528\u4E3B\u673A\u540D)"}`),i.error(`[AutoRegister] - \u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740: ${e.serverUrl||d}`),i.error(`[AutoRegister] - \u6700\u540E\u9519\u8BEF: ${u.error||"\u672A\u77E5"}`),i.error("[AutoRegister] ========================================"),i.error(`[AutoRegister] \u914D\u7F6E\u6765\u6E90\uFF1A${m()} \u6216\u73AF\u5883\u53D8\u91CF`),i.warn(`[AutoRegister] \u5C06\u5728\u540E\u53F0\u6301\u7EED\u91CD\u8BD5\u6CE8\u518C\uFF08\u6BCF ${Math.round(W()/1e3)} \u79D2\uFF09\uFF0C\u76F4\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u5EFA\u7ACB\u8FDE\u63A5`)),L(e),!1}async function ye(){const e=y();if(!e.userKey)return{success:!1,error:"userKey is required for runtime token refresh"};const r=w(),t=_(e),n=U(e);try{const o=await I.post(`${t}/api/instances/runtime-tokens/refresh`,{tenantId:e.tenantId,userKey:e.userKey,instanceId:r.instanceId,instanceName:e.instanceName,runtimeBridgeBaseUrl:n},{headers:{"Content-Type":"application/json"},timeout:1e4});if(!o.data.success||!o.data.runtimeAccessToken)return{success:!1,error:o.data.message||"scheduler did not return runtimeAccessToken"};const a=E()!==o.data.runtimeAccessToken;return K({accessToken:o.data.runtimeAccessToken,instanceId:r.instanceId,userId:o.data.userId||e.userKey,schedulerBaseUrl:t}),{success:!0,runtimeAccessToken:o.data.runtimeAccessToken,updated:a}}catch(o){const s=o;return{success:!1,error:s.response?.data?JSON.stringify(s.response.data):s.message}}}async function ve(e){const r=x(e);if(!r)return{success:!1,error:"serverUrl is required for runtime token refresh"};const t=S().find(s=>x(s.serverUrl)===r)||y();if(!t.userKey)return{success:!1,error:"userKey is required for runtime token refresh"};const n=w(),o=U(t);try{const s=await I.post(`${r}/api/instances/runtime-tokens/refresh`,{tenantId:t.tenantId,userKey:t.userKey,instanceId:n.instanceId,instanceName:t.instanceName,runtimeBridgeBaseUrl:o},{headers:{"Content-Type":"application/json"},timeout:1e4});if(!s.data.success||!s.data.runtimeAccessToken)return{success:!1,error:s.data.message||"scheduler did not return runtimeAccessToken"};const l=E(r)!==s.data.runtimeAccessToken;return C({serverBaseUrl:r,accessToken:s.data.runtimeAccessToken}),{success:!0,runtimeAccessToken:s.data.runtimeAccessToken,updated:l}}catch(s){const a=s;return{success:!1,error:a.response?.data?JSON.stringify(a.response.data):a.message}}}async function Te(){if(!u.registered||!u.instanceId)return i.info("[AutoRegister] \u5B9E\u4F8B\u672A\u6CE8\u518C\uFF0C\u65E0\u9700\u6CE8\u9500"),!0;try{const e=await ae(u.instanceId);if(e.success){i.info(`[AutoRegister] \u2713 \u6CE8\u9500\u6210\u529F: ${u.instanceId}`);const r=_(y(),u.instanceId);h().schedulerBaseUrl&&Y(r),J();try{const{stopTunnelClientForServer:n}=await import("./tunnel-client.js");n(r)}catch(n){i.warn(`[AutoRegister] \u6CE8\u9500\u540E\u505C\u6B62\u96A7\u9053\u5931\u8D25: ${n.message}`)}return u.registered=!1,u.instanceId=void 0,!0}else return i.warn(`[AutoRegister] \u6CE8\u9500\u5931\u8D25: ${e.message}`),!1}catch(e){const r=e;return i.error(`[AutoRegister] \u6CE8\u9500\u8BF7\u6C42\u5931\u8D25: ${r.message}`),!1}}function Ue(){return{...u}}function _e(){return u.registered}function Ee(){return u.instanceId}async function he(){const e=y(),r=u.instanceId,t=_(e,r),n={};if(r&&(n.instanceId=r),e.enabled&&(n.runtimeBridgeBaseUrl=U(e)),!n.instanceId&&!n.runtimeBridgeBaseUrl)return i.info("[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\uFF1A\u6CA1\u6709 instanceId \u6216 runtimeBridgeBaseUrl\uFF0C\u8DF3\u8FC7\u6E05\u7406"),{success:!0,agentCount:0};try{i.info("[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\uFF1A\u6B63\u5728\u901A\u77E5\u8C03\u5EA6\u4E2D\u5FC3..."),i.info(`[AutoRegister] instanceId: ${n.instanceId||"(\u65E0)"}`),i.info(`[AutoRegister] runtimeBridgeBaseUrl: ${n.runtimeBridgeBaseUrl||"(\u65E0)"}`);const o=await I.post(`${t}/api/instances/bridge-restart-cleanup`,n,{headers:{"Content-Type":"application/json"},timeout:1e4});return o.data.success?(i.info(`[AutoRegister] \u2713 Bridge \u91CD\u542F\u6E05\u7406\u6210\u529F\uFF1A${o.data.message}`),i.info(`[AutoRegister] \u6E05\u7406\u4E86 ${o.data.agentCount||0} \u4E2A Agent`),{success:!0,agentCount:o.data.agentCount||0}):(i.warn(`[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\u5931\u8D25\uFF1A${o.data.message}`),{success:!1,error:o.data.message})}catch(o){const s=o,a=s.response?.data?JSON.stringify(s.response.data):s.message;return i.warn(`[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\u8BF7\u6C42\u5931\u8D25\uFF1A${a}`),{success:!1,error:a}}}export{Se as autoRegister,he as bridgeRestartCleanup,Ie as cancelBackgroundRegisterRetries,m as getAutoRegisterConfigFilePath,Ae as getConfiguredConnectionKeys,Ee as getInstanceId,Ue as getRegistrationState,_e as isRegistered,D as isTunnelConfig,T as loadConfig,S as loadConfigs,y as loadPrimaryLifecycleConfig,ye as requestRuntimeAccessTokenRefresh,ve as requestRuntimeAccessTokenRefreshForServer,U as resolveRuntimeBridgeBaseUrl,Re as resolveSchedulerBaseUrlFromToken,Te as unregister};
|
|
1
|
+
import{randomBytes as ce}from"node:crypto";import p from"node:fs";import N from"node:os";import w from"axios";import{v4 as ue}from"uuid";import{getActiveBridgeHttpPort as de,getAutoRegisterConfigFilePath as S,isDesktopAppMode as le,schedulerBaseUrl as m}from"../config.js";import{runExclusiveConfigWrite as D}from"../utils/config-write-queue.js";import{logger as a}from"../utils/logger.js";import{buildTargetKey as x,fingerprintUserKey as fe,serverUrlOfTargetKey as F}from"../utils/target-identity.js";import{clearRuntimeBinding as ge,clearScopedRuntimeAccessToken as me,getRuntimeAccessToken as G,getRuntimeBindingPublicState as pe,getScopedRuntimeAccessToken as q,listScopedRuntimeAccessTokens as ye,loadRuntimeBinding as M,normalizeSchedulerBaseUrl as T,saveRuntimeBinding as Y,saveScopedRuntimeAccessToken as H}from"./runtime-binding.js";const V={enabled:!1,serverUrl:m,preferSameLanIp:!0,maxRetries:3,retryInterval:2e3},d={registered:!1,registrations:{}};let k=[];const Ie=10*60*1e3,B=new Map;function X(){const e=Date.now();for(const[r,t]of B)t.expiresAt<=e&&B.delete(r)}function Je(){X();const e=[...k];for(const r of B.values())r.key&&!e.includes(r.key)&&e.push(r.key);return e}function qe(e){const r=String(e||"").trim();if(!r)return[];const t=K(),n=t.filter(s=>String(s.connectionKey||"").trim()===r);if(n.length>0)return n;X();const o=new Set;for(const[s,i]of B)i.key===r&&o.add(s);return o.size===0?[]:t.filter(s=>o.has(C(s)))}function Ye(){return k[0]??""}const Ae=3e4;function Q(){const e=Number(process.env.AWS_REGISTER_BACKGROUND_RETRY_INTERVAL);return Number.isFinite(e)&&e>0?e:Ae}const $=new Map;function Z(e){const r=e.serverUrl||m,t=C(e)||r;if($.has(t))return;const n=setTimeout(()=>{$.delete(t),Re(e,t)},Q());n.unref?.(),$.set(t,n)}async function Re(e,r){try{const t=K().find(n=>C(n)===r)||e;await J(t,{backgroundRetry:!0})}catch(t){a.warn(`[AutoRegister] \u540E\u53F0\u91CD\u8BD5\u6CE8\u518C\u5F02\u5E38: ${t.message}`),Z(e)}}function He(){for(const e of $.values())clearTimeout(e);$.clear()}function Se(e){const r=e.trim();if(r.length<8)return r;for(let t=1;t<=r.length/2;t++){if(r.length%t!==0)continue;const n=r.slice(0,t);let o=!0;for(let s=t;s<r.length;s+=t)if(r.slice(s,s+t)!==n){o=!1;break}if(o&&n.length<r.length)return n}return r}function Te(e){const r=g(e);if(!r)return r;const t=Se(r);return t!==r&&a.warn(`[AutoRegister] userKey \u7591\u4F3C\u88AB\u590D\u5236\u4E86\u4E24\u904D\uFF08\u957F\u5EA6 ${r.length} \u2192 ${t.length}\uFF09\uFF0C\u5DF2\u81EA\u52A8\u53BB\u91CD\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u662F\u5426\u91CD\u590D\u7C98\u8D34\u3002`),t}function g(e){return e==null?void 0:String(e).trim()||void 0}function _(e){return T(e)}function ee(e){return Array.isArray(e.autoRegisterTargets)?e.autoRegisterTargets.filter(r=>!!(r&&typeof r=="object"&&!Array.isArray(r))):[]}function C(e){const r=e?.serverUrl||m;return x(r,e?.credentialId||e?.userKey)}function y(e){return e?.credentialId||e?.userKey}function P(e){if(typeof e=="boolean")return e;if(typeof e=="string"){const r=e.trim().toLowerCase();if(["true","1","yes","y"].includes(r))return!0;if(["false","0","no","n"].includes(r))return!1}}function re(e){if(e==null||e==="")return;const r=Number(e);return Number.isFinite(r)?r:void 0}function O(e){const r=g(e.serverUrl)||g(e.schedulerBaseUrl),t=g(e.connectionKey)||g(e.password);return{enabled:P(e.enabled),serverUrl:r,tenantId:g(e.tenantId),userId:g(e.userId),userKey:Te(e.userKey),machineToken:g(e.machineToken),connectionKey:t,instanceName:g(e.instanceName),instanceId:g(e.instanceId),credentialId:g(e.credentialId),credentialRef:g(e.credentialRef),credentialType:g(e.credentialType),projectId:g(e.projectId),roleName:g(e.roleName),workspacePath:g(e.workspacePath),registerAddr:g(e.registerAddr),registerIp:g(e.registerIp),virtualIp:g(e.virtualIp),tunnel:P(e.tunnel),preferSameLanIp:P(e.preferSameLanIp),maxRetries:re(e.maxRetries),retryInterval:re(e.retryInterval)}}function te(){const e=S();try{if(!p.existsSync(e))return a.debug(`[AutoRegister] \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;const r=p.readFileSync(e,"utf-8"),t=JSON.parse(r);return a.info(`[AutoRegister] \u4ECE\u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D\u914D\u7F6E: ${e}`),O(t)}catch(r){const t=r;return a.warn(`[AutoRegister] \u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${e}, error: ${t.message}`),null}}function he(){const e=S();try{if(!p.existsSync(e))return[];const r=p.readFileSync(e,"utf-8"),t=JSON.parse(r),n=O(t),o=Array.isArray(t.autoRegisterTargets)?t.autoRegisterTargets:[];return o.length===0?n.userKey||n.machineToken?[n]:[]:o.filter(s=>!!(s&&typeof s=="object"&&!Array.isArray(s))).map(s=>{const i=O(s);return{...n,...i,machineToken:i.machineToken||(i.userKey?void 0:n.machineToken),connectionKey:i.connectionKey}})}catch(r){const t=r;return a.warn(`[AutoRegister] \u8BFB\u53D6\u81EA\u52A8\u6CE8\u518C\u76EE\u6807\u5931\u8D25: ${e}, error: ${t.message}`),[]}}function Ve(){const e=S();if(!p.existsSync(e))return[];let r;try{r=JSON.parse(p.readFileSync(e,"utf-8"))}catch(i){return a.warn(`[AutoRegister] \u8BFB\u53D6 config.json \u5931\u8D25\uFF08targets \u6458\u8981\uFF09: ${i.message}`),[]}const t=O(r),n=Array.isArray(r.autoRegisterTargets)?r.autoRegisterTargets:[],o=n.length>0?n.filter(i=>!!(i&&typeof i=="object"&&!Array.isArray(i))).map(i=>{const c=O(i);return{...t,...c,machineToken:c.machineToken||(c.userKey?void 0:t.machineToken),connectionKey:c.connectionKey}}):t.userKey||t.machineToken?[t]:[],s=i=>{const c=String(i||"").trim();return c?c.length<=8?"****":`${c.slice(0,8)}****${c.slice(-4)}`:""};return o.map((i,c)=>({index:c,serverUrl:i.serverUrl||"",instanceName:i.instanceName||"",registerAddr:i.registerAddr||i.registerIp||i.virtualIp||"",tunnel:typeof i.tunnel=="boolean"?i.tunnel:null,userKeyMasked:s(i.userKey),machineTokenSet:!!String(i.machineToken||"").trim(),credentialType:i.credentialType||"",credentialId:i.credentialId||"",credentialRef:i.credentialRef||"",connectionKeySet:!!String(i.connectionKey||"").trim()}))}function ne(){const e={};return process.env.AWS_AUTO_REGISTER==="true"&&(e.enabled=!0),process.env.AWS_RUNTIME_SCHEDULER_BASE_URL&&(e.serverUrl=process.env.AWS_RUNTIME_SCHEDULER_BASE_URL),process.env.AWS_TENANT_ID&&(e.tenantId=process.env.AWS_TENANT_ID),process.env.AWS_USER_KEY&&(e.userKey=process.env.AWS_USER_KEY),process.env.AWS_BRIDGE_MACHINE_TOKEN&&(e.machineToken=process.env.AWS_BRIDGE_MACHINE_TOKEN),process.env.AWS_BRIDGE_CONNECTION_KEY&&(e.connectionKey=process.env.AWS_BRIDGE_CONNECTION_KEY),process.env.AWS_INSTANCE_NAME&&(e.instanceName=process.env.AWS_INSTANCE_NAME),process.env.AWS_PROJECT_NAME&&(e.projectId=process.env.AWS_PROJECT_NAME),process.env.AWS_ROLE_NAME&&(e.roleName=process.env.AWS_ROLE_NAME),process.env.AWS_WORKSPACE_PATH&&(e.workspacePath=process.env.AWS_WORKSPACE_PATH),process.env.AWS_REGISTER_ADDR&&(e.registerAddr=process.env.AWS_REGISTER_ADDR),process.env.AWS_REGISTER_IP&&(e.registerIp=process.env.AWS_REGISTER_IP),process.env.AWS_VIRTUAL_IP&&(e.virtualIp=process.env.AWS_VIRTUAL_IP),process.env.AWS_PREFER_SAME_LAN_IP&&(e.preferSameLanIp=P(process.env.AWS_PREFER_SAME_LAN_IP)??!0),process.env.AWS_REGISTER_MAX_RETRIES&&(e.maxRetries=parseInt(process.env.AWS_REGISTER_MAX_RETRIES,10)),process.env.AWS_REGISTER_RETRY_INTERVAL&&(e.retryInterval=parseInt(process.env.AWS_REGISTER_RETRY_INTERVAL,10)),e}function W(){const e=te(),r=ne(),t={...V,...e||{},...r},n=t.instanceName||N.hostname();let o=!1;return process.env.AWS_AUTO_REGISTER!==void 0?o=process.env.AWS_AUTO_REGISTER==="true":e&&(o=!0),{enabled:o,serverUrl:t.serverUrl||m,tenantId:t.tenantId||"",userKey:t.userKey||"",machineToken:t.machineToken,connectionKey:t.connectionKey,instanceName:n,instanceId:t.instanceId,credentialId:t.credentialId,credentialRef:t.credentialRef,credentialType:t.credentialType,projectId:t.projectId,roleName:t.roleName,workspacePath:t.workspacePath,registerAddr:t.registerAddr,registerIp:t.registerIp,virtualIp:t.virtualIp,tunnel:typeof t.tunnel=="boolean"?t.tunnel:void 0,preferSameLanIp:t.preferSameLanIp!==!1,maxRetries:t.maxRetries,retryInterval:t.retryInterval}}function K(){const e=he(),r=ne(),n=(e.length>0?e:[te()||{}]).map(o=>{const s={...V,...o,...r};let i=!1;return process.env.AWS_AUTO_REGISTER!==void 0?i=process.env.AWS_AUTO_REGISTER==="true":i=e.length>0||!!(s.userKey||s.machineToken),{enabled:i,serverUrl:s.serverUrl||m,tenantId:s.tenantId||"",userId:s.userId,userKey:s.userKey||"",machineToken:s.machineToken,connectionKey:s.connectionKey,instanceName:s.instanceName||N.hostname(),instanceId:s.instanceId,credentialId:s.credentialId,credentialRef:s.credentialRef,credentialType:s.credentialType,projectId:s.projectId,roleName:s.roleName,workspacePath:s.workspacePath,registerAddr:s.registerAddr,registerIp:s.registerIp,virtualIp:s.virtualIp,tunnel:typeof s.tunnel=="boolean"?s.tunnel:void 0,preferSameLanIp:s.preferSameLanIp!==!1,maxRetries:s.maxRetries,retryInterval:s.retryInterval}});return k=n.map(o=>o.connectionKey).filter(o=>!!(o&&o.trim())),n}function ve(){const e=N.networkInterfaces(),r=[];for(const t of Object.keys(e)){const n=e[t];if(n)for(const o of n)o.family==="IPv4"&&!o.internal&&r.push({address:o.address,netmask:o.netmask,name:t})}return r}function z(e){const r=e.split(".").map(Number);return(r[0]<<24)+(r[1]<<16)+(r[2]<<8)+r[3]}function Ke(e,r,t){const n=z(e),o=z(r),s=z(t);return(n&s)===(o&s)}function Ue(e){try{const r=new URL(e);return r.hostname==="localhost"||r.hostname==="127.0.0.1"?"127.0.0.1":/^(\d{1,3}\.){3}\d{1,3}$/.test(r.hostname)?r.hostname:null}catch{return null}}function ke(e){return e==="127.0.0.1"}function _e(e){const r=ve();if(r.length===0)return a.warn("[AutoRegister] \u672A\u627E\u5230\u4EFB\u4F55\u975E\u5185\u90E8 IP \u5730\u5740\uFF0C\u4F7F\u7528 127.0.0.1"),"127.0.0.1";const t=Ue(e);if(t){if(ke(t))return"127.0.0.1";for(const n of r)if(Ke(n.address,t,n.netmask))return a.info(`[AutoRegister] \u627E\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u540C\u5B50\u7F51\u7684 IP: ${n.address} (\u7F51\u5361: ${n.name}, \u5B50\u7F51\u63A9\u7801: ${n.netmask})`),n.address;a.warn(`[AutoRegister] \u672A\u627E\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3 (${t}) \u540C\u5B50\u7F51\u7684\u672C\u673A IP\uFF0C\u4F7F\u7528 127.0.0.1`)}else a.warn("[AutoRegister] \u65E0\u6CD5\u89E3\u6790\u8C03\u5EA6\u4E2D\u5FC3 IP\uFF0C\u4F7F\u7528 127.0.0.1");return"127.0.0.1"}function Ee(e=m){return _e(e)}function se(e){const r=e||W();return!r.enabled||!r.userKey&&!r.machineToken?!1:r.tunnel===!0?!0:r.tunnel===!1?!1:!r.registerAddr&&!r.registerIp&&!r.virtualIp}function L(e){const r=de();if(se(e)){const s=e.serverUrl||m;try{const i=new URL(s);if(!e.instanceId)a.warn("[AutoRegister] \u96A7\u9053\u6A21\u5F0F\u4F46\u7F3A\u5C11 instanceId\uFF0C\u964D\u7EA7\u4E3A\u76F4\u8FDE\u6A21\u5F0F");else return`${i.protocol}//${i.host}/tunnel/${e.instanceId}`}catch{a.warn("[AutoRegister] serverUrl \u89E3\u6790\u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A\u76F4\u8FDE\u6A21\u5F0F")}}const t=le()||e.preferSameLanIp===!1?"127.0.0.1":Ee(e.serverUrl||m),n=e.registerAddr||e.registerIp||e.virtualIp||t;return n?/^https?:\/\//i.test(n)?n:/:[0-9]+$/.test(n)?`http://${n}`:`http://${n}:${r}`:`http://127.0.0.1:${r}`}function b(){return K()[0]||W()}function Xe(e){return Ne(e)?.serverUrl}function Ne(e){const r=String(e||"").trim();if(!r)return;for(const n of K()){if(!n?.serverUrl)continue;const o=q(n.serverUrl,y(n));if(o&&o===r)return{serverUrl:T(n.serverUrl)||n.serverUrl,userKey:n.userKey,identityKey:y(n),instanceId:n.instanceId};const s=ye(n.serverUrl);for(const i of s){if(i.accessToken!==r)continue;const c=fe(n.userKey)===i.userKeyFingerprint?n.userKey:void 0;return{serverUrl:T(n.serverUrl)||n.serverUrl,userKey:c,identityKey:c}}}const t=M();if(t.schedulerBaseUrl){const n=q(t.schedulerBaseUrl);if(n&&n===r)return{serverUrl:T(t.schedulerBaseUrl)||t.schedulerBaseUrl}}}function we(e){if(!e)return;const r=Object.entries(d.registrations).find(([,t])=>t===e);return r?F(r[0]):void 0}function Be(e,r){const t=T(e);if(!t)return;if(String(r||"").trim()){const o=d.registrations[x(t,r)];return o||void 0}const n=Object.entries(d.registrations).filter(([o])=>F(o)===t);return n.length===1?n[0][1]:void 0}function j(e,r){const t=we(r);if(t)return t;const n=g(e.serverUrl);if(n&&(n!==m||process.env.AWS_RUNTIME_SCHEDULER_BASE_URL))return n;const o=M(),s=g(o.schedulerBaseUrl);return o.status==="paired"&&s?s:n||m}async function $e(e){const r=e.instanceName||N.hostname(),t=e.serverUrl||m,n={tenantId:e.tenantId,userKey:e.machineToken?void 0:e.userKey,machineToken:e.machineToken,instanceId:e.instanceId,instanceName:r,hostname:N.hostname(),virtualIp:e.registerAddr||e.registerIp||e.virtualIp,runtimeBridgeBaseUrl:L(e),connectionKey:e.connectionKey,workspacePath:e.workspacePath,projectId:e.projectId,roleName:e.roleName};return a.info(`[AutoRegister] \u6B63\u5728\u6CE8\u518C\u5B9E\u4F8B: ${r}`),a.info(`[AutoRegister] \u8C03\u5EA6\u4E2D\u5FC3: ${t}`),a.info(e.machineToken?"[AutoRegister] \u51ED\u636E: \u673A\u5668\u81EA\u6301\u51ED\u636E\uFF08machineToken\uFF09":`[AutoRegister] \u7528\u6237 Key: ${e.userKey?"****"+e.userKey.slice(-4):"(\u672A\u8BBE\u7F6E)"}`),a.info(`[AutoRegister] \u79DF\u6237 ID: ${e.tenantId||"(\u81EA\u52A8\u63A8\u5BFC)"}`),(await w.post(`${t}/api/instances/register`,n,{headers:{"Content-Type":"application/json"},timeout:1e4})).data}function Ce(e,r,t,n,o,s,i,c,u){const l=S();return D(l,()=>{if(!p.existsSync(l))return;const I=p.readFileSync(l,"utf-8"),h=JSON.parse(I),U=T(e);if(!U)return;let A=!1;const R=f=>T(String(f.serverUrl||f.schedulerBaseUrl||""))!==U?!1:String(t||"").trim()?String(f.userKey??"").trim()===String(t).trim():String(i||"").trim()?String(f.machineToken??"").trim()===String(i).trim():!0,v=f=>{R(f)&&(r&&f.instanceId!==r&&(f.instanceId=r,A=!0),n&&f.credentialId!==n&&(f.credentialId=n,A=!0),o&&f.credentialRef!==o&&(f.credentialRef=o,A=!0),s&&f.credentialType!==s&&(f.credentialType=s,A=!0),c&&f.tenantId!==c&&(f.tenantId=c,A=!0),u&&f.userId!==u&&(f.userId=u,A=!0))};if(Array.isArray(h.autoRegisterTargets))for(const f of h.autoRegisterTargets)f&&typeof f=="object"&&!Array.isArray(f)&&v(f);else v(h);A&&(p.writeFileSync(l,JSON.stringify(h,null,2),"utf-8"),a.info(`[AutoRegister] \u5DF2\u56DE\u5199 instanceId \u5230 config.json (serverUrl=${e}${t?`, userKey=****${String(t).slice(-4)}`:""})`))})}async function Oe(e,r){const t=String(r||"").trim();if(!t)return;const n=y(e),o=_(e.serverUrl);if(!n||!o)return;const s=S();try{await D(s,()=>{if(!p.existsSync(s))return;const i=p.readFileSync(s,"utf-8"),c=JSON.parse(i),l=ee(c).find(I=>_(I.serverUrl||I.schedulerBaseUrl)===o&&String(I.credentialId||I.userKey||"").trim()===n);if(!l){a.warn(`[AutoRegister] \u65E0\u6CD5\u5B9A\u4F4D connectionKey \u5BF9\u5E94 target\uFF0C\u8DF3\u8FC7\u5199\u76D8: server=${o}`);return}String(l.connectionKey??"").trim()!==t&&(l.connectionKey=t,p.writeFileSync(s,JSON.stringify(c,null,2),"utf-8"),a.info(`[AutoRegister] \u5DF2\u5199\u5165 target connectionKey \u5230 config.json: ${s}`))})}catch(i){a.warn(`[AutoRegister] \u5199\u5165 target connectionKey \u5230 config.json \u5931\u8D25: ${i.message}`)}}async function Qe(e,r){const t=String(e||"").trim();if(!t)throw new Error("connectionKey is required");const n=_(r?.serverUrl);if(!n)throw new Error("serverUrl is required to rotate a target connectionKey");const o=S();let s;const i=await D(o,()=>{if(!p.existsSync(o))return!1;const l=JSON.parse(p.readFileSync(o,"utf-8")),I=ee(l),h=String(r?.instanceId||"").trim(),U=String(r?.credentialId||"").trim(),A=I.filter(v=>{if(_(v.serverUrl||v.schedulerBaseUrl)!==n)return!1;if(h&&String(v.instanceId||"").trim()===h)return!0;if(U){const E=String(v.credentialId||"").trim(),ae=String(v.userKey||"").trim();if(E===U||ae===U)return!0}return!h&&!U&&I.filter(E=>_(E.serverUrl||E.schedulerBaseUrl)===n).length===1});if(A.length!==1)throw new Error(`\u65E0\u6CD5\u552F\u4E00\u5B9A\u4F4D connectionKey \u5BF9\u5E94 target\uFF08server=${n}, matches=${A.length}\uFF09`);const R=A[0];return String(R.connectionKey??"").trim()===t?!1:(s={targetKey:x(String(R.serverUrl??R.schedulerBaseUrl??""),R.credentialId||R.userKey),previousConnectionKey:String(R.connectionKey??"").trim()},R.connectionKey=t,String(l.connectionKey??"").trim()&&delete l.connectionKey,p.writeFileSync(o,JSON.stringify(l,null,2),"utf-8"),a.info(`[AutoRegister] \u5DF2\u8F6E\u6362 target connectionKey \u5E76\u5199\u56DE config.json: ${o}`),!0)}),c=!!process.env.AWS_BRIDGE_CONNECTION_KEY;c&&i&&(process.env.AWS_BRIDGE_CONNECTION_KEY=t,a.warn("[AutoRegister] \u68C0\u6D4B\u5230 AWS_BRIDGE_CONNECTION_KEY \u73AF\u5883\u53D8\u91CF\uFF0C\u5DF2\u540C\u6B65\u66F4\u65B0\u5F53\u524D\u8FDB\u7A0B\uFF1B\u91CD\u542F bridge \u540E\u4F1A\u56DE\u5230\u73AF\u5883\u53D8\u91CF\u4E2D\u7684\u65E7\u503C\uFF0C\u8BF7\u4E00\u5E76\u4FEE\u6539\u90E8\u7F72\u914D\u7F6E"));const u=K().map(l=>String(l.connectionKey||"").trim()).filter(l=>l.length>0);return k=i?[...new Set([t,...u])]:[...new Set(u)],i&&s&&s.previousConnectionKey!==t&&B.set(s.targetKey,{key:s.previousConnectionKey,expiresAt:Date.now()+Ie}),{envOverrideWarning:c,rotated:i}}async function ie(e){let r=0;for(const t of e)String(t.connectionKey||"").trim()||(t.connectionKey=`awsb_${ce(24).toString("base64url")}`,r+=1,k.includes(t.connectionKey)||(k=[...k,t.connectionKey]),await Oe(t,t.connectionKey));r!==0&&a.info(`[AutoRegister] ${r} \u4E2A\u76EE\u6807\u7F3A\u5C11 connectionKey\uFF0C\u5DF2\u6309 target \u72EC\u7ACB\u751F\u6210\u5E76\u5199\u5165 config.json`)}function oe(e){if(!e)return;const r=Object.entries(d.registrations).find(([,s])=>s===e);if(!r)return;const t=r[0],n=F(t),o=K().find(s=>C(s)===t);return{serverUrl:n,identityKey:o?y(o):void 0,targetKey:t}}async function be(e){const r=oe(e),t=r?.serverUrl||j(b(),e),n=G(t,r?.identityKey);if(!n)throw new Error("runtimeAccessToken is required to unregister bridge instance");return(await w.post(`${t}/api/instances/unregister`,{instanceId:e},{headers:{"Content-Type":"application/json","X-Runtime-Token":n},timeout:1e4})).data}async function Ze(e){const r=e?[{...W(),...e}]:K();await ie(r);const n=(r.length>1?await Promise.all(r.map(s=>J(s))):[await J(r[0]||W())]).every(Boolean),o=r.every(s=>!s.enabled||!s.userKey&&!s.machineToken);if(!e&&(n||o)){const{stopTunnelClientsExcept:s}=await import("./tunnel-client.js");s(r.filter(i=>!!i.serverUrl).map(i=>x(i.serverUrl,y(i))))}return n}async function J(e,r){if(!e.enabled)return a.info("[AutoRegister] \u81EA\u52A8\u6CE8\u518C\u672A\u542F\u7528"),a.info(`[AutoRegister] \u8981\u542F\u7528\u81EA\u52A8\u6CE8\u518C\uFF0C\u8BF7\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6 ${S()} \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF AWS_AUTO_REGISTER=true`),!1;if(!e.userKey&&!e.machineToken)return a.error("[AutoRegister] \u7F3A\u5C11\u6CE8\u518C\u51ED\u636E\uFF08\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u8BBE\u7F6E userKey \u6216 machineToken\uFF0C\u4E5F\u53EF\u7528 `awsb pair --ticket ...` \u914D\u5BF9\uFF09"),!1;String(e.connectionKey||"").trim()||await ie([e]);const t=se(e);t&&!e.instanceId&&(e.instanceId=`bridge-${ue().replace(/-/g,"").slice(0,12)}`,a.info(`[AutoRegister] \u96A7\u9053\u6A21\u5F0F\uFF1A\u5DF2\u9884\u58F0\u660E instanceId=${e.instanceId}`));const n=r?.backgroundRetry?1:e.maxRetries??3,o=e.retryInterval??2e3;for(let s=1;s<=n;s++){try{d.lastAttempt=new Date;const i=await $e(e);if(i.success){if(d.registered=!0,d.instanceId=i.instanceId,i.credentialId&&(e.credentialId=i.credentialId,e.credentialType=i.credentialType),e.credentialRef=i.credentialRef,i.tenantId&&(e.tenantId=i.tenantId),i.userId&&(e.userId=i.userId),i.instanceId&&(d.registrations[C(e)]=i.instanceId,e.instanceId=i.instanceId),d.error=void 0,a.info("[AutoRegister] \u2713 \u6CE8\u518C\u6210\u529F\uFF01"),a.info(`[AutoRegister] \u5B9E\u4F8B ID: ${i.instanceId}`),a.info(`[AutoRegister] \u6D88\u606F: ${i.message}`),a.info(`[AutoRegister] \u66F4\u65B0: ${i.isUpdate?"\u662F":"\u5426"}`),i.runtimeAccessToken)try{const c=e.serverUrl||m;Y({accessToken:i.runtimeAccessToken,instanceId:i.instanceId,userId:i.userId,schedulerBaseUrl:c,userKey:y(e)});const u=T(i.serverUrl);u&&u!==T(c)&&(H({serverBaseUrl:u,accessToken:i.runtimeAccessToken,userKey:y(e)}),a.info(`[AutoRegister] \u68C0\u6D4B\u5230 server \u4E0B\u53D1\u5730\u5740(${u})\u4E0E\u8FDE\u63A5\u5730\u5740(${c})\u4E0D\u540C\uFF0C\u5DF2\u6309\u4E24\u4E2A\u5730\u5740\u5206\u522B\u4FDD\u5B58 scoped token`)),a.info("[AutoRegister] \u5DF2\u4FDD\u5B58\u8C03\u5EA6\u4E2D\u5FC3\u4E0B\u53D1\u7684 runtime access token"),i.instanceId&&Ce(e.serverUrl||m,i.instanceId,e.userKey,i.credentialId,i.credentialRef,i.credentialType,e.machineToken,i.tenantId,i.userId).catch(l=>{a.warn(`[AutoRegister] \u56DE\u5199 instanceId \u5230 config.json \u5931\u8D25: ${l.message}`)})}catch(c){const u=c;return a.error(`[AutoRegister] \u4FDD\u5B58 runtime access token \u5931\u8D25: ${u.message}`),d.error=u.message,!1}else a.warn("[AutoRegister] \u6CE8\u518C\u54CD\u5E94\u672A\u5305\u542B runtime access token\uFF0CMCP \u5C06\u65E0\u6CD5\u8BBF\u95EE\u8C03\u5EA6\u4E2D\u5FC3\uFF0C\u8BF7\u68C0\u67E5 server \u7684 bridge \u5B9E\u4F8B token \u9881\u53D1\u903B\u8F91");if(t&&i.instanceId&&i.runtimeAccessToken){const{startTunnelClient:c}=await import("./tunnel-client.js"),u=e.serverUrl||m;c(u,i.instanceId,y(e)),a.info(`[AutoRegister] \u96A7\u9053\u5BA2\u6237\u7AEF\u5DF2\u542F\u52A8: server=${u}, instanceId=${i.instanceId}${e.userKey?`, userKey=****${e.userKey.slice(-4)}`:""}`)}return!0}else a.warn(`[AutoRegister] \u6CE8\u518C\u5931\u8D25: ${i.message}`),d.error=i.message}catch(i){const c=i,u=c.response?.data?JSON.stringify(c.response.data):c.message;a.error(`[AutoRegister] \u6CE8\u518C\u8BF7\u6C42\u5931\u8D25 (\u5C1D\u8BD5 ${s}/${n}): ${u}`),d.error=u}s<n&&(a.info(`[AutoRegister] ${o/1e3} \u79D2\u540E\u91CD\u8BD5...`),await new Promise(i=>setTimeout(i,o)))}return r?.backgroundRetry?a.warn(`[AutoRegister] \u540E\u53F0\u91CD\u8BD5\u6CE8\u518C\u4ECD\u672A\u6210\u529F (server=${e.serverUrl||m}): ${d.error||"\u672A\u77E5"}`):(a.error("[AutoRegister] \u2717 \u6CE8\u518C\u5931\u8D25\uFF0C\u5DF2\u8FBE\u6700\u5927\u91CD\u8BD5\u6B21\u6570"),a.error("[AutoRegister] ========================================"),a.error("[AutoRegister] \u81EA\u52A8\u6CE8\u518C\u5DF2\u542F\u7528\u4F46\u6CE8\u518C\u5931\u8D25\uFF0C\u5B9E\u4F8B\u6682\u65F6\u65E0\u6CD5\u6B63\u5E38\u5DE5\u4F5C"),a.error("[AutoRegister] \u8BF7\u68C0\u67E5\u4EE5\u4E0B\u914D\u7F6E\uFF1A"),a.error(`[AutoRegister] - \u7528\u6237 Key (userKey): ${e.userKey?"****"+e.userKey.slice(-4):"(\u672A\u8BBE\u7F6E)"}`),a.error(`[AutoRegister] - \u79DF\u6237 ID (tenantId): ${e.tenantId||"(\u53EF\u9009\uFF0C\u5C06\u81EA\u52A8\u63A8\u5BFC)"}`),a.error(`[AutoRegister] - \u5B9E\u4F8B\u540D (instanceName): ${e.instanceName||"(\u4F7F\u7528\u4E3B\u673A\u540D)"}`),a.error(`[AutoRegister] - \u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740: ${e.serverUrl||m}`),a.error(`[AutoRegister] - \u6700\u540E\u9519\u8BEF: ${d.error||"\u672A\u77E5"}`),a.error("[AutoRegister] ========================================"),a.error(`[AutoRegister] \u914D\u7F6E\u6765\u6E90\uFF1A${S()} \u6216\u73AF\u5883\u53D8\u91CF`),a.warn(`[AutoRegister] \u5C06\u5728\u540E\u53F0\u6301\u7EED\u91CD\u8BD5\u6CE8\u518C\uFF08\u6BCF ${Math.round(Q()/1e3)} \u79D2\uFF09\uFF0C\u76F4\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u5EFA\u7ACB\u8FDE\u63A5`)),Z(e),!1}async function er(){const e=b();if(!e.userKey&&!e.machineToken)return{success:!1,error:"userKey or machineToken is required for runtime token refresh"};const r=pe(),t=j(e),n=L(e);try{const o=await w.post(`${t}/api/instances/runtime-tokens/refresh`,{tenantId:e.tenantId,userKey:e.machineToken?void 0:e.userKey,machineToken:e.machineToken,instanceId:r.instanceId,instanceName:e.instanceName,runtimeBridgeBaseUrl:n},{headers:{"Content-Type":"application/json"},timeout:1e4});if(!o.data.success||!o.data.runtimeAccessToken)return{success:!1,error:o.data.message||"scheduler did not return runtimeAccessToken"};const i=G(t,y(e))!==o.data.runtimeAccessToken;return Y({accessToken:o.data.runtimeAccessToken,instanceId:r.instanceId,userId:o.data.userId||e.userKey||e.credentialId||"",schedulerBaseUrl:t,userKey:y(e)}),{success:!0,runtimeAccessToken:o.data.runtimeAccessToken,updated:i}}catch(o){const s=o;return{success:!1,error:s.response?.data?JSON.stringify(s.response.data):s.message}}}async function rr(e,r){const t=_(e);if(!t)return{success:!1,error:"serverUrl is required for runtime token refresh"};const n=K().filter(u=>_(u.serverUrl)===t),o=String(r||"").trim(),s=o?n.find(u=>String(u.userKey||"").trim()===o||String(u.credentialId||"").trim()===o):n.length===1?n[0]:void 0;if(!s)return{success:!1,error:o?"no auto-register target matches this identity":"multiple auto-register targets share this serverUrl; specify the target identity"};if(!s.userKey&&!s.machineToken)return{success:!1,error:"userKey or machineToken is required for runtime token refresh"};const i={instanceId:Be(t,y(s))},c=L(s);try{const u=await w.post(`${t}/api/instances/runtime-tokens/refresh`,{tenantId:s.tenantId,userKey:s.machineToken?void 0:s.userKey,machineToken:s.machineToken,instanceId:i.instanceId,instanceName:s.instanceName,runtimeBridgeBaseUrl:c},{headers:{"Content-Type":"application/json"},timeout:1e4});if(!u.data.success||!u.data.runtimeAccessToken)return{success:!1,error:u.data.message||"scheduler did not return runtimeAccessToken"};const I=G(t,y(s))!==u.data.runtimeAccessToken;return H({serverBaseUrl:t,accessToken:u.data.runtimeAccessToken,userKey:y(s)}),{success:!0,runtimeAccessToken:u.data.runtimeAccessToken,updated:I}}catch(u){const l=u;return{success:!1,error:l.response?.data?JSON.stringify(l.response.data):l.message}}}async function tr(){if(!d.registered||!d.instanceId)return a.info("[AutoRegister] \u5B9E\u4F8B\u672A\u6CE8\u518C\uFF0C\u65E0\u9700\u6CE8\u9500"),!0;try{const e=await be(d.instanceId);if(e.success){a.info(`[AutoRegister] \u2713 \u6CE8\u9500\u6210\u529F: ${d.instanceId}`);const r=oe(d.instanceId),t=r?.serverUrl||j(b(),d.instanceId);M().schedulerBaseUrl&&me(t,r?.identityKey),ge();try{const{stopTunnelClientForTarget:o}=await import("./tunnel-client.js");o(t,r?.identityKey??y(b()))}catch(o){a.warn(`[AutoRegister] \u6CE8\u9500\u540E\u505C\u6B62\u96A7\u9053\u5931\u8D25: ${o.message}`)}if(!r)d.registered=!1,d.instanceId=void 0;else{delete d.registrations[r.targetKey];const o=Object.entries(d.registrations);d.registered=o.length>0,d.instanceId=o[o.length-1]?.[1]}return!0}else return a.warn(`[AutoRegister] \u6CE8\u9500\u5931\u8D25: ${e.message}`),!1}catch(e){const r=e;return a.error(`[AutoRegister] \u6CE8\u9500\u8BF7\u6C42\u5931\u8D25: ${r.message}`),!1}}function nr(){return{...d}}function sr(){return d.registered}function ir(){return d.instanceId}async function or(){const e=b(),r=d.instanceId,t=j(e,r),n={};if(r&&(n.instanceId=r),e.enabled&&(n.runtimeBridgeBaseUrl=L(e)),!n.instanceId&&!n.runtimeBridgeBaseUrl)return a.info("[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\uFF1A\u6CA1\u6709 instanceId \u6216 runtimeBridgeBaseUrl\uFF0C\u8DF3\u8FC7\u6E05\u7406"),{success:!0,agentCount:0};try{a.info("[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\uFF1A\u6B63\u5728\u901A\u77E5\u8C03\u5EA6\u4E2D\u5FC3..."),a.info(`[AutoRegister] instanceId: ${n.instanceId||"(\u65E0)"}`),a.info(`[AutoRegister] runtimeBridgeBaseUrl: ${n.runtimeBridgeBaseUrl||"(\u65E0)"}`);const o=await w.post(`${t}/api/instances/bridge-restart-cleanup`,n,{headers:{"Content-Type":"application/json"},timeout:1e4});return o.data.success?(a.info(`[AutoRegister] \u2713 Bridge \u91CD\u542F\u6E05\u7406\u6210\u529F\uFF1A${o.data.message}`),a.info(`[AutoRegister] \u6E05\u7406\u4E86 ${o.data.agentCount||0} \u4E2A Agent`),{success:!0,agentCount:o.data.agentCount||0}):(a.warn(`[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\u5931\u8D25\uFF1A${o.data.message}`),{success:!1,error:o.data.message})}catch(o){const s=o,i=s.response?.data?JSON.stringify(s.response.data):s.message;return a.warn(`[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\u8BF7\u6C42\u5931\u8D25\uFF1A${i}`),{success:!1,error:i}}}export{Ze as autoRegister,or as bridgeRestartCleanup,He as cancelBackgroundRegisterRetries,Se as collapseDuplicatedSecret,qe as findConfigsByConnectionKey,S as getAutoRegisterConfigFilePath,Je as getConfiguredConnectionKeys,Ye as getCurrentConfiguredConnectionKey,ir as getInstanceId,nr as getRegistrationState,sr as isRegistered,se as isTunnelConfig,Ve as listConfiguredTargetSummaries,W as loadConfig,K as loadConfigs,b as loadPrimaryLifecycleConfig,Qe as replaceConfiguredConnectionKey,er as requestRuntimeAccessTokenRefresh,rr as requestRuntimeAccessTokenRefreshForServer,Be as resolveInstanceIdForTarget,L as resolveRuntimeBridgeBaseUrl,Xe as resolveSchedulerBaseUrlFromToken,Ne as resolveTargetIdentityFromToken,tr as unregister};
|
|
2
2
|
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { McpDeploySpec } from "./mcp-deploy.js";
|
|
2
2
|
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
3
7
|
export declare const AWS_MCP_SERVER_NAME: string;
|
|
4
8
|
export interface AwsMcpServerConfigInput {
|
|
5
9
|
agentId: string;
|
|
@@ -33,4 +37,14 @@ export declare function ensureAwsClientAgentMcpReleased(): void;
|
|
|
33
37
|
|
|
34
38
|
export declare const BUILTIN_AWS_MCP_SERVER_NAME = "agents-work-studio";
|
|
35
39
|
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
36
50
|
export declare function buildBuiltinAwsMcpDeploySpec(): McpDeploySpec;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{createHash as j}from"node:crypto";import{cpSync as l,existsSync as c,lstatSync as L,mkdirSync as
|
|
2
|
-
`,"utf-8"),i.info(`[runtime-bridge] ${a} MCP \u5DF2\u66F4\u65B0\u5230: ${u}`)):(y(e,s),P(e,s),i.info(`[runtime-bridge] ${a} MCP \u5DF2\u662F\u6700\u65B0: ${u}`)),
|
|
1
|
+
import{createHash as j}from"node:crypto";import{cpSync as l,existsSync as c,lstatSync as L,mkdirSync as b,readdirSync as U,readFileSync as p,realpathSync as S,rmSync as E,statSync as R,symlinkSync as W,writeFileSync as I}from"node:fs";import t from"node:path";import{getActiveBridgeHttpPort as v,getRuntimeHomeDir as O,isDevMode as B,schedulerBaseUrl as D}from"../config.js";import{logger as i}from"../utils/logger.js";import{BRIDGE_PACKAGE_ROOT as H}from"../utils/sdk-package-loader.js";import{loadRuntimeBinding as $}from"./runtime-binding.js";const a=B()?"aws-mcp-dev":"aws-mcp",k=["AWS_PROJECT_NAME","AWS_PROJECT_ROOT","AWS_PROMPT","AWS_ROLE_NAME","AWS_SERVER_URL","AWS_MCP_HTTP_URL","AWS_RUNTIME_BRIDGE_BASE_URL","AWS_HEARTBEAT_INTERVAL","AWS_HEARTBEAT_TIMEOUT","PATH","HOME","USERPROFILE","TMP","TEMP","SystemRoot","COMSPEC","PATHEXT","WINDIR"];function M(){return H}function V(r=M()){return t.join(f(r),"dist","index.js")}function f(r){return t.join(r,"package","aws-client-agent-mcp")}function g(){return t.join(O(),".aws-bridge","mcp")}function le(){return t.join(g(),"dist")}function C(r=g()){return t.join(r,".release.json")}function T(r){try{return JSON.parse(p(r,"utf-8")).version||"unknown"}catch{return"unknown"}}function x(r){return T(t.join(r,"package.json"))}function G(r){return T(t.join(f(r),"package.json"))}function A(r,e){c(r)&&F(r,e)}function F(r,e){if(R(r).isDirectory()){l(r,e,{errorOnExist:!1,force:!0,recursive:!0});return}l(r,e,{errorOnExist:!1,force:!0})}function y(r,e){const n=f(r);A(t.join(n,"package.json"),t.join(e,"package.json")),A(t.join(n,"README.md"),t.join(e,"README.md")),A(t.join(n,"package-lock.json"),t.join(e,"package-lock.json"))}function J(r){if(!c(r))return!0;const e=L(r);return e.isSymbolicLink()||e.isDirectory()}function z(r,e){if(!c(r))return!1;try{return S(r)===S(e)}catch{return!1}}function P(r,e){const n=t.join(r,"node_modules"),o=t.join(e,"node_modules");if(!c(n)){i.warn(`[runtime-bridge] ${a} MCP \u672A\u627E\u5230\u4F9D\u8D56\u76EE\u5F55\uFF0Crelease \u4EA7\u7269\u53EF\u80FD\u65E0\u6CD5\u89E3\u6790\u8FD0\u884C\u65F6\u4F9D\u8D56: ${n}`);return}if(!z(o,n)){if(!J(o)){i.warn(`[runtime-bridge] ${a} MCP \u4F9D\u8D56\u8DEF\u5F84\u5DF2\u5B58\u5728\u4F46\u4E0D\u662F\u76EE\u5F55\u6216\u94FE\u63A5\uFF0C\u5DF2\u4FDD\u7559: ${o}`);return}E(o,{recursive:!0,force:!0}),W(n,o,process.platform==="win32"?"junction":"dir")}}function w(r,e=r){return U(r,{withFileTypes:!0}).flatMap(n=>{const o=t.join(r,n.name);return n.isDirectory()?w(o,e):n.isFile()?[t.relative(e,o).split(t.sep).join("/")]:[]})}function K(r){const e=j("sha256");for(const n of w(r).sort()){const o=t.join(r,...n.split("/")),s=R(o);e.update(n),e.update("\0"),e.update(String(s.size)),e.update("\0"),e.update(p(o)),e.update("\0")}return`sha256:${e.digest("hex")}`}function X(r){try{const e=JSON.parse(p(C(r),"utf-8"));if(typeof e.bridgeVersion=="string"&&typeof e.mcpVersion=="string"&&typeof e.distHash=="string")return{bridgeVersion:e.bridgeVersion,mcpVersion:e.mcpVersion,distHash:e.distHash,releasedAt:typeof e.releasedAt=="string"?e.releasedAt:""}}catch{return null}return null}function Y(r,e,n){return!c(r)||!e||e.bridgeVersion!==n.bridgeVersion||e.mcpVersion!==n.mcpVersion||e.distHash!==n.distHash}function q(r={}){const e=r.packageRoot||M(),n=t.dirname(V(e)),o=t.join(n,"index.js");if(!c(o))return null;if(c(t.join(e,"src")))return i.info(`[runtime-bridge] ${a} MCP \u672C\u5730\u5F00\u53D1\u6A21\u5F0F\uFF0C\u76F4\u63A5\u4F7F\u7528\u9879\u76EE dist: ${o}`),o;const s=r.releasedRoot||g(),u=t.join(s,"dist"),_=t.join(u,"index.js"),m={bridgeVersion:x(e),mcpVersion:G(e),distHash:K(n)},h=X(s);return Y(_,h,m)?(E(u,{recursive:!0,force:!0}),b(s,{recursive:!0}),y(e,s),P(e,s),l(n,u,{errorOnExist:!1,force:!0,recursive:!0}),I(C(s),`${JSON.stringify({...m,releasedAt:r.now?r.now():new Date().toISOString()},null,2)}
|
|
2
|
+
`,"utf-8"),i.info(`[runtime-bridge] ${a} MCP \u5DF2\u66F4\u65B0\u5230: ${u}`)):(y(e,s),P(e,s),i.info(`[runtime-bridge] ${a} MCP \u5DF2\u662F\u6700\u65B0: ${u}`)),_}function Q(){return Object.fromEntries(Object.entries(process.env).filter(r=>typeof r[1]=="string"))}function Z(r){return Object.fromEntries(k.flatMap(e=>{const n=r[e];return typeof n=="string"&&n.length>0?[[e,n]]:[]}))}function ee(r){try{const e=JSON.parse(r);if(Array.isArray(e)&&e.every(n=>typeof n=="string"))return e}catch(e){i.warn(`[runtime-bridge] AWS_CLIENT_AGENT_MCP_ARGS \u4E0D\u662F\u5408\u6CD5 JSON\uFF0C\u5DF2\u5FFD\u7565: ${e instanceof Error?e.message:String(e)}`)}return i.warn("[runtime-bridge] AWS_CLIENT_AGENT_MCP_ARGS \u5FC5\u987B\u662F string[] JSON\uFF0C\u5DF2\u5FFD\u7565"),[]}function N(r){const e=r.replace(/^((?:https?|wss?):\/\/(?:\[[^\]]+\]|[^/:?#]+):\d+):\d+(?=\/|$)/i,"$1");try{const n=new URL(e);return n.protocol==="ws:"?n.protocol="http:":n.protocol==="wss:"?n.protocol="https:":n.protocol=n.protocol.toLowerCase(),n.origin}catch{return e.replace(/\/+$/,"")}}function re(r){const e=new URL("/ws/agent",N(r));return e.protocol==="https:"?e.protocol="wss:":e.protocol="ws:",e.toString()}function ne(r){const e=N(r);return new URL("/mcp/call",e).toString()}function te(){const r=String(process.env.AWS_RUNTIME_SCHEDULER_BASE_URL||"").trim();if(r)return r;const e=$(),n=String(e.schedulerBaseUrl||"").trim();return e.status==="paired"&&n?n:D}function pe(r={}){return d(r)}function d(r={}){const e=String(process.env.AWS_CLIENT_AGENT_MCP_COMMAND||"").trim();if(e)return{source:"override",command:e,args:process.env.AWS_CLIENT_AGENT_MCP_ARGS?ee(process.env.AWS_CLIENT_AGENT_MCP_ARGS):[]};const n=r.exists||c,s=(r.release||q)();return s&&n(s)?{source:"bundled",command:process.execPath,args:[s]}:{source:"global",command:"aws-client-agent-mcp",args:[]}}function fe(r){const e=Q(),n=d(),o=te();return{command:n.command,args:n.args,env:{...Z(e),AWS_AGENT_ID:r.agentId,AWS_WORKSPACE_PATH:r.workspacePath,AWS_SERVER_URL:e.AWS_SERVER_URL||re(o),AWS_MCP_HTTP_URL:e.AWS_MCP_HTTP_URL||ne(o),AWS_RUNTIME_BRIDGE_BASE_URL:e.AWS_RUNTIME_BRIDGE_BASE_URL||`http://127.0.0.1:${v()}`,AWS_MCP_CLAIM_LAUNCH_BINDING:e.AWS_MCP_CLAIM_LAUNCH_BINDING||"true"}}}function ge(){const r=d(),e=r.args[0]?`${r.command} ${r.args.join(" ")}`:r.command;if(r.source==="global"){i.warn(`[runtime-bridge] ${a} MCP \u672A\u627E\u5230 bundled \u4EA7\u7269\uFF0C\u542F\u52A8\u65F6\u5C06\u56DE\u9000\u5230 PATH \u547D\u4EE4: ${e}`);return}i.info(`[runtime-bridge] ${a} MCP \u5DF2\u51C6\u5907(${r.source}): ${e}`)}const Ae="agents-work-studio";function _e(){const r=d(),e={type:"stdio"};if(r.command&&(e.command=r.command),r.args.length>0&&(e.args=[...r.args]),!e.command)throw new Error("\u5185\u7F6E\u901A\u8BAF MCP \u547D\u4EE4\u89E3\u6790\u5931\u8D25\uFF1A\u672A\u80FD\u5B9A\u4F4D\u53EF\u6267\u884C\u5165\u53E3\uFF08bundled/\u8986\u76D6\u53D8\u91CF/PATH \u5747\u4E0D\u53EF\u7528\uFF09");return e}export{a as AWS_MCP_SERVER_NAME,Ae as BUILTIN_AWS_MCP_SERVER_NAME,fe as buildAwsMcpServerConfig,_e as buildBuiltinAwsMcpDeploySpec,ge as ensureAwsClientAgentMcpReleased,d as getAwsClientAgentMcpPreparedInfo,le as getReleasedMcpDistPath,q as releaseBundledAwsClientAgentMcp,pe as resolveAwsClientAgentMcpCommand};
|
|
3
3
|
|