aws-runtime-bridge 1.9.79 → 1.9.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +5 -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,464 +1,4 @@
1
- /**
2
- * 仪表盘路由
3
- *
4
- * 提供 Bridge 状态看板的静态页面和数据聚合 API
5
- * 支持中/英文界面,默认中文
6
- */
7
- import { Router } from "express";
8
- import os from "node:os";
9
- import { execSync } from "node:child_process";
10
- import { getRuntimeBindingPublicState, getRuntimePairingCode } from "../services/runtime-binding.js";
11
- import { getAgentProcessManager } from "../services/agent-process-manager.js";
12
- import { collectSystemMetrics } from "../services/system-metrics.js";
13
- import { loadPersistedSessions } from "../services/terminal-persistence.js";
14
- import { createLogger } from "../utils/logger.js";
15
- import { getBridgeVersion } from "../config.js";
16
- import { sdkSessions } from "./terminal.js";
17
- import { createSession, getPanelCredentials, validateSession, destroySession, validateCredentials, hasConfiguredCredentials, isDefaultCredentials, setPanelCredentials, getAllSessions, getActiveSessionCount, } from "../services/panel-auth.js";
18
- import { getRecentLogs } from "../utils/logger.js";
19
- import { autoRegister, getRegistrationState, getAutoRegisterConfigFilePath } from "../services/auto-register.js";
20
- const log = createLogger("dashboard");
21
- // ── 内存缓存(两级) ─────────────────────────────────────
22
- // 一级:完整响应缓存,匹配前端轮询间隔(10s),避免大部分请求走 I/O
23
- let dashboardCache = null;
24
- const CACHE_TTL = 10000; // 10 秒,匹配前端 refresh 间隔
25
- // 二级:慢指标缓存(系统指标/进程扫描),需要 PowerShell WMI 调用(Windows 下尤其昂贵)
26
- // 请求处理流程绝不等待慢操作——始终从缓存读取,后台定时+首次请求时双触发刷新
27
- let metricsCache = null;
28
- let processCache = null;
29
- const SLOW_CACHE_TTL = 30000; // 30 秒
30
- // ── 后台缓存预热 ─────────────────────────────────────────
31
- // 启动时立即 + 每 30 秒后台刷新,确保慢指标永不阻塞请求
32
- async function warmSlideCaches() {
33
- collectSystemMetrics()
34
- .then((data) => { metricsCache = { data, ts: Date.now() }; })
35
- .catch(() => { });
36
- getAgentProcessManager().discoverAllProcesses()
37
- .then((data) => { processCache = { data, ts: Date.now() }; })
38
- .catch(() => { });
39
- // ★ 清理注册表中的陈旧记录(已终止且进程不再存活的条目)
40
- getAgentProcessManager().cleanupStaleRegistry().catch(() => { });
41
- }
42
- // 立即执行首次预热
43
- warmSlideCaches();
44
- // 每 30 秒定期刷新
45
- setInterval(warmSlideCaches, SLOW_CACHE_TTL);
46
- const bridgeVersion = getBridgeVersion();
47
- /**
48
- * 从 lifecycle-state.json 中读取最新的一条生命周期操作记录。
49
- * 用于给 dashboard 展示 update/restart 状态。
50
- */
51
- async function loadLatestLifecycleOperation() {
52
- const fs = await import("node:fs/promises");
53
- const path = await import("node:path");
54
- const os = await import("node:os");
55
- const lifecycleFile = path.join(String(process.env.AWS_RUNTIME_HOME_DIR || os.homedir()).trim() || os.homedir(), ".aws-bridge", "lifecycle-state.json");
56
- try {
57
- const raw = await fs.readFile(lifecycleFile, "utf8");
58
- const parsed = JSON.parse(raw);
59
- const ops = Array.isArray(parsed.operations) ? parsed.operations : [];
60
- if (ops.length === 0)
61
- return null;
62
- // 按 updatedAt 降序取最新
63
- ops.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
64
- return ops[0] || null;
65
- }
66
- catch {
67
- return null;
68
- }
69
- }
70
- export const dashboardRouter = Router();
71
- // ── Cookie 解析 ────────────────────────────────────────────
72
- const COOKIE_NAME = "panel_sid";
73
- function parseCookies(cookieHeader) {
74
- const result = {};
75
- if (!cookieHeader)
76
- return result;
77
- for (const part of cookieHeader.split(";")) {
78
- const idx = part.indexOf("=");
79
- if (idx === -1)
80
- continue;
81
- const key = part.slice(0, idx).trim();
82
- const val = part.slice(idx + 1).trim();
83
- if (key)
84
- result[key] = val;
85
- }
86
- return result;
87
- }
88
- function getSessionToken(req) {
89
- const cookies = parseCookies(req.headers.cookie);
90
- return cookies[COOKIE_NAME];
91
- }
92
- /**
93
- * 面板认证中间件
94
- * 检查请求是否携带有效的面板会话 cookie,无效时直接返回 401 JSON(API 请求)或重定向到登录页。
95
- */
96
- function requirePanelAuth(req, res) {
97
- const token = getSessionToken(req);
98
- if (token && validateSession(token)) {
99
- return true;
100
- }
101
- // AJAX / API 请求:返回 JSON 401
102
- const acceptsJson = req.xhr || req.headers.accept?.includes("application/json");
103
- if (acceptsJson) {
104
- res.status(401).json({ ok: false, error: "unauthorized", needLogin: true });
105
- return false;
106
- }
107
- // 页面请求:重定向到登录页
108
- res.redirect("/login");
109
- return false;
110
- }
111
- // ── 登录/登出路由 ──────────────────────────────────────────
112
- /** POST /runtime/login 登录验证 */
113
- dashboardRouter.post("/runtime/login", (req, res) => {
114
- const { username, password } = req.body || {};
115
- if (!username || !password) {
116
- res.status(400).json({ ok: false, error: "username and password required" });
117
- return;
118
- }
119
- if (!validateCredentials(String(username), String(password))) {
120
- res.status(401).json({ ok: false, error: "invalid credentials" });
121
- return;
122
- }
123
- const token = createSession();
124
- const needSetup = !hasConfiguredCredentials();
125
- // 设置 HttpOnly cookie,24 小时过期
126
- res.setHeader("Set-Cookie", `${COOKIE_NAME}=${token}; HttpOnly; SameSite=Lax; Path=/; Max-Age=86400`);
127
- res.json({ ok: true, needSetup });
128
- });
129
- /** POST /runtime/logout 登出 */
130
- dashboardRouter.post("/runtime/logout", (req, res) => {
131
- const token = getSessionToken(req);
132
- if (token) {
133
- destroySession(token);
134
- }
135
- res.setHeader("Set-Cookie", `${COOKIE_NAME}=; HttpOnly; SameSite=Lax; Path=/; Max-Age=0`);
136
- res.json({ ok: true });
137
- });
138
- /**
139
- * GET /runtime/credentials-status
140
- * 返回当前凭据是否仍是默认值 root/root。
141
- * 需要面板登录会话。
142
- */
143
- dashboardRouter.get("/runtime/credentials-status", (req, res) => {
144
- if (!requirePanelAuth(req, res))
145
- return;
146
- const creds = getPanelCredentials();
147
- res.json({ ok: true, isDefault: isDefaultCredentials(), configured: hasConfiguredCredentials(), username: creds.username });
148
- });
149
- /**
150
- * POST /runtime/change-credentials
151
- * 修改面板登录凭据,写入 ~/.aws-bridge/config.json。
152
- * 需要面板登录会话。修改密码需校验原密码;用户名可同时修改。
153
- */
154
- dashboardRouter.post("/runtime/change-credentials", (req, res) => {
155
- if (!requirePanelAuth(req, res))
156
- return;
157
- const { username, password, passwordConfirm, oldPassword } = req.body || {};
158
- // 校验原密码(仅凭据已配置且新密码不为空时要求)
159
- if (password && String(password).trim()) {
160
- // 密码一致性校验
161
- if (String(password) !== String(passwordConfirm)) {
162
- res.status(400).json({ ok: false, error: "passwords do not match" });
163
- return;
164
- }
165
- if (hasConfiguredCredentials()) {
166
- if (!oldPassword) {
167
- res.status(400).json({ ok: false, error: "old password required" });
168
- return;
169
- }
170
- const current = getPanelCredentials();
171
- if (String(oldPassword) !== current.password) {
172
- res.status(403).json({ ok: false, error: "old password is incorrect" });
173
- return;
174
- }
175
- }
176
- // 首次设置时不校验原密码
177
- }
178
- // 至少需要用户名或密码的变更
179
- if (!username || !String(username).trim()) {
180
- res.status(400).json({ ok: false, error: "username required" });
181
- return;
182
- }
183
- const finalPassword = (password && String(password).trim()) ? String(password).trim() : getPanelCredentials().password;
184
- setPanelCredentials(String(username).trim(), finalPassword);
185
- res.json({ ok: true });
186
- });
187
- /**
188
- * GET /runtime/node-info
189
- * 返回节点详细信息,供设置面板展示。
190
- * 需要面板登录会话。
191
- */
192
- dashboardRouter.get("/runtime/node-info", (req, res) => {
193
- if (!requirePanelAuth(req, res))
194
- return;
195
- const binding = getRuntimeBindingPublicState();
196
- const reg = getRegistrationState();
197
- res.json({
198
- ok: true,
199
- hostname: os.hostname(),
200
- platform: os.platform(),
201
- arch: os.arch(),
202
- uptime: Math.floor(process.uptime()),
203
- nodeVersion: process.version,
204
- bridgeVersion,
205
- configPath: getAutoRegisterConfigFilePath(),
206
- homeDir: process.env.AWS_RUNTIME_HOME_DIR || os.homedir(),
207
- bindingStatus: binding.status,
208
- paired: binding.paired,
209
- instanceId: binding.instanceId || reg.instanceId,
210
- schedulerBaseUrl: binding.schedulerBaseUrl,
211
- registered: reg.registered,
212
- pairingCode: binding.pairingCode,
213
- activeSessions: getActiveSessionCount(),
214
- });
215
- });
216
- /**
217
- * GET /runtime/logs
218
- * 返回最近的 bridge 日志。
219
- * 需要面板登录会话。
220
- */
221
- dashboardRouter.get("/runtime/logs", (req, res) => {
222
- if (!requirePanelAuth(req, res))
223
- return;
224
- const level = req.query.level || undefined;
225
- const maxCount = Math.min(Number(req.query.count) || 200, 500);
226
- const validLevels = ['debug', 'info', 'warn', 'error'];
227
- const filterLevel = level && validLevels.includes(level)
228
- ? level
229
- : undefined;
230
- const logs = getRecentLogs(maxCount, filterLevel);
231
- res.json({ ok: true, logs });
232
- });
233
- /**
234
- * POST /runtime/re-register
235
- * 向调度中心重新发起注册。
236
- * 需要面板登录会话。
237
- */
238
- dashboardRouter.post("/runtime/re-register", async (req, res) => {
239
- if (!requirePanelAuth(req, res))
240
- return;
241
- try {
242
- const success = await autoRegister();
243
- res.json({ ok: success });
244
- }
245
- catch (err) {
246
- const e = err;
247
- res.status(500).json({ ok: false, error: e.message });
248
- }
249
- });
250
- /**
251
- * GET /runtime/admin/sessions
252
- * 列出当前所有活跃的面板登录会话。
253
- * 需要面板登录会话。
254
- */
255
- dashboardRouter.get("/runtime/admin/sessions", (req, res) => {
256
- if (!requirePanelAuth(req, res))
257
- return;
258
- const list = getAllSessions().map(s => ({
259
- token: s.token.slice(0, 8) + "...",
260
- createdAt: new Date(s.createdAt).toISOString(),
261
- lastUsedAt: new Date(s.lastUsedAt).toISOString(),
262
- age: Math.floor((Date.now() - s.createdAt) / 1000),
263
- }));
264
- res.json({ ok: true, sessions: list });
265
- });
266
- /**
267
- * POST /runtime/admin/sessions/:token/destroy
268
- * 强制销毁指定的面板会话。
269
- * 需要面板登录会话。
270
- */
271
- dashboardRouter.post("/runtime/admin/sessions/:token/destroy", (req, res) => {
272
- if (!requirePanelAuth(req, res))
273
- return;
274
- destroySession(req.params.token);
275
- res.json({ ok: true });
276
- });
277
- /**
278
- * POST /runtime/kill-process
279
- * 强制终止指定 PID 的进程。
280
- * 需要面板登录会话。
281
- */
282
- dashboardRouter.post("/runtime/kill-process", (req, res) => {
283
- if (!requirePanelAuth(req, res))
284
- return;
285
- const pid = Number(req.body.pid);
286
- if (!pid || !Number.isInteger(pid) || pid <= 0) {
287
- res.status(400).json({ ok: false, error: "Invalid PID" });
288
- return;
289
- }
290
- try {
291
- const cmd = os.platform() === "win32" ? `taskkill /PID ${pid} /F` : `kill -9 ${pid}`;
292
- execSync(cmd, { timeout: 5000 });
293
- log.info("Killed process", { pid });
294
- res.json({ ok: true });
295
- }
296
- catch (err) {
297
- const e = err;
298
- log.warn("Failed to kill process", { pid, error: e.message });
299
- res.status(500).json({ ok: false, error: e.message });
300
- }
301
- });
302
- /**
303
- * GET /runtime/dashboard
304
- * 聚合 bridge 所有状态数据。使用 2 秒缓存避免频繁 I/O,需要面板登录会话。
305
- */
306
- dashboardRouter.get("/runtime/dashboard", async (req, res) => {
307
- if (!requirePanelAuth(req, res))
308
- return;
309
- // 缓存命中
310
- if (dashboardCache && Date.now() - dashboardCache.ts < CACHE_TTL) {
311
- return void res.json(dashboardCache.data);
312
- }
313
- try {
314
- // 慢指标始终从缓存读取(后台预热 + 首次 miss 时同步触发预热,但不阻塞请求)
315
- const metrics = metricsCache?.data ?? null;
316
- const processesData = processCache?.data ?? null;
317
- // 若缓存尚未就绪(首次启动预热未完成),在后台触发一次填充,但不等待
318
- if (!metricsCache) {
319
- warmSlideCaches();
320
- }
321
- const [binding, registration, persistedSessions] = await Promise.all([
322
- Promise.resolve(getRuntimeBindingPublicState()),
323
- Promise.resolve(getRegistrationState()),
324
- loadPersistedSessions().catch(() => []),
325
- ]);
326
- const manager = getAgentProcessManager();
327
- const registryRecords = manager.getAllManagedProcesses();
328
- const activeSessions = Array.from(sdkSessions.entries()).map(([sessionId, entry]) => ({
329
- sessionId,
330
- agentId: entry.agentId,
331
- workspacePath: entry.workspacePath,
332
- runtimeStatus: entry.currentRuntimeStatus || "running",
333
- runtimeActionType: entry.currentRuntimeActionType,
334
- runtimeActionLabel: entry.currentRuntimeActionLabel,
335
- providerId: entry.providerId,
336
- }));
337
- let processStats = { managed: 0, orphan: 0, unknown: 0 };
338
- let processList = [];
339
- if (processesData) {
340
- processStats = {
341
- managed: processesData.filter((p) => p.managementStatus === "managed").length,
342
- orphan: processesData.filter((p) => p.managementStatus === "orphan").length,
343
- unknown: processesData.filter((p) => p.managementStatus === "unknown").length,
344
- };
345
- const registryMap = new Map(registryRecords.map((r) => [r.pid, r]));
346
- processList = processesData.map((p) => {
347
- const record = registryMap.get(p.pid);
348
- return {
349
- agentId: p.agentId || record?.agentId,
350
- pid: p.pid,
351
- managementStatus: p.managementStatus,
352
- sessionId: record?.sessionId,
353
- state: record?.state,
354
- command: p.command,
355
- cwd: p.cwd,
356
- startedAt: p.startedAt,
357
- };
358
- });
359
- const sortOrder = { managed: 0, orphan: 1, unknown: 2 };
360
- processList.sort((a, b) => (sortOrder[a.managementStatus] ?? 9) - (sortOrder[b.managementStatus] ?? 9));
361
- }
362
- const activeSessionIds = new Set(activeSessions.map((s) => s.sessionId));
363
- const persistedOnly = persistedSessions.filter((s) => !activeSessionIds.has(s.sessionId));
364
- const bindingPublic = binding;
365
- const latestLifecycleOperation = await loadLatestLifecycleOperation();
366
- const body = {
367
- ok: true,
368
- collectedAt: new Date().toISOString(),
369
- bridge: {
370
- version: bridgeVersion,
371
- hostname: os.hostname(),
372
- platform: os.platform(),
373
- arch: os.arch(),
374
- uptime: Math.floor(process.uptime()),
375
- nodeVersion: process.version,
376
- },
377
- binding: {
378
- status: bindingPublic.status,
379
- paired: bindingPublic.paired,
380
- instanceId: bindingPublic.instanceId,
381
- userId: bindingPublic.userId,
382
- schedulerBaseUrl: bindingPublic.schedulerBaseUrl,
383
- pairingCode: getRuntimePairingCode(),
384
- },
385
- registration: {
386
- registered: registration.registered,
387
- instanceId: registration.instanceId,
388
- lastAttempt: registration.lastAttempt?.toISOString(),
389
- error: registration.error,
390
- },
391
- metrics,
392
- sessions: {
393
- active: activeSessions,
394
- activeCount: activeSessions.length,
395
- persisted: persistedOnly,
396
- persistedCount: persistedOnly.length,
397
- total: activeSessions.length + persistedOnly.length,
398
- },
399
- processes: {
400
- ...processStats,
401
- total: processStats.managed + processStats.orphan + processStats.unknown,
402
- list: processList,
403
- registryCount: registryRecords.length,
404
- },
405
- lifecycleOperation: latestLifecycleOperation,
406
- };
407
- // 写入一级缓存(10 秒 TTL,匹配前端轮询间隔,避免连续请求都吃 I/O)
408
- dashboardCache = { data: body, ts: Date.now() };
409
- res.json(body);
410
- }
411
- catch (error) {
412
- const err = error;
413
- log.error("Dashboard aggregation failed:", err.message);
414
- res.status(500).json({ ok: false, error: err.message });
415
- }
416
- });
417
- /**
418
- * GET /login 登录页面
419
- */
420
- dashboardRouter.get("/login", (_req, res) => {
421
- res.type("text/html; charset=utf-8");
422
- res.send(LOGIN_HTML);
423
- });
424
- /**
425
- * GET / 仪表盘主页
426
- * 需要面板登录会话,未登录时跳转到 /login。
427
- * 当凭据仍是默认值 root/root 时跳转到 /setup 引导首次设置。
428
- * 支持 ?lang=en 切换英文,默认中文
429
- */
430
- dashboardRouter.get("/", (req, res) => {
431
- const token = getSessionToken(req);
432
- if (!token || !validateSession(token)) {
433
- res.redirect("/login");
434
- return;
435
- }
436
- // 如果 config.json 尚未配置过凭据,引导首次设置
437
- if (!hasConfiguredCredentials()) {
438
- res.redirect("/setup");
439
- return;
440
- }
441
- const lang = req.query.lang === "en" ? "en" : "zh";
442
- res.type("text/html; charset=utf-8");
443
- res.send(DASHBOARD_HTML.replace("{{LANG}}", lang));
444
- });
445
- /**
446
- * GET /setup 首次登录设置页面
447
- * 需要面板登录会话。提供用户名/密码修改表单,也支持跳过(保持 root/root)。
448
- */
449
- dashboardRouter.get("/setup", (req, res) => {
450
- const token = getSessionToken(req);
451
- if (!token || !validateSession(token)) {
452
- res.redirect("/login");
453
- return;
454
- }
455
- res.type("text/html; charset=utf-8");
456
- res.send(SETUP_HTML);
457
- });
458
- // ======================================================================
459
- // DASHBOARD HTML — 单页自包含,支持中文/英文界面,默认中文
460
- // ======================================================================
461
- const DASHBOARD_HTML = `<!DOCTYPE html>
1
+ import{Router as O}from"express";import u from"node:os";import{execSync as j}from"node:child_process";import{getRuntimeBindingPublicState as L,getRuntimePairingCode as _}from"../services/runtime-binding.js";import{getAgentProcessManager as I}from"../services/agent-process-manager.js";import{collectSystemMetrics as F}from"../services/system-metrics.js";import{loadPersistedSessions as V}from"../services/terminal-persistence.js";import{createLogger as q}from"../utils/logger.js";import{getBridgeVersion as K}from"../config.js";import{sdkSessions as W}from"./terminal.js";import{createSession as G,getPanelCredentials as B,validateSession as C,destroySession as A,validateCredentials as J,hasConfiguredCredentials as y,isDefaultCredentials as Y,setPanelCredentials as $,getAllSessions as Q,getActiveSessionCount as X}from"../services/panel-auth.js";import{getRecentLogs as Z}from"../utils/logger.js";import{autoRegister as ee,getRegistrationState as U,getAutoRegisterConfigFilePath as te}from"../services/auto-register.js";const P=q("dashboard");let x=null;const ne=1e4;let E=null,D=null;const se=3e4;async function R(){F().then(n=>{E={data:n,ts:Date.now()}}).catch(()=>{}),I().discoverAllProcesses().then(n=>{D={data:n,ts:Date.now()}}).catch(()=>{}),I().cleanupStaleRegistry().catch(()=>{})}R(),setInterval(R,se);const M=K();async function ae(){const n=await import("node:fs/promises"),e=await import("node:path"),t=await import("node:os"),s=e.join(String(process.env.AWS_RUNTIME_HOME_DIR||t.homedir()).trim()||t.homedir(),".aws-bridge","lifecycle-state.json");try{const r=await n.readFile(s,"utf8"),o=JSON.parse(r),d=Array.isArray(o.operations)?o.operations:[];return d.length===0?null:(d.sort((b,h)=>new Date(h.updatedAt).getTime()-new Date(b.updatedAt).getTime()),d[0]||null)}catch{return null}}const i=O(),N="panel_sid";function oe(n){const e={};if(!n)return e;for(const t of n.split(";")){const s=t.indexOf("=");if(s===-1)continue;const r=t.slice(0,s).trim(),o=t.slice(s+1).trim();r&&(e[r]=o)}return e}function w(n){return oe(n.headers.cookie)[N]}function c(n,e){const t=w(n);return t&&C(t)?!0:n.xhr||n.headers.accept?.includes("application/json")?(e.status(401).json({ok:!1,error:"unauthorized",needLogin:!0}),!1):(e.redirect("/login"),!1)}i.post("/runtime/login",(n,e)=>{const{username:t,password:s}=n.body||{};if(!t||!s){e.status(400).json({ok:!1,error:"username and password required"});return}if(!J(String(t),String(s))){e.status(401).json({ok:!1,error:"invalid credentials"});return}const r=G(),o=!y();e.setHeader("Set-Cookie",`${N}=${r}; HttpOnly; SameSite=Lax; Path=/; Max-Age=86400`),e.json({ok:!0,needSetup:o})}),i.post("/runtime/logout",(n,e)=>{const t=w(n);t&&A(t),e.setHeader("Set-Cookie",`${N}=; HttpOnly; SameSite=Lax; Path=/; Max-Age=0`),e.json({ok:!0})}),i.get("/runtime/credentials-status",(n,e)=>{if(!c(n,e))return;const t=B();e.json({ok:!0,isDefault:Y(),configured:y(),username:t.username})}),i.post("/runtime/change-credentials",(n,e)=>{if(!c(n,e))return;const{username:t,password:s,passwordConfirm:r,oldPassword:o}=n.body||{};if(s&&String(s).trim()){if(String(s)!==String(r)){e.status(400).json({ok:!1,error:"passwords do not match"});return}if(y()){if(!o){e.status(400).json({ok:!1,error:"old password required"});return}const b=B();if(String(o)!==b.password){e.status(403).json({ok:!1,error:"old password is incorrect"});return}}}if(!t||!String(t).trim()){e.status(400).json({ok:!1,error:"username required"});return}const d=s&&String(s).trim()?String(s).trim():B().password;$(String(t).trim(),d),e.json({ok:!0})}),i.get("/runtime/node-info",(n,e)=>{if(!c(n,e))return;const t=L(),s=U();e.json({ok:!0,hostname:u.hostname(),platform:u.platform(),arch:u.arch(),uptime:Math.floor(process.uptime()),nodeVersion:process.version,bridgeVersion:M,configPath:te(),homeDir:process.env.AWS_RUNTIME_HOME_DIR||u.homedir(),bindingStatus:t.status,paired:t.paired,instanceId:t.instanceId||s.instanceId,schedulerBaseUrl:t.schedulerBaseUrl,registered:s.registered,pairingCode:t.pairingCode,activeSessions:X()})}),i.get("/runtime/logs",(n,e)=>{if(!c(n,e))return;const t=n.query.level||void 0,s=Math.min(Number(n.query.count)||200,500),o=t&&["debug","info","warn","error"].includes(t)?t:void 0,d=Z(s,o);e.json({ok:!0,logs:d})}),i.post("/runtime/re-register",async(n,e)=>{if(c(n,e))try{const t=await ee();e.json({ok:t})}catch(t){const s=t;e.status(500).json({ok:!1,error:s.message})}}),i.get("/runtime/admin/sessions",(n,e)=>{if(!c(n,e))return;const t=Q().map(s=>({token:s.token.slice(0,8)+"...",createdAt:new Date(s.createdAt).toISOString(),lastUsedAt:new Date(s.lastUsedAt).toISOString(),age:Math.floor((Date.now()-s.createdAt)/1e3)}));e.json({ok:!0,sessions:t})}),i.post("/runtime/admin/sessions/:token/destroy",(n,e)=>{c(n,e)&&(A(n.params.token),e.json({ok:!0}))}),i.post("/runtime/kill-process",(n,e)=>{if(!c(n,e))return;const t=Number(n.body.pid);if(!t||!Number.isInteger(t)||t<=0){e.status(400).json({ok:!1,error:"Invalid PID"});return}try{const s=u.platform()==="win32"?`taskkill /PID ${t} /F`:`kill -9 ${t}`;j(s,{timeout:5e3}),P.info("Killed process",{pid:t}),e.json({ok:!0})}catch(s){const r=s;P.warn("Failed to kill process",{pid:t,error:r.message}),e.status(500).json({ok:!1,error:r.message})}}),i.get("/runtime/dashboard",async(n,e)=>{if(c(n,e)){if(x&&Date.now()-x.ts<ne)return void e.json(x.data);try{const t=E?.data??null,s=D?.data??null;E||R();const[r,o,d]=await Promise.all([Promise.resolve(L()),Promise.resolve(U()),V().catch(()=>[])]),h=I().getAllManagedProcesses(),v=Array.from(W.entries()).map(([p,l])=>({sessionId:p,agentId:l.agentId,workspacePath:l.workspacePath,runtimeStatus:l.currentRuntimeStatus||"running",runtimeActionType:l.currentRuntimeActionType,runtimeActionLabel:l.currentRuntimeActionLabel,providerId:l.providerId}));let g={managed:0,orphan:0,unknown:0},k=[];if(s){g={managed:s.filter(a=>a.managementStatus==="managed").length,orphan:s.filter(a=>a.managementStatus==="orphan").length,unknown:s.filter(a=>a.managementStatus==="unknown").length};const p=new Map(h.map(a=>[a.pid,a]));k=s.map(a=>{const f=p.get(a.pid);return{agentId:a.agentId||f?.agentId,pid:a.pid,managementStatus:a.managementStatus,sessionId:f?.sessionId,state:f?.state,command:a.command,cwd:a.cwd,startedAt:a.startedAt}});const l={managed:0,orphan:1,unknown:2};k.sort((a,f)=>(l[a.managementStatus]??9)-(l[f.managementStatus]??9))}const z=new Set(v.map(p=>p.sessionId)),S=d.filter(p=>!z.has(p.sessionId)),m=r,H=await ae(),T={ok:!0,collectedAt:new Date().toISOString(),bridge:{version:M,hostname:u.hostname(),platform:u.platform(),arch:u.arch(),uptime:Math.floor(process.uptime()),nodeVersion:process.version},binding:{status:m.status,paired:m.paired,instanceId:m.instanceId,userId:m.userId,schedulerBaseUrl:m.schedulerBaseUrl,pairingCode:_()},registration:{registered:o.registered,instanceId:o.instanceId,lastAttempt:o.lastAttempt?.toISOString(),error:o.error},metrics:t,sessions:{active:v,activeCount:v.length,persisted:S,persistedCount:S.length,total:v.length+S.length},processes:{...g,total:g.managed+g.orphan+g.unknown,list:k,registryCount:h.length},lifecycleOperation:H};x={data:T,ts:Date.now()},e.json(T)}catch(t){const s=t;P.error("Dashboard aggregation failed:",s.message),e.status(500).json({ok:!1,error:s.message})}}}),i.get("/login",(n,e)=>{e.type("text/html; charset=utf-8"),e.send(ie)}),i.get("/",(n,e)=>{const t=w(n);if(!t||!C(t)){e.redirect("/login");return}if(!y()){e.redirect("/setup");return}const s=n.query.lang==="en"?"en":"zh";e.type("text/html; charset=utf-8"),e.send(re.replace("{{LANG}}",s))}),i.get("/setup",(n,e)=>{const t=w(n);if(!t||!C(t)){e.redirect("/login");return}e.type("text/html; charset=utf-8"),e.send(de)});const re=`<!DOCTYPE html>
462
2
  <html lang="{{LANG}}">
463
3
  <head>
464
4
  <meta charset="UTF-8">
@@ -753,8 +293,8 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
753
293
  <span id="bridgeVersion">v-</span>
754
294
  <span id="updateIndicator" style="display:none"></span>
755
295
  </span>
756
- <span class="lang-btn" id="langBtn" onclick="toggleLang()">中文</span>
757
- <button onclick="openSettings()" id="settingsBtn" title="Settings / 设置">&#x2699;</button>
296
+ <span class="lang-btn" id="langBtn" onclick="toggleLang()">\u4E2D\u6587</span>
297
+ <button onclick="openSettings()" id="settingsBtn" title="Settings / \u8BBE\u7F6E">&#x2699;</button>
758
298
  <button onclick="refresh()" id="refreshBtn">&#x21bb;</button>
759
299
  </div>
760
300
  </div>
@@ -857,20 +397,20 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
857
397
  <div class="s-info-row"><span class="s-info-label" id="lblNodeActiveSessions"></span><span class="s-info-value" id="valNodeActiveSessions">-</span></div>
858
398
  </div>
859
399
  <div class="s-actions">
860
- <button class="s-btn s-btn-secondary" onclick="refreshNodeInfo()">Refresh / 🔄</button>
400
+ <button class="s-btn s-btn-secondary" onclick="refreshNodeInfo()">Refresh / \u{1F504}</button>
861
401
  </div>
862
402
  </div>
863
403
  <!-- Logs page -->
864
404
  <div class="settings-page" id="pageLogs">
865
405
  <div class="s-log-toolbar">
866
406
  <select id="logLevelFilter" onchange="refreshLogs()">
867
- <option value="">All / 全部</option>
407
+ <option value="">All / \u5168\u90E8</option>
868
408
  <option value="info">INFO</option>
869
409
  <option value="warn">WARN</option>
870
410
  <option value="error">ERROR</option>
871
411
  </select>
872
412
  <label class="s-log-toggle"><input type="checkbox" id="logAutoRefresh" checked> <span id="lblLogAutoRefresh"></span></label>
873
- <button class="s-btn s-btn-sm" onclick="refreshLogs()" id="btnRefreshLogs">🔄</button>
413
+ <button class="s-btn s-btn-sm" onclick="refreshLogs()" id="btnRefreshLogs">\u{1F504}</button>
874
414
  </div>
875
415
  <div class="s-log-list" id="logList"><div class="s-log-empty" id="logEmpty"></div></div>
876
416
  </div>
@@ -993,143 +533,143 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
993
533
  </style>
994
534
 
995
535
  <script>
996
- // ── 多语言翻译表 ──────────────────────────────────────────
536
+ // \u2500\u2500 \u591A\u8BED\u8A00\u7FFB\u8BD1\u8868 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
997
537
  const T = {
998
538
  zh: {
999
539
  langName: "English",
1000
- refreshBtn: "\u21bb \u5237\u65b0",
1001
- loading: "\u52a0\u8f7d\u4e2d...",
1002
- noProcesses: "\u65e0\u8fdb\u7a0b",
1003
- noSessions: "\u65e0\u6d3b\u8dc3\u4f1a\u8bdd",
1004
- noPersisted: "\u65e0\u6301\u4e45\u5316\u4f1a\u8bdd",
1005
- metricsUnavailable: "\u7cfb\u7edf\u6307\u6807\u4e0d\u53ef\u7528",
1006
- managed: "\u7ba1\u7406",
1007
- orphan: "\u5b64\u513f",
1008
- managedLabel: "\u7ba1\u7406\u4e2d",
1009
- // 状态卡片
540
+ refreshBtn: "\u21BB \u5237\u65B0",
541
+ loading: "\u52A0\u8F7D\u4E2D...",
542
+ noProcesses: "\u65E0\u8FDB\u7A0B",
543
+ noSessions: "\u65E0\u6D3B\u8DC3\u4F1A\u8BDD",
544
+ noPersisted: "\u65E0\u6301\u4E45\u5316\u4F1A\u8BDD",
545
+ metricsUnavailable: "\u7CFB\u7EDF\u6307\u6807\u4E0D\u53EF\u7528",
546
+ managed: "\u7BA1\u7406",
547
+ orphan: "\u5B64\u513F",
548
+ managedLabel: "\u7BA1\u7406\u4E2D",
549
+ // \u72B6\u6001\u5361\u7247
1010
550
  cardBridge: "Bridge",
1011
- cardRegistration: "\u6ce8\u518c",
1012
- cardBinding: "\u7ed1\u5b9a",
1013
- cardSessions: "\u4f1a\u8bdd\u4e0e\u8fdb\u7a0b",
1014
- fldVersion: "\u7248\u672c",
1015
- fldHost: "\u4e3b\u673a",
1016
- fldPlatform: "\u5e73\u53f0",
1017
- fldUptime: "\u8fd0\u884c\u65f6\u957f",
551
+ cardRegistration: "\u6CE8\u518C",
552
+ cardBinding: "\u7ED1\u5B9A",
553
+ cardSessions: "\u4F1A\u8BDD\u4E0E\u8FDB\u7A0B",
554
+ fldVersion: "\u7248\u672C",
555
+ fldHost: "\u4E3B\u673A",
556
+ fldPlatform: "\u5E73\u53F0",
557
+ fldUptime: "\u8FD0\u884C\u65F6\u957F",
1018
558
  fldNode: "Node",
1019
- fldStatus: "\u72b6\u6001",
1020
- fldInstanceId: "\u5b9e\u4f8b ID",
1021
- fldLastAttempt: "\u4e0a\u6b21\u5c1d\u8bd5",
1022
- fldError: "\u9519\u8bef",
1023
- fldScheduler: "\u8c03\u5ea6\u5668",
1024
- fldPairingCode: "\u5339\u914d\u7801",
1025
- fldActiveSessions: "\u6d3b\u8dc3\u4f1a\u8bdd",
1026
- fldPersistedSessions: "\u6301\u4e45\u5316\u4f1a\u8bdd",
1027
- fldManagedProcesses: "\u7ba1\u7406\u8fdb\u7a0b",
1028
- fldOrphanProcesses: "\u5b64\u513f\u8fdb\u7a0b",
1029
- fldRegistryEntries: "\u6ce8\u518c\u8868\u8bb0\u5f55",
1030
- // 资源
1031
- secSysRes: "\u7cfb\u7edf\u8d44\u6e90",
1032
- secSessions: "\u6d3b\u8dc3\u4f1a\u8bdd",
1033
- secPersisted: "\u6301\u4e45\u5316\u4f1a\u8bdd",
1034
- secOrphans: "\u5b64\u513f\u8fdb\u7a0b",
1035
- secUnknown: "\u5176\u4ed6\u8fdb\u7a0b",
1036
- orphanBanner: "\u4ee5\u4e0b\u8fdb\u7a0b\u4ecd\u5728\u8fd0\u884c\u4f46\u8131\u79bb\u4e86 bridge \u7ba1\u7406",
1037
- btnTerminate: "\u7ec8\u6b62",
1038
- btnKill: "\u6740\u6b7b",
1039
- showUnknown: "\u663e\u793a",
1040
- hideUnknown: "\u9690\u85cf",
1041
- noOrphans: "\u65e0\u5b64\u513f\u8fdb\u7a0b",
1042
- fldUsage: "\u4f7f\u7528\u7387",
559
+ fldStatus: "\u72B6\u6001",
560
+ fldInstanceId: "\u5B9E\u4F8B ID",
561
+ fldLastAttempt: "\u4E0A\u6B21\u5C1D\u8BD5",
562
+ fldError: "\u9519\u8BEF",
563
+ fldScheduler: "\u8C03\u5EA6\u5668",
564
+ fldPairingCode: "\u5339\u914D\u7801",
565
+ fldActiveSessions: "\u6D3B\u8DC3\u4F1A\u8BDD",
566
+ fldPersistedSessions: "\u6301\u4E45\u5316\u4F1A\u8BDD",
567
+ fldManagedProcesses: "\u7BA1\u7406\u8FDB\u7A0B",
568
+ fldOrphanProcesses: "\u5B64\u513F\u8FDB\u7A0B",
569
+ fldRegistryEntries: "\u6CE8\u518C\u8868\u8BB0\u5F55",
570
+ // \u8D44\u6E90
571
+ secSysRes: "\u7CFB\u7EDF\u8D44\u6E90",
572
+ secSessions: "\u6D3B\u8DC3\u4F1A\u8BDD",
573
+ secPersisted: "\u6301\u4E45\u5316\u4F1A\u8BDD",
574
+ secOrphans: "\u5B64\u513F\u8FDB\u7A0B",
575
+ secUnknown: "\u5176\u4ED6\u8FDB\u7A0B",
576
+ orphanBanner: "\u4EE5\u4E0B\u8FDB\u7A0B\u4ECD\u5728\u8FD0\u884C\u4F46\u8131\u79BB\u4E86 bridge \u7BA1\u7406",
577
+ btnTerminate: "\u7EC8\u6B62",
578
+ btnKill: "\u6740\u6B7B",
579
+ showUnknown: "\u663E\u793A",
580
+ hideUnknown: "\u9690\u85CF",
581
+ noOrphans: "\u65E0\u5B64\u513F\u8FDB\u7A0B",
582
+ fldUsage: "\u4F7F\u7528\u7387",
1043
583
  fldCores: "\u5185\u6838\u6570",
1044
- fldModel: "\u578b\u53f7",
1045
- fldUsed: "\u5df2\u7528",
1046
- fldFree: "\u5269\u4f59",
1047
- fldTotal: "\u603b\u8ba1",
1048
- fldDownload: "\u4e0b\u884c",
1049
- fldUpload: "\u4e0a\u884c",
1050
- fldTotalDown: "\u603b\u4e0b\u884c",
1051
- fldTotalUp: "\u603b\u4e0a\u884c",
1052
- // 表格
584
+ fldModel: "\u578B\u53F7",
585
+ fldUsed: "\u5DF2\u7528",
586
+ fldFree: "\u5269\u4F59",
587
+ fldTotal: "\u603B\u8BA1",
588
+ fldDownload: "\u4E0B\u884C",
589
+ fldUpload: "\u4E0A\u884C",
590
+ fldTotalDown: "\u603B\u4E0B\u884C",
591
+ fldTotalUp: "\u603B\u4E0A\u884C",
592
+ // \u8868\u683C
1053
593
  thAgentId: "Agent ID",
1054
594
  thPid: "PID",
1055
- thStatus: "\u72b6\u6001",
1056
- thSessionId: "\u4f1a\u8bdd ID",
1057
- thState: "\u72b6\u6001",
1058
- thAction: "\u884c\u52a8",
1059
- thWorkspace: "\u5de5\u4f5c\u533a",
1060
- thProvider: "\u63d0\u4f9b\u65b9",
1061
- thCommand: "\u547d\u4ee4",
1062
- thDirectory: "\u76ee\u5f55",
1063
- thStarted: "\u5f00\u59cb\u65f6\u95f4",
1064
- countManaged: "\u7ba1\u7406\u4e2d",
1065
- // 设置
1066
- setTitle: "\u8bbe\u7f6e",
1067
- setAccount: "\u8d26\u53f7",
1068
- setUsername: "\u7528\u6237\u540d",
1069
- setCurrentPwd: "\u5f53\u524d\u5bc6\u7801",
1070
- setNewPwd: "\u65b0\u5bc6\u7801",
1071
- setConfirmPwd: "\u786e\u8ba4\u65b0\u5bc6\u7801",
1072
- setSave: "\u4fdd\u5b58",
1073
- setCancel: "\u53d6\u6d88",
1074
- setKeepUnchanged: "\u4e0d\u586b\u5219\u4e0d\u4fee\u6539\u5bc6\u7801",
1075
- setPwdRequired: "\u4fee\u6539\u5bc6\u7801\u9700\u8981\u8f93\u5165\u5f53\u524d\u5bc6\u7801",
1076
- setPwdMismatch: "\u4e24\u6b21\u8f93\u5165\u7684\u65b0\u5bc6\u7801\u4e0d\u4e00\u81f4",
1077
- setPwdTooShort: "\u5bc6\u7801\u81f3\u5c114\u4f4d",
1078
- setSaved: "\u8bbe\u7f6e\u5df2\u4fdd\u5b58",
1079
- setSaveFailed: "\u4fdd\u5b58\u5931\u8d25",
1080
- setNetworkError: "\u7f51\u7edc\u9519\u8bef",
1081
- setMaintenance: "\u7ef4\u62a4",
1082
- setRestartBridge: "\u91cd\u542f Bridge",
1083
- setRestartDesc: "\u91cd\u542f\u6865\u63a5\u670d\u52a1\uff0c\u6b63\u5728\u8fd0\u884c\u7684\u4f1a\u8bdd\u4e0d\u53d7\u5f71\u54cd\u3002",
1084
- setRestartConfirm: "\u786e\u8ba4\u91cd\u542f Bridge\uff1f",
1085
- setRestarting: "\u91cd\u542f\u4e2d...",
1086
- // 节点信息
1087
- nodeTitle: "\u8282\u70b9\u4fe1\u606f",
1088
- nodeHostname: "\u4e3b\u673a\u540d",
1089
- nodePlatform: "\u5e73\u53f0",
1090
- nodeUptime: "\u8fd0\u884c\u65f6\u957f",
1091
- nodeVersion: "Bridge \u7248\u672c",
1092
- nodeNodeVer: "Node \u7248\u672c",
1093
- nodeConfigPath: "\u914d\u7f6e\u6587\u4ef6\u8def\u5f84",
1094
- nodeHomeDir: "\u8fd0\u884c\u65f6\u76ee\u5f55",
1095
- nodeScheduler: "\u8c03\u5ea6\u4e2d\u5fc3",
1096
- nodeBinding: "\u7ed1\u5b9a\u72b6\u6001",
1097
- nodeRegistered: "\u6ce8\u518c\u72b6\u6001",
1098
- nodeInstanceId: "\u5b9e\u4f8b ID",
1099
- nodeActiveSessions: "\u6d3b\u8dc3\u4f1a\u8bdd",
1100
- nodePaired: "\u5df2\u7ed1\u5b9a",
1101
- nodeUnpaired: "\u672a\u7ed1\u5b9a",
1102
- nodeRegYes: "\u5df2\u6ce8\u518c",
1103
- nodeRegNo: "\u672a\u6ce8\u518c",
1104
- // 日志
1105
- logTitle: "\u65e5\u5fd7",
1106
- logAutoRefresh: "\u81ea\u52a8\u5237\u65b0",
1107
- logLevelAll: "\u5168\u90e8",
1108
- logRefreshing: "\u5237\u65b0\u4e2d...",
1109
- logEmpty: "\u6682\u65e0\u65e5\u5fd7",
1110
- // 调度中心
1111
- schedTitle: "\u8c03\u5ea6\u4e2d\u5fc3",
1112
- schedUrl: "\u670d\u52a1\u5730\u5740",
1113
- schedReRegister: "\u91cd\u65b0\u6ce8\u518c",
1114
- schedReRegistering: "\u6ce8\u518c\u4e2d...",
1115
- schedReRegistered: "\u91cd\u65b0\u6ce8\u518c\u6210\u529f",
1116
- schedReRegisterFail: "\u91cd\u65b0\u6ce8\u518c\u5931\u8d25",
1117
- schedDesc: "\u5411\u8c03\u5ea6\u4e2d\u5fc3\u53d1\u8d77\u91cd\u65b0\u6ce8\u518c\uff0c\u5efa\u8bae\u5728\u8fde\u63a5\u5f02\u5e38\u65f6\u4f7f\u7528\u3002",
1118
- // 状态文本
1119
- stHealthy: "\u5065\u5eb7",
1120
- stError: "\u5f02\u5e38",
1121
- stRunning: "\u8fd0\u884c\u4e2d",
1122
- stStopped: "\u5df2\u505c\u6b62",
1123
- stPaired: "\u5df2\u7ed1\u5b9a",
1124
- stUnpaired: "\u672a\u7ed1\u5b9a",
1125
- stRegistered: "\u5df2\u6ce8\u518c",
1126
- stNotRegistered: "\u672a\u6ce8\u518c",
1127
- stWarning: "\u8b66\u544a",
1128
- stNone: "\u65e0",
595
+ thStatus: "\u72B6\u6001",
596
+ thSessionId: "\u4F1A\u8BDD ID",
597
+ thState: "\u72B6\u6001",
598
+ thAction: "\u884C\u52A8",
599
+ thWorkspace: "\u5DE5\u4F5C\u533A",
600
+ thProvider: "\u63D0\u4F9B\u65B9",
601
+ thCommand: "\u547D\u4EE4",
602
+ thDirectory: "\u76EE\u5F55",
603
+ thStarted: "\u5F00\u59CB\u65F6\u95F4",
604
+ countManaged: "\u7BA1\u7406\u4E2D",
605
+ // \u8BBE\u7F6E
606
+ setTitle: "\u8BBE\u7F6E",
607
+ setAccount: "\u8D26\u53F7",
608
+ setUsername: "\u7528\u6237\u540D",
609
+ setCurrentPwd: "\u5F53\u524D\u5BC6\u7801",
610
+ setNewPwd: "\u65B0\u5BC6\u7801",
611
+ setConfirmPwd: "\u786E\u8BA4\u65B0\u5BC6\u7801",
612
+ setSave: "\u4FDD\u5B58",
613
+ setCancel: "\u53D6\u6D88",
614
+ setKeepUnchanged: "\u4E0D\u586B\u5219\u4E0D\u4FEE\u6539\u5BC6\u7801",
615
+ setPwdRequired: "\u4FEE\u6539\u5BC6\u7801\u9700\u8981\u8F93\u5165\u5F53\u524D\u5BC6\u7801",
616
+ setPwdMismatch: "\u4E24\u6B21\u8F93\u5165\u7684\u65B0\u5BC6\u7801\u4E0D\u4E00\u81F4",
617
+ setPwdTooShort: "\u5BC6\u7801\u81F3\u5C114\u4F4D",
618
+ setSaved: "\u8BBE\u7F6E\u5DF2\u4FDD\u5B58",
619
+ setSaveFailed: "\u4FDD\u5B58\u5931\u8D25",
620
+ setNetworkError: "\u7F51\u7EDC\u9519\u8BEF",
621
+ setMaintenance: "\u7EF4\u62A4",
622
+ setRestartBridge: "\u91CD\u542F Bridge",
623
+ setRestartDesc: "\u91CD\u542F\u6865\u63A5\u670D\u52A1\uFF0C\u6B63\u5728\u8FD0\u884C\u7684\u4F1A\u8BDD\u4E0D\u53D7\u5F71\u54CD\u3002",
624
+ setRestartConfirm: "\u786E\u8BA4\u91CD\u542F Bridge\uFF1F",
625
+ setRestarting: "\u91CD\u542F\u4E2D...",
626
+ // \u8282\u70B9\u4FE1\u606F
627
+ nodeTitle: "\u8282\u70B9\u4FE1\u606F",
628
+ nodeHostname: "\u4E3B\u673A\u540D",
629
+ nodePlatform: "\u5E73\u53F0",
630
+ nodeUptime: "\u8FD0\u884C\u65F6\u957F",
631
+ nodeVersion: "Bridge \u7248\u672C",
632
+ nodeNodeVer: "Node \u7248\u672C",
633
+ nodeConfigPath: "\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",
634
+ nodeHomeDir: "\u8FD0\u884C\u65F6\u76EE\u5F55",
635
+ nodeScheduler: "\u8C03\u5EA6\u4E2D\u5FC3",
636
+ nodeBinding: "\u7ED1\u5B9A\u72B6\u6001",
637
+ nodeRegistered: "\u6CE8\u518C\u72B6\u6001",
638
+ nodeInstanceId: "\u5B9E\u4F8B ID",
639
+ nodeActiveSessions: "\u6D3B\u8DC3\u4F1A\u8BDD",
640
+ nodePaired: "\u5DF2\u7ED1\u5B9A",
641
+ nodeUnpaired: "\u672A\u7ED1\u5B9A",
642
+ nodeRegYes: "\u5DF2\u6CE8\u518C",
643
+ nodeRegNo: "\u672A\u6CE8\u518C",
644
+ // \u65E5\u5FD7
645
+ logTitle: "\u65E5\u5FD7",
646
+ logAutoRefresh: "\u81EA\u52A8\u5237\u65B0",
647
+ logLevelAll: "\u5168\u90E8",
648
+ logRefreshing: "\u5237\u65B0\u4E2D...",
649
+ logEmpty: "\u6682\u65E0\u65E5\u5FD7",
650
+ // \u8C03\u5EA6\u4E2D\u5FC3
651
+ schedTitle: "\u8C03\u5EA6\u4E2D\u5FC3",
652
+ schedUrl: "\u670D\u52A1\u5730\u5740",
653
+ schedReRegister: "\u91CD\u65B0\u6CE8\u518C",
654
+ schedReRegistering: "\u6CE8\u518C\u4E2D...",
655
+ schedReRegistered: "\u91CD\u65B0\u6CE8\u518C\u6210\u529F",
656
+ schedReRegisterFail: "\u91CD\u65B0\u6CE8\u518C\u5931\u8D25",
657
+ schedDesc: "\u5411\u8C03\u5EA6\u4E2D\u5FC3\u53D1\u8D77\u91CD\u65B0\u6CE8\u518C\uFF0C\u5EFA\u8BAE\u5728\u8FDE\u63A5\u5F02\u5E38\u65F6\u4F7F\u7528\u3002",
658
+ // \u72B6\u6001\u6587\u672C
659
+ stHealthy: "\u5065\u5EB7",
660
+ stError: "\u5F02\u5E38",
661
+ stRunning: "\u8FD0\u884C\u4E2D",
662
+ stStopped: "\u5DF2\u505C\u6B62",
663
+ stPaired: "\u5DF2\u7ED1\u5B9A",
664
+ stUnpaired: "\u672A\u7ED1\u5B9A",
665
+ stRegistered: "\u5DF2\u6CE8\u518C",
666
+ stNotRegistered: "\u672A\u6CE8\u518C",
667
+ stWarning: "\u8B66\u544A",
668
+ stNone: "\u65E0",
1129
669
  },
1130
670
  en: {
1131
- langName: "\u4e2d\u6587",
1132
- refreshBtn: "\u21bb Refresh",
671
+ langName: "\u4E2D\u6587",
672
+ refreshBtn: "\u21BB Refresh",
1133
673
  loading: "Loading...",
1134
674
  noProcesses: "No processes",
1135
675
  noSessions: "No active sessions",
@@ -1244,7 +784,7 @@ const T = {
1244
784
  schedReRegistered: "Re-registered successfully",
1245
785
  schedReRegisterFail: "Re-registration failed",
1246
786
  schedDesc: "Re-register with the scheduler. Use when connection is abnormal.",
1247
- // 状态文本
787
+ // \u72B6\u6001\u6587\u672C
1248
788
  stHealthy: "Healthy",
1249
789
  stError: "Error",
1250
790
  stRunning: "Running",
@@ -1258,10 +798,10 @@ const T = {
1258
798
  }
1259
799
  };
1260
800
 
1261
- // ── 语言偏好 ──────────────────────────────────────────────
801
+ // \u2500\u2500 \u8BED\u8A00\u504F\u597D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1262
802
  let lang = localStorage.getItem("dashboard-lang");
1263
803
  if (!lang) {
1264
- // url 参数优先,其次浏览器语言,默认 zh
804
+ // url \u53C2\u6570\u4F18\u5148\uFF0C\u5176\u6B21\u6D4F\u89C8\u5668\u8BED\u8A00\uFF0C\u9ED8\u8BA4 zh
1265
805
  const urlLang = new URLSearchParams(location.search).get("lang");
1266
806
  lang = urlLang === "en" ? "en" : navigator.language.startsWith("zh") ? "zh" : "en";
1267
807
  }
@@ -1285,7 +825,7 @@ function toggleLang() {
1285
825
  if (lastData) render(lastData);
1286
826
  }
1287
827
 
1288
- // ── 工具函数 ──────────────────────────────────────────────
828
+ // \u2500\u2500 \u5DE5\u5177\u51FD\u6570 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1289
829
  let lastData = null;
1290
830
 
1291
831
  function fmtPercent(v) {
@@ -1355,7 +895,7 @@ function barColor(pct) {
1355
895
  return "red";
1356
896
  }
1357
897
 
1358
- // ── 渲染 ──────────────────────────────────────────────────
898
+ // \u2500\u2500 \u6E32\u67D3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1359
899
  function render(data) {
1360
900
  lastData = data;
1361
901
  document.getElementById("refreshTime").textContent = new Date(data.collectedAt).toLocaleString();
@@ -1542,7 +1082,7 @@ function render(data) {
1542
1082
  }
1543
1083
  }
1544
1084
 
1545
- // ── Toggle unknown processes ────────────────────────────
1085
+ // \u2500\u2500 Toggle unknown processes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1546
1086
  function toggleUnknown() {
1547
1087
  const table = document.getElementById("unknownTable");
1548
1088
  const icon = document.getElementById("unknownIcon");
@@ -1551,7 +1091,7 @@ function toggleUnknown() {
1551
1091
  icon.classList.toggle("open", isHidden);
1552
1092
  }
1553
1093
 
1554
- // ── 请求与轮询 ──────────────────────────────────────────
1094
+ // \u2500\u2500 \u8BF7\u6C42\u4E0E\u8F6E\u8BE2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1555
1095
  async function refresh() {
1556
1096
  try {
1557
1097
  const resp = await fetch("/runtime/dashboard");
@@ -1563,20 +1103,20 @@ async function refresh() {
1563
1103
  }
1564
1104
  }
1565
1105
 
1566
- // 10 秒自动刷新
1106
+ // \u6BCF 10 \u79D2\u81EA\u52A8\u5237\u65B0
1567
1107
  setInterval(refresh, 10000);
1568
1108
  refresh();
1569
1109
 
1570
- // ── 更新检查与安装 ──────────────────────────────────────
1110
+ // \u2500\u2500 \u66F4\u65B0\u68C0\u67E5\u4E0E\u5B89\u88C5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1571
1111
  const UPDATE_LABELS = {
1572
1112
  zh: {
1573
- label_available: " {v}",
1574
- label_installing: "安装中...",
1575
- label_restart: "重启",
1576
- label_failed: "更新失败",
1113
+ label_available: "\u2192 {v}",
1114
+ label_installing: "\u5B89\u88C5\u4E2D...",
1115
+ label_restart: "\u91CD\u542F",
1116
+ label_failed: "\u66F4\u65B0\u5931\u8D25",
1577
1117
  },
1578
1118
  en: {
1579
- label_available: " {v}",
1119
+ label_available: "\u2192 {v}",
1580
1120
  label_installing: "installing...",
1581
1121
  label_restart: "restart",
1582
1122
  label_failed: "failed",
@@ -1593,7 +1133,7 @@ let updateState = {
1593
1133
  operationId: null,
1594
1134
  };
1595
1135
 
1596
- // 检查更新
1136
+ // \u68C0\u67E5\u66F4\u65B0
1597
1137
  async function checkUpdate() {
1598
1138
  try {
1599
1139
  const resp = await fetch("/runtime/check-update");
@@ -1652,7 +1192,7 @@ async function doRestartBridge() {
1652
1192
  body: JSON.stringify({ preserveSessions: true, requestedByUserId: "dashboard-ui" }),
1653
1193
  });
1654
1194
  } catch (err) {
1655
- // Bridge may shut down before responding ignore
1195
+ // Bridge may shut down before responding \u2014 ignore
1656
1196
  }
1657
1197
  }
1658
1198
 
@@ -1686,7 +1226,7 @@ checkUpdate();
1686
1226
  // Also check periodically (every 5 minutes)
1687
1227
  setInterval(checkUpdate, 300000);
1688
1228
 
1689
- // ── Settings Modal ────────────────────────────────────────
1229
+ // \u2500\u2500 Settings Modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1690
1230
  let settingsLang = null;
1691
1231
  function renderSettingsUI() {
1692
1232
  document.getElementById("settingsTitle").textContent = t("setTitle");
@@ -1738,7 +1278,7 @@ function openSettings() {
1738
1278
  document.getElementById("settingsSaveBtn").disabled = false;
1739
1279
  document.getElementById("settingsSaveBtn").textContent = t("setSave");
1740
1280
  switchSettingsPage("account");
1741
- // 预填当前用户名
1281
+ // \u9884\u586B\u5F53\u524D\u7528\u6237\u540D
1742
1282
  fetch("/runtime/credentials-status").then(r => r.json()).then(d => {
1743
1283
  if (d.ok) document.getElementById("setUsername").value = d.username || "root";
1744
1284
  }).catch(() => {});
@@ -1823,7 +1363,7 @@ function confirmRestartBridge() {
1823
1363
  doRestartBridge();
1824
1364
  }
1825
1365
 
1826
- // ── Node Info ─────────────────────────────────────────────
1366
+ // \u2500\u2500 Node Info \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1827
1367
  let nodeInfoTimer = null;
1828
1368
  function refreshNodeInfo() {
1829
1369
  fetch("/runtime/node-info").then(function(r) { return r.json(); }).then(function(d) {
@@ -1843,7 +1383,7 @@ function refreshNodeInfo() {
1843
1383
  }).catch(function() {});
1844
1384
  }
1845
1385
 
1846
- // ── Logs ──────────────────────────────────────────────────
1386
+ // \u2500\u2500 Logs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1847
1387
  let logTimer = null;
1848
1388
  function refreshLogs() {
1849
1389
  var level = document.getElementById("logLevelFilter").value;
@@ -1867,7 +1407,7 @@ function refreshLogs() {
1867
1407
  list.innerHTML = html;
1868
1408
  list.scrollTop = 0;
1869
1409
  }).catch(function() {}).then(function() {
1870
- document.getElementById("btnRefreshLogs").textContent = "\u21bb";
1410
+ document.getElementById("btnRefreshLogs").textContent = "\u21BB";
1871
1411
  });
1872
1412
  }
1873
1413
  function startLogAutoRefresh() {
@@ -1887,7 +1427,7 @@ document.addEventListener("change", function(e) {
1887
1427
  }
1888
1428
  });
1889
1429
 
1890
- // ── Scheduler ─────────────────────────────────────────────
1430
+ // \u2500\u2500 Scheduler \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1891
1431
  function doReRegister() {
1892
1432
  var btn = document.getElementById("btnReRegister");
1893
1433
  var msg = document.getElementById("schedMsg");
@@ -1917,7 +1457,7 @@ function doReRegister() {
1917
1457
  });
1918
1458
  }
1919
1459
 
1920
- // ── Kill process (unknown processes table) ────────────────
1460
+ // \u2500\u2500 Kill process (unknown processes table) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1921
1461
  function killProcess(pid) {
1922
1462
  if (!confirm(t("btnKill") + " PID " + pid + "?")) return;
1923
1463
  var btn = document.querySelector('[data-pid="' + pid + '"]');
@@ -1950,7 +1490,7 @@ document.addEventListener("click", function(e) {
1950
1490
  }
1951
1491
  });
1952
1492
 
1953
- // ── Switch settings page with data refresh ────────────────
1493
+ // \u2500\u2500 Switch settings page with data refresh \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1954
1494
  var __origSwitch = switchSettingsPage;
1955
1495
  switchSettingsPage = function(page) {
1956
1496
  __origSwitch(page);
@@ -1962,11 +1502,7 @@ switchSettingsPage = function(page) {
1962
1502
  };
1963
1503
  </script>
1964
1504
  </body>
1965
- </html>`;
1966
- // ======================================================================
1967
- // LOGIN HTML — 登录页面
1968
- // ======================================================================
1969
- const LOGIN_HTML = `<!DOCTYPE html>
1505
+ </html>`,ie=`<!DOCTYPE html>
1970
1506
  <html lang="zh-CN">
1971
1507
  <head>
1972
1508
  <meta charset="UTF-8">
@@ -2131,17 +1667,13 @@ async function doLogin(e) {
2131
1667
  }
2132
1668
  }
2133
1669
 
2134
- // 回车键自动提交
1670
+ // \u56DE\u8F66\u952E\u81EA\u52A8\u63D0\u4EA4
2135
1671
  document.getElementById("loginForm").addEventListener("keydown", function(e) {
2136
1672
  if (e.key === "Enter") doLogin(e);
2137
1673
  });
2138
1674
  </script>
2139
1675
  </body>
2140
- </html>`;
2141
- // ======================================================================
2142
- // SETUP HTML — 首次登录设置页面
2143
- // ======================================================================
2144
- const SETUP_HTML = `<!DOCTYPE html>
1676
+ </html>`,de=`<!DOCTYPE html>
2145
1677
  <html lang="zh-CN">
2146
1678
  <head>
2147
1679
  <meta charset="UTF-8">
@@ -2306,29 +1838,29 @@ const SETUP_HTML = `<!DOCTYPE html>
2306
1838
  <body>
2307
1839
  <div class="setup-card" id="setupCard">
2308
1840
  <h1>Bridge Dashboard</h1>
2309
- <p class="subtitle">First-time setup 首次登录设置</p>
2310
- <div class="badge">Default credentials detected. Please set a new username and password.<br>检测到默认凭据,请设置新的用户名和密码</div>
1841
+ <p class="subtitle">First-time setup \u2014 \u9996\u6B21\u767B\u5F55\u8BBE\u7F6E</p>
1842
+ <div class="badge">Default credentials detected. Please set a new username and password.<br>\u68C0\u6D4B\u5230\u9ED8\u8BA4\u51ED\u636E\uFF0C\u8BF7\u8BBE\u7F6E\u65B0\u7684\u7528\u6237\u540D\u548C\u5BC6\u7801</div>
2311
1843
  <div class="error-msg" id="errorMsg"></div>
2312
- <div class="success-msg" id="successMsg">Credentials saved! Redirecting... / 凭据已保存,正在跳转...</div>
1844
+ <div class="success-msg" id="successMsg">Credentials saved! Redirecting... / \u51ED\u636E\u5DF2\u4FDD\u5B58\uFF0C\u6B63\u5728\u8DF3\u8F6C...</div>
2313
1845
  <form id="setupForm">
2314
1846
  <div class="form-group">
2315
- <label for="username">Username / 用户名</label>
1847
+ <label for="username">Username / \u7528\u6237\u540D</label>
2316
1848
  <input type="text" id="username" name="username" value="root" autocomplete="username" autofocus>
2317
1849
  </div>
2318
1850
  <div class="form-group">
2319
- <label for="password">New Password / 新密码</label>
1851
+ <label for="password">New Password / \u65B0\u5BC6\u7801</label>
2320
1852
  <input type="password" id="password" name="password" placeholder="Enter new password" autocomplete="new-password">
2321
1853
  </div>
2322
1854
  <div class="form-group">
2323
- <label for="passwordConfirm">Confirm Password / 确认密码</label>
1855
+ <label for="passwordConfirm">Confirm Password / \u786E\u8BA4\u5BC6\u7801</label>
2324
1856
  <input type="password" id="passwordConfirm" name="passwordConfirm" placeholder="Enter password again" autocomplete="new-password">
2325
1857
  </div>
2326
1858
  <div class="btn-row">
2327
- <button type="button" class="btn-skip" id="skipBtn" onclick="doSkip()">Skip / 跳过</button>
2328
- <button type="submit" class="btn-primary" id="saveBtn">Save / 保存</button>
1859
+ <button type="button" class="btn-skip" id="skipBtn" onclick="doSkip()">Skip / \u8DF3\u8FC7</button>
1860
+ <button type="submit" class="btn-primary" id="saveBtn">Save / \u4FDD\u5B58</button>
2329
1861
  </div>
2330
1862
  </form>
2331
- <div class="hint">Skip to keep default credentials <b>root/root</b>. You can change them later via <code>~/.aws-bridge/config.json</code>.<br>跳过以保留默认凭据 <b>root/root</b>。</div>
1863
+ <div class="hint">Skip to keep default credentials <b>root/root</b>. You can change them later via <code>~/.aws-bridge/config.json</code>.<br>\u8DF3\u8FC7\u4EE5\u4FDD\u7559\u9ED8\u8BA4\u51ED\u636E <b>root/root</b>\u3002</div>
2332
1864
  </div>
2333
1865
  <script>
2334
1866
  async function doSave(e) {
@@ -2342,22 +1874,22 @@ async function doSave(e) {
2342
1874
  const passwordConfirm = document.getElementById("passwordConfirm").value;
2343
1875
 
2344
1876
  if (!username) {
2345
- errorEl.textContent = "Username is required / 用户名不能为空";
1877
+ errorEl.textContent = "Username is required / \u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A";
2346
1878
  errorEl.classList.add("visible");
2347
1879
  return;
2348
1880
  }
2349
1881
  if (!password) {
2350
- errorEl.textContent = "Password is required / 密码不能为空";
1882
+ errorEl.textContent = "Password is required / \u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A";
2351
1883
  errorEl.classList.add("visible");
2352
1884
  return;
2353
1885
  }
2354
1886
  if (password !== passwordConfirm) {
2355
- errorEl.textContent = "Passwords do not match / 两次输入的密码不一致";
1887
+ errorEl.textContent = "Passwords do not match / \u4E24\u6B21\u8F93\u5165\u7684\u5BC6\u7801\u4E0D\u4E00\u81F4";
2356
1888
  errorEl.classList.add("visible");
2357
1889
  return;
2358
1890
  }
2359
1891
  if (password.length < 4) {
2360
- errorEl.textContent = "Password must be at least 4 characters / 密码至少4位";
1892
+ errorEl.textContent = "Password must be at least 4 characters / \u5BC6\u7801\u81F3\u5C114\u4F4D";
2361
1893
  errorEl.classList.add("visible");
2362
1894
  return;
2363
1895
  }
@@ -2382,13 +1914,13 @@ async function doSave(e) {
2382
1914
  errorEl.textContent = data.error || "Save failed";
2383
1915
  errorEl.classList.add("visible");
2384
1916
  saveBtn.disabled = false;
2385
- saveBtn.textContent = "Save / 保存";
1917
+ saveBtn.textContent = "Save / \u4FDD\u5B58";
2386
1918
  }
2387
1919
  } catch (err) {
2388
- errorEl.textContent = "Network error, please try again / 网络错误,请重试";
1920
+ errorEl.textContent = "Network error, please try again / \u7F51\u7EDC\u9519\u8BEF\uFF0C\u8BF7\u91CD\u8BD5";
2389
1921
  errorEl.classList.add("visible");
2390
1922
  saveBtn.disabled = false;
2391
- saveBtn.textContent = "Save / 保存";
1923
+ saveBtn.textContent = "Save / \u4FDD\u5B58";
2392
1924
  }
2393
1925
  }
2394
1926
 
@@ -2396,7 +1928,7 @@ async function doSkip() {
2396
1928
  const skipBtn = document.getElementById("skipBtn");
2397
1929
  const errorEl = document.getElementById("errorMsg");
2398
1930
  skipBtn.disabled = true;
2399
- skipBtn.textContent = "Skipping... / 跳过中...";
1931
+ skipBtn.textContent = "Skipping... / \u8DF3\u8FC7\u4E2D...";
2400
1932
 
2401
1933
  try {
2402
1934
  const resp = await fetch("/runtime/change-credentials", {
@@ -2415,17 +1947,18 @@ async function doSkip() {
2415
1947
  errorEl.textContent = data.error || "Skip failed";
2416
1948
  errorEl.classList.add("visible");
2417
1949
  skipBtn.disabled = false;
2418
- skipBtn.textContent = "Skip / 跳过";
1950
+ skipBtn.textContent = "Skip / \u8DF3\u8FC7";
2419
1951
  }
2420
1952
  } catch (err) {
2421
- errorEl.textContent = "Network error, please try again / 网络错误,请重试";
1953
+ errorEl.textContent = "Network error, please try again / \u7F51\u7EDC\u9519\u8BEF\uFF0C\u8BF7\u91CD\u8BD5";
2422
1954
  errorEl.classList.add("visible");
2423
1955
  skipBtn.disabled = false;
2424
- skipBtn.textContent = "Skip / 跳过";
1956
+ skipBtn.textContent = "Skip / \u8DF3\u8FC7";
2425
1957
  }
2426
1958
  }
2427
1959
 
2428
1960
  document.getElementById("setupForm").addEventListener("submit", doSave);
2429
1961
  </script>
2430
1962
  </body>
2431
- </html>`;
1963
+ </html>`;export{i as dashboardRouter};
1964
+