aws-runtime-bridge 1.9.79 → 1.9.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (596) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +0 -1
  2. package/dist/adapter/AcodeSdkAdapter.js +11 -1986
  3. package/dist/adapter/AdapterRegistry.d.ts +0 -1
  4. package/dist/adapter/AdapterRegistry.js +2 -100
  5. package/dist/adapter/ClaudeSdkAdapter.d.ts +0 -1
  6. package/dist/adapter/ClaudeSdkAdapter.js +4 -1300
  7. package/dist/adapter/CodexSdkAdapter.d.ts +0 -1
  8. package/dist/adapter/CodexSdkAdapter.js +4 -836
  9. package/dist/adapter/OpencodeSdkAdapter.d.ts +0 -1
  10. package/dist/adapter/OpencodeSdkAdapter.js +4 -879
  11. package/dist/adapter/SdkProviderSpi.d.ts +0 -1
  12. package/dist/adapter/SdkProviderSpi.js +2 -55
  13. package/dist/adapter/acode-tool-names.d.ts +0 -1
  14. package/dist/adapter/acode-tool-names.js +2 -37
  15. package/dist/adapter/idle-poll-loop.d.ts +0 -1
  16. package/dist/adapter/idle-poll-loop.js +2 -59
  17. package/dist/adapter/index.d.ts +0 -1
  18. package/dist/adapter/index.js +2 -11
  19. package/dist/adapter/instance-ai-config-resolver.d.ts +0 -1
  20. package/dist/adapter/instance-ai-config-resolver.js +2 -46
  21. package/dist/adapter/types.d.ts +0 -1
  22. package/dist/adapter/types.js +2 -443
  23. package/dist/adapters/cc-switch/common.d.ts +0 -1
  24. package/dist/adapters/cc-switch/common.js +2 -61
  25. package/dist/adapters/cc-switch/index.d.ts +0 -1
  26. package/dist/adapters/cc-switch/index.js +2 -57
  27. package/dist/adapters/cc-switch/mcp-acode.d.ts +0 -1
  28. package/dist/adapters/cc-switch/mcp-acode.js +2 -71
  29. package/dist/adapters/cc-switch/mcp-claude.d.ts +0 -1
  30. package/dist/adapters/cc-switch/mcp-claude.js +2 -89
  31. package/dist/adapters/cc-switch/mcp-claudecode.d.ts +0 -1
  32. package/dist/adapters/cc-switch/mcp-claudecode.js +2 -77
  33. package/dist/adapters/cc-switch/mcp-codex.d.ts +0 -1
  34. package/dist/adapters/cc-switch/mcp-codex.js +11 -249
  35. package/dist/adapters/cc-switch/mcp-opencode.d.ts +0 -1
  36. package/dist/adapters/cc-switch/mcp-opencode.js +2 -97
  37. package/dist/adapters/cc-switch/mcp-placeholder.d.ts +0 -1
  38. package/dist/adapters/cc-switch/mcp-placeholder.js +2 -19
  39. package/dist/adapters/cc-switch/skill-acode.d.ts +0 -1
  40. package/dist/adapters/cc-switch/skill-acode.js +2 -12
  41. package/dist/adapters/cc-switch/skill-claude.d.ts +0 -1
  42. package/dist/adapters/cc-switch/skill-claude.js +2 -11
  43. package/dist/adapters/cc-switch/skill-claudecode.d.ts +0 -1
  44. package/dist/adapters/cc-switch/skill-claudecode.js +2 -11
  45. package/dist/adapters/cc-switch/skill-codex.d.ts +0 -1
  46. package/dist/adapters/cc-switch/skill-codex.js +2 -6
  47. package/dist/adapters/cc-switch/skill-directory.d.ts +0 -1
  48. package/dist/adapters/cc-switch/skill-directory.js +3 -137
  49. package/dist/adapters/cc-switch/skill-opencode.d.ts +0 -1
  50. package/dist/adapters/cc-switch/skill-opencode.js +2 -11
  51. package/dist/adapters/cc-switch/skill-placeholder.d.ts +0 -1
  52. package/dist/adapters/cc-switch/skill-placeholder.js +2 -19
  53. package/dist/config.d.ts +0 -1
  54. package/dist/config.js +2 -290
  55. package/dist/index.d.ts +0 -1
  56. package/dist/index.js +2 -573
  57. package/dist/middleware/auth.d.ts +0 -1
  58. package/dist/middleware/auth.js +2 -98
  59. package/dist/routes/acode-todos.d.ts +0 -1
  60. package/dist/routes/acode-todos.js +2 -75
  61. package/dist/routes/ai-sources.d.ts +0 -1
  62. package/dist/routes/ai-sources.js +2 -132
  63. package/dist/routes/dashboard.d.ts +0 -1
  64. package/dist/routes/dashboard.js +182 -649
  65. package/dist/routes/events.d.ts +0 -1
  66. package/dist/routes/events.js +2 -22
  67. package/dist/routes/file-browser.d.ts +0 -1
  68. package/dist/routes/file-browser.js +2 -781
  69. package/dist/routes/file-diff-rollback.d.ts +0 -1
  70. package/dist/routes/file-diff-rollback.js +2 -301
  71. package/dist/routes/file-snapshot.d.ts +0 -1
  72. package/dist/routes/file-snapshot.js +2 -156
  73. package/dist/routes/git.d.ts +0 -1
  74. package/dist/routes/git.js +28 -1900
  75. package/dist/routes/instance.d.ts +0 -1
  76. package/dist/routes/instance.js +3 -748
  77. package/dist/routes/mcp.d.ts +0 -1
  78. package/dist/routes/mcp.js +2 -196
  79. package/dist/routes/processes.d.ts +0 -1
  80. package/dist/routes/processes.js +2 -252
  81. package/dist/routes/properties.d.ts +0 -1
  82. package/dist/routes/properties.js +2 -72
  83. package/dist/routes/pty.d.ts +0 -1
  84. package/dist/routes/pty.js +6 -560
  85. package/dist/routes/runtime-binding.d.ts +0 -1
  86. package/dist/routes/runtime-binding.js +2 -263
  87. package/dist/routes/sessions.d.ts +0 -1
  88. package/dist/routes/sessions.js +2 -758
  89. package/dist/routes/skills.d.ts +0 -1
  90. package/dist/routes/skills.js +2 -187
  91. package/dist/routes/sub-agents.d.ts +0 -1
  92. package/dist/routes/sub-agents.js +20 -279
  93. package/dist/routes/system-metrics.d.ts +0 -1
  94. package/dist/routes/system-metrics.js +2 -20
  95. package/dist/routes/task-context.d.ts +0 -1
  96. package/dist/routes/task-context.js +2 -78
  97. package/dist/routes/terminal.d.ts +0 -1
  98. package/dist/routes/terminal.js +54 -2882
  99. package/dist/routes/yml.d.ts +0 -1
  100. package/dist/routes/yml.js +2 -223
  101. package/dist/services/acode-package.d.ts +0 -1
  102. package/dist/services/acode-package.js +2 -111
  103. package/dist/services/agent-event-store.d.ts +0 -1
  104. package/dist/services/agent-event-store.js +2 -81
  105. package/dist/services/agent-process-manager.d.ts +0 -1
  106. package/dist/services/agent-process-manager.js +2 -796
  107. package/dist/services/ai-source-apply.d.ts +0 -1
  108. package/dist/services/ai-source-apply.js +2 -83
  109. package/dist/services/auto-register.d.ts +0 -1
  110. package/dist/services/auto-register.js +2 -1053
  111. package/dist/services/aws-client-agent-mcp.d.ts +0 -1
  112. package/dist/services/aws-client-agent-mcp.js +3 -337
  113. package/dist/services/bridge-package-publish-hooks.d.ts +0 -1
  114. package/dist/services/bridge-package-publish-hooks.js +2 -115
  115. package/dist/services/cc-switch-sdk.d.ts +0 -1
  116. package/dist/services/cc-switch-sdk.js +2 -135
  117. package/dist/services/cli-commands.d.ts +6 -1
  118. package/dist/services/cli-commands.js +6 -645
  119. package/dist/services/event-delta-pusher.d.ts +0 -1
  120. package/dist/services/event-delta-pusher.js +2 -95
  121. package/dist/services/fileSnapshotStore.d.ts +0 -1
  122. package/dist/services/fileSnapshotStore.js +2 -500
  123. package/dist/services/instance-ai-config-service.d.ts +0 -1
  124. package/dist/services/instance-ai-config-service.js +2 -174
  125. package/dist/services/instance-init-service.d.ts +0 -1
  126. package/dist/services/instance-init-service.js +2 -193
  127. package/dist/services/instance-service.d.ts +0 -1
  128. package/dist/services/instance-service.js +2 -237
  129. package/dist/services/instance-state.d.ts +0 -1
  130. package/dist/services/instance-state.js +2 -94
  131. package/dist/services/legacy-path-migration.d.ts +0 -1
  132. package/dist/services/legacy-path-migration.js +2 -66
  133. package/dist/services/lifecycle-state.d.ts +0 -1
  134. package/dist/services/lifecycle-state.js +3 -110
  135. package/dist/services/mcp-launch-binding-queue.d.ts +0 -1
  136. package/dist/services/mcp-launch-binding-queue.js +2 -175
  137. package/dist/services/orphan-monitor.d.ts +0 -1
  138. package/dist/services/orphan-monitor.js +2 -382
  139. package/dist/services/panel-auth.d.ts +0 -1
  140. package/dist/services/panel-auth.js +2 -168
  141. package/dist/services/process-detector.d.ts +0 -1
  142. package/dist/services/process-detector.js +18 -1019
  143. package/dist/services/process-registry.d.ts +0 -1
  144. package/dist/services/process-registry.js +2 -375
  145. package/dist/services/ring-buffer.d.ts +0 -1
  146. package/dist/services/ring-buffer.js +2 -103
  147. package/dist/services/runtime-binding.d.ts +0 -1
  148. package/dist/services/runtime-binding.js +6 -363
  149. package/dist/services/runtime-lifecycle-policy.d.ts +0 -1
  150. package/dist/services/runtime-lifecycle-policy.js +2 -35
  151. package/dist/services/session-output.d.ts +0 -1
  152. package/dist/services/session-output.js +5 -539
  153. package/dist/services/startup-config-wizard.d.ts +0 -1
  154. package/dist/services/startup-config-wizard.js +14 -258
  155. package/dist/services/sub-agent-manager-instance.d.ts +0 -1
  156. package/dist/services/sub-agent-manager-instance.js +2 -12
  157. package/dist/services/system-metrics.d.ts +0 -1
  158. package/dist/services/system-metrics.js +2 -252
  159. package/dist/services/terminal-persistence.d.ts +0 -1
  160. package/dist/services/terminal-persistence.js +2 -176
  161. package/dist/services/tool-installer.d.ts +0 -1
  162. package/dist/services/tool-installer.js +5 -751
  163. package/dist/services/tunnel-client.d.ts +0 -1
  164. package/dist/services/tunnel-client.js +2 -402
  165. package/dist/services/windows-service-manager.d.ts +3 -3
  166. package/dist/services/windows-service-manager.js +2 -59
  167. package/dist/services/workspace-files.d.ts +0 -1
  168. package/dist/services/workspace-files.js +2 -1275
  169. package/dist/services/workspace-watch.d.ts +0 -1
  170. package/dist/services/workspace-watch.js +2 -123
  171. package/dist/services/workspaceTaskChangeWatcher.d.ts +0 -1
  172. package/dist/services/workspaceTaskChangeWatcher.js +2 -483
  173. package/dist/types.d.ts +0 -1
  174. package/dist/types.js +1 -1
  175. package/dist/utils/file-utils.d.ts +0 -1
  176. package/dist/utils/file-utils.js +3 -208
  177. package/dist/utils/instance-ai-config-debug-logger.d.ts +0 -1
  178. package/dist/utils/instance-ai-config-debug-logger.js +4 -63
  179. package/dist/utils/logger.d.ts +0 -1
  180. package/dist/utils/logger.js +2 -154
  181. package/dist/utils/mcp-utils.d.ts +0 -1
  182. package/dist/utils/mcp-utils.js +2 -187
  183. package/dist/utils/path-utils.d.ts +0 -1
  184. package/dist/utils/path-utils.js +2 -44
  185. package/dist/utils/sdk-package-loader.d.ts +0 -1
  186. package/dist/utils/sdk-package-loader.js +2 -78
  187. package/dist/utils/validation.d.ts +0 -1
  188. package/dist/utils/validation.js +2 -53
  189. package/dist/utils/yaml-utils.d.ts +0 -1
  190. package/dist/utils/yaml-utils.js +2 -312
  191. package/node_modules/@cc-switch/sdk/dist/constants.d.ts +0 -1
  192. package/node_modules/@cc-switch/sdk/dist/constants.js +2 -63
  193. package/node_modules/@cc-switch/sdk/dist/errors.d.ts +0 -1
  194. package/node_modules/@cc-switch/sdk/dist/errors.js +2 -8
  195. package/node_modules/@cc-switch/sdk/dist/index.d.ts +0 -1
  196. package/node_modules/@cc-switch/sdk/dist/index.js +2 -9
  197. package/node_modules/@cc-switch/sdk/dist/schemas.d.ts +0 -1
  198. package/node_modules/@cc-switch/sdk/dist/schemas.js +2 -38
  199. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +0 -1
  200. package/node_modules/@cc-switch/sdk/dist/sdk.js +2 -470
  201. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +0 -1
  202. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +4 -307
  203. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts +0 -1
  204. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +2 -37
  205. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts +0 -1
  206. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.js +2 -9
  207. package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts +0 -1
  208. package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +2 -41
  209. package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts +0 -1
  210. package/node_modules/@cc-switch/sdk/dist/services/skill-service.js +2 -9
  211. package/node_modules/@cc-switch/sdk/dist/state.d.ts +0 -1
  212. package/node_modules/@cc-switch/sdk/dist/state.js +2 -19
  213. package/node_modules/@cc-switch/sdk/dist/types.d.ts +0 -1
  214. package/node_modules/@cc-switch/sdk/dist/types.js +1 -1
  215. package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +0 -1
  216. package/node_modules/@cc-switch/sdk/dist/utils/fs.js +3 -114
  217. package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts +0 -1
  218. package/node_modules/@cc-switch/sdk/dist/utils/id.js +2 -12
  219. package/node_modules/@cc-switch/sdk/package.json +1 -1
  220. package/package/acode/dist/ask-user-question-tool.d.ts +0 -1
  221. package/package/acode/dist/ask-user-question-tool.js +4 -233
  222. package/package/acode/dist/built-in-file-tools.d.ts +0 -1
  223. package/package/acode/dist/built-in-file-tools.js +4 -966
  224. package/package/acode/dist/built-in-symbols-tool.d.ts +0 -1
  225. package/package/acode/dist/built-in-symbols-tool.js +2 -117
  226. package/package/acode/dist/builtins/commandArtifacts.d.ts +0 -1
  227. package/package/acode/dist/builtins/commandArtifacts.js +9 -97
  228. package/package/acode/dist/builtins/commandOutputEvents.d.ts +0 -1
  229. package/package/acode/dist/builtins/commandOutputEvents.js +2 -56
  230. package/package/acode/dist/builtins/shellCommandPreparation.d.ts +0 -1
  231. package/package/acode/dist/builtins/shellCommandPreparation.js +5 -44
  232. package/package/acode/dist/builtins/shellCommandResult.d.ts +0 -1
  233. package/package/acode/dist/builtins/shellCommandResult.js +2 -71
  234. package/package/acode/dist/builtins/shellCommandRunner.d.ts +0 -1
  235. package/package/acode/dist/builtins/shellCommandRunner.js +2 -115
  236. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +0 -1
  237. package/package/acode/dist/builtins/shellOutputDecoder.js +2 -94
  238. package/package/acode/dist/cli.d.ts +0 -1
  239. package/package/acode/dist/cli.js +4 -38
  240. package/package/acode/dist/commands/commandLoader.d.ts +0 -1
  241. package/package/acode/dist/commands/commandLoader.js +2 -33
  242. package/package/acode/dist/commands/commandParser.d.ts +0 -1
  243. package/package/acode/dist/commands/commandParser.js +3 -77
  244. package/package/acode/dist/commands/commandRegistry.d.ts +0 -1
  245. package/package/acode/dist/commands/commandRegistry.js +2 -30
  246. package/package/acode/dist/compaction.d.ts +0 -1
  247. package/package/acode/dist/compaction.js +7 -919
  248. package/package/acode/dist/config.d.ts +0 -1
  249. package/package/acode/dist/config.js +5 -105
  250. package/package/acode/dist/fs-utils.d.ts +0 -1
  251. package/package/acode/dist/fs-utils.js +2 -79
  252. package/package/acode/dist/hooks/hookBus.d.ts +0 -1
  253. package/package/acode/dist/hooks/hookBus.js +2 -40
  254. package/package/acode/dist/index.d.ts +0 -1
  255. package/package/acode/dist/index.js +2 -19
  256. package/package/acode/dist/mcpToolNames.d.ts +0 -1
  257. package/package/acode/dist/mcpToolNames.js +2 -17
  258. package/package/acode/dist/parsers/ast-cache.d.ts +0 -1
  259. package/package/acode/dist/parsers/ast-cache.js +2 -76
  260. package/package/acode/dist/parsers/language-detector.d.ts +0 -1
  261. package/package/acode/dist/parsers/language-detector.js +2 -44
  262. package/package/acode/dist/parsers/language-queries.d.ts +0 -1
  263. package/package/acode/dist/parsers/language-queries.js +12 -602
  264. package/package/acode/dist/parsers/symbol-extractor.d.ts +0 -1
  265. package/package/acode/dist/parsers/symbol-extractor.js +3 -164
  266. package/package/acode/dist/parsers/tree-sitter-loader.d.ts +0 -1
  267. package/package/acode/dist/parsers/tree-sitter-loader.js +2 -64
  268. package/package/acode/dist/parsers/types.d.ts +0 -1
  269. package/package/acode/dist/parsers/types.js +1 -7
  270. package/package/acode/dist/runtime.d.ts +0 -1
  271. package/package/acode/dist/runtime.js +86 -3771
  272. package/package/acode/dist/skill-tool.d.ts +0 -1
  273. package/package/acode/dist/skill-tool.js +5 -174
  274. package/package/acode/dist/sub-agent-manager.d.ts +0 -1
  275. package/package/acode/dist/sub-agent-manager.js +2 -1159
  276. package/package/acode/dist/sub-agent-store.d.ts +0 -1
  277. package/package/acode/dist/sub-agent-store.js +4 -236
  278. package/package/acode/dist/sub-agent-tools.d.ts +0 -1
  279. package/package/acode/dist/sub-agent-tools.js +15 -369
  280. package/package/acode/dist/sub-agent-types.d.ts +0 -1
  281. package/package/acode/dist/sub-agent-types.js +1 -8
  282. package/package/acode/dist/todo-store.d.ts +0 -1
  283. package/package/acode/dist/todo-store.js +2 -73
  284. package/package/acode/dist/todo-tool.d.ts +0 -1
  285. package/package/acode/dist/todo-tool.js +5 -121
  286. package/package/acode/dist/types.d.ts +0 -1
  287. package/package/acode/dist/types.js +1 -1
  288. package/package/acode/package.json +2 -2
  289. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +0 -1
  290. package/package/aws-client-agent-mcp/dist/agent-client.js +2 -890
  291. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +0 -1
  292. package/package/aws-client-agent-mcp/dist/agent-client.test.js +0 -1
  293. package/package/aws-client-agent-mcp/dist/config.d.ts +0 -1
  294. package/package/aws-client-agent-mcp/dist/config.js +2 -243
  295. package/package/aws-client-agent-mcp/dist/config.test.d.ts +0 -1
  296. package/package/aws-client-agent-mcp/dist/config.test.js +0 -1
  297. package/package/aws-client-agent-mcp/dist/constants.d.ts +0 -1
  298. package/package/aws-client-agent-mcp/dist/constants.js +2 -24
  299. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +0 -1
  300. package/package/aws-client-agent-mcp/dist/context-manager.js +2 -477
  301. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +0 -1
  302. package/package/aws-client-agent-mcp/dist/context-manager.test.js +0 -1
  303. package/package/aws-client-agent-mcp/dist/http-client.d.ts +0 -1
  304. package/package/aws-client-agent-mcp/dist/http-client.js +2 -446
  305. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +0 -1
  306. package/package/aws-client-agent-mcp/dist/http-client.test.js +0 -1
  307. package/package/aws-client-agent-mcp/dist/index.d.ts +0 -1
  308. package/package/aws-client-agent-mcp/dist/index.js +2 -34
  309. package/package/aws-client-agent-mcp/dist/logger.d.ts +0 -1
  310. package/package/aws-client-agent-mcp/dist/logger.js +3 -178
  311. package/package/aws-client-agent-mcp/dist/logger.test.d.ts +0 -1
  312. package/package/aws-client-agent-mcp/dist/logger.test.js +0 -1
  313. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -1
  314. package/package/aws-client-agent-mcp/dist/mcp-server.js +38 -2709
  315. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +0 -1
  316. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +0 -1
  317. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +0 -1
  318. package/package/aws-client-agent-mcp/dist/mcp-tools.js +22 -562
  319. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts +0 -1
  320. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +0 -1
  321. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +0 -1
  322. package/package/aws-client-agent-mcp/dist/memory-store.js +4 -826
  323. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +0 -1
  324. package/package/aws-client-agent-mcp/dist/memory-store.test.js +0 -1
  325. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +0 -1
  326. package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -294
  327. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +0 -1
  328. package/package/aws-client-agent-mcp/dist/message-buffer.js +2 -288
  329. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +0 -1
  330. package/package/aws-client-agent-mcp/dist/message-buffer.test.js +0 -1
  331. package/package/aws-client-agent-mcp/dist/messageContent.d.ts +0 -1
  332. package/package/aws-client-agent-mcp/dist/messageContent.js +2 -125
  333. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +0 -1
  334. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +2 -103
  335. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +0 -1
  336. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +0 -1
  337. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +0 -1
  338. package/package/aws-client-agent-mcp/dist/server-memory-store.js +2 -96
  339. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +0 -1
  340. package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -327
  341. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +0 -1
  342. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +0 -1
  343. package/package/aws-client-agent-mcp/dist/types.d.ts +0 -1
  344. package/package/aws-client-agent-mcp/dist/types.js +2 -9
  345. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -1
  346. package/package/aws-client-agent-mcp/dist/websocket-client.js +2 -677
  347. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +0 -1
  348. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +0 -1
  349. package/package/aws-client-agent-mcp/package.json +1 -1
  350. package/package/cc-switch-sdk/dist/constants.d.ts +0 -1
  351. package/package/cc-switch-sdk/dist/constants.js +2 -63
  352. package/package/cc-switch-sdk/dist/errors.d.ts +0 -1
  353. package/package/cc-switch-sdk/dist/errors.js +2 -8
  354. package/package/cc-switch-sdk/dist/index.d.ts +0 -1
  355. package/package/cc-switch-sdk/dist/index.js +2 -9
  356. package/package/cc-switch-sdk/dist/schemas.d.ts +0 -1
  357. package/package/cc-switch-sdk/dist/schemas.js +2 -38
  358. package/package/cc-switch-sdk/dist/sdk.d.ts +0 -1
  359. package/package/cc-switch-sdk/dist/sdk.js +2 -470
  360. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +0 -1
  361. package/package/cc-switch-sdk/dist/services/ai-config-service.js +4 -307
  362. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +0 -1
  363. package/package/cc-switch-sdk/dist/services/mcp-model.js +2 -37
  364. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +0 -1
  365. package/package/cc-switch-sdk/dist/services/mcp-service.js +2 -9
  366. package/package/cc-switch-sdk/dist/services/skill-model.d.ts +0 -1
  367. package/package/cc-switch-sdk/dist/services/skill-model.js +2 -41
  368. package/package/cc-switch-sdk/dist/services/skill-service.d.ts +0 -1
  369. package/package/cc-switch-sdk/dist/services/skill-service.js +2 -9
  370. package/package/cc-switch-sdk/dist/state.d.ts +0 -1
  371. package/package/cc-switch-sdk/dist/state.js +2 -19
  372. package/package/cc-switch-sdk/dist/types.d.ts +0 -1
  373. package/package/cc-switch-sdk/dist/types.js +1 -1
  374. package/package/cc-switch-sdk/dist/utils/fs.d.ts +0 -1
  375. package/package/cc-switch-sdk/dist/utils/fs.js +3 -114
  376. package/package/cc-switch-sdk/dist/utils/id.d.ts +0 -1
  377. package/package/cc-switch-sdk/dist/utils/id.js +2 -12
  378. package/package/cc-switch-sdk/package.json +1 -1
  379. package/package.json +4 -2
  380. package/dist/adapter/AcodeSdkAdapter.d.ts.map +0 -1
  381. package/dist/adapter/AdapterRegistry.d.ts.map +0 -1
  382. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +0 -1
  383. package/dist/adapter/CodexSdkAdapter.d.ts.map +0 -1
  384. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +0 -1
  385. package/dist/adapter/SdkProviderSpi.d.ts.map +0 -1
  386. package/dist/adapter/acode-tool-names.d.ts.map +0 -1
  387. package/dist/adapter/idle-poll-loop.d.ts.map +0 -1
  388. package/dist/adapter/index.d.ts.map +0 -1
  389. package/dist/adapter/instance-ai-config-resolver.d.ts.map +0 -1
  390. package/dist/adapter/types.d.ts.map +0 -1
  391. package/dist/adapters/cc-switch/common.d.ts.map +0 -1
  392. package/dist/adapters/cc-switch/index.d.ts.map +0 -1
  393. package/dist/adapters/cc-switch/mcp-acode.d.ts.map +0 -1
  394. package/dist/adapters/cc-switch/mcp-claude.d.ts.map +0 -1
  395. package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +0 -1
  396. package/dist/adapters/cc-switch/mcp-codex.d.ts.map +0 -1
  397. package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +0 -1
  398. package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +0 -1
  399. package/dist/adapters/cc-switch/skill-acode.d.ts.map +0 -1
  400. package/dist/adapters/cc-switch/skill-claude.d.ts.map +0 -1
  401. package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +0 -1
  402. package/dist/adapters/cc-switch/skill-codex.d.ts.map +0 -1
  403. package/dist/adapters/cc-switch/skill-directory.d.ts.map +0 -1
  404. package/dist/adapters/cc-switch/skill-opencode.d.ts.map +0 -1
  405. package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +0 -1
  406. package/dist/config.d.ts.map +0 -1
  407. package/dist/index.d.ts.map +0 -1
  408. package/dist/middleware/auth.d.ts.map +0 -1
  409. package/dist/routes/acode-todos.d.ts.map +0 -1
  410. package/dist/routes/ai-sources.d.ts.map +0 -1
  411. package/dist/routes/dashboard.d.ts.map +0 -1
  412. package/dist/routes/events.d.ts.map +0 -1
  413. package/dist/routes/file-browser.d.ts.map +0 -1
  414. package/dist/routes/file-diff-rollback.d.ts.map +0 -1
  415. package/dist/routes/file-snapshot.d.ts.map +0 -1
  416. package/dist/routes/git.d.ts.map +0 -1
  417. package/dist/routes/instance.d.ts.map +0 -1
  418. package/dist/routes/mcp.d.ts.map +0 -1
  419. package/dist/routes/processes.d.ts.map +0 -1
  420. package/dist/routes/properties.d.ts.map +0 -1
  421. package/dist/routes/pty.d.ts.map +0 -1
  422. package/dist/routes/runtime-binding.d.ts.map +0 -1
  423. package/dist/routes/sessions.d.ts.map +0 -1
  424. package/dist/routes/skills.d.ts.map +0 -1
  425. package/dist/routes/sub-agents.d.ts.map +0 -1
  426. package/dist/routes/system-metrics.d.ts.map +0 -1
  427. package/dist/routes/task-context.d.ts.map +0 -1
  428. package/dist/routes/terminal.d.ts.map +0 -1
  429. package/dist/routes/yml.d.ts.map +0 -1
  430. package/dist/services/acode-package.d.ts.map +0 -1
  431. package/dist/services/agent-event-store.d.ts.map +0 -1
  432. package/dist/services/agent-process-manager.d.ts.map +0 -1
  433. package/dist/services/ai-source-apply.d.ts.map +0 -1
  434. package/dist/services/auto-register.d.ts.map +0 -1
  435. package/dist/services/aws-client-agent-mcp.d.ts.map +0 -1
  436. package/dist/services/bridge-package-publish-hooks.d.ts.map +0 -1
  437. package/dist/services/cc-switch-sdk.d.ts.map +0 -1
  438. package/dist/services/cli-commands.d.ts.map +0 -1
  439. package/dist/services/event-delta-pusher.d.ts.map +0 -1
  440. package/dist/services/fileSnapshotStore.d.ts.map +0 -1
  441. package/dist/services/instance-ai-config-service.d.ts.map +0 -1
  442. package/dist/services/instance-init-service.d.ts.map +0 -1
  443. package/dist/services/instance-service.d.ts.map +0 -1
  444. package/dist/services/instance-state.d.ts.map +0 -1
  445. package/dist/services/legacy-path-migration.d.ts.map +0 -1
  446. package/dist/services/lifecycle-state.d.ts.map +0 -1
  447. package/dist/services/mcp-launch-binding-queue.d.ts.map +0 -1
  448. package/dist/services/orphan-monitor.d.ts.map +0 -1
  449. package/dist/services/panel-auth.d.ts.map +0 -1
  450. package/dist/services/process-detector.d.ts.map +0 -1
  451. package/dist/services/process-registry.d.ts.map +0 -1
  452. package/dist/services/ring-buffer.d.ts.map +0 -1
  453. package/dist/services/runtime-binding.d.ts.map +0 -1
  454. package/dist/services/runtime-lifecycle-policy.d.ts.map +0 -1
  455. package/dist/services/session-output.d.ts.map +0 -1
  456. package/dist/services/startup-config-wizard.d.ts.map +0 -1
  457. package/dist/services/sub-agent-manager-instance.d.ts.map +0 -1
  458. package/dist/services/system-metrics.d.ts.map +0 -1
  459. package/dist/services/terminal-persistence.d.ts.map +0 -1
  460. package/dist/services/tool-installer.d.ts.map +0 -1
  461. package/dist/services/tunnel-client.d.ts.map +0 -1
  462. package/dist/services/windows-service-manager.d.ts.map +0 -1
  463. package/dist/services/workspace-files.d.ts.map +0 -1
  464. package/dist/services/workspace-watch.d.ts.map +0 -1
  465. package/dist/services/workspaceTaskChangeWatcher.d.ts.map +0 -1
  466. package/dist/types.d.ts.map +0 -1
  467. package/dist/utils/file-utils.d.ts.map +0 -1
  468. package/dist/utils/instance-ai-config-debug-logger.d.ts.map +0 -1
  469. package/dist/utils/logger.d.ts.map +0 -1
  470. package/dist/utils/mcp-utils.d.ts.map +0 -1
  471. package/dist/utils/path-utils.d.ts.map +0 -1
  472. package/dist/utils/sdk-package-loader.d.ts.map +0 -1
  473. package/dist/utils/validation.d.ts.map +0 -1
  474. package/dist/utils/yaml-utils.d.ts.map +0 -1
  475. package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +0 -1
  476. package/node_modules/@cc-switch/sdk/dist/errors.d.ts.map +0 -1
  477. package/node_modules/@cc-switch/sdk/dist/index.d.ts.map +0 -1
  478. package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +0 -1
  479. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +0 -1
  480. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +0 -1
  481. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts.map +0 -1
  482. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts.map +0 -1
  483. package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts.map +0 -1
  484. package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts.map +0 -1
  485. package/node_modules/@cc-switch/sdk/dist/state.d.ts.map +0 -1
  486. package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +0 -1
  487. package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts.map +0 -1
  488. package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts.map +0 -1
  489. package/package/acode/dist/ask-user-question-tool.d.ts.map +0 -1
  490. package/package/acode/dist/built-in-file-tools.d.ts.map +0 -1
  491. package/package/acode/dist/built-in-symbols-tool.d.ts.map +0 -1
  492. package/package/acode/dist/builtins/commandArtifacts.d.ts.map +0 -1
  493. package/package/acode/dist/builtins/commandOutputEvents.d.ts.map +0 -1
  494. package/package/acode/dist/builtins/shellCommandPreparation.d.ts.map +0 -1
  495. package/package/acode/dist/builtins/shellCommandResult.d.ts.map +0 -1
  496. package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +0 -1
  497. package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +0 -1
  498. package/package/acode/dist/cli.d.ts.map +0 -1
  499. package/package/acode/dist/commands/commandLoader.d.ts.map +0 -1
  500. package/package/acode/dist/commands/commandParser.d.ts.map +0 -1
  501. package/package/acode/dist/commands/commandRegistry.d.ts.map +0 -1
  502. package/package/acode/dist/compaction.d.ts.map +0 -1
  503. package/package/acode/dist/config.d.ts.map +0 -1
  504. package/package/acode/dist/fs-utils.d.ts.map +0 -1
  505. package/package/acode/dist/hooks/hookBus.d.ts.map +0 -1
  506. package/package/acode/dist/index.d.ts.map +0 -1
  507. package/package/acode/dist/mcpToolNames.d.ts.map +0 -1
  508. package/package/acode/dist/parsers/ast-cache.d.ts.map +0 -1
  509. package/package/acode/dist/parsers/language-detector.d.ts.map +0 -1
  510. package/package/acode/dist/parsers/language-queries.d.ts.map +0 -1
  511. package/package/acode/dist/parsers/symbol-extractor.d.ts.map +0 -1
  512. package/package/acode/dist/parsers/tree-sitter-loader.d.ts.map +0 -1
  513. package/package/acode/dist/parsers/types.d.ts.map +0 -1
  514. package/package/acode/dist/runtime.d.ts.map +0 -1
  515. package/package/acode/dist/skill-tool.d.ts.map +0 -1
  516. package/package/acode/dist/sub-agent-manager.d.ts.map +0 -1
  517. package/package/acode/dist/sub-agent-store.d.ts.map +0 -1
  518. package/package/acode/dist/sub-agent-tools.d.ts.map +0 -1
  519. package/package/acode/dist/sub-agent-types.d.ts.map +0 -1
  520. package/package/acode/dist/todo-store.d.ts.map +0 -1
  521. package/package/acode/dist/todo-tool.d.ts.map +0 -1
  522. package/package/acode/dist/types.d.ts.map +0 -1
  523. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +0 -1
  524. package/package/aws-client-agent-mcp/dist/agent-client.js.map +0 -1
  525. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +0 -1
  526. package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +0 -1
  527. package/package/aws-client-agent-mcp/dist/config.d.ts.map +0 -1
  528. package/package/aws-client-agent-mcp/dist/config.js.map +0 -1
  529. package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +0 -1
  530. package/package/aws-client-agent-mcp/dist/config.test.js.map +0 -1
  531. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +0 -1
  532. package/package/aws-client-agent-mcp/dist/constants.js.map +0 -1
  533. package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +0 -1
  534. package/package/aws-client-agent-mcp/dist/context-manager.js.map +0 -1
  535. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +0 -1
  536. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +0 -1
  537. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +0 -1
  538. package/package/aws-client-agent-mcp/dist/http-client.js.map +0 -1
  539. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +0 -1
  540. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +0 -1
  541. package/package/aws-client-agent-mcp/dist/index.d.ts.map +0 -1
  542. package/package/aws-client-agent-mcp/dist/index.js.map +0 -1
  543. package/package/aws-client-agent-mcp/dist/logger.d.ts.map +0 -1
  544. package/package/aws-client-agent-mcp/dist/logger.js.map +0 -1
  545. package/package/aws-client-agent-mcp/dist/logger.test.d.ts.map +0 -1
  546. package/package/aws-client-agent-mcp/dist/logger.test.js.map +0 -1
  547. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +0 -1
  548. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +0 -1
  549. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +0 -1
  550. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +0 -1
  551. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +0 -1
  552. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +0 -1
  553. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts.map +0 -1
  554. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js.map +0 -1
  555. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +0 -1
  556. package/package/aws-client-agent-mcp/dist/memory-store.js.map +0 -1
  557. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +0 -1
  558. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +0 -1
  559. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +0 -1
  560. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +0 -1
  561. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +0 -1
  562. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +0 -1
  563. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +0 -1
  564. package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +0 -1
  565. package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +0 -1
  566. package/package/aws-client-agent-mcp/dist/messageContent.js.map +0 -1
  567. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +0 -1
  568. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +0 -1
  569. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +0 -1
  570. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +0 -1
  571. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +0 -1
  572. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +0 -1
  573. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +0 -1
  574. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +0 -1
  575. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +0 -1
  576. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +0 -1
  577. package/package/aws-client-agent-mcp/dist/types.d.ts.map +0 -1
  578. package/package/aws-client-agent-mcp/dist/types.js.map +0 -1
  579. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +0 -1
  580. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +0 -1
  581. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +0 -1
  582. package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +0 -1
  583. package/package/cc-switch-sdk/dist/constants.d.ts.map +0 -1
  584. package/package/cc-switch-sdk/dist/errors.d.ts.map +0 -1
  585. package/package/cc-switch-sdk/dist/index.d.ts.map +0 -1
  586. package/package/cc-switch-sdk/dist/schemas.d.ts.map +0 -1
  587. package/package/cc-switch-sdk/dist/sdk.d.ts.map +0 -1
  588. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +0 -1
  589. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +0 -1
  590. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +0 -1
  591. package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +0 -1
  592. package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +0 -1
  593. package/package/cc-switch-sdk/dist/state.d.ts.map +0 -1
  594. package/package/cc-switch-sdk/dist/types.d.ts.map +0 -1
  595. package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +0 -1
  596. package/package/cc-switch-sdk/dist/utils/id.d.ts.map +0 -1
@@ -1,1053 +1,2 @@
1
- /**
2
- * Bridge 实例自动注册服务
3
- *
4
- * 实现 Bridge 实例启动后自动向调度中心注册的功能
5
- *
6
- * 配置来源(优先级从高到低):
7
- * 1. 环境变量
8
- * 2. 用户目录下的 .aws-bridge/config.json 文件
9
- */
10
- import { v4 as uuidv4 } from "uuid";
11
- import axios from "axios";
12
- import os from "node:os";
13
- import path from "node:path";
14
- import fs from "node:fs";
15
- import { logger } from "../utils/logger.js";
16
- import { schedulerBaseUrl } from "../config.js";
17
- import { clearRuntimeBinding, clearScopedRuntimeAccessToken, getRuntimeAccessToken, getRuntimeBindingPublicState, getScopedRuntimeAccessToken, loadRuntimeBinding, normalizeSchedulerBaseUrl, saveRuntimeBinding, saveScopedRuntimeAccessToken, } from "./runtime-binding.js";
18
- const DEFAULT_CONFIG = {
19
- enabled: false,
20
- serverUrl: schedulerBaseUrl,
21
- preferSameLanIp: true,
22
- maxRetries: 3,
23
- retryInterval: 2000,
24
- };
25
- let registrationState = {
26
- registered: false,
27
- registrations: {},
28
- };
29
- let cachedConfiguredConnectionKeys = [];
30
- export function getConfiguredConnectionKeys() {
31
- return [...cachedConfiguredConnectionKeys];
32
- }
33
- /** 注册失败后的后台重试默认间隔(毫秒),可用 AWS_REGISTER_BACKGROUND_RETRY_INTERVAL 覆盖 */
34
- const DEFAULT_BACKGROUND_RETRY_INTERVAL_MS = 30_000;
35
- function getBackgroundRetryIntervalMs() {
36
- const raw = Number(process.env.AWS_REGISTER_BACKGROUND_RETRY_INTERVAL);
37
- return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_BACKGROUND_RETRY_INTERVAL_MS;
38
- }
39
- /** 后台重试定时器:key = 归一化 serverUrl,保证同一 target 只有一个重试循环 */
40
- const backgroundRetryTimers = new Map();
41
- /**
42
- * 调度后台注册重试。
43
- * bridge 先于 server 启动(或 server 临时不可用)时,前台重试耗尽后转入后台
44
- * 持续重试,直到与调度中心建立连接为止。
45
- */
46
- function scheduleBackgroundRegisterRetry(config) {
47
- const rawServerUrl = config.serverUrl || schedulerBaseUrl;
48
- const key = normalizeSchedulerBaseUrl(rawServerUrl) || rawServerUrl;
49
- if (backgroundRetryTimers.has(key)) {
50
- return;
51
- }
52
- const timer = setTimeout(() => {
53
- backgroundRetryTimers.delete(key);
54
- void retryRegisterInBackground(config, key);
55
- }, getBackgroundRetryIntervalMs());
56
- // unref:后台重试不应阻止进程退出(优雅关闭/测试进程)
57
- timer.unref?.();
58
- backgroundRetryTimers.set(key, timer);
59
- }
60
- /**
61
- * 后台重试注册:每次触发时重新从 config.json 读取该 target 的最新配置
62
- *(运行期间修改配置可生效)。失败由 autoRegisterSingle 末尾自动调度下一次;
63
- * 配置被禁用/删除(enabled=false 或无 userKey)时自然终止重试循环。
64
- */
65
- async function retryRegisterInBackground(config, key) {
66
- try {
67
- const fresh = loadConfigs().find((item) => (normalizeSchedulerBaseUrl(item.serverUrl || schedulerBaseUrl) ||
68
- (item.serverUrl || schedulerBaseUrl)) === key) || config;
69
- await autoRegisterSingle(fresh, { backgroundRetry: true });
70
- }
71
- catch (error) {
72
- logger.warn(`[AutoRegister] 后台重试注册异常: ${error.message}`);
73
- scheduleBackgroundRegisterRetry(config);
74
- }
75
- }
76
- /** 停止所有后台注册重试(优雅关闭/测试清理用) */
77
- export function cancelBackgroundRegisterRetries() {
78
- for (const timer of backgroundRetryTimers.values()) {
79
- clearTimeout(timer);
80
- }
81
- backgroundRetryTimers.clear();
82
- }
83
- function normalizeOptionalString(value) {
84
- if (value == null) {
85
- return undefined;
86
- }
87
- const normalized = String(value).trim();
88
- return normalized || undefined;
89
- }
90
- function normalizeSchedulerHttpBaseUrl(value) {
91
- return normalizeSchedulerBaseUrl(value);
92
- }
93
- function normalizeOptionalBoolean(value) {
94
- if (typeof value === "boolean") {
95
- return value;
96
- }
97
- if (typeof value === "string") {
98
- const normalized = value.trim().toLowerCase();
99
- if (["true", "1", "yes", "y"].includes(normalized)) {
100
- return true;
101
- }
102
- if (["false", "0", "no", "n"].includes(normalized)) {
103
- return false;
104
- }
105
- }
106
- return undefined;
107
- }
108
- function normalizeOptionalNumber(value) {
109
- if (value == null || value === "") {
110
- return undefined;
111
- }
112
- const parsed = Number(value);
113
- return Number.isFinite(parsed) ? parsed : undefined;
114
- }
115
- function normalizeTargetConfig(source) {
116
- const serverUrl = normalizeOptionalString(source.serverUrl) ||
117
- normalizeOptionalString(source.schedulerBaseUrl);
118
- const connectionKey = normalizeOptionalString(source.connectionKey) ||
119
- normalizeOptionalString(source.password);
120
- return {
121
- enabled: normalizeOptionalBoolean(source.enabled),
122
- serverUrl,
123
- tenantId: normalizeOptionalString(source.tenantId),
124
- userKey: normalizeOptionalString(source.userKey),
125
- connectionKey,
126
- instanceName: normalizeOptionalString(source.instanceName),
127
- instanceId: normalizeOptionalString(source.instanceId),
128
- projectName: normalizeOptionalString(source.projectName),
129
- roleName: normalizeOptionalString(source.roleName),
130
- workspacePath: normalizeOptionalString(source.workspacePath),
131
- registerAddr: normalizeOptionalString(source.registerAddr),
132
- registerIp: normalizeOptionalString(source.registerIp),
133
- virtualIp: normalizeOptionalString(source.virtualIp),
134
- tunnel: normalizeOptionalBoolean(source.tunnel),
135
- preferSameLanIp: normalizeOptionalBoolean(source.preferSameLanIp),
136
- maxRetries: normalizeOptionalNumber(source.maxRetries),
137
- retryInterval: normalizeOptionalNumber(source.retryInterval),
138
- };
139
- }
140
- /**
141
- * 配置文件路径
142
- */
143
- export function getAutoRegisterConfigFilePath() {
144
- const homeDir = os.homedir();
145
- return path.join(homeDir, ".aws-bridge", "config.json");
146
- }
147
- /**
148
- * 从配置文件加载配置
149
- *
150
- * 配置文件位置:~/.aws-bridge/config.json
151
- *
152
- * 配置文件格式:
153
- * {
154
- * "connectionKey": "bridge-password", // 可选,server/面板连接该 bridge 的密钥
155
- * "autoRegisterTargets": [
156
- * {
157
- * "serverUrl": "http://scheduler-host:7380", // 必填,要主动注册的 server 地址
158
- * "userKey": "aws_live_xxx", // 必填,用户 API Key
159
- * "instanceName": "my-bridge", // 必填/可选,默认主机名
160
- * "registerAddr": "192.168.1.25:18081", // 可选,注册地址(推荐,支持 host:port / 纯 host / 完整 URL)
161
- * "connectionKey": "bridge-password" // 可选,不填则使用顶层 connectionKey
162
- * }
163
- * ],
164
- *
165
- * // 兼容旧版单目标配置:
166
- * "userKey": "aws_live_xxx", // 必填,用户 API Key
167
- * "tenantId": "xxx", // 可选,租户 ID(不填则自动推导)
168
- * "instanceName": "my-bridge", // 可选,默认使用主机名
169
- * "projectName": "default", // 可选
170
- * "roleName": "Bridge", // 可选
171
- * "workspacePath": "/path/to/workspace", // 可选
172
- * "registerAddr": "192.168.1.25:18081", // 可选,注册地址(推荐)
173
- * "registerIp": "192.168.1.25", // 可选,已废弃(仅纯 IP,端口由 AWS_RUNTIME_BRIDGE_PORT 决定)
174
- * "virtualIp": "10.144.144.1", // 可选,兼容 EasyTier 虚拟 IP
175
- * "maxRetries": 5, // 可选
176
- * "retryInterval": 5000 // 可选
177
- * }
178
- */
179
- function loadConfigFromFile() {
180
- const configPath = getAutoRegisterConfigFilePath();
181
- try {
182
- if (!fs.existsSync(configPath)) {
183
- logger.debug(`[AutoRegister] 配置文件不存在: ${configPath}`);
184
- return null;
185
- }
186
- const content = fs.readFileSync(configPath, "utf-8");
187
- const config = JSON.parse(content);
188
- logger.info(`[AutoRegister] 从配置文件加载配置: ${configPath}`);
189
- return normalizeTargetConfig(config);
190
- }
191
- catch (error) {
192
- const err = error;
193
- logger.warn(`[AutoRegister] 读取配置文件失败: ${configPath}, error: ${err.message}`);
194
- return null;
195
- }
196
- }
197
- function loadTargetsFromFile() {
198
- const configPath = getAutoRegisterConfigFilePath();
199
- try {
200
- if (!fs.existsSync(configPath)) {
201
- return [];
202
- }
203
- const content = fs.readFileSync(configPath, "utf-8");
204
- const config = JSON.parse(content);
205
- const topLevel = normalizeTargetConfig(config);
206
- const rawTargets = Array.isArray(config.autoRegisterTargets)
207
- ? config.autoRegisterTargets
208
- : [];
209
- if (rawTargets.length === 0) {
210
- return topLevel.userKey ? [topLevel] : [];
211
- }
212
- return rawTargets
213
- .filter((item) => Boolean(item && typeof item === "object" && !Array.isArray(item)))
214
- .map((item) => {
215
- const target = normalizeTargetConfig(item);
216
- return {
217
- ...topLevel,
218
- ...target,
219
- connectionKey: target.connectionKey || topLevel.connectionKey,
220
- };
221
- });
222
- }
223
- catch (error) {
224
- const err = error;
225
- logger.warn(`[AutoRegister] 读取自动注册目标失败: ${configPath}, error: ${err.message}`);
226
- return [];
227
- }
228
- }
229
- /**
230
- * 从环境变量加载配置
231
- */
232
- function loadConfigFromEnv() {
233
- const envConfig = {};
234
- if (process.env.AWS_AUTO_REGISTER === "true") {
235
- envConfig.enabled = true;
236
- }
237
- if (process.env.AWS_RUNTIME_SCHEDULER_BASE_URL) {
238
- envConfig.serverUrl = process.env.AWS_RUNTIME_SCHEDULER_BASE_URL;
239
- }
240
- if (process.env.AWS_TENANT_ID) {
241
- envConfig.tenantId = process.env.AWS_TENANT_ID;
242
- }
243
- if (process.env.AWS_USER_KEY) {
244
- envConfig.userKey = process.env.AWS_USER_KEY;
245
- }
246
- if (process.env.AWS_BRIDGE_CONNECTION_KEY) {
247
- envConfig.connectionKey = process.env.AWS_BRIDGE_CONNECTION_KEY;
248
- }
249
- if (process.env.AWS_INSTANCE_NAME) {
250
- envConfig.instanceName = process.env.AWS_INSTANCE_NAME;
251
- }
252
- if (process.env.AWS_PROJECT_NAME) {
253
- envConfig.projectName = process.env.AWS_PROJECT_NAME;
254
- }
255
- if (process.env.AWS_ROLE_NAME) {
256
- envConfig.roleName = process.env.AWS_ROLE_NAME;
257
- }
258
- if (process.env.AWS_WORKSPACE_PATH) {
259
- envConfig.workspacePath = process.env.AWS_WORKSPACE_PATH;
260
- }
261
- if (process.env.AWS_REGISTER_ADDR) {
262
- envConfig.registerAddr = process.env.AWS_REGISTER_ADDR;
263
- }
264
- if (process.env.AWS_REGISTER_IP) {
265
- envConfig.registerIp = process.env.AWS_REGISTER_IP;
266
- }
267
- if (process.env.AWS_VIRTUAL_IP) {
268
- envConfig.virtualIp = process.env.AWS_VIRTUAL_IP;
269
- }
270
- if (process.env.AWS_PREFER_SAME_LAN_IP) {
271
- envConfig.preferSameLanIp =
272
- normalizeOptionalBoolean(process.env.AWS_PREFER_SAME_LAN_IP) ?? true;
273
- }
274
- if (process.env.AWS_REGISTER_MAX_RETRIES) {
275
- envConfig.maxRetries = parseInt(process.env.AWS_REGISTER_MAX_RETRIES, 10);
276
- }
277
- if (process.env.AWS_REGISTER_RETRY_INTERVAL) {
278
- envConfig.retryInterval = parseInt(process.env.AWS_REGISTER_RETRY_INTERVAL, 10);
279
- }
280
- return envConfig;
281
- }
282
- /**
283
- * 加载自动注册配置
284
- *
285
- * 优先级:环境变量 > 配置文件 > 默认值
286
- *
287
- * 如果没有配置文件且没有环境变量,则不启用自动注册
288
- */
289
- export function loadConfig() {
290
- // 1. 尝试从配置文件加载
291
- const fileConfig = loadConfigFromFile();
292
- // 2. 从环境变量加载(可覆盖配置文件)
293
- const envConfig = loadConfigFromEnv();
294
- // 3. 合并配置:环境变量优先级最高
295
- const merged = {
296
- ...DEFAULT_CONFIG,
297
- ...(fileConfig || {}),
298
- ...envConfig,
299
- };
300
- // 4. 设置默认实例名(如果未配置)
301
- const instanceName = merged.instanceName || os.hostname();
302
- // 5. 判断是否启用
303
- // 如果环境变量明确设置了 AWS_AUTO_REGISTER,使用环境变量的值
304
- // 否则,如果配置文件存在(无论是否有内容),则启用自动注册
305
- let enabled = false;
306
- if (process.env.AWS_AUTO_REGISTER !== undefined) {
307
- enabled = process.env.AWS_AUTO_REGISTER === "true";
308
- }
309
- else if (fileConfig) {
310
- enabled = true;
311
- }
312
- return {
313
- enabled,
314
- serverUrl: merged.serverUrl || schedulerBaseUrl,
315
- tenantId: merged.tenantId || "", // 保持为空字符串,后续会通过userKey自动推导
316
- userKey: merged.userKey || "",
317
- connectionKey: merged.connectionKey,
318
- instanceName,
319
- instanceId: merged.instanceId,
320
- projectName: merged.projectName,
321
- roleName: merged.roleName,
322
- workspacePath: merged.workspacePath,
323
- registerAddr: merged.registerAddr,
324
- registerIp: merged.registerIp,
325
- virtualIp: merged.virtualIp,
326
- // 保留三态(true/false/undefined):isTunnelConfig 依赖 undefined 走向后兼容判定
327
- tunnel: typeof merged.tunnel === "boolean" ? merged.tunnel : undefined,
328
- preferSameLanIp: merged.preferSameLanIp !== false,
329
- maxRetries: merged.maxRetries,
330
- retryInterval: merged.retryInterval,
331
- };
332
- }
333
- export function loadConfigs() {
334
- const fileTargets = loadTargetsFromFile();
335
- const envConfig = loadConfigFromEnv();
336
- const targets = fileTargets.length > 0 ? fileTargets : [loadConfigFromFile() || {}];
337
- const configs = targets.map((target) => {
338
- const merged = {
339
- ...DEFAULT_CONFIG,
340
- ...target,
341
- ...envConfig,
342
- };
343
- let enabled = false;
344
- if (process.env.AWS_AUTO_REGISTER !== undefined) {
345
- enabled = process.env.AWS_AUTO_REGISTER === "true";
346
- }
347
- else {
348
- enabled = fileTargets.length > 0 || Boolean(merged.userKey);
349
- }
350
- return {
351
- enabled,
352
- serverUrl: merged.serverUrl || schedulerBaseUrl,
353
- tenantId: merged.tenantId || "",
354
- userKey: merged.userKey || "",
355
- connectionKey: merged.connectionKey,
356
- instanceName: merged.instanceName || os.hostname(),
357
- instanceId: merged.instanceId,
358
- projectName: merged.projectName,
359
- roleName: merged.roleName,
360
- workspacePath: merged.workspacePath,
361
- registerAddr: merged.registerAddr,
362
- registerIp: merged.registerIp,
363
- virtualIp: merged.virtualIp,
364
- // 保留三态(true/false/undefined):isTunnelConfig 依赖 undefined 走向后兼容判定
365
- tunnel: typeof merged.tunnel === "boolean" ? merged.tunnel : undefined,
366
- preferSameLanIp: merged.preferSameLanIp !== false,
367
- maxRetries: merged.maxRetries,
368
- retryInterval: merged.retryInterval,
369
- };
370
- });
371
- cachedConfiguredConnectionKeys = configs
372
- .map((config) => config.connectionKey)
373
- .filter((key) => Boolean(key && key.trim()));
374
- return configs;
375
- }
376
- /**
377
- * 获取本机所有非内部 IPv4 地址
378
- */
379
- function getAllLocalIpAddresses() {
380
- const interfaces = os.networkInterfaces();
381
- const addresses = [];
382
- for (const name of Object.keys(interfaces)) {
383
- const nets = interfaces[name];
384
- if (!nets)
385
- continue;
386
- for (const net of nets) {
387
- // 跳过内部和非 IPv4 地址
388
- if (net.family === "IPv4" && !net.internal) {
389
- addresses.push({
390
- address: net.address,
391
- netmask: net.netmask,
392
- name: name,
393
- });
394
- }
395
- }
396
- }
397
- return addresses;
398
- }
399
- /**
400
- * 将 IP 地址转换为整数
401
- */
402
- function ipToInt(ip) {
403
- const parts = ip.split(".").map(Number);
404
- return (parts[0] << 24) + (parts[1] << 16) + (parts[2] << 8) + parts[3];
405
- }
406
- /**
407
- * 判断两个 IP 是否在同一子网
408
- */
409
- function isSameSubnet(ip1, ip2, netmask) {
410
- const ip1Int = ipToInt(ip1);
411
- const ip2Int = ipToInt(ip2);
412
- const maskInt = ipToInt(netmask);
413
- return (ip1Int & maskInt) === (ip2Int & maskInt);
414
- }
415
- /**
416
- * 从 URL 中提取 IP 地址
417
- */
418
- function extractIpFromUrl(url) {
419
- try {
420
- const urlObj = new URL(url);
421
- // 如果是主机名,尝试解析
422
- if (urlObj.hostname === "localhost" || urlObj.hostname === "127.0.0.1") {
423
- return "127.0.0.1";
424
- }
425
- // 检查是否是有效的 IP 地址
426
- const ipPattern = /^(\d{1,3}\.){3}\d{1,3}$/;
427
- if (ipPattern.test(urlObj.hostname)) {
428
- return urlObj.hostname;
429
- }
430
- // 对于主机名,返回 null(无法直接判断子网)
431
- return null;
432
- }
433
- catch {
434
- return null;
435
- }
436
- }
437
- /**
438
- * 判断调度中心地址是否指向本机回环地址。
439
- */
440
- function isLoopbackIp(ip) {
441
- return ip === "127.0.0.1";
442
- }
443
- /**
444
- * 获取与调度中心同局域网的本机 IP 地址
445
- *
446
- * 策略:
447
- * 1. 解析调度中心 URL 获取其 IP
448
- * 2. 遍历本机网卡,找到与调度中心同子网的 IP
449
- * 3. 如果找不到同子网 IP,返回 127.0.0.1
450
- */
451
- function getPreferredIpAddress(schedulerUrl) {
452
- const allIps = getAllLocalIpAddresses();
453
- if (allIps.length === 0) {
454
- logger.warn("[AutoRegister] 未找到任何非内部 IP 地址,使用 127.0.0.1");
455
- return "127.0.0.1";
456
- }
457
- // 尝试从调度中心 URL 提取 IP
458
- const schedulerIp = extractIpFromUrl(schedulerUrl);
459
- if (schedulerIp) {
460
- if (isLoopbackIp(schedulerIp)) {
461
- return "127.0.0.1";
462
- }
463
- // 查找与调度中心同子网的 IP
464
- for (const ipInfo of allIps) {
465
- if (isSameSubnet(ipInfo.address, schedulerIp, ipInfo.netmask)) {
466
- logger.info(`[AutoRegister] 找到与调度中心同子网的 IP: ${ipInfo.address} (网卡: ${ipInfo.name}, 子网掩码: ${ipInfo.netmask})`);
467
- return ipInfo.address;
468
- }
469
- }
470
- logger.warn(`[AutoRegister] 未找到与调度中心 (${schedulerIp}) 同子网的本机 IP,使用 127.0.0.1`);
471
- }
472
- else {
473
- logger.warn("[AutoRegister] 无法解析调度中心 IP,使用 127.0.0.1");
474
- }
475
- return "127.0.0.1";
476
- }
477
- /**
478
- * 获取本机 IP 地址(兼容旧接口)
479
- */
480
- function getLocalIpAddress(targetServerUrl = schedulerBaseUrl) {
481
- return getPreferredIpAddress(targetServerUrl);
482
- }
483
- export function isTunnelConfig(config) {
484
- const check = config || loadConfig();
485
- if (!check.enabled || !check.userKey) {
486
- return false;
487
- }
488
- // 显式 tunnel=true → 隧道模式
489
- if (check.tunnel === true) {
490
- return true;
491
- }
492
- // 显式 tunnel=false → 直连模式(用于 loopback 等不需要隧道的场景)
493
- if (check.tunnel === false) {
494
- return false;
495
- }
496
- // 未显式设置 tunnel:保持向后兼容——无 registerAddr/registerIp/virtualIp 即为隧道模式。
497
- // 隧道模式下 bridge 位于 NAT/内网,没有可直接访问的地址,由 server 反向代理。
498
- return !check.registerAddr && !check.registerIp && !check.virtualIp;
499
- }
500
- function resolveRuntimeBridgeBaseUrl(config) {
501
- const port = process.env.AWS_RUNTIME_BRIDGE_PORT || 18081;
502
- // 隧道模式:bridge 位于 NAT/内网,通过 WebSocket 反向连出到 server,
503
- // server 经 /tunnel/<instanceId>/ 虚拟路径反向调用 bridge。
504
- // 触发条件见 isTunnelConfig():显式 tunnel=true,或未填地址且未显式 tunnel=false。
505
- // 此时 config.instanceId 必须已由 autoRegisterSingle 预声明(见 callers)。
506
- if (isTunnelConfig(config)) {
507
- const targetServerUrl = config.serverUrl || schedulerBaseUrl;
508
- try {
509
- const url = new URL(targetServerUrl);
510
- // 隧道模式下 instanceId 必须已设,否则视为配置错误,降级到 localIp
511
- if (!config.instanceId) {
512
- logger.warn("[AutoRegister] 隧道模式但缺少 instanceId,降级为直连模式");
513
- }
514
- else {
515
- return `${url.protocol}//${url.host}/tunnel/${config.instanceId}`;
516
- }
517
- }
518
- catch {
519
- logger.warn("[AutoRegister] serverUrl 解析失败,降级为直连模式");
520
- }
521
- }
522
- const localIp = config.preferSameLanIp === false
523
- ? "127.0.0.1"
524
- : getLocalIpAddress(config.serverUrl || schedulerBaseUrl);
525
- // 优先级:registerAddr(推荐) > registerIp(已废弃,仅纯 host) > virtualIp > localIp
526
- const raw = config.registerAddr || config.registerIp || config.virtualIp || localIp;
527
- if (!raw) {
528
- return `http://127.0.0.1:${port}`;
529
- }
530
- // 已带协议前缀(http:// / https://)→ 原样使用,支持反代/TLS/自定义端口场景
531
- if (/^https?:\/\//i.test(raw)) {
532
- return raw;
533
- }
534
- // 未带协议:统一补 http://;末尾无 :port 时补默认端口
535
- const hasTrailingPort = /:[0-9]+$/.test(raw);
536
- return hasTrailingPort ? `http://${raw}` : `http://${raw}:${port}`;
537
- }
538
- export function loadPrimaryLifecycleConfig() {
539
- return loadConfigs()[0] || loadConfig();
540
- }
541
- /**
542
- * 通过入站 runtime token 反查其所属调度中心地址。
543
- *
544
- * 场景:调度中心发起 /runtime/start 时,请求头 X-Runtime-Token 携带的是该 server
545
- * 签发给本 bridge 的实例 token(RuntimeBridgeService.resolveRuntimeBridgeAuthToken)。
546
- * bridge 本地 scoped token store(runtime-tokens.properties)按 serverUrl 存储这些
547
- * 实例 token,因此匹配命中即可确定来源 server,避免多 autoRegisterTargets 时回退到
548
- * DEFAULT_SCHEDULER_BASE_URL(localhost:8080)导致回调打错服务器。
549
- *
550
- * 候选来源:所有 autoRegisterTargets 的 serverUrl + binding.json 的 schedulerBaseUrl。
551
- * 仅在 launch body 未显式携带 schedulerBaseUrl 时作为兜底使用。
552
- */
553
- export function resolveSchedulerBaseUrlFromToken(token) {
554
- const candidate = String(token || "").trim();
555
- if (!candidate) {
556
- return undefined;
557
- }
558
- const urls = [];
559
- for (const config of loadConfigs()) {
560
- if (config?.serverUrl) {
561
- urls.push(config.serverUrl);
562
- }
563
- }
564
- const binding = loadRuntimeBinding();
565
- if (binding.schedulerBaseUrl) {
566
- urls.push(binding.schedulerBaseUrl);
567
- }
568
- for (const url of urls) {
569
- const scoped = getScopedRuntimeAccessToken(url);
570
- if (scoped && scoped === candidate) {
571
- return normalizeSchedulerBaseUrl(url);
572
- }
573
- }
574
- return undefined;
575
- }
576
- function resolveRegisteredSchedulerBaseUrl(instanceId) {
577
- if (!instanceId) {
578
- return undefined;
579
- }
580
- const registration = Object.entries(registrationState.registrations).find(([, registeredInstanceId]) => registeredInstanceId === instanceId);
581
- return registration?.[0];
582
- }
583
- function resolveLifecycleSchedulerBaseUrl(config, instanceId) {
584
- const registeredServerUrl = resolveRegisteredSchedulerBaseUrl(instanceId);
585
- if (registeredServerUrl) {
586
- return registeredServerUrl;
587
- }
588
- const configuredServerUrl = normalizeOptionalString(config.serverUrl);
589
- if (configuredServerUrl &&
590
- (configuredServerUrl !== schedulerBaseUrl ||
591
- Boolean(process.env.AWS_RUNTIME_SCHEDULER_BASE_URL))) {
592
- return configuredServerUrl;
593
- }
594
- const binding = loadRuntimeBinding();
595
- const pairedSchedulerBaseUrl = normalizeOptionalString(binding.schedulerBaseUrl);
596
- if (binding.status === "paired" && pairedSchedulerBaseUrl) {
597
- return pairedSchedulerBaseUrl;
598
- }
599
- return configuredServerUrl || schedulerBaseUrl;
600
- }
601
- /**
602
- * 执行注册请求
603
- */
604
- async function doRegister(config) {
605
- const instanceName = config.instanceName || os.hostname();
606
- const targetServerUrl = config.serverUrl || schedulerBaseUrl;
607
- const request = {
608
- tenantId: config.tenantId,
609
- userKey: config.userKey,
610
- instanceId: config.instanceId,
611
- instanceName,
612
- hostname: os.hostname(),
613
- virtualIp: config.registerAddr || config.registerIp || config.virtualIp,
614
- runtimeBridgeBaseUrl: resolveRuntimeBridgeBaseUrl(config),
615
- connectionKey: config.connectionKey,
616
- workspacePath: config.workspacePath,
617
- projectName: config.projectName,
618
- roleName: config.roleName,
619
- };
620
- logger.info(`[AutoRegister] 正在注册实例: ${instanceName}`);
621
- logger.info(`[AutoRegister] 调度中心: ${targetServerUrl}`);
622
- logger.info(`[AutoRegister] 用户 Key: ${config.userKey ? "****" + config.userKey.slice(-4) : "(未设置)"}`);
623
- logger.info(`[AutoRegister] 租户 ID: ${config.tenantId || "(自动推导)"}`);
624
- const response = await axios.post(`${targetServerUrl}/api/instances/register`, request, {
625
- headers: {
626
- "Content-Type": "application/json",
627
- },
628
- timeout: 10000,
629
- });
630
- return response.data;
631
- }
632
- /** 串行化 config.json 回写,避免并行注册时并发写入冲突 */
633
- let configWriteBackChain = Promise.resolve();
634
- /**
635
- * 将 server 返回的 instanceId 回写到 config.json 对应 target。
636
- * 回写策略:读 → 找到 serverUrl 匹配的 target → 更新 instanceId → 写回。
637
- * 仅在值变化时写入,避免不必要的文件 I/O。多 target 并行注册时通过 Promise 链串行化。
638
- */
639
- function writeBackInstanceInfoToConfig(targetServerUrl, instanceId) {
640
- const task = configWriteBackChain.then(() => {
641
- const configPath = getAutoRegisterConfigFilePath();
642
- if (!fs.existsSync(configPath)) {
643
- return;
644
- }
645
- const raw = fs.readFileSync(configPath, "utf-8");
646
- const config = JSON.parse(raw);
647
- const normalizedTargetUrl = normalizeSchedulerBaseUrl(targetServerUrl);
648
- if (!normalizedTargetUrl) {
649
- return;
650
- }
651
- let changed = false;
652
- const updateTarget = (target) => {
653
- const url = normalizeSchedulerBaseUrl(String(target.serverUrl || target.schedulerBaseUrl || ""));
654
- if (url !== normalizedTargetUrl) {
655
- return;
656
- }
657
- if (instanceId && target.instanceId !== instanceId) {
658
- target.instanceId = instanceId;
659
- changed = true;
660
- }
661
- };
662
- if (Array.isArray(config.autoRegisterTargets)) {
663
- for (const target of config.autoRegisterTargets) {
664
- if (target && typeof target === "object" && !Array.isArray(target)) {
665
- updateTarget(target);
666
- }
667
- }
668
- }
669
- else {
670
- updateTarget(config);
671
- }
672
- if (changed) {
673
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
674
- logger.info(`[AutoRegister] 已回写 instanceId 到 config.json (serverUrl=${targetServerUrl})`);
675
- }
676
- });
677
- configWriteBackChain = task.catch(() => { });
678
- return task;
679
- }
680
- /**
681
- * 执行注销请求
682
- */
683
- async function doUnregister(instanceId) {
684
- const targetServerUrl = resolveLifecycleSchedulerBaseUrl(loadPrimaryLifecycleConfig(), instanceId);
685
- const binding = loadRuntimeBinding();
686
- const runtimeAccessToken = getRuntimeAccessToken(targetServerUrl);
687
- if (!runtimeAccessToken) {
688
- throw new Error("runtimeAccessToken is required to unregister bridge instance");
689
- }
690
- const response = await axios.post(`${targetServerUrl}/api/instances/unregister`, { instanceId }, {
691
- headers: {
692
- "Content-Type": "application/json",
693
- "X-Runtime-Token": runtimeAccessToken,
694
- },
695
- timeout: 10000,
696
- });
697
- return response.data;
698
- }
699
- /**
700
- * 自动注册主函数
701
- *
702
- * 带重试机制的注册逻辑
703
- *
704
- * 配置来源(优先级从高到低):
705
- * 1. 传入的 customConfig
706
- * 2. 环境变量
707
- * 3. ~/.aws-bridge/config.json 配置文件
708
- * 4. 默认值
709
- */
710
- export async function autoRegister(customConfig) {
711
- const configs = customConfig
712
- ? [{ ...loadConfig(), ...customConfig }]
713
- : loadConfigs();
714
- if (configs.length > 1) {
715
- const results = await Promise.all(configs.map((config) => autoRegisterSingle(config)));
716
- return results.every(Boolean);
717
- }
718
- return autoRegisterSingle(configs[0] || loadConfig());
719
- }
720
- async function autoRegisterSingle(config, options) {
721
- // 检查是否启用
722
- if (!config.enabled) {
723
- logger.info("[AutoRegister] 自动注册未启用");
724
- logger.info("[AutoRegister] 要启用自动注册,请创建配置文件 ~/.aws-bridge/config.json 或设置环境变量 AWS_AUTO_REGISTER=true");
725
- return false;
726
- }
727
- // 验证必填字段(userKey 为必填,tenantId 现在可选)
728
- if (!config.userKey) {
729
- logger.error("[AutoRegister] 缺少用户 Key(在配置文件中设置 userKey 或设置环境变量 AWS_USER_KEY)");
730
- return false;
731
- }
732
- // ★ 隧道模式:在注册前预声明 instanceId,确保 URL 与注册 request 中的 instanceId 一致
733
- const isTunnel = isTunnelConfig(config);
734
- if (isTunnel && !config.instanceId) {
735
- // 用 uuid 前 12 位确保唯一可读
736
- config = { ...config, instanceId: `bridge-${uuidv4().replace(/-/g, "").slice(0, 12)}` };
737
- logger.info(`[AutoRegister] 隧道模式:已预声明 instanceId=${config.instanceId}`);
738
- }
739
- // tenantId 现在是可选的,如果没有提供,后端会根据 userKey 自动推导
740
- // 后台重试每轮只尝试 1 次,避免每个间隔内刷出一串重试日志
741
- const maxRetries = options?.backgroundRetry ? 1 : (config.maxRetries ?? 3);
742
- const retryInterval = config.retryInterval ?? 2000;
743
- // 重试循环
744
- for (let attempt = 1; attempt <= maxRetries; attempt++) {
745
- try {
746
- registrationState.lastAttempt = new Date();
747
- const response = await doRegister(config);
748
- if (response.success) {
749
- registrationState.registered = true;
750
- registrationState.instanceId = response.instanceId;
751
- if (response.instanceId) {
752
- registrationState.registrations[config.serverUrl || schedulerBaseUrl] =
753
- response.instanceId;
754
- }
755
- registrationState.error = undefined;
756
- logger.info(`[AutoRegister] ✓ 注册成功!`);
757
- logger.info(`[AutoRegister] 实例 ID: ${response.instanceId}`);
758
- logger.info(`[AutoRegister] 消息: ${response.message}`);
759
- logger.info(`[AutoRegister] 更新: ${response.isUpdate ? "是" : "否"}`);
760
- if (response.runtimeAccessToken) {
761
- try {
762
- saveRuntimeBinding({
763
- accessToken: response.runtimeAccessToken,
764
- instanceId: response.instanceId,
765
- userId: response.userId,
766
- schedulerBaseUrl: response.serverUrl || config.serverUrl || schedulerBaseUrl,
767
- });
768
- logger.info("[AutoRegister] 已保存调度中心下发的 runtime access token");
769
- // 回写 instanceId 到 config.json,供后续 instanceId 匹配使用
770
- if (response.instanceId) {
771
- writeBackInstanceInfoToConfig(config.serverUrl || schedulerBaseUrl, response.instanceId).catch((error) => {
772
- logger.warn(`[AutoRegister] 回写 instanceId 到 config.json 失败: ${error.message}`);
773
- });
774
- }
775
- }
776
- catch (error) {
777
- const err = error;
778
- logger.error(`[AutoRegister] 保存 runtime access token 失败: ${err.message}`);
779
- registrationState.error = err.message;
780
- return false;
781
- }
782
- }
783
- else {
784
- logger.warn("[AutoRegister] 注册响应未包含 runtime access token,MCP 将无法访问调度中心,请检查 server 的 bridge 实例 token 颁发逻辑");
785
- }
786
- // ★ 隧道模式:注册成功且拿到 runtimeAccessToken 后,使用 server 返回的真实 instanceId 启动隧道客户端。
787
- // 没有 runtimeAccessToken 时隧道鉴权必然失败,跳过启动以免反复重连刷日志。
788
- // 多 target 场景:传入本次注册的 serverUrl,隧道客户端按 server 维度多实例并存。
789
- if (isTunnel && response.instanceId && response.runtimeAccessToken) {
790
- const { startTunnelClient } = await import("./tunnel-client.js");
791
- const tunnelServerUrl = config.serverUrl || schedulerBaseUrl;
792
- startTunnelClient(tunnelServerUrl, response.instanceId);
793
- logger.info(`[AutoRegister] 隧道客户端已启动: server=${tunnelServerUrl}, instanceId=${response.instanceId}`);
794
- }
795
- return true;
796
- }
797
- else {
798
- logger.warn(`[AutoRegister] 注册失败: ${response.message}`);
799
- registrationState.error = response.message;
800
- }
801
- }
802
- catch (error) {
803
- const err = error;
804
- const message = err.response?.data
805
- ? JSON.stringify(err.response.data)
806
- : err.message;
807
- logger.error(`[AutoRegister] 注册请求失败 (尝试 ${attempt}/${maxRetries}): ${message}`);
808
- registrationState.error = message;
809
- }
810
- // 如果不是最后一次尝试,等待后重试
811
- if (attempt < maxRetries) {
812
- logger.info(`[AutoRegister] ${retryInterval / 1000} 秒后重试...`);
813
- await new Promise((resolve) => setTimeout(resolve, retryInterval));
814
- }
815
- }
816
- if (options?.backgroundRetry) {
817
- // 后台重试轮:单行日志,避免每个间隔刷一大段错误块
818
- logger.warn(`[AutoRegister] 后台重试注册仍未成功 (server=${config.serverUrl || schedulerBaseUrl}): ${registrationState.error || "未知"}`);
819
- }
820
- else {
821
- logger.error(`[AutoRegister] ✗ 注册失败,已达最大重试次数`);
822
- logger.error(`[AutoRegister] ========================================`);
823
- logger.error(`[AutoRegister] 自动注册已启用但注册失败,实例暂时无法正常工作`);
824
- logger.error(`[AutoRegister] 请检查以下配置:`);
825
- logger.error(`[AutoRegister] - 用户 Key (userKey): ${config.userKey ? "****" + config.userKey.slice(-4) : "(未设置)"}`);
826
- logger.error(`[AutoRegister] - 租户 ID (tenantId): ${config.tenantId || "(可选,将自动推导)"}`);
827
- logger.error(`[AutoRegister] - 实例名 (instanceName): ${config.instanceName || "(使用主机名)"}`);
828
- logger.error(`[AutoRegister] - 调度中心地址: ${config.serverUrl || schedulerBaseUrl}`);
829
- logger.error(`[AutoRegister] - 最后错误: ${registrationState.error || "未知"}`);
830
- logger.error(`[AutoRegister] ========================================`);
831
- logger.error(`[AutoRegister] 配置来源:~/.aws-bridge/config.json 或环境变量`);
832
- logger.warn(`[AutoRegister] 将在后台持续重试注册(每 ${Math.round(getBackgroundRetryIntervalMs() / 1000)} 秒),直到与调度中心建立连接`);
833
- }
834
- // 未与 server 建立连接前持续后台重试;成功/配置失效(禁用、缺 userKey)时自动停止
835
- scheduleBackgroundRegisterRetry(config);
836
- return false;
837
- }
838
- /**
839
- * 注销实例
840
- */
841
- export async function requestRuntimeAccessTokenRefresh() {
842
- const config = loadPrimaryLifecycleConfig();
843
- if (!config.userKey) {
844
- return {
845
- success: false,
846
- error: "userKey is required for runtime token refresh",
847
- };
848
- }
849
- const state = getRuntimeBindingPublicState();
850
- const targetServerUrl = resolveLifecycleSchedulerBaseUrl(config);
851
- const runtimeBridgeBaseUrl = resolveRuntimeBridgeBaseUrl(config);
852
- try {
853
- const response = await axios.post(`${targetServerUrl}/api/instances/runtime-tokens/refresh`, {
854
- tenantId: config.tenantId,
855
- userKey: config.userKey,
856
- instanceId: state.instanceId,
857
- instanceName: config.instanceName,
858
- runtimeBridgeBaseUrl,
859
- }, {
860
- headers: {
861
- "Content-Type": "application/json",
862
- },
863
- timeout: 10000,
864
- });
865
- if (!response.data.success || !response.data.runtimeAccessToken) {
866
- return {
867
- success: false,
868
- error: response.data.message ||
869
- "scheduler did not return runtimeAccessToken",
870
- };
871
- }
872
- const previousToken = getRuntimeAccessToken();
873
- const updated = previousToken !== response.data.runtimeAccessToken;
874
- saveRuntimeBinding({
875
- accessToken: response.data.runtimeAccessToken,
876
- instanceId: state.instanceId,
877
- userId: response.data.userId || config.userKey,
878
- schedulerBaseUrl: targetServerUrl,
879
- });
880
- return {
881
- success: true,
882
- runtimeAccessToken: response.data.runtimeAccessToken,
883
- updated,
884
- };
885
- }
886
- catch (error) {
887
- const err = error;
888
- const message = err.response?.data
889
- ? JSON.stringify(err.response.data)
890
- : err.message;
891
- return { success: false, error: message };
892
- }
893
- }
894
- export async function requestRuntimeAccessTokenRefreshForServer(serverBaseUrl) {
895
- const targetServerUrl = normalizeSchedulerHttpBaseUrl(serverBaseUrl);
896
- if (!targetServerUrl) {
897
- return { success: false, error: "serverUrl is required for runtime token refresh" };
898
- }
899
- const config = loadConfigs().find((item) => normalizeSchedulerHttpBaseUrl(item.serverUrl) === targetServerUrl) || loadPrimaryLifecycleConfig();
900
- if (!config.userKey) {
901
- return {
902
- success: false,
903
- error: "userKey is required for runtime token refresh",
904
- };
905
- }
906
- const state = getRuntimeBindingPublicState();
907
- const runtimeBridgeBaseUrl = resolveRuntimeBridgeBaseUrl(config);
908
- try {
909
- const response = await axios.post(`${targetServerUrl}/api/instances/runtime-tokens/refresh`, {
910
- tenantId: config.tenantId,
911
- userKey: config.userKey,
912
- instanceId: state.instanceId,
913
- instanceName: config.instanceName,
914
- runtimeBridgeBaseUrl,
915
- }, {
916
- headers: {
917
- "Content-Type": "application/json",
918
- },
919
- timeout: 10000,
920
- });
921
- if (!response.data.success || !response.data.runtimeAccessToken) {
922
- return {
923
- success: false,
924
- error: response.data.message ||
925
- "scheduler did not return runtimeAccessToken",
926
- };
927
- }
928
- const previousToken = getRuntimeAccessToken(targetServerUrl);
929
- const updated = previousToken !== response.data.runtimeAccessToken;
930
- saveScopedRuntimeAccessToken({
931
- serverBaseUrl: targetServerUrl,
932
- accessToken: response.data.runtimeAccessToken,
933
- });
934
- return {
935
- success: true,
936
- runtimeAccessToken: response.data.runtimeAccessToken,
937
- updated,
938
- };
939
- }
940
- catch (error) {
941
- const err = error;
942
- const message = err.response?.data
943
- ? JSON.stringify(err.response.data)
944
- : err.message;
945
- return { success: false, error: message };
946
- }
947
- }
948
- export async function unregister() {
949
- if (!registrationState.registered || !registrationState.instanceId) {
950
- logger.info("[AutoRegister] 实例未注册,无需注销");
951
- return true;
952
- }
953
- try {
954
- const response = await doUnregister(registrationState.instanceId);
955
- if (response.success) {
956
- logger.info(`[AutoRegister] ✓ 注销成功: ${registrationState.instanceId}`);
957
- const targetServerUrl = resolveLifecycleSchedulerBaseUrl(loadPrimaryLifecycleConfig(), registrationState.instanceId);
958
- const binding = loadRuntimeBinding();
959
- if (binding.schedulerBaseUrl) {
960
- clearScopedRuntimeAccessToken(targetServerUrl);
961
- }
962
- clearRuntimeBinding();
963
- registrationState.registered = false;
964
- registrationState.instanceId = undefined;
965
- return true;
966
- }
967
- else {
968
- logger.warn(`[AutoRegister] 注销失败: ${response.message}`);
969
- return false;
970
- }
971
- }
972
- catch (error) {
973
- const err = error;
974
- logger.error(`[AutoRegister] 注销请求失败: ${err.message}`);
975
- return false;
976
- }
977
- }
978
- /**
979
- * 获取注册状态
980
- */
981
- export function getRegistrationState() {
982
- return { ...registrationState };
983
- }
984
- /**
985
- * 检查是否已注册
986
- */
987
- export function isRegistered() {
988
- return registrationState.registered;
989
- }
990
- /**
991
- * 获取实例 ID
992
- */
993
- export function getInstanceId() {
994
- return registrationState.instanceId;
995
- }
996
- /**
997
- * ★★★ Bridge 重启清理
998
- *
999
- * 当 aws-runtime-bridge 重启时调用,通知调度中心将该 bridge 关联的所有 Agent 设置为离线。
1000
- *
1001
- * 清理逻辑:
1002
- * 1. 调用调度中心的 /api/instances/bridge-restart-cleanup 接口
1003
- * 2. 传入 instanceId 或 runtimeBridgeBaseUrl
1004
- * 3. 调度中心会将关联的 Agent 设置为 is_online=false, runtime_status='stopped'
1005
- *
1006
- * @returns 清理结果
1007
- */
1008
- export async function bridgeRestartCleanup() {
1009
- const config = loadPrimaryLifecycleConfig();
1010
- const instanceId = registrationState.instanceId;
1011
- const targetServerUrl = resolveLifecycleSchedulerBaseUrl(config, instanceId);
1012
- // 构建清理请求
1013
- const requestBody = {};
1014
- if (instanceId) {
1015
- requestBody.instanceId = instanceId;
1016
- }
1017
- // 如果有配置,也传入 runtimeBridgeBaseUrl
1018
- if (config.enabled) {
1019
- requestBody.runtimeBridgeBaseUrl = resolveRuntimeBridgeBaseUrl(config);
1020
- }
1021
- if (!requestBody.instanceId && !requestBody.runtimeBridgeBaseUrl) {
1022
- logger.info("[AutoRegister] Bridge 重启清理:没有 instanceId 或 runtimeBridgeBaseUrl,跳过清理");
1023
- return { success: true, agentCount: 0 };
1024
- }
1025
- try {
1026
- logger.info(`[AutoRegister] Bridge 重启清理:正在通知调度中心...`);
1027
- logger.info(`[AutoRegister] instanceId: ${requestBody.instanceId || "(无)"}`);
1028
- logger.info(`[AutoRegister] runtimeBridgeBaseUrl: ${requestBody.runtimeBridgeBaseUrl || "(无)"}`);
1029
- const response = await axios.post(`${targetServerUrl}/api/instances/bridge-restart-cleanup`, requestBody, {
1030
- headers: {
1031
- "Content-Type": "application/json",
1032
- },
1033
- timeout: 10000,
1034
- });
1035
- if (response.data.success) {
1036
- logger.info(`[AutoRegister] ✓ Bridge 重启清理成功:${response.data.message}`);
1037
- logger.info(`[AutoRegister] 清理了 ${response.data.agentCount || 0} 个 Agent`);
1038
- return { success: true, agentCount: response.data.agentCount || 0 };
1039
- }
1040
- else {
1041
- logger.warn(`[AutoRegister] Bridge 重启清理失败:${response.data.message}`);
1042
- return { success: false, error: response.data.message };
1043
- }
1044
- }
1045
- catch (error) {
1046
- const err = error;
1047
- const message = err.response?.data
1048
- ? JSON.stringify(err.response.data)
1049
- : err.message;
1050
- logger.warn(`[AutoRegister] Bridge 重启清理请求失败:${message}`);
1051
- return { success: false, error: message };
1052
- }
1053
- }
1
+ import{v4 as F}from"uuid";import R from"axios";import m from"node:os";import M from"node:path";import g from"node:fs";import{logger as i}from"../utils/logger.js";import{schedulerBaseUrl as u}from"../config.js";import{clearRuntimeBinding as z,clearScopedRuntimeAccessToken as J,getRuntimeAccessToken as E,getRuntimeBindingPublicState as w,getScopedRuntimeAccessToken as Y,loadRuntimeBinding as v,normalizeSchedulerBaseUrl as A,saveRuntimeBinding as K,saveScopedRuntimeAccessToken as q}from"./runtime-binding.js";const C={enabled:!1,serverUrl:u,preferSameLanIp:!0,maxRetries:3,retryInterval:2e3};let c={registered:!1,registrations:{}},b=[];function Re(){return[...b]}const H=3e4;function P(){const e=Number(process.env.AWS_REGISTER_BACKGROUND_RETRY_INTERVAL);return Number.isFinite(e)&&e>0?e:H}const I=new Map;function W(e){const r=e.serverUrl||u,t=A(r)||r;if(I.has(t))return;const n=setTimeout(()=>{I.delete(t),V(e,t)},P());n.unref?.(),I.set(t,n)}async function V(e,r){try{const t=S().find(n=>(A(n.serverUrl||u)||n.serverUrl||u)===r)||e;await $(t,{backgroundRetry:!0})}catch(t){i.warn(`[AutoRegister] \u540E\u53F0\u91CD\u8BD5\u6CE8\u518C\u5F02\u5E38: ${t.message}`),W(e)}}function Ie(){for(const e of I.values())clearTimeout(e);I.clear()}function d(e){return e==null?void 0:String(e).trim()||void 0}function L(e){return A(e)}function T(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 N(e){const r=d(e.serverUrl)||d(e.schedulerBaseUrl),t=d(e.connectionKey)||d(e.password);return{enabled:T(e.enabled),serverUrl:r,tenantId:d(e.tenantId),userKey:d(e.userKey),connectionKey:t,instanceName:d(e.instanceName),instanceId:d(e.instanceId),projectName:d(e.projectName),roleName:d(e.roleName),workspacePath:d(e.workspacePath),registerAddr:d(e.registerAddr),registerIp:d(e.registerIp),virtualIp:d(e.virtualIp),tunnel:T(e.tunnel),preferSameLanIp:T(e.preferSameLanIp),maxRetries:O(e.maxRetries),retryInterval:O(e.retryInterval)}}function k(){const e=m.homedir();return M.join(e,".aws-bridge","config.json")}function x(){const e=k();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}`),N(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=k();try{if(!g.existsSync(e))return[];const r=g.readFileSync(e,"utf-8"),t=JSON.parse(r),n=N(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=N(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 j(){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.projectName=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=T(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 _(){const e=x(),r=j(),t={...C,...e||{},...r},n=t.instanceName||m.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||u,tenantId:t.tenantId||"",userKey:t.userKey||"",connectionKey:t.connectionKey,instanceName:n,instanceId:t.instanceId,projectName:t.projectName,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=j(),n=(e.length>0?e:[x()||{}]).map(o=>{const s={...C,...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||u,tenantId:s.tenantId||"",userKey:s.userKey||"",connectionKey:s.connectionKey,instanceName:s.instanceName||m.hostname(),instanceId:s.instanceId,projectName:s.projectName,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=m.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 B(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=B(e),o=B(r),s=B(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=u){return te(e)}function D(e){const r=e||_();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=process.env.AWS_RUNTIME_BRIDGE_PORT||18081;if(D(e)){const s=e.serverUrl||u;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||u),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]||_()}function Se(e){const r=String(e||"").trim();if(!r)return;const t=[];for(const o of S())o?.serverUrl&&t.push(o.serverUrl);const n=v();n.schedulerBaseUrl&&t.push(n.schedulerBaseUrl);for(const o of t){const s=Y(o);if(s&&s===r)return A(o)}}function se(e){return e?Object.entries(c.registrations).find(([,t])=>t===e)?.[0]:void 0}function h(e,r){const t=se(r);if(t)return t;const n=d(e.serverUrl);if(n&&(n!==u||process.env.AWS_RUNTIME_SCHEDULER_BASE_URL))return n;const o=v(),s=d(o.schedulerBaseUrl);return o.status==="paired"&&s?s:n||u}async function oe(e){const r=e.instanceName||m.hostname(),t=e.serverUrl||u,n={tenantId:e.tenantId,userKey:e.userKey,instanceId:e.instanceId,instanceName:r,hostname:m.hostname(),virtualIp:e.registerAddr||e.registerIp||e.virtualIp,runtimeBridgeBaseUrl:U(e),connectionKey:e.connectionKey,workspacePath:e.workspacePath,projectName:e.projectName,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 R.post(`${t}/api/instances/register`,n,{headers:{"Content-Type":"application/json"},timeout:1e4})).data}let G=Promise.resolve();function ie(e,r){const t=G.then(()=>{const n=k();if(!g.existsSync(n))return;const o=g.readFileSync(n,"utf-8"),s=JSON.parse(o),a=A(e);if(!a)return;let l=!1;const f=p=>{A(String(p.serverUrl||p.schedulerBaseUrl||""))===a&&r&&p.instanceId!==r&&(p.instanceId=r,l=!0)};if(Array.isArray(s.autoRegisterTargets))for(const p of s.autoRegisterTargets)p&&typeof p=="object"&&!Array.isArray(p)&&f(p);else f(s);l&&(g.writeFileSync(n,JSON.stringify(s,null,2),"utf-8"),i.info(`[AutoRegister] \u5DF2\u56DE\u5199 instanceId \u5230 config.json (serverUrl=${e})`))});return G=t.catch(()=>{}),t}async function ae(e){const r=h(y(),e),t=v(),n=E(r);if(!n)throw new Error("runtimeAccessToken is required to unregister bridge instance");return(await R.post(`${r}/api/instances/unregister`,{instanceId:e},{headers:{"Content-Type":"application/json","X-Runtime-Token":n},timeout:1e4})).data}async function ye(e){const r=e?[{..._(),...e}]:S();return r.length>1?(await Promise.all(r.map(n=>$(n)))).every(Boolean):$(r[0]||_())}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 ~/.aws-bridge/config.json \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-${F().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{c.lastAttempt=new Date;const a=await oe(e);if(a.success){if(c.registered=!0,c.instanceId=a.instanceId,a.instanceId&&(c.registrations[e.serverUrl||u]=a.instanceId),c.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{K({accessToken:a.runtimeAccessToken,instanceId:a.instanceId,userId:a.userId,schedulerBaseUrl:a.serverUrl||e.serverUrl||u}),i.info("[AutoRegister] \u5DF2\u4FDD\u5B58\u8C03\u5EA6\u4E2D\u5FC3\u4E0B\u53D1\u7684 runtime access token"),a.instanceId&&ie(e.serverUrl||u,a.instanceId).catch(l=>{i.warn(`[AutoRegister] \u56DE\u5199 instanceId \u5230 config.json \u5931\u8D25: ${l.message}`)})}catch(l){const f=l;return i.error(`[AutoRegister] \u4FDD\u5B58 runtime access token \u5931\u8D25: ${f.message}`),c.error=f.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"),f=e.serverUrl||u;l(f,a.instanceId),i.info(`[AutoRegister] \u96A7\u9053\u5BA2\u6237\u7AEF\u5DF2\u542F\u52A8: server=${f}, instanceId=${a.instanceId}`)}return!0}else i.warn(`[AutoRegister] \u6CE8\u518C\u5931\u8D25: ${a.message}`),c.error=a.message}catch(a){const l=a,f=l.response?.data?JSON.stringify(l.response.data):l.message;i.error(`[AutoRegister] \u6CE8\u518C\u8BF7\u6C42\u5931\u8D25 (\u5C1D\u8BD5 ${s}/${n}): ${f}`),c.error=f}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||u}): ${c.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||u}`),i.error(`[AutoRegister] - \u6700\u540E\u9519\u8BEF: ${c.error||"\u672A\u77E5"}`),i.error("[AutoRegister] ========================================"),i.error("[AutoRegister] \u914D\u7F6E\u6765\u6E90\uFF1A~/.aws-bridge/config.json \u6216\u73AF\u5883\u53D8\u91CF"),i.warn(`[AutoRegister] \u5C06\u5728\u540E\u53F0\u6301\u7EED\u91CD\u8BD5\u6CE8\u518C\uFF08\u6BCF ${Math.round(P()/1e3)} \u79D2\uFF09\uFF0C\u76F4\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u5EFA\u7ACB\u8FDE\u63A5`)),W(e),!1}async function ve(){const e=y();if(!e.userKey)return{success:!1,error:"userKey is required for runtime token refresh"};const r=w(),t=h(e),n=U(e);try{const o=await R.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 Te(e){const r=L(e);if(!r)return{success:!1,error:"serverUrl is required for runtime token refresh"};const t=S().find(s=>L(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 R.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 q({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 _e(){if(!c.registered||!c.instanceId)return i.info("[AutoRegister] \u5B9E\u4F8B\u672A\u6CE8\u518C\uFF0C\u65E0\u9700\u6CE8\u9500"),!0;try{const e=await ae(c.instanceId);if(e.success){i.info(`[AutoRegister] \u2713 \u6CE8\u9500\u6210\u529F: ${c.instanceId}`);const r=h(y(),c.instanceId);return v().schedulerBaseUrl&&J(r),z(),c.registered=!1,c.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{...c}}function he(){return c.registered}function Ee(){return c.instanceId}async function Ne(){const e=y(),r=c.instanceId,t=h(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 R.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{ye as autoRegister,Ne as bridgeRestartCleanup,Ie as cancelBackgroundRegisterRetries,k as getAutoRegisterConfigFilePath,Re as getConfiguredConnectionKeys,Ee as getInstanceId,Ue as getRegistrationState,he as isRegistered,D as isTunnelConfig,_ as loadConfig,S as loadConfigs,y as loadPrimaryLifecycleConfig,ve as requestRuntimeAccessTokenRefresh,Te as requestRuntimeAccessTokenRefreshForServer,Se as resolveSchedulerBaseUrlFromToken,_e as unregister};
2
+